59{
60 IMuonSegmentPairMatchingTool::SegmentMatchResult
result;
61 using namespace MuonStationIndex;
62
63
66
69
70
71 if (chid1 == chid2)
return result;
72 if (station1 == station2)
return result;
73
74
75 if (station1 == StIndex::StUnknown)
return result;
76 if (station2 == StIndex::StUnknown)
return result;
77 if (station1 >= StIndex::StIndexMax)
return result;
78 if (station2 >= StIndex::StIndexMax)
return result;
79
80
81
82
83
86
87
88 if (station1 < station2) {
89 pSeg_a = &seg1;
90 pSeg_b = &seg2;
91
92 } else {
93
94 pSeg_a = &seg2;
95 pSeg_b = &seg1;
96
97
98 }
99
102
105
108
111
112 result.phiSector_a = phiSector_a;
113 result.phiSector_b = phiSector_b;
114
119
120
122
123
124 double sizeA = dir_a.mag();
125 double sizeB = dir_b.mag();
126 double cosAB = dir_a.dot(dir_b) / (sizeA * sizeB);
127 double angleAB = robust_acos(cosAB);
128
129
130 double sizeC = vecAB.mag();
131 double cosAC = dir_a.dot(vecAB) / (sizeA * sizeC);
132 double angleAC = robust_acos(cosAC);
133
134
135 double cosBC = dir_b.dot(vecAB) / (sizeB * sizeC);
136 double angleBC = robust_acos(cosBC);
137
138
139 if (angleAB >
M_PI / 2.) angleAB = fabs(angleAB -
M_PI);
140 if (angleAC >
M_PI / 2.) angleAC = fabs(angleAC -
M_PI);
141 if (angleBC >
M_PI / 2.) angleBC = fabs(angleBC -
M_PI);
142
146
147
148
149 double dirTheta_a = seg_a.localDirection().angleYZ();
150 double dirTheta_b = seg_b.localDirection().angleYZ();
151 Trk::LocalDirection dirPred_a;
152 seg_a.associatedSurface().globalToLocalDirection(vecAB, dirPred_a);
153 Trk::LocalDirection dirPred_b;
154 seg_b.associatedSurface().globalToLocalDirection(vecAB, dirPred_b);
155 double deltaTheta_a = limit_angle_2pi(dirTheta_a - dirPred_a.
angleYZ());
156 double deltaTheta_b = limit_angle_2pi(dirTheta_b - dirPred_b.
angleYZ());
157
158
159
160 if (std::abs(deltaTheta_a) > 0.5 *
M_PI && std::abs(deltaTheta_b) > 0.5 *
M_PI) {
161
162 seg_a.associatedSurface().globalToLocalDirection(-vecAB, dirPred_a);
163 seg_b.associatedSurface().globalToLocalDirection(-vecAB, dirPred_b);
164 deltaTheta_a = limit_angle_2pi(dirTheta_a - dirPred_a.
angleYZ());
165 deltaTheta_b = limit_angle_2pi(dirTheta_b - dirPred_b.
angleYZ());
166 }
167
168
169
170 bool flipped = false;
173 double xAxisDotProduct = trf_a(0, 0) * trf_b(0, 0) + trf_a(1, 0) * trf_b(1, 0) + trf_a(2, 0) * trf_b(2, 0);
174 if (xAxisDotProduct < 0.0) flipped = true;
175
176 double deltaTheta = 0.0;
177 if (flipped) {
178 deltaTheta = std::abs(limit_angle_2pi(deltaTheta_a - deltaTheta_b));
179 } else {
180 deltaTheta = std::abs(limit_angle_2pi(deltaTheta_a + deltaTheta_b));
181 }
182
183 result.deltaTheta_a = deltaTheta_a;
184 result.deltaTheta_b = deltaTheta_b;
185 result.deltaTheta = deltaTheta;
186
187
188 result.deltaPhipos = fabs(seg_a.globalPosition().phi() - seg_b.globalPosition().phi());
189 result.deltaPhidir = fabs(seg_a.globalDirection().phi() - seg_b.globalDirection().phi());
190
191
192 bool ContainPhiHits = false;
193 std::vector<const Trk::MeasurementBase*>::const_iterator hit = seg_a.containedMeasurements().begin();
194 std::vector<const Trk::MeasurementBase*>::const_iterator hit_end = seg_a.containedMeasurements().end();
195 for (; hit != hit_end; ++hit) {
197 const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(*hit);
198 if (rot)
200 else {
201 const CompetingMuonClustersOnTrack* crot = dynamic_cast<const CompetingMuonClustersOnTrack*>(*hit);
202 if (crot) id = crot->containedROTs().front()->identify();
203 }
204 if (!id.is_valid()) continue;
206 ContainPhiHits = true;
207 break;
208 }
209 }
210
211 if (ContainPhiHits) {
214 } else {
215 result.phiposerr_a = 99999.;
216 result.phidirerr_a = 99999.;
217 }
218
219
220 ContainPhiHits = false;
221 hit = seg_b.containedMeasurements().begin();
222 hit_end = seg_b.containedMeasurements().end();
223 for (; hit != hit_end; ++hit) {
225 const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(*hit);
226 if (rot)
228 else {
229 const CompetingMuonClustersOnTrack* crot = dynamic_cast<const CompetingMuonClustersOnTrack*>(*hit);
230 if (crot) id = crot->containedROTs().front()->identify();
231 }
232 if (!id.is_valid()) continue;
234 ContainPhiHits = true;
235 break;
236 }
237 }
238
239 if (ContainPhiHits) {
242 } else {
243 result.phiposerr_b = 99999.;
244 result.phidirerr_b = 99999.;
245 }
246
247 result.shorttube_a = 99999.;
249
251 double shorttube_lx_a = stseg1.first.x();
252 double shorttube_ly_a = stseg1.first.y();
253 double shorttube_rx_a = stseg1.second.x();
254 double shorttube_ry_a = stseg1.second.y();
255
256 double dist_x_la = seg_a.globalPosition().x() - shorttube_lx_a;
257 double dist_x_ra = seg_a.globalPosition().x() - shorttube_rx_a;
258
259 double dist_y_la = seg_a.globalPosition().y() - shorttube_ly_a;
260 double dist_y_ra = seg_a.globalPosition().y() - shorttube_ry_a;
261
262 double dist_la = sqrt(dist_x_la * dist_x_la + dist_y_la * dist_y_la);
263 double dist_ra = sqrt(dist_x_ra * dist_x_ra + dist_y_ra * dist_y_ra);
264
265 if (dist_la >= dist_ra)
266 result.shorttube_a = dist_ra;
267 else
268 result.shorttube_a = dist_la;
269 }
270
271 result.shorttube_b = 99999.;
274 double shorttube_lx_b = stseg2.first.x();
275 double shorttube_ly_b = stseg2.first.y();
276 double shorttube_rx_b = stseg2.second.x();
277 double shorttube_ry_b = stseg2.second.y();
278
279 double dist_x_lb = seg_b.globalPosition().x() - shorttube_lx_b;
280 double dist_x_rb = seg_b.globalPosition().x() - shorttube_rx_b;
281
282 double dist_y_lb = seg_b.globalPosition().y() - shorttube_ly_b;
283 double dist_y_rb = seg_b.globalPosition().y() - shorttube_ry_b;
284
285 double dist_lb = sqrt(dist_x_lb * dist_x_lb + dist_y_lb * dist_y_lb);
286 double dist_rb = sqrt(dist_x_rb * dist_x_rb + dist_y_rb * dist_y_rb);
287
288 if (dist_lb >= dist_rb)
289 result.shorttube_b = dist_rb;
290 else
291 result.shorttube_b = dist_lb;
292 }
294
296}
MuonSegment_v1 MuonSegment
Reference the current persistent version:
double angleYZ() const
access method for angle of local YZ projection
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
StIndex
enum to classify the different station layers in the muon spectrometer