186 const ACDCHitCollection* ptrHits)
const
190 if (firstInTrackId == TrackingUtilities::c_InvalidIndex or lastInTrackId == TrackingUtilities::c_InvalidIndex) {
191 return TrackingUtilities::EForwardBackward::c_Invalid;
192 }
else if (firstInTrackId < lastInTrackId) {
193 return TrackingUtilities::EForwardBackward::c_Forward;
194 }
else if (firstInTrackId > lastInTrackId) {
195 return TrackingUtilities::EForwardBackward::c_Backward;
197 }
else if (firstInTrackId == lastInTrackId) {
198 return TrackingUtilities::EForwardBackward::c_Unknown;
200 return TrackingUtilities::EForwardBackward::c_Invalid;
205 const ACDCHitCollection* ptrFromHits,
206 const ACDCHitCollection* ptrToHits)
const
210 if (fromMCTrackId == INVALID_ITRACK)
return TrackingUtilities::EForwardBackward::c_Invalid;
213 if (toMCTrackId == INVALID_ITRACK)
return TrackingUtilities::EForwardBackward::c_Invalid;
215 if (fromMCTrackId != toMCTrackId)
return TrackingUtilities::EForwardBackward::c_Invalid;
219 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Invalid)
return TrackingUtilities::EForwardBackward::c_Invalid;
222 if (toFBInfo == TrackingUtilities::EForwardBackward::c_Invalid)
return TrackingUtilities::EForwardBackward::c_Invalid;
224 if (fromFBInfo != toFBInfo)
return TrackingUtilities::EForwardBackward::c_Invalid;
232 if (lastNPassedSuperLayersOfFromHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
236 if (firstNPassedSuperLayersOfToHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
239 if (lastNPassedSuperLayersOfFromHits < firstNPassedSuperLayersOfToHits) {
240 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Forward and
241 toFBInfo == TrackingUtilities::EForwardBackward::c_Forward) {
242 return TrackingUtilities::EForwardBackward::c_Forward;
244 return TrackingUtilities::EForwardBackward::c_Invalid;
246 }
else if (firstNPassedSuperLayersOfToHits < lastNPassedSuperLayersOfFromHits) {
247 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Backward and
248 toFBInfo == TrackingUtilities::EForwardBackward::c_Backward) {
249 return TrackingUtilities::EForwardBackward::c_Backward;
251 return TrackingUtilities::EForwardBackward::c_Invalid;
262 if (lastInTrackSegmentIdOfFromHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
266 if (firstInTrackSegmentIdOfToHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
269 if (lastInTrackSegmentIdOfFromHits < firstInTrackSegmentIdOfToHits) {
270 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Forward and
271 toFBInfo == TrackingUtilities::EForwardBackward::c_Forward) {
272 return TrackingUtilities::EForwardBackward::c_Forward;
274 return TrackingUtilities::EForwardBackward::c_Invalid;
276 }
else if (firstInTrackSegmentIdOfToHits < lastInTrackSegmentIdOfFromHits) {
279 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Backward and
280 toFBInfo == TrackingUtilities::EForwardBackward::c_Backward) {
281 return TrackingUtilities::EForwardBackward::c_Backward;
283 return TrackingUtilities::EForwardBackward::c_Invalid;
291 TrackingUtilities::Index lastInTrackIdOfFromHits =
getLastInTrackId(ptrFromHits);
293 if (lastInTrackIdOfFromHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
297 if (firstInTrackIdOfToHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
302 if (lastInTrackIdOfFromHits - 1 < firstInTrackIdOfToHits + 1) {
303 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Forward and
304 toFBInfo == TrackingUtilities::EForwardBackward::c_Forward) {
305 return TrackingUtilities::EForwardBackward::c_Forward;
309 if (firstInTrackIdOfToHits - 1 < lastInTrackIdOfFromHits + 1) {
310 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Backward and
311 toFBInfo == TrackingUtilities::EForwardBackward::c_Backward) {
312 return TrackingUtilities::EForwardBackward::c_Backward;
317 return TrackingUtilities::EForwardBackward::c_Invalid;
322 const ACDCHitCollection* ptrFromHits,
323 const ACDCHitCollection* ptrToHits)
const
326 if (result == TrackingUtilities::EForwardBackward::c_Invalid)
return result;
331 if (result == TrackingUtilities::EForwardBackward::c_Backward) {
332 fromCorrectRLVote = -fromCorrectRLVote;
333 toCorrectRLVote = -toCorrectRLVote;
336 int fromNCorrectRL = (fromCorrectRLVote + ptrFromHits->size()) / 2;
337 int toNCorrectRL = (toCorrectRLVote + ptrToHits->size()) / 2;
339 float fromRLPurity = 1.0 * fromNCorrectRL / ptrFromHits->size();
340 float toRLPurity = 1.0 * toNCorrectRL / ptrToHits->size();
345 fromNCorrectRL > 2.5 and toNCorrectRL > 2.5) {
349 return TrackingUtilities::EForwardBackward::c_Invalid;
354 const ACDCHitCollection* ptrHits)
const
357 B2WARNING(
"Segment is nullptr. Could not get fit.");
366 if (not ptrPrimarySimHit) {
368 ptrPrimarySimHit = mcHitLookUp.
getSimHit(ptrFirstHit);
369 if (not ptrPrimarySimHit) {
374 const CDCSimHit& primarySimHit = *ptrPrimarySimHit;
376 ROOT::Math::XYZVector mom3D{primarySimHit.
getMomentum()};
377 ROOT::Math::XYZVector pos3D{primarySimHit.
getPosTrack()};
381 const TParticlePDG* ptrTPDGParticle = TDatabasePDG::Instance()->GetParticle(pdgCode);
383 if (not ptrTPDGParticle) {
384 B2WARNING(
"No particle for PDG code " << pdgCode <<
". Could not get fit");
388 const TParticlePDG& tPDGParticle = *ptrTPDGParticle;
390 double charge = tPDGParticle.Charge() / 3.0;
392 TrackingUtilities::ESign chargeSign = TrackingUtilities::sign(charge);
396 TrackingUtilities::ESign settedChargeSign = trajectory3D.
getChargeSign();
398 if (chargeSign != settedChargeSign) {
399 B2WARNING(
"Charge sign of mc particle is not the same as the one of the fit");