CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2018UnpackerTaskTof.cxx
Go to the documentation of this file.
1/* Copyright (C) 2019-2020 Facility for Antiproton and Ion Research in Europe, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau [committer] */
4
5// -----------------------------------------------------------------------------
6// ----- -----
7// ----- CbmMcbm2018UnpackerTaskTof -----
8// ----- Created 10.02.2019 by P.-A. Loizeau -----
9// ----- -----
10// -----------------------------------------------------------------------------
11
13
14#include "CbmMcbm2018TofPar.h"
16#include "FairParGenericSet.h"
17#include "FairRootManager.h"
18#include "FairRun.h"
19#include "FairRunOnline.h"
20#include "FairRuntimeDb.h"
21#include "TClonesArray.h"
22#include "TH1.h"
23#include "THttpServer.h"
24#include "TROOT.h"
25#include "TString.h"
26
27#include <Logger.h>
28
29#include <TFile.h>
30
31#include <chrono>
32#include <cstdint>
33#include <fstream>
34#include <iomanip>
35#include <iostream>
36
38
41 , fbMonitorMode(kFALSE)
42 , fbDebugMonitorMode(kFALSE)
43 , fbSeparateArrayBmon(kFALSE)
44 , fbWriteOutput(kTRUE)
45 , fuDigiMaskedIdBmon(0x00002806)
46 , fuDigiMaskId(0x001FFFFF)
47 , fulTsCounter(0)
48 , fUnpackerAlgo(nullptr)
49{
51}
52
54
56{
57 LOG(info) << "CbmMcbm2018UnpackerTaskTof::Init";
58 LOG(info) << "Initializing mCBM TOF 2018 Unpacker";
59
60 FairRootManager* ioman = FairRootManager::Instance();
61 if (NULL == ioman) { LOG(fatal) << "No FairRootManager instance"; }
62
63 fpvDigiTof = new std::vector<CbmTofDigi>();
64 ioman->RegisterAny("TofDigi", fpvDigiTof, fbWriteOutput);
65
66 if (kTRUE == fbSeparateArrayBmon) {
67 fpvDigiBmon = new std::vector<CbmTofDigi>();
68 ioman->RegisterAny("BmonDigi", fpvDigiBmon, fbWriteOutput);
69 } // if( kTRUE == fbSeparateArrayBmon )
70
71 return kTRUE;
72}
73
75{
76 LOG(info) << "Setting parameter containers for " << GetName();
77
78 TList* fParCList = fUnpackerAlgo->GetParList();
79
80 for (Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC) {
81 FairParGenericSet* tempObj = (FairParGenericSet*) (fParCList->At(iparC));
82 fParCList->Remove(tempObj);
83
84 std::string sParamName {tempObj->GetName()};
85 FairParGenericSet* newObj =
86 dynamic_cast<FairParGenericSet*>(FairRun::Instance()->GetRuntimeDb()->getContainer(sParamName.data()));
87
88 if (nullptr == newObj) {
89 LOG(error) << "Failed to obtain parameter container " << sParamName << ", for parameter index " << iparC;
90 return;
91 } // if( nullptr == newObj )
92
93 fParCList->AddAt(newObj, iparC);
94 // delete tempObj;
95 } // for( Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC )
96}
97
99{
100 LOG(info) << "Init parameter containers for " << GetName();
101
103 CbmMcbm2018TofPar* pUnpackPar =
104 dynamic_cast<CbmMcbm2018TofPar*>(FairRun::Instance()->GetRuntimeDb()->getContainer("CbmMcbm2018TofPar"));
105 if (nullptr == pUnpackPar) {
106 LOG(error) << "Failed to obtain parameter container CbmMcbm2018TofPar";
107 return kFALSE;
108 } // if( nullptr == pUnpackPar )
109 /*
110 fbMonitorMode = pUnpackPar->GetMonitorMode();
111 LOG(info) << "Monitor mode: "
112 << ( fbMonitorMode ? "ON" : "OFF" );
113
114 fbDebugMonitorMode = pUnpackPar->GetDebugMonitorMode();
115 LOG(info) << "Debug Monitor mode: "
116 << ( fbDebugMonitorMode ? "ON" : "OFF" );
117*/
118 Bool_t initOK = fUnpackerAlgo->InitContainers();
119
121 if (kTRUE == fbMonitorMode) {
123 initOK &= fUnpackerAlgo->CreateHistograms();
124
125 fhArraySize = new TH1I("fhArraySize", "Size of the Array VS TS index; TS index; Size [bytes]", 10000, 0., 10000.);
127 new TH1I("fhArrayCapacity", "Size of the Array VS TS index; TS index; Size [bytes]", 10000, 0., 10000.);
128
130 std::vector<std::pair<TNamed*, std::string>> vHistos = fUnpackerAlgo->GetHistoVector();
131
133 THttpServer* server = FairRunOnline::Instance()->GetHttpServer();
134 if (nullptr != server) {
135 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
136 server->Register(Form("/%s", vHistos[uHisto].second.data()), vHistos[uHisto].first);
137 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
138
139 server->RegisterCommand("/Reset_UnpTof_Hist", "bMcbm2018UnpackerTaskTofResetHistos=kTRUE");
140 server->Restrict("/Reset_UnpTof_Hist", "allow=admin");
141
142 server->Register("/Array", fhArraySize);
143 server->Register("/Array", fhArrayCapacity);
144 } // if( nullptr != server )
145 } // if( kTRUE == fbMonitorMode )
146
147 fUnpackerAlgo->SetMonitorMode(fbMonitorMode);
148
149 return initOK;
150}
151
153{
154 LOG(info) << "ReInit parameter containers for " << GetName();
155 Bool_t initOK = fUnpackerAlgo->ReInitContainers();
156
157 return initOK;
158}
159
160void CbmMcbm2018UnpackerTaskTof::AddMsComponentToList(size_t component, UShort_t usDetectorId)
161{
162 fUnpackerAlgo->AddMsComponentToList(component, usDetectorId);
163}
164
165Bool_t CbmMcbm2018UnpackerTaskTof::DoUnpack(const fles::Timeslice& ts, size_t /*component*/)
166{
168 LOG(info) << "Reset TOF unpacker histos ";
169 fUnpackerAlgo->ResetHistograms();
171 } // if( fbMonitorMode && bMcbm2018UnpackerTaskTofResetHistos )
172
173 if (kFALSE == fUnpackerAlgo->ProcessTs(ts)) {
174 LOG(error) << "Failed processing TS " << ts.index() << " in unpacker algorithm class";
175 return kTRUE;
176 } // if( kFALSE == fUnpackerAlgo->ProcessTs( ts ) )
177
179 std::vector<CbmTofDigi>& vDigi = fUnpackerAlgo->GetVector();
180 LOG(debug) << "Found " << vDigi.size() << " TOF digis during unpacking";
181
182 /*
184 => Done in the algo!!!
185 sort(vDigi.begin(), vDigi.end(),
186 [](const CbmTofDigi & a, const CbmTofDigi & b) -> bool
187 {
188 return a.GetTime() < b.GetTime();
189 });
190*/
191
192 for (auto digi : vDigi) {
193 if (kTRUE == fbSeparateArrayBmon && fuDigiMaskedIdBmon == (digi.GetAddress() & fuDigiMaskId)) {
195 LOG(debug) << "Fill digi Bmon vector with " << Form("0x%08x", digi.GetAddress()) << " at " << fpvDigiBmon->size();
196 fpvDigiBmon->emplace_back(digi);
197 } // if( kTRUE == fbSeparateArrayBmon && fuDigiMaskedIdBmon == ( digi.GetAddress() & fuDigiMaskId ) )
198 else {
200 LOG(debug) << "Fill digi TOF vector with " << Form("0x%08x", digi.GetAddress()) << " at " << fpvDigiTof->size();
201 fpvDigiTof->emplace_back(digi);
202 } // else of if( kTRUE == fbSeparateArrayBmon && fuDigiMaskedIdBmon == ( digi.GetAddress() & fuDigiMaskId ) )
203 }
204
205 vDigi.clear();
206 fUnpackerAlgo->ClearVector();
207 if (kTRUE == fbMonitorMode) {
208 if (kTRUE == fbSeparateArrayBmon) {
209 fhArraySize->Fill(fulTsCounter, fpvDigiTof->size() + fpvDigiBmon->size());
210 fhArrayCapacity->Fill(fulTsCounter, fpvDigiTof->capacity() + fpvDigiBmon->capacity());
211 } // if( kTRUE == fbSeparateArrayBmon )
212 else {
213 fhArraySize->Fill(fulTsCounter, fpvDigiTof->size());
214 fhArrayCapacity->Fill(fulTsCounter, fpvDigiTof->capacity());
215 } // else of if( kTRUE == fbSeparateArrayBmon )
216 } // if( kTRUE == fbMonitorMode )
217
218 if (0 == fulTsCounter % 10000) LOG(info) << "Processed " << fulTsCounter << "TS";
219 fulTsCounter++;
220
221 return kTRUE;
222}
223
225{
226 fpvDigiTof->clear();
227
228 if (kTRUE == fbSeparateArrayBmon) { fpvDigiBmon->clear(); } // if( kTRUE == fbSeparateArrayBmon )
229}
230
231
233{
235 if (kTRUE == fbMonitorMode) {
237 std::vector<std::pair<TNamed*, std::string>> vHistos = fUnpackerAlgo->GetHistoVector();
238
240 TFile* oldFile = gFile;
241 TDirectory* oldDir = gDirectory;
242
243 TFile* histoFile = nullptr;
244
245 // open separate histo file in recreate mode
246 histoFile = new TFile("data/HistosUnpackerTof.root", "RECREATE");
247 histoFile->cd();
248
250 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
252 TString sFolder = vHistos[uHisto].second.data();
253 if (nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
254 gDirectory->cd(sFolder);
255
257 vHistos[uHisto].first->Write();
258
259 histoFile->cd();
260 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
261
262 fhArraySize->Write();
263 fhArrayCapacity->Write();
264
266 gFile = oldFile;
267 gDirectory = oldDir;
268
269 histoFile->Close();
270 } // if( kTRUE == fbMonitorMode )
271}
272
273void CbmMcbm2018UnpackerTaskTof::SetIgnoreOverlapMs(Bool_t bFlagIn) { fUnpackerAlgo->SetIgnoreOverlapMs(bFlagIn); }
274
275void CbmMcbm2018UnpackerTaskTof::SetTimeOffsetNs(Double_t dOffsetIn) { fUnpackerAlgo->SetTimeOffsetNs(dOffsetIn); }
276void CbmMcbm2018UnpackerTaskTof::SetDiamondDpbIdx(UInt_t uIdx) { fUnpackerAlgo->SetDiamondDpbIdx(uIdx); }
277
ClassImp(CbmConverterManager)
Bool_t bMcbm2018UnpackerTaskTofResetHistos
int Int_t
bool Bool_t
std::vector< CbmTofDigi > * fpvDigiTof
Output vectors.
uint64_t fulTsCounter
Statistics & first TS rejection.
CbmMcbm2018UnpackerAlgoTof * fUnpackerAlgo
Processing algo.
Bool_t fbSeparateArrayBmon
Switch ON the filling of a additional set of histograms.
Bool_t fbDebugMonitorMode
Switch ON the filling of a minimal set of histograms.
std::vector< CbmTofDigi > * fpvDigiBmon
UInt_t fuDigiMaskedIdBmon
If ON the output TClonesArray of digi is written to disk.
void SetTimeOffsetNs(Double_t dOffsetIn=0.0)
void AddMsComponentToList(size_t component, UShort_t usDetectorId)
Temp until we change from CbmMcbmUnpack to something else.
Bool_t fbWriteOutput
If ON, Bmon digis are saved in separate TClonesArray.
void SetIgnoreOverlapMs(Bool_t bFlagIn=kTRUE)
virtual Bool_t DoUnpack(const fles::Timeslice &ts, size_t component)