Belle II Software  release-06-02-00
RT2SPTCConverterModuleDev.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 <tracking/modules/spacePointCreator/RT2SPTCConverterModuleDev.h>
10 #include <tracking/spacePointCreation/SpacePointTrackCand.h>
11 
12 #include <framework/dataobjects/EventMetaData.h>
13 #include <framework/datastore/StoreObjPtr.h>
14 
15 #include <algorithm> // find
16 
17 #include <svd/dataobjects/SVDCluster.h>
18 #include <mdst/dataobjects/MCParticle.h>
19 #include <svd/dataobjects/SVDTrueHit.h>
20 #include <pxd/dataobjects/PXDTrueHit.h>
21 
22 using namespace Belle2;
23 using ConversionState = std::bitset<2>;
24 
25 REG_MODULE(RT2SPTCConverter)
26 
28  Module(),
29  m_trackSel(nullptr)
30 
31 {
32  setDescription("Module for converting RecoTracks (e.g. from TrackFinderMCTruth) to SpacePointTrackCands.");
33  setPropertyFlags(c_ParallelProcessingCertified);
34 
35  // input
36  addParam("RecoTracksName", m_RecoTracksName, "Name of container of RecoTracks", std::string(""));
37 
38  // required for conversion
39  addParam("SVDClusters", m_SVDClusterName, "SVDCluster collection name", std::string(""));
40 
41  addParam("SVDSpacePointStoreArrayName", m_svdSpacePointsStoreArrayName, "Name of the collection for SVD.",
42  boost::make_optional<std::string>("SVDSpacePoints"));
43  addParam("PXDSpacePointStoreArrayName", m_pxdSpacePointsStoreArrayName, "Name of the collection for PXD.",
44  boost::make_optional<std::string>("PXDSpacePoints"));
45 
46  // optional input
47  addParam("SVDSingleClusterSP", m_SVDSingleClusterSPName, "SVD single Cluster SpacePoints collection name.", std::string(""));
48 
49  // output
50  addParam("SpacePointTCName", m_SPTCName,
51  "Name of the container under which SpacePointTrackCands will be stored in the DataStore (NOTE: These SpaceTrackCands are not checked for curling behaviour, but are simply converted and stored!)",
52  std::string(""));
53 
54  // parameters
55  addParam("minSP", m_minSP,
56  "Minimum number of SpacePoints a SpacePointTrackCand has to contain in order to get registered in the DataStore. If set to 0, any number is accepted",
57  0);
58 
59  addParam("useTrueHits", m_useTrueHits, "Converts clusters via their relations to TrueHits.", false);
60 
61  addParam("skipProblematicCluster", m_skipProblematicCluster,
62  "If set to true clusters that could not be converted are skipped instead of throwing away the complete SPTC",
63  false);
64 
65  addParam("useSingleClusterSP", m_useSingleClusterSP, "Set to true if these SpacePoints should be used as fallback.", false);
66 
67  addParam("markRecoTracks", m_markRecoTracks, "If True RecoTracks where conversion problems occurred are marked dirty.", false);
68 
69  addParam("noKickCutsFile", m_noKickCutsFile,
70  "TFile that contains the list of cuts to select trainins sample. If parameter left empty NoKickCuts are not applied",
71  std::string(""));
72 
73  addParam("noKickOutput", m_noKickOutput,
74  "If true produce a TFile with some histograms useful to understand behaviour of training sample selection", false);
75 
76  addParam("ignorePXDHits", m_ignorePXDHits, "If true no PXD hits will be used when creating the SpacePointTrackCand", bool(false));
77 
78  addParam("convertFittedOnly", m_convertFittedOnly, "If true only RecoTracks with successful fit will be converted to "
79  "SpacePointTrackCands", m_convertFittedOnly);
80 
81  initializeCounters();
82 }
83 
86 {
87  if (m_trackSel) delete m_trackSel;
88 }
89 
90 // ------------------------------ INITIALIZE ---------------------------------------
92 {
93  B2INFO("RT2SPTCConverter -------------- initialize() ---------------------");
94  // initialize Counters
96 
97  // check if all required StoreArrays are here
98  StoreArray<SVDCluster> SVDClusters; SVDClusters.isRequired(m_SVDClusterName);
100  StoreArray<SpacePoint> spacePoints;
102  }
104  StoreArray<SpacePoint> spacePoints;
106  }
107 
108 
110  recoTracks.isRequired(m_RecoTracksName);
111 
112  // registering StoreArray for SpacePointTrackCand
115 
116  StoreArray<MCParticle> mcparticles;
117  if (mcparticles.isOptional()) {
118  m_mcParticlesPresent = true;
119  }
120 
121  if (m_useTrueHits) {
123  }
124 
125  // register Relation to RecoTrack
126  spTrackCand.registerRelationTo(recoTracks);
127 
129 
130 }
131 
132 // ------------------------------------- EVENT -------------------------------------------------------
134 {
135  StoreObjPtr<EventMetaData> eventMetaDataPtr("EventMetaData", DataStore::c_Event);
136  const int eventCounter = eventMetaDataPtr->getEvent();
137  B2DEBUG(20, "RT2SPTCConverter::event(). Processing event " << eventCounter << " --------");
138 
140  StoreArray<SpacePointTrackCand> spacePointTrackCands(m_SPTCName); // output StoreArray
141 
143 
144  for (auto& recoTrack : m_recoTracks) {
145 
146  // if corresponding flag is set only use fitted tracks
147  if (m_convertFittedOnly and not recoTrack.wasFitSuccessful()) continue;
148 
149  if (m_noKickCutsFile.size() != 0) {
150  bool passCut = m_trackSel->trackSelector(recoTrack);
151  if (!passCut) {
152  m_ncut++;
153  continue; //exclude tracks with catastrophic multiple scattering interactions
154  } else {
155  m_npass++;
156  }
157  }
158  std::pair<std::vector<const SpacePoint*>, ConversionState> spacePointStatePair;
159 
160  // the hit informations from the recotrack, the option "true" will result in a sorted vector
161  std::vector<RecoHitInformation*> hitInfos = recoTrack.getRecoHitInformations(true);
162 
163  // if requested remove the PXD hits
164  // NOTE: in RecoTracks there is also a function to get sorted SVD hits only but this uses not the same code as getRecoHitInformations!
165  if (m_ignorePXDHits) {
166  std::vector<RecoHitInformation*> hitInfos_buff;
167  for (std::vector<RecoHitInformation*>::iterator it = hitInfos.begin(); it < hitInfos.end(); ++it) {
168  if ((*it)->getTrackingDetector() != RecoHitInformation::c_PXD) hitInfos_buff.push_back(*it);
169  }
170  hitInfos = hitInfos_buff;
171  }
172 
173  B2DEBUG(20, "New call getSpacePointsFromRecoHitInformationViaTrueHits. Number of hitInfos: " << hitInfos.size());
174  B2DEBUG(20, "number of SVD hits in RecoTrack : " << recoTrack.getNumberOfSVDHits());
175  B2DEBUG(20, "number of PXD hits in RecoTrack : " << recoTrack.getNumberOfPXDHits());
176  B2DEBUG(20, "number of CDC hits in RecoTrack : " << recoTrack.getNumberOfCDCHits());
177 
178  if (m_useTrueHits) {
179  spacePointStatePair = getSpacePointsFromRecoHitInformationViaTrueHits(hitInfos);
180  } else {
181  spacePointStatePair = getSpacePointsFromRecoHitInformations(hitInfos);
182  }
183  B2DEBUG(20, "RT2SPTCConverter::event: Number of SpacePoints: " << spacePointStatePair.first.size() << "State: " <<
184  spacePointStatePair.second);
185 
186  if (int(spacePointStatePair.first.size()) < m_minSP) {
187  B2DEBUG(20, "RT2SPTCConverter::event: Not enough number of SpacePoints: " << spacePointStatePair.first.size() <<
188  " Required Number: "
189  << m_minSP);
190  m_minSPCtr++;
191  continue;
192  }
193 
194  if (spacePointStatePair.second.test(c_undefinedError)) {
197  continue;
198  }
199  if (m_markRecoTracks) recoTrack.setDirtyFlag();
200  }
201 
202  SpacePointTrackCand spacePointTC;
203  if (m_mcParticlesPresent) {
204  MCParticle* mcParticle = recoTrack.getRelatedTo<MCParticle>();
205  spacePointTC = SpacePointTrackCand(spacePointStatePair.first, mcParticle->getPDG(), mcParticle->getCharge(),
206  recoTrack.getArrayIndex());
207  } else {
208  spacePointTC = SpacePointTrackCand(spacePointStatePair.first, 0, 0, recoTrack.getArrayIndex());
209  }
210 
212 
213  if (spacePointStatePair.second.test(c_singleCluster)) {
216  if (m_markRecoTracks) recoTrack.setDirtyFlag();
217  }
218 
219  // convert momentum and position seed into a single 6D seed
220  TVector3 momentumSeed = recoTrack.getMomentumSeed();
221  TVector3 positionSeed = recoTrack.getPositionSeed();
222 
223  TVectorD seed6D(6);
224  seed6D[0] = positionSeed.x();
225  seed6D[1] = positionSeed.y();
226  seed6D[2] = positionSeed.z();
227  seed6D[3] = momentumSeed.Px();
228  seed6D[4] = momentumSeed.Py();
229  seed6D[5] = momentumSeed.Pz();
230  spacePointTC.set6DSeed(seed6D);
231  spacePointTC.setCovSeed(recoTrack.getSeedCovariance());
232 
233  if (spacePointStatePair.second == ConversionState(0)) {
234  m_noFailCtr++;
235  if (m_markRecoTracks) recoTrack.setDirtyFlag(false);
236  }
237 
238  spacePointTrackCands.appendNew(spacePointTC)->addRelationTo(&recoTrack);
239  } // end RecoTrack loop
240 }
241 
242 std::pair<std::vector<const SpacePoint*>, ConversionState>
244 {
245  std::vector<const SpacePoint*> finalSpacePoints;
246  ConversionState state;
247 
248 
249  // loop over all cluster to determine the SpacePoints that define the given RecoTrack.
250  for (const RecoHitInformation* hitInfo : hitInfos) {
251 
252  // ignore all hits that are not SVD or PXD
253  if (hitInfo->getTrackingDetector() != RecoHitInformation::c_SVD && hitInfo->getTrackingDetector() != RecoHitInformation::c_PXD)
254  continue;
255 
256 
257  const VXDTrueHit* relatedTrueHit = nullptr;
258  RelationsObject* cluster = nullptr;
259 
260  // SVD case
261  if (hitInfo->getTrackingDetector() == RecoHitInformation::c_SVD) {
262  cluster = hitInfo->getRelatedTo<SVDCluster>();
263  if (cluster) {
264  relatedTrueHit = cluster->getRelatedTo<SVDTrueHit>();
265  B2DEBUG(20, "RT2SPTCConverter::getSpacePointsFromClustersViaTrueHits: Number of related SVDTrueHits: " <<
266  cluster->getRelationsTo<SVDTrueHit>().size());
267  }
268  }
269 
270  // PXD case
271  if (hitInfo->getTrackingDetector() == RecoHitInformation::c_PXD) {
272  cluster = hitInfo->getRelatedTo<PXDCluster>();
273  if (cluster) {
274  relatedTrueHit = cluster->getRelatedTo<PXDTrueHit>();
275  B2DEBUG(20, "RT2SPTCConverter::getSpacePointsFromClustersViaTrueHits: Number of related PXDTrueHits: "
276  << cluster->getRelationsTo<PXDTrueHit>().size());
277  }
278  }
279 
280  if (!relatedTrueHit) {
281  state.set(c_undefinedError);
282  B2DEBUG(20, "RT2SPTCConverter::getSpacePointsFromClustersViaTrueHits: TrueHit missing.");
283  if (m_skipProblematicCluster) continue;
284  else break;
285  }
286 
287  // NOTE: double cluster SVD SP and PXD SP should be stored in the same StoreArray!
288  const SpacePoint* relatedSpacePoint = [this, hitInfo, relatedTrueHit]() -> const SpacePoint* {
289  if (m_svdSpacePointsStoreArrayName and hitInfo->getTrackingDetector() == RecoHitInformation::c_SVD) {
290  return relatedTrueHit->getRelatedFrom<SpacePoint>(*m_svdSpacePointsStoreArrayName);
291  }
292  if (m_pxdSpacePointsStoreArrayName and hitInfo->getTrackingDetector() == RecoHitInformation::c_PXD) {
293  return relatedTrueHit->getRelatedFrom<SpacePoint>(*m_pxdSpacePointsStoreArrayName);
294  }
295  return nullptr;
296  }();
297 
298  // special case for the SVD cluster as there is the option for single cluster SP
299  if (hitInfo->getTrackingDetector() == RecoHitInformation::c_SVD) {
300  if (!relatedSpacePoint && m_useSingleClusterSP) {
301  relatedSpacePoint = cluster->getRelatedFrom<SpacePoint>(m_SVDSingleClusterSPName);
302  if (!relatedSpacePoint->getRelatedTo<SVDTrueHit>()) relatedSpacePoint = nullptr;
303  }
304  } // end SVD
305 
306  if (!relatedSpacePoint) {
307  state.set(c_undefinedError);
308  B2DEBUG(20, "RT2SPTCConverter::getSpacePointsFromClustersViaTrueHits: SpacePoint missing.");
309  if (m_skipProblematicCluster) continue;
310  else break;
311  }
312 
313 
314  // Prevent adding the same SpacePoint twice as there are 2 clusters per SP for SVD
315  if (std::find(finalSpacePoints.begin(), finalSpacePoints.end(), relatedSpacePoint) == finalSpacePoints.end()) {
316  finalSpacePoints.push_back(relatedSpacePoint);
317  }
318  }
319  B2DEBUG(20, "RT2SPTCConverter::getSpacePointsFromClustersViaTrueHits: Number of SpacePoints: " << finalSpacePoints.size());
320  return std::make_pair(finalSpacePoints, state);
321 }
322 
323 
324 std::pair<std::vector<const SpacePoint*>, ConversionState>
325 RT2SPTCConverterModule::getSpacePointsFromRecoHitInformations(std::vector<RecoHitInformation*> hitInfos)
326 {
327  std::vector<const SpacePoint*> finalSpacePoints;
328  ConversionState state;
329 
330  // loop over all cluster to determine the SpacePoints that define the given RecoTrack.
331  for (size_t iHit = 0; iHit < hitInfos.size(); ++iHit) {
332 
333  // ignore all hits that are not SVD or PXD
334  if (hitInfos[iHit]->getTrackingDetector() != RecoHitInformation::c_SVD &&
335  hitInfos[iHit]->getTrackingDetector() != RecoHitInformation::c_PXD) continue;
336 
337 
338  std::vector<const SpacePoint*> spacePointCandidates;
341  // simple case PXD : there is a one to one relation between cluster and SpacePoint
342  if (hitInfos[iHit]->getTrackingDetector() == RecoHitInformation::c_PXD) {
343  PXDCluster* pxdCluster = hitInfos.at(iHit)->getRelated<PXDCluster>();
344  SpacePoint* relatedPXDSP = nullptr;
345  if (pxdCluster) relatedPXDSP = pxdCluster->getRelated<SpacePoint>(*m_pxdSpacePointsStoreArrayName);
346  // if found a spacepoint one is already done!
347  if (relatedPXDSP) {
348  finalSpacePoints.push_back(relatedPXDSP);
349  continue;
350  }
351  } // end PXD case
352  }
353 
354  // At this point it has to be a SVD cluster, for SVD one has to combine u and v clusters
355  SVDCluster* clusterA = hitInfos.at(iHit)->getRelated<SVDCluster>();
356 
357  // if it is not PXD it has to be a SVD hit so the cluster has to exist!!
358  if (!clusterA) {
359  B2WARNING("SVDCluster to hit not found! This should not happen!");
360  state.set(c_undefinedError);
361  if (m_skipProblematicCluster) continue;
362  else break;
363  }
364 
366  RelationVector<SpacePoint> relatedSpacePointsA = clusterA->getRelationsFrom<SpacePoint>(
368 
369  SVDCluster* clusterB = nullptr;
370  if (iHit + 1 < hitInfos.size()) clusterB = hitInfos.at(iHit + 1)->getRelated<SVDCluster>();
371 
372  B2DEBUG(20, "RT2SPTCConverter::getSpacePointsFromClusters: Number of SpacePoints related to first cluster: " <<
373  relatedSpacePointsA.size());
374 
375  // Try to verify SpacePoint by using next cluster to build a U/V pair.
376  if (clusterA && clusterB && (clusterA->isUCluster() != clusterB->isUCluster())) {
377  auto relatedSpacePointsB = clusterB->getRelationsFrom<SpacePoint>(*m_svdSpacePointsStoreArrayName);
378 
379  // determine intersecting SpacePoints.
380  for (const auto& spacePoint : relatedSpacePointsA) {
381  for (const auto& spacePointCompare : relatedSpacePointsB) {
382  if (spacePoint == spacePointCompare) {
383  spacePointCandidates.push_back(&spacePoint);
384  break;
385  }
386  }
387  }
388  B2DEBUG(20, "RT2SPTCConverter::getSpacePointsFromClusters: Number of intersections with next cluster: " <<
389  spacePointCandidates.size());
390  // Intersection should resolve to the single SpacePoint that was used to create the recoTrack.
391  if (spacePointCandidates.size() == 1) ++iHit;
392  } // end first case
393  }
394 
395  // Look up if it is part of single cluster SP collection. If no dedicated collection is given the default collection will be tried again!
396  // cppcheck-suppress knownConditionTrueFalse
397  if (clusterA && spacePointCandidates.size() != 1 && m_useSingleClusterSP) {
398 
399  // look if it as single cluster!
400  auto relatedSpacePoints = clusterA->getRelationsFrom<SpacePoint>(m_SVDSingleClusterSPName);
401  if (relatedSpacePoints.size() == 1) {
402  state.set(c_singleCluster);
403  spacePointCandidates.push_back(relatedSpacePoints[0]);
404  }
405  } // second case
406 
407  B2DEBUG(20, "RT2SPTCConverter::getSpacePointsFromClusters: Conversion state is: " << state);
408 
409  if (spacePointCandidates.size() != 1) {
410  state.set(c_undefinedError);
411  if (m_skipProblematicCluster) continue;
412  else break;
413  }
414  finalSpacePoints.push_back(spacePointCandidates.at(0));
415  } // end loop hits
416 
417  return std::make_pair(finalSpacePoints, state);
418 }
419 
421 {
422  B2RESULT("Number of Selected Tracks (NoKickRTSel): " << m_npass);
423  B2RESULT("Number of Rejected Tracks (NoKickRTSel): " << m_ncut);
424 
426 }
427 
428 // -------------------------------- TERMINATE --------------------------------------------------------
430 {
431  B2RESULT("RT2SPTCConverter::terminate: Converted " << m_noFailCtr << "Reco Tracks without errors and "
432  << m_singleClusterUseCtr << " Tracks were converted with a single Cluster SpacePoint. "
433  << m_missingTrueHitCtr << " Tracks were skipped because they contained SpacePoints that had no relations to TrueHits, "
434  << m_minSPCtr << " Tracks were skipped because they didn't contain enough SpacePoints and for "
435  << m_undefinedErrorCtr << " Tracks occurred an undefined error.");
436 }
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
Definition: DataStore.h:72
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
Definition: DataStore.h:59
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:32
float getCharge() const
Return the particle charge defined in TDatabasePDG.
Definition: MCParticle.cc:34
int getPDG() const
Return PDG code of particle.
Definition: MCParticle.h:112
Base class for Modules.
Definition: Module.h:72
This class implement some methods useful for the application of cuts evaluated in NoKickCutsEval modu...
Definition: NoKickRTSel.h:33
bool trackSelector(const RecoTrack &track)
This method return true if every segment (see segmentSelector) of the input track respects the cuts c...
Definition: NoKickRTSel.cc:194
void produceHistoNoKick()
This method produce the validation histograms (to be used the endrun combined with the filling in tra...
Definition: NoKickRTSel.cc:277
The PXD Cluster class This class stores all information about reconstructed PXD clusters The position...
Definition: PXDCluster.h:30
Class PXDTrueHit - Records of tracks that either enter or leave the sensitive volume.
Definition: PXDTrueHit.h:31
Module for converting RecoTracks to SpacePointTrackCands.
unsigned int m_singleClusterUseCtr
Counts how many tracks contained a single cluster.
bool m_ignorePXDHits
PXD hits will be ignored when creating the SP track candidate.
boost::optional< std::string > m_pxdSpacePointsStoreArrayName
PXD SpacePoints collection names.
boost::optional< std::string > m_svdSpacePointsStoreArrayName
Non SingleCluster SVD SpacePoints collection names.
bool m_noKickOutput
true=produce TFile with effects of NoKickCuts on tracks
unsigned int m_minSPCtr
Counts how many tracks didn't contain enough SpacePoints after conversion.
void initialize() override
Initialize module (e.g. check if all required StoreArrays are present or registering new StoreArrays)
int m_npass
counter of the selected tracks
void event() override
Event: convert RecoTracks to SpacePointTrackCands.
int m_minSP
parameter for specifying a minimal number of SpacePoints a SpacePointTrackCand has to have in order t...
void endRun() override
End Run function.
bool m_mcParticlesPresent
If MCParticles are available.
void terminate() override
Terminate: print some summary information on the processed events.
bool m_skipProblematicCluster
If true problematic clusters are ignored.
std::string m_SVDSingleClusterSPName
Single Cluster SVD SpacePoints collection name.
bool m_useTrueHits
If true the method getSpacePointsFromSVDClustersViaTrueHits is utilized.
std::pair< std::vector< const SpacePoint * >, ConversionState > getSpacePointsFromRecoHitInformations(std::vector< RecoHitInformation * > hitInfos)
Convert Clusters to SpacePoints using the Relation: Cluster->SpacePoint.
std::string m_noKickCutsFile
name of TFile of the cuts
std::string m_SPTCName
Name of collection under which SpacePointTrackCands will be stored in the StoreArray.
std::string m_RecoTracksName
Name of collection of RecoTrack StoreArray.
unsigned int m_missingTrueHitCtr
Counts how many times a SpacePoint had no relation to a SVDTrueHit.
bool m_convertFittedOnly
if true only RecoTracks with successful fit will be converted
std::string m_SVDClusterName
SVDCluster collection name.
std::bitset< 2 > ConversionState
Used to store conversionFlags and pass them between methods.
NoKickRTSel * m_trackSel
data members used fot the NoKickCuts method
void initializeCounters()
reset counters to 0 to avoid indeterministic behaviour
unsigned int m_undefinedErrorCtr
Counts how many tracks failed to be converted.
bool m_useSingleClusterSP
If true use single cluster SpacePoint collection as fallback.
unsigned int m_noFailCtr
Counts how many tracks could be converted without any problems.
int m_ncut
counter of the cuttet tracks
bool m_markRecoTracks
If True RecoTracks where conversion problems occurred are marked dirty.
std::pair< std::vector< const SpacePoint * >, ConversionState > getSpacePointsFromRecoHitInformationViaTrueHits(std::vector< RecoHitInformation * > hitInfos)
Convert Clusters to SpacePoints using the Relation: Cluster->TrueHit->SpacePoint.
This class stores additional information to every CDC/SVD/PXD hit stored in a RecoTrack.
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
Defines interface for accessing relations of objects in StoreArray.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
RelationVector< FROM > getRelationsFrom(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from another store array to this object.
FROM * getRelatedFrom(const std::string &name="", const std::string &namedRelation="") const
Get the object from which this object has a relation.
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
TO * getRelatedTo(const std::string &name="", const std::string &namedRelation="") const
Get the object to which this object has a relation.
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
Definition: SVDCluster.h:28
bool isUCluster() const
Get the direction of strips.
Definition: SVDCluster.h:109
Class SVDTrueHit - Records of tracks that either enter or leave the sensitive volume.
Definition: SVDTrueHit.h:33
Storage for (VXD) SpacePoint-based track candidates.
void set6DSeed(const TVectorD &state6D)
set the 6D state seed
void setCovSeed(const TMatrixDSym &cov)
set the covariance matrix seed
@ c_checkedTrueHits
bit 5: All SpacePoints of the SPTC have a relation to at least one TrueHit.
@ c_singleClustersSPs
bit 10: SPTC contains single Cluster SpacePoints.
void addRefereeStatus(unsigned short int bitmask)
add a referee status
SpacePoint typically is build from 1 PXDCluster or 1-2 SVDClusters.
Definition: SpacePoint.h:42
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
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
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Definition: StoreArray.h:140
Type-safe access to single objects in the data store.
Definition: StoreObjPtr.h:95
Class VXDTrueHit - Records of tracks that either enter or leave the sensitive volume.
Definition: VXDTrueHit.h:36
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Abstract base class for different kinds of events.