CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2018UnpackerTaskSts.cxx
Go to the documentation of this file.
1/* Copyright (C) 2019-2021 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// ----- CbmMcbm2018UnpackerTaskSts -----
8// ----- Created 26.01.2019 by P.-A. Loizeau -----
9// ----- -----
10// -----------------------------------------------------------------------------
11
13
14#include "CbmMcbm2018StsPar.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 "THttpServer.h"
23#include "TROOT.h"
24#include "TString.h"
25
26#include <Logger.h>
27
28#include <TFile.h>
29
30#include <chrono>
31#include <cstdint>
32#include <fstream>
33#include <iomanip>
34#include <iostream>
35
37
48
50
52{
53 LOG(info) << "CbmMcbm2018UnpackerTaskSts::Init";
54 LOG(info) << "Initializing mCBM STS 2018 Unpacker";
55
56 FairRootManager* ioman = FairRootManager::Instance();
57 if (NULL == ioman) { LOG(fatal) << "No FairRootManager instance"; }
58
60 if (nullptr != ioman->InitObjectAs<std::vector<CbmStsDigi> const*>("StsDigi"))
61 LOG(fatal) << "CbmMcbm2018UnpackerTaskSts::Init => output vector already registered,"
62 << " probably by CbmMcbm2018UnpackerTaskHodo" << std::endl
63 << " THESE TWO CLASSES ARE INCOMPATIBLE!";
64
66 fpvDigiSts = &(fUnpackerAlgo->GetVector());
67 ioman->RegisterAny("StsDigi", fpvDigiSts, fbWriteOutput);
68
69 if (fbPulserOutput) {
71 fpvPulserDigiSts = &(fUnpackerAlgo->GetPulserVector());
72 ioman->RegisterAny("StsDigiPulser", fpvPulserDigiSts, fbWriteOutput);
73 }
74
76 fpvErrorSts = &(fUnpackerAlgo->GetErrorVector());
77 ioman->RegisterAny("CbmStsError", fpvErrorSts, fbWriteOutput);
78
79 return kTRUE;
80}
81
83{
84 LOG(info) << "Setting parameter containers for " << GetName();
85
86 TList* fParCList = fUnpackerAlgo->GetParList();
87
88 for (Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC) {
89 FairParGenericSet* tempObj = (FairParGenericSet*) (fParCList->At(iparC));
90 fParCList->Remove(tempObj);
91
92 std::string sParamName {tempObj->GetName()};
93 FairParGenericSet* newObj =
94 dynamic_cast<FairParGenericSet*>(FairRun::Instance()->GetRuntimeDb()->getContainer(sParamName.data()));
95
96 if (nullptr == newObj) {
97 LOG(error) << "Failed to obtain parameter container " << sParamName << ", for parameter index " << iparC;
98 return;
99 } // if( nullptr == newObj )
100
101 fParCList->AddAt(newObj, iparC);
102 // delete tempObj;
103 } // for( Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC )
104}
105
107{
108 LOG(info) << "Init parameter containers for " << GetName();
109
111 CbmMcbm2018StsPar* pUnpackPar =
112 dynamic_cast<CbmMcbm2018StsPar*>(FairRun::Instance()->GetRuntimeDb()->getContainer("CbmMcbm2018StsPar"));
113 if (nullptr == pUnpackPar) {
114 LOG(error) << "Failed to obtain parameter container CbmMcbm2018StsPar";
115 return kFALSE;
116 } // if( nullptr == pUnpackPar )
117 /*
118 fbMonitorMode = pUnpackPar->GetMonitorMode();
119 LOG(info) << "Monitor mode: "
120 << ( fbMonitorMode ? "ON" : "OFF" );
121
122 fbDebugMonitorMode = pUnpackPar->GetDebugMonitorMode();
123 LOG(info) << "Debug Monitor mode: "
124 << ( fbDebugMonitorMode ? "ON" : "OFF" );
125*/
126 Bool_t initOK = fUnpackerAlgo->InitContainers();
127
129 if (kTRUE == fbMonitorMode) {
131 initOK &= fUnpackerAlgo->CreateHistograms();
132
134 std::vector<std::pair<TNamed*, std::string>> vHistos = fUnpackerAlgo->GetHistoVector();
135
137 THttpServer* server = FairRunOnline::Instance()->GetHttpServer();
138 if (nullptr != server) {
139 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
140 server->Register(Form("/%s", vHistos[uHisto].second.data()), vHistos[uHisto].first);
141 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
142
143 server->RegisterCommand("/Reset_UnpSts_Hist", "bMcbm2018UnpackerTaskStsResetHistos=kTRUE");
144 server->Restrict("/Reset_UnpSts_Hist", "allow=admin");
145 } // if( nullptr != server )
146
147 } // if( kTRUE == fbMonitorMode )
148
149 fUnpackerAlgo->SetMonitorMode(fbMonitorMode);
150 for (std::vector<FebChanMask>::iterator it = fvChanMasks.begin(); it < fvChanMasks.end(); ++it)
151 fUnpackerAlgo->MaskNoisyChannel((*it).uFeb, (*it).uChan, (*it).bMasked);
152
153 return initOK;
154}
155
157{
158 LOG(info) << "ReInit parameter containers for " << GetName();
159 Bool_t initOK = fUnpackerAlgo->ReInitContainers();
160
161 return initOK;
162}
163
164void CbmMcbm2018UnpackerTaskSts::AddMsComponentToList(size_t component, UShort_t usDetectorId)
165{
166 fUnpackerAlgo->AddMsComponentToList(component, usDetectorId);
167}
168
169Bool_t CbmMcbm2018UnpackerTaskSts::DoUnpack(const fles::Timeslice& ts, size_t /*component*/)
170{
172 LOG(info) << "Reset STS unpacker histos ";
173 fUnpackerAlgo->ResetHistograms();
175 } // if( fbMonitorMode && bMcbm2018UnpackerTaskStsResetHistos )
176
177 if (kFALSE == fUnpackerAlgo->ProcessTs(ts)) {
178 LOG(error) << "Failed processing TS " << ts.index() << " in unpacker algorithm class";
179 return kTRUE;
180 } // if( kFALSE == fUnpackerAlgo->ProcessTs( ts ) )
181
182 /*
184 => Done in the algo!!!
185 sort(fpvDigiSts->begin(), fpvDigiSts->end(),
186 [](const CbmStsDigi & a, const CbmStsDigi & b) -> bool
187 {
188 return a.GetTime() < b.GetTime();
189 });
190*/
191
192 if (0 == fulTsCounter % 10000) LOG(info) << "Processed " << fulTsCounter << "TS";
193 fulTsCounter++;
194
195 return kTRUE;
196}
197
199{
200 fUnpackerAlgo->ClearVector();
201 fUnpackerAlgo->ClearErrorVector();
202 if (fbPulserOutput) { fUnpackerAlgo->ClearPulserVector(); }
203}
204
206{
208 if (kTRUE == fbMonitorMode) {
210 std::vector<std::pair<TNamed*, std::string>> vHistos = fUnpackerAlgo->GetHistoVector();
211
213 TFile* oldFile = gFile;
214 TDirectory* oldDir = gDirectory;
215
216 TFile* histoFile = nullptr;
217
218 // open separate histo file in recreate mode
219 histoFile = new TFile("data/HistosUnpackerSts.root", "RECREATE");
220 histoFile->cd();
221
223 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
225 TString sFolder = vHistos[uHisto].second.data();
226 if (nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
227 gDirectory->cd(sFolder);
228
230 vHistos[uHisto].first->Write();
231
232 histoFile->cd();
233 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
234
236 gFile = oldFile;
237 gDirectory = oldDir;
238
239 histoFile->Close();
240 } // if( kTRUE == fbMonitorMode )
241}
242
243void CbmMcbm2018UnpackerTaskSts::SetIgnoreOverlapMs(Bool_t bFlagIn) { fUnpackerAlgo->SetIgnoreOverlapMs(bFlagIn); }
244
245void CbmMcbm2018UnpackerTaskSts::SetTimeOffsetNs(Double_t dOffsetIn) { fUnpackerAlgo->SetTimeOffsetNs(dOffsetIn); }
246
247void CbmMcbm2018UnpackerTaskSts::SetTimeOffsetNsAsic(UInt_t uAsicIdx, Double_t dOffsetIn)
248{
249 fUnpackerAlgo->SetTimeOffsetNsAsic(uAsicIdx, dOffsetIn);
250}
251
252void CbmMcbm2018UnpackerTaskSts::MaskNoisyChannel(UInt_t uFeb, UInt_t uChan, Bool_t bMasked)
253{
254 fvChanMasks.push_back(FebChanMask {uFeb, uChan, bMasked});
255}
256
257void CbmMcbm2018UnpackerTaskSts::SetAdcCut(UInt_t uAdc) { fUnpackerAlgo->SetAdcCut(uAdc); }
258
259void CbmMcbm2018UnpackerTaskSts::SetBinningFwFlag(Bool_t bEnable) { fUnpackerAlgo->SetBinningFwFlag(bEnable); }
260
262{
263 fbPulserOutput = bFlagIn;
264 fUnpackerAlgo->SeparatePulserOutput(fbPulserOutput);
265}
266
ClassImp(CbmConverterManager)
Bool_t bMcbm2018UnpackerTaskStsResetHistos
int Int_t
bool Bool_t
Bool_t fbWriteOutput
Switch ON the filling of a additional set of histograms.
void SetTimeOffsetNs(Double_t dOffsetIn=0.0)
void MaskNoisyChannel(UInt_t uFeb, UInt_t uChan, Bool_t bMasked=kTRUE)
uint64_t fulTsCounter
Statistics & first TS rejection.
Bool_t fbPulserOutput
If ON the output TClonesArray of digi is written to disk.
void SetBinningFwFlag(Bool_t bEnable=kTRUE)
=> Quick and dirty hack for binning FW!!!
CbmMcbm2018UnpackerAlgoSts * fUnpackerAlgo
Processing algo.
void AddMsComponentToList(size_t component, UShort_t usDetectorId)
Temp until we change from CbmMcbmUnpack to something else.
std::vector< CbmStsDigi > * fpvDigiSts
Output vectors.
virtual Bool_t DoUnpack(const fles::Timeslice &ts, size_t component)
std::vector< CbmStsDigi > * fpvPulserDigiSts
std::vector< CbmErrorMessage > * fpvErrorSts
std::vector< FebChanMask > fvChanMasks
If ON a separate output vector of digi is used for the pulser.
void SetTimeOffsetNsAsic(UInt_t uAsicIdx, Double_t dOffsetIn=0.0)
void SetIgnoreOverlapMs(Bool_t bFlagIn=kTRUE)