CbmRoot
Loading...
Searching...
No Matches
CbmCosy2019UnpackerTaskHodo.cxx
Go to the documentation of this file.
1/* Copyright (C) 2019-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Pierre-Alain Loizeau, Florian Uhlig [committer] */
4
5// -----------------------------------------------------------------------------
6// ----- -----
7// ----- CbmCosy2019UnpackerTaskHodo -----
8// ----- Created 31/07/19 by P.-A. Loizeau -----
9// ----- -----
10// -----------------------------------------------------------------------------
11
13
14#include "CbmCosy2019HodoPar.h"
16
17//#include "CbmMcbm2018StsPar.h"
19#include "FairParGenericSet.h"
20#include "FairRootManager.h"
21#include "FairRun.h"
22#include "FairRunOnline.h"
23#include "FairRuntimeDb.h"
24#include "TClonesArray.h"
25#include "THttpServer.h"
26#include "TROOT.h"
27#include "TString.h"
28
29#include <Logger.h>
30
31#include <TFile.h>
32
33#include <chrono>
34#include <cstdint>
35#include <fstream>
36#include <iomanip>
37#include <iostream>
38
40
52
58
60{
61 LOG(info) << "CbmCosy2019UnpackerTaskHodo::Init";
62 LOG(info) << "Initializing mCBM STS 2018 Unpacker";
63
64 FairRootManager* ioman = FairRootManager::Instance();
65 if (NULL == ioman) { LOG(fatal) << "No FairRootManager instance"; }
67 if (nullptr != ioman->InitObjectAs<std::vector<CbmStsDigi> const*>("StsDigi"))
68 LOG(fatal) << "CbmCosy2019UnpackerTaskHodo::Init => output vector already "
69 "registered,"
70 << " probably by CbmMcbm2018UnpackerTaskSts" << std::endl
71 << " THESE TWO CLASSES ARE INCOMPATIBLE!";
72
74 fpvDigiSts = new std::vector<CbmStsDigi>();
75 ioman->RegisterAny("StsDigi", fpvDigiSts, fbWriteOutput);
76
78 fpvErrorSts = new std::vector<CbmErrorMessage>();
79 ioman->RegisterAny("CbmStsError", fpvErrorSts, fbWriteOutput);
80
81 return kTRUE;
82}
83
85{
86 LOG(info) << "Setting parameter containers for " << GetName();
87
88 TList* fParCList = fUnpackerAlgo->GetParList();
89
90 for (Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC) {
91 FairParGenericSet* tempObj = (FairParGenericSet*) (fParCList->At(iparC));
92 fParCList->Remove(tempObj);
93
94 std::string sParamName {tempObj->GetName()};
95 FairParGenericSet* newObj =
96 dynamic_cast<FairParGenericSet*>(FairRun::Instance()->GetRuntimeDb()->getContainer(sParamName.data()));
97
98 if (nullptr == newObj) {
99 LOG(error) << "Failed to obtain parameter container " << sParamName << ", for parameter index " << iparC;
100 return;
101 } // if( nullptr == newObj )
102
103 fParCList->AddAt(newObj, iparC);
104 // delete tempObj;
105 } // for( Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC )
106
107 fParCList = fUnpackerAlgoSts->GetParList();
108
109 for (Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC) {
110 FairParGenericSet* tempObj = (FairParGenericSet*) (fParCList->At(iparC));
111 fParCList->Remove(tempObj);
112
113 std::string sParamName {tempObj->GetName()};
114 FairParGenericSet* newObj =
115 dynamic_cast<FairParGenericSet*>(FairRun::Instance()->GetRuntimeDb()->getContainer(sParamName.data()));
116
117 if (nullptr == newObj) {
118 LOG(error) << "Failed to obtain parameter container " << sParamName << ", for parameter index " << iparC;
119 return;
120 } // if( nullptr == newObj )
121
122 fParCList->AddAt(newObj, iparC);
123 // delete tempObj;
124 } // for( Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC )
125}
126
128{
129 LOG(info) << "Init parameter containers for " << GetName();
130
132 CbmCosy2019HodoPar* pUnpackPar =
133 dynamic_cast<CbmCosy2019HodoPar*>(FairRun::Instance()->GetRuntimeDb()->getContainer("CbmCosy2019HodoPar"));
134 if (nullptr == pUnpackPar) {
135 LOG(error) << "Failed to obtain parameter container CbmCosy2019HodoPar";
136 return kFALSE;
137 } // if( nullptr == pUnpackPar )
138 /*
139 fbMonitorMode = pUnpackPar->GetMonitorMode();
140 LOG(info) << "Monitor mode: "
141 << ( fbMonitorMode ? "ON" : "OFF" );
142
143 fbDebugMonitorMode = pUnpackPar->GetDebugMonitorMode();
144 LOG(info) << "Debug Monitor mode: "
145 << ( fbDebugMonitorMode ? "ON" : "OFF" );
146*/
147 Bool_t initOK = fUnpackerAlgo->InitContainers();
148 initOK &= fUnpackerAlgoSts->InitContainers();
149
151 if (kTRUE == fbMonitorMode) {
153 initOK &= fUnpackerAlgo->CreateHistograms();
154 initOK &= fUnpackerAlgoSts->CreateHistograms();
155
157 std::vector<std::pair<TNamed*, std::string>> vHistos = fUnpackerAlgo->GetHistoVector();
158 std::vector<std::pair<TNamed*, std::string>> vHistosSts = fUnpackerAlgoSts->GetHistoVector();
159 vHistos.insert(vHistos.end(), vHistosSts.begin(), vHistosSts.end());
160
162 THttpServer* server = FairRunOnline::Instance()->GetHttpServer();
163 if (nullptr != server) {
164 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
165 server->Register(Form("/%s", vHistos[uHisto].second.data()), vHistos[uHisto].first);
166 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
167
168 server->RegisterCommand("/Reset_UnpHodo_Hist", "bCosy2019UnpackerTaskHodoResetHistos=kTRUE");
169 server->Restrict("/Reset_UnpHodo_Hist", "allow=admin");
170 } // if( nullptr != server )
171
172 } // if( kTRUE == fbMonitorMode )
173
174 fUnpackerAlgo->SetMonitorMode(fbMonitorMode);
175
176 fUnpackerAlgoSts->SetMonitorMode(fbMonitorMode);
177 for (std::vector<FebChanMaskSts>::iterator it = fvChanMasks.begin(); it < fvChanMasks.end(); ++it)
178 fUnpackerAlgoSts->MaskNoisyChannel((*it).uFeb, (*it).uChan, (*it).bMasked);
179
180 return initOK;
181}
182
184{
185 LOG(info) << "ReInit parameter containers for " << GetName();
186 Bool_t initOK = fUnpackerAlgo->ReInitContainers();
187 initOK &= fUnpackerAlgoSts->ReInitContainers();
188
189 return initOK;
190}
191
192void CbmCosy2019UnpackerTaskHodo::AddMsComponentToList(size_t component, UShort_t usDetectorId)
193{
194 fUnpackerAlgo->AddMsComponentToList(component, usDetectorId);
195 fUnpackerAlgoSts->AddMsComponentToList(component, usDetectorId);
196}
197
198Bool_t CbmCosy2019UnpackerTaskHodo::DoUnpack(const fles::Timeslice& ts, size_t /*component*/)
199{
201 LOG(info) << "Reset Hodo + STS unpacker histos ";
202 fUnpackerAlgo->ResetHistograms();
203 fUnpackerAlgoSts->ResetHistograms();
205 } // if( fbMonitorMode && bCosy2019UnpackerTaskHodoResetHistos )
206
207 if (kFALSE == fUnpackerAlgo->ProcessTs(ts)) {
208 LOG(error) << "Failed processing TS " << ts.index() << " in HODO unpacker algorithm class";
209 return kTRUE;
210 } // if( kFALSE == fUnpackerAlgo->ProcessTs( ts ) )
211
212 if (kFALSE == fUnpackerAlgoSts->ProcessTs(ts)) {
213 LOG(error) << "Failed processing TS " << ts.index() << " in STS unpacker algorithm class";
214 return kTRUE;
215 } // if( kFALSE == fUnpackerAlgoSts->ProcessTs( ts ) )
216
218 fpvDigiSts->insert(fpvDigiSts->end(), fUnpackerAlgo->GetVector().begin(), fUnpackerAlgo->GetVector().end());
219 fpvDigiSts->insert(fpvDigiSts->end(), fUnpackerAlgoSts->GetVector().begin(), fUnpackerAlgoSts->GetVector().end());
220
222 sort(fpvDigiSts->begin(), fpvDigiSts->end(),
223 [](const CbmStsDigi& a, const CbmStsDigi& b) -> bool { return a.GetTime() < b.GetTime(); });
224
225 fUnpackerAlgo->ClearVector();
226 fUnpackerAlgoSts->ClearVector();
227
231 fpvErrorSts->insert(fpvErrorSts->end(), fUnpackerAlgo->GetErrorVector().begin(),
232 fUnpackerAlgo->GetErrorVector().end());
233 fpvErrorSts->insert(fpvErrorSts->end(), fUnpackerAlgoSts->GetErrorVector().begin(),
234 fUnpackerAlgoSts->GetErrorVector().end());
235
236 fUnpackerAlgo->ClearErrorVector();
237 fUnpackerAlgoSts->ClearErrorVector();
238
239 if (0 == fulTsCounter % 10000) LOG(info) << "Processed " << fulTsCounter << "TS";
240 fulTsCounter++;
241
242 return kTRUE;
243}
244
246{
247 fpvDigiSts->clear();
248 fpvErrorSts->clear();
249}
250
252{
254 if (kTRUE == fbMonitorMode) {
256 std::vector<std::pair<TNamed*, std::string>> vHistos = fUnpackerAlgo->GetHistoVector();
257 std::vector<std::pair<TNamed*, std::string>> vHistosSts = fUnpackerAlgoSts->GetHistoVector();
258 vHistos.insert(vHistos.end(), vHistosSts.begin(), vHistosSts.end());
259
261 TFile* oldFile = gFile;
262 TDirectory* oldDir = gDirectory;
263
264 TFile* histoFile = nullptr;
265
266 // open separate histo file in recreate mode
267 histoFile = new TFile("data/HistosUnpackerSts.root", "RECREATE");
268 histoFile->cd();
269
271 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
273 TString sFolder = vHistos[uHisto].second.data();
274 if (nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
275 gDirectory->cd(sFolder);
276
278 vHistos[uHisto].first->Write();
279
280 histoFile->cd();
281 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
282
284 gFile = oldFile;
285 gDirectory = oldDir;
286
287 histoFile->Close();
288 } // if( kTRUE == fbMonitorMode )
289}
290
292{
293 fUnpackerAlgo->SetIgnoreOverlapMs(bFlagIn);
294 fUnpackerAlgoSts->SetIgnoreOverlapMs(bFlagIn);
295}
296
297void CbmCosy2019UnpackerTaskHodo::SetTimeOffsetNs(Double_t dOffsetIn) { fUnpackerAlgo->SetTimeOffsetNs(dOffsetIn); }
298
300{
301 fUnpackerAlgoSts->SetTimeOffsetNs(dOffsetIn);
302}
303
304void CbmCosy2019UnpackerTaskHodo::SetTimeOffsetNsAsic(UInt_t uAsicIdx, Double_t dOffsetIn)
305{
306 fUnpackerAlgo->SetTimeOffsetNsAsic(uAsicIdx, dOffsetIn);
307}
308
309void CbmCosy2019UnpackerTaskHodo::SetTimeOffsetNsAsicSts(UInt_t uAsicIdx, Double_t dOffsetIn)
310{
311 fUnpackerAlgoSts->SetTimeOffsetNsAsic(uAsicIdx, dOffsetIn);
312}
313
314void CbmCosy2019UnpackerTaskHodo::MaskNoisyChannelSts(UInt_t uFeb, UInt_t uChan, Bool_t bMasked)
315{
316 fvChanMasks.push_back(FebChanMaskSts {uFeb, uChan, bMasked});
317}
318
319void CbmCosy2019UnpackerTaskHodo::SetAdcCutSts(UInt_t uAdc) { fUnpackerAlgoSts->SetAdcCut(uAdc); }
320
ClassImp(CbmConverterManager)
Bool_t bCosy2019UnpackerTaskHodoResetHistos
int Int_t
bool Bool_t
void MaskNoisyChannelSts(UInt_t uFeb, UInt_t uChan, Bool_t bMasked=kTRUE)
CbmCosy2019UnpackerAlgoHodo * fUnpackerAlgo
Processing algo.
void SetTimeOffsetNsAsic(UInt_t uAsicIdx, Double_t dOffsetIn=0.0)
virtual Bool_t DoUnpack(const fles::Timeslice &ts, size_t component)
CbmMcbm2018UnpackerAlgoSts * fUnpackerAlgoSts
uint64_t fulTsCounter
Statistics & first TS rejection.
void AddMsComponentToList(size_t component, UShort_t usDetectorId)
Temp until we change from CbmMcbmUnpack to something else.
std::vector< CbmStsDigi > * fpvDigiSts
Output vectors.
void SetTimeOffsetNsAsicSts(UInt_t uAsicIdx, Double_t dOffsetIn=0.0)
void SetIgnoreOverlapMs(Bool_t bFlagIn=kTRUE)
Bool_t fbWriteOutput
Switch ON the filling of a additional set of histograms.
void SetTimeOffsetNsSts(Double_t dOffsetIn=0.0)
std::vector< CbmErrorMessage > * fpvErrorSts
void SetTimeOffsetNs(Double_t dOffsetIn=0.0)
std::vector< FebChanMaskSts > fvChanMasks
If ON the output TClonesArray of digi is written to disk.
Data class for a single-channel message in the STS.
Definition CbmStsDigi.h:40