ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
S800Ana.cxx
Go to the documentation of this file.
1 #include "S800Ana.h"
2 
3 #include <FairLogger.h>
4 
5 #include <TCollection.h>
6 #include <TCutG.h>
7 #include <TFile.h>
8 #include <TKey.h>
9 #include <TList.h>
10 #include <TObject.h>
11 #include <TString.h>
12 
13 #include "S800Calc.h"
14 
15 #include <algorithm>
16 #include <cmath>
17 #include <iostream>
18 
19 constexpr auto cRED = "\033[1;31m";
20 constexpr auto cYELLOW = "\033[1;33m";
21 constexpr auto cNORMAL = "\033[0m";
22 constexpr auto cGREEN = "\033[1;32m";
23 constexpr auto cBLUE = "\033[1;34m";
24 
26 
28  : fLogger(FairLogger::GetLogger()), fXfObj_ToF(-999), fObjCorr_ToF(-999), fICSum_E(-999), fX0(-999), fX1(-999),
29  fAfp(-999)
30 {
31  fcutPID1.clear();
32  fcutPID2.clear();
33  fcutPID3.clear();
34 
35  fParameters.clear();
36  fTofObjCorr.clear();
37  fMTDCObjRange.clear();
38  fMTDCXfRange.clear();
39 }
40 
41 void S800Ana::Reset()
42 {
43  fXfObj_ToF = -999;
44  fObjCorr_ToF = -999;
45  fICSum_E = -999;
46  fX0 = -999;
47  fX1 = -999;
48  fY0 = -999;
49  fY1 = -999;
50  fAfp = -999;
51  fBfp = -999;
52  return;
53 }
54 
55 void S800Ana::SetPID1cut(std::vector<TString> files)
56 {
57  for (auto &w : files) {
58  TFile f(w);
59  TIter next(f.GetListOfKeys());
60  TKey *key = nullptr;
61 
62  while ((key = dynamic_cast<TKey *>(next()))) {
63  LOG(INFO) << "PID1 Loading Cut file: " << key->GetName();
64  fcutPID1.push_back(dynamic_cast<TCutG *>(f.Get(key->GetName())));
65  }
66  }
67 }
68 void S800Ana::SetPID2cut(std::vector<TString> files)
69 {
70  for (auto &w : files) {
71  TFile f(w);
72  TIter next(f.GetListOfKeys());
73  TKey *key = nullptr;
74 
75  while ((key = dynamic_cast<TKey *>(next()))) {
76  LOG(INFO) << "PID2 Loading Cut file: " << key->GetName();
77  fcutPID2.push_back(dynamic_cast<TCutG *>(f.Get(key->GetName())));
78  }
79  }
80 }
81 void S800Ana::SetPID3cut(std::vector<TString> files)
82 {
83  for (auto &w : files) {
84  TFile f(w);
85  TIter next(f.GetListOfKeys());
86  TKey *key = nullptr;
87 
88  while ((key = dynamic_cast<TKey *>(next()))) {
89  LOG(INFO) << "PID3 Loading Cut file: " << key->GetName();
90  fcutPID3.push_back(dynamic_cast<TCutG *>(f.Get(key->GetName())));
91  }
92  }
93 }
94 void S800Ana::SetParameters(std::vector<Double_t> vec)
95 {
96  fParameters = vec;
97 }
98 void S800Ana::SetTofObjCorr(std::vector<Double_t> vec)
99 {
100  fTofObjCorr = vec;
101 }
102 void S800Ana::SetMTDCObjRange(std::vector<Double_t> vec)
103 {
104  fMTDCObjRange = vec;
105 }
106 void S800Ana::SetMTDCXfRange(std::vector<Double_t> vec)
107 {
108  fMTDCXfRange = vec;
109 }
110 
111 vector<Double_t> S800Ana::GetTofObjCorr()
112 {
113  return fTofObjCorr;
114 }
115 vector<Double_t> S800Ana::GetMTDCObjRange()
116 {
117  return fMTDCObjRange;
118 }
119 vector<Double_t> S800Ana::GetMTDCXfRange()
120 {
121  return fMTDCXfRange;
122 }
123 vector<Double_t> S800Ana::GetParameters()
124 {
125  return fParameters;
126 }
128 {
129  return fXfObj_ToF;
130 }
132 {
133  return fObjCorr_ToF;
134 }
136 {
137  return fICSum_E;
138 }
139 std::vector<Double_t> S800Ana::GetFpVariables()
140 {
141  std::vector<Double_t> result;
142  result.push_back(fX0);
143  result.push_back(fX1);
144  result.push_back(fY0);
145  result.push_back(fY1);
146  result.push_back(fAfp);
147  result.push_back(fBfp);
148  return result;
149 }
150 
151 void S800Ana::Calc(S800Calc *s800calc)
152 {
153  Reset();
154  if (fMTDCXfRange.size() < 2 || fMTDCObjRange.size() < 2 || fTofObjCorr.size() < 2) {
155  LOG(WARNING) << "S800Ana::Calc : MTDCXfRange, MTDCObjRange, TofObjCorr size must be 2 : " << fMTDCXfRange.size()
156  << " " << fMTDCObjRange.size() << " " << fTofObjCorr.size() << " ... skip event";
157  return;
158  }
159  // Double_t S800_timeRf = s800calc->GetMultiHitTOF()->GetFirstRfHit();
160  // Double_t S800_timeE1up = s800calc->GetMultiHitTOF()->GetFirstE1UpHit();
161  // Double_t S800_timeE1down = s800calc->GetMultiHitTOF()->GetFirstE1DownHit();
162  // Double_t S800_timeE1 = sqrt( (corrGainE1up*S800_timeE1up) * (corrGainE1down*S800_timeE1down) );
163  // Double_t S800_timeXf = s800calc->GetMultiHitTOF()->GetFirstXfHit();
164  // Double_t S800_timeObj = s800calc->GetMultiHitTOF()->GetFirstObjHit();
165  vector<Float_t> S800_timeMTDCObj = s800calc->GetMultiHitTOF()->GetMTDCObj();
166  vector<Float_t> S800_timeMTDCXf = s800calc->GetMultiHitTOF()->GetMTDCXf();
167  Float_t S800_timeObjSelect = -999;
168  Float_t S800_timeXfSelect = -999;
169  Int_t CondMTDCXfObj = 0;
170 
171  fX0 = s800calc->GetCRDC(0)->GetX();
172  fX1 = s800calc->GetCRDC(1)->GetX();
173  fY0 = s800calc->GetCRDC(0)->GetY();
174  fY1 = s800calc->GetCRDC(1)->GetY();
175  // Double_t S800_E1up = s800calc->GetSCINT(0)->GetDEup();
176  // Double_t S800_E1down = s800calc->GetSCINT(0)->GetDEdown();
177 
178  fICSum_E = s800calc->GetIC()->GetSum();
179 
180  fAfp = atan((fX1 - fX0) / 1073.);
181  fBfp = atan((fY1 - fY0) / 1073.);
182  // Double_t S800_tofCorr = S800_tof + x0_corr_tof*fX0 + afp_corr_tof*fAfp;// - rf_offset;
183  // Double_t S800_dE = s800calc->GetSCINT(0)->GetDE();//check if is this scint (0)
184  // Double_t S800_dE = sqrt( (corrGainE1up*S800_E1up) * (corrGainE1down* S800_E1down ) );
185  // Double_t S800_dECorr = S800_dE + afp_corr_dE*fAfp + x0_corr_dE*fabs(fX0);
186 
187  for (float k : S800_timeMTDCXf) {
188  if (k > fMTDCXfRange.at(0) && k < fMTDCXfRange.at(1))
189  S800_timeXfSelect = k;
190  }
191  for (float k : S800_timeMTDCObj) {
192  if (k > fMTDCObjRange.at(0) && k < fMTDCObjRange.at(1))
193  S800_timeObjSelect = k;
194  }
195 
196  fXfObj_ToF = S800_timeXfSelect - S800_timeObjSelect;
197 
198  if (S800_timeXfSelect != -999 && S800_timeObjSelect != -999) {
199  fXfObj_ToF = S800_timeXfSelect - S800_timeObjSelect;
200  CondMTDCXfObj = 1;
201  }
202 
203  if (CondMTDCXfObj && std::isnan(fX0) == 0 && std::isnan(fAfp) == 0 && std::isnan(fICSum_E) == 0) {
204  fObjCorr_ToF = S800_timeObjSelect + fTofObjCorr.at(0) * fAfp + fTofObjCorr.at(1) * fX0;
205  }
206 
207  return;
208 }
209 
210 Bool_t S800Ana::isInPID(S800Calc *s800calc)
211 {
212 
213  Calc(s800calc);
214 
215  Bool_t is = kFALSE;
216  Int_t InCondition1 = 0;
217  Int_t InCondition2 = 0;
218  Int_t InCondition3 = 0;
219 
220  // std::cout << " S800Ana : Test var " << fObjCorr_ToF << " " << fXfObj_ToF << " " << fX0 << " "
221  // << fAfp << " " << fObjCorr_ToF << " " << fICSum_E << '\n';
222 
223  for (auto &w : fcutPID1)
224  if (fObjCorr_ToF != -999 && w->IsInside(fObjCorr_ToF, fXfObj_ToF))
225  InCondition1 += 1; // or of PID1
226  for (auto &w : fcutPID2)
227  if (fObjCorr_ToF != -999 && w->IsInside(fX0, fAfp))
228  InCondition2 += 1; // or of PID2
229  for (auto &w : fcutPID3)
230  if (fObjCorr_ToF != -999 && w->IsInside(fObjCorr_ToF, fICSum_E))
231  InCondition3 += 1; // or of PID3
232 
233  if (fcutPID1.size() == 0)
234  InCondition1 = 1;
235  if (fcutPID2.size() == 0)
236  InCondition2 = 1;
237  if (fcutPID3.size() == 0)
238  InCondition3 = 1;
239 
240  // std::cout << " S800Ana : Number of TCutG files " << fcutPID1.size() << " " << fcutPID2.size() << " " <<
241  // fcutPID3.size() << " "
242  // << InCondition1 << " " << InCondition2 << " " << InCondition3 << '\n';
243 
244  Int_t AndofCon = InCondition1 * InCondition2 * InCondition3;
245 
246  if (AndofCon) {
247  is = kTRUE;
248  std::cout << cGREEN << "'And' of S800 PID gates TRUE" << cNORMAL << std::endl;
249  }
250  //----------- New 10/01 -------------------------------------
251  return is;
252 }
CRDC::GetX
Float_t GetX()
Definition: S800Calc.h:105
S800Calc::GetIC
IC * GetIC()
Definition: S800Calc.h:493
S800Ana::SetPID2cut
void SetPID2cut(std::vector< TString > file)
Definition: S800Ana.cxx:68
S800Ana::SetTofObjCorr
void SetTofObjCorr(std::vector< Double_t > vec)
Definition: S800Ana.cxx:98
S800Ana::GetXfObj_ToF
Double_t GetXfObj_ToF()
Definition: S800Ana.cxx:127
S800Ana::SetMTDCXfRange
void SetMTDCXfRange(std::vector< Double_t > vec)
Definition: S800Ana.cxx:106
S800Calc
Definition: S800Calc.h:455
f
double(* f)(double t, const double *par)
Definition: lmcurve.cxx:21
S800Ana::GetParameters
std::vector< Double_t > GetParameters()
Definition: S800Ana.cxx:123
S800Ana::GetFpVariables
std::vector< Double_t > GetFpVariables()
Definition: S800Ana.cxx:139
cNORMAL
constexpr auto cNORMAL
Definition: S800Ana.cxx:21
MultiHitTOF::GetMTDCXf
vector< Float_t > GetMTDCXf()
Definition: S800Calc.h:266
S800Ana::GetMTDCObjRange
std::vector< Double_t > GetMTDCObjRange()
Definition: S800Ana.cxx:115
S800Ana::GetObjCorr_ToF
Double_t GetObjCorr_ToF()
Definition: S800Ana.cxx:131
S800Calc::GetMultiHitTOF
MultiHitTOF * GetMultiHitTOF()
Definition: S800Calc.h:495
cYELLOW
constexpr auto cYELLOW
Definition: S800Ana.cxx:20
S800Ana::isInPID
Bool_t isInPID(S800Calc *s800calc)
Definition: S800Ana.cxx:210
S800Ana::SetPID3cut
void SetPID3cut(std::vector< TString > file)
Definition: S800Ana.cxx:81
S800Ana.h
cGREEN
constexpr auto cGREEN
Definition: S800Ana.cxx:22
MultiHitTOF::GetMTDCObj
vector< Float_t > GetMTDCObj()
Definition: S800Calc.h:268
S800Calc.h
S800Ana::GetTofObjCorr
std::vector< Double_t > GetTofObjCorr()
Definition: S800Ana.cxx:111
S800Ana::GetMTDCXfRange
std::vector< Double_t > GetMTDCXfRange()
Definition: S800Ana.cxx:119
S800Ana::S800Ana
S800Ana()
Definition: S800Ana.cxx:27
S800Ana::GetICSum_E
Double_t GetICSum_E()
Definition: S800Ana.cxx:135
S800Calc::GetCRDC
CRDC * GetCRDC(int id)
Definition: S800Calc.h:489
CRDC::GetY
Float_t GetY()
Definition: S800Calc.h:106
S800Ana::SetParameters
void SetParameters(std::vector< Double_t > vec)
Definition: S800Ana.cxx:94
ClassImp
ClassImp(S800Ana)
IC::GetSum
Float_t GetSum()
Definition: S800Calc.h:380
S800Ana::Calc
void Calc(S800Calc *s800calc)
Definition: S800Ana.cxx:151
S800Ana
Definition: S800Ana.h:19
S800Ana::SetMTDCObjRange
void SetMTDCObjRange(std::vector< Double_t > vec)
Definition: S800Ana.cxx:102
S800Ana::SetPID1cut
void SetPID1cut(std::vector< TString > file)
Definition: S800Ana.cxx:55
cRED
constexpr auto cRED
Definition: S800Ana.cxx:19
cBLUE
constexpr auto cBLUE
Definition: S800Ana.cxx:23