CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2018UnpackerTaskMuch.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// ----- CbmMcbm2018UnpackerTaskMuch -----
8// ----- Created 02.02.2019 by P.-A. Loizeau -----
9// ----- -----
10// -----------------------------------------------------------------------------
11
13
14#include "CbmMcbm2018MuchPar.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) << "CbmMcbm2018UnpackerTaskMuch::Init";
54 LOG(info) << "Initializing mCBM MUCH 2018 Unpacker";
55
56 FairRootManager* ioman = FairRootManager::Instance();
57 if (NULL == ioman) { LOG(fatal) << "No FairRootManager instance"; }
58
60 fpvDigiMuch = &(fUnpackerAlgo->GetVector());
61 ioman->RegisterAny("MuchBeamTimeDigi", fpvDigiMuch, fbWriteOutput);
62
64 fpvErrorMuch = &(fUnpackerAlgo->GetErrorVector());
65 ioman->RegisterAny("CbmMuchError", fpvErrorMuch, fbWriteOutput);
66
67 return kTRUE;
68}
69
71{
72 LOG(info) << "Setting parameter containers for " << GetName();
73
74 TList* fParCList = fUnpackerAlgo->GetParList();
75
76 for (Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC) {
77 FairParGenericSet* tempObj = (FairParGenericSet*) (fParCList->At(iparC));
78 fParCList->Remove(tempObj);
79
80 std::string sParamName {tempObj->GetName()};
81 FairParGenericSet* newObj =
82 dynamic_cast<FairParGenericSet*>(FairRun::Instance()->GetRuntimeDb()->getContainer(sParamName.data()));
83
84 if (nullptr == newObj) {
85 LOG(error) << "Failed to obtain parameter container " << sParamName << ", for parameter index " << iparC;
86 return;
87 } // if( nullptr == newObj )
88
89 fParCList->AddAt(newObj, iparC);
90 // delete tempObj;
91 } // for( Int_t iparC = 0; iparC < fParCList->GetEntries(); ++iparC )
92}
93
95{
96 LOG(info) << "Init parameter containers for " << GetName();
97
99 CbmMcbm2018MuchPar* pUnpackPar =
100 dynamic_cast<CbmMcbm2018MuchPar*>(FairRun::Instance()->GetRuntimeDb()->getContainer("CbmMcbm2018MuchPar"));
101 if (nullptr == pUnpackPar) {
102 LOG(error) << "Failed to obtain parameter container CbmMcbm2018MuchPar";
103 return kFALSE;
104 } // if( nullptr == pUnpackPar )
105 /*
106 fbMonitorMode = pUnpackPar->GetMonitorMode();
107 LOG(info) << "Monitor mode: "
108 << ( fbMonitorMode ? "ON" : "OFF" );
109
110 fbDebugMonitorMode = pUnpackPar->GetDebugMonitorMode();
111 LOG(info) << "Debug Monitor mode: "
112 << ( fbDebugMonitorMode ? "ON" : "OFF" );
113*/
114 Bool_t initOK = fUnpackerAlgo->InitContainers();
115
117 if (kTRUE == fbMonitorMode) {
119 initOK &= fUnpackerAlgo->CreateHistograms();
120
122 std::vector<std::pair<TNamed*, std::string>> vHistos = fUnpackerAlgo->GetHistoVector();
123
125 THttpServer* server = FairRunOnline::Instance()->GetHttpServer();
126 if (nullptr != server) {
127 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
128 server->Register(Form("/%s", vHistos[uHisto].second.data()), vHistos[uHisto].first);
129 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
130
131 server->RegisterCommand("/Reset_UnpMuch_Hist", "bMcbm2018UnpackerTaskMuchResetHistos=kTRUE");
132 server->Restrict("/Reset_UnpMuch_Hist", "allow=admin");
133 } // if( nullptr != server )
134
135 } // if( kTRUE == fbMonitorMode )
136
137 fUnpackerAlgo->SetMonitorMode(fbMonitorMode);
138
139 for (std::vector<MuchFebChanMask>::iterator it = fvChanMasks.begin(); it < fvChanMasks.end(); ++it)
140 fUnpackerAlgo->MaskNoisyChannel((*it).uFeb, (*it).uChan, (*it).bMasked);
141
142 return initOK;
143}
144
146{
147 LOG(info) << "ReInit parameter containers for " << GetName();
148 Bool_t initOK = fUnpackerAlgo->ReInitContainers();
149
150 return initOK;
151}
152
153void CbmMcbm2018UnpackerTaskMuch::AddMsComponentToList(size_t component, UShort_t usDetectorId)
154{
155 fUnpackerAlgo->AddMsComponentToList(component, usDetectorId);
156}
157
158Bool_t CbmMcbm2018UnpackerTaskMuch::DoUnpack(const fles::Timeslice& ts, size_t /*component*/)
159{
161 LOG(info) << "Reset MUCH unpacker histos ";
162 fUnpackerAlgo->ResetHistograms();
164 } // if( fbMonitorMode && bMcbm2018UnpackerTaskMuchResetHistos )
165
166 if (kFALSE == fUnpackerAlgo->ProcessTs(ts)) {
167 LOG(error) << "Failed processing TS " << ts.index() << " in unpacker algorithm class";
168 return kTRUE;
169 } // if( kFALSE == fUnpackerAlgo->ProcessTs( ts ) )
170
171 /*
173 => Done in the algo!!!
174 sort(fpvDigiMuch->begin(), fpvDigiMuch->end(),
175 [](const CbmMuchBeamTimeDigi & a, const CbmMuchBeamTimeDigi & b) -> bool
176 {
177 return a.GetTime() < b.GetTime();
178 });
179*/
180
181 if (0 == fulTsCounter % 10000) LOG(info) << "Processed " << fulTsCounter << "TS";
182 fulTsCounter++;
183
184 return kTRUE;
185}
186
188{
189 fUnpackerAlgo->ClearVector();
190 fUnpackerAlgo->ClearErrorVector();
191}
192
194{
196 if (kTRUE == fbMonitorMode) {
198 std::vector<std::pair<TNamed*, std::string>> vHistos = fUnpackerAlgo->GetHistoVector();
199
201 TFile* oldFile = gFile;
202 TDirectory* oldDir = gDirectory;
203
204 TFile* histoFile = nullptr;
205
206 // open separate histo file in recreate mode
207 histoFile = new TFile("data/HistosUnpackerMuch.root", "RECREATE");
208 histoFile->cd();
209
211 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
213 TString sFolder = vHistos[uHisto].second.data();
214 if (nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
215 gDirectory->cd(sFolder);
216
218 vHistos[uHisto].first->Write();
219
220 histoFile->cd();
221 } // for( UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto )
222
224 gFile = oldFile;
225 gDirectory = oldDir;
226
227 histoFile->Close();
228 } // if( kTRUE == fbMonitorMode )
229}
230
231void CbmMcbm2018UnpackerTaskMuch::SetIgnoreOverlapMs(Bool_t bFlagIn) { fUnpackerAlgo->SetIgnoreOverlapMs(bFlagIn); }
232
233void CbmMcbm2018UnpackerTaskMuch::SetTimeOffsetNs(Double_t dOffsetIn) { fUnpackerAlgo->SetTimeOffsetNs(dOffsetIn); }
234
235void CbmMcbm2018UnpackerTaskMuch::SetTimeOffsetNsAsic(UInt_t uAsicIdx, Double_t dOffsetIn)
236{
237 return fUnpackerAlgo->SetTimeOffsetNsAsic(uAsicIdx, dOffsetIn);
238}
239
240void CbmMcbm2018UnpackerTaskMuch::EnableAsicType(Int_t fiFlag) { fUnpackerAlgo->EnableAsicType(fiFlag); }
241
242void CbmMcbm2018UnpackerTaskMuch::SetBinningFwFlag(Bool_t bEnable) { fUnpackerAlgo->SetBinningFwFlag(bEnable); }
243
244void CbmMcbm2018UnpackerTaskMuch::MaskNoisyChannel(UInt_t uFeb, UInt_t uChan, Bool_t bMasked)
245{
246
247 fvChanMasks.push_back(MuchFebChanMask {uFeb, uChan, bMasked});
248}
249
250void CbmMcbm2018UnpackerTaskMuch::SetAdcCut(UInt_t uAdc) { fUnpackerAlgo->SetAdcCut(uAdc); }
251
252
ClassImp(CbmConverterManager)
Bool_t bMcbm2018UnpackerTaskMuchResetHistos
int Int_t
bool Bool_t
virtual Bool_t DoUnpack(const fles::Timeslice &ts, size_t component)
void MaskNoisyChannel(UInt_t uFeb, UInt_t uChan, Bool_t bMasked=kTRUE)
void SetTimeOffsetNsAsic(UInt_t uAsicIdx, Double_t dOffsetIn=0.0)
std::vector< CbmMuchBeamTimeDigi > * fpvDigiMuch
Output vectors.
void SetBinningFwFlag(Bool_t bEnable=kTRUE)
=> Quick and dirty hack for binning FW!!!
Bool_t fbWriteOutput
Switch ON the filling of a additional set of histograms.
CbmMcbm2018UnpackerAlgoMuch * fUnpackerAlgo
Processing algo.
std::vector< CbmErrorMessage > * fpvErrorMuch
void SetTimeOffsetNs(Double_t dOffsetIn=0.0)
uint64_t fulTsCounter
Statistics & first TS rejection.
std::vector< MuchFebChanMask > fvChanMasks
If ON the output TClonesArray of digi is written to disk.
void AddMsComponentToList(size_t component, UShort_t usDetectorId)
Temp until we change from CbmMcbmUnpack to something else.
void SetIgnoreOverlapMs(Bool_t bFlagIn=kTRUE)