NAIA
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
TrTrackFill.cpp
Go to the documentation of this file.
1 #include "Containers/TrTrack.h"
3 
4 #include "NtpMaker/NtpTools.h"
5 
6 #include "bcorr.h"
7 
8 #include <iostream>
9 
10 namespace NAIA {
11 using namespace TrTrack;
12 
13 static double RigidityCorrection() {
14  float rigidityCorrection = 1;
15  float fact;
16  int retv(0);
17  float mfcor[2] = {0, 0};
18  retv = MagnetVarp::btempcor(fact, 0, 1);
19  if (retv == 0)
20  mfcor[0] = fact;
21  retv = MagnetVarp::btempcor(fact, 0, 2);
22  if (retv == 0)
23  mfcor[1] = fact;
24  if (mfcor[0] && mfcor[1])
25  rigidityCorrection = (mfcor[0] + mfcor[1]) / 2;
26  else if (mfcor[0])
27  rigidityCorrection = mfcor[0];
28  else if (mfcor[1])
29  rigidityCorrection = mfcor[1];
30 
31  return rigidityCorrection == 0 ? 1 : rigidityCorrection;
32 }
33 
34 static std::array<unsigned long int, numSpans> patterns = {3, 5, 6, 7, 0, 0, 3};
35 std::array<int, numFits> fitAlgoCode{1, 6};
36 static bool TrackHasExtHits(TrTrackR *trackPtr, Span span) {
37  switch (span) {
38  case Span::InnerOnly:
39  return true;
40  case Span::InnerL1:
41  return trackPtr->TestHitLayerJHasXY(1);
42  case Span::InnerL9:
43  return trackPtr->TestHitLayerJHasXY(9);
44  case Span::FullSpan:
45  return (trackPtr->TestHitLayerJHasXY(1) && trackPtr->TestHitLayerJHasXY(9));
48  case Span::InnerNoMS:
49  return true;
50  default:
51  throw std::runtime_error("Span not supported");
52  }
53 }
54 
55 static constexpr std::array<double, 9> powersOfTen = {1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8};
56 
57 void ComputePatterns(TrTrackR *trackPtr) {
59 
60  for (int il = 2; il < 9; il++) {
61  if (!trackPtr->TestHitLayerJ(il))
62  continue;
63 
64  if (il < 7) {
65  patterns[Span::UpperHalfInner] += static_cast<unsigned long int>(9 * powersOfTen[il - 1]);
66  }
67 
68  if (il > 2) {
69  patterns[Span::LowerHalfInner] += static_cast<unsigned long int>(9 * powersOfTen[il - 1]);
70  }
71  }
72 }
73 
74 bool TrTrackBaseData::_FitIDExists(Fit fit, Span span) const {
75  auto itr = _fit_ID.find(fit);
76  if (itr == end(_fit_ID)) {
77  return false;
78  }
79 
80  auto fit_ID_itr = itr->second.find(span);
81  if (fit_ID_itr == end(itr->second)) {
82  return false;
83  }
84 
85  return (fit_ID_itr->second > 0);
86 }
87 
88 Span TrTrackBaseData::_GetBestSpan(Fit fit) const {
89  Span bestspan = _FitIDExists(fit, Span::FullSpan)
91  : (_FitIDExists(fit, Span::InnerL1) > 0
93  : (_FitIDExists(fit, Span::InnerL9) > 0 ? Span::InnerL9 : Span::InnerOnly));
94  return bestspan;
95 }
96 
97 void TrTrackBaseData::Fill(TrTrackR *trackPtr) {
98  // some helper default variables
99  static const int refit = _isMC ? 3 : 1;
100 
101  const float tmpCharge = floor(trackPtr->GetInnerQ_all(_beta).Mean + 0.5);
102  const float fitMass = tmpCharge > 1 ? static_cast<float>(0.5 * TrFit::Mhelium * tmpCharge) : TrTrackR::DefaultMass;
103 
104  ComputePatterns(trackPtr);
105 
106  // Rigidity
107  for (auto fit : fitTypes) {
108  // Kalman with electron mass hyp. to be done in dedicated fill method
109  if (fit == Fit::KalmanElectron)
110  continue;
111 
112  for (auto span : spanTypes) {
113  if (TrackHasExtHits(trackPtr, span)) {
114  Logging::MuteOutput(); // this can get quite verbose...
115  _fit_ID[fit][span] =
116  trackPtr->iTrTrackPar(fitAlgoCode[fit], static_cast<int>(patterns[span]), 20 + refit, fitMass, tmpCharge);
118  if (_fit_ID[fit][span] > 0) {
119  RigidityCorr[fit][span] =
120  static_cast<float>(_isMC ? trackPtr->GetRigidity(_fit_ID[fit][span], 1) // no corr for MC
121  : trackPtr->GetCorrectedRigidity(_fit_ID[fit][span], 3, 1));
122  TrChiSq[fit][span][Side::X] =
123  static_cast<float>(trackPtr->GetChisqX(_fit_ID[fit][span]) / trackPtr->GetNdofX(_fit_ID[fit][span]));
124  TrChiSq[fit][span][Side::Y] =
125  static_cast<float>(trackPtr->GetChisqY(_fit_ID[fit][span]) / trackPtr->GetNdofY(_fit_ID[fit][span]));
126  }
127  }
128  }
129  }
130 
131  // Charge
132  // - Inner tracker
133  Charge[ChargeRecoType::STD] = trackPtr->GetQ_all(_beta).Mean;
134  Charge[ChargeRecoType::HL] = trackPtr->GetQH_all(2, _beta).Mean;
135  // Charge[ChargeRecoType::YJ] does not support "global" charge;
136  InnerCharge[ChargeRecoType::STD] = trackPtr->GetInnerQ_all(_beta).Mean;
137  InnerCharge[ChargeRecoType::HL] = trackPtr->GetInnerQH_all(2, _beta).Mean;
138  InnerCharge[ChargeRecoType::YJ] = trackPtr->GetQYJ_all(2, _beta).InnerQ;
139 
140  // - single layers
141  for (int ijl = 0; ijl < 9; ijl++) {
142  Fit fit = Fit::Choutko;
143  Span span = Span::NoSpan;
144  switch (ijl + 1) {
145  case 1:
146  span = Span::InnerL1;
147  break;
148  case 2:
149  case 3:
150  case 4:
151  case 5:
152  case 6:
153  case 7:
154  case 8:
155  span = Span::InnerOnly;
156  break;
157  case 9:
158  span = Span::InnerL9;
159  break;
160  }
161 
162  if (trackPtr->GetHitLJ(ijl + 1)) {
163  LayerChargeStatus[ijl] = trackPtr->GetHitLJ(ijl + 1)->GetQStatus();
164 
165  float rigidity = (_fit_ID[fit][span] > 0)
166  ? RigidityCorr[fit][span]
167  : ((_fit_ID[fit][Span::InnerOnly] > 0) ? RigidityCorr[fit][Span::InnerOnly] : 0);
168 
169  LayerChargeXY[ijl][ChargeRecoType::STD] = trackPtr->GetHitLJ(ijl + 1)->GetQ(2, _beta, rigidity);
170  LayerChargeXY[ijl][ChargeRecoType::HL] = trackPtr->GetLayerJQH(ijl + 1, 2, _beta, _fit_ID[fit][span]);
171  LayerChargeXY[ijl][ChargeRecoType::YJ] = trackPtr->GetLayerQYJ(ijl + 1, 2, _beta, _fit_ID[fit][span]);
172  }
173  }
174 }
175 
176 void TrTrackPlusData::Fill(TrTrackR *trackPtr) {
177  const auto &_beta = trkBase->_beta;
178  const int refit = trkBase->_isMC ? 3 : 1;
179  static unsigned int prescaleCounter = 0;
180  static float prescaleRigidityThreshold = -1; // -1 GV
181 
182  if (trkBase->InnerCharge.empty())
183  return;
184 
185  auto *pev = AMSEventR::Head();
186 
187  const float tmpCharge = floor(trkBase->InnerCharge.at(ChargeRecoType::STD) + 0.5);
188  const float fitMass = tmpCharge > 1 ? static_cast<float>(0.5 * TrFit::Mhelium * tmpCharge) : TrTrackR::DefaultMass;
189 
190  auto getPartialPattern = [](TrTrackR *track, unsigned int jLayer) {
191  unsigned int pattern = 0;
192  for (unsigned int ijl = 2; ijl < 9; ijl++) {
193  if (track->TestHitLayerJ(ijl) && ijl != jLayer)
194  pattern += 9 * powersOfTen[ijl - 1];
195  }
196  return pattern;
197  };
198 
199  for (unsigned int ijl = 2; ijl < 9; ijl++) {
200  TrackFeetDistance[ijl - 1] = pev->GetTkFeetDist(ijl, trackPtr);
201  }
202 
203  // Rigidity
204  for (auto fit : fitTypes) {
205  // Kalman with electron mass hyp. to be done in dedicated fill method
206  if (fit == Fit::KalmanElectron)
207  continue;
208 
209  for (auto span : spanTypes) {
210  if (trkBase->FitIDExists(fit, span)) {
211  _fit_ID[fit][span] =
212  trackPtr->iTrTrackPar(fitAlgoCode[fit], static_cast<int>(patterns[span]), 20 + refit, fitMass, tmpCharge);
213  if (_fit_ID[fit][span] < 0)
214  continue;
215  Rigidity[fit][span] = static_cast<float>(trackPtr->GetRigidity(_fit_ID[fit][span], 1));
216  if (fit == Fit::Kalman) {
217  RigidityTOI[fit][span] =
218  static_cast<float>(trkBase->_isMC ? trackPtr->GetRigidity(_fit_ID[fit][span], 0)
219  : trackPtr->GetCorrectedRigidity(_fit_ID[fit][span], 3, 0));
220  }
221 
222  const TrTrackPar &trackPar = trackPtr->gTrTrackPar(_fit_ID[fit][span]);
223  InvRigErr[fit][span] = static_cast<float>(trackPar.ErrRinv / (!trackPar.BcorrFlag ? RigidityCorrection() : 1));
224  }
225  }
226 
227  // fill prescaled ("partial") variables
228  // doesn't make sense to try if inner only fit failed...
229  if (trkBase->FitIDExists(fit, Span::InnerOnly)) {
230  bool bypassPrescaling =
231  _beta > 0 && trkBase->RigidityCorr.at(fit).at(Span::InnerOnly) < prescaleRigidityThreshold;
232 
233  if (!prescaleCounter || bypassPrescaling) {
234  for (unsigned int ijl = 2; ijl < 9; ijl++) {
235  if (trackPtr->TestHitLayerJ(ijl))
236  continue;
237  auto partialPattern = getPartialPattern(trackPtr, ijl);
238 
239  int pfit_ID = trackPtr->iTrTrackPar(fitAlgoCode[fit], partialPattern, 20 + refit, fitMass, tmpCharge);
240  if (pfit_ID < 0)
241  continue;
242 
243  const TrTrackPar &partialTrackPar = trackPtr->gTrTrackPar(pfit_ID);
244  PartialRigidity[ijl - 1][fit] =
245  partialTrackPar.Rigidity * (!partialTrackPar.BcorrFlag ? RigidityCorrection() : 1);
246  PartialInvRigErr[ijl - 1][fit] =
247  partialTrackPar.ErrRinv / (!partialTrackPar.BcorrFlag ? RigidityCorrection() : 1);
248  PartialTrChiSq[ijl - 1][fit][Side::X] = static_cast<float>(partialTrackPar.ChisqX / partialTrackPar.NdofX);
249  PartialTrChiSq[ijl - 1][fit][Side::Y] = static_cast<float>(partialTrackPar.ChisqY / partialTrackPar.NdofY);
250  }
251  }
252  }
253  }
254 
255  prescaleCounter = ++prescaleCounter % 100;
256 
257  // Charge
258  // - Inner tracker
259  ChargeRMS[ChargeRecoType::STD] = trackPtr->GetQ_all(_beta).RMS;
260  ChargeRMS[ChargeRecoType::HL] = trackPtr->GetQH_all(2, _beta).RMS;
261  // ChargeRMS[ChargeRecoType::YJ] = trackPtr->GetQYJ_all(2, _beta).InnerQRMS;
262  InnerChargeRMS[ChargeRecoType::STD] = trackPtr->GetInnerQ_all(_beta).RMS;
263  InnerChargeRMS[ChargeRecoType::HL] = trackPtr->GetInnerQH_all(2, _beta).RMS;
264  InnerChargeRMS[ChargeRecoType::YJ] = trackPtr->GetQYJ_all(2, _beta).InnerQRMS;
265 
266  // - single layers
267  for (int ijl = 0; ijl < 9; ijl++) {
268  Fit fit = Fit::Choutko;
269  Span span = Span::NoSpan;
270  switch (ijl + 1) {
271  case 1:
272  span = Span::InnerL1;
273  break;
274  case 2:
275  case 3:
276  case 4:
277  case 5:
278  case 6:
279  case 7:
280  case 8:
281  span = Span::InnerOnly;
282  break;
283  case 9:
284  span = Span::InnerL9;
285  break;
286  }
287 
288  int fit_ID = 0;
289  if (trkBase->FitIDExists(fit, span))
290  fit_ID = _fit_ID.at(fit).at(span);
291 
292  if (trackPtr->GetHitLJ(ijl + 1)) {
293  float rigidity =
294  (_fit_ID[fit][span] > 0)
295  ? trkBase->RigidityCorr.at(fit).at(span)
296  : ((_fit_ID[fit][Span::InnerOnly] > 0) ? trkBase->RigidityCorr.at(fit).at(Span::InnerOnly) : 0);
297 
298  LayerCharge[ijl][ChargeRecoType::STD][Side::X] = trackPtr->GetHitLJ(ijl + 1)->GetQ(0, _beta, rigidity);
299  LayerCharge[ijl][ChargeRecoType::HL][Side::X] = trackPtr->GetLayerJQH(ijl + 1, 0, _beta, fit_ID);
300  LayerCharge[ijl][ChargeRecoType::YJ][Side::X] = trackPtr->GetLayerQYJ(ijl + 1, 0, _beta, fit_ID);
301 
302  if (trackPtr->GetHitLJ(ijl + 1)->GetXCluster())
303  LayerEdep[ijl][Side::X] = trackPtr->GetHitLJ(ijl + 1)->GetXCluster()->GetEdep();
304  if (trackPtr->GetHitLJ(ijl + 1)->GetYCluster())
305  LayerEdep[ijl][Side::Y] = trackPtr->GetHitLJ(ijl + 1)->GetYCluster()->GetEdep();
306 
307  LayerCharge[ijl][ChargeRecoType::STD][Side::Y] = trackPtr->GetHitLJ(ijl + 1)->GetQ(1, _beta, rigidity);
308  LayerCharge[ijl][ChargeRecoType::HL][Side::Y] = trackPtr->GetLayerJQH(ijl + 1, 1, _beta, fit_ID);
309  LayerCharge[ijl][ChargeRecoType::YJ][Side::Y] = trackPtr->GetLayerQYJ(ijl + 1, 1, _beta, fit_ID);
310  }
311  }
312 
313  // geometry and position
314  for (int ijl = 0; ijl < 9; ijl++) {
315  if (trackPtr->GetHitLJ(ijl + 1) && trackPtr->GetHitLJ(ijl + 1)->GetXCluster())
316  TrTrackHitPos[ijl][Side::X] = static_cast<float>(trackPtr->GetHitCooLJ(ijl + 1).x());
317  if (trackPtr->GetHitLJ(ijl + 1) && trackPtr->GetHitLJ(ijl + 1)->GetYCluster())
318  TrTrackHitPos[ijl][Side::Y] = static_cast<float>(trackPtr->GetHitCooLJ(ijl + 1).y());
319  }
320 
321  for (const auto fitPos : fitPositionHeights) {
322  // TODO: compute track position at Ecal COG
323  for (auto fit : fitTypes) {
324  for (auto span : spanTypes) {
325  if (trkBase->FitIDExists(fit, span)) {
326  int fit_ID = _fit_ID.at(fit).at(span);
327  if (fit_ID < 0)
328  continue;
329  AMSPoint trackPos;
330  AMSDir trackDir;
331  trackPtr->Interpolate(fitPositionHeightZ[fitPos], trackPos, trackDir, fit_ID);
332  TrTrackFitPos[fitPos][fit][span][Side::X] = static_cast<float>(trackPos.x());
333  TrTrackFitPos[fitPos][fit][span][Side::Y] = static_cast<float>(trackPos.y());
334  }
335  }
336  }
337  }
338 
339  Span bestspan = trkBase->GetBestSpan(Fit::Choutko);
340  if (_fit_ID.at(Fit::Choutko).at(bestspan) > 0) {
341  Theta = static_cast<float>(trackPtr->GetTheta(_fit_ID.at(Fit::Choutko).at(bestspan)));
342  Phi = static_cast<float>(trackPtr->GetPhi(_fit_ID.at(Fit::Choutko).at(bestspan)));
343  }
344 
345  for (auto fit : fitTypes) {
346  for (auto span : spanTypes) {
347  if (trkBase->FitIDExists(fit, span)) {
348  int fit_ID = _fit_ID.at(fit).at(span);
349  if (fit_ID < 0)
350  continue;
351  for (int ijl = 0; ijl < 9; ijl++) {
352  if (trackPtr->GetHitLJ(ijl + 1)) {
353  AMSPoint point = trackPtr->GetResidualJ(ijl + 1, fit_ID);
354  TrTrackResidual[ijl][fit][span][Side::X] = static_cast<float>(point.x());
355  TrTrackResidual[ijl][fit][span][Side::Y] = static_cast<float>(point.y());
356  }
357  }
358  }
359  }
360  }
361 
362  static constexpr std::array<float, 5> window = {0.1, 1., 2., 5., 10.};
363 
364  // from dbar code
365  for (int jLayer = 1; jLayer <= 9; jLayer++) {
366  ClusterSignalRatio[jLayer - 1] = pev->GetTrackerRawSignalRatio(jLayer, 10);
367 
368  // identify the clusters used in trtrack
369  TrClusterR *trackClusterPtrX = trackPtr->GetHitLJ(jLayer) ? trackPtr->GetHitLJ(jLayer)->GetXCluster() : nullptr;
370  TrClusterR *trackClusterPtrY = trackPtr->GetHitLJ(jLayer) ? trackPtr->GetHitLJ(jLayer)->GetYCluster() : nullptr;
371 
372  // Get track interpolation to jLayer
373  AMSPoint fitcoo;
374  AMSDir fitdir;
375  trackPtr->InterpolateLayerJ(jLayer, fitcoo, fitdir, _fit_ID[Fit::Kalman][Span::InnerOnly]);
376 
377  // TODO: Check if zero threshold is correct
378  static constexpr float noiseThreshold = 0;
379 
380  for (int icl = 0; icl < pev->nTrCluster(); icl++) {
381  auto *cluster = pev->pTrCluster(icl);
382 
383  if (!cluster || cluster->GetLayerJ() != jLayer)
384  continue;
385 
386  float edep = 1000 * cluster->GetEdep();
387  if (cluster == trackClusterPtrX) {
388  NClusters[jLayer - 1][DistanceFromTrack::OnTrack][Side::X]++;
389  ClustersEdep[jLayer - 1][DistanceFromTrack::OnTrack][Side::X] += edep;
390  continue;
391  }
392  if (cluster == trackClusterPtrY) {
393  NClusters[jLayer - 1][DistanceFromTrack::OnTrack][Side::Y]++;
394  ClustersEdep[jLayer - 1][DistanceFromTrack::OnTrack][Side::Y] += edep;
395  continue;
396  }
397 
398  if (edep < noiseThreshold)
399  continue; // apply a threshold to account for noise
400 
401  // Deal with multiplicities: Choose closest to track
402  float clusterDistanceToTrack = std::numeric_limits<float>::max();
403  for (int im = 0; im < cluster->GetMultiplicity(); im++) {
404  float coo = cluster->GetGCoord(im);
405 
406  clusterDistanceToTrack =
407  std::min(clusterDistanceToTrack, fabs(static_cast<float>(fitcoo[cluster->GetSide()] - coo)));
408  }
409 
410  Side side = cluster->GetSide() == 0 ? Side::X : Side::Y;
411 
412  NClusters[jLayer - 1][DistanceFromTrack::AllLayer][side]++;
413  ClustersEdep[jLayer - 1][DistanceFromTrack::AllLayer][side] += edep;
414  if (edep > MaxClusterEdep[jLayer - 1][side]) {
415  MaxClusterEdep[jLayer - 1][side] = edep;
416  MaxClusterDistance[jLayer - 1][side] = clusterDistanceToTrack;
417  }
418 
419  // FIXME: I don't really like using an int instead of the right enum
420  for (unsigned int iw = 0; iw < window.size(); iw++) {
421  if (std::fabs(clusterDistanceToTrack) < window[iw]) {
422  NClusters[jLayer - 1][static_cast<DistanceFromTrack>(iw + 1)][side]++;
423  ClustersEdep[jLayer - 1][static_cast<DistanceFromTrack>(iw + 1)][side] += edep;
424  }
425  }
426  }
427  }
428 }
429 
430 void TrTrackBaseData::FillElectronVars(TrTrackR *trackPtr, bool refitKalman) {
431  // Rigidity
432  auto fit = Fit::KalmanElectron;
433  auto span = _GetBestSpan(Fit::Kalman);
434 
435  if (TrackHasExtHits(trackPtr, span) && refitKalman) {
436  Logging::MuteOutput(); // this can get quite verbose...
437  _fit_ID[fit][span] = trackPtr->iTrTrackPar(fitAlgoCode[fit], static_cast<int>(patterns[span]), 22,
438  static_cast<float>(TrFit::Melectron), 1);
440  if (_fit_ID[fit][span] > 0) {
441  RigidityCorr[fit][span] =
442  static_cast<float>(_isMC ? trackPtr->GetRigidity(_fit_ID[fit][span], 1) // no corr for MC
443  : trackPtr->GetCorrectedRigidity(_fit_ID[fit][span], 3, 1));
444  TrChiSq[fit][span][Side::X] =
445  static_cast<float>(trackPtr->GetChisqX(_fit_ID[fit][span]) / trackPtr->GetNdofX(_fit_ID[fit][span]));
446  TrChiSq[fit][span][Side::Y] =
447  static_cast<float>(trackPtr->GetChisqY(_fit_ID[fit][span]) / trackPtr->GetNdofY(_fit_ID[fit][span]));
448  }
449  }
450 }
451 
452 void TrTrackPlusData::FillElectronVars(TrTrackR *trackPtr, float zEcalCOG, bool refitKalman) {
453  const auto &base_fit_ID = trkBase->_fit_ID;
454 
455  // Get Electron fit rigidity and chisquares
456  {
457  auto fit = Fit::KalmanElectron;
458  auto span = trkBase->GetBestSpan(Fit::Kalman);
459  if (trkBase->FitIDExists(fit, span) && refitKalman) {
460  int fit_ID = base_fit_ID.at(fit).at(span);
461  Rigidity[fit][span] = static_cast<float>(trackPtr->GetRigidity(fit_ID, 1));
462  RigidityTOI[fit][span] = static_cast<float>(trkBase->_isMC ? trackPtr->GetRigidity(fit_ID, 0)
463  : trackPtr->GetCorrectedRigidity(fit_ID, 3, 0));
464  const TrTrackPar &trackPar = trackPtr->gTrTrackPar(fit_ID);
465  InvRigErr[fit][span] = static_cast<float>(trackPar.ErrRinv / (!trackPar.BcorrFlag ? RigidityCorrection() : 1));
466  }
467  }
468 
469  if (zEcalCOG < std::numeric_limits<float>::max()) {
470  for (auto fit : fitTypes) {
471  for (auto span : spanTypes) {
472  if (trkBase->FitIDExists(fit, span)) {
473  int fit_ID = base_fit_ID.at(fit).at(span);
474  AMSPoint trackPos;
475  AMSDir trackDir;
476  trackPtr->Interpolate(zEcalCOG, trackPos, trackDir, fit_ID);
477  TrTrackFitPos[FitPositionHeight::EcalCOG][fit][span][Side::X] = static_cast<float>(trackPos.x());
478  TrTrackFitPos[FitPositionHeight::EcalCOG][fit][span][Side::Y] = static_cast<float>(trackPos.y());
479  }
480  }
481  }
482  }
483 }
484 
485 // void TrTrackPlusData::Fill(const AMSEventR *eventPtr) {}
486 } // namespace NAIA
Hu Liu reconstruction.
Definition: Utils.h:86
Track constructed with the upper part of the inner tracker (layers 2 to 6)
Definition: Utils.h:156
static bool TrackHasExtHits(TrTrackR *trackPtr, Span span)
Definition: TrTrackFill.cpp:36
Track constructed with the upper part of the inner tracker (layers 3 to 8)
Definition: Utils.h:157
static double RigidityCorrection()
Definition: TrTrackFill.cpp:13
constexpr std::array< Span, numSpans > spanTypes
Definition: Utils.h:161
void UnmuteOutput()
Definition: Logging.cpp:36
constexpr std::array< float, numFitPositionHeights > fitPositionHeightZ
Definition: Utils.h:129
void ComputePatterns(TrTrackR *trackPtr)
Definition: TrTrackFill.cpp:57
constexpr std::array< Fit, numFits > fitTypes
Definition: Utils.h:179
Track constructed with inner tracker + layer9 hits.
Definition: Utils.h:154
GenFit kalman filter track fit.
Definition: Utils.h:175
TrTrack container class description.
std::array< int, numFits > fitAlgoCode
Definition: TrTrackFill.cpp:35
SingleTreeChain::EventItr end(SingleTreeChain &chain)
DistanceFromTrack
Definition: Utils.h:207
void MuteOutput()
Definition: Logging.cpp:22
Track constructed without correcting for multiple scattering.
Definition: Utils.h:158
GenFit kalman filter track fit assuming electron mass.
Definition: Utils.h:176
static constexpr std::array< double, 9 > powersOfTen
Definition: TrTrackFill.cpp:55
static std::array< unsigned long int, numSpans > patterns
Definition: TrTrackFill.cpp:34
Yi Jia reconstruction.
Definition: Utils.h:87
Standard tracker charge reconstruction.
Definition: Utils.h:85
constexpr std::array< FitPositionHeight, numFitPositionHeights > fitPositionHeights
Definition: Utils.h:117
standard track fit
Definition: Utils.h:174