ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtMergeTask.cxx
Go to the documentation of this file.
1 #include "AtMergeTask.h"
2 
3 #include "AtRawEvent.h"
4 
5 #include <FairLogger.h>
6 #include <FairRootManager.h>
7 #include <FairTask.h>
8 
9 #include <Math/ParamFunctor.h>
10 #include <TClonesArray.h>
11 #include <TF1.h>
12 #include <TFile.h>
13 #include <TGraph.h>
14 #include <TObject.h>
15 #include <TTreeReader.h>
16 #include <TTreeReaderValue.h>
17 
18 #include "S800Ana.h"
19 #include "S800Calc.h"
20 
21 #include <algorithm>
22 #include <cmath>
23 #include <iostream>
24 
25 constexpr auto cRED = "\033[1;31m";
26 constexpr auto cYELLOW = "\033[1;33m";
27 constexpr auto cNORMAL = "\033[0m";
28 constexpr auto cGREEN = "\033[1;32m";
29 constexpr auto cBLUE = "\033[1;34m";
30 
32 
33 AtMergeTask::AtMergeTask() : fLogger(FairLogger::GetLogger()), fS800CalcBr(new S800Calc)
34 {
35  fcutPID1File.clear();
36  fcutPID2File.clear();
37  fcutPID3File.clear();
38 
39  fParameters.clear();
40  fTofObjCorr.clear();
41  fMTDCObjRange.clear();
42  fMTDCXfRange.clear();
43 }
44 
46 {
47  fS800TsGraph->Delete();
48  fS800TsFunc->Delete();
49  fS800CalcBr->Delete();
50  fRawEventArray->Delete();
51  delete fS800file;
52 }
53 
54 void AtMergeTask::SetPersistence(Bool_t value)
55 {
56  fIsPersistence = value;
57 }
58 void AtMergeTask::SetS800File(TString file)
59 {
60  fS800File = file;
61 }
62 void AtMergeTask::SetGlom(Double_t glom)
63 {
64  fGlom = glom;
65 }
66 void AtMergeTask::SetOptiEvtDelta(Int_t EvtDelta)
67 {
68  fEvtDelta = EvtDelta;
69 }
70 void AtMergeTask::SetPID1cut(TString file)
71 {
72  fcutPID1File.push_back(file);
73 }
74 void AtMergeTask::SetPID2cut(TString file)
75 {
76  fcutPID2File.push_back(file);
77 }
78 void AtMergeTask::SetPID3cut(TString file)
79 {
80  fcutPID3File.push_back(file);
81 }
82 void AtMergeTask::SetTsDelta(Int_t TsDelta)
83 {
84  fTsDelta = TsDelta;
85 }
86 void AtMergeTask::SetParameters(std::vector<Double_t> vec)
87 {
88  fParameters = vec;
89 }
90 void AtMergeTask::SetTofObjCorr(std::vector<Double_t> vec)
91 {
92  fTofObjCorr = vec;
93 }
94 void AtMergeTask::SetMTDCObjRange(std::vector<Double_t> vec)
95 {
96  fMTDCObjRange = vec;
97 }
98 void AtMergeTask::SetMTDCXfRange(std::vector<Double_t> vec)
99 {
100  fMTDCXfRange = vec;
101 }
102 void AtMergeTask::SetATTPCClock(Bool_t value)
103 {
104  fUseATTPCClock = value;
105 }
106 void AtMergeTask::SetATTPCClockFreq(Double_t value)
107 {
108  fATTPCClockFreq = value;
109 }
110 
112 {
113  return fTsEvtS800Size;
114 }
116 {
117  return fEvtMerged;
118 }
119 
120 Bool_t AtMergeTask::isInGlom(Long64_t ts1, Long64_t ts2)
121 {
122  bool is = false;
123 
124  if (ts1 > 0 && ts2 > 0 && fabs(ts1 - ts2) < fGlom)
125  is = true;
126  return is;
127 }
128 
129 InitStatus AtMergeTask::Init()
130 {
131 
132  FairRootManager *ioMan = FairRootManager::Instance();
133  if (ioMan == nullptr) {
134  LOG(error) << "Cannot find RootManager!";
135  return kERROR;
136  }
137 
138  fRawEventArray = dynamic_cast<TClonesArray *>(ioMan->GetObject("AtRawEvent"));
139  if (fRawEventArray == nullptr) {
140  LOG(error) << "Cannot find AtRawEvent array!";
141  return kERROR;
142  }
143 
144  fTsEvtS800Size = 0;
145  fEvtMerged = 0;
146  fATTPCTs0 = -1;
147  Long64_t S800Ts0 = 0; // special for use of internal AT-TPC TS
148  fATTPCTsPrev = 0;
149 
150  fS800file = new TFile(fS800File); // NOLINT belongs to ROOT
151  TTreeReader reader1("caltree", fS800file);
152  TTreeReaderValue<Long64_t> ts(reader1, "fts");
153 
154  LOG(INFO) << cBLUE << "Loading S800 timestamps..." << cNORMAL;
155  while (reader1.Next()) {
156  fS800Ts.push_back((Long64_t)*ts);
157  // fS800Ts.push_back((Long64_t) *ts - fTsDelta);//special for run180 e18027
158  fS800Evt.push_back((Double_t)fTsEvtS800Size);
159  //------- Special for using internal AT-TPC TS (ex: runs 144 to 168), comment if run149 (but keep the second
160  // special part uncommented)
161  if (fUseATTPCClock) {
162  if (fTsEvtS800Size == 0)
163  S800Ts0 = fS800Ts.at(0);
164  fS800Ts.at(fTsEvtS800Size) -= S800Ts0;
165  if (fTsEvtS800Size < 10)
166  std::cout << "Ts S800 " << fS800Ts.at(fTsEvtS800Size) << " S800Ts0 " << S800Ts0 << std::endl;
167  }
168  //--------
169  fTsEvtS800Size++;
170  }
171  ioMan->Register("s800cal", "S800", fS800CalcBr, fIsPersistence);
172 
173  vector<Double_t> S800_ts(fS800Ts.begin(), fS800Ts.end());
174  // auto c1 = new TCanvas("c1", "c1", 800, 800);
175  // gROOT->SetBatch(kTRUE);//kTRUE not display the plots
176  fS800TsGraph = // NOLINT
177  new TGraph(fTsEvtS800Size, &S800_ts[0], &fS800Evt[0]); // fTsEvtS800Size instead of 80 (just for the test file)
178  // make a function of S800Evt vs S800TS, used then to search the S800 matching TS only among few S800 events, faster
179  // than looping on all the events.
180  fS800TsFunc = new TF1( // NOLINT
181  "fS800TsFunc", [&](double *x, double *) { return fS800TsGraph->Eval(x[0]); }, 0, S800_ts.back(), 0);
182  // c1->cd();
183  // fS800TsGraph->Draw("AL");
184  // fS800TsFunc->Draw("same");
185 
186  fS800Ana.SetPID1cut(fcutPID1File);
187  fS800Ana.SetPID2cut(fcutPID2File);
188  fS800Ana.SetPID3cut(fcutPID3File);
189  fS800Ana.SetMTDCXfRange(fMTDCXfRange);
190  fS800Ana.SetMTDCObjRange(fMTDCObjRange);
191  fS800Ana.SetTofObjCorr(fTofObjCorr);
192 
193  return kSUCCESS;
194 }
195 
196 void AtMergeTask::Exec(Option_t *opt)
197 {
198  fS800CalcBr->Clear();
199 
200  if (fRawEventArray->GetEntriesFast() == 0)
201  return;
202 
203  auto *rawEvent = dynamic_cast<AtRawEvent *>(fRawEventArray->At(0));
204  Long64_t AtTPCTs = -1;
205  if (!fUseATTPCClock) {
206  if (rawEvent->GetTimestamps().size() == 1) {
207  LOG(WARNING)
208  << cYELLOW
209  << " AtMergeTask : only TS based on internal AT-TPC clock available, check fUseATTPCClock unpacking macro"
210  << cNORMAL << std::endl;
211  return;
212  } else
213  AtTPCTs = rawEvent->GetTimestamp(1);
214  }
215  if (fUseATTPCClock) {
216  AtTPCTs = rawEvent->GetTimestamp(0);
217  if (fATTPCTs0 == -1)
218  fATTPCTs0 = AtTPCTs; // special run 275, comment this line and uncomment the following line
219  // if(fATTPCTs0==-1) fATTPCTs0=902487436452;// special run 275 the first event is not in s800 data so substract
220  // the TS of the second evt
221  AtTPCTs =
222  (AtTPCTs - fATTPCTs0) / fATTPCClockFreq; // 9.9994347//run146 164 9.9994345 run155 9.999435 run160 9.999434
223  // std::cout<<"debug "<<fCounter<<" "<<AtTPCTs<<" "<<fATTPCTsPrev<<" "<<AtTPCTs-fATTPCTsPrev<<std::endl;
224  if ((AtTPCTs - fATTPCTsPrev) > 1e+8)
225  AtTPCTs -= 429521035; // sometimes the ATTPC TS jump (?)
226  if ((AtTPCTs - fATTPCTsPrev) < -1e+8)
227  AtTPCTs += 429521035;
228  fATTPCTsPrev = AtTPCTs;
229  }
230  int minj = 0, maxj = 0;
231  Double_t S800EvtMatch = -1;
232  minj = (int)fS800TsFunc->Eval(AtTPCTs) - fEvtDelta; // define the AtTPC entries range where the matching timestamp
233  // should be, to not loop over all the AtTPC entries.
234  maxj = (int)fS800TsFunc->Eval(AtTPCTs) + fEvtDelta;
235 
236  std::cout << " TS AtTPC " << AtTPCTs << std::endl;
237 
238  for (int i = minj; i < maxj; i++) {
239  if (i >= 0 && i < fTsEvtS800Size) {
240  if (i > 0 && isInGlom(fS800Ts.at(i - 1), fS800Ts.at(i)))
241  std::cout << " -- Warning -- Timestamp of consecutive entries from S800 root file within the glom"
242  << std::endl;
243  else {
244  // Is there a way to check that with the At-TPC "event by event" processing?
245  /*if(isInGlom(TsEvtAtTPC.at(i-1),TsEvtAtTPC.at(i)) )
246  {
247  cout<<" -- Warning -- Timestamp of consecutive entries from AtTPC root file within the glom"<<endl;
248  }
249  else*/
250  if (isInGlom(fS800Ts.at(i) + fTsDelta, AtTPCTs)) { // fTsDelta constant offset likely from the length of the
251  // sync signal between S800 and At-TPC
252  // if(isInGlom(fS800Ts.at(i),AtTPCTs) ){//special run180
253  S800EvtMatch = (int)fS800Evt.at(i);
254  std::cout << " in glom " << minj << " " << maxj << " " << i << " " << fS800Ts.at(i) << " " << AtTPCTs
255  << " " << S800EvtMatch << " " << fS800TsFunc->Eval(AtTPCTs) << " " << AtTPCTs - fS800Ts.at(i)
256  << std::endl;
257  fEvtMerged++;
258  break;
259  } else
260  S800EvtMatch = -1;
261  // std::cout<<" NOT in glom "<<minj<<" "<<maxj<<" "<<i<<" "<<fS800Ts.at(i)<<" "<<AtTPCTs<<"
262  // "<<fS800Ts.at(i)-AtTPCTs<<" "<<S800EvtMatch<<std::endl;
263  }
264  }
265  }
266 
267  if (S800EvtMatch < 0)
268  LOG(WARNING) << cRED << "NO TS MATCHING !" << cNORMAL;
269 
270  if (S800EvtMatch > 0) {
271  TTreeReader reader2("caltree", fS800file);
272  TTreeReaderValue<S800Calc> *readerValueS800Calc = nullptr;
273  readerValueS800Calc = new TTreeReaderValue<S800Calc>(reader2, "s800calc"); // NOLINT
274 
275  reader2.SetEntry(S800EvtMatch);
276 
277  *fS800CalcBr = (S800Calc)*readerValueS800Calc->Get();
278 
279  Bool_t isIn = kFALSE;
280  isIn = fS800Ana.isInPID(fS800CalcBr);
281  fS800CalcBr->SetIsInCut(isIn);
282  rawEvent->SetIsExtGate(isIn);
283  }
284 }
AtMergeTask::AtMergeTask
AtMergeTask()
Definition: AtMergeTask.cxx:33
AtRawEvent.h
AtMergeTask::SetPersistence
void SetPersistence(Bool_t value=kTRUE)
Definition: AtMergeTask.cxx:54
S800Ana::SetPID2cut
void SetPID2cut(std::vector< TString > file)
Definition: S800Ana.cxx:68
cRED
constexpr auto cRED
Definition: AtMergeTask.cxx:25
cNORMAL
constexpr auto cNORMAL
Definition: AtMergeTask.cxx:27
S800Ana::SetTofObjCorr
void SetTofObjCorr(std::vector< Double_t > vec)
Definition: S800Ana.cxx:98
AtMergeTask::SetMTDCXfRange
void SetMTDCXfRange(std::vector< Double_t > vec)
Definition: AtMergeTask.cxx:98
AtMergeTask
Definition: AtMergeTask.h:23
S800Ana::SetMTDCXfRange
void SetMTDCXfRange(std::vector< Double_t > vec)
Definition: S800Ana.cxx:106
S800Calc
Definition: S800Calc.h:455
AtMergeTask::SetPID1cut
void SetPID1cut(TString file)
Definition: AtMergeTask.cxx:70
AtMergeTask::Init
virtual InitStatus Init()
Definition: AtMergeTask.cxx:129
AtMergeTask::SetPID3cut
void SetPID3cut(TString file)
Definition: AtMergeTask.cxx:78
AtMergeTask::SetPID2cut
void SetPID2cut(TString file)
Definition: AtMergeTask.cxx:74
AtMergeTask::GetMergedTsSize
Int_t GetMergedTsSize()
Definition: AtMergeTask.cxx:115
S800Ana::isInPID
Bool_t isInPID(S800Calc *s800calc)
Definition: S800Ana.cxx:210
AtRawEvent
Definition: AtRawEvent.h:34
ClassImp
ClassImp(AtMergeTask)
S800Ana::SetPID3cut
void SetPID3cut(std::vector< TString > file)
Definition: S800Ana.cxx:81
S800Ana.h
cBLUE
constexpr auto cBLUE
Definition: AtMergeTask.cxx:29
S800Calc::Clear
void Clear(Option_t *="")
Definition: S800Calc.h:459
AtMergeTask::SetS800File
void SetS800File(TString file)
Definition: AtMergeTask.cxx:58
AtMergeTask::SetOptiEvtDelta
void SetOptiEvtDelta(Int_t EvtDelta)
Definition: AtMergeTask.cxx:66
S800Calc.h
AtMergeTask::SetTsDelta
void SetTsDelta(Int_t TsDelta)
Definition: AtMergeTask.cxx:82
AtMergeTask::SetTofObjCorr
void SetTofObjCorr(std::vector< Double_t > vec)
Definition: AtMergeTask.cxx:90
AtMergeTask::isInGlom
Bool_t isInGlom(Long64_t ts1, Long64_t ts2)
Definition: AtMergeTask.cxx:120
AtMergeTask::SetGlom
void SetGlom(Double_t glom)
Definition: AtMergeTask.cxx:62
AtMergeTask::SetParameters
void SetParameters(std::vector< Double_t > vec)
Definition: AtMergeTask.cxx:86
cYELLOW
constexpr auto cYELLOW
Definition: AtMergeTask.cxx:26
AtMergeTask::SetATTPCClockFreq
void SetATTPCClockFreq(Double_t value)
Definition: AtMergeTask.cxx:106
cGREEN
constexpr auto cGREEN
Definition: AtMergeTask.cxx:28
AtMergeTask::Exec
virtual void Exec(Option_t *opt)
Definition: AtMergeTask.cxx:196
S800Calc::SetIsInCut
void SetIsInCut(Bool_t val)
Definition: S800Calc.h:476
AtMergeTask::~AtMergeTask
~AtMergeTask()
Definition: AtMergeTask.cxx:45
AtMergeTask::GetS800TsSize
Int_t GetS800TsSize()
Definition: AtMergeTask.cxx:111
AtMergeTask.h
S800Ana::SetMTDCObjRange
void SetMTDCObjRange(std::vector< Double_t > vec)
Definition: S800Ana.cxx:102
AtMergeTask::SetMTDCObjRange
void SetMTDCObjRange(std::vector< Double_t > vec)
Definition: AtMergeTask.cxx:94
AtMergeTask::SetATTPCClock
void SetATTPCClock(Bool_t value=kTRUE)
Definition: AtMergeTask.cxx:102
S800Ana::SetPID1cut
void SetPID1cut(std::vector< TString > file)
Definition: S800Ana.cxx:55