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 |
}
|