CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2019CheckDigisMuch.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 <TDirectory.h>
19#include <TFile.h>
20
21#include <iomanip>
22#include <iostream>
23using std::fixed;
24using std::setprecision;
25
26// ---- Default constructor -------------------------------------------
27CbmMcbm2019CheckDigisMuch::CbmMcbm2019CheckDigisMuch() : FairTask("CbmMcbm2019CheckDigisMuch") {}
28
29// ---- Destructor ----------------------------------------------------
31
32// ---- Initialisation ----------------------------------------------
34{
35 // Load all necessary parameter containers from the runtime data base
36 /*
37 FairRunAna* ana = FairRunAna::Instance();
38 FairRuntimeDb* rtdb=ana->GetRuntimeDb();
39
40 <CbmMcbm2019CheckDigisMuchDataMember> = (<ClassPointer>*)
41 (rtdb->getContainer("<ContainerName>"));
42 */
43}
44
45// ---- Init ----------------------------------------------------------
47{
48
49 // Digi Manager
52 fDigiMan->Init();
53
54 // Get a pointer to the previous already existing data level
55 if (!fDigiMan->IsPresent(ECbmModuleId::kMuch)) { LOG(info) << "No MUCH digis found."; }
56
58
59 return kSUCCESS;
60}
61
62
64{
65 Double_t dZoomDuration = (fuStopTs - fuStartTs) * fdTsLength;
66 fDigisPerAsicEvo = new TH2F("fDigisPerAsicEvo", "Digis per Asic evo; Time [ ns ]; ASIC []", dZoomDuration / 1000, 0,
67 dZoomDuration, kuMaxNbAsics, 0, kuMaxNbAsics);
68
69 for (UInt_t uAsic = 0; uAsic < kuMaxNbAsics; ++uAsic)
70 for (UInt_t uChan = 0; uChan < kuNbChansAsic; ++uChan) {
71 fdLastMuchDigi[uAsic][uChan] = 0.0;
72 fdLastMuchDigiPulser[uAsic][uChan] = 0.0;
73 } // loop on channel and asic
74
76 new TH2F("fSameChanDigisDistEvo", "Time dist of digis in same chan evo; Time [ ns ]; Same chan dist [ ns ]", 5000,
77 0, 500000., 1000, 0., 10000.);
78
79 fDigisPerChanEvo = new TH2F("fDigisPerChanEvo", "Time dist of digis in same chan evo; Time [ ns ]; Channel [ ]", 5000,
81
82 std::cout << Form("TS with jump %5u, first TS time off %12.0f, start TS %5u "
83 "stop TS %5u, TS length %9.0f Start time %12.0f",
85 << std::endl;
86}
87// ---- ReInit -------------------------------------------------------
88InitStatus CbmMcbm2019CheckDigisMuch::ReInit() { return kSUCCESS; }
89
90// ---- Exec ----------------------------------------------------------
91void CbmMcbm2019CheckDigisMuch::Exec(Option_t* /*option*/)
92{
93 LOG(debug) << "executing TS " << fNrTs;
94
95 if (0 < fNrTs && 0 == fNrTs % 1000) LOG(info) << Form("Processing TS %6d", fNrTs);
96
98 if (fNrTs < fuStartTs || fuStopTs < fNrTs) {
99 fNrTs++;
100 return;
101 } // if( fNrTs < fuStartTs || fuStopTs < fNrTs )
102
103 Int_t nrMuchDigis = fDigiMan->GetNofDigis(ECbmModuleId::kMuch);
104 LOG(debug) << GetName() << ": MuchDigis: " << nrMuchDigis;
105
106 for (Int_t iMuch = 0; iMuch < nrMuchDigis; ++iMuch) {
107
109
110 Double_t dTime = Digi->GetTime();
111 Double_t dAdc = Digi->GetAdc();
112 UInt_t uAsic = Digi->GetNxId();
113 UInt_t uChan = Digi->GetNxCh();
114
115 Double_t dTimeSinceStart = dTime - fdStartTime;
116 fDigisPerAsicEvo->Fill(dTimeSinceStart, uAsic);
117
118 if (0 == iMuch)
119 std::cout << Form("Much first hit in TS %5d: asic %2u chan %3u time "
120 "%12.0f Bmon time %12.0f check time %12.0f ADC %2.0f",
121 fNrTs, uAsic, uChan, dTime, dTime - fdFirstTsOffs, dTimeSinceStart, dAdc)
122 << std::endl;
123
124 if (fdDigiDistStart < dTimeSinceStart && dTimeSinceStart < fdDigiDistStop) {
125 // std::cout << Form( "Much hit in TS %5d: asic %2u chan %3u Bmon time %12.0f ADC %2.0f",
126 // fNrTs, uAsic, uChan, (dTimeSinceStart - fdDigiDistStart), dAdc )
127 // << std::endl;
128 Double_t dTimeDistLastDigi = dTimeSinceStart - fdLastMuchDigi[uAsic][uChan];
129 fSameChanDigisDistEvo->Fill(dTimeSinceStart - fdDigiDistStart,
130 dTimeDistLastDigi < 10000 ? dTimeDistLastDigi : 9999);
131
132 fDigisPerChanEvo->Fill(dTimeSinceStart - fdDigiDistStart, uAsic * kuNbChansAsic + uChan);
133 }
134 /*
135 if( 0.0 == fdLastMuchDigi[ uAsic ][ uChan ] )
136 std::cout << Form( "Much first hit in TS %5d: asic %2u chan %3u Bmon time %12.0f ADC %2.0f",
137 fNrTs, uAsic, uChan, dTime - fdFirstTsOffs, dAdc )
138 << std::endl;
139*/
140 fdLastMuchDigi[uAsic][uChan] = dTimeSinceStart;
141
142 // if( 9 != uAsic )
143 if (9 != uAsic || uChan < 63) continue;
144 if (fuMaxAdcPulserMuch < Digi->GetAdc() || Digi->GetAdc() < fuMinAdcPulserMuch) continue;
145
146 std::cout << Form("Much pulser in TS %5d: chan %3u Bmon time %12.0f time "
147 "start %12.0f ADC %2.0f dt %12.0f",
148 fNrTs, uChan, dTime, dTimeSinceStart, dAdc, dTime - fdLastMuchDigiPulser[uAsic][uChan])
149 << std::endl;
150 fdLastMuchDigiPulser[uAsic][uChan] = dTime;
151 } // for (Int_t iMuch = 0; iMuch < nrMuchDigis; ++iMuch)
152
153 fNrTs++;
154}
155
156// ---- Finish --------------------------------------------------------
158
160{
161 TFile* oldFile = gFile;
162 TDirectory* oldDir = gDirectory;
163
164 TFile* outfile = TFile::Open(fOutFileName, "RECREATE");
165
166 fDigisPerAsicEvo->Write();
167 fSameChanDigisDistEvo->Write();
168 fDigisPerChanEvo->Write();
169
170 outfile->Close();
171 delete outfile;
172
173 gFile = oldFile;
174 gDirectory = oldDir;
175}
176
ClassImp(CbmConverterManager)
@ kMuch
Muon detection system.
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.
Double_t fdLastMuchDigiPulser[kuMaxNbAsics][kuNbChansAsic]
Double_t fdLastMuchDigi[kuMaxNbAsics][kuNbChansAsic]