NAIA  1.1.1
TofFill.cpp
Go to the documentation of this file.
1 #include "Containers/Tof.h"
2 
3 namespace NAIA {
4 using namespace Tof;
5 
6 bool TofBaseData::Fill(BetaR *betaPtr, BetaHR *betahPtr, bool standalone, bool use_mc_beta) {
7  if (!betahPtr)
8  return false;
9 
10  if (betaPtr && !standalone) {
11  Beta[BetaType::Evgeni] = betaPtr->Beta;
12  }
13 
14  if (_isMC && use_mc_beta) {
15  Beta[BetaType::BetaH] = betahPtr->GetMCBeta();
16  } else {
17  if (_isMC) {
18  betahPtr->DoMCtune();
19  }
20  Beta[BetaType::BetaH] = betahPtr->GetBeta();
21  }
22 
23  auto betah = _isMC ? betahPtr->GetMCBeta() : betahPtr->GetBeta();
24  Beta[BetaType::BetaH] = betah;
25 
26  int nlayers = 0;
27  float qrms = 0;
28  if (standalone || betahPtr->IsGoodQPathL(0) || betahPtr->IsGoodQPathL(1))
29  Charge[ChargeType::Upper] =
30  betahPtr->GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon,
31  1000 * betahPtr->IsGoodQPathL(0) + 100 * betahPtr->IsGoodQPathL(1), betah);
32  if (standalone || betahPtr->IsGoodQPathL(2) || betahPtr->IsGoodQPathL(3))
33  Charge[ChargeType::Lower] = betahPtr->GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon,
34  10 * betahPtr->IsGoodQPathL(2) + 1 * betahPtr->IsGoodQPathL(3), betah);
35  if (((betahPtr->IsGoodQPathL(0) || betahPtr->IsGoodQPathL(1)) &&
36  (betahPtr->IsGoodQPathL(2) || betahPtr->IsGoodQPathL(3))) ||
37  standalone)
38  Charge[ChargeType::Total] = betahPtr->GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon,
39  1000 * betahPtr->IsGoodQPathL(0) + 100 * betahPtr->IsGoodQPathL(1) +
40  10 * betahPtr->IsGoodQPathL(2) + 1 * betahPtr->IsGoodQPathL(3),
41  betah);
42 
43  ChargeNoPL[ChargeType::Upper] = betahPtr->GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon, 1100, betah);
44  ChargeNoPL[ChargeType::Lower] = betahPtr->GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon, 11, betah);
45  ChargeNoPL[ChargeType::Total] = betahPtr->GetQ(nlayers, qrms, 2, TofClusterHR::DefaultQOptIon, 1111, betah);
46 
47  double tofh_time;
48  AMSPoint tofh_point;
49  AMSDir tofh_dir;
50  betahPtr->TInterpolate(tofRefZ, tofh_point, tofh_dir, tofh_time, false);
51  m_pointAndDir.emplace_back(tofh_point.x(), tofh_point.y(), tofh_point.z());
52  m_pointAndDir.emplace_back(tofh_dir.x(), tofh_dir.y(), tofh_dir.z());
53 
54  return true;
55 }
56 
57 void TofPlusData::ResizeMembers() { LayerGoodPathl.resize(4); }
58 
59 bool TofPlusData::Fill(BetaR *betaPtr, BetaHR *betahPtr, bool standalone) {
60  auto *evPtr = AMSEventR::Head();
61 
62  if (!betahPtr)
63  return false;
64 
65  if (betaPtr && !standalone) {
66  BetaPattern[BetaType::Evgeni] = static_cast<short>(betaPtr->Pattern);
67  }
68 
69  short tofhbetapatt = 0;
70  for (int i = 0; i < 4; i++) {
71  if (!(betahPtr->TestExistHL(i))) {
72  tofhbetapatt = static_cast<short>(tofhbetapatt | (1 << i));
73  }
74  }
75  BetaPattern[BetaType::BetaH] = tofhbetapatt;
76 
77  Chi2Coo = betahPtr->GetNormChi2C();
78  Chi2Time = betahPtr->GetNormChi2T();
79 
80  NTrkClusters = static_cast<short>(betahPtr->GetSumHit());
81  NBetaClusters = static_cast<short>(betahPtr->GetUseHit());
82 
83  // this is fucking bad. 4 lines to get one variable. (FOR FUCK'S SAKE STOP USING REFERENCES FOR OUTPUT!!!)
84  int nhit;
85  float qrms;
86  betahPtr->GetQ(nhit, qrms);
87  NChargeClusters = static_cast<short>(nhit);
88 
89  // same here... gbatch has the mother of all bad APIs
90  ChargeLikelihoodEst = betahPtr->GetZ(nhit, ChargeLikelihoodProb);
91 
92  ResizeMembers();
93  for (int ip = 0; ip < 4; ip++) {
94  LayerGoodPathl[ip] = betahPtr->IsGoodQPathL(ip);
95 
96  float layer_charge = betahPtr->GetQL(ip);
97  if (layer_charge > 0.0f) {
98  LayerCharge[ip] = layer_charge;
99  }
100  if (betahPtr->GetClusterHL(ip)) {
101  LayerEdep[ip] = betahPtr->GetClusterHL(ip)->GetEdep();
102  }
103 
104  // taken from dbar code
105  if (betahPtr->TestExistHL(ip)) {
106  float ltime = betahPtr->GetTime(ip); // ns
107  for (auto &cluster : evPtr->TofClusterH()) {
108  if (cluster.Layer != ip || (cluster.NBetaHUsed() > 0) || !cluster.IsGoodTime())
109  continue;
110 
111  float dt = cluster.Time - ltime; // later cluster has positive dt
112  float tcut = ip < 2 ? 10 : 4; // 10ns for top layers, 4 ns for bottom layers
113 
114  int itm = -1;
115  if (std::fabs(dt) <= tcut)
116  itm = 0; // around-time hits ("in time")
117  else if (dt > tcut)
118  itm = 1; // later hits ("off time")
119 
120  switch (itm) {
121  case 0:
122  NClusters[ip][BetaClusterType::OnTime]++;
123  AverageDTime[ip][BetaClusterType::OnTime] += dt;
124  AverageEdep[ip][BetaClusterType::OnTime] += cluster.GetEdep();
125  break;
126  case 1:
127  NClusters[ip][BetaClusterType::OffTime]++;
128  AverageDTime[ip][BetaClusterType::OffTime] += dt;
129  AverageEdep[ip][BetaClusterType::OffTime] += cluster.GetEdep();
130  break;
131  default:
132  break;
133  }
134  }
135  }
136  }
137  return true;
138 }
139 
140 } // namespace NAIA
NAIA::TofPlusData::ResizeMembers
void ResizeMembers()
Definition: TofFill.cpp:57
NAIA::TrdK::Upper
@ Upper
Charge estimated using the upper half of the TRD.
Definition: Utils.h:236
NAIA::Tof::tofRefZ
const float tofRefZ
Definition: Utils.h:331
NAIA::Tof::OffTime
@ OffTime
Definition: Utils.h:364
NAIA::TrdK::Total
@ Total
Charge estimated using the whole TRD.
Definition: Utils.h:235
NAIA::Tof::Evgeni
@ Evgeni
Definition: Utils.h:353
NAIA
Definition: Event.h:13
NAIA::Tof::BetaH
@ BetaH
IHEP reconstruction.
Definition: Utils.h:352
NAIA::TrdK::Lower
@ Lower
Charge estimated using the lower half of the TRD.
Definition: Utils.h:237
Tof.h
Tof container class description.
NAIA::Tof::OnTime
@ OnTime
Definition: Utils.h:364