Belle II Software development
CDCMCSegment3DLookUp Class Reference

Specialisation of the lookup for the truth values of two dimensional segments. More...

#include <CDCMCSegment3DLookUp.h>

Inheritance diagram for CDCMCSegment3DLookUp:
CDCMCHitCollectionLookUp< CDCSegment3D >

Public Member Functions

 CDCMCSegment3DLookUp ()=default
 Default constructor, needs to be public for initialization in CDCMCManager.
 
 CDCMCSegment3DLookUp (CDCMCSegment3DLookUp &)=delete
 Singleton: Delete copy constructor and assignment operator.
 
CDCMCSegment3DLookUpoperator= (const CDCMCSegment3DLookUp &)=delete
 Operator =.
 
void clear ()
 Clears all Monte Carlo information left from the last event.
 
MCTrackIdPurityPair getHighestPurity (const CDCSegment3D &hits) const
 Get the track id with the highest corresponding purity.
 
ITrackType getMCTrackId (const CDCSegment3D *ptrHits) const
 Getter for the Monte Carlo track id matched to this collection of hits.
 
int getCorrectRLVote (const CDCSegment3D *ptrHits) const
 Getter for the difference of correct versus incorrect right left passage information.
 
double getRLPurity (const CDCSegment3D *ptrHits) const
 Getter for the right left passge purity which respects the forward backward reconstruction.
 
const MCParticlegetMCParticle (const CDCSegment3D *ptrHits) const
 Getter for the mc particle matched to this collection of hits.
 
const CDCHitgetFirstHit (const CDCSegment3D *ptrHits) const
 Getter for the first hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
const CDCHitgetLastHit (const CDCSegment3D *ptrHits) const
 Getter for the last hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
Index getFirstInTrackId (const CDCSegment3D *ptrHits) const
 Getter for in track id for the first hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
Index getLastInTrackId (const CDCSegment3D *ptrHits) const
 Getter for in track id for the last hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
Index getFirstInTrackSegmentId (const CDCSegment3D *ptrHits) const
 Getter for in track collection of hits id for the first hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
Index getLastInTrackSegmentId (const CDCSegment3D *ptrHits) const
 Getter for in track collection of hits id for the last hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
Index getFirstNPassedSuperLayers (const CDCSegment3D *ptrHits) const
 Getter for number of passed superlayer till the first hit the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
Index getLastNPassedSuperLayers (const CDCSegment3D *ptrHits) const
 Getter for number of passed superlayer till the last hit the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
Index getFirstNLoops (const CDCSegment3D *ptrHits) const
 Getter for number of loops till the first hit the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
Index getLastNLoops (const CDCSegment3D *ptrHits) const
 Getter for number of loops till the last hit the collection of hits which has the Monte Carlo track id matched to this collection of hits.
 
EForwardBackward isForwardOrBackwardToMCTrack (const CDCSegment3D *ptrHits) const
 Returns the orientation of the collection of hits relative to its matched track.
 
EForwardBackward areAlignedInMCTrack (const CDCSegment3D *ptrFromHits, const CDCSegment3D *ptrToHits) const
 Returns if the second collection of hits follows the first collection of hits in their common Monte Carlo track.
 
EForwardBackward areAlignedInMCTrackWithRLCheck (const CDCSegment3D *ptrFromHits, const CDCSegment3D *ptrToHits) const
 Returns if the second collection of hits follows the first collection of hits in their common Monte Carlo track.
 
CDCTrajectory3D getTrajectory3D (const CDCSegment3D *ptrHits) const
 Returns the trajectory of the collection of hits.
 

Static Public Member Functions

static const CDCMCSegment3DLookUpgetInstance ()
 Getter for the singletone instance.
 

Private Member Functions

std::map< ITrackType, size_t > getHitCountByMCTrackId (const CDCSegment3D &hits) const
 Fill a map with the number of hits for each track id contained in the given hit range.
 

Private Attributes

float m_minimalMatchPurity
 Threshold for the purity that must be exceeded to be considered as a match.
 
float m_minimalRLPurity
 Threshold for the correct fraction of right left passage information to be considered a match.
 

Detailed Description

Specialisation of the lookup for the truth values of two dimensional segments.

Definition at line 23 of file CDCMCSegment3DLookUp.h.

Member Function Documentation

◆ areAlignedInMCTrack()

EForwardBackward areAlignedInMCTrack ( const CDCSegment3D ptrFromHits,
const CDCSegment3D ptrToHits 
) const
inherited

Returns if the second collection of hits follows the first collection of hits in their common Monte Carlo track.

  • Returns EForwardBackward::c_Invalid if the collection of hits is not matched in the same Monte Carlo track.
  • Returns EForwardBackward::c_Forward if both collections of hits are coaligned with the Monte Carlo track and the second collection of hits comes after the first.
  • Returns EForwardBackward::c_Backward if both collections of hits are anticoaligned with the Monte Carlo track and the second collection of hits comes after the first in the reversed sense.

Check if the segments are in the same track

Definition at line 168 of file CDCMCHitCollectionLookUp.icc.h.

205 {
207 ITrackType fromMCTrackId = getMCTrackId(ptrFromHits);
208 if (fromMCTrackId == INVALID_ITRACK) return EForwardBackward::c_Invalid;
209
210 ITrackType toMCTrackId = getMCTrackId(ptrToHits);
211 if (toMCTrackId == INVALID_ITRACK) return EForwardBackward::c_Invalid;
212
213 if (fromMCTrackId != toMCTrackId) return EForwardBackward::c_Invalid;
214
215 // Check if the segments are meaningful on their own
216 EForwardBackward fromFBInfo = isForwardOrBackwardToMCTrack(ptrFromHits);
217 if (fromFBInfo == EForwardBackward::c_Invalid) return EForwardBackward::c_Invalid;
218
220 if (toFBInfo == EForwardBackward::c_Invalid) return EForwardBackward::c_Invalid;
221
222 if (fromFBInfo != toFBInfo) return EForwardBackward::c_Invalid;
223
224 {
225 // Now check if hits are aligned within their common track
226 // Index firstNPassedSuperLayersOfFromHits = getFirstNPassedSuperLayers(ptrFromHits);
227 Index lastNPassedSuperLayersOfFromHits = getLastNPassedSuperLayers(ptrFromHits);
228 // if (firstNPassedSuperLayersOfFromHits == c_InvalidIndex) return
229 // EForwardBackward::c_Invalid;
230 if (lastNPassedSuperLayersOfFromHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
231
232 Index firstNPassedSuperLayersOfToHits = getFirstNPassedSuperLayers(ptrToHits);
233 // Index lastNPassedSuperLayersOfToHits = getLastNPassedSuperLayers(ptrToHits);
234 if (firstNPassedSuperLayersOfToHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
235 // if (lastNPassedSuperLayersOfToHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
236
237 if (lastNPassedSuperLayersOfFromHits < firstNPassedSuperLayersOfToHits) {
238 if (fromFBInfo == EForwardBackward::c_Forward and
239 toFBInfo == EForwardBackward::c_Forward) {
240 return EForwardBackward::c_Forward;
241 } else {
242 return EForwardBackward::c_Invalid;
243 }
244 } else if (firstNPassedSuperLayersOfToHits < lastNPassedSuperLayersOfFromHits) {
245 if (fromFBInfo == EForwardBackward::c_Backward and
246 toFBInfo == EForwardBackward::c_Backward) {
247 return EForwardBackward::c_Backward;
248 } else {
249 return EForwardBackward::c_Invalid;
250 }
251 }
252 }
253
254 {
255 // Now we are in the same true segment with both segments
256 // Index firstInTrackSegmentIdOfFromHits = getFirstInTrackSegmentId(ptrFromHits);
257 Index lastInTrackSegmentIdOfFromHits = getLastInTrackSegmentId(ptrFromHits);
258 // if (firstInTrackSegmentIdOfFromHits == c_InvalidIndex) return
259 // EForwardBackward::c_Invalid;
260 if (lastInTrackSegmentIdOfFromHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
261
262 Index firstInTrackSegmentIdOfToHits = getFirstInTrackSegmentId(ptrToHits);
263 // Index lastInTrackSegmentIdOfToHits = getLastInTrackSegmentId(ptrToHits);
264 if (firstInTrackSegmentIdOfToHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
265 // if (lastInTrackSegmentIdOfToHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
266
267 if (lastInTrackSegmentIdOfFromHits < firstInTrackSegmentIdOfToHits) {
268 if (fromFBInfo == EForwardBackward::c_Forward and
269 toFBInfo == EForwardBackward::c_Forward) {
270 return EForwardBackward::c_Forward;
271 } else {
272 return EForwardBackward::c_Invalid;
273 }
274 } else if (firstInTrackSegmentIdOfToHits < lastInTrackSegmentIdOfFromHits) {
275 // Test if to segment lies before in the mc track
276 // Hence the whole pair of segments is reverse to the track direction of flight
277 if (fromFBInfo == EForwardBackward::c_Backward and
278 toFBInfo == EForwardBackward::c_Backward) {
279 return EForwardBackward::c_Backward;
280 } else {
281 return EForwardBackward::c_Invalid;
282 }
283 }
284 }
285
286 {
287 // Now we are in the same true segment with both of the hits
288 // Index firstInTrackIdOfFromHits = getFirstInTrackId(ptrFromHits);
289 Index lastInTrackIdOfFromHits = getLastInTrackId(ptrFromHits);
290 // if (firstInTrackIdOfFromHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
291 if (lastInTrackIdOfFromHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
292
293 Index firstInTrackIdOfToHits = getFirstInTrackId(ptrToHits);
294 // Index lastInTrackIdOfToHits = getLastInTrackId(ptrToHits);
295 if (firstInTrackIdOfToHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
296 // if (lastInTrackIdOfToHits == c_InvalidIndex) return EForwardBackward::c_Invalid;
297
298 // Relax conditions somewhat such that segments may overlap at the borders.
299
300 if (lastInTrackIdOfFromHits - 1 < firstInTrackIdOfToHits + 1) {
301 if (fromFBInfo == EForwardBackward::c_Forward and
302 toFBInfo == EForwardBackward::c_Forward) {
303 return EForwardBackward::c_Forward;
304 }
305 }
306
307 if (firstInTrackIdOfToHits - 1 < lastInTrackIdOfFromHits + 1) {
308 if (fromFBInfo == EForwardBackward::c_Backward and
309 toFBInfo == EForwardBackward::c_Backward) {
310 return EForwardBackward::c_Backward;
311 }
312 }
313 }
314 // FIXME: Handle intertwined hits that are not cleanly consecutive along the track?
315 return EForwardBackward::c_Invalid;
316 }
EForwardBackward isForwardOrBackwardToMCTrack(const CDCSegment3D *ptrHits) const
Returns the orientation of the collection of hits relative to its matched track.
ITrackType getMCTrackId(const CDCSegment3D *ptrHits) const
Getter for the Monte Carlo track id matched to this collection of hits.
Index getLastNPassedSuperLayers(const CDCSegment3D *ptrHits) const
Getter for number of passed superlayer till the last hit the collection of hits which has the Monte C...
Index getLastInTrackId(const CDCSegment3D *ptrHits) const
Getter for in track id for the last hit in the collection of hits which has the Monte Carlo track id ...
Index getLastInTrackSegmentId(const CDCSegment3D *ptrHits) const
Getter for in track collection of hits id for the last hit in the collection of hits which has the Mo...
Index getFirstInTrackSegmentId(const CDCSegment3D *ptrHits) const
Getter for in track collection of hits id for the first hit in the collection of hits which has the M...
Index getFirstInTrackId(const CDCSegment3D *ptrHits) const
Getter for in track id for the first hit in the collection of hits which has the Monte Carlo track id...
Index getFirstNPassedSuperLayers(const CDCSegment3D *ptrHits) const
Getter for number of passed superlayer till the first hit the collection of hits which has the Monte ...
EForwardBackward
Enumeration to represent the distinct possibilities of the right left passage information.

◆ areAlignedInMCTrackWithRLCheck()

EForwardBackward areAlignedInMCTrackWithRLCheck ( const CDCSegment3D ptrFromHits,
const CDCSegment3D ptrToHits 
) const
inherited

Returns if the second collection of hits follows the first collection of hits in their common Monte Carlo track.

Also checks that the majority of the right left passage information agrees with the forward backward information

Definition at line 176 of file CDCMCHitCollectionLookUp.icc.h.

322 {
323 EForwardBackward result = areAlignedInMCTrack(ptrFromHits, ptrToHits);
324 if (result == EForwardBackward::c_Invalid) return result;
325
326 int fromCorrectRLVote = getCorrectRLVote(ptrFromHits);
327 int toCorrectRLVote = getCorrectRLVote(ptrToHits);
328
329 if (result == EForwardBackward::c_Backward) {
330 fromCorrectRLVote = -fromCorrectRLVote;
331 toCorrectRLVote = -toCorrectRLVote;
332 }
333
334 int fromNCorrectRL = (fromCorrectRLVote + ptrFromHits->size()) / 2;
335 int toNCorrectRL = (toCorrectRLVote + ptrToHits->size()) / 2;
336
337 float fromRLPurity = 1.0 * fromNCorrectRL / ptrFromHits->size();
338 float toRLPurity = 1.0 * toNCorrectRL / ptrToHits->size();
339
340 // Require the minimal rl purity and also at least 2.5 correct hits
341 // (cut chosen to require all correct in single hit triplet segment)
342 if (fromRLPurity > m_minimalRLPurity and toRLPurity > m_minimalRLPurity and
343 fromNCorrectRL > 2.5 and toNCorrectRL > 2.5) {
344 return result;
345 }
346
347 return EForwardBackward::c_Invalid;
348 }
int getCorrectRLVote(const CDCSegment3D *ptrHits) const
Getter for the difference of correct versus incorrect right left passage information.
EForwardBackward areAlignedInMCTrack(const CDCSegment3D *ptrFromHits, const CDCSegment3D *ptrToHits) const
Returns if the second collection of hits follows the first collection of hits in their common Monte C...

◆ clear()

void clear
inherited

Clears all Monte Carlo information left from the last event.

Definition at line 74 of file CDCMCHitCollectionLookUp.icc.h.

32 {
33 B2DEBUG(25, "Clearing CDCMCHitCollectionLookUp<ACDCHitCollection>");
34 }

◆ getCorrectRLVote()

int getCorrectRLVote ( const CDCSegment3D ptrHits) const
inherited

Getter for the difference of correct versus incorrect right left passage information.

Definition at line 95 of file CDCMCHitCollectionLookUp.icc.h.

108 {
109 if (not ptrHits) return INVALID_ITRACK;
110 const ACDCHitCollection& hits = *ptrHits;
111 MCTrackIdPurityPair mcTrackIdAndPurity = getHighestPurity(hits);
112 if (mcTrackIdAndPurity.getPurity() >= m_minimalMatchPurity) {
113 return mcTrackIdAndPurity.getCorrectRLVote();
114 } else {
115 return 0;
116 }
117 }
MCTrackIdPurityPair getHighestPurity(const CDCSegment3D &hits) const
Get the track id with the highest corresponding purity.

◆ getFirstHit()

const CDCHit * getFirstHit ( const CDCSegment3D ptrHits) const
inherited

Getter for the first hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 105 of file CDCMCHitCollectionLookUp.icc.h.

149 {
150 if (not ptrHits) return nullptr;
151 const ACDCHitCollection& hits = *ptrHits;
152
153 ITrackType mcTrackId = getMCTrackId(ptrHits);
154 if (mcTrackId == INVALID_ITRACK) return nullptr;
155
156 const CDCMCHitLookUp& mcHitLookUp = CDCMCHitLookUp::getInstance();
157
158 for (const CDCHit* hit : hits) {
159 if (mcTrackId == mcHitLookUp.getMCTrackId(hit)) return hit;
160 }
161 return nullptr;
162 }

◆ getFirstInTrackId()

Index getFirstInTrackId ( const CDCSegment3D ptrHits) const
inlineinherited

Getter for in track id for the first hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 113 of file CDCMCHitCollectionLookUp.h.

114 { return CDCMCHitLookUp::getInstance().getInTrackId(getFirstHit(ptrHits)); }
const CDCHit * getFirstHit(const CDCSegment3D *ptrHits) const
Getter for the first hit in the collection of hits which has the Monte Carlo track id matched to this...

◆ getFirstInTrackSegmentId()

Index getFirstInTrackSegmentId ( const CDCSegment3D ptrHits) const
inlineinherited

Getter for in track collection of hits id for the first hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 123 of file CDCMCHitCollectionLookUp.h.

124 { return CDCMCHitLookUp::getInstance().getInTrackSegmentId(getFirstHit(ptrHits)); }

◆ getFirstNLoops()

Index getFirstNLoops ( const CDCSegment3D ptrHits) const
inlineinherited

Getter for number of loops till the first hit the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 141 of file CDCMCHitCollectionLookUp.h.

142 { return CDCMCHitLookUp::getInstance().getNLoops(getFirstHit(ptrHits)); }

◆ getFirstNPassedSuperLayers()

Index getFirstNPassedSuperLayers ( const CDCSegment3D ptrHits) const
inlineinherited

Getter for number of passed superlayer till the first hit the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 133 of file CDCMCHitCollectionLookUp.h.

134 { return CDCMCHitLookUp::getInstance().getNPassedSuperLayers(getFirstHit(ptrHits)); }

◆ getHighestPurity()

MCTrackIdPurityPair getHighestPurity ( const CDCSegment3D hits) const
inherited

Get the track id with the highest corresponding purity.

Definition at line 85 of file CDCMCHitCollectionLookUp.icc.h.

56 {
57 std::map<ITrackType, size_t> hitCountByMCTrackId = getHitCountByMCTrackId(hits);
58
59 size_t nHits = 0;
60 std::pair<ITrackType, size_t> highestHitCountMCTrackId(0, 0);
61 // cppcheck-suppress ignoredReturnValue
62 std::max_element(hitCountByMCTrackId.begin(), hitCountByMCTrackId.end(), LessOf<Second>());
63
64 for (const auto& hitCountForMCTrackId : hitCountByMCTrackId) {
65
66 nHits += hitCountForMCTrackId.second;
67
68 if (highestHitCountMCTrackId.second < hitCountForMCTrackId.second) {
69 highestHitCountMCTrackId = hitCountForMCTrackId;
70 }
71 }
72
73 const CDCMCHitLookUp& mcHitLookUp = CDCMCHitLookUp::getInstance();
74
75 int correctRLVote = 0;
76 for (const auto& recoHit : hits) {
77 const CDCHit* hit = recoHit;
78 ERightLeft mcRLInfo = mcHitLookUp.getRLInfo(hit);
79 ERightLeft rlInfo = recoHit.getRLInfo();
80 if (rlInfo == mcRLInfo) {
81 ++correctRLVote;
82 } else {
83 --correctRLVote;
84 }
85 }
86
87 const float purity = static_cast<float>(highestHitCountMCTrackId.second) / nHits;
88 return MCTrackIdPurityPair(highestHitCountMCTrackId.first, purity, correctRLVote);
89 }
std::map< ITrackType, size_t > getHitCountByMCTrackId(const CDCSegment3D &hits) const
Fill a map with the number of hits for each track id contained in the given hit range.
ERightLeft
Enumeration to represent the distinct possibilities of the right left passage.
Definition: ERightLeft.h:25

◆ getHitCountByMCTrackId()

std::map< ITrackType, size_t > getHitCountByMCTrackId ( const CDCSegment3D hits) const
privateinherited

Fill a map with the number of hits for each track id contained in the given hit range.

Definition at line 81 of file CDCMCHitCollectionLookUp.icc.h.

40 {
41 const CDCMCHitLookUp& mcHitLookUp = CDCMCHitLookUp::getInstance();
42
43 std::map<ITrackType, size_t> hitCountByMCTrackId;
44 for (const CDCHit* ptrHit : hits) {
45 ITrackType mcTrackId = mcHitLookUp.getMCTrackId(ptrHit);
46 // cppcheck-suppress stlFindInsert
47 if (hitCountByMCTrackId.count(mcTrackId) == 0) hitCountByMCTrackId[mcTrackId] = 0;
48 ++(hitCountByMCTrackId[mcTrackId]);
49 }
50 return hitCountByMCTrackId;
51 }

◆ getInstance()

const CDCMCSegment3DLookUp & getInstance ( )
static

Getter for the singletone instance.

Definition at line 21 of file CDCMCSegment3DLookUp.cc.

22{
24}
static const CDCMCSegment3DLookUp & getMCSegment3DLookUp()
Getter for the singleton instance of the CDCMCSegment3DLookUp.

◆ getLastHit()

const CDCHit * getLastHit ( const CDCSegment3D ptrHits) const
inherited

Getter for the last hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 108 of file CDCMCHitCollectionLookUp.icc.h.

167 {
168
169 if (not ptrHits) return nullptr;
170 const ACDCHitCollection& hits = *ptrHits;
171
172 ITrackType mcTrackId = getMCTrackId(ptrHits);
173 if (mcTrackId == INVALID_ITRACK) return nullptr;
174
175 const CDCMCHitLookUp& mcHitLookUp = CDCMCHitLookUp::getInstance();
176
177 for (const CDCHit* hit : reversedRange(hits)) {
178 if (mcTrackId == mcHitLookUp.getMCTrackId(hit)) return hit;
179 }
180 return nullptr;
181 }

◆ getLastInTrackId()

Index getLastInTrackId ( const CDCSegment3D ptrHits) const
inlineinherited

Getter for in track id for the last hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 117 of file CDCMCHitCollectionLookUp.h.

118 { return CDCMCHitLookUp::getInstance().getInTrackId(getLastHit(ptrHits)); }
const CDCHit * getLastHit(const CDCSegment3D *ptrHits) const
Getter for the last hit in the collection of hits which has the Monte Carlo track id matched to this ...

◆ getLastInTrackSegmentId()

Index getLastInTrackSegmentId ( const CDCSegment3D ptrHits) const
inlineinherited

Getter for in track collection of hits id for the last hit in the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 127 of file CDCMCHitCollectionLookUp.h.

128 { return CDCMCHitLookUp::getInstance().getInTrackSegmentId(getLastHit(ptrHits)); }

◆ getLastNLoops()

Index getLastNLoops ( const CDCSegment3D ptrHits) const
inlineinherited

Getter for number of loops till the last hit the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 145 of file CDCMCHitCollectionLookUp.h.

146 { return CDCMCHitLookUp::getInstance().getNLoops(getLastHit(ptrHits)); }

◆ getLastNPassedSuperLayers()

Index getLastNPassedSuperLayers ( const CDCSegment3D ptrHits) const
inlineinherited

Getter for number of passed superlayer till the last hit the collection of hits which has the Monte Carlo track id matched to this collection of hits.

Definition at line 137 of file CDCMCHitCollectionLookUp.h.

138 { return CDCMCHitLookUp::getInstance().getNPassedSuperLayers(getLastHit(ptrHits)); }

◆ getMCParticle()

const MCParticle * getMCParticle ( const CDCSegment3D ptrHits) const
inherited

Getter for the mc particle matched to this collection of hits.

Definition at line 101 of file CDCMCHitCollectionLookUp.icc.h.

140 {
141 const CDCHit* ptrHit = getFirstHit(ptrHits);
142 const CDCMCHitLookUp& mcHitLookUp = CDCMCHitLookUp::getInstance();
143 return mcHitLookUp.getMCParticle(ptrHit);
144 }

◆ getMCTrackId()

ITrackType getMCTrackId ( const CDCSegment3D ptrHits) const
inherited

Getter for the Monte Carlo track id matched to this collection of hits.

On first encounter of a collection of hits this evaluates the purities for the contained track ids. The match is valid if the highest purity exceeds the s_minimalMatchPurity threshold. In case the highest purity is to low to result will be INVALID_ITRACK. To result is stored in member map object for fast look up for repeated calls.

Definition at line 92 of file CDCMCHitCollectionLookUp.icc.h.

94 {
95 if (not ptrHits) return INVALID_ITRACK;
96 const ACDCHitCollection& hits = *ptrHits;
97 MCTrackIdPurityPair mcTrackIdAndPurity = getHighestPurity(hits);
98 if (mcTrackIdAndPurity.getPurity() >= m_minimalMatchPurity) {
99 return mcTrackIdAndPurity.getMCTrackId();
100 } else {
101 return INVALID_ITRACK;
102 }
103 }

◆ getRLPurity()

double getRLPurity ( const CDCSegment3D ptrHits) const
inherited

Getter for the right left passge purity which respects the forward backward reconstruction.

Definition at line 98 of file CDCMCHitCollectionLookUp.icc.h.

122 {
124 if (fbInfo == EForwardBackward::c_Invalid) return NAN;
125
126 int correctRLVote = getCorrectRLVote(ptrHits);
127
128 if (fbInfo == EForwardBackward::c_Backward) {
129 correctRLVote = -correctRLVote;
130 }
131
132 int nCorrectRL = (correctRLVote + ptrHits->size()) / 2;
133 float rlPurity = 1.0 * nCorrectRL / ptrHits->size();
134 return rlPurity;
135 }

◆ getTrajectory3D()

CDCTrajectory3D getTrajectory3D ( const CDCSegment3D ptrHits) const
inherited

Returns the trajectory of the collection of hits.

Definition at line 180 of file CDCMCHitCollectionLookUp.icc.h.

353 {
354 if (not ptrHits) {
355 B2WARNING("Segment is nullptr. Could not get fit.");
356 return CDCTrajectory3D();
357 }
358
359 const CDCMCHitLookUp& mcHitLookUp = CDCMCHitLookUp::getInstance();
360
361 const CDCHit* ptrFirstHit = getFirstHit(ptrHits);
362 const CDCSimHit* ptrPrimarySimHit = mcHitLookUp.getClosestPrimarySimHit(ptrFirstHit);
363
364 if (not ptrPrimarySimHit) {
365 // If there is no primary SimHit simply use the secondary simhit as reference
366 ptrPrimarySimHit = mcHitLookUp.getSimHit(ptrFirstHit);
367 if (not ptrPrimarySimHit) {
368 return CDCTrajectory3D();
369 }
370 }
371
372 const CDCSimHit& primarySimHit = *ptrPrimarySimHit;
373
374 Vector3D mom3D{primarySimHit.getMomentum()};
375 Vector3D pos3D{primarySimHit.getPosTrack()};
376 double time{primarySimHit.getFlightTime()};
377
378 int pdgCode = primarySimHit.getPDGCode();
379 const TParticlePDG* ptrTPDGParticle = TDatabasePDG::Instance()->GetParticle(pdgCode);
380
381 if (not ptrTPDGParticle) {
382 B2WARNING("No particle for PDG code " << pdgCode << ". Could not get fit");
383 return CDCTrajectory3D();
384 }
385
386 const TParticlePDG& tPDGParticle = *ptrTPDGParticle;
387
388 double charge = tPDGParticle.Charge() / 3.0;
389
390 ESign chargeSign = sign(charge);
391
392 CDCTrajectory3D trajectory3D(pos3D, time, mom3D, charge);
393
394 ESign settedChargeSign = trajectory3D.getChargeSign();
395
396 if (chargeSign != settedChargeSign) {
397 B2WARNING("Charge sign of mc particle is not the same as the one of the fit");
398 }
399
400 return trajectory3D;
401 }
HepGeom::Vector3D< double > Vector3D
3D Vector
Definition: Cell.h:34
double charge(int pdgCode)
Returns electric charge of a particle with given pdg code.
Definition: EvtPDLUtil.cc:44
ESign
Enumeration for the distinct sign values of floating point variables.
Definition: ESign.h:27

◆ isForwardOrBackwardToMCTrack()

EForwardBackward isForwardOrBackwardToMCTrack ( const CDCSegment3D ptrHits) const
inherited

Returns the orientation of the collection of hits relative to its matched track.

  • Returns EForwardBackward::c_Invalid if the collection of hits is not matched to any track.
  • Returns EForwardBackward::c_Forward if the collection of hits is coaligned with the matched track.
  • Returns EForwardBackward::c_Backward if the collection of hits is coaligned with the matched track interpreted in reverse.
  • Returns EForwardBackward::c_Unknown if the matter cannot be decided.

Definition at line 155 of file CDCMCHitCollectionLookUp.icc.h.

186 {
187 Index firstInTrackId = getFirstInTrackId(ptrHits);
188 Index lastInTrackId = getLastInTrackId(ptrHits);
189 if (firstInTrackId == c_InvalidIndex or lastInTrackId == c_InvalidIndex) {
190 return EForwardBackward::c_Invalid;
191 } else if (firstInTrackId < lastInTrackId) {
192 return EForwardBackward::c_Forward;
193 } else if (firstInTrackId > lastInTrackId) {
194 return EForwardBackward::c_Backward;
195 } else if (firstInTrackId == lastInTrackId) {
196 return EForwardBackward::c_Unknown;
197 }
198 return EForwardBackward::c_Invalid;
199 }

Member Data Documentation

◆ m_minimalMatchPurity

float m_minimalMatchPurity
privateinherited

Threshold for the purity that must be exceeded to be considered as a match.

Definition at line 184 of file CDCMCHitCollectionLookUp.h.

◆ m_minimalRLPurity

float m_minimalRLPurity
privateinherited

Threshold for the correct fraction of right left passage information to be considered a match.

Definition at line 187 of file CDCMCHitCollectionLookUp.h.


The documentation for this class was generated from the following files: