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