CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2019CheckTimingPairs.cxx
Go to the documentation of this file.
1/* Copyright (C) 2020-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau [committer] */
4
6
7#include "CbmDigiManager.h"
9
10#include "FairRootManager.h"
11#include "FairRunOnline.h"
12#include <Logger.h>
13
14#include "TClonesArray.h"
15#include "TH1.h"
16#include "TH2.h"
17#include "THttpServer.h"
18#include "TProfile.h"
19#include <TDirectory.h>
20#include <TFile.h>
21#include <type_traits>
22
23#include <iomanip>
24#include <iostream>
25using std::fixed;
26using std::setprecision;
27
28// ---- Default constructor -------------------------------------------
29CbmMcbm2019CheckTimingPairs::CbmMcbm2019CheckTimingPairs() : FairTask("CbmMcbm2019CheckTimingPairs") {}
30
31// ---- Destructor ----------------------------------------------------
33
34// ---- Initialisation ----------------------------------------------
36{
37 // Load all necessary parameter containers from the runtime data base
38 /*
39 FairRunAna* ana = FairRunAna::Instance();
40 FairRuntimeDb* rtdb=ana->GetRuntimeDb();
41
42 <CbmMcbm2019CheckTimingPairsDataMember> = (<ClassPointer>*)
43 (rtdb->getContainer("<ContainerName>"));
44 */
45}
46
47// ---- Init ----------------------------------------------------------
49{
50
51 // Get a handle from the IO manager
52 FairRootManager* ioman = FairRootManager::Instance();
53
54 // Digi manager
57 fDigiMan->Init();
58
59 // Bmon is not included in DigiManager; have to take care here
60 // Try to find a vector branch for the digi
61 fBmonDigiVector = ioman->InitObjectAs<std::vector<CbmTofDigi> const*>("BmonDigi");
62 if (!fBmonDigiVector) {
63 LOG(info) << "No Bmon digi vector found; trying TClonesArray";
64 if (std::is_convertible<TObject*, CbmTofDigi*>::value) {
65 fBmonDigiArray = dynamic_cast<TClonesArray*>(ioman->GetObject("BmonDigi"));
66 if (!fBmonDigiArray) LOG(info) << "No Bmon digi input found.";
67 } //? CbmTofDigi derives from TObject
68 } //? No vector for Bmon digis
69
70 if (!fDigiMan->IsPresent(ECbmModuleId::kSts)) { LOG(info) << "No STS digi input found."; }
71
72 if (!fDigiMan->IsPresent(ECbmModuleId::kMuch)) { LOG(info) << "No MUCH digi input found."; }
73
75 LOG(info) << "No TRD digi input found.";
76 } // if ( ! fDigiMan->IsPresent(ECbmModuleId::kTrd) )
77 else {
78 } // else of if ( ! fDigiMan->IsPresent(ECbmModuleId::kTrd) )
79
80 if (!fDigiMan->IsPresent(ECbmModuleId::kTof)) { LOG(info) << "No TOF digi input found."; }
81
82 if (!fDigiMan->IsPresent(ECbmModuleId::kRich)) { LOG(info) << "No RICH digi input found."; }
83
84 if (!fDigiMan->IsPresent(ECbmModuleId::kPsd)) { LOG(info) << "No PSD digi input found."; }
85
87 fTimeSliceMetaDataArray = dynamic_cast<TClonesArray*>(ioman->GetObject("TimesliceMetaData"));
88 if (!fTimeSliceMetaDataArray) LOG(fatal) << "No TS metadata input found";
89
91
92 return kSUCCESS;
93}
94
96{
97
98 Double_t dHistLim = kdDefaultTimeWin + kdClockCycle / 2.0;
99 for (UInt_t uDetA = 0; uDetA < fvsDetectors.size(); ++uDetA) {
100 for (UInt_t uDetB = uDetA; uDetB < fvsDetectors.size(); ++uDetB) {
101 std::string sName = Form("hDt%s_Vs_%s", fvsDetectors[uDetA].c_str(), fvsDetectors[uDetB].c_str());
102 std::string sTitle = Form("Time diff to Bmon for %s VS for %s; Dt %s [ns]; "
103 "dT %s [ns]; Possible pairs []",
104 fvsDetectors[uDetA].c_str(), fvsDetectors[uDetB].c_str(), fvsDetectors[uDetA].c_str(),
105 fvsDetectors[uDetB].c_str());
106 fhDtADtB.push_back(new TH2D(sName.c_str(), sTitle.c_str(), kuNbBinsDefault + 1, -dHistLim, dHistLim,
107 kuNbBinsDefault + 1, -dHistLim, dHistLim));
108 } // for( UInt_t uDetB = uDetA; uDetB < fvsDetectors.size(); ++uDetB )
109 } // for( UInt_t uDetA = 0; uDetA < fvsDetectors.size(); ++uDetA )
110
111
113 FairRunOnline* run = FairRunOnline::Instance();
114 if (run) {
115 THttpServer* server = run->GetHttpServer();
116 if (nullptr != server) {
117 for (UInt_t uPair = 0; uPair < fhDtADtB.size(); ++uPair) {
118 server->Register("/PairTiming", fhDtADtB[uPair]);
119 } // for( UInt_t uPair = 0; uPar < fhDtADtB.size(); ++uPair )
120 } // if( nullptr != server )
121 } // if( run )
122}
123// ---- ReInit -------------------------------------------------------
124InitStatus CbmMcbm2019CheckTimingPairs::ReInit() { return kSUCCESS; }
125
126// ---- Exec ----------------------------------------------------------
127void CbmMcbm2019CheckTimingPairs::Exec(Option_t* /*option*/)
128{
129 LOG(debug) << "executing TS " << fNrTs;
130
131 if (0 < fNrTs && 0 == fNrTs % 1000) LOG(info) << Form("Processing TS %6d", fNrTs);
132
134 UInt_t uNbBmonDigis = 0;
135 if (fBmonDigiVector) uNbBmonDigis = fBmonDigiVector->size();
136 else if (fBmonDigiArray)
137 uNbBmonDigis = fBmonDigiArray->GetEntriesFast();
138
139 /*
140 UInt_t uNbStsDigis = fDigiMan->GetNofDigis(ECbmModuleId::kSts);
141 UInt_t uNbMuchDigis = fDigiMan->GetNofDigis(ECbmModuleId::kMuch);
142 UInt_t uNbTrdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTrd);
143 UInt_t uNbTofDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTof);
144 UInt_t uNbRichDigis = fDigiMan->GetNofDigis(ECbmModuleId::kRich);
145 UInt_t uNbPsdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kPsd);
146*/
147
149 for (UInt_t uBmonDigi = 0; uBmonDigi < uNbBmonDigis; ++uBmonDigi) {
150 const CbmTofDigi* pDigiBmon = nullptr;
151 if (fBmonDigiVector) pDigiBmon = &(fBmonDigiVector->at(uBmonDigi));
152 else if (fBmonDigiArray)
153 pDigiBmon = dynamic_cast<CbmTofDigi*>(fBmonDigiArray->At(uBmonDigi));
154 assert(pDigiBmon);
155
156 // UInt_t uChannel = pDigiBmon->GetChannel();
157 Double_t dTimeBmon = pDigiBmon->GetTime();
158
165 for (UInt_t uIndexDet = 0; uIndexDet < fvsDetectors.size(); ++uIndexDet) {
166 if ("STS" == fvsDetectors[uIndexDet]) {
169 } // if( "STS" == fvsDetectors[ uIndexDet ] )
170 else if ("MUCH" == fvsDetectors[uIndexDet]) {
171 fvuPrevBmonFirstDigiDet[uIndexDet] =
174 } // else if( "MUCH" == fvsDetectors[ uIndexDet ] )
175 else if ("TRD" == fvsDetectors[uIndexDet]) {
178 } // else if( "TRD" == fvsDetectors[ uIndexDet ] )
179 else if ("TOF" == fvsDetectors[uIndexDet]) {
182 } // else if( "TOF" == fvsDetectors[ uIndexDet ] )
183 else if ("RICH" == fvsDetectors[uIndexDet]) {
184 fvuPrevBmonFirstDigiDet[uIndexDet] =
187 } // else if( "RICH" == fvsDetectors[ uIndexDet ] )
188 else if ("PSD" == fvsDetectors[uIndexDet]) {
191 } // else if( "PSD" == fvsDetectors[ uIndexDet ] )
192 else
193 LOG(fatal) << "CbmMcbm2019CheckTimingPairs => Unknown detector";
194 } // for( UInt_t uIndexDet = 0; uIndexDet < fvsDetectors.size(); ++uIndexDet )
195
199 fvDigisBmon.push_back(*pDigiBmon);
201
203 if (0 == fuNbCoincDigisSts) fvDigisSts.push_back(std::vector<CbmStsDigi>());
204 if (0 == fuNbCoincDigisMuch) fvDigisMuch.push_back(std::vector<CbmMuchBeamTimeDigi>());
205 if (0 == fuNbCoincDigisTrd) fvDigisTrd.push_back(std::vector<CbmTrdDigi>());
206 if (0 == fuNbCoincDigisTof) fvDigisTof.push_back(std::vector<CbmTofDigi>());
207 if (0 == fuNbCoincDigisRich) fvDigisRich.push_back(std::vector<CbmRichDigi>());
208 if (0 == fuNbCoincDigisPsd) fvDigisPsd.push_back(std::vector<CbmPsdDigi>());
209 } // if( 0 < uNbCoincDigisSts || 0 < uNbCoincDigisMuch )
210 } // for( UInt_t uBmonDigi = 0; uBmonDigi < uNbBmonDigis; ++uBmonDigi )
211
213 for (UInt_t uIndexBmon = 0; uIndexBmon < fvDigisBmon.size(); ++uIndexBmon) {
214 UInt_t uHistoIdx = 0;
215 for (UInt_t uIndexDetA = 0; uIndexDetA < fvsDetectors.size(); ++uIndexDetA) {
216 for (UInt_t uIndexDetB = uIndexDetA; uIndexDetB < fvsDetectors.size(); ++uIndexDetB) {
217 if ("STS" == fvsDetectors[uIndexDetA]) {
218 FillHistosInter<CbmStsDigi>(uIndexBmon, uIndexDetA, uIndexDetB, fvDigisSts[uIndexBmon], uHistoIdx);
219 } // if( "STS" == fvsDetectors[ uIndexDetA ] )
220 else if ("MUCH" == fvsDetectors[uIndexDetA]) {
221 FillHistosInter<CbmMuchBeamTimeDigi>(uIndexBmon, uIndexDetA, uIndexDetB, fvDigisMuch[uIndexBmon], uHistoIdx);
222 } // else if( "MUCH" == fvsDetectors[ uIndexDetA ] )
223 else if ("TRD" == fvsDetectors[uIndexDetA]) {
224 FillHistosInter<CbmTrdDigi>(uIndexBmon, uIndexDetA, uIndexDetB, fvDigisTrd[uIndexBmon], uHistoIdx);
225 } // else if( "TRD" == fvsDetectors[ uIndexDetA ] )
226 else if ("TOF" == fvsDetectors[uIndexDetA]) {
227 FillHistosInter<CbmTofDigi>(uIndexBmon, uIndexDetA, uIndexDetB, fvDigisTof[uIndexBmon], uHistoIdx);
228 } // else if( "TOF" == fvsDetectors[ uIndexDetA ] )
229 else if ("RICH" == fvsDetectors[uIndexDetA]) {
230 FillHistosInter<CbmRichDigi>(uIndexBmon, uIndexDetA, uIndexDetB, fvDigisRich[uIndexBmon], uHistoIdx);
231 } // else if( "RICH" == fvsDetectors[ uIndexDetA ] )
232 else if ("PSD" == fvsDetectors[uIndexDetA]) {
233 FillHistosInter<CbmPsdDigi>(uIndexBmon, uIndexDetA, uIndexDetB, fvDigisPsd[uIndexBmon], uHistoIdx);
234 } // else if( "PSD" == fvsDetectors[ uIndexDetA ] )
235 else
236 LOG(fatal) << "CbmMcbm2019CheckTimingPairs => Unknown detector";
237
238 uHistoIdx++;
239 } // for( UInt_t uIndexDetB = uIndexDetA; uIndexDetB < fvsDetectors.size(); ++uIndexDetB )
240 } // for( UInt_t uIndexDetA = 0; uIndexDetA < fvsDetectors.size(); ++uIndexDetA )
241
243 fvDigisSts[uIndexBmon].clear();
244 fvDigisMuch[uIndexBmon].clear();
245 fvDigisTrd[uIndexBmon].clear();
246 fvDigisTof[uIndexBmon].clear();
247 fvDigisRich[uIndexBmon].clear();
248 fvDigisPsd[uIndexBmon].clear();
249 } // for( UInt_t uIndexBmon = 0; uIndexBmon < fvDigisBmon.size(); ++uIndexBmon )
251 fvDigisBmon.clear();
252 fvDigisSts.clear();
253 fvDigisMuch.clear();
254 fvDigisTrd.clear();
255 fvDigisTof.clear();
256 fvDigisRich.clear();
257 fvDigisPsd.clear();
258
259 fNrTs++;
260
261 if (0 < fNrTs && 0 == fNrTs % 10000) WriteHistos();
262}
263
264template<class Digi>
265UInt_t CbmMcbm2019CheckTimingPairs::FillCorrBuffer(Double_t dTimeBmon, UInt_t uIndexStart, Double_t dWinStartTime,
266 Double_t dWinStopTime, std::vector<std::vector<Digi>>& vDigi,
267 ECbmModuleId iDetId)
268{
269
270 UInt_t nrDigis = fDigiMan->GetNofDigis(iDetId);
271 UInt_t uFirstDigiInWin = uIndexStart;
272
273 for (UInt_t iDigi = uIndexStart; iDigi < nrDigis; ++iDigi) {
274 const Digi* digi = fDigiMan->Get<Digi>(iDigi);
275
276 Double_t dTimeDet = digi->GetTime();
277 Double_t dTimeDiff = dTimeDet - dTimeBmon;
278
279 if (dTimeDiff < dWinStartTime) {
280 uFirstDigiInWin = iDigi;
281 continue;
282 } // if( dTimeDiff < dWinStartTime )
283 else if (dWinStopTime < dTimeDiff) {
284 break;
285 } // else if( dWinStopTime < dTimeDiff ) of if( dTimeDiff < dWinStartTime )
286
287 switch (iDetId) {
288 case ECbmModuleId::kSts:
289 {
290 const CbmStsDigi* stsDigi = nullptr;
291 try {
292 stsDigi = boost::any_cast<const CbmStsDigi*>(digi);
293 }
294 catch (...) {
295 LOG(fatal) << "Failed boost any_cast in "
296 "CbmMcbm2019CheckPulser::FillSystemOffsetHistos for a "
297 "digi of type "
298 << Digi::GetClassName();
299 } // try/catch
300 assert(stsDigi);
301 UInt_t uAddr = stsDigi->GetAddress();
302 // UInt_t uChan = stsDigi->GetChannel();
303
305 if ((kuDefaultAddress != fuStsAddress && uAddr == fuStsAddress)) continue;
306
308 if (0 == fuNbCoincDigisSts) vDigi.push_back(std::vector<Digi>());
309
310 vDigi[fuNbDigisWithCoincBmon].push_back((*digi));
312
313 break;
314 } // case ECbmModuleId::kSts:
316 {
317 const CbmMuchBeamTimeDigi* muchDigi {nullptr};
318 try {
319 muchDigi = boost::any_cast<const CbmMuchBeamTimeDigi*>(digi);
320 }
321 catch (...) {
322 LOG(fatal) << "Failed boost any_cast in "
323 "CbmMcbm2019CheckPulser::FillSystemOffsetHistos for a "
324 "digi of type "
325 << Digi::GetClassName();
326 } // try/catch
327 assert(muchDigi);
328 UInt_t uAsic = muchDigi->GetNxId();
329 // UInt_t uChan = muchDigi->GetNxCh();
330
332 if ((kuMaxNbMuchAsics != fuMuchAsic && uAsic == fuMuchAsic)) continue;
333
335 if (0 == fuNbCoincDigisMuch) vDigi.push_back(std::vector<Digi>());
336
337 vDigi[fuNbDigisWithCoincBmon].push_back((*digi));
339
340 break;
341 } // case ECbmModuleId::kMuch:
342 case ECbmModuleId::kTrd:
343 {
344 /*
345 UInt_t uAddr = digi->GetAddress();
346
347 if( ( kuDefaultAddress != fuTrdAddress && uAddr == fuTrdAddress ) )
348 continue;
349
351 if( fuMinChargePulserTrd < digi->GetCharge() && digi->GetCharge() < fuMaxChargePulserTrd )
352 continue;
353*/
355 if (0 == fuNbCoincDigisTrd) vDigi.push_back(std::vector<Digi>());
356
357 vDigi[fuNbDigisWithCoincBmon].push_back((*digi));
359
360 break;
361 } // case ECbmModuleId::kTrd:
362 case ECbmModuleId::kTof:
363 {
365 if (fuMinTotPulserTof < digi->GetCharge() && digi->GetCharge() < fuMaxTotPulserTof) continue;
366
368 if (0 == fuNbCoincDigisTof) vDigi.push_back(std::vector<Digi>());
369
370 vDigi[fuNbDigisWithCoincBmon].push_back((*digi));
372
373 break;
374 } // case ECbmModuleId::kTof:
376 {
378 if (fuMinTotPulserRich < digi->GetCharge() && digi->GetCharge() < fuMaxTotPulserRich) continue;
379
381 if (0 == fuNbCoincDigisRich) vDigi.push_back(std::vector<Digi>());
382
383 vDigi[fuNbDigisWithCoincBmon].push_back((*digi));
385
386 break;
387 } // case ECbmModuleId::kRich:
388 case ECbmModuleId::kPsd:
389 {
390 UInt_t uAddr = digi->GetAddress();
391
393 if ((kuDefaultAddress != fuPsdAddress && uAddr == fuPsdAddress)) continue;
394 if (fuMinAdcPulserPsd < digi->GetCharge() && digi->GetCharge() < fuMaxAdcPulserPsd) continue;
395 /*
396 if( digi->GetAddress() == (9<<10)+8 )
397 continue;
398*/
400 if (0 == fuNbCoincDigisPsd) vDigi.push_back(std::vector<Digi>());
401
402 vDigi[fuNbDigisWithCoincBmon].push_back((*digi));
404
405 break;
406 } // case ECbmModuleId::kPsd:
407 default: return 0;
408 } // switch( iDetId )
409 } // for( UInt_t iDigi = uIndexStart; iDigi < nrDigis; ++iDigi )
410
411 return uFirstDigiInWin;
412}
413
414template<class DigiA>
415void CbmMcbm2019CheckTimingPairs::FillHistosInter(UInt_t uIndexBmon, UInt_t uIndexDetA, UInt_t uIndexDetB,
416 std::vector<DigiA>& vCorrDigA, UInt_t uHistoIdx)
417{
418 if ("STS" == fvsDetectors[uIndexDetB]) {
419 FillHistos<DigiA, CbmStsDigi>(uIndexBmon, uIndexDetA, uIndexDetB, vCorrDigA, fvDigisSts[uIndexBmon], uHistoIdx);
420 } // if( "STS" == fvsDetectors[ uIndexDetB ] )
421 else if ("MUCH" == fvsDetectors[uIndexDetB]) {
422 FillHistos<DigiA, CbmMuchBeamTimeDigi>(uIndexBmon, uIndexDetA, uIndexDetB, vCorrDigA, fvDigisMuch[uIndexBmon],
423 uHistoIdx);
424 } // else if( "MUCH" == fvsDetectors[ uIndexDetB ] )
425 else if ("TRD" == fvsDetectors[uIndexDetB]) {
426 FillHistos<DigiA, CbmTrdDigi>(uIndexBmon, uIndexDetA, uIndexDetB, vCorrDigA, fvDigisTrd[uIndexBmon], uHistoIdx);
427 } // else if( "TRD" == fvsDetectors[ uIndexDetB ] )
428 else if ("TOF" == fvsDetectors[uIndexDetB]) {
429 FillHistos<DigiA, CbmTofDigi>(uIndexBmon, uIndexDetA, uIndexDetB, vCorrDigA, fvDigisTof[uIndexBmon], uHistoIdx);
430 } // else if( "TOF" == fvsDetectors[ uIndexDetB ] )
431 else if ("RICH" == fvsDetectors[uIndexDetB]) {
432 FillHistos<DigiA, CbmRichDigi>(uIndexBmon, uIndexDetA, uIndexDetB, vCorrDigA, fvDigisRich[uIndexBmon], uHistoIdx);
433 } // else if( "RICH" == fvsDetectors[ uIndexDetB ] )
434 else if ("PSD" == fvsDetectors[uIndexDetB]) {
435 FillHistos<DigiA, CbmPsdDigi>(uIndexBmon, uIndexDetA, uIndexDetB, vCorrDigA, fvDigisPsd[uIndexBmon], uHistoIdx);
436 } // else if( "PSD" == fvsDetectors[ uIndexDetB ] )
437 else
438 LOG(fatal) << "CbmMcbm2019CheckTimingPairs => Unknown detector";
439}
440template<class DigiA, class DigiB>
441void CbmMcbm2019CheckTimingPairs::FillHistos(UInt_t uIndexBmon, UInt_t /*uIndexDetA*/, UInt_t /*uIndexDetB*/,
442 std::vector<DigiA>& vCorrDigA, std::vector<DigiB>& vCorrDigB,
443 UInt_t uHistoIdx)
444{
445 Double_t dTimeBmon = fvDigisBmon[uIndexBmon].GetTime();
446 /*
447 std::vector< DigiA > vCorrDigA;
448 std::vector< DigiB > vCorrDigB;
449
451 if( "STS" == fvsDetectors[ uIndexDetA ] )
452 {
453 vCorrDigA = fvDigisSts[ uIndexBmon ];
454 } // if( "STS" == fvsDetectors[ uIndexDetA ] )
455 else if( "MUCH" == fvsDetectors[ uIndexDetA ] )
456 {
457 vCorrDigA = fvDigisMuch[ uIndexBmon ];
458 } // else if( "MUCH" == fvsDetectors[ uIndexDetA ] )
459 else if( "TRD" == fvsDetectors[ uIndexDetA ] )
460 {
461 vCorrDigA = fvDigisTrd[ uIndexBmon ];
462 } // else if( "TRD" == fvsDetectors[ uIndexDetA ] )
463 else if( "TOF" == fvsDetectors[ uIndexDetA ] )
464 {
465 vCorrDigA = fvDigisTof[ uIndexBmon ];
466 } // else if( "TOF" == fvsDetectors[ uIndexDetA ] )
467 else if( "RICH" == fvsDetectors[ uIndexDetA ] )
468 {
469 vCorrDigA = fvDigisRich[ uIndexBmon ];
470 } // else if( "RICH" == fvsDetectors[ uIndexDetA ] )
471 else if( "PSD" == fvsDetectors[ uIndexDetA ] )
472 {
473 vCorrDigA = fvDigisPsd[ uIndexBmon ];
474 } // else if( "PSD" == fvsDetectors[ uIndexDetA ] )
475 else LOG( fatal ) << "CbmMcbm2019CheckTimingPairs => Unknown detector";
476
477 if( "STS" == fvsDetectors[ uIndexDetB ] )
478 {
479 vCorrDigB = fvDigisSts[ uIndexBmon ];
480 } // if( "STS" == fvsDetectors[ uIndexDetB ] )
481 else if( "MUCH" == fvsDetectors[ uIndexDetB ] )
482 {
483 vCorrDigB = fvDigisMuch[ uIndexBmon ];
484 } // else if( "MUCH" == fvsDetectors[ uIndexDetB ] )
485 else if( "TRD" == fvsDetectors[ uIndexDetB ] )
486 {
487 vCorrDigB = fvDigisTrd[ uIndexBmon ];
488 } // else if( "TRD" == fvsDetectors[ uIndexDetB ] )
489 else if( "TOF" == fvsDetectors[ uIndexDetB ] )
490 {
491 vCorrDigB = fvDigisTof[ uIndexBmon ];
492 } // else if( "TOF" == fvsDetectors[ uIndexDetB ] )
493 else if( "RICH" == fvsDetectors[ uIndexDetB ] )
494 {
495 vCorrDigB = fvDigisRich[ uIndexBmon ];
496 } // else if( "RICH" == fvsDetectors[ uIndexDetB ] )
497 else if( "PSD" == fvsDetectors[ uIndexDetB ] )
498 {
499 vCorrDigB = fvDigisPsd[ uIndexBmon ];
500 } // else if( "PSD" == fvsDetectors[ uIndexDetB ] )
501 else LOG( fatal ) << "CbmMcbm2019CheckTimingPairs => Unknown detector";
502*/
503 for (UInt_t uIdxDetA = 0; uIdxDetA < vCorrDigA.size(); ++uIdxDetA) {
504 Double_t dTimeDetA = vCorrDigA[uIdxDetA].GetTime();
505 Double_t dDtDetA = dTimeDetA - dTimeBmon;
506
507 for (UInt_t uIdxDetB = 0; uIdxDetB < vCorrDigB.size(); ++uIdxDetB) {
508 Double_t dTimeDetB = vCorrDigB[uIdxDetB].GetTime();
509 Double_t dDtDetB = dTimeDetB - dTimeBmon;
510
511 fhDtADtB[uHistoIdx]->Fill(dDtDetA, dDtDetB);
512 } // for( UInt_t uIdxDetB = 0; uIdxDetB < vCoincDigisDetB[ uEvent ].size(); ++vCoincDigisDetB )
513 } // for( UInt_t uIdxDetA = 0; uIdxDetA < vCoincDigisDetA[ uEvent ].size(); ++vCoincDigisDetA )
514}
515
516
517// ---- Finish --------------------------------------------------------
519
521{
522 TFile* oldFile = gFile;
523 TDirectory* oldDir = gDirectory;
524
525 TFile* outfile = TFile::Open(fOutFileName, "RECREATE");
526
527 for (UInt_t uPair = 0; uPair < fhDtADtB.size(); ++uPair) {
528 fhDtADtB[uPair]->Write();
529 } // for( UInt_t uPair = 0; uPair < fhDtADtB.size(); ++uPair )
530
531 outfile->Close();
532 delete outfile;
533
534 gFile = oldFile;
535 gDirectory = oldDir;
536}
537
ClassImp(CbmConverterManager)
ECbmModuleId
Definition CbmDefs.h:39
@ 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.
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.
const std::vector< CbmTofDigi > * fBmonDigiVector
std::vector< std::vector< CbmPsdDigi > > fvDigisPsd
std::vector< std::vector< CbmTofDigi > > fvDigisTof
std::vector< std::vector< CbmTrdDigi > > fvDigisTrd
void FillHistos(UInt_t uIndexBmon, UInt_t uIndexA, UInt_t uIndexB, std::vector< DigiA > &vCorrDigA, std::vector< DigiB > &vCorrDigB, UInt_t uHistoIdx)
std::vector< std::vector< CbmStsDigi > > fvDigisSts
UInt_t fuNbDigisWithCoincBmon
Variable to store counts of Bmon with at least one coincidence.
UInt_t fuNbCoincDigisSts
Variable to store counts of Bmon with at least one coincidence.
std::vector< CbmTofDigi > fvDigisBmon
Variable to store correlated Digis.
std::vector< std::string > fvsDetectors
List of detectors.
std::vector< std::vector< CbmRichDigi > > fvDigisRich
std::vector< std::vector< CbmMuchBeamTimeDigi > > fvDigisMuch
UInt_t FillCorrBuffer(Double_t dTimeBmon, UInt_t uIndexStart, Double_t dWinStartTime, Double_t dWinStopTime, std::vector< std::vector< Digi > > &vDigi, ECbmModuleId iDetId=ECbmModuleId::kLastModule)
void FillHistosInter(UInt_t uIndexBmon, UInt_t uIndexA, UInt_t uIndexB, std::vector< DigiA > &vCorrDigA, UInt_t uHistoIdx)
static constexpr Double_t kdDefaultTimeWin
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 GetTime() const
Inherited from CbmDigi.
Definition CbmTofDigi.h:131