Belle II Software  release-08-01-10
MergerCosmicTracksModule.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <alignment/modules/MergerCosmicTracks/MergerCosmicTracksModule.h>
10 
11 #include <cdc/geometry/CDCGeometryPar.h>
12 #include <ecl/dataobjects/ECLConnectedRegion.h>
13 #include <ecl/dataobjects/ECLShower.h>
14 #include <framework/datastore/StoreArray.h>
15 #include <framework/geometry/B2Vector3.h>
16 #include <mdst/dataobjects/KLMCluster.h>
17 #include <vxd/geometry/GeoCache.h>
18 
19 using namespace Belle2;
20 
21 REG_MODULE(MergerCosmicTracks);
22 
24 {
25  setDescription("Select cosmic events containing two tracks (up/down) and merge two tracks");
27 
28  addParam("recoTracksStoreArrayName", m_param_recoTracksStoreArrayName,
29  "StoreArray containing the RecoTracks to read from and delete afterwards.",
31  addParam("mergedRecoTracksStoreArrayName", m_param_mergedRecoTracksStoreArrayName,
32  "StoreArray to where to copy the merged RecoTrack.",
34  addParam("usingMagneticField", m_usingMagneticField,
35  "Flag to using magnetic field during reconstruction.",
37  addParam("minimumNumHitCut", m_minimumNumHitCut, "Number of CDC hit per track required for cosmic track", m_minimumNumHitCut);
38  addParam("minimumClusterSize", m_minimumClusterSize, "Minimal cluster size for used PXD clusters for cosmic track",
40 }
41 
43 {
44  m_Tracks.isRequired();
47  m_ECLConnectedRegions.isRequired();
48  m_KLMClusters.isRequired();
49 
51 
54 }
55 
56 void MergerCosmicTracksModule::MergingTracks(RecoTrack* firstRecoTrack, RecoTrack* secondRecoTrack,
57  StoreArray<RecoTrack>& mergedRecoTracks)
58 {
59 
60  // y = exp((-p0+x)/p1) + p2 ; where x ~ ADCCounts/NumberOfCDCHits, y ~ momentum
61  const float fittedValuesOfFunctions[3] = {50.2380, 21.9203, 19.8463}; // {p0, p1, p2}
62 
63  // Definition of upper and lower part of CosmicRecoTrack
64  RecoTrack* upperTrack;
65  RecoTrack* lowerTrack;
66 
67  // The RecoTrack with smaller timeSeed is upper
68  if (firstRecoTrack->getTimeSeed() < secondRecoTrack->getTimeSeed()) {
69  upperTrack = firstRecoTrack;
70  lowerTrack = secondRecoTrack;
71  } else {
72  upperTrack = secondRecoTrack;
73  lowerTrack = firstRecoTrack;
74  }
75 
76  // estimation of momentum tracks
77  int numberOfCDCHits = upperTrack->getNumberOfCDCHits() + lowerTrack->getNumberOfCDCHits();
78  float totalADCCount = 0;
79  if (upperTrack->hasCDCHits()) {
80  int CDCHits = upperTrack->getNumberOfCDCHits();
81  for (int i = 0; i < CDCHits; i++) {
82  totalADCCount = totalADCCount + upperTrack->getSortedCDCHitList()[i]->getADCCount();
83  }
84  }
85  if (lowerTrack->hasCDCHits()) {
86  int CDCHits = lowerTrack->getNumberOfCDCHits();
87  for (int i = 0; i < CDCHits; i++) {
88  totalADCCount = totalADCCount + lowerTrack->getSortedCDCHitList()[i]->getADCCount();
89  }
90  }
91  if (totalADCCount / numberOfCDCHits < 115) {
92  // y = exp((-p0+x)/p1) + p2 ; where x ~ ADCCounts/NumberOfCDCHits, y ~ momentum
93  m_magnitudeOfMomentumWithoutMagneticField = exp((-fittedValuesOfFunctions[0] + totalADCCount / numberOfCDCHits) /
94  fittedValuesOfFunctions[1]);
95  } else {
96  m_magnitudeOfMomentumWithoutMagneticField = fittedValuesOfFunctions[2];
97  }
98 
99  // Creation of CosmicRecoTrack
100  RecoTrack* mergedRecoTrack;
101  if (m_usingMagneticField == true) {
102  mergedRecoTrack = mergedRecoTracks.appendNew(upperTrack->getPositionSeed(),
103  upperTrack->getMomentumSeed(),
104  upperTrack->getChargeSeed());
105  } else {
106  B2Vector3D momentum = upperTrack->getMomentumSeed();
107  float magnitudeMomentum = momentum.Mag();
108  float newMomentumX = (momentum.Px() * m_magnitudeOfMomentumWithoutMagneticField) / magnitudeMomentum;
109  float newMomentumY = (momentum.Py() * m_magnitudeOfMomentumWithoutMagneticField) / magnitudeMomentum;
110  float newMomentumZ = (momentum.Pz() * m_magnitudeOfMomentumWithoutMagneticField) / magnitudeMomentum;
111  B2Vector3D newMomentum(newMomentumX, newMomentumY, newMomentumZ);
112  // std::cout << "No Magnetic Field: " << newMomentum.Mag() << "\n";
113  mergedRecoTrack = mergedRecoTracks.appendNew(upperTrack->getPositionSeed(),
114  newMomentum,
115  upperTrack->getChargeSeed());
116  }
117  mergedRecoTrack->setTimeSeed(upperTrack->getTimeSeed());
118 
119  int sortingNumber = 0;
120 
121  if (upperTrack->hasPXDHits()) {
122  int PXDHits = upperTrack->getNumberOfPXDHits();
123  for (int i = 0; i < PXDHits; i++) {
124  if (upperTrack->getSortedPXDHitList()[i]->getSize() > m_minimumClusterSize) {mergedRecoTrack->addPXDHit(upperTrack->getSortedPXDHitList()[i], sortingNumber);}
125  // B2INFO("Cluster size of included PXD hit: " << upperTrack->getSortedPXDHitList()[i]->getSize());
126  sortingNumber++;
127  }
128 
129  }
130 
131  if (lowerTrack->hasPXDHits()) {
132  int PXDHits = lowerTrack->getNumberOfPXDHits();
133  for (int i = 0; i < PXDHits; i++) {
134  if (lowerTrack->getSortedPXDHitList()[i]->getSize() > m_minimumClusterSize) {mergedRecoTrack->addPXDHit(lowerTrack->getSortedPXDHitList()[i], sortingNumber);}
135  // B2INFO("Cluster size of included PXD hit: " << lowerTrack->getSortedPXDHitList()[i]->getSize());
136  sortingNumber++;
137  }
138  }
139 
140  if (upperTrack->hasSVDHits()) {
141  int SVDHits = upperTrack->getNumberOfSVDHits();
142  for (int i = 0; i < SVDHits; i++) {
143  mergedRecoTrack->addSVDHit(upperTrack->getSortedSVDHitList()[i], sortingNumber);
144  sortingNumber++;
145  }
146  }
147 
148  if (lowerTrack->hasSVDHits()) {
149  int SVDHits = lowerTrack->getNumberOfSVDHits();
150  for (int i = 0; i < SVDHits; i++) {
151  mergedRecoTrack->addSVDHit(lowerTrack->getSortedSVDHitList()[i], sortingNumber);
152  sortingNumber++;
153  }
154  }
155 
156 
157  if (upperTrack->hasCDCHits()) {
158  int CDCHits = upperTrack->getNumberOfCDCHits();
159  for (int i = 0; i < CDCHits; i++) {
160  mergedRecoTrack->addCDCHit(upperTrack->getSortedCDCHitList()[i], sortingNumber);
161  sortingNumber++;
162  }
163  }
164 
165  if (lowerTrack->hasCDCHits()) {
166  int CDCHits = lowerTrack->getNumberOfCDCHits();
167  for (int i = CDCHits - 1; i >= 0; i--) {
168  mergedRecoTrack->addCDCHit(lowerTrack->getSortedCDCHitList()[i], sortingNumber);
169  sortingNumber++;
170  }
171  }
172 
173  if (upperTrack->hasBKLMHits()) {
174  int BKLMHits = upperTrack->getNumberOfBKLMHits();
175  for (int i = 0; i < BKLMHits; i++) {
176  mergedRecoTrack->addBKLMHit(upperTrack->getSortedBKLMHitList()[i], sortingNumber);
177  sortingNumber++;
178  }
179  }
180 
181  if (upperTrack->hasEKLMHits()) {
182  int EKLMHits = upperTrack->getNumberOfEKLMHits();
183  for (int i = 0; i < EKLMHits; i++) {
184  mergedRecoTrack->addEKLMHit(upperTrack->getSortedEKLMHitList()[i], sortingNumber);
185  }
186  }
187 
188  if (lowerTrack->hasBKLMHits()) {
189  int BKLMHits = lowerTrack->getNumberOfBKLMHits();
190  for (int i = 0; i < BKLMHits; i++) {
191  mergedRecoTrack->addBKLMHit(lowerTrack->getSortedBKLMHitList()[i], sortingNumber);
192  sortingNumber++;
193  }
194  }
195 
196  if (lowerTrack->hasEKLMHits()) {
197  int EKLMHits = lowerTrack->getNumberOfEKLMHits();
198  for (int i = 0; i < EKLMHits; i++) {
199  mergedRecoTrack->addEKLMHit(lowerTrack->getSortedEKLMHitList()[i], sortingNumber);
200  sortingNumber++;
201  }
202  }
203 }
204 
206 {
207  // VXD::GeoCache& geoCache = VXD::GeoCache::getInstance();
208  // CDC::CDCGeometryPar& geometryPar = CDC::CDCGeometryPar::Instance();
209 
210  // numberRecoTracks | numberKLMClusters | numberRecoTracksWithB(E)KLMHits => CosmicRecoTracks
211  // 1 1 1 Create
212  // 1 2 1 Create
213  // 2 1 1 Create
214  // 2 2 2 Create
215  // 2 More than 2 2 Create
216  // More than 2 2 2 Create
217 
218 
219  // Estimation of momentum from dE/dx, when magnetic field is off
220  // y = exp((-p0+x)/p1) + p2 ; where x ~ ADCCounts/NumberOfCDCHits, y ~ momentum
221  const float fittedValuesOfFunctions[3] = {50.2380, 21.9203, 19.8463}; // {p0, p1, p2}
222 
223  // bool mergedTracks = false;
224 
225  if (m_RecoTracks.getEntries() == 1) {
226  int numberKLMClusterEnoughLayers = 0;
227  for (int i = 0; i < m_KLMClusters.getEntries(); i++) {
228  if (m_KLMClusters[i]->getLayers() > 4) {
229  numberKLMClusterEnoughLayers++;
230  }
231  }
232 
233  if (m_ECLConnectedRegions.getEntries() == 2 || m_ECLConnectedRegions.getEntries() == 1
234  || numberKLMClusterEnoughLayers == 2 || numberKLMClusterEnoughLayers == 1) {
235  if (m_RecoTracks[0]->getNumberOfCDCHits() > m_minimumNumHitCut) {
236  RelationVector<Track> track = m_RecoTracks[0]->getRelationsWith<Track>();
237  if (track.size() != 0) {
238  RelationVector<ECLShower> eclShower = track[0]->getRelationsTo<ECLShower>();
239  if (eclShower.size() != 0 || m_RecoTracks[0]->hasEKLMHits() || m_RecoTracks[0]->hasBKLMHits()) {
240 
241  int numberOfCDCHits = m_RecoTracks[0]->getNumberOfCDCHits();
242  float totalADCCount = 0;
243  if (m_RecoTracks[0]->hasCDCHits()) {
244  int CDCHits = m_RecoTracks[0]->getNumberOfCDCHits();
245  for (int i = 0; i < CDCHits; i++) {
246  totalADCCount = totalADCCount + m_RecoTracks[0]->getSortedCDCHitList()[i]->getADCCount();
247  }
248  }
249  if (totalADCCount / numberOfCDCHits < 115) {
250  // y = exp((-p0+x)/p1) + p2 ; where x ~ ADCCounts/NumberOfCDCHits, y ~ momentum
251  m_magnitudeOfMomentumWithoutMagneticField = exp((-fittedValuesOfFunctions[0] + totalADCCount / numberOfCDCHits) /
252  fittedValuesOfFunctions[1]);
253  } else {
254  m_magnitudeOfMomentumWithoutMagneticField = fittedValuesOfFunctions[2];
255  }
256  RecoTrack* mergedRecoTrack;
257  if (m_usingMagneticField == true) {
258  mergedRecoTrack = m_MergedRecoTracks.appendNew(m_RecoTracks[0]->getPositionSeed(),
259  m_RecoTracks[0]->getMomentumSeed(), m_RecoTracks[0]->getChargeSeed());
260  } else {
261  B2Vector3D momentum = m_RecoTracks[0]->getMomentumSeed();
262  float magnitudeMomentum = momentum.Mag();
263  float newMomentumX = (momentum.Px() * m_magnitudeOfMomentumWithoutMagneticField) / magnitudeMomentum;
264  float newMomentumY = (momentum.Py() * m_magnitudeOfMomentumWithoutMagneticField) / magnitudeMomentum;
265  float newMomentumZ = (momentum.Pz() * m_magnitudeOfMomentumWithoutMagneticField) / magnitudeMomentum;
266  B2Vector3D newMomentum(newMomentumX, newMomentumY, newMomentumZ);
267  mergedRecoTrack = m_MergedRecoTracks.appendNew(m_RecoTracks[0]->getPositionSeed(),
268  newMomentum, m_RecoTracks[0]->getChargeSeed());
269  }
270  mergedRecoTrack->setTimeSeed(m_RecoTracks[0]->getTimeSeed());
271 
272  int sortingNumber = 0;
273  if (m_RecoTracks[0]->hasPXDHits()) {
274  int PXDHits = m_RecoTracks[0]->getNumberOfPXDHits();
275  for (int i = 0; i < PXDHits; i++) {
276  if (m_RecoTracks[0]->getSortedPXDHitList()[i]->getSize() > 1) {mergedRecoTrack->addPXDHit(m_RecoTracks[0]->getSortedPXDHitList()[i], sortingNumber);}
277  // B2INFO("Cluster size of included PXD hit: " << m_RecoTracks[0]->getSortedPXDHitList()[i]->getSize());
278  sortingNumber++;
279  }
280  }
281  if (m_RecoTracks[0]->hasSVDHits()) {
282  int SVDHits = m_RecoTracks[0]->getNumberOfSVDHits();
283  for (int i = 0; i < SVDHits; i++) {
284  mergedRecoTrack->addSVDHit(m_RecoTracks[0]->getSortedSVDHitList()[i], sortingNumber);
285  sortingNumber++;
286  }
287  }
288  if (m_RecoTracks[0]->hasCDCHits()) {
289  int CDCHits = m_RecoTracks[0]->getNumberOfCDCHits();
290  for (int i = 0; i < CDCHits; i++) {
291  mergedRecoTrack->addCDCHit(m_RecoTracks[0]->getSortedCDCHitList()[i], sortingNumber);
292  sortingNumber++;
293  }
294  }
295  if (m_RecoTracks[0]->hasBKLMHits()) {
296  int BKLMHits = m_RecoTracks[0]->getNumberOfBKLMHits();
297  for (int i = 0; i < BKLMHits; i++) {
298  mergedRecoTrack->addBKLMHit(m_RecoTracks[0]->getSortedBKLMHitList()[i], sortingNumber);
299  sortingNumber++;
300  }
301  }
302  if (m_RecoTracks[0]->hasEKLMHits()) {
303  int EKLMHits = m_RecoTracks[0]->getNumberOfEKLMHits();
304  for (int i = 0; i < EKLMHits; i++) {
305  mergedRecoTrack->addEKLMHit(m_RecoTracks[0]->getSortedEKLMHitList()[i], sortingNumber);
306  }
307  }
308  // mergedTracks = true;
309  }
310  }
311  }
312  }
313  }
314 
315  else if (m_RecoTracks.getEntries() == 2) {
316  if (m_RecoTracks[0]->getNumberOfCDCHits() + m_RecoTracks[1]->getNumberOfCDCHits() > m_minimumNumHitCut) {
317  RelationVector<Track> trackFirst = m_RecoTracks[0]->getRelationsWith<Track>();
318  RelationVector<Track> trackSecond = m_RecoTracks[1]->getRelationsWith<Track>();
319  if (trackFirst.size() != 0 && trackSecond.size() != 0) {
320  RelationVector<ECLShower> eclShowerFirst = trackFirst[0]->getRelationsTo<ECLShower>();
321  RelationVector<ECLShower> eclShowerSecond = trackSecond[0]->getRelationsTo<ECLShower>();
322  if ((eclShowerFirst.size() != 0 && eclShowerSecond.size() != 0) || ((m_RecoTracks[0]->hasEKLMHits()
323  || m_RecoTracks[0]->hasBKLMHits()) && (m_RecoTracks[1]->hasEKLMHits() || m_RecoTracks[1]->hasBKLMHits()))) {
324  if (m_ECLConnectedRegions.getEntries() >= 2 || m_KLMClusters.getEntries() >= 2) {
326  // mergedTracks = true;
327  }
328  } else if (eclShowerFirst.size() != 0 || eclShowerSecond.size() != 0 || m_RecoTracks[0]->hasEKLMHits()
329  || m_RecoTracks[0]->hasBKLMHits() || m_RecoTracks[1]->hasEKLMHits() || m_RecoTracks[1]->hasBKLMHits()) {
330  if (m_ECLConnectedRegions.getEntries() == 2 || m_ECLConnectedRegions.getEntries() == 1
331  || m_KLMClusters.getEntries() == 2 || m_KLMClusters.getEntries() == 1) {
333  // mergedTracks = true;
334  }
335  }
336  }
337  }
338  }
339 
340  else {
341  for (int i = 0; i < m_RecoTracks.getEntries(); i++) {
342  RelationVector<Track> trackFirst = m_RecoTracks[i]->getRelationsWith<Track>();
343  if (trackFirst.size() != 0) {
344  for (int j = i + 1; j < m_RecoTracks.getEntries(); j++) {
345  RelationVector<Track> trackSecond = m_RecoTracks[j]->getRelationsWith<Track>();
346  if (trackSecond.size() != 0) {
347  if (m_RecoTracks[i]->getNumberOfCDCHits() + m_RecoTracks[j]->getNumberOfCDCHits() > m_minimumNumHitCut) {
348  RelationVector<ECLShower> eclShowerFirst = trackFirst[0]->getRelationsTo<ECLShower>();
349  RelationVector<ECLShower> eclShowerSecond = trackSecond[0]->getRelationsTo<ECLShower>();
350  if (eclShowerFirst.size() != 0 && eclShowerSecond.size() != 0) {
351  if (eclShowerFirst[0]->getRelationsWith<Track>().size() == 1 && eclShowerSecond[0]->getRelationsWith<Track>().size() == 1) {
353  // mergedTracks = true;
354  }
355  } else if ((m_RecoTracks[i]->hasEKLMHits() || m_RecoTracks[i]->hasBKLMHits())
356  && (m_RecoTracks[j]->hasEKLMHits() || m_RecoTracks[j]->hasBKLMHits())) {
357  if (m_RecoTracks[i]->getNumberOfBKLMHits() + m_RecoTracks[i]->getNumberOfEKLMHits() > 3
358  && m_RecoTracks[j]->getNumberOfBKLMHits() + m_RecoTracks[j]->getNumberOfEKLMHits() > 3) {
360  // mergedTracks = true;
361  }
362  }
363  }
364  }
365  }
366  }
367  }
368  }
369 }
static CDCGeometryPar & Instance(const CDCGeometry *=nullptr)
Static method to get a reference to the CDCGeometryPar instance.
Class to store ECL Showers.
Definition: ECLShower.h:30
void MergingTracks(RecoTrack *, RecoTrack *, StoreArray< RecoTrack > &)
Merge cosmic tracks.
void initialize() override
Register the store arrays and store obj pointers.
unsigned int m_minimumNumHitCut
Number of CDC hit per track required for cosmic track.
void event() override
Do the selection.
StoreArray< ECLConnectedRegion > m_ECLConnectedRegions
ECL connected regions.
double m_magnitudeOfMomentumWithoutMagneticField
Magnitude of cosmic tracks if magnetic field is not used.
std::string m_param_recoTracksStoreArrayName
StoreArray name from which to read the reco tracks.
bool m_usingMagneticField
Flag to using magnetic field during reconstruction.
StoreArray< KLMCluster > m_KLMClusters
KLM clusters.
std::string m_param_mergedRecoTracksStoreArrayName
StoreArray name where the merged reco track is written.
unsigned int m_minimumClusterSize
Minimal PXD cluster size for used PXD hits in cosmic track.
StoreArray< RecoTrack > m_RecoTracks
RecoTracks.
MergerCosmicTracksModule()
Create a new instance of the module.
StoreArray< RecoTrack > m_MergedRecoTracks
Merged RecoTracks.
Base class for Modules.
Definition: Module.h:72
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:79
bool addBKLMHit(const UsedBKLMHit *bklmHit, const unsigned int sortingParameter, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds a bklm hit with the given information to the reco track.
Definition: RecoTrack.h:286
bool addCDCHit(const UsedCDCHit *cdcHit, const unsigned int sortingParameter, RightLeftInformation rightLeftInformation=RightLeftInformation::c_undefinedRightLeftInformation, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds a cdc hit with the given information to the reco track.
Definition: RecoTrack.h:243
bool hasCDCHits() const
Returns true if the track has cdc hits.
Definition: RecoTrack.h:401
unsigned int getNumberOfBKLMHits() const
Return the number of bklm hits.
Definition: RecoTrack.h:430
bool addEKLMHit(const UsedEKLMHit *eklmHit, const unsigned int sortingParameter, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds an eklm hit with the given information to the reco track.
Definition: RecoTrack.h:300
std::vector< Belle2::RecoTrack::UsedPXDHit * > getSortedPXDHitList() const
Return a sorted list of pxd hits. Sorted by the sortingParameter.
Definition: RecoTrack.h:464
bool addPXDHit(const UsedPXDHit *pxdHit, const unsigned int sortingParameter, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds a pxd hit with the given information to the reco track.
Definition: RecoTrack.h:258
ROOT::Math::XYZVector getPositionSeed() const
Return the position seed stored in the reco track. ATTENTION: This is not the fitted position.
Definition: RecoTrack.h:480
unsigned int getNumberOfEKLMHits() const
Return the number of eklm hits.
Definition: RecoTrack.h:433
unsigned int getNumberOfSVDHits() const
Return the number of svd hits.
Definition: RecoTrack.h:424
unsigned int getNumberOfCDCHits() const
Return the number of cdc hits.
Definition: RecoTrack.h:427
bool hasPXDHits() const
Returns true if the track has pxd hits.
Definition: RecoTrack.h:395
void setTimeSeed(const double timeSeed)
Set the time seed. ATTENTION: This is not the fitted time.
Definition: RecoTrack.h:604
bool hasEKLMHits() const
Returns true if the track has eklm hits.
Definition: RecoTrack.h:407
static void registerRequiredRelations(StoreArray< RecoTrack > &recoTracks, std::string const &pxdHitsStoreArrayName="", std::string const &svdHitsStoreArrayName="", std::string const &cdcHitsStoreArrayName="", std::string const &bklmHitsStoreArrayName="", std::string const &eklmHitsStoreArrayName="", std::string const &recoHitInformationStoreArrayName="")
Convenience method which registers all relations required to fully use a RecoTrack.
Definition: RecoTrack.cc:53
std::vector< Belle2::RecoTrack::UsedBKLMHit * > getSortedBKLMHitList() const
Return a sorted list of bklm hits. Sorted by the sortingParameter.
Definition: RecoTrack.h:473
std::vector< Belle2::RecoTrack::UsedEKLMHit * > getSortedEKLMHitList() const
Return a sorted list of eklm hits. Sorted by the sortingParameter.
Definition: RecoTrack.h:476
std::vector< Belle2::RecoTrack::UsedSVDHit * > getSortedSVDHitList() const
Return a sorted list of svd hits. Sorted by the sortingParameter.
Definition: RecoTrack.h:467
bool hasBKLMHits() const
Returns true if the track has bklm hits.
Definition: RecoTrack.h:404
short int getChargeSeed() const
Return the charge seed stored in the reco track. ATTENTION: This is not the fitted charge.
Definition: RecoTrack.h:508
ROOT::Math::XYZVector getMomentumSeed() const
Return the momentum seed stored in the reco track. ATTENTION: This is not the fitted momentum.
Definition: RecoTrack.h:487
unsigned int getNumberOfPXDHits() const
Return the number of pxd hits.
Definition: RecoTrack.h:421
std::vector< Belle2::RecoTrack::UsedCDCHit * > getSortedCDCHitList() const
Return a sorted list of cdc hits. Sorted by the sortingParameter.
Definition: RecoTrack.h:470
bool addSVDHit(const UsedSVDHit *svdHit, const unsigned int sortingParameter, OriginTrackFinder foundByTrackFinder=OriginTrackFinder::c_undefinedTrackFinder)
Adds a svd hit with the given information to the reco track.
Definition: RecoTrack.h:272
double getTimeSeed() const
Return the time seed stored in the reco track. ATTENTION: This is not the fitted time.
Definition: RecoTrack.h:511
bool hasSVDHits() const
Returns true if the track has svd hits.
Definition: RecoTrack.h:398
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
T * appendNew()
Construct a new T object at the end of the array.
Definition: StoreArray.h:246
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
Class that bundles various TrackFitResults.
Definition: Track.h:25
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:214
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
Abstract base class for different kinds of events.