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;
196 }
else if (firstInTrackId == lastInTrackId) {
197 return TrackingUtilities::EForwardBackward::c_Unknown;
199 return TrackingUtilities::EForwardBackward::c_Invalid;
204 const ACDCHitCollection* ptrFromHits,
205 const ACDCHitCollection* ptrToHits)
const
209 if (fromMCTrackId == INVALID_ITRACK)
return TrackingUtilities::EForwardBackward::c_Invalid;
212 if (toMCTrackId == INVALID_ITRACK)
return TrackingUtilities::EForwardBackward::c_Invalid;
214 if (fromMCTrackId != toMCTrackId)
return TrackingUtilities::EForwardBackward::c_Invalid;
218 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Invalid)
return TrackingUtilities::EForwardBackward::c_Invalid;
221 if (toFBInfo == TrackingUtilities::EForwardBackward::c_Invalid)
return TrackingUtilities::EForwardBackward::c_Invalid;
223 if (fromFBInfo != toFBInfo)
return TrackingUtilities::EForwardBackward::c_Invalid;
231 if (lastNPassedSuperLayersOfFromHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
235 if (firstNPassedSuperLayersOfToHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
238 if (lastNPassedSuperLayersOfFromHits < firstNPassedSuperLayersOfToHits) {
239 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Forward and
240 toFBInfo == TrackingUtilities::EForwardBackward::c_Forward) {
241 return TrackingUtilities::EForwardBackward::c_Forward;
243 return TrackingUtilities::EForwardBackward::c_Invalid;
245 }
else if (firstNPassedSuperLayersOfToHits < lastNPassedSuperLayersOfFromHits) {
246 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Backward and
247 toFBInfo == TrackingUtilities::EForwardBackward::c_Backward) {
248 return TrackingUtilities::EForwardBackward::c_Backward;
250 return TrackingUtilities::EForwardBackward::c_Invalid;
261 if (lastInTrackSegmentIdOfFromHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
265 if (firstInTrackSegmentIdOfToHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
268 if (lastInTrackSegmentIdOfFromHits < firstInTrackSegmentIdOfToHits) {
269 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Forward and
270 toFBInfo == TrackingUtilities::EForwardBackward::c_Forward) {
271 return TrackingUtilities::EForwardBackward::c_Forward;
273 return TrackingUtilities::EForwardBackward::c_Invalid;
275 }
else if (firstInTrackSegmentIdOfToHits < lastInTrackSegmentIdOfFromHits) {
278 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Backward and
279 toFBInfo == TrackingUtilities::EForwardBackward::c_Backward) {
280 return TrackingUtilities::EForwardBackward::c_Backward;
282 return TrackingUtilities::EForwardBackward::c_Invalid;
290 TrackingUtilities::Index lastInTrackIdOfFromHits =
getLastInTrackId(ptrFromHits);
292 if (lastInTrackIdOfFromHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
296 if (firstInTrackIdOfToHits == TrackingUtilities::c_InvalidIndex)
return TrackingUtilities::EForwardBackward::c_Invalid;
301 if (lastInTrackIdOfFromHits - 1 < firstInTrackIdOfToHits + 1) {
302 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Forward and
303 toFBInfo == TrackingUtilities::EForwardBackward::c_Forward) {
304 return TrackingUtilities::EForwardBackward::c_Forward;
308 if (firstInTrackIdOfToHits - 1 < lastInTrackIdOfFromHits + 1) {
309 if (fromFBInfo == TrackingUtilities::EForwardBackward::c_Backward and
310 toFBInfo == TrackingUtilities::EForwardBackward::c_Backward) {
311 return TrackingUtilities::EForwardBackward::c_Backward;
316 return TrackingUtilities::EForwardBackward::c_Invalid;
321 const ACDCHitCollection* ptrFromHits,
322 const ACDCHitCollection* ptrToHits)
const
325 if (result == TrackingUtilities::EForwardBackward::c_Invalid)
return result;
330 if (result == TrackingUtilities::EForwardBackward::c_Backward) {
331 fromCorrectRLVote = -fromCorrectRLVote;
332 toCorrectRLVote = -toCorrectRLVote;
335 int fromNCorrectRL = (fromCorrectRLVote + ptrFromHits->size()) / 2;
336 int toNCorrectRL = (toCorrectRLVote + ptrToHits->size()) / 2;
338 float fromRLPurity = 1.0 * fromNCorrectRL / ptrFromHits->size();
339 float toRLPurity = 1.0 * toNCorrectRL / ptrToHits->size();
344 fromNCorrectRL > 2.5 and toNCorrectRL > 2.5) {
348 return TrackingUtilities::EForwardBackward::c_Invalid;
353 const ACDCHitCollection* ptrHits)
const
356 B2WARNING(
"Segment is nullptr. Could not get fit.");
365 if (not ptrPrimarySimHit) {
367 ptrPrimarySimHit = mcHitLookUp.
getSimHit(ptrFirstHit);
368 if (not ptrPrimarySimHit) {
373 const CDCSimHit& primarySimHit = *ptrPrimarySimHit;
375 ROOT::Math::XYZVector mom3D{primarySimHit.
getMomentum()};
376 ROOT::Math::XYZVector pos3D{primarySimHit.
getPosTrack()};
380 const TParticlePDG* ptrTPDGParticle = TDatabasePDG::Instance()->GetParticle(pdgCode);
382 if (not ptrTPDGParticle) {
383 B2WARNING(
"No particle for PDG code " << pdgCode <<
". Could not get fit");
387 const TParticlePDG& tPDGParticle = *ptrTPDGParticle;
389 double charge = tPDGParticle.Charge() / 3.0;
391 TrackingUtilities::ESign chargeSign = TrackingUtilities::sign(charge);
395 TrackingUtilities::ESign settedChargeSign = trajectory3D.
getChargeSign();
397 if (chargeSign != settedChargeSign) {
398 B2WARNING(
"Charge sign of mc particle is not the same as the one of the fit");