Belle II Software  release-08-01-10
RecoTrack.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 #include <tracking/dataobjects/RecoTrack.h>
9 #include <mdst/dataobjects/MCParticle.h>
10 
11 #include <genfit/TrackCand.h>
12 #include <genfit/AbsTrackRep.h>
13 #include <genfit/KalmanFitterInfo.h>
14 #include <genfit/KalmanFitStatus.h>
15 #include <genfit/WireTrackCandHit.h>
16 #include <genfit/RKTrackRep.h>
17 #include <genfit/MplTrackRep.h>
18 #include <simulation/monopoles/MonopoleConstants.h>
19 #include <svd/dataobjects/SVDCluster.h>
20 
21 #include <cmath>
22 
23 using namespace Belle2;
24 
25 RecoTrack::RecoTrack(const ROOT::Math::XYZVector& seedPosition, const ROOT::Math::XYZVector& seedMomentum,
26  const short int seedCharge,
27  const std::string& storeArrayNameOfPXDHits,
28  const std::string& storeArrayNameOfSVDHits,
29  const std::string& storeArrayNameOfCDCHits,
30  const std::string& storeArrayNameOfBKLMHits,
31  const std::string& storeArrayNameOfEKLMHits,
32  const std::string& storeArrayNameOfRecoHitInformation) :
33  m_charge(seedCharge),
34  m_storeArrayNameOfPXDHits(storeArrayNameOfPXDHits),
35  m_storeArrayNameOfSVDHits(storeArrayNameOfSVDHits),
36  m_storeArrayNameOfCDCHits(storeArrayNameOfCDCHits),
37  m_storeArrayNameOfBKLMHits(storeArrayNameOfBKLMHits),
38  m_storeArrayNameOfEKLMHits(storeArrayNameOfEKLMHits),
39  m_storeArrayNameOfRecoHitInformation(storeArrayNameOfRecoHitInformation)
40 {
41  m_genfitTrack.setStateSeed(XYZToTVector(seedPosition), XYZToTVector(seedMomentum));
42  // TODO Set the covariance seed (that should be done by the tracking package)
43  TMatrixDSym covSeed(6);
44  covSeed(0, 0) = 1e-3;
45  covSeed(1, 1) = 1e-3;
46  covSeed(2, 2) = 4e-3;
47  covSeed(3, 3) = 0.01e-3;
48  covSeed(4, 4) = 0.01e-3;
49  covSeed(5, 5) = 0.04e-3;
50  m_genfitTrack.setCovSeed(covSeed);
51 }
52 
54  StoreArray<RecoTrack>& recoTracks,
55  std::string const& pxdHitsStoreArrayName,
56  std::string const& svdHitsStoreArrayName,
57  std::string const& cdcHitsStoreArrayName,
58  std::string const& bklmHitsStoreArrayName,
59  std::string const& eklmHitsStoreArrayName,
60  std::string const& recoHitInformationStoreArrayName)
61 {
62  StoreArray<RecoHitInformation> recoHitInformations(recoHitInformationStoreArrayName);
63  recoHitInformations.registerInDataStore();
64  recoTracks.registerRelationTo(recoHitInformations);
65 
66  StoreArray<RecoHitInformation::UsedPXDHit> pxdHits(pxdHitsStoreArrayName);
67  if (pxdHits.isOptional()) {
68  pxdHits.registerRelationTo(recoTracks);
69  recoHitInformations.registerRelationTo(pxdHits);
70  }
71 
72  StoreArray<RecoHitInformation::UsedSVDHit> svdHits(svdHitsStoreArrayName);
73  if (svdHits.isOptional()) {
74  svdHits.registerRelationTo(recoTracks);
75  recoHitInformations.registerRelationTo(svdHits);
76  }
77 
78  StoreArray<RecoHitInformation::UsedCDCHit> cdcHits(cdcHitsStoreArrayName);
79  if (cdcHits.isOptional()) {
80  cdcHits.registerRelationTo(recoTracks);
81  recoHitInformations.registerRelationTo(cdcHits);
82  }
83 
84  StoreArray<RecoHitInformation::UsedBKLMHit> bklmHits(bklmHitsStoreArrayName);
85  if (bklmHits.isOptional()) {
86  bklmHits.registerRelationTo(recoTracks);
87  recoHitInformations.registerRelationTo(bklmHits);
88  }
89 
90  StoreArray<RecoHitInformation::UsedEKLMHit> eklmHits(eklmHitsStoreArrayName);
91  if (eklmHits.isOptional()) {
92  eklmHits.registerRelationTo(recoTracks);
93  recoHitInformations.registerRelationTo(eklmHits);
94  }
95 }
96 
98  const std::string& storeArrayNameOfRecoTracks,
99  const std::string& storeArrayNameOfPXDHits,
100  const std::string& storeArrayNameOfSVDHits,
101  const std::string& storeArrayNameOfCDCHits,
102  const std::string& storeArrayNameOfBKLMHits,
103  const std::string& storeArrayNameOfEKLMHits,
104  const std::string& storeArrayNameOfRecoHitInformation,
105  const bool recreateSortingParameters
106  )
107 {
108 
109  StoreArray<RecoTrack> recoTracks(storeArrayNameOfRecoTracks);
110  StoreArray<RecoHitInformation> recoHitInformations(storeArrayNameOfRecoHitInformation);
111  StoreArray<UsedPXDHit> pxdHits(storeArrayNameOfPXDHits);
112  StoreArray<UsedSVDHit> svdHits(storeArrayNameOfSVDHits);
113  StoreArray<UsedCDCHit> cdcHits(storeArrayNameOfCDCHits);
114  StoreArray<UsedBKLMHit> bklmHits(storeArrayNameOfBKLMHits);
115  StoreArray<UsedEKLMHit> eklmHits(storeArrayNameOfEKLMHits);
116 
117  // Set the tracking parameters
118  const ROOT::Math::XYZVector& position = ROOT::Math::XYZVector(trackCand.getPosSeed());
119  const ROOT::Math::XYZVector& momentum = ROOT::Math::XYZVector(trackCand.getMomSeed());
120  const short int charge = trackCand.getChargeSeed();
121  const double time = trackCand.getTimeSeed();
122 
123  RecoTrack* newRecoTrack = recoTracks.appendNew(position, momentum, charge,
124  pxdHits.getName(), svdHits.getName(), cdcHits.getName(),
125  bklmHits.getName(), eklmHits.getName(),
126  recoHitInformations.getName());
127  newRecoTrack->setTimeSeed(time);
128 
129  // TODO Set the covariance seed (that should be done by the tracking package)
130  TMatrixDSym covSeed(6);
131  covSeed(0, 0) = 1e-3;
132  covSeed(1, 1) = 1e-3;
133  covSeed(2, 2) = 4e-3;
134  covSeed(3, 3) = 0.01e-3;
135  covSeed(4, 4) = 0.01e-3;
136  covSeed(5, 5) = 0.04e-3;
137  newRecoTrack->m_genfitTrack.setCovSeed(covSeed);
138 
139  for (unsigned int hitIndex = 0; hitIndex < trackCand.getNHits(); hitIndex++) {
140  genfit::TrackCandHit* trackCandHit = trackCand.getHit(hitIndex);
141  const int detID = trackCandHit->getDetId();
142  const int hitID = trackCandHit->getHitId();
143  const unsigned int sortingParameter = recreateSortingParameters ? hitIndex : static_cast<unsigned int>
144  (trackCandHit->getSortingParameter());
145  if (detID == Const::CDC) {
146  UsedCDCHit* cdcHit = cdcHits[hitID];
147  // Special case for CDC hits, we add a right-left information
148  const genfit::WireTrackCandHit* wireHit = dynamic_cast<const genfit::WireTrackCandHit*>(trackCandHit);
149  if (not wireHit) {
150  B2FATAL("CDC hit is not a wire hit. The RecoTrack can not handle such a case.");
151  }
152  if (wireHit->getLeftRightResolution() > 0) {
153  newRecoTrack->addCDCHit(cdcHit, sortingParameter, RecoHitInformation::RightLeftInformation::c_right);
154  } else if (wireHit->getLeftRightResolution() < 0) {
155  newRecoTrack->addCDCHit(cdcHit, sortingParameter, RecoHitInformation::RightLeftInformation::c_left);
156  } else {
157  newRecoTrack->addCDCHit(cdcHit, sortingParameter, RecoHitInformation::RightLeftInformation::c_undefinedRightLeftInformation);
158  }
159 
160  } else if (detID == Const::SVD) {
161  UsedSVDHit* svdHit = svdHits[hitID];
162  newRecoTrack->addSVDHit(svdHit, sortingParameter);
163  } else if (detID == Const::PXD) {
164  UsedPXDHit* pxdHit = pxdHits[hitID];
165  newRecoTrack->addPXDHit(pxdHit, sortingParameter);
166  } else if (detID == Const::BKLM) {
167  UsedBKLMHit* bklmHit = bklmHits[hitID];
168  newRecoTrack->addBKLMHit(bklmHit, sortingParameter);
169  } else if (detID == Const::EKLM) {
170  UsedEKLMHit* eklmHit = eklmHits[hitID];
171  newRecoTrack->addEKLMHit(eklmHit, sortingParameter);
172  }
173  }
174 
175  return newRecoTrack;
176 }
177 
179 {
180  genfit::TrackCand createdTrackCand;
181 
182  // Set the trajectory parameters
184  createdTrackCand.setCovSeed(getSeedCovariance());
185  createdTrackCand.setTimeSeed(getTimeSeed());
186 
187  // Add the hits
188  mapOnHits<UsedPXDHit>(m_storeArrayNameOfPXDHits, [&createdTrackCand](const RecoHitInformation & hitInformation,
189  const UsedPXDHit * const hit) {
190  createdTrackCand.addHit(Const::PXD, hit->getArrayIndex(), -1, hitInformation.getSortingParameter());
191  });
192  mapOnHits<UsedSVDHit>(m_storeArrayNameOfSVDHits, [&createdTrackCand](const RecoHitInformation & hitInformation,
193  const UsedSVDHit * const hit) {
194  createdTrackCand.addHit(Const::SVD, hit->getArrayIndex(), -1, hitInformation.getSortingParameter());
195  });
196  mapOnHits<UsedCDCHit>(m_storeArrayNameOfCDCHits, [&createdTrackCand](const RecoHitInformation & hitInformation,
197  const UsedCDCHit * const hit) {
198  if (hitInformation.getRightLeftInformation() == RecoHitInformation::c_left) {
199  createdTrackCand.addHit(new genfit::WireTrackCandHit(Const::CDC, hit->getArrayIndex(), -1,
200  hitInformation.getSortingParameter(), -1));
201  } else if (hitInformation.getRightLeftInformation() == RecoHitInformation::c_right) {
202  createdTrackCand.addHit(new genfit::WireTrackCandHit(Const::CDC, hit->getArrayIndex(), -1,
203  hitInformation.getSortingParameter(), 1));
204  } else {
205  createdTrackCand.addHit(new genfit::WireTrackCandHit(Const::CDC, hit->getArrayIndex(), -1,
206  hitInformation.getSortingParameter(), 0));
207  }
208  });
209  mapOnHits<UsedBKLMHit>(m_storeArrayNameOfBKLMHits, [&createdTrackCand](const RecoHitInformation & hitInformation,
210  const UsedBKLMHit * const hit) {
211  createdTrackCand.addHit(Const::BKLM, hit->getArrayIndex(), -1, hitInformation.getSortingParameter());
212  });
213  mapOnHits<UsedEKLMHit>(m_storeArrayNameOfEKLMHits, [&createdTrackCand](const RecoHitInformation & hitInformation,
214  const UsedEKLMHit * const hit) {
215  createdTrackCand.addHit(Const::EKLM, hit->getArrayIndex(), -1, hitInformation.getSortingParameter());
216  });
217 
218  createdTrackCand.sortHits();
219 
220  // Set the MC Particle
221  const MCParticle* relatedMCParticle = getRelatedTo<MCParticle>();
222  if (relatedMCParticle) {
223  createdTrackCand.setMcTrackId(relatedMCParticle->getArrayIndex());
224  }
225 
226  // Add the hits
227  return createdTrackCand;
228 }
229 
231 {
232  int createdTrackPointID = recoHitInformation->getCreatedTrackPointID();
233  if (createdTrackPointID == -1) {
234  return nullptr;
235  }
236 
237  return m_genfitTrack.getPoint(createdTrackPointID);
238 }
239 
240 size_t RecoTrack::addHitsFromRecoTrack(const RecoTrack* recoTrack, unsigned int sortingParameterOffset, bool reversed,
241  std::optional<double> optionalMinimalWeight)
242 {
243  size_t hitsCopied = 0;
244 
245  unsigned int maximalSortingParameter = 0;
246 
247  if (reversed) {
248  const auto& recoHitInformations = recoTrack->getRecoHitInformations();
249  const auto sortBySP = [](const RecoHitInformation * lhs, const RecoHitInformation * rhs) {
250  return lhs->getSortingParameter() < rhs->getSortingParameter();
251  };
252  const auto& maximalElement = std::max_element(recoHitInformations.begin(), recoHitInformations.end(), sortBySP);
253  if (maximalElement != recoHitInformations.end()) {
254  maximalSortingParameter = (*maximalElement)->getSortingParameter();
255  }
256  }
257 
258  // Helper function to add the sorting parameter offset (or reverse the sign of the sorting parameter)
259  const auto calculateSortingParameter = [maximalSortingParameter, sortingParameterOffset](unsigned int sortingParameters) {
260  if (maximalSortingParameter > 0) {
261  return maximalSortingParameter - sortingParameters + sortingParameterOffset;
262  }
263  return sortingParameters + sortingParameterOffset;
264  };
265 
266  const auto testHitWeight = [recoTrack, optionalMinimalWeight](const RecoHitInformation * recoHitInformation) {
267  if (not optionalMinimalWeight) {
268  return true;
269  }
270  double minimalWeight = *optionalMinimalWeight;
271  const genfit::TrackPoint* trackPoint = recoTrack->getCreatedTrackPoint(recoHitInformation);
272  if (trackPoint) {
273  genfit::KalmanFitterInfo* kalmanFitterInfo = trackPoint->getKalmanFitterInfo();
274  if (not kalmanFitterInfo) {
275  return false;
276  }
277  const std::vector<double>& weights = kalmanFitterInfo->getWeights();
278  const auto checkWeight = [minimalWeight](const double weight) {
279  return weight >= minimalWeight;
280  };
281  return std::any_of(weights.begin(), weights.end(), checkWeight);
282  }
283  return true;
284  };
285 
286  for (auto* pxdHit : recoTrack->getPXDHitList()) {
287  auto recoHitInfo = recoTrack->getRecoHitInformation(pxdHit);
288  assert(recoHitInfo);
289  if (testHitWeight(recoHitInfo)) {
290  hitsCopied += addPXDHit(pxdHit, calculateSortingParameter(recoHitInfo->getSortingParameter()),
291  recoHitInfo->getFoundByTrackFinder());
292  }
293  }
294 
295  for (auto* svdHit : recoTrack->getSVDHitList()) {
296  auto recoHitInfo = recoTrack->getRecoHitInformation(svdHit);
297  assert(recoHitInfo);
298  if (testHitWeight(recoHitInfo)) {
299  hitsCopied += addSVDHit(svdHit, calculateSortingParameter(recoHitInfo->getSortingParameter()),
300  recoHitInfo->getFoundByTrackFinder());
301  }
302  }
303 
304  for (auto* cdcHit : recoTrack->getCDCHitList()) {
305  auto recoHitInfo = recoTrack->getRecoHitInformation(cdcHit);
306  assert(recoHitInfo);
307  if (testHitWeight(recoHitInfo)) {
308  hitsCopied += addCDCHit(cdcHit, calculateSortingParameter(recoHitInfo->getSortingParameter()),
309  recoHitInfo->getRightLeftInformation(),
310  recoHitInfo->getFoundByTrackFinder());
311  }
312  }
313 
314  for (auto* bklmHit : recoTrack->getBKLMHitList()) {
315  auto recoHitInfo = recoTrack->getRecoHitInformation(bklmHit);
316  assert(recoHitInfo);
317  if (testHitWeight(recoHitInfo)) {
318  hitsCopied += addBKLMHit(bklmHit, calculateSortingParameter(recoHitInfo->getSortingParameter()),
319  recoHitInfo->getFoundByTrackFinder());
320  }
321  }
322 
323  for (auto* eklmHit : recoTrack->getEKLMHitList()) {
324  auto recoHitInfo = recoTrack->getRecoHitInformation(eklmHit);
325  assert(recoHitInfo);
326  if (testHitWeight(recoHitInfo)) {
327  hitsCopied += addEKLMHit(eklmHit, calculateSortingParameter(recoHitInfo->getSortingParameter()),
328  recoHitInfo->getFoundByTrackFinder());
329  }
330  }
331 
332  return hitsCopied;
333 }
334 
335 
336 bool RecoTrack::wasFitSuccessful(const genfit::AbsTrackRep* representation) const
337 {
338  checkDirtyFlag();
339 
340  if (getRepresentations().empty()) {
341  return false;
342  }
343 
344  if (not hasTrackFitStatus(representation)) {
345  return false;
346  }
347 
348  const genfit::FitStatus* fs = getTrackFitStatus(representation);
349  if (not fs) {
350  return false;
351  }
352  if (not fs->isFitConverged()) {
353  return false;
354  }
355 
356  // make sure we only consider fitted if the Kalman method was used
357  if (not dynamic_cast<const genfit::KalmanFitStatus*>(fs)) {
358  return false;
359  }
360 
361  // make sure there is at least one hit with a valid mSoP
362  const unsigned int trackSize = m_genfitTrack.getNumPoints();
363  for (unsigned int i = 0; i < trackSize; i++) {
364  try {
365  m_genfitTrack.getFittedState(i, representation);
366  return true;
367  } catch (const genfit::Exception& exception) {
368  B2DEBUG(29, "Can not get mSoP because of: " << exception.what());
369  }
370  }
371 
372  return false;
373 }
374 
376 {
377  // "Delete" all RecoHitInfromation but the first and the last.
378  // Copy is intended!
379  std::vector<RelationEntry> relatedRecoHitInformations = getRelationsWith<RecoHitInformation>
381  std::sort(relatedRecoHitInformations.begin(), relatedRecoHitInformations.end(), [](const RelationEntry & lhs,
382  const RelationEntry & rhs) {
383  return dynamic_cast<RecoHitInformation*>(lhs.object)->getSortingParameter() > dynamic_cast<RecoHitInformation*>
384  (rhs.object)->getSortingParameter();
385  });
386 
387  // "Prune" all RecoHitInformation but the first and the last.
388  for (unsigned int i = 1; i < relatedRecoHitInformations.size() - 1; ++i) {
389  dynamic_cast<RecoHitInformation*>(relatedRecoHitInformations[i].object)->setFlag(RecoHitInformation::RecoHitFlag::c_pruned);
390  dynamic_cast<RecoHitInformation*>(relatedRecoHitInformations[i].object)->setCreatedTrackPointID(-1);
391  }
392 
393  // Genfits prune method fails, if the number of hits is too small.
394  if (getHitPointsWithMeasurement().size() >= 2) {
395  m_genfitTrack.prune("FL");
396  }
397 }
398 
400 {
401  recoTrack.m_genfitTrack = *track;
402 }
403 
405 {
406  return recoTrack.m_genfitTrack;
407 }
408 
410 {
411  // try to get the trackRep, if it has already been added
412  genfit::AbsTrackRep* trackRepresentation = recoTrack.getTrackRepresentationForPDG(std::abs(PDGcode));
413 
414  // not available? create one
415  if (trackRepresentation == nullptr) {
416  if (PDGcode == Monopoles::c_monopolePDGCode) {
417  trackRepresentation = new genfit::MplTrackRep(PDGcode, Monopoles::monopoleMagCharge);
418  } else {
419  trackRepresentation = new genfit::RKTrackRep(PDGcode);
420  }
421  RecoTrackGenfitAccess::getGenfitTrack(recoTrack).addTrackRep(trackRepresentation);
422  }
423  return trackRepresentation;
424 }
425 
426 const genfit::MeasuredStateOnPlane& RecoTrack::getMeasuredStateOnPlaneClosestTo(const ROOT::Math::XYZVector& closestPoint,
427  const genfit::AbsTrackRep* representation)
428 {
429  checkDirtyFlag();
430  const unsigned int numberOfPoints = m_genfitTrack.getNumPointsWithMeasurement();
431 
432  assert(numberOfPoints > 0);
433 
434  const genfit::MeasuredStateOnPlane* nearestStateOnPlane = nullptr;
435  double minimalDistance2 = 0;
436  for (unsigned int hitIndex = 0; hitIndex < numberOfPoints; hitIndex++) {
437  try {
438  const genfit::MeasuredStateOnPlane& measuredStateOnPlane = m_genfitTrack.getFittedState(hitIndex, representation);
439 
440  const double currentDistance2 = (ROOT::Math::XYZVector(measuredStateOnPlane.getPos()) - closestPoint).Mag2();
441 
442  if (not nearestStateOnPlane or currentDistance2 < minimalDistance2) {
443  nearestStateOnPlane = &measuredStateOnPlane;
444  minimalDistance2 = currentDistance2;
445  }
446  } catch (const genfit::Exception& exception) {
447  B2DEBUG(50, "Can not get mSoP because of: " << exception.what());
448  continue;
449  }
450  }
451 
452  // catch case no hit has measured state on plane (not sure how likely that is) which would lead to undefined behavior
453  if (not nearestStateOnPlane) {
454  B2WARNING("Non of the track hits had a MeasuredStateOnPlane! Exception thrown.");
455  throw NoStateOnPlaneFound();
456  }
457 
458  return *nearestStateOnPlane;
459 }
460 
461 
463 {
464  // Delete all fitted information for all representations
465  for (const genfit::AbsTrackRep* rep : getRepresentations()) {
467  }
468 }
469 
471 {
473 }
474 
476 {
477  if (pdgCode < 0) {
478  B2FATAL("Only positive pdgCode is possible when calling getTrackRepresentationForPDG, got " << pdgCode);
479  }
480 
481  const std::vector<genfit::AbsTrackRep*>& trackRepresentations = getRepresentations();
482 
483  for (genfit::AbsTrackRep* trackRepresentation : trackRepresentations) {
484  // Check if the track representation is a RKTrackRep.
485  const genfit::RKTrackRep* rkTrackRepresenation = dynamic_cast<const genfit::RKTrackRep*>(trackRepresentation);
486  if (rkTrackRepresenation != nullptr) {
487  // take the aboslute value of the PDG code as the TrackRep holds the PDG code including the charge (so -13 or 13)
488  if (std::abs(rkTrackRepresenation->getPDG()) == pdgCode) {
489  return trackRepresentation;
490  }
491  }
492  }
493 
494  return nullptr;
495 }
496 
497 
499 std::tuple<ROOT::Math::XYZVector, ROOT::Math::XYZVector, short> RecoTrack::extractTrackState() const
500 {
501  if (not wasFitSuccessful()) {
502  return std::make_tuple(getPositionSeed(), getMomentumSeed(), getChargeSeed());
503  } else {
504  const auto& measuredStateOnPlane = getMeasuredStateOnPlaneFromFirstHit();
505  return std::make_tuple(ROOT::Math::XYZVector(measuredStateOnPlane.getPos()), ROOT::Math::XYZVector(measuredStateOnPlane.getMom()),
506  measuredStateOnPlane.getCharge());
507  }
508 }
509 
511  const ROOT::Math::XYZVector& position, const ROOT::Math::XYZVector& momentum, short charge,
512  const TMatrixDSym& covariance, double timeSeed) const
513 {
514  RecoTrack* newRecoTrack = storeArray.appendNew(position, momentum, charge,
517 
518  newRecoTrack->setTimeSeed(timeSeed);
519  newRecoTrack->setSeedCovariance(covariance);
520 
521  return newRecoTrack;
522 }
523 
525 {
527 }
528 
530 {
531  if (wasFitSuccessful()) {
532  const auto& mSoP = getMeasuredStateOnPlaneFromFirstHit();
533  return copyToStoreArrayUsing(storeArray,
534  ROOT::Math::XYZVector(mSoP.getPos()),
535  ROOT::Math::XYZVector(mSoP.getMom()),
536  static_cast<short>(mSoP.getCharge()),
537  mSoP.get6DCov(), mSoP.getTime());
538  } else {
539  return copyToStoreArrayUsingSeeds(storeArray);
540  }
541 }
542 
543 bool RecoTrack::hasTrackFitStatus(const genfit::AbsTrackRep* representation) const
544 {
545  checkDirtyFlag();
546 
547  // there might be the case, where the genfit track has no trackreps, even not the cardinal
548  // one because no fit attempt was performed. In this case, the "hasFitStatus" call to genfit
549  // will fail with an access violation. To prevent that, check for the number of reps here before
550  // actually calling genfit's hasFitStatus(...)
551  if (m_genfitTrack.getNumReps() == 0)
552  return false;
553 
554  return m_genfitTrack.hasFitStatus(representation);
555 }
556 
557 std::vector<RecoHitInformation*> RecoTrack::getRecoHitInformations(bool getSorted) const
558 {
559  std::vector<RecoHitInformation*> hitList;
560  RelationVector<RecoHitInformation> recoHitInformations = getRelationsTo<RecoHitInformation>
562 
563  hitList.reserve(recoHitInformations.size());
564  for (auto& recoHit : recoHitInformations) {
565  hitList.push_back(&recoHit);
566  }
567 
568  // sort the returned vector if requested
569  if (getSorted) {
570  std::sort(hitList.begin(), hitList.end(), [](const RecoHitInformation * a,
571  const RecoHitInformation * b) -> bool {
572  return a->getSortingParameter() < b->getSortingParameter();
573  });
574  }
575 
576  return hitList;
577 }
578 
580  const genfit::AbsTrackRep* representation) const
581 {
582  checkDirtyFlag();
583 
584  if (!hasTrackFitStatus(representation)) {
585  B2FATAL("MeasuredStateOnPlane can not be retrieved for RecoTracks where no fit has been attempted.");
586  }
587 
588  if (!recoHitInfo->useInFit()) {
589  B2FATAL("MeasuredStateOnPlane cannot be provided for RecoHit which was not used in the fit.");
590  }
591 
592  const auto* hitTrackPoint = getCreatedTrackPoint(recoHitInfo);
593  if (not hitTrackPoint) {
594  B2FATAL("TrackPoint was requested which has not been created");
595  }
596 
597  const auto* fittedResult = hitTrackPoint->getFitterInfo(representation);
598  if (not fittedResult) {
599  throw NoTrackFitResult();
600  }
601 
602  return fittedResult->getFittedState();
603 }
604 
606 {
607  const unsigned int trackSize = m_genfitTrack.getNumPoints();
608  for (unsigned int i = 0; i < trackSize; i++) {
609  try {
610  return m_genfitTrack.getFittedState(i, representation);
611  } catch (const genfit::Exception& exception) {
612  B2DEBUG(28, "Can not get mSoP because of: " << exception.what());
613  }
614  }
615 
616  B2FATAL("There is no single hit with a valid mSoP in this track! Check if the fit failed with wasFitSuccessful before");
617 }
618 
620 {
621  int trackSize = m_genfitTrack.getNumPoints();
622  for (int i = -1; i >= -trackSize; i--) {
623  try {
624  return m_genfitTrack.getFittedState(i, representation);
625  } catch (const genfit::Exception& exception) {
626  B2DEBUG(28, "Can not get mSoP because of: " << exception.what());
627  }
628  }
629 
630  B2FATAL("There is no single hit with a valid mSoP in this track!");
631 }
632 
634 {
635  m_isArmTimeComputed = true;
636  const std::vector<RecoHitInformation*>& recoHits = getRecoHitInformations(true);
637  bool svdDone = false;
638  int nSVDHits = 0;
639  static RecoHitInformation::RecoHitDetector und = RecoHitInformation::RecoHitDetector::c_undefinedTrackingDetector;
640  RecoHitInformation::RecoHitDetector SVD = RecoHitInformation::RecoHitDetector::c_SVD;
642  RecoHitInformation::RecoHitDetector detIDpost = und;
643  float clusterTimeSum = 0;
644  float clusterTimeSigma2Sum = 0;
645  bool trackArmTimeDone = false;
646 
647  // loop over the recoHits of the RecoTrack
648  for (const auto& recoHit : recoHits) {
649  RecoHitInformation::RecoHitDetector foundin = recoHit->getTrackingDetector();
650  if (!svdDone && foundin != SVD) {
651  detIDpre = foundin;
652  trackArmTimeDone = false;
653  }
654  if (foundin == SVD) {
655  RelationVector<SVDCluster> svdClusters = recoHit->getRelationsTo<SVDCluster>(m_storeArrayNameOfSVDHits);
656  clusterTimeSum += svdClusters[0]->getClsTime();
657  clusterTimeSigma2Sum += svdClusters[0]->getClsTimeSigma() * svdClusters[0]->getClsTimeSigma();
658  nSVDHits += 1;
659  svdDone = true;
660  } else {
661  // Compute the track arm times using SVD cluster times
662  if (svdDone && nSVDHits > 1) {
663  detIDpost = foundin;
664  if (!isOutgoingArm(detIDpre, detIDpost)) {
665  m_ingoingArmTime = clusterTimeSum / nSVDHits;
666  m_ingoingArmTimeError = std::sqrt(clusterTimeSigma2Sum / (nSVDHits * (nSVDHits - 1)));
667  m_hasIngoingArmTime = true;
668  m_nSVDHitsOfIngoingArm = nSVDHits;
669  } else {
670  m_outgoingArmTime = clusterTimeSum / nSVDHits;
671  m_outgoingArmTimeError = std::sqrt(clusterTimeSigma2Sum / (nSVDHits * (nSVDHits - 1)));
672  m_hasOutgoingArmTime = true;
673  m_nSVDHitsOfOutgoingArm = nSVDHits;
674  }
675  svdDone = false;
676  detIDpre = detIDpost;
677  detIDpost = und;
678  clusterTimeSum = 0;
679  nSVDHits = 0;
680  trackArmTimeDone = true;
681  }
682  }
683 
684  // When the last recoHit is SVD, it does not enter in the else{} of if (detID == SVD) {...} else {...}
685  // where the track arm times are calculated, so they are calculated here.
686  // It will not reset all variables because it is run only at the last recoHit
687  if (!trackArmTimeDone && (recoHit == recoHits.back()) && nSVDHits > 1) {
688  if (!isOutgoingArm(detIDpre, detIDpost)) {
689  m_ingoingArmTime = clusterTimeSum / nSVDHits;
690  m_ingoingArmTimeError = std::sqrt(clusterTimeSigma2Sum / (nSVDHits * (nSVDHits - 1)));
691  m_hasIngoingArmTime = true;
692  m_nSVDHitsOfIngoingArm = nSVDHits;
693  } else {
694  m_outgoingArmTime = clusterTimeSum / nSVDHits;
695  m_outgoingArmTimeError = std::sqrt(clusterTimeSigma2Sum / (nSVDHits * (nSVDHits - 1)));
696  m_hasOutgoingArmTime = true;
697  m_nSVDHitsOfOutgoingArm = nSVDHits;
698  }
699  }
700  }
701 }
702 
704 {
705  static RecoHitInformation::RecoHitDetector und = RecoHitInformation::RecoHitDetector::c_undefinedTrackingDetector;
706  RecoHitInformation::RecoHitDetector PXD = RecoHitInformation::RecoHitDetector::c_PXD;
707  RecoHitInformation::RecoHitDetector CDC = RecoHitInformation::RecoHitDetector::c_CDC;
708  bool isOutgoing = true;
709  if (pre == PXD && post == CDC) isOutgoing = true;
710  else if (pre == und && post == CDC) isOutgoing = true;
711  else if (pre == PXD && post == und) isOutgoing = true;
712  else if (pre == CDC && post == PXD) isOutgoing = false;
713  else if (pre == und && post == PXD) isOutgoing = false;
714  else if (pre == CDC && post == und) isOutgoing = false;
715  else {
716  //TO DO
717  B2DEBUG(29,
718  "SVD-only? PXD-SVD-PXD??? --- use layer information to determine if the track arm is outgoing or ingoing! Considered --> 'OUT'");
719  isOutgoing = true;
720  }
721  return isOutgoing;
722 }
723 
725 {
726  const genfit::MeasuredStateOnPlane& measuredStateOnPlane = getMeasuredStateOnPlaneFromLastHit(representation);
727  const ROOT::Math::XYZVector& fittedPosition = ROOT::Math::XYZVector(measuredStateOnPlane.getPos());
728  const ROOT::Math::XYZVector& fittedMomentum = ROOT::Math::XYZVector(measuredStateOnPlane.getMom());
729  const double& fittedCharge = measuredStateOnPlane.getCharge();
730 
731  // revert the charge and momentum
732  setChargeSeed(-fittedCharge);
733  setPositionAndMomentum(fittedPosition, -fittedMomentum);
735  swapArmTimes();
736  setDirtyFlag();
737 }
738 
739 std::string RecoTrack::getInfoHTML() const
740 {
741  std::stringstream out;
742 
743  out << "<b>Charge seed</b>=" << getChargeSeed();
744 
745  out << "<b>pT seed</b>=" << getMomentumSeed().Rho();
746  out << ", <b>pZ seed</b>=" << getMomentumSeed().Z();
747  out << "<br>";
748  out << "<b>position seed</b>=" << getMomentumSeed().X() << ", " << getMomentumSeed().Y() << ", " << getMomentumSeed().Z();
749  out << "<br>";
750 
751  for (const genfit::AbsTrackRep* rep : getRepresentations()) {
752  out << "<b>was fitted with " << rep->getPDG() << "</b>=" << wasFitSuccessful() << ", ";
753  }
754  out << "<br>";
755 
756  return out.str();
757 }
Class containing the result of the unpacker in raw data and the result of the digitizer in simulation...
Definition: CDCHit.h:40
This dataobject is used only for EKLM alignment.
KLM 2d hit.
Definition: KLMHit2d.h:33
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:32
int getArrayIndex() const
Get 0-based index of the particle in the corresponding MCParticle list.
Definition: MCParticle.h:244
The PXD Cluster class This class stores all information about reconstructed PXD clusters The position...
Definition: PXDCluster.h:30
This class stores additional information to every CDC/SVD/PXD hit stored in a RecoTrack.
RightLeftInformation getRightLeftInformation() const
Get the right-left-information.
RecoHitDetector
The detector this hit comes from (which is of course also visible in the hit type)
bool useInFit() const
Get the flag, whether this his should be used in a fit or not.
int getCreatedTrackPointID() const
Get the id of the TrackPoint related to this reco hit information in the genfit::Track.
unsigned int getSortingParameter() const
Get the sorting parameter.
static genfit::Track & getGenfitTrack(RecoTrack &recoTrack)
Give access to the RecoTrack's genfit::Track.
Definition: RecoTrack.cc:404
static void swapGenfitTrack(RecoTrack &recoTrack, const genfit::Track *track)
Set the genfit track of a Recotrack copying the information from another genfit track.
Definition: RecoTrack.cc:399
static genfit::AbsTrackRep * createOrReturnRKTrackRep(RecoTrack &recoTrack, int PDGcode)
Checks if a TrackRap for the PDG id of the RecoTrack (and its charge conjugate) does already exit and...
Definition: RecoTrack.cc:409
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:79
size_t addHitsFromRecoTrack(const RecoTrack *recoTrack, unsigned int sortingParameterOffset=0, bool reversed=false, std::optional< double > optionalMinimalWeight=std::nullopt)
Add all hits from another RecoTrack to this RecoTrack.
Definition: RecoTrack.cc:240
const genfit::FitStatus * getTrackFitStatus(const genfit::AbsTrackRep *representation=nullptr) const
Return the track fit status for the given representation or for the cardinal one. You are not allowed...
Definition: RecoTrack.h:621
void setChargeSeed(const short int chargeSeed)
Set the charge seed stored in the reco track. ATTENTION: This is not the fitted charge.
Definition: RecoTrack.h:597
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
void deleteFittedInformation()
Delete all fitted information for all representations.
Definition: RecoTrack.cc:462
float m_ingoingArmTimeError
Error of the track time of the ingoing arm.
Definition: RecoTrack.h:930
bool wasFitSuccessful(const genfit::AbsTrackRep *representation=nullptr) const
Returns true if the last fit with the given representation was successful.
Definition: RecoTrack.cc:336
static RecoTrack * createFromTrackCand(const genfit::TrackCand &trackCand, const std::string &storeArrayNameOfRecoTracks="", const std::string &storeArrayNameOfPXDHits="", const std::string &storeArrayNameOfSVDHits="", const std::string &storeArrayNameOfCDCHits="", const std::string &storeArrayNameOfBKLMHits="", const std::string &storeArrayNameOfEKLMHits="", const std::string &storeArrayNameOfRecoHitInformation="", const bool recreateSortingParameters=false)
Create a reco track from a genfit::TrackCand and save it to the given store array.
Definition: RecoTrack.cc:97
void setPositionAndMomentum(const ROOT::Math::XYZVector &positionSeed, const ROOT::Math::XYZVector &momentumSeed)
Set the position and momentum seed of the reco track. ATTENTION: This is not the fitted position or m...
Definition: RecoTrack.h:590
std::string m_storeArrayNameOfCDCHits
Store array name of added CDC hits.
Definition: RecoTrack.h:905
std::vector< Belle2::RecoTrack::UsedSVDHit * > getSVDHitList() const
Return an unsorted list of svd hits.
Definition: RecoTrack.h:452
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
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
std::vector< Belle2::RecoTrack::UsedBKLMHit * > getBKLMHitList() const
Return an unsorted list of bklm hits.
Definition: RecoTrack.h:458
void estimateArmTime()
This function calculates the track time of the ingoing and outgoing arms and their difference.
Definition: RecoTrack.cc:633
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
bool m_hasIngoingArmTime
Internal storage of the final ingoing arm time is set.
Definition: RecoTrack.h:934
std::tuple< ROOT::Math::XYZVector, ROOT::Math::XYZVector, short > extractTrackState() const
Return the position, the momentum and the charge of the first measured state on plane or - if unfitte...
Definition: RecoTrack.cc:499
int m_nSVDHitsOfOutgoingArm
Number of SVD clusters of the outgoing arm.
Definition: RecoTrack.h:938
bool m_hasOutgoingArmTime
Internal storage of the final outgoing arm time is set.
Definition: RecoTrack.h:936
const std::vector< genfit::TrackPoint * > & getHitPointsWithMeasurement() const
Return a list of measurements and track points, which can be used e.g. to extrapolate....
Definition: RecoTrack.h:708
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneClosestTo(const ROOT::Math::XYZVector &closestPoint, const genfit::AbsTrackRep *representation=nullptr)
Return genfit's MasuredStateOnPlane, that is closest to the given point useful for extrapolation of m...
Definition: RecoTrack.cc:426
float m_outgoingArmTime
Track time of the outgoing arm.
Definition: RecoTrack.h:924
void setDirtyFlag(const bool &dirtyFlag=true)
Set to true, if you want to rebuild the measurements and do the fit independent on changes of the hit...
Definition: RecoTrack.h:722
const std::vector< genfit::AbsTrackRep * > & getRepresentations() const
Return a list of track representations. You are not allowed to modify or delete them!
Definition: RecoTrack.h:638
std::string m_storeArrayNameOfBKLMHits
Store array name of added BKLM hits.
Definition: RecoTrack.h:907
std::string getInfoHTML() const override
Get useful information on EventDisplay.
Definition: RecoTrack.cc:739
const std::string & getStoreArrayNameOfCDCHits() const
Name of the store array of the cdc hits.
Definition: RecoTrack.h:738
void prune()
Prune the genfit track, e.g.
Definition: RecoTrack.cc:375
std::vector< Belle2::RecoTrack::UsedPXDHit * > getPXDHitList() const
Return an unsorted list of pxd hits.
Definition: RecoTrack.h:449
const std::string & getStoreArrayNameOfBKLMHits() const
Name of the store array of the bklm hits.
Definition: RecoTrack.h:741
const std::string & getStoreArrayNameOfSVDHits() const
Name of the store array of the svd hits.
Definition: RecoTrack.h:735
RecoTrack * copyToStoreArrayUsingSeeds(StoreArray< RecoTrack > &storeArray) const
Append a new RecoTrack to the given store array and copy its general properties, but not the hits the...
Definition: RecoTrack.cc:524
std::vector< Belle2::RecoTrack::UsedCDCHit * > getCDCHitList() const
Return an unsorted list of cdc hits.
Definition: RecoTrack.h:455
void setTimeSeed(const double timeSeed)
Set the time seed. ATTENTION: This is not the fitted time.
Definition: RecoTrack.h:604
genfit::TrackCand createGenfitTrackCand() const
Create a genfit::TrackCand out of this reco track and copy all information to the track candidate.
Definition: RecoTrack.cc:178
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneFromLastHit(const genfit::AbsTrackRep *representation=nullptr) const
Return genfit's MeasuredStateOnPlane for the last hit in a fit useful for extrapolation of measuremen...
Definition: RecoTrack.cc:619
void setSeedCovariance(const TMatrixDSym &seedCovariance)
Set the covariance of the seed. ATTENTION: This is not the fitted covariance.
Definition: RecoTrack.h:614
bool hasTrackFitStatus(const genfit::AbsTrackRep *representation=nullptr) const
Check, if there is a fit status for the given representation or for the cardinal one.
Definition: RecoTrack.cc:543
int m_nSVDHitsOfIngoingArm
Number of SVD clusters of the ingoing arm.
Definition: RecoTrack.h:940
RecoTrack * copyToStoreArray(StoreArray< RecoTrack > &storeArray) const
Append a new RecoTrack to the given store array and copy its general properties, but not the hits the...
Definition: RecoTrack.cc:529
RecoTrack * copyToStoreArrayUsing(StoreArray< RecoTrack > &storeArray, const ROOT::Math::XYZVector &position, const ROOT::Math::XYZVector &momentum, short charge, const TMatrixDSym &covariance, double timeSeed) const
Append a new RecoTrack to the given store array and copy its general properties, but not the hits the...
Definition: RecoTrack.cc:510
const genfit::TrackPoint * getCreatedTrackPoint(const RecoHitInformation *recoHitInformation) const
Get a pointer to the TrackPoint that was created from this hit.
Definition: RecoTrack.cc:230
std::vector< RecoHitInformation * > getRecoHitInformations(bool getSorted=false) const
Return a list of all RecoHitInformations associated with the RecoTrack.
Definition: RecoTrack.cc:557
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
bool m_isArmTimeComputed
true if the arms times are already computed, false otherwise
Definition: RecoTrack.h:932
std::string m_storeArrayNameOfSVDHits
Store array name of added SVD hits.
Definition: RecoTrack.h:903
float m_ingoingArmTime
Track time of the ingoing arm.
Definition: RecoTrack.h:928
void flipTrackDirectionAndCharge(const genfit::AbsTrackRep *representation=nullptr)
Flip the direction of the RecoTrack by inverting the momentum vector and the charge.
Definition: RecoTrack.cc:724
void revertRecoHitInformationSorting()
Revert the sorting order of the RecoHitInformation.
Definition: RecoTrack.h:750
const std::string & getStoreArrayNameOfRecoHitInformation() const
Name of the store array of the reco hit informations.
Definition: RecoTrack.h:747
const TMatrixDSym & getSeedCovariance() const
Return the covariance matrix of the seed. ATTENTION: This is not the fitted covariance.
Definition: RecoTrack.h:611
const std::string & getStoreArrayNameOfPXDHits() const
Name of the store array of the pxd hits.
Definition: RecoTrack.h:732
void deleteFittedInformationForRepresentation(const genfit::AbsTrackRep *rep)
Delete all fitted information for the given representations.
Definition: RecoTrack.cc:470
short int getChargeSeed() const
Return the charge seed stored in the reco track. ATTENTION: This is not the fitted charge.
Definition: RecoTrack.h:508
const std::string & getStoreArrayNameOfEKLMHits() const
Name of the store array of the eklm hits.
Definition: RecoTrack.h:744
float m_outgoingArmTimeError
Error of the track time of the outgoing arm.
Definition: RecoTrack.h:926
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneFromFirstHit(const genfit::AbsTrackRep *representation=nullptr) const
Return genfit's MeasuredStateOnPlane for the first hit in a fit useful for extrapolation of measureme...
Definition: RecoTrack.cc:605
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
genfit::AbsTrackRep * getTrackRepresentationForPDG(int pdgCode) const
Return an already created track representation of the given reco track for the PDG.
Definition: RecoTrack.cc:475
genfit::Track m_genfitTrack
Internal storage for the genfit track.
Definition: RecoTrack.h:897
RecoHitInformation * getRecoHitInformation(HitType *hit) const
Return the reco hit information for a generic hit from the storeArray.
Definition: RecoTrack.h:312
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneFromRecoHit(const RecoHitInformation *recoHitInfo, const genfit::AbsTrackRep *representation=nullptr) const
Return genfit's MeasuredStateOnPlane on plane for associated with one RecoHitInformation.
Definition: RecoTrack.cc:579
std::string m_storeArrayNameOfEKLMHits
Store array name of added EKLM hits.
Definition: RecoTrack.h:909
RecoTrack()
Empty constructor for ROOT. Do not use!
Definition: RecoTrack.h:140
std::vector< Belle2::RecoTrack::UsedEKLMHit * > getEKLMHitList() const
Return an unsorted list of eklm hits.
Definition: RecoTrack.h:461
std::string m_storeArrayNameOfPXDHits
Store array name of added PXD hits.
Definition: RecoTrack.h:901
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
void checkDirtyFlag() const
Helper: Check the dirty flag and produce a warning, whenever a fit result is accessed.
Definition: RecoTrack.h:1066
bool isOutgoingArm(RecoHitInformation::RecoHitDetector pre=RecoHitInformation::RecoHitDetector::c_undefinedTrackingDetector, RecoHitInformation::RecoHitDetector post=RecoHitInformation::RecoHitDetector::c_undefinedTrackingDetector)
This function returns true if the arm direction is Outgoing and false if the arm direction is Ingoing...
Definition: RecoTrack.cc:703
double getTimeSeed() const
Return the time seed stored in the reco track. ATTENTION: This is not the fitted time.
Definition: RecoTrack.h:511
std::string m_storeArrayNameOfRecoHitInformation
Store array of added RecoHitInformation.
Definition: RecoTrack.h:911
void swapArmTimes()
Swap arm times, booleans and nSVDHits.
Definition: RecoTrack.h:1058
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
Definition: SVDCluster.h:29
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
const std::string & getName() const
Return name under which the object is saved in the DataStore.
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
Abstract base class for a track representation.
Definition: AbsTrackRep.h:66
int getPDG() const
Get the pdg code.
Definition: AbsTrackRep.h:272
Exception class for error handling in GENFIT (provides storage for diagnostic information)
Definition: Exception.h:48
virtual const char * what() const noexcept
Standard error message handling for exceptions. use like "std::cerr << e.what();".
Definition: Exception.cc:52
Class where important numbers and properties of a fit can be stored.
Definition: FitStatus.h:80
bool isFitConverged(bool inAllPoints=true) const
Did the fit converge (in all Points or only partially)?
Definition: FitStatus.h:105
FitStatus for use with AbsKalmanFitter implementations.
Collects information needed and produced by a AbsKalmanFitter implementations and is specific to one ...
std::vector< double > getWeights() const
Get weights of measurements.
#StateOnPlane with additional covariance matrix.
Monopole track representation.
Definition: MplTrackRep.h:33
AbsTrackRep with 5D track parameterization in plane coordinates: (q/p, u', v', u, v)
Definition: RKTrackRep.h:72
Hit object for use in TrackCand.
Definition: TrackCandHit.h:34
Track candidate – seed values and indices.
Definition: TrackCand.h:69
void setTimeSeed(double time)
Set the time at which the seed is defined.
Definition: TrackCand.h:172
TVector3 getMomSeed() const
get the seed value for track: mom.
Definition: TrackCand.h:128
void setPosMomSeed(const TVector3 &pos, const TVector3 &mom, const double charge)
sets the state to seed the track fitting.
Definition: TrackCand.cc:258
TVector3 getPosSeed() const
get the seed value for track: pos.
Definition: TrackCand.h:125
void setCovSeed(const TMatrixDSym &cov6D)
set the covariance matrix seed (6D).
Definition: TrackCand.h:175
void setMcTrackId(int i)
Set the MCT track id, for MC simulations.
Definition: TrackCand.h:151
void sortHits()
Sort the hits that were already added to the trackCand using the sorting parameters.
Definition: TrackCand.cc:222
double getTimeSeed() const
Get the time at which the seed state is defined.
Definition: TrackCand.h:122
Object containing AbsMeasurement and AbsFitterInfo objects.
Definition: TrackPoint.h:46
KalmanFitterInfo * getKalmanFitterInfo(const AbsTrackRep *rep=nullptr) const
Helper to avoid casting.
Definition: TrackPoint.cc:180
Collection of TrackPoint objects, AbsTrackRep objects and FitStatus objects.
Definition: Track.h:71
void deleteFittedState(const genfit::AbsTrackRep *rep)
Delete the fit status and all the FitStates of the TrackPoints for the given hypothesis.
Definition: Track.cc:529
bool hasFitStatus(const AbsTrackRep *rep=nullptr) const
Check if track has a FitStatus for given AbsTrackRep. Per default, check for cardinal rep.
Definition: Track.cc:321
const MeasuredStateOnPlane & getFittedState(int id=0, const AbsTrackRep *rep=nullptr, bool biased=true) const
Shortcut to get FittedStates.
Definition: Track.cc:294
void prune(const Option_t *="CFLWRMIU")
Delete unneeded information from the Track.
Definition: Track.cc:1090
Hit object for use in TrackCand.
static constexpr auto XYZToTVector
Helper function to convert XYZVector to TVector3.
Definition: VectorUtil.h:24
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.
Struct for relations.
Definition: RelationEntry.h:24