CbmRoot
Loading...
Searching...
No Matches
CbmCheckTiming.cxx
Go to the documentation of this file.
1/* Copyright (C) 2019-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau, Florian Uhlig [committer], Andreas Redelbach */
4
5#include "CbmCheckTiming.h"
6
7#include "CbmDigiManager.h"
10#include "CbmPsdDigi.h"
11#include "CbmRichDigi.h"
12#include "CbmStsDigi.h"
13#include "CbmTofDigi.h"
14#include "CbmTrdDigi.h"
15
16#include "FairRootManager.h"
17#include "FairRunOnline.h"
18#include <Logger.h>
19
20#include "TClonesArray.h"
21#include "TF1.h"
22#include "TH1.h"
23#include "TH2.h"
24#include "THttpServer.h"
25#include <TFile.h>
26
27#include <iomanip>
28#include <iostream>
29using std::fixed;
30using std::setprecision;
31
32// ---- Default constructor -------------------------------------------
33CbmCheckTiming::CbmCheckTiming() : FairTask("CbmCheckTiming") {}
34
35// ---- Destructor ----------------------------------------------------
37
38// ---- Initialisation ----------------------------------------------
40{
41 // Load all necessary parameter containers from the runtime data base
42 /*
43 FairRunAna* ana = FairRunAna::Instance();
44 FairRuntimeDb* rtdb=ana->GetRuntimeDb();
45
46 <CbmCheckTimingDataMember> = (<ClassPointer>*)
47 (rtdb->getContainer("<ContainerName>"));
48 */
49}
50
51// ---- Init ----------------------------------------------------------
53{
54
55 // Get a handle from the IO manager
56 FairRootManager* ioman = FairRootManager::Instance();
59 fDigiMan->Init();
60
61 // Get a pointer to the previous already existing data level
62 fBmonDigiVec = ioman->InitObjectAs<std::vector<CbmTofDigi> const*>("BmonDigi");
63 if (!fBmonDigiVec) {
64 fBmonDigiArr = dynamic_cast<TClonesArray*>(ioman->GetObject("BmonDigi"));
65 if (!fBmonDigiArr) { LOG(fatal) << "No TClonesArray with Bmon digis found."; }
66 }
67
68 if (!fDigiMan->IsPresent(ECbmModuleId::kSts)) { LOG(info) << "No STS digis found."; }
69
70 if (!fDigiMan->IsPresent(ECbmModuleId::kMuch)) { LOG(info) << "No MUCH digis found."; }
71
72 if (!fDigiMan->IsPresent(ECbmModuleId::kTrd)) { LOG(info) << "No TRD digis found."; }
73
74 if (!fDigiMan->IsPresent(ECbmModuleId::kTof)) { LOG(info) << "No TOF digis found."; }
75
76 if (!fDigiMan->IsPresent(ECbmModuleId::kRich)) { LOG(info) << "No RICH digis found."; }
77
78 if (!fDigiMan->IsPresent(ECbmModuleId::kPsd)) { LOG(info) << "No PSD digis found."; }
79
81
82 return kSUCCESS;
83}
84
85Int_t CbmCheckTiming::CalcNrBins(Int_t offsetRange)
86{
87
88 if (offsetRange < 1001) { fBinWidth = 5; }
89 else if (offsetRange < 10001) {
90 fBinWidth = 10;
91 }
92 else if (offsetRange < 100001) {
93 fBinWidth = 100;
94 }
95 else {
96 fBinWidth = 100;
97 }
98
99 if ((static_cast<Double_t>(offsetRange) / 6.25) == (offsetRange / 6.25)) return (offsetRange / 6.25 * 2);
100
101 return (offsetRange / fBinWidth * 2);
102}
103
105{
107 uint32_t iNbBinsLog = 0;
109 std::vector<double> dBinsLogVector = GenerateLogBinArray(9, 9, 1, iNbBinsLog);
110 double* dBinsLog = dBinsLogVector.data();
111 // double * dBinsLog = GenerateLogBinArray( 9, 9, 1, iNbBinsLog );
112
113 Int_t nrOfBinsSts = CalcNrBins(fStsOffsetRange);
114 // Bmon vs. Sts
116 new TH1D("fBmonStsDiff", "Sts-Bmon;time diff [ns];Counts", nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange);
117
118 fBmonStsDiffCharge = new TH2F("fBmonStsDiffCharge", "Sts-Bmon;time diff [ns]; Charge [a.u]; Counts", nrOfBinsSts,
119 -fStsOffsetRange, fStsOffsetRange, 256, 0, 256);
120
121 fBmonStsDiffEvo = new TH2F("fBmonStsDiffEvo", "Sts-Bmon;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsSts,
123
124
125 Int_t nrOfBinsMuch = CalcNrBins(fMuchOffsetRange);
126 // Bmon vs. Much
128 new TH1D("fBmonMuchDiff", "Much-Bmon;time diff [ns];Counts", nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange);
129
130 fBmonMuchDiffCharge = new TH2F("fBmonMuchDiffCharge", "Much-Bmon;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsMuch,
131 -fMuchOffsetRange, fMuchOffsetRange, 256, 0, 256);
132
133 fBmonMuchDiffEvo = new TH2F("fBmonMuchDiffEvo", "Much-Bmon;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsMuch,
135
136 Int_t nrOfBinsTrd = CalcNrBins(fTrdOffsetRange);
137 // To vs. Trd
139 new TH1D("fBmonTrdDiff", "Trd-Bmon;time diff [ns];Counts", nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange);
140
141 fBmonTrdDiffCharge = new TH2F("fBmonTrdDiffCharge", "Trd-Bmon;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsTrd,
142 -fTrdOffsetRange, fTrdOffsetRange, 256, 0, 256);
143
144 fBmonTrdDiffEvo = new TH2F("fBmonTrdDiffEvo", "Trd-Bmon;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsTrd,
146
147 Int_t nrOfBinsTof = CalcNrBins(fTofOffsetRange);
148 // To vs. Tof
150 new TH1D("fBmonTofDiff", "Tof-Bmon;time diff [ns];Counts", nrOfBinsTof, -fTofOffsetRange, fTofOffsetRange);
151
152 fBmonTofDiffCharge = new TH2F("fBmonTofDiffCharge", "Tof-Bmon;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsTof,
153 -fTofOffsetRange, fTofOffsetRange, 256, 0, 256);
154
155 fBmonTofDiffEvo = new TH2F("fBmonTofDiffEvo", "Tof-Bmon;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsTof,
157
158
159 Int_t nrOfBinsRich = CalcNrBins(fRichOffsetRange);
160 // To vs. Rich
162 new TH1D("fBmonRichDiff", "Rich-Bmon;time diff [ns];Counts", nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange);
163
164 fBmonRichDiffCharge = new TH2F("fBmonRichDiffCharge", "Rich-Bmon;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsRich,
165 -fRichOffsetRange, fRichOffsetRange, 256, 0, 256);
166
167 fBmonRichDiffEvo = new TH2F("fBmonRichDiffEvo", "Rich-Bmon;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsRich,
169
170 Int_t nrOfBinsPsd = CalcNrBins(fPsdOffsetRange);
171 // To vs. Psd
173 new TH1D("fBmonPsdDiff", "Psd-Bmon;time diff [ns];Counts", nrOfBinsPsd, -fPsdOffsetRange, fPsdOffsetRange);
174
175 fBmonPsdDiffCharge = new TH2F("fBmonPsdDiffCharge", "Psd-Bmon;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsPsd,
176 -fPsdOffsetRange, fPsdOffsetRange, 7000, 0, 70000);
177
178 fBmonPsdDiffEvo = new TH2F("fBmonPsdDiffEvo", "Psd-Bmon;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsPsd,
180
181 // Bmon vs. Sts
182 fBmonStsDiffEvoLong = new TH2F("fBmonStsDiffEvoLong", "Sts-Bmon;TS; time diff [ns];Counts", 1800, 0, 180000,
183 nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange);
184 // Bmon vs. Much
185 fBmonMuchDiffEvoLong = new TH2F("fBmonMuchDiffEvoLong", "Much-Bmon;TS; time diff [ns];Counts", 1800, 0, 180000,
186 nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange);
187 // To vs. Trd
188 fBmonTrdDiffEvoLong = new TH2F("fBmonTrdDiffEvoLong", "Trd-Bmon;TS; time diff [ns];Counts", 1800, 0, 180000,
189 nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange);
190 // To vs. Tof
191 fBmonTofDiffEvoLong = new TH2F("fBmonTofDiffEvoLong", "Tof-Bmon;TS; time diff [ns];Counts", 1800, 0, 180000,
192 nrOfBinsTof, -fTofOffsetRange, fTofOffsetRange);
193 // To vs. Rich
194 fBmonRichDiffEvoLong = new TH2F("fBmonRichDiffEvoLong", "Rich-Bmon;TS; time diff [ns];Counts", 1800, 0, 180000,
195 nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange);
196
197 // To vs. Psd
198 fBmonPsdDiffEvoLong = new TH2F("fBmonPsdDiffEvoLong", "Psd-Bmon;TS; time diff [ns];Counts", 1800, 0, 180000,
199 nrOfBinsPsd, -fPsdOffsetRange, fPsdOffsetRange);
200
201 // Bmon vs. STS for the different DPBs
202 fBmonStsDpbDiff = new TH2F("fBmonStsDpbDiff", "Much-Bmon;DPB; time diff [ns];Counts", 2, -0.5, 1.5, nrOfBinsSts,
204
205 for (UInt_t uStsDpb = 0; uStsDpb < kuMaxNbStsDpbs; ++uStsDpb) {
206 fBmonStsDpbDiffEvo[uStsDpb] =
207 new TH2F(Form("fBmonStsDpbDiffEvo%02u", uStsDpb), Form("Sts-Bmon DPB %02u;TS; time diff [ns];Counts", uStsDpb),
208 1800, 0, 180000, nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange);
209 fStsDpbCntsEvo[uStsDpb] =
210 new TH1F(Form("fStsDpbCntsEvo%02u", uStsDpb), Form("Time STS DPB %02u;TS; Hit Counts", uStsDpb), 1800, 0, 180000);
211 } // for( UInt_t uStsDpb = 0; uStsDpb < kuMaxNbStsDpbs; ++uStsDpb )
212
213 // Bmon vs. Much for the different DPBs/AFCK
214 fBmonMuchRocDiff = new TH2F("fBmonMuchRocDiff", "Much-Bmon;AFCK; time diff [ns];Counts", kuMaxNbMuchDpbs, -0.5,
215 kuMaxNbMuchDpbs - 0.5, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange);
216
217 // Bmon vs. Much for the different ASICs
218 fBmonMuchAsicDiff = new TH2F("fBmonMuchAsicDiff", "Much-Bmon;ASIC; time diff [ns];Counts", kuMaxNbMuchAsics, -0.5,
219 kuMaxNbMuchAsics - 0.5, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange);
220
221 for (UInt_t uMuchAsic = 0; uMuchAsic < kuMaxNbMuchAsics; ++uMuchAsic)
222 fBmonMuchAsicDiffEvo[uMuchAsic] = new TH2F(Form("fBmonMuchAsicDiffEvo%02u", uMuchAsic),
223 Form("Much-Bmon ASIC %02u;TS; time diff [ns];Counts", uMuchAsic), 1800,
224 0, 180000, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange);
225
226 // Bmon vs. Bmon
227 fBmonBmonDiff = new TH1F("fBmonBmonDiff", "Bmon-Bmon_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog);
228 // sts vs. Sts
229 fStsStsDiff = new TH1F("fStsStsDiff", "Sts-Sts_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog);
230 // Much vs. Much
231 fMuchMuchDiff = new TH1F("fMuchMuchDiff", "Much-Much_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog);
232 // Trd vs. Trd
233 fTrdTrdDiff = new TH1F("fTrdTrdDiff", "Trd-Trd_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog);
234 // Tof vs. Tof
235 fTofTofDiff = new TH1F("fTofTofDiff", "Tof-Tof_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog);
236 // Rich vs. Rich
237 fRichRichDiff = new TH1F("fRichRichDiff", "Rich-Rich_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog);
238 // Psd vs. Psd
239 fPsdPsdDiff = new TH1F("fPsdPsdDiff", "Psd-Psd_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog);
240
241 fBmonAddress = new TH1F("fBmonAddress", "Bmon address;address;Counts", 1000000, 0, 1000000.);
242
243 fBmonChannel = new TH1F("fBmonChannel", "Bmon channel;channel nr;Counts", 100, -0.5, 99.5);
244
245 fSelBmonStsDiff = new TH1F("fSelBmonStsDiff", "Sts-Bmon if Bmon in coinc with TOF;time diff [ns];Counts", nrOfBinsSts,
247 fSelBmonMuchDiff = new TH1F("fSelBmonMuchDiff", "Much-Bmon if Bmon in coinc with TOF;time diff [ns];Counts",
248 nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange);
249 fSelBmonTrdDiff = new TH1F("fSelBmonTrdDiff", "Trd-Bmon if Bmon in coinc with TOF;time diff [ns];Counts", nrOfBinsTrd,
251 fSelBmonTofDiff = new TH1F("fSelBmonTofDiff", "Tof-Bmon if Bmon in coinc with TOF;time diff [ns];Counts", nrOfBinsTof,
253 fSelBmonRichDiff = new TH1F("fSelBmonRichDiff", "Rich-Bmon if Bmon in coinc with TOF;time diff [ns];Counts",
254 nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange);
255 fSelBmonPsdDiff = new TH1F("fSelBmonPsdDiff", "Psd-Bmon if Bmon in coinc with TOF;time diff [ns];Counts", nrOfBinsPsd,
257
259 // delete dBinsLog;
260
262 FairRunOnline* run = FairRunOnline::Instance();
263 if (run) {
264 THttpServer* server = run->GetHttpServer();
265 if (nullptr != server) {
266 server->Register("/CheckTiming", fBmonStsDiff);
267 server->Register("/CheckTiming", fBmonMuchDiff);
268 server->Register("/CheckTiming", fBmonTrdDiff);
269 server->Register("/CheckTiming", fBmonTofDiff);
270 server->Register("/CheckTiming", fBmonRichDiff);
271 server->Register("/CheckTiming", fBmonPsdDiff);
272 server->Register("/CheckTiming", fBmonStsDiffCharge);
273 server->Register("/CheckTiming", fBmonMuchDiffCharge);
274 server->Register("/CheckTiming", fBmonTrdDiffCharge);
275 server->Register("/CheckTiming", fBmonTofDiffCharge);
276 server->Register("/CheckTiming", fBmonRichDiffCharge);
277 server->Register("/CheckTiming", fBmonPsdDiffCharge);
278 server->Register("/CheckTiming", fBmonStsDiffEvo);
279 server->Register("/CheckTiming", fBmonMuchDiffEvo);
280 server->Register("/CheckTiming", fBmonTrdDiffEvo);
281 server->Register("/CheckTiming", fBmonTofDiffEvo);
282 server->Register("/CheckTiming", fBmonRichDiffEvo);
283 server->Register("/CheckTiming", fBmonPsdDiffEvo);
284 server->Register("/CheckTiming", fBmonStsDiffEvoLong);
285 server->Register("/CheckTiming", fBmonMuchDiffEvoLong);
286 server->Register("/CheckTiming", fBmonTrdDiffEvoLong);
287 server->Register("/CheckTiming", fBmonTofDiffEvoLong);
288 server->Register("/CheckTiming", fBmonRichDiffEvoLong);
289 server->Register("/CheckTiming", fBmonPsdDiffEvoLong);
290 server->Register("/CheckTiming", fBmonBmonDiff);
291 server->Register("/CheckTiming", fStsStsDiff);
292 server->Register("/CheckTiming", fMuchMuchDiff);
293 server->Register("/CheckTiming", fTrdTrdDiff);
294 server->Register("/CheckTiming", fTofTofDiff);
295 server->Register("/CheckTiming", fRichRichDiff);
296 server->Register("/CheckTiming", fPsdPsdDiff);
297
298 server->Register("/CheckTiming", fBmonStsDpbDiff);
299 for (UInt_t uStsDpb = 0; uStsDpb < kuMaxNbStsDpbs; ++uStsDpb)
300 server->Register("/CheckTiming/sts", fBmonStsDpbDiffEvo[uStsDpb]);
301
302 server->Register("/CheckTiming", fBmonMuchRocDiff);
303 server->Register("/CheckTiming", fBmonMuchAsicDiff);
304 for (UInt_t uMuchAsic = 0; uMuchAsic < kuMaxNbMuchAsics; ++uMuchAsic)
305 server->Register("/CheckTiming/much", fBmonMuchAsicDiffEvo[uMuchAsic]);
306
307 server->Register("/CheckTiming", fSelBmonStsDiff);
308 server->Register("/CheckTiming", fSelBmonMuchDiff);
309 server->Register("/CheckTiming", fSelBmonTrdDiff);
310 server->Register("/CheckTiming", fSelBmonTofDiff);
311 server->Register("/CheckTiming", fSelBmonRichDiff);
312 server->Register("/CheckTiming", fSelBmonPsdDiff);
313 }
314 }
315}
316// ---- ReInit -------------------------------------------------------
317InitStatus CbmCheckTiming::ReInit() { return kSUCCESS; }
318
319// ---- Exec ----------------------------------------------------------
320void CbmCheckTiming::Exec(Option_t* /*option*/)
321{
322 LOG(debug) << "executing TS " << fNrTs;
323
326 if ((0 < fNrTs) && (fNrTsForFit > 0) && (0 == fNrTs % fNrTsForFit)) {
327 LOG(info) << "Fitting peaks for number of TS = " << fNrTs;
328 FitPeaks();
329 }
330 if (0 < fNrTs && 0 == fNrTs % 2000) WriteHistos();
331 fNrTs++;
332}
333
335{
336 LOG(debug) << "Begin";
337 Int_t nrBmonDigis = 0;
338 if (fBmonDigiVec) nrBmonDigis = fBmonDigiVec->size();
339 else if (fBmonDigiArr)
340 nrBmonDigis = fBmonDigiArr->GetEntriesFast();
341 LOG(debug) << "BmonDigis: " << nrBmonDigis;
342
343 Int_t nrStsDigis {0};
346 LOG(debug) << "StsDigis: " << nrStsDigis;
347 }
348
349 Int_t nrMuchDigis {0};
352 LOG(debug) << "MuchDigis: " << nrMuchDigis;
353 }
354
355 Int_t nrTrdDigis {0};
358 LOG(debug) << "TrdDigis: " << nrTrdDigis;
359 }
360
361 Int_t nrTofDigis {0};
364 LOG(debug) << "TofDigis: " << nrTofDigis;
365 }
366
367 Int_t nrRichDigis {0};
370 LOG(debug) << "RichDigis: " << nrRichDigis;
371 }
372
373 Int_t nrPsdDigis {0};
376 LOG(debug) << "PsdDigis: " << nrPsdDigis;
377 }
378
379 // if (nrBmonDigis < 100000) {
380 if (nrBmonDigis < 1000000) {
388
389 fvdTimeSelectedBmon.clear();
390
391 for (Int_t iBmon = 0; iBmon < nrBmonDigis; ++iBmon) {
392
393 if (iBmon % 1000 == 0) LOG(debug) << "Executing entry " << iBmon;
394
395 const CbmTofDigi* BmonDigi = nullptr;
396 if (fBmonDigiVec) BmonDigi = &(fBmonDigiVec->at(iBmon));
397 else if (fBmonDigiArr)
398 BmonDigi = dynamic_cast<const CbmTofDigi*>(fBmonDigiArr->At(iBmon));
399 assert(BmonDigi);
400
402 if (fuMinTotPulserBmon < BmonDigi->GetCharge() && BmonDigi->GetCharge() < fuMaxTotPulserBmon) continue;
403
404 Double_t T0Time = BmonDigi->GetTime();
405 Int_t BmonAddress = BmonDigi->GetAddress();
406 fBmonAddress->Fill(BmonAddress);
407
408 fBmonChannel->Fill(BmonDigi->GetChannel());
409
410 if (nrStsDigis > 0 && nrStsDigis < 1000000)
413 fStsOffsetRange, fPrevBmonFirstDigiSts, kTRUE, kFALSE, kFALSE, kFALSE);
416 if (nrMuchDigis > 0 && nrMuchDigis < 1000000)
419 fMuchOffsetRange, fPrevBmonFirstDigiMuch, kFALSE, kTRUE, kFALSE, kFALSE);
420 if (nrTrdDigis > 0 && nrTrdDigis < 1000000)
423 fPrevBmonFirstDigiTrd, kFALSE, kFALSE, kFALSE, kFALSE);
425 if (nrTofDigis > 0 && nrTofDigis < 1000000)
428 fPrevBmonFirstDigiTof, kFALSE, kFALSE, kTRUE, kFALSE);
429 if (nrRichDigis > 0 && nrRichDigis < 1000000)
432 fPrevBmonFirstDigiRich, kFALSE, kFALSE, kFALSE, kFALSE);
433 if (nrPsdDigis > 0 && nrPsdDigis < 1000000)
436 fPrevBmonFirstDigiPsd, kFALSE, kFALSE, kFALSE, kTRUE);
437
438 if (fuNbTofDigisSel <= fuNbTofDigiInSync) fvdTimeSelectedBmon.push_back(T0Time);
439 }
440
448 for (UInt_t uIdxSelBmon = 0; uIdxSelBmon < fvdTimeSelectedBmon.size(); ++uIdxSelBmon) {
449 if (nrStsDigis > 0 && nrStsDigis < 1000000)
452 fPrevBmonFirstDigiSts, kTRUE, kFALSE, kFALSE, kFALSE);
455 if (nrMuchDigis > 0 && nrMuchDigis < 1000000)
458 fPrevBmonFirstDigiMuch, kFALSE, kTRUE, kFALSE, kFALSE);
459 if (nrTrdDigis > 0 && nrTrdDigis < 1000000)
462 fPrevBmonFirstDigiTrd, kFALSE, kFALSE, kFALSE, kFALSE);
463 if (nrTofDigis > 0 && nrTofDigis < 1000000)
466 fPrevBmonFirstDigiTof, kFALSE, kFALSE, kTRUE, kFALSE);
467 if (nrRichDigis > 0 && nrRichDigis < 1000000)
470 fPrevBmonFirstDigiRich, kFALSE, kFALSE, kFALSE, kFALSE);
471 if (nrPsdDigis > 0 && nrPsdDigis < 1000000)
474 fPrevBmonFirstDigiPsd, kFALSE, kFALSE, kFALSE, kTRUE);
475 } // for( UInt_t uIdxSelBmon = 0; uIdxSelBmon < fvdTimeSelectedBmon.size(); ++uIdxSelBmon )
476 }
477}
478
479template<class Digi>
480Int_t CbmCheckTiming::FillSystemOffsetHistos(TH1* histo, TH2* histoCharge, TH2* histoEvo, TH2* histoEvoLong,
481 TH2* histoAFCK, const Double_t T0Time, const Int_t offsetRange,
482 Int_t iStartDigi, Bool_t bSts, Bool_t bMuch, Bool_t bTof, Bool_t /*bPsd*/)
483{
484 Int_t nrDigis = fDigiMan->GetNofDigis(Digi::GetSystem());
485 Int_t iFirstDigiInWin = iStartDigi;
486
487 for (Int_t i = iStartDigi; i < nrDigis; ++i) {
488
489 const Digi* digi = fDigiMan->Get<Digi>(i);
490
492 if (kTRUE == bTof)
493 if (fuMinTotPulserTof < digi->GetCharge() && digi->GetCharge() < fuMaxTotPulserTof) continue;
494 /*
496 if( kTRUE == bMuch )
497 if( digi->GetCharge() < 2 )
498 continue;
499
501 if( kTRUE == bSts )
502 if( ( digi->GetCharge() < 7 || 31 == digi->GetCharge() ) ||
503 ( 0 == ( digi->GetChannel() % 2 ) ) )
504 continue;
505
507 if( kTRUE == bPsd )
508 if( digi->GetAddress() != (0<<10)+8 )
509 continue;
510*/
511
512 // Double_t diffTime = T0Time - digi->GetTime();
513 Double_t diffTime = digi->GetTime() - T0Time; // Use Bmon as reference Time
514
515 if (diffTime < -offsetRange) {
516 ++iFirstDigiInWin; // Update Index of first digi in Win to next digi
517 continue; // not yet in interesting range
518 } // if (diffTime > offsetRange)
519 if (diffTime > offsetRange) break; // already past interesting range
520 histo->Fill(diffTime);
521 histoCharge->Fill(diffTime, digi->GetCharge());
522 histoEvo->Fill(fNrTs, diffTime);
523 histoEvoLong->Fill(fNrTs, diffTime);
524
526 if (bSts && histoAFCK) {
527 UInt_t uDPB = (0 < (digi->GetAddress() & 0x00000400));
528 histoAFCK->Fill(uDPB, diffTime);
529 if (uDPB < kuMaxNbStsDpbs) fBmonStsDpbDiffEvo[uDPB]->Fill(fNrTs, diffTime);
530 } // if (bSts && histoAFCK)
531
533 if (bMuch && histoAFCK) {
534 const CbmMuchBeamTimeDigi* muchDigi = nullptr;
535 try {
536 muchDigi = boost::any_cast<const CbmMuchBeamTimeDigi*>(digi);
537 }
538 catch (...) {
539 LOG(fatal) << "Failed boost any_cast in CbmCheckTiming::FillSystemOffsetHistos "
540 "for a digi of type "
541 << Digi::GetClassName();
542 } // try/catch
543 assert(muchDigi);
544 UInt_t afck = muchDigi->GetRocId();
545 UInt_t asic = muchDigi->GetNxId();
546 histoAFCK->Fill(afck, diffTime);
547 fBmonMuchAsicDiff->Fill(asic, diffTime);
548 if (asic < kuMaxNbMuchAsics) fBmonMuchAsicDiffEvo[asic]->Fill(fNrTs, diffTime);
549 } // if (bMuch && histoAFCK)
550
552 if (kTRUE == bTof && -200 < diffTime && diffTime < 200) fuNbTofDigiInSync++;
553 }
554
555 return iFirstDigiInWin;
556}
557
558template<class Digi>
559Int_t CbmCheckTiming::FillHistosSelBmon(TH1* histo, const Double_t T0Time, const Int_t offsetRange, Int_t iStartDigi,
560 Bool_t /*bSts*/, Bool_t /*bMuch*/, Bool_t bTof, Bool_t /*bPsd*/)
561{
562 Int_t nrDigis = fDigiMan->GetNofDigis(Digi::GetSystem());
563 Int_t iFirstDigiInWin = iStartDigi;
564
565 for (Int_t i = iStartDigi; i < nrDigis; ++i) {
566
567 const Digi* digi = fDigiMan->Get<Digi>(i);
568
570 if (kTRUE == bTof)
571 if (fuMinTotPulserTof < digi->GetCharge() && digi->GetCharge() < fuMaxTotPulserTof) continue;
572 /*
574 if( kTRUE == bMuch )
575 if( digi->GetCharge() < 2 )
576 continue;
577
579 if( kTRUE == bSts )
580 if( ( digi->GetCharge() < 7 || 31 == digi->GetCharge() ) ||
581 ( 0 == ( digi->GetChannel() % 2 ) ) )
582 continue;
583
585 if( kTRUE == bPsd )
586 if( digi->GetAddress() != (0<<10)+8 )
587 continue;
588*/
589
590 // Double_t diffTime = T0Time - digi->GetTime();
591 Double_t diffTime = digi->GetTime() - T0Time; // Use Bmon as reference Time
592
593 if (diffTime < -offsetRange) {
594 ++iFirstDigiInWin; // Update Index of first digi in Win to next digi
595 continue; // not yet in interesting range
596 } // if (diffTime > offsetRange)
597 if (diffTime > offsetRange) break; // already past interesting range
598 histo->Fill(diffTime);
599 }
600
601 return iFirstDigiInWin;
602}
603
605{
606 if (fBmonDigiVec || fBmonDigiArr) {
607 Int_t nrBmonDigis = 0;
608 if (fBmonDigiVec) nrBmonDigis = fBmonDigiVec->size();
609 else if (fBmonDigiArr)
610 nrBmonDigis = fBmonDigiArr->GetEntriesFast();
611 fNrOfBmonDigis += nrBmonDigis;
613 }
615 Int_t nrStsDigis = fDigiMan->GetNofDigis(ECbmModuleId::kSts);
616 fNrOfStsDigis += nrStsDigis;
618
619 for (Int_t i = 0; i < nrStsDigis; ++i) {
620 const CbmStsDigi* Digi = fDigiMan->Get<CbmStsDigi>(i);
621 UInt_t uDPB = (0 < (Digi->GetAddress() & 0x00000400));
622 if (uDPB < kuMaxNbStsDpbs) fStsDpbCntsEvo[uDPB]->Fill(fNrTs);
623 }
624 }
626 Int_t nrMuchDigis = fDigiMan->GetNofDigis(ECbmModuleId::kMuch);
627 fNrOfMuchDigis += nrMuchDigis;
629 }
631 Int_t nrTrdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTrd);
632 fNrOfTrdDigis += nrTrdDigis;
634 }
636 Int_t nrTofDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTof);
637 fNrOfTofDigis += nrTofDigis;
639 }
641 Int_t nrRichDigis = fDigiMan->GetNofDigis(ECbmModuleId::kRich);
642 fNrOfRichDigis += nrRichDigis;
644 }
646 Int_t nrPsdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kPsd);
647 fNrOfPsdDigis += nrPsdDigis;
649 }
650}
651
652template<class Digi>
653Int_t CbmCheckTiming::CheckIfSorted(TH1* histo, Double_t& prevTime, TString detector)
654{
655 Int_t nrOfErrors = 0;
656 Int_t nrDigis = fDigiMan->GetNofDigis(Digi::GetSystem());
657
658 for (Int_t i = 0; i < nrDigis; ++i) {
659
660 const Digi* digi = fDigiMan->Get<Digi>(i);
661
662 Double_t diffTime = digi->GetTime() - prevTime;
663 histo->Fill(diffTime);
664
665 if (diffTime < 0.) {
666 LOG(info) << fixed << setprecision(15) << diffTime << "ns";
667 LOG(info) << "Previous " << detector << " digi (" << fixed << setprecision(15) << prevTime * 1.e-9
668 << ") has a larger time than the current one (" << digi->GetTime() * 1.e-9 << ") for digi " << i
669 << " of ts " << fNrTs;
670 nrOfErrors++;
671 }
672
673 prevTime = digi->GetTime();
674 }
675
676 return nrOfErrors;
677}
678
679Int_t CbmCheckTiming::CheckIfSortedBmon(TH1* histo, Double_t& prevTime, TString detector)
680{
681
682 // Extra implementation since Bmon is not included in CbmDigiManager
683 Int_t nrOfErrors = 0;
684
685 Int_t nrDigis = 0;
686 if (fBmonDigiVec) nrDigis = fBmonDigiVec->size();
687 else if (fBmonDigiArr)
688 nrDigis = fBmonDigiArr->GetEntriesFast();
689
690 for (Int_t i = 0; i < nrDigis; ++i) {
691
692 const CbmTofDigi* digi = nullptr;
693 if (fBmonDigiVec) digi = &(fBmonDigiVec->at(i));
694 else if (fBmonDigiArr)
695 digi = dynamic_cast<const CbmTofDigi*>(fBmonDigiArr->At(i));
696 if (!digi) {
697 nrOfErrors++;
698 continue;
699 }
700
701 Double_t diffTime = digi->GetTime() - prevTime;
702 histo->Fill(diffTime);
703
704 if (diffTime < 0.) {
705 LOG(info) << fixed << setprecision(15) << diffTime << "ns";
706 LOG(info) << "Previous " << detector << " digi (" << fixed << setprecision(15) << prevTime * 1.e-9
707 << ") has a larger time than the current one (" << digi->GetTime() * 1.e-9 << ") for digi " << i
708 << " of ts " << fNrTs;
709 nrOfErrors++;
710 }
711
712 prevTime = digi->GetTime();
713 }
714
715 return nrOfErrors;
716}
717
718
719// ---- Finish --------------------------------------------------------
721{
722 if (fCheckTimeOrdering) {
723 LOG(info) << "Total number of Bmon out of order digis: " << fNrOfBmonErrors;
724 LOG(info) << "Total number of Bmon digis: " << fNrOfBmonDigis;
725 LOG(info) << "Total number of Sts out of order digis: " << fNrOfStsErrors;
726 LOG(info) << "Total number of Sts digis: " << fNrOfStsDigis;
727 LOG(info) << "Total number of Much out of order digis: " << fNrOfMuchErrors;
728 LOG(info) << "Total number of Much digis: " << fNrOfMuchDigis;
729 LOG(info) << "Total number of Trd out of order digis: " << fNrOfTrdErrors;
730 LOG(info) << "Total number of Trd digis: " << fNrOfTrdDigis;
731 LOG(info) << "Total number of Tof out of order digis: " << fNrOfTofErrors;
732 LOG(info) << "Total number of Tof digis: " << fNrOfTofDigis;
733 LOG(info) << "Total number of Rich out of order digis: " << fNrOfRichErrors;
734 LOG(info) << "Total number of Rich digis: " << fNrOfRichDigis;
735 LOG(info) << "Total number of Psd out of order digis: " << fNrOfPsdErrors;
736 LOG(info) << "Total number of Psd digis: " << fNrOfPsdDigis;
737 }
738 FitPeaks();
739 WriteHistos();
740
741 LOG(info) << Form("Checked %6d Timeslices", fNrTs);
742}
743
744
746{
747 // Peak positions for differences wrt Bmon
748 trd_peak_pos = fBmonTrdDiff->GetMaximumBin() * fBmonTrdDiff->GetBinWidth(1) + fBmonTrdDiff->GetXaxis()->GetXmin();
749 sts_peak_pos = fBmonStsDiff->GetMaximumBin() * fBmonStsDiff->GetBinWidth(1) + fBmonStsDiff->GetXaxis()->GetXmin();
750 much_peak_pos = fBmonMuchDiff->GetMaximumBin() * fBmonMuchDiff->GetBinWidth(1) + fBmonMuchDiff->GetXaxis()->GetXmin();
751 tof_peak_pos = fBmonTofDiff->GetMaximumBin() * fBmonTofDiff->GetBinWidth(1) + fBmonTofDiff->GetXaxis()->GetXmin();
752 rich_peak_pos = fBmonRichDiff->GetMaximumBin() * fBmonRichDiff->GetBinWidth(1) + fBmonRichDiff->GetXaxis()->GetXmin();
753 psd_peak_pos = fBmonPsdDiff->GetMaximumBin() * fBmonPsdDiff->GetBinWidth(1) + fBmonPsdDiff->GetXaxis()->GetXmin();
754
755 // Peak positions for differences wrt Bmon if coincidence with TOF
757 fSelBmonTrdDiff->GetMaximumBin() * fSelBmonTrdDiff->GetBinWidth(1) + fSelBmonTrdDiff->GetXaxis()->GetXmin();
759 fSelBmonStsDiff->GetMaximumBin() * fSelBmonStsDiff->GetBinWidth(1) + fSelBmonStsDiff->GetXaxis()->GetXmin();
761 fSelBmonMuchDiff->GetMaximumBin() * fSelBmonMuchDiff->GetBinWidth(1) + fSelBmonMuchDiff->GetXaxis()->GetXmin();
762 //tof_coin_peak_pos = fBmonTofDiff->GetMaximumBin()*fBmonTofDiff->GetBinWidth(1)+fBmonTofDiff->GetXaxis()->GetXmin();
764 fSelBmonRichDiff->GetMaximumBin() * fSelBmonRichDiff->GetBinWidth(1) + fSelBmonRichDiff->GetXaxis()->GetXmin();
766 fSelBmonPsdDiff->GetMaximumBin() * fSelBmonPsdDiff->GetBinWidth(1) + fSelBmonPsdDiff->GetXaxis()->GetXmin();
767
768 LOG(info) << "STS entries = " << fBmonStsDiff->GetEntries();
769 LOG(info) << "STS-Bmon entries if Bmon in coincidence with TOF = " << fSelBmonStsDiff->GetEntries();
770 LOG(info) << "MUCH entries = " << fBmonMuchDiff->GetEntries();
771 LOG(info) << "MUCH-Bmon entries if Bmon in coincidence with TOF = " << fSelBmonMuchDiff->GetEntries();
772 LOG(info) << "TRD entries = " << fBmonTrdDiff->GetEntries();
773 LOG(info) << "TRD-Bmon entries if Bmon in coincidence with TOF = " << fSelBmonTrdDiff->GetEntries();
774 LOG(info) << "TOF entries = " << fBmonTofDiff->GetEntries();
775 LOG(info) << "RICH entries = " << fBmonRichDiff->GetEntries();
776 LOG(info) << "RICH-Bmon entries if Bmon in coincidence with TOF = " << fSelBmonRichDiff->GetEntries();
777 LOG(info) << "PSD entries = " << fBmonPsdDiff->GetEntries();
778 LOG(info) << "PSD-Bmon entries if Bmon in coincidence with TOF = " << fSelBmonPsdDiff->GetEntries();
779 LOG(info) << "STS peak position [ns] = " << sts_peak_pos;
780 LOG(info) << "STS peak position [ns] if Bmon in coincidence with TOF = " << sts_coin_peak_pos;
781 LOG(info) << "MUCH peak position [ns] = " << much_peak_pos;
782 LOG(info) << "MUCH peak position [ns] if Bmon in coincidence with TOF = " << much_coin_peak_pos;
783 LOG(info) << "TRD peak position [ns] = " << trd_peak_pos;
784 LOG(info) << "TRD peak position [ns] if Bmon in coincidence with TOF = " << trd_coin_peak_pos;
785 LOG(info) << "TOF peak position [ns] = " << tof_peak_pos;
786 LOG(info) << "RICH peak position [ns] = " << rich_peak_pos;
787 LOG(info) << "RICH peak position [ns] if Bmon in coincidence with TOF = " << rich_coin_peak_pos;
788 LOG(info) << "PSD peak position [ns] = " << psd_peak_pos;
789 LOG(info) << "PSD peak position [ns] if Bmon in coincidence with TOF = " << psd_coin_peak_pos;
790
791 //Average height of bins...
792 trd_average = fBmonTrdDiff->Integral() / (fBmonTrdDiff->GetNbinsX());
793 sts_average = fBmonStsDiff->Integral() / (fBmonStsDiff->GetNbinsX());
794 much_average = fBmonMuchDiff->Integral() / (fBmonMuchDiff->GetNbinsX());
795 tof_average = fBmonTofDiff->Integral() / (fBmonTofDiff->GetNbinsX());
796 rich_average = fBmonRichDiff->Integral() / (fBmonRichDiff->GetNbinsX());
797 psd_average = fBmonPsdDiff->Integral() / (fBmonPsdDiff->GetNbinsX());
798
799 //TRD
800 if (trd_average > 0) {
801 TF1* gs_trd =
802 new TF1("gs_trd", "gaus(0)+pol0(3)", trd_peak_pos - 2 * fTrdPeakWidthNs, trd_peak_pos + 2 * fTrdPeakWidthNs);
803 gs_trd->SetParameters(0.7 * trd_average, trd_peak_pos, fTrdPeakWidthNs, trd_average);
804 fBmonTrdDiff->Fit("gs_trd", "R");
805 TF1* fitresult_trd = fBmonTrdDiff->GetFunction("gs_trd");
806 LOG(info) << "TRD parameters from Gauss fit = " << fitresult_trd->GetParameter(0) << ", "
807 << fitresult_trd->GetParameter(1) << ", " << fitresult_trd->GetParameter(2);
808 LOG(info) << "TRD signal/background (p0/p3) = "
809 << (fitresult_trd->GetParameter(0)) / (fitresult_trd->GetParameter(3));
810 }
811
812 //STS
813 if (sts_average > 0) {
814 TF1* gs_sts =
815 new TF1("gs_sts", "gaus(0)+pol0(3)", sts_peak_pos - 2 * fStsPeakWidthNs, sts_peak_pos + 2 * fStsPeakWidthNs);
816 gs_sts->SetParameters(sts_average, sts_peak_pos, fStsPeakWidthNs, sts_average);
817 fBmonStsDiff->Fit("gs_sts", "R");
818 TF1* fitresult_sts = fBmonStsDiff->GetFunction("gs_sts");
819 LOG(info) << "STS parameters from Gauss fit = " << fitresult_sts->GetParameter(0) << ", "
820 << fitresult_sts->GetParameter(1) << ", " << fitresult_sts->GetParameter(2);
821 LOG(info) << "STS signal/background (p0/p3) = "
822 << (fitresult_sts->GetParameter(0)) / (fitresult_sts->GetParameter(3));
823 }
824
825 //MUCH
826 if (much_average > 0) {
827 TF1* gs_much =
828 new TF1("gs_much", "gaus(0)+pol0(3)", much_peak_pos - 2 * fMuchPeakWidthNs, much_peak_pos + 2 * fMuchPeakWidthNs);
829 gs_much->SetParameters(much_average, much_peak_pos, fMuchPeakWidthNs, much_average);
830 fBmonMuchDiff->Fit("gs_much", "R");
831 TF1* fitresult_much = fBmonMuchDiff->GetFunction("gs_much");
832 LOG(info) << "MUCH parameters from Gauss fit = " << fitresult_much->GetParameter(0) << ", "
833 << fitresult_much->GetParameter(1) << ", " << fitresult_much->GetParameter(2);
834 LOG(info) << "MUCH signal/background (p0/p3) = "
835 << (fitresult_much->GetParameter(0)) / (fitresult_much->GetParameter(3));
836 }
837
838 //TOF
839 if (tof_average > 0) {
840 TF1* gs_tof =
841 new TF1("gs_tof", "gaus(0)+pol0(3)", tof_peak_pos - 2 * fTofPeakWidthNs, tof_peak_pos + 2 * fTofPeakWidthNs);
842 gs_tof->SetParameters(tof_average, tof_peak_pos, fTofPeakWidthNs, tof_average);
843 fBmonTofDiff->Fit("gs_tof", "R");
844 TF1* fitresult_tof = fBmonTofDiff->GetFunction("gs_tof");
845 LOG(info) << "TOF parameters from Gauss fit = " << fitresult_tof->GetParameter(0) << ", "
846 << fitresult_tof->GetParameter(1) << ", " << fitresult_tof->GetParameter(2);
847 LOG(info) << "TOF signal/background (p0/p3) = "
848 << (fitresult_tof->GetParameter(0)) / (fitresult_tof->GetParameter(3));
849 }
850
851 //RICH
852 if (rich_average > 0) {
853 TF1* gs_rich =
854 new TF1("gs_rich", "gaus(0)+pol0(3)", rich_peak_pos - 2 * fRichPeakWidthNs, rich_peak_pos + 2 * fRichPeakWidthNs);
855 gs_rich->SetParameters(0.5 * rich_average, rich_peak_pos, fRichPeakWidthNs, rich_average);
856 fBmonRichDiff->Fit("gs_rich", "R");
857 TF1* fitresult_rich = fBmonRichDiff->GetFunction("gs_rich");
858 LOG(info) << "RICH parameters from Gauss fit = " << fitresult_rich->GetParameter(0) << ", "
859 << fitresult_rich->GetParameter(1) << ", " << fitresult_rich->GetParameter(2);
860 LOG(info) << "RICH signal/background (p0/p3) = "
861 << (fitresult_rich->GetParameter(0)) / (fitresult_rich->GetParameter(3));
862 }
863
864 //PSD
865 if (psd_average > 0) {
866 TF1* gs_psd =
867 new TF1("gs_psd", "gaus(0)+pol0(3)", psd_peak_pos - 2 * fPsdPeakWidthNs, psd_peak_pos + 2 * fPsdPeakWidthNs);
868 gs_psd->SetParameters(psd_average, psd_peak_pos, fPsdPeakWidthNs, psd_average);
869 fBmonPsdDiff->Fit("gs_psd", "R");
870 TF1* fitresult_psd = fBmonPsdDiff->GetFunction("gs_psd");
871 LOG(info) << "PSD parameters from Gauss fit = " << fitresult_psd->GetParameter(0) << ", "
872 << fitresult_psd->GetParameter(1) << ", " << fitresult_psd->GetParameter(2);
873 LOG(info) << "PSD signal/background (p0/p3) = "
874 << (fitresult_psd->GetParameter(0)) / (fitresult_psd->GetParameter(3));
875 }
876}
877
879{
880 TFile* old = gFile;
881 TFile* outfile = TFile::Open(fOutFileName, "RECREATE");
882
883 fBmonStsDiff->Write();
884 fBmonMuchDiff->Write();
885 fBmonTrdDiff->Write();
886 fBmonTofDiff->Write();
887 fBmonRichDiff->Write();
888 fBmonPsdDiff->Write();
889
890 fBmonStsDiffCharge->Write();
891 fBmonMuchDiffCharge->Write();
892 fBmonTrdDiffCharge->Write();
893 fBmonTofDiffCharge->Write();
894 fBmonRichDiffCharge->Write();
895 fBmonPsdDiffCharge->Write();
896
897 fBmonStsDiffEvo->Write();
898 fBmonMuchDiffEvo->Write();
899 fBmonTrdDiffEvo->Write();
900 fBmonTofDiffEvo->Write();
901 fBmonRichDiffEvo->Write();
902 fBmonPsdDiffEvo->Write();
903
904 fBmonStsDiffEvoLong->Write();
905 fBmonMuchDiffEvoLong->Write();
906 fBmonTrdDiffEvoLong->Write();
907 fBmonTofDiffEvoLong->Write();
908 fBmonRichDiffEvoLong->Write();
909 fBmonPsdDiffEvoLong->Write();
910
911 fBmonBmonDiff->Write();
912 fStsStsDiff->Write();
913 fMuchMuchDiff->Write();
914 fTrdTrdDiff->Write();
915 fTofTofDiff->Write();
916 fRichRichDiff->Write();
917 fPsdPsdDiff->Write();
918
919 fBmonAddress->Write();
920 fBmonChannel->Write();
921
922 fBmonStsDpbDiff->Write();
923 for (UInt_t uStsDpb = 0; uStsDpb < kuMaxNbStsDpbs; ++uStsDpb) {
924 fBmonStsDpbDiffEvo[uStsDpb]->Write();
925 fStsDpbCntsEvo[uStsDpb]->Write();
926 }
927
928 fBmonMuchRocDiff->Write();
929 fBmonMuchAsicDiff->Write();
930 for (UInt_t uMuchAsic = 0; uMuchAsic < kuMaxNbMuchAsics; ++uMuchAsic)
931 fBmonMuchAsicDiffEvo[uMuchAsic]->Write();
932
933 fSelBmonStsDiff->Write();
934 fSelBmonMuchDiff->Write();
935 fSelBmonTrdDiff->Write();
936 fSelBmonTofDiff->Write();
937 fSelBmonRichDiff->Write();
938 fSelBmonPsdDiff->Write();
939
940 outfile->Close();
941 delete outfile;
942
943 gFile = old;
944}
945
ClassImp(CbmConverterManager)
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kPsd
Projectile spectator detector.
@ kSts
Silicon Tracking System.
@ kMuch
Muon detection system.
@ kRich
Ring-Imaging Cherenkov Detector.
std::vector< double > GenerateLogBinArray(uint32_t uNbDecadesLog, uint32_t uNbStepsDecade, uint32_t uNbSubStepsInStep, uint32_t &uNbBinsLog, int32_t iStartExp, bool bAddZeroStart)
Int_t CalcNrBins(Int_t)
TClonesArray * fBmonDigiArr
Double_t fStsPeakWidthNs
Double_t sts_coin_peak_pos
TH2 * fBmonMuchAsicDiffEvo[kuMaxNbMuchAsics]
Double_t much_coin_peak_pos
TH1 * fStsDpbCntsEvo[kuMaxNbStsDpbs]
Int_t fPrevBmonFirstDigiTrd
TH2 * fBmonStsDpbDiffEvo[kuMaxNbStsDpbs]
virtual InitStatus Init()
Double_t fPrevTimeTrd
Double_t fTrdPeakWidthNs
const std::vector< CbmTofDigi > * fBmonDigiVec
Int_t fPrevBmonFirstDigiMuch
static const UInt_t kuMaxNbStsDpbs
Double_t fMuchPeakWidthNs
Double_t fPrevTimeTof
void CheckInterSystemOffset()
Double_t much_average
virtual InitStatus ReInit()
Double_t psd_coin_peak_pos
Int_t FillHistosSelBmon(TH1 *histo, const Double_t T0Time, const Int_t offsetRange, Int_t iStartDigi, Bool_t bSts=kFALSE, Bool_t bMuch=kFALSE, Bool_t bTof=kFALSE, Bool_t bPsd=kFALSE)
Double_t fPrevTimeMuch
Int_t fPrevBmonFirstDigiSts
Double_t tof_peak_pos
Double_t rich_coin_peak_pos
Double_t fPrevTimeBmon
Variables to store the previous digi time.
Double_t trd_coin_peak_pos
Bool_t fCheckTimeOrdering
Double_t fPrevTimeRich
Double_t sts_peak_pos
Int_t fPrevBmonFirstDigiRich
static const UInt_t kuMaxNbMuchDpbs
Double_t fPsdPeakWidthNs
CbmDigiManager * fDigiMan
Int_t fPrevBmonFirstDigiTof
Int_t FillSystemOffsetHistos(TH1 *histo, TH2 *histoCharge, TH2 *histoEvo, TH2 *histoEvoLong, TH2 *histoAFCK, const Double_t T0Time, const Int_t offsetRange, Int_t iStartDigi, Bool_t bSts=kFALSE, Bool_t bMuch=kFALSE, Bool_t bTof=kFALSE, Bool_t bPsd=kFALSE)
Int_t CheckIfSorted(TH1 *, Double_t &, TString)
Double_t much_peak_pos
std::vector< Double_t > fvdTimeSelectedBmon
Double_t psd_peak_pos
Double_t trd_peak_pos
virtual void Finish()
Double_t fPrevTimeSts
virtual void SetParContainers()
Double_t rich_average
static const UInt_t kuMaxNbMuchAsics
UInt_t fuMinTotPulserBmon
User settings: Data correction parameters.
Double_t fPrevTimePsd
UInt_t fuMaxTotPulserBmon
Int_t CheckIfSortedBmon(TH1 *, Double_t &, TString)
Double_t fTofPeakWidthNs
Double_t fRichPeakWidthNs
Int_t fPrevBmonFirstDigiPsd
virtual void Exec(Option_t *)
Bool_t fCheckInterSystemOffset
Double_t rich_peak_pos
static Int_t GetNofDigis(ECbmModuleId systemId)
static Bool_t IsPresent(ECbmModuleId systemId)
Presence of a digi branch.
void UseMuchBeamTimeDigi(Bool_t)
Use CbmMuchBeamTimeDigi instead of CbmMuchDigi for MUCH.
InitStatus Init()
Initialisation.
const Digi * Get(Int_t index) const
Get a digi object.
static CbmDigiManager * Instance()
Static instance.
Data class for a single-channel message in the STS.
Definition CbmStsDigi.h:40
XPU_D int32_t GetAddress() const
Definition CbmStsDigi.h:74
Data class for expanded digital TOF information.
Definition CbmTofDigi.h:47
double GetChannel() const
Channel .
Definition CbmTofDigi.h:156
int32_t GetAddress() const
Inherited from CbmDigi.
Definition CbmTofDigi.h:112
double GetTime() const
Inherited from CbmDigi.
Definition CbmTofDigi.h:131
double GetCharge() const
Inherited from CbmDigi.
Definition CbmTofDigi.h:136