11 #include <tracking/modules/DATCON/DATCONPXDExtrapolationModule.h>
28 setDescription(
"DATCONPXDExtrapolationModule: Extrapolates the tracks found by "
29 "the DATCONTrackingModule to the PXD and stores the extrapolated "
30 "hits (called Most Probable Hit, MPH) as PXDIntercept.");
31 setPropertyFlags(c_ParallelProcessingCertified);
33 addParam(
"DATCONTracks", m_storeDATCONTracksName,
34 "Name of the DATCONTrack StoreArray",
string(
""));
35 addParam(
"DATCONPXDIntercepts", m_storeDATCONPXDInterceptsName,
36 "Name of the DATCONPXDIntercepts StoreArray",
string(
"DATCONPXDIntercepts"));
37 addParam(
"DATCONMPHs", m_storeDATCONMPHName,
38 "Name of the DATCONMPH StoreArray",
string(
""));
44 void DATCONPXDExtrapolationModule::initialize()
47 storeDATCONTracks.isRequired(m_storeDATCONTracksName);
48 m_storeDATCONTracksName = storeDATCONTracks.getName();
50 storeDATCONPXDIntercepts.registerInDataStore(m_storeDATCONPXDInterceptsName);
51 m_storeDATCONPXDInterceptsName = storeDATCONPXDIntercepts.getName();
53 storeDATCONMPHs.registerInDataStore(m_storeDATCONMPHName);
54 m_storeDATCONMPHName = storeDATCONMPHs.getName();
61 DATCONPXDExtrapolationModule::event()
63 const double centerZShiftLayer1[2] = {3.68255, -0.88255};
64 const double centerZShiftLayer2[2] = {5.01455, -1.21455};
65 const double sensorMinY = -0.36;
66 const double sensorMaxY = 0.89;
67 const double shiftY = (sensorMaxY + sensorMinY) / 2.0;
68 const double layerRadius[2] = {1.42854, 2.21218};
69 const double sensorLength[2] = {4.48, 6.144};
71 for (
auto& track : storeDATCONTracks) {
72 double trackPhi = track.getTrackPhi();
73 double trackTheta = track.getTrackTheta();
74 double trackCurvsign = track.getTrackCurvature();
76 double trackRadius = trackCurvsign * fabs(track.getTrackRadius());
79 double qualityOfHit = 1.0 / fabs(trackRadius);
82 for (
int layer = 1; layer <= 2; layer++) {
84 for (
int ladder = 1; ladder <= (layer == 1 ? 8 : 12); ladder++) {
86 for (
int sensor = 1; sensor <= 2; sensor++) {
91 TVector2 mostProbableHitLocal(0, 0);
95 double sensorPerpRadius = layerRadius[layer - 1];
97 double x = std::numeric_limits<double>::max();
98 double y = std::numeric_limits<double>::max();
101 sensorPhi = M_PI / 4. * (ladder - 1);
102 shiftZ = centerZShiftLayer1[sensor - 1];
104 sensorPhi = M_PI / 6. * (ladder - 1);
105 shiftZ = centerZShiftLayer2[sensor - 1];
108 double angleDiff = trackPhi - sensorPhi;
109 if (angleDiff > M_PI) {
110 angleDiff -= 2 * M_PI;
112 if (angleDiff < -M_PI) {
113 angleDiff += 2 * M_PI;
116 if (trackCurvsign == +1 && fabs(trackRadius) < 1) {
117 a = sensorPerpRadius + fabs(trackRadius) * sin(angleDiff);
118 b = fabs(trackRadius * trackRadius - a * a);
119 cp = trackRadius * cos(angleDiff) + sqrt(b);
120 x = sensorPerpRadius;
122 }
else if (trackCurvsign == -1 && fabs(trackRadius) < 1) {
123 a = sensorPerpRadius - fabs(trackRadius) * sin(angleDiff);
124 b = fabs(trackRadius * trackRadius - a * a);
125 cp = trackRadius * cos(angleDiff) + sqrt(b);
126 x = sensorPerpRadius;
128 }
else if (trackCurvsign == 0 || fabs(trackRadius) >= 1) {
129 x = sensorPerpRadius;
130 y = sensorPerpRadius * tan(angleDiff);
134 if (trackTheta < (M_PI / 2.0)) {
135 z = sqrt(x * x + y * y) / tan(trackTheta);
136 }
else if (trackTheta > (M_PI / 2.0)) {
137 z = sqrt(x * x + y * y) / tan(trackTheta);
142 if (z >= ((sensorLength[layer - 1] / -2.0) + shiftZ) && z <= ((sensorLength[layer - 1] / 2.0) + shiftZ)) {
143 if (y >= sensorMinY && y <= sensorMaxY) {
145 double localUPosition = y - shiftY;
146 double localVPosition = z - shiftZ;
147 mostProbableHitLocal.SetX(localUPosition);
148 mostProbableHitLocal.SetY(localVPosition);
152 intercept.setCoorU(mostProbableHitLocal.X());
153 intercept.setCoorV(mostProbableHitLocal.Y());
154 intercept.setVxdID(sensorID);
155 storeDATCONPXDIntercepts.appendNew(intercept);