Belle II Software  release-05-01-25
CDCMCTrackStore.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2014 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <tracking/trackFindingCDC/mclookup/CDCMCTrackStore.h>
12 
13 #include <tracking/trackFindingCDC/mclookup/CDCSimHitLookUp.h>
14 #include <tracking/trackFindingCDC/mclookup/CDCMCMap.h>
15 #include <tracking/trackFindingCDC/mclookup/CDCMCManager.h>
16 
17 #include <tracking/trackFindingCDC/topology/CDCWireTopology.h>
18 
19 #include <tracking/trackFindingCDC/utilities/Functional.h>
20 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
21 
22 #include <cdc/dataobjects/CDCHit.h>
23 #include <cdc/dataobjects/CDCSimHit.h>
24 #include <mdst/dataobjects/MCParticle.h>
25 
26 using namespace Belle2;
27 using namespace TrackFindingCDC;
28 
30 {
32 }
33 
34 
36 {
37 
38  B2DEBUG(200, "In CDCMCTrackStore::clear()");
39 
40  m_ptrMCMap = nullptr;
41 
44 
45  m_inTrackIds.clear();
46  m_inTrackSegmentIds.clear();
47  m_nPassedSuperLayers.clear();
48  m_nLoops.clear();
49 
50 }
51 
52 
53 
54 void CDCMCTrackStore::fill(const CDCMCMap* ptrMCMap, const CDCSimHitLookUp* ptrSimHitLookUp)
55 {
56 
57  B2DEBUG(200, "In CDCMCTrackStore::fill()");
58  clear();
59 
60  m_ptrMCMap = ptrMCMap;
61  m_ptrSimHitLookUp = ptrSimHitLookUp;
62 
63  // Put the right hits into the right track
64  fillMCTracks();
65 
66  // Split the tracks into segments
68 
69  // Assign the reverse mapping from CDCHits to position in track
70  fillInTrackId();
71 
72  // Assigne the reverse mapping from CDCHits to segment ids
74 
75  // Assigne the reverse mapping from CDCHits to the number of already traversed superlayers
77 
78  B2DEBUG(100, "m_mcTracksByMCParticleIdx.size(): " << m_mcTracksByMCParticleIdx.size());
79  B2DEBUG(100, "m_mcSegmentsByMCParticleIdx.size(): " << m_mcSegmentsByMCParticleIdx.size());
80 
81  B2DEBUG(100, "m_inTrackIds.size(): " << m_inTrackIds.size());
82  B2DEBUG(100, "m_inTrackSegmentIds.size() " << m_inTrackSegmentIds.size());
83  B2DEBUG(100, "m_nPassedSuperLayers.size(): " << m_nPassedSuperLayers.size());
84  B2DEBUG(100, "m_nLoops.size(): " << m_nLoops.size());
85 
86 }
87 
88 
90 {
91  if (not m_ptrMCMap) {
92  B2WARNING("CDCMCMap not set. Cannot create tracks");
93  return;
94  }
95 
96  const CDCMCMap& mcMap = *m_ptrMCMap;
97 
98  for (const auto& relation : mcMap.getHitsByMCParticle()) {
99 
100  const MCParticle* ptrMCParticle = std::get<const MCParticle* const>(relation);
101  const CDCHit* ptrHit = std::get<const CDCHit*>(relation);
102 
103  if (not mcMap.isBackground(ptrHit) and ptrMCParticle) {
104 
105  ITrackType mcParticleIdx = ptrMCParticle->getArrayIndex();
106  //Append hit to its own track
107  m_mcTracksByMCParticleIdx[mcParticleIdx].push_back(ptrHit);
108  }
109  }
110 
111 
112  //Sort the tracks along the time of flight
113  for (std::pair<const ITrackType, CDCHitVector>& mcTrackAndMCParticleIdx : m_mcTracksByMCParticleIdx) {
114 
115  //int mcParticleIdx = mcTrackAndMCParticleIdx.first;
116  CDCHitVector& mcTrack = mcTrackAndMCParticleIdx.second;
117  arrangeMCTrack(mcTrack);
118 
119  }
120 
121 }
122 
124 {
125  for (std::pair<const ITrackType, CDCHitVector>& mcTrackAndMCParticleIdx : m_mcTracksByMCParticleIdx) {
126 
127  ITrackType mcParticleIdx = mcTrackAndMCParticleIdx.first;
128  CDCHitVector& mcTrack = mcTrackAndMCParticleIdx.second;
129 
130  if (mcTrack.empty()) continue;
131  std::vector<CDCHitVector>& mcSegments = m_mcSegmentsByMCParticleIdx[mcParticleIdx];
132  mcSegments.clear();
133 
134  // Split track into runs in the same superlayer
135  auto superLayerRanges = adjacent_groupby(mcTrack.begin(), mcTrack.end(), [](const CDCHit * hit) {
136  return hit->getISuperLayer();
137  });
138 
139  std::vector<CDCHitVector> superLayerRuns;
140  for (const auto& superLayerRange : superLayerRanges) {
141  superLayerRuns.push_back({superLayerRange.begin(), superLayerRange.end()});
142  }
143 
144  std::vector<std::vector<CDCHitVector>::iterator> smallSuperLayerRuns;
145  for (auto itSuperLayerRun = superLayerRuns.begin();
146  itSuperLayerRun != superLayerRuns.end();
147  ++itSuperLayerRun) {
148  if (itSuperLayerRun->size() < 3) smallSuperLayerRuns.push_back(itSuperLayerRun);
149  }
150 
151  // Merge small run to an adjacent run
152  for (auto itSuperLayerRun : smallSuperLayerRuns) {
153  ISuperLayer iSL = itSuperLayerRun->front()->getISuperLayer();
154 
155  // Look in both directions to adopt the hits in this small runs
156  auto itSuperLayerRunBefore = superLayerRuns.end();
157  int hitDistanceBefore = INT_MAX;
158  if (std::distance(superLayerRuns.begin(), itSuperLayerRun) >= 2) {
159  itSuperLayerRunBefore = itSuperLayerRun - 2;
160  if (itSuperLayerRunBefore->front()->getISuperLayer() == iSL) {
161  hitDistanceBefore = (itSuperLayerRunBefore - 1)->size();
162  } else {
163  itSuperLayerRunBefore = superLayerRuns.end();
164  }
165  }
166 
167  auto itSuperLayerRunAfter = superLayerRuns.end();
168  int hitDistanceAfter = INT_MAX;
169  if (std::distance(itSuperLayerRun, superLayerRuns.end()) > 2) {
170  itSuperLayerRunAfter = itSuperLayerRun + 2;
171  if (itSuperLayerRunAfter->front()->getISuperLayer() == iSL) {
172  hitDistanceAfter = (itSuperLayerRunAfter + 1)->size();
173  } else {
174  itSuperLayerRunAfter = superLayerRuns.end();
175  }
176  }
177 
178  auto itMergeSuperLayerRun = superLayerRuns.end();
179  bool mergeBefore = false;
180  if (hitDistanceBefore < hitDistanceAfter) {
181  itMergeSuperLayerRun = itSuperLayerRunBefore;
182  mergeBefore = true;
183  } else {
184  itMergeSuperLayerRun = itSuperLayerRunAfter;
185  mergeBefore = false;
186  }
187 
188  if (itMergeSuperLayerRun == superLayerRuns.end()) continue;
189  else if (mergeBefore) {
190  itMergeSuperLayerRun->insert(itMergeSuperLayerRun->end(), itSuperLayerRun->begin(), itSuperLayerRun->end());
191  itSuperLayerRun->clear();
192  } else {
193  itMergeSuperLayerRun->insert(itMergeSuperLayerRun->begin(), itSuperLayerRun->begin(), itSuperLayerRun->end());
194  itSuperLayerRun->clear();
195  }
196  }
197 
198  // Remove empty small runs
199  erase_remove_if(superLayerRuns, Size() == 0u);
200 
201  // Concat the runs that are now in the same superlayer
202  auto mergeSameSuperLayer = [](CDCHitVector & lhs, CDCHitVector & rhs) {
203  if (lhs.empty() or rhs.empty()) return true;
204  if (lhs.front()->getISuperLayer() != rhs.front()->getISuperLayer()) return false;
205  lhs.insert(lhs.end(), rhs.begin(), rhs.end());
206  rhs.clear();
207  return true;
208  };
209  erase_unique(superLayerRuns, mergeSameSuperLayer);
210 
211  // Now analyse the runs in turn and break them in the connected segments
212  for (const CDCHitVector& superLayerRun : superLayerRuns) {
213  const CDCWireTopology& wireTopology = CDCWireTopology::getInstance();
214  auto areNeighbors = [&wireTopology](const CDCHit * lhs, const CDCHit * rhs) {
215  WireID lhsWireID(lhs->getISuperLayer(), lhs->getILayer(), lhs->getIWire());
216  WireID rhsWireID(rhs->getISuperLayer(), rhs->getILayer(), rhs->getIWire());
217 
218  return (wireTopology.arePrimaryNeighbors(lhsWireID, rhsWireID) or
219  wireTopology.areSeconaryNeighbors(lhsWireID, rhsWireID) or
220  lhsWireID == rhsWireID);
221  };
222 
223  auto segmentRanges = unique_ranges(superLayerRun.begin(), superLayerRun.end(), areNeighbors);
224 
225  for (const ConstVectorRange<const CDCHit*> segmentRange : segmentRanges) {
226  mcSegments.emplace_back(segmentRange.begin(), segmentRange.end());
227  }
228  } // end for superLayerRuns
229 
230  // Lets sort them along for the time of flight.
231  for (CDCHitVector& mcSegment : mcSegments) {
232  arrangeMCTrack(mcSegment);
233  }
234  } // End for mc track
235 }
236 
238 {
239  if (not m_ptrMCMap) {
240  B2WARNING("CDCMCMap not set. Cannot sort track");
241  return;
242  }
243 
244  const CDCSimHitLookUp& simHitLookUp = *m_ptrSimHitLookUp;
245 
246  std::stable_sort(mcTrack.begin(), mcTrack.end(),
247  [&simHitLookUp](const CDCHit * ptrHit, const CDCHit * ptrOtherHit) -> bool {
248 
249  const CDCSimHit* ptrSimHit = simHitLookUp.getClosestPrimarySimHit(ptrHit);
250  const CDCSimHit* ptrOtherSimHit = simHitLookUp.getClosestPrimarySimHit(ptrOtherHit);
251 
252  if (not ptrSimHit)
253  {
254  B2FATAL("No CDCSimHit for CDCHit");
255  }
256 
257  if (not ptrOtherSimHit)
258  {
259  B2FATAL("No CDCSimHit for CDCHit");
260  }
261 
262  double secondaryFlightTime = ptrSimHit->getFlightTime();
263  double otherSecondaryFlightTime = ptrOtherSimHit->getFlightTime();
264 
266  return (secondaryFlightTime < std::fmin(INFINITY, otherSecondaryFlightTime));
267  });
268 
269 }
270 
271 
272 
273 
274 
275 
276 void CDCMCTrackStore::fillInTrackId()
277 {
278 
279  for (const std::pair<ITrackType, CDCHitVector>& mcTrackAndMCParticleIdx : getMCTracksByMCParticleIdx()) {
280 
281  const CDCHitVector& mcTrack = mcTrackAndMCParticleIdx.second;
282 
283  //Fill the in track ids
284  int iHit = -1;
285  for (const CDCHit* ptrHit : mcTrack) {
286  ++iHit;
287  m_inTrackIds[ptrHit] = iHit;
288  }
289  }
290 
291 }
292 
293 void CDCMCTrackStore::fillInTrackSegmentId()
294 {
295  for (const std::pair<ITrackType, std::vector<CDCHitVector> >& mcSegmentsAndMCParticleIdx : getMCSegmentsByMCParticleIdx()) {
296  const std::vector<CDCHitVector>& mcSegments = mcSegmentsAndMCParticleIdx.second;
297 
298  int iSegment = -1;
299  for (const CDCHitVector& mcSegment : mcSegments) {
300  ++iSegment;
301  for (const CDCHit* ptrHit : mcSegment) {
302 
303  m_inTrackSegmentIds[ptrHit] = iSegment;
304  }
305  }
306  }
307 
308 }
309 
310 void CDCMCTrackStore::fillNLoopsAndNPassedSuperLayers()
311 {
312 
313  for (const std::pair<ITrackType, std::vector<CDCHitVector> >& mcSegmentsAndMCParticleIdx : getMCSegmentsByMCParticleIdx()) {
314  const std::vector<CDCHitVector>& mcSegments = mcSegmentsAndMCParticleIdx.second;
315 
316  const CDCHitVector* ptrLastMCSegment = nullptr;
317  int nPassedSuperLayers = 0;
318  int nLoops = 0;
319 
320  for (const CDCHitVector& mcSegment : mcSegments) {
321  if (ptrLastMCSegment and changedSuperLayer(*ptrLastMCSegment, mcSegment)) {
322  ++nPassedSuperLayers;
323 
324  // Increase the superlayer number if the track leaves the CDC for the inner volume.
325  // Feel free to do something smarter here.
326  if (ptrLastMCSegment->front()->getISuperLayer() == 0 and
327  mcSegment.front()->getISuperLayer() == 0) {
328  ++nLoops;
329  }
330  }
331 
332  for (const CDCHit* ptrHit : mcSegment) {
333  m_nPassedSuperLayers[ptrHit] = nPassedSuperLayers;
334  m_nLoops[ptrHit] = nLoops;
335  }
336 
337  ptrLastMCSegment = &mcSegment;
338 
339  }
340  }
341 }
342 
343 bool CDCMCTrackStore::changedSuperLayer(const CDCHitVector& mcSegment, const CDCHitVector& nextMCSegment) const
344 {
345  const CDCSimHitLookUp& simHitLookUp = *m_ptrSimHitLookUp;
346  const CDCHit* ptrHit = mcSegment.front();
347  const CDCHit* ptrNextHit = nextMCSegment.front();
348 
349  assert(ptrHit);
350  assert(ptrNextHit);
351 
352  const CDCHit& hit = *ptrHit;
353  const CDCHit& nextHit = *ptrNextHit;
354 
355  if (hit.getISuperLayer() != nextHit.getISuperLayer()) {
356  return true;
357  } else if (hit.getISuperLayer() == 0) {
358  const CDCSimHit* ptrSimHit = simHitLookUp.getClosestPrimarySimHit(ptrHit);
359  const CDCSimHit* ptrNextSimHit = simHitLookUp.getClosestPrimarySimHit(ptrNextHit);
360 
361  Vector3D pos(ptrSimHit->getPosTrack());
362  Vector3D mom(ptrSimHit->getMomentum());
363  Vector3D nextMom(ptrNextSimHit->getMomentum());
364  Vector3D nextPos(ptrNextSimHit->getPosTrack());
365 
366  if (pos.dotXY(nextPos) < 0) return true;
367  if ((nextPos - pos).dotXY(nextMom) < 0) return true;
368  if ((nextPos - pos).dotXY(mom) < 0) return true;
369 
370  // TODO introduce a smarter check here
371  return false;
372  } else {
373  return false;
374  }
375 }
376 
377 
378 Index CDCMCTrackStore::getInTrackId(const CDCHit* ptrHit) const
379 {
380 
381  auto itFoundHit = m_inTrackIds.find(ptrHit);
382  return itFoundHit == m_inTrackIds.end() ? c_InvalidIndex : itFoundHit->second;
383 
384 }
385 
386 
387 
388 Index CDCMCTrackStore::getInTrackSegmentId(const CDCHit* ptrHit) const
389 {
390 
391  auto itFoundHit = m_inTrackSegmentIds.find(ptrHit);
392  return itFoundHit == m_inTrackSegmentIds.end() ? c_InvalidIndex : itFoundHit->second;
393 
394 }
395 
396 
397 Index CDCMCTrackStore::getNPassedSuperLayers(const CDCHit* ptrHit) const
398 {
399 
400  auto itFoundHit = m_nPassedSuperLayers.find(ptrHit);
401  return itFoundHit == m_nPassedSuperLayers.end() ? c_InvalidIndex : itFoundHit->second;
402 
403 }
404 
405 Index CDCMCTrackStore::getNLoops(const CDCHit* ptrHit) const
406 {
407 
408  auto itFoundHit = m_nLoops.find(ptrHit);
409  return itFoundHit == m_nLoops.end() ? c_InvalidIndex : itFoundHit->second;
410 
411 }
Belle2::TrackFindingCDC::CDCMCTrackStore::m_nLoops
std::map< const CDCHit *, int > m_nLoops
Look up table for the number of loops the particle traversed before making the individual hit.
Definition: CDCMCTrackStore.h:137
Belle2::CDCHit::getISuperLayer
unsigned short getISuperLayer() const
Getter for iSuperLayer.
Definition: CDCHit.h:195
Belle2::TrackFindingCDC::CDCMCTrackStore::CDCHitVector
std::vector< const CDCHit * > CDCHitVector
Type for an ordered sequence of pointers to the CDCHit.
Definition: CDCMCTrackStore.h:42
Belle2::WireID
Class to identify a wire inside the CDC.
Definition: WireID.h:44
Belle2::TrackFindingCDC::CDCMCTrackStore::arrangeMCTrack
void arrangeMCTrack(CDCHitVector &mcTrack) const
Sorts the given track for the FlightTime of the assoziated CDCSimHits.
Definition: CDCMCTrackStore.cc:237
Belle2::CDCSimHit::getPosTrack
TVector3 getPosTrack() const
The method to get position on the track.
Definition: CDCSimHit.h:234
Belle2::TrackFindingCDC::CDCWireTopology::areSeconaryNeighbors
bool areSeconaryNeighbors(const WireID &wireID, const WireID &otherWireID) const
Checks if two wires are secondary neighbors.
Definition: CDCWireTopology.h:215
Belle2::TrackFindingCDC::CDCMCTrackStore::m_mcTracksByMCParticleIdx
std::map< ITrackType, CDCHitVector > m_mcTracksByMCParticleIdx
The memory for the tracks made of CDCHits sorted for the time of flight and assoziated to the Monte C...
Definition: CDCMCTrackStore.h:122
Belle2::CDCHit
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition: CDCHit.h:51
Belle2::TrackFindingCDC::CDCWireTopology::getInstance
static CDCWireTopology & getInstance()
Getter for the singleton instance of the wire topology.
Definition: CDCWireTopology.cc:22
Belle2::TrackFindingCDC::CDCMCTrackStore
Class to organize and present the monte carlo hit information.
Definition: CDCMCTrackStore.h:38
Belle2::TrackFindingCDC::CDCMCTrackStore::fillInTrackId
void fillInTrackId()
Fill the look up table for the in track index of each hit.
Definition: CDCMCTrackStore.cc:276
Belle2::TrackFindingCDC::CDCMCTrackStore::fillNLoopsAndNPassedSuperLayers
void fillNLoopsAndNPassedSuperLayers()
Fill the look up table of the number of traversed super layers until each hit.
Definition: CDCMCTrackStore.cc:310
Belle2::TrackFindingCDC::CDCMCTrackStore::m_ptrSimHitLookUp
const CDCSimHitLookUp * m_ptrSimHitLookUp
Reference to the CDCSimHit look up for additional information about related primary sim hits.
Definition: CDCMCTrackStore.h:119
Belle2::TrackFindingCDC::CDCMCTrackStore::m_ptrMCMap
const CDCMCMap * m_ptrMCMap
Reference to the MC map of the current event.
Definition: CDCMCTrackStore.h:116
Belle2::TrackFindingCDC::CDCMCTrackStore::m_inTrackIds
std::map< const CDCHit *, int > m_inTrackIds
Look up table for index of the hit within its track.
Definition: CDCMCTrackStore.h:128
Belle2::CDCSimHit
Example Detector.
Definition: CDCSimHit.h:33
Belle2::TrackFindingCDC::CDCMCTrackStore::fillMCSegments
void fillMCSegments()
Construct the segments by dividing the mc tracks in to disconnected parts and sorted them for the Fli...
Definition: CDCMCTrackStore.cc:123
Belle2::TrackFindingCDC::CDCMCTrackStore::fillInTrackSegmentId
void fillInTrackSegmentId()
Fill the look up table for the in track segment index of each hit.
Definition: CDCMCTrackStore.cc:293
Belle2::CDCHit::getILayer
unsigned short getILayer() const
Getter for iLayer.
Definition: CDCHit.h:183
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::CDCMCManager::getMCTrackStore
static const CDCMCTrackStore & getMCTrackStore()
Getter for the singletone instance of the CDCMCTrackStore.
Definition: CDCMCManager.cc:87
Belle2::TrackFindingCDC::CDCMCTrackStore::getInstance
static const CDCMCTrackStore & getInstance()
Getter for the singletone instance.
Definition: CDCMCTrackStore.cc:29
Belle2::TrackFindingCDC::Vector3D
A three dimensional vector.
Definition: Vector3D.h:34
Belle2::CDCHit::getIWire
unsigned short getIWire() const
Getter for iWire.
Definition: CDCHit.h:177
Belle2::TrackFindingCDC::Size
Functor to get the .size() from an abitrary objects.
Definition: Functional.h:328
Belle2::TrackFindingCDC::CDCMCTrackStore::m_nPassedSuperLayers
std::map< const CDCHit *, int > m_nPassedSuperLayers
Look up table for the number of super layers the particle traversed before making the individual hit.
Definition: CDCMCTrackStore.h:134
Belle2::TrackFindingCDC::CDCSimHitLookUp
Singletone class to gather local information about the hits.
Definition: CDCSimHitLookUp.h:50
Belle2::TrackFindingCDC::CDCMCTrackStore::m_mcSegmentsByMCParticleIdx
std::map< ITrackType, std::vector< CDCHitVector > > m_mcSegmentsByMCParticleIdx
The memory for the segments made of CDCHits sorted for the time of flight and assoziated to the Monte...
Definition: CDCMCTrackStore.h:125
Belle2::TrackFindingCDC::CDCMCTrackStore::clear
void clear()
Clear all Monte Carlo hits.
Definition: CDCMCTrackStore.cc:35
Belle2::TrackFindingCDC::CDCWireTopology::arePrimaryNeighbors
bool arePrimaryNeighbors(const WireID &wireID, const WireID &otherWireID) const
Checks if two wires are primary neighbors.
Definition: CDCWireTopology.h:211
Belle2::TrackFindingCDC::Range
A pair of iterators usable with the range base for loop.
Definition: Range.h:35
Belle2::TrackFindingCDC::CDCSimHitLookUp::getClosestPrimarySimHit
MayBePtr< const CDCSimHit > getClosestPrimarySimHit(const CDCSimHit *ptrSimHit) const
Helper function to find the closest primary hit for the given CDCSimHit from the same MCParticle - nu...
Definition: CDCSimHitLookUp.cc:91
Belle2::CDCSimHit::getMomentum
TVector3 getMomentum() const
The method to get momentum.
Definition: CDCSimHit.h:210
Belle2::MCParticle
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:43
Belle2::TrackFindingCDC::CDCMCTrackStore::m_inTrackSegmentIds
std::map< const CDCHit *, int > m_inTrackSegmentIds
Look up table for index of the segment of the hits within their respective tracks.
Definition: CDCMCTrackStore.h:131
Belle2::TrackFindingCDC::CDCMCMap::getHitsByMCParticle
const std::multimap< const MCParticle *, const CDCHit * > & getHitsByMCParticle() const
Getter for the MCParticle -> CDCHit relations.
Definition: CDCMCMap.h:150
Belle2::TrackFindingCDC::CDCMCMap::isBackground
bool isBackground(const CDCSimHit *simHit) const
Indicates if the CDCSimHit is considered background.
Definition: CDCMCMap.cc:263
Belle2::TrackFindingCDC::CDCMCMap
Class to organize and present the monte carlo hit information.
Definition: CDCMCMap.h:38
Belle2::TrackFindingCDC::CDCMCTrackStore::fillMCTracks
void fillMCTracks()
Construct the tracks by grouping the hits by the mc particle id and sorted them for the FlightTime of...
Definition: CDCMCTrackStore.cc:89
Belle2::TrackFindingCDC::CDCWireTopology
Class representating the sense wire arrangement in the whole of the central drift chamber.
Definition: CDCWireTopology.h:54
Belle2::TrackFindingCDC::CDCMCTrackStore::fill
void fill(const CDCMCMap *ptrMCMap, const CDCSimHitLookUp *ptrSimHitLookUp)
Fill the store with the tracks from Monte Carlo information.
Definition: CDCMCTrackStore.cc:54