Belle II Software  release-05-01-25
TrackVariables.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2014-2019 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Anze Zupanc, Sam Cunliffe, Martin Heck, Torben Ferber *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 // Own includes
12 #include <analysis/variables/TrackVariables.h>
13 #include <analysis/VariableManager/Manager.h>
14 
15 // framework - DataStore
16 #include <framework/datastore/StoreObjPtr.h>
17 #include <framework/dataobjects/Helix.h>
18 
19 // dataobjects from the MDST
20 #include <mdst/dataobjects/Track.h>
21 #include <mdst/dataobjects/MCParticle.h>
22 #include <mdst/dataobjects/TrackFitResult.h>
23 #include <mdst/dataobjects/EventLevelTrackingInfo.h>
24 #include <mdst/dataobjects/HitPatternCDC.h>
25 #include <mdst/dataobjects/HitPatternVXD.h>
26 #include <mdst/dataobjects/ECLCluster.h>
27 
28 // framework aux
29 #include <framework/logging/Logger.h>
30 
31 #include <iostream>
32 #include <algorithm>
33 #include <cmath>
34 
35 using namespace std;
36 
37 namespace Belle2 {
42  namespace Variable {
43 
44  // An helper function to get track fit results
45  // Not registered in variable mananger
46  TrackFitResult const* getTrackFitResultFromParticle(Particle const* particle)
47  {
48  const Track* track = particle->getTrack();
49  if (!track) {
50  return nullptr;
51  }
52 
53  const TrackFitResult* trackFit = track->getTrackFitResultWithClosestMass(Const::ChargedStable(abs(
54  particle->getPDGCode())));
55  return trackFit;
56  }
57 
58  double trackNHits(const Particle* part, const Const::EDetector& det)
59  {
60  auto trackFit = getTrackFitResultFromParticle(part);
61  if (!trackFit) {
62  return std::numeric_limits<double>::quiet_NaN();
63  }
64 
65  if (det == Const::EDetector::CDC) {
66  return trackFit->getHitPatternCDC().getNHits();
67  } else if (det == Const::EDetector::SVD) {
68  return trackFit->getHitPatternVXD().getNSVDHits();
69  } else if (det == Const::EDetector::PXD) {
70  return trackFit->getHitPatternVXD().getNPXDHits();
71  } else {
72  return std::numeric_limits<double>::quiet_NaN();
73  }
74  }
75 
76  double trackNCDCHits(const Particle* part)
77  {
78  return trackNHits(part, Const::EDetector::CDC);
79  }
80 
81  double trackNSVDHits(const Particle* part)
82  {
83  return trackNHits(part, Const::EDetector::SVD);
84  }
85 
86  double trackNPXDHits(const Particle* part)
87  {
88  return trackNHits(part, Const::EDetector::PXD);
89  }
90 
91  double trackNVXDHits(const Particle* part)
92  {
93  return trackNPXDHits(part) + trackNSVDHits(part);
94  }
95 
96  double trackNDF(const Particle* part)
97  {
98  auto trackFit = getTrackFitResultFromParticle(part);
99  if (!trackFit) {
100  return std::numeric_limits<double>::quiet_NaN();
101  }
102  return trackFit->getNDF();
103  }
104 
105  double trackChi2(const Particle* part)
106  {
107  auto trackFit = getTrackFitResultFromParticle(part);
108  if (!trackFit) {
109  return std::numeric_limits<double>::quiet_NaN();
110  }
111  return trackFit->getChi2();
112  }
113 
114  double trackFirstSVDLayer(const Particle* part)
115  {
116  auto trackFit = getTrackFitResultFromParticle(part);
117  if (!trackFit) {
118  return std::numeric_limits<double>::quiet_NaN();
119  }
120  return trackFit->getHitPatternVXD().getFirstSVDLayer();
121  }
122 
123  double trackFirstPXDLayer(const Particle* part)
124  {
125  auto trackFit = getTrackFitResultFromParticle(part);
126  if (!trackFit) {
127  return std::numeric_limits<double>::quiet_NaN();
128  }
129  return trackFit->getHitPatternVXD().getFirstPXDLayer(HitPatternVXD::PXDMode::normal);
130  }
131 
132  double trackFirstCDCLayer(const Particle* part)
133  {
134  auto trackFit = getTrackFitResultFromParticle(part);
135  if (!trackFit) {
136  return std::numeric_limits<double>::quiet_NaN();
137  }
138  return trackFit->getHitPatternCDC().getFirstLayer();
139  }
140 
141  double trackLastCDCLayer(const Particle* part)
142  {
143  auto trackFit = getTrackFitResultFromParticle(part);
144  if (!trackFit) {
145  return std::numeric_limits<double>::quiet_NaN();
146  }
147  return trackFit->getHitPatternCDC().getLastLayer();
148  }
149 
150  double trackD0(const Particle* part)
151  {
152  auto trackFit = getTrackFitResultFromParticle(part);
153  if (!trackFit) {
154  return std::numeric_limits<double>::quiet_NaN();
155  }
156  return trackFit->getD0();
157  }
158 
159  double trackPhi0(const Particle* part)
160  {
161  auto trackFit = getTrackFitResultFromParticle(part);
162  if (!trackFit) {
163  return std::numeric_limits<double>::quiet_NaN();
164  }
165  return trackFit->getPhi0();
166  }
167 
168  double trackOmega(const Particle* part)
169  {
170  auto trackFit = getTrackFitResultFromParticle(part);
171  if (!trackFit) {
172  return std::numeric_limits<double>::quiet_NaN();
173  }
174  return trackFit->getOmega();
175  }
176 
177  double trackZ0(const Particle* part)
178  {
179  auto trackFit = getTrackFitResultFromParticle(part);
180  if (!trackFit) {
181  return std::numeric_limits<double>::quiet_NaN();
182  }
183  return trackFit->getZ0();
184  }
185 
186  double trackTanLambda(const Particle* part)
187  {
188  auto trackFit = getTrackFitResultFromParticle(part);
189  if (!trackFit) {
190  return std::numeric_limits<double>::quiet_NaN();
191  }
192  return trackFit->getTanLambda();
193  }
194 
195  double trackD0Error(const Particle* part)
196  {
197  auto trackFit = getTrackFitResultFromParticle(part);
198  if (!trackFit) {
199  return std::numeric_limits<double>::quiet_NaN();
200  }
201 
202  double errorSquared = trackFit->getCovariance5()[0][0];
203  if (errorSquared > 0.0)
204  return sqrt(errorSquared);
205  else
206  return std::numeric_limits<double>::quiet_NaN();
207  }
208 
209  double trackPhi0Error(const Particle* part)
210  {
211  auto trackFit = getTrackFitResultFromParticle(part);
212  if (!trackFit) {
213  return std::numeric_limits<double>::quiet_NaN();
214  }
215 
216  double errorSquared = trackFit->getCovariance5()[1][1];
217  if (errorSquared > 0.0)
218  return sqrt(errorSquared);
219  else
220  return std::numeric_limits<double>::quiet_NaN();
221  }
222 
223  double trackOmegaError(const Particle* part)
224  {
225  auto trackFit = getTrackFitResultFromParticle(part);
226  if (!trackFit) {
227  return std::numeric_limits<double>::quiet_NaN();
228  }
229 
230  double errorSquared = trackFit->getCovariance5()[2][2];
231  if (errorSquared > 0.0)
232  return sqrt(errorSquared);
233  else
234  return std::numeric_limits<double>::quiet_NaN();
235  }
236 
237  double trackZ0Error(const Particle* part)
238  {
239  auto trackFit = getTrackFitResultFromParticle(part);
240  if (!trackFit) {
241  return std::numeric_limits<double>::quiet_NaN();
242  }
243 
244  double errorSquared = trackFit->getCovariance5()[3][3];
245  if (errorSquared > 0.0)
246  return sqrt(errorSquared);
247  else
248  return std::numeric_limits<double>::quiet_NaN();
249  }
250 
251  double trackTanLambdaError(const Particle* part)
252  {
253  auto trackFit = getTrackFitResultFromParticle(part);
254  if (!trackFit) {
255  return std::numeric_limits<double>::quiet_NaN();
256  }
257 
258  double errorSquared = trackFit->getCovariance5()[4][4];
259  if (errorSquared > 0.0)
260  return sqrt(errorSquared);
261  else
262  return std::numeric_limits<double>::quiet_NaN();
263  }
264 
265  double trackPValue(const Particle* part)
266  {
267  auto trackFit = getTrackFitResultFromParticle(part);
268  if (!trackFit) {
269  return -1;
270  }
271 
272  return trackFit->getPValue();
273  }
274 
275  double trackFitHypothesisPDG(const Particle* part)
276  {
277  auto trackFit = getTrackFitResultFromParticle(part);
278  if (!trackFit) {
279  return 0.0;
280  }
281 
282  return trackFit->getParticleType().getPDGCode();
283  }
284 
285  double trackNECLClusters(const Particle* part)
286  {
287  const Track* track = part->getTrack();
288  if (!track)
289  return std::numeric_limits<double>::quiet_NaN();
290 
291  // count the number of nPhotons hypothesis ecl clusters
292  int count = 0;
293  for (const ECLCluster& cluster : track->getRelationsTo<ECLCluster>())
294  if (cluster.hasHypothesis(ECLCluster::EHypothesisBit::c_nPhotons))
295  count++;
296  return double(count);
297  }
298 
299  // returns extrapolated theta position based on helix parameters
300  double trackHelixExtTheta(const Particle* part, const std::vector<double>& pars)
301  {
302  if (pars.size() != 3) {
303  B2WARNING("Exactly three parameters (r, zfwd, zbwd) required.");
304  return std::numeric_limits<double>::quiet_NaN();
305  }
306 
307  const double r = pars[0];
308  const double zfwd = pars[1];
309  const double zbwd = pars[2];
310 
311  // get the track fit
312  auto trackFit = getTrackFitResultFromParticle(part);
313  if (!trackFit) return std::numeric_limits<double>::quiet_NaN();
314 
315  // get helix and paremeters
316  const double z0 = trackFit->getZ0();
317  const double tanlambda = trackFit->getTanLambda();
318  const Helix h = trackFit->getHelix();
319 
320  // extrapolate to radius
321  const double arcLength = h.getArcLength2DAtCylindricalR(r);
322  const double lHelixRadius = arcLength > 0 ? arcLength : std::numeric_limits<double>::max();
323 
324  // extrapolate to FWD z
325  const double lFWD = (zfwd - z0) / tanlambda > 0 ? (zfwd - z0) / tanlambda : std::numeric_limits<double>::max();
326 
327  // extrapolate to BWD z
328  const double lBWD = (zbwd - z0) / tanlambda > 0 ? (zbwd - z0) / tanlambda : std::numeric_limits<double>::max();
329 
330  // pick smalles arclength
331  const double l = std::min(std::min(lHelixRadius, lFWD), lBWD);
332 
333  return atan2(h.getPositionAtArcLength2D(l).Perp(), h.getPositionAtArcLength2D(l).Z());
334  }
335 
336  // returns extrapolated phi position based on helix parameters
337  double trackHelixExtPhi(const Particle* part, const std::vector<double>& pars)
338  {
339  if (pars.size() != 3) {
340  B2WARNING("Exactly three parameters (r, zfwd, zbwd) required.");
341  return std::numeric_limits<double>::quiet_NaN();
342  }
343 
344  const double r = pars[0];
345  const double zfwd = pars[1];
346  const double zbwd = pars[2];
347 
348  // get the track fit
349  auto trackFit = getTrackFitResultFromParticle(part);
350  if (!trackFit) return std::numeric_limits<double>::quiet_NaN();
351 
352  // get helix and paremeters
353  const double z0 = trackFit->getZ0();
354  const double tanlambda = trackFit->getTanLambda();
355  const Helix h = trackFit->getHelix();
356 
357  // extrapolate to radius
358  const double arcLength = h.getArcLength2DAtCylindricalR(r);
359  const double lHelixRadius = arcLength > 0 ? arcLength : std::numeric_limits<double>::max();
360 
361  // extrapolate to FWD z
362  const double lFWD = (zfwd - z0) / tanlambda > 0 ? (zfwd - z0) / tanlambda : std::numeric_limits<double>::max();
363 
364  // extrapolate to BWD z
365  const double lBWD = (zbwd - z0) / tanlambda > 0 ? (zbwd - z0) / tanlambda : std::numeric_limits<double>::max();
366 
367  // pick smalles arclength
368  const double l = std::min(std::min(lHelixRadius, lFWD), lBWD);
369 
370  return atan2(h.getPositionAtArcLength2D(l).Y(), h.getPositionAtArcLength2D(l).X());
371  }
372 
373 
374  /***************************************************
375  * Event level tracking quantities
376  */
377 
378  // The number of CDC hits in the event not assigned to any track
379  double nExtraCDCHits(const Particle*)
380  {
381  StoreObjPtr<EventLevelTrackingInfo> elti;
382  if (!elti) return std::numeric_limits<double>::quiet_NaN();
383  return elti->getNCDCHitsNotAssigned();
384  }
385 
386  // The number of CDC hits in the event not assigned to any track nor very
387  // likely beam background (i.e. hits that survive a cleanup selection)
388  double nExtraCDCHitsPostCleaning(const Particle*)
389  {
390  StoreObjPtr<EventLevelTrackingInfo> elti;
391  if (!elti) return std::numeric_limits<double>::quiet_NaN();
392  return elti->getNCDCHitsNotAssignedPostCleaning();
393  }
394 
395  // Check for the presence of a non-assigned hit in the specified CDC layer
396  double hasExtraCDCHitsInLayer(const Particle*, const std::vector<double>& layer)
397  {
398  StoreObjPtr<EventLevelTrackingInfo> elti;
399  if (!elti) return std::numeric_limits<double>::quiet_NaN();
400  int ilayer = int(std::lround(layer[0]));
401  return elti->hasCDCLayer(ilayer);
402  }
403 
404  // Check for the presence of a non-assigned hit in the specified CDC SuperLayer
405  double hasExtraCDCHitsInSuperLayer(const Particle*, const std::vector<double>& layer)
406  {
407  StoreObjPtr<EventLevelTrackingInfo> elti;
408  if (!elti) return std::numeric_limits<double>::quiet_NaN();
409  int ilayer = int(std::lround(layer[0]));
410  return elti->hasCDCSLayer(ilayer);
411  }
412 
413  // The number of segments that couldn't be assigned to any track
414  double nExtraCDCSegments(const Particle*)
415  {
416  StoreObjPtr<EventLevelTrackingInfo> elti;
417  if (!elti) return std::numeric_limits<double>::quiet_NaN();
418  return elti->getNCDCSegments();
419  }
420 
421  // The number of VXD hits not assigned to any track in the specified layer
422  double nExtraVXDHitsInLayer(const Particle*, const std::vector<double>& layer)
423  {
424  StoreObjPtr<EventLevelTrackingInfo> elti;
425  if (!elti) return std::numeric_limits<double>::quiet_NaN();
426  int ilayer = int(std::lround(layer[0]));
427  return elti->getNVXDClustersInLayer(ilayer);
428  }
429 
430  // The number of VXD hits not assigned to any track
431  double nExtraVXDHits(const Particle*)
432  {
433  StoreObjPtr<EventLevelTrackingInfo> elti;
434  if (!elti) return std::numeric_limits<double>::quiet_NaN();
435  double out = 0.0;
436  for (uint16_t ilayer = 1; ilayer < 7; ilayer++)
437  out += elti->getNVXDClustersInLayer(ilayer);
438  return out;
439  }
440 
441  // time of first SVD sample relatvie to event T0
442  double svdFirstSampleTime(const Particle*)
443  {
444  StoreObjPtr<EventLevelTrackingInfo> elti;
445  if (!elti) return std::numeric_limits<double>::quiet_NaN();
446  return elti->getSVDFirstSampleTime();
447  }
448 
449  // A flag set by the tracking if there is reason to assume there was a track
450  // in the event missed by the tracking or the track finding was (partly) aborted
451  // for this event. Further information about this can be obtained from the flagBlock
452  // of the EventLevelTrackingInfo object.
453  double trackFindingFailureFlag(const Particle*)
454  {
455  StoreObjPtr<EventLevelTrackingInfo> elti;
456  if (!elti) return std::numeric_limits<double>::quiet_NaN();
457  return elti->hasAnErrorFlag();
458  }
459 
460  double getHelixParameterPullAtIndex(const Particle* particle, const int index)
461  {
462 
463  if (!particle) { return std::numeric_limits<double>::quiet_NaN(); }
464 
465  const MCParticle* mcparticle = particle->getRelatedTo<MCParticle>();
466  if (!mcparticle) { return std::numeric_limits<double>::quiet_NaN(); }
467 
468  const Belle2::Track* track = particle->getTrack();
469  if (!track) { return std::numeric_limits<double>::quiet_NaN(); }
470 
471  const Belle2::TrackFitResult* trackfit = track->getTrackFitResultWithClosestMass(Belle2::Const::ChargedStable(std::abs(
472  particle->getPDGCode())));
473  if (!trackfit) { return std::numeric_limits<double>::quiet_NaN(); }
474 
475  const Belle2::UncertainHelix measHelix = trackfit->getUncertainHelix();
476  const TMatrixDSym measCovariance = measHelix.getCovariance();
477  const TVector3 mcProdVertex = mcparticle->getVertex();
478  const TVector3 mcMomentum = mcparticle->getMomentum();
479 
480  const double BzAtProdVertex = Belle2::BFieldManager::getField(TVector3(mcProdVertex.X(), mcProdVertex.Y(),
481  mcProdVertex.Z())).Z() / Belle2::Unit::T;
482  const double mcParticleCharge = mcparticle->getCharge();
483  const Belle2::Helix mcHelix = Belle2::Helix(mcProdVertex, mcMomentum, mcParticleCharge, BzAtProdVertex);
484 
485  const std::vector<double> mcHelixPars = {mcHelix.getD0(), mcHelix.getPhi0(), mcHelix.getOmega(), mcHelix.getZ0(), mcHelix.getTanLambda()};
486  const std::vector<double> measHelixPars = {measHelix.getD0(), measHelix.getPhi0(), measHelix.getOmega(), measHelix.getZ0(), measHelix.getTanLambda()};
487  const std::vector<double> measErrSquare = {measCovariance[0][0], measCovariance[1][1], measCovariance[2][2], measCovariance[3][3], measCovariance[4][4]};
488 
489  return (mcHelixPars.at(index) - measHelixPars.at(index)) / std::sqrt(measErrSquare.at(index));
490  }
491 
492  double getHelixD0Pull(const Particle* part)
493  {
494  return getHelixParameterPullAtIndex(part, 0);
495  }
496 
497  double getHelixPhi0Pull(const Particle* part)
498  {
499  return getHelixParameterPullAtIndex(part, 1);
500  }
501 
502  double getHelixOmegaPull(const Particle* part)
503  {
504  return getHelixParameterPullAtIndex(part, 2);
505  }
506 
507  double getHelixZ0Pull(const Particle* part)
508  {
509  return getHelixParameterPullAtIndex(part, 3);
510  }
511  double getHelixTanLambdaPull(const Particle* part)
512  {
513  return getHelixParameterPullAtIndex(part, 4);
514  }
515 
516 
517  VARIABLE_GROUP("Tracking");
518  REGISTER_VARIABLE("d0Pull", getHelixD0Pull, "mc-meas/err_meas for d0");
519  REGISTER_VARIABLE("phi0Pull", getHelixPhi0Pull, "mc-meas/err_meas for phi0");
520  REGISTER_VARIABLE("omegaPull", getHelixOmegaPull, "mc-meas/err_meas for omega");
521  REGISTER_VARIABLE("z0Pull", getHelixZ0Pull, "mc-meas/err_meas for z0");
522  REGISTER_VARIABLE("tanLambdaPull", getHelixTanLambdaPull, "mc-meas/err_meas for tanLambda");
523 
524  REGISTER_VARIABLE("nCDCHits", trackNCDCHits, "Number of CDC hits associated to the track");
525  REGISTER_VARIABLE("nSVDHits", trackNSVDHits, "Number of SVD hits associated to the track");
526  REGISTER_VARIABLE("nPXDHits", trackNPXDHits, "Number of PXD hits associated to the track");
527  REGISTER_VARIABLE("nVXDHits", trackNVXDHits, "Number of PXD and SVD hits associated to the track");
528  REGISTER_VARIABLE("ndf", trackNDF,
529  R"DOC(Number of degrees of freedom of the track fit. Note that it is not NHIT-5 due to outlier hit rejection.
530 For mdst versions < 5.1, returns quiet_NaN().)DOC"
531  );
532  REGISTER_VARIABLE("chi2", trackChi2,
533  R"DOC(Chi2 of the track fit.
534 Computed based on pValue and ndf. Note that for pValue exactly equal to 0 it returns infinity().
535 For mdst versions < 5.1, returns quiet_NaN().)DOC");
536  REGISTER_VARIABLE("firstSVDLayer", trackFirstSVDLayer, "First activated SVD layer associated to the track");
537  REGISTER_VARIABLE("firstPXDLayer", trackFirstPXDLayer, "First activated PXD layer associated to the track");
538  REGISTER_VARIABLE("firstCDCLayer", trackFirstCDCLayer, "First activated CDC layer associated to the track");
539  REGISTER_VARIABLE("lastCDCLayer", trackLastCDCLayer, "Last CDC layer associated to the track");
540  REGISTER_VARIABLE("d0", trackD0, "Signed distance to the POCA in the r-phi plane");
541  REGISTER_VARIABLE("phi0", trackPhi0, "Angle of the transverse momentum in the r-phi plane");
542  REGISTER_VARIABLE("omega", trackOmega, "Curvature of the track");
543  REGISTER_VARIABLE("z0", trackZ0, "z coordinate of the POCA");
544  REGISTER_VARIABLE("tanlambda", trackTanLambda, "Slope of the track in the r-z plane");
545  REGISTER_VARIABLE("d0Err", trackD0Error, "Error of signed distance to the POCA in the r-phi plane");
546  REGISTER_VARIABLE("phi0Err", trackPhi0Error, "Error of angle of the transverse momentum in the r-phi plane");
547  REGISTER_VARIABLE("omegaErr", trackOmegaError, "Error of curvature of the track");
548  REGISTER_VARIABLE("z0Err", trackZ0Error, "Error of z coordinate of the POCA");
549  REGISTER_VARIABLE("tanlambdaErr", trackTanLambdaError, "Error of slope of the track in the r-z plane");
550  REGISTER_VARIABLE("pValue", trackPValue, "chi2 probalility of the track fit");
551  REGISTER_VARIABLE("trackFitHypothesisPDG", trackFitHypothesisPDG, "PDG code of the track hypothesis actually used for the fit");
552  REGISTER_VARIABLE("trackNECLClusters", trackNECLClusters,
553  "Number ecl clusters matched to the track. This is always 0 or 1 with newer versions of ECL reconstruction.");
554  REGISTER_VARIABLE("helixExtTheta", trackHelixExtTheta,
555  "Returns theta of extrapolated helix parameters (parameters (in cm): radius, z fwd, z bwd)");
556  REGISTER_VARIABLE("helixExtPhi", trackHelixExtPhi,
557  "Returns phi of extrapolated helix parameters (parameters (in cm): radius, z fwd, z bwd)");
558 
559  REGISTER_VARIABLE("nExtraCDCHits", nExtraCDCHits, "[Eventbased] The number of CDC hits in the event not assigned to any track");
560  REGISTER_VARIABLE("nExtraCDCHitsPostCleaning", nExtraCDCHitsPostCleaning,
561  "[Eventbased] The number of CDC hits in the event not assigned to any track nor very likely beam background (i.e. hits that survive a cleanup selection)");
562  REGISTER_VARIABLE("hasExtraCDCHitsInLayer(i)", hasExtraCDCHitsInLayer,
563  "[Eventbased] Returns 1 if a non-assigned hit exists in the specified CDC layer");
564  REGISTER_VARIABLE("hasExtraCDCHitsInSuperLayer(i)", hasExtraCDCHitsInSuperLayer,
565  "[Eventbased] Returns 1 if a non-assigned hit exists in the specified CDC SuperLayer");
566  REGISTER_VARIABLE("nExtraCDCSegments", nExtraCDCSegments, "[Eventbased] The number of CDC segments not assigned to any track");
567  // TODO: once the Tracking group fill the dataobject these can be
568  // uncommented - at the moment they are not filled, so leave out
569  //REGISTER_VARIABLE("nExtraVXDHitsInLayer(i)", nExtraVXDHitsInLayer,
570  //"[Eventbased] The number VXD hits not assigned in the specified VXD layer");
571  //REGISTER_VARIABLE("nExtraVXDHits", nExtraVXDHits, "[Eventbased] The number of VXD hits not assigned to any track");
572  //REGISTER_VARIABLE("svdFirstSampleTime", svdFirstSampleTime, "[Eventbased] The time of first SVD sample relatvie to event T0");
573  REGISTER_VARIABLE("trackFindingFailureFlag", trackFindingFailureFlag,
574  "[Eventbased] A flag set by the tracking if there is reason to assume there was a track in the event missed by the tracking, "
575  "or the track finding was (partly) aborted for this event.");
576 
577 
578  }
580 }
Belle2::UncertainHelix
This class represents an ideal helix in perigee parameterization including the covariance matrix of t...
Definition: UncertainHelix.h:40
Belle2::BFieldManager::getField
static void getField(const double *pos, double *field)
return the magnetic field at a given position.
Definition: BFieldManager.h:110
Belle2::TrackFitResult
Values of the result of a track fit with a given particle hypothesis.
Definition: TrackFitResult.h:59
Belle2::Unit::T
static const double T
[tesla]
Definition: Unit.h:130
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::UncertainHelix::getCovariance
const TMatrixDSym & getCovariance() const
Getter for covariance matrix of perigee parameters in matrix form.
Definition: UncertainHelix.h:104
Belle2::CDC::Helix
Helix parameter class.
Definition: Helix.h:51
Belle2::TrackFitResult::getUncertainHelix
UncertainHelix getUncertainHelix() const
Conversion to framework Uncertain Helix (i.e., with covariance).
Definition: TrackFitResult.h:234
Belle2::Const::ChargedStable
Provides a type-safe way to pass members of the chargedStableSet set.
Definition: Const.h:465
Belle2::Track
Class that bundles various TrackFitResults.
Definition: Track.h:35