1 |
econte |
1.1 |
#include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
|
2 |
|
|
#include "TrackingTools/AnalyticalJacobians/interface/AnalyticalCurvilinearJacobian.h"
|
3 |
|
|
#include "TrackingTools/PatternTools/interface/TwoTrackMinimumDistance.h"
|
4 |
|
|
#include "FWCore/MessageLogger/interface/MessageLogger.h"
|
5 |
|
|
|
6 |
|
|
using namespace std;
|
7 |
|
|
|
8 |
|
|
TrajectoryStateClosestToBeamLine
|
9 |
|
|
TSCBLBuilderNoMaterial::operator()
|
10 |
|
|
(const FreeTrajectoryState& originalFTS,
|
11 |
|
|
const reco::BeamSpot& beamSpot) const
|
12 |
|
|
{
|
13 |
|
|
TwoTrackMinimumDistance ttmd;
|
14 |
|
|
bool status = ttmd.calculate( originalFTS.parameters(),
|
15 |
|
|
GlobalTrajectoryParameters(
|
16 |
|
|
GlobalPoint(beamSpot.position().x(), beamSpot.position().y(), beamSpot.position().z()),
|
17 |
|
|
GlobalVector(beamSpot.dxdz(), beamSpot.dydz(), 1.),
|
18 |
|
|
0, &(originalFTS.parameters().magneticField()) ) );
|
19 |
|
|
if (!status) {
|
20 |
|
|
LogDebug ("TrackingTools|PatternTools")
|
21 |
|
|
<< "TSCBLBuilderNoMaterial: Failure in TTMD when searching for PCA of track to beamline.\n"
|
22 |
|
|
<< "TrajectoryStateClosestToBeamLine is now invalid.";
|
23 |
|
|
return TrajectoryStateClosestToBeamLine();
|
24 |
|
|
}
|
25 |
|
|
|
26 |
|
|
pair<GlobalPoint, GlobalPoint> points = ttmd.points();
|
27 |
|
|
|
28 |
|
|
GlobalPoint xTrack = points.first;
|
29 |
|
|
GlobalVector pTrack = GlobalVector ( GlobalVector::Cylindrical(originalFTS.momentum().perp(), ttmd.firstAngle(), originalFTS.momentum().z()) );
|
30 |
|
|
|
31 |
|
|
double s = ttmd.pathLength().first;
|
32 |
|
|
|
33 |
|
|
FreeTrajectoryState theFTS;
|
34 |
|
|
if (originalFTS.hasError()) {
|
35 |
|
|
const AlgebraicSymMatrix55 &errorMatrix = originalFTS.curvilinearError().matrix();
|
36 |
|
|
AnalyticalCurvilinearJacobian curvilinJacobian(originalFTS.parameters(), xTrack,
|
37 |
|
|
pTrack, s);
|
38 |
|
|
const AlgebraicMatrix55 &jacobian = curvilinJacobian.jacobian();
|
39 |
|
|
CurvilinearTrajectoryError cte( ROOT::Math::Similarity(jacobian, errorMatrix) );
|
40 |
|
|
|
41 |
|
|
theFTS = FreeTrajectoryState(GlobalTrajectoryParameters(xTrack, pTrack, originalFTS.charge(),
|
42 |
|
|
&(originalFTS.parameters().magneticField())),
|
43 |
|
|
cte);
|
44 |
|
|
}
|
45 |
|
|
else {
|
46 |
|
|
theFTS = FreeTrajectoryState(GlobalTrajectoryParameters(xTrack, pTrack, originalFTS.charge(),
|
47 |
|
|
&(originalFTS.parameters().magneticField())));
|
48 |
|
|
}
|
49 |
|
|
return TrajectoryStateClosestToBeamLine(theFTS, points.second, beamSpot);
|
50 |
|
|
}
|