BmnRoot 26.10.0-19-g6979a6c6
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnRawSource.h
Go to the documentation of this file.
1#ifndef BMNRAWSOURCE_H
2#define BMNRAWSOURCE_H 1
3
4// #define MULTITHREAD true
5// STL
6#include <bitset>
7#include <fstream>
8#include <map>
9#include <vector>
10
11#pragma GCC system_header
12// Boost
13#include <boost/property_tree/json_parser.hpp>
14#include <boost/property_tree/ptree.hpp>
15// nlohmann
16#include <nlohmann/json.hpp>
17// ROOT
18#include "TClonesArray.h"
19#include "TFile.h"
20#include "TPRegexp.h"
21#include "TString.h"
22#include "TTimeStamp.h"
23#include "TTree.h"
24// FairRoot
25#include "FairRootManager.h"
26#include "FairSource.h"
27// BmnRoot
28#include "BmnDetectorList.h"
29#include "BmnEventHeader.h"
30#include "BmnMath.h"
31#include "BmnMetadataRaw.h"
32#include "BmnSpillHeader.h"
33#include "BmnT0Raw.h"
34#include "BmnThreadManager.h"
35#include "BmnTrigConfig.h"
36#include "DigiRunHeader.h"
37#include "RawTypes.h"
38
39/********************************************************/
40// wait limit for input data (ms)
41#define WAIT_LIMIT 40000000
42
43class BmnIFileReader;
44
45using std::map;
46using std::vector;
47namespace pt = boost::property_tree;
48
49using json = nlohmann::json;
50
52{
53 public:
54 BmnRawSource(vector<TString> files, uint32_t period = 8);
55 BmnRawSource(TString file = "", TString outfile = "", uint32_t nEvents = 0, uint32_t period = 8, bool save = false);
56 virtual ~BmnRawSource() override;
57
58 virtual bool Init() override;
59 virtual Int_t ReadEvent(uint32_t i = 0) override;
60 virtual bool SpecifyRunId() override { return kTRUE; }
61 virtual void Close() override;
62 virtual void Reset() override;
63
64 virtual Source_Type GetSourceType() override { return kFILE; }
65
66 virtual void SetParUnpackers() override { LOGF(debug, "%s", __func__); }
67
68 virtual bool InitUnpackers() override
69 {
70 LOGF(debug, "%s", __func__);
71 return kTRUE;
72 }
73
74 virtual bool ReInitUnpackers() override
75 {
76 LOGF(debug, "%s", __func__);
77 return kTRUE;
78 }
79
80 virtual void FillEventHeader(FairEventHeader* feh) override
81 {
82 LOGF(debug1, "FillEventHeader does nothing");
83 return;
84 }
85
86 BmnStatus ParseJsonTLV(const uint32_t* buf, uint32_t& len);
87 BmnStatus ConvertStatEvent(const uint32_t* buf, uint32_t& len);
89 BmnStatus ConvertRawToRootIterate(const uint32_t* buf, uint32_t len);
92 void ClearRawArrays();
97
98 void SetRunId(uint32_t v) { fRunId = v; }
99
100 void SetPeriodId(uint32_t v) { fPeriodId = v; }
101
102 uint32_t GetRunId() const { return fRunId; }
103
104 uint32_t GetPeriodId() const { return fPeriodId; }
105
106 uint32_t GetNevents() const { return fNTotalEvents; }
107
108 uint32_t GetEventId() const { return fEventId; }
109
111
113
115
117
118 Int_t GetVerbose() const { return fVerbose; }
119
120 uint32_t GetBoundaryRun(uint32_t nSmpl)
121 {
122 // format for SILICON data was changed during March 2017 seance (run 1542)
123 // format for GEM was changed after March 2017 seance (run 1992)
124 // so we have to use this crutch.
125 return (nSmpl == 128) ? 1542 : 1992;
126 }
127
128 void SetRawRootFile(TString filename) { fRootFileName = filename; }
129
131 {
133 eventHeaderDAQ->SetEventType(fCurEvType);
134 }
135
136 void SetDecoderConfigFileName(string FileName)
137 {
138 fDecoderConfigFileName = FileName;
139 LoadConfig();
140 }
141
142 TTree* GetRawTree() { return fRawTree; }
143
145
147
148 void SetSaveOutput(bool v) { fSaveOutput = v; }
149
150 bool GetSaveOutput() const { return fSaveOutput; }
151
152 void SetTaskMode(bool v = true) { isTaskMode = v; }
153
154 bool GetTaskMode() const { return isTaskMode; }
155
156 void SetForwardMode(bool v = true) { isForwardMode = v; }
157
158 bool GetForwardMode() const { return isForwardMode; }
159
160 private:
161 // static const Int_t T0_bin_block_words = 256;//BmnT0Raw::CountersCount();
163 const TTimeStamp TimeZero = TTimeStamp(time_t(0), 0);
166
167 pt::ptree conf;
171 uint32_t fSpillCntr;
172 BmnEventType fCurEvType = kBMNPAYLOAD; // for converter
173 BmnEventType fPrevEvType = kBMNPAYLOAD; // for converter
175
176 // @todo check this fRunId exists in FairSource as well! Collision while types are different - int32_t and uint32_t
177 uint32_t fRunId;
178 uint32_t fPeriodId;
179 uint32_t fEventId;
183 // for event
184 int64_t fTime_s;
185 int64_t fTime_ns;
186 // for run
189
192
201
204
205 // DAQ arrays
210 TClonesArray* adc; // zdc & ecal & scwall & fhcal
217 // Spill tree arrays
221
222 // header array
224 // Raw run header
225 unique_ptr<DigiRunHeader> runHeader;
226
227 unique_ptr<BmnMetadataRaw> metadata;
228
229 uint32_t data[10000000];
230 uint32_t fMaxEvent;
231
232 uint32_t fDat; // current 32-bits word
233 uint32_t syncCounter;
234
235 uint32_t nSpillEvents;
238
239 uint32_t n_msc_spill = 0;
240 uint32_t n_msc_spill_ar[16] = {};
241
242 std::map<uint8_t, const uint32_t*> time_slice_map;
243
244 map<TTimeStamp, Int_t> leaps;
248 map<SysPoint, BmnSpillInfo> fSpillMap;
249 // map<TTimeStamp, BmnSpillInfo> fSpillMap;
251
252 template<typename BrType>
253 void BranchRegFun(TString name, BrType** ar, TTree* tree = nullptr)
254 {
255 if (isTaskMode) {
256 FairRootManager* frm = FairRootManager::Instance();
257 frm->Register(name, name + "_dir", (*ar), fSaveOutput);
258 } else {
259 TBranch* b = tree->Branch(name, ar);
260 LOGF(debug, "Register branch %p for obj %p : %s", (void*)b, (void*)ar, name.Data());
261 }
262 return;
263 }
264
268 BmnStatus ProcessEvent(const uint32_t* data, uint32_t len);
269 void QuickProcessEvent(const uint32_t* d, uint32_t len);
270 /**
271 * Finishes the spill during raw conversion
272 */
273 void FinalizeStat();
274
275 BmnStatus Process_FVME(const uint32_t* data, uint32_t len, uint32_t serial, BmnTrigInfo& spillInfo);
276 BmnStatus Process_HRB(const uint32_t* data, uint32_t len, uint32_t serial);
277 BmnStatus FillU40VE(const uint32_t* d, uint32_t slot, uint32_t& idx, BmnTrigInfo& spillInfo);
278 BmnStatus FillBlockTDC(const uint32_t* d, uint32_t serial, uint16_t& len, TClonesArray* ar, uint32_t modid);
279 BmnStatus FillBlockADC(const uint32_t* d, uint32_t serial, uint8_t channel, uint16_t& len, TClonesArray* ar);
280 BmnStatus FillTDC(const uint32_t* d, uint32_t serial, uint32_t slot, uint32_t modId, uint32_t& idx);
281 BmnStatus FillTQDC(const uint32_t* d, uint32_t serial, uint32_t slot, uint32_t modId, uint32_t& idx);
282 /**
283 * Parse TQDC16VS-E MStream data block
284 * https://afi.jinr.ru/DataFormatTQDC16VSE
285 * @param d data pointer
286 * @param serial device serial
287 * @param len payload length
288 * @return operation success
289 */
290 BmnStatus FillTQDC_E(const uint32_t* d, uint32_t serial, uint32_t& len);
291 /**
292 * Parse MSC16VE-E MStream data block
293 * https://afi.jinr.ru/DataFormatMSC_ETH
294 * https://afi.jinr.ru/DataFormatMSC_ETH_V2
295 * @param d data pointer
296 * @param dev_hdr device header (serial, payload length, device ID)
297 * @return operation success
298 */
299 BmnStatus FillMSC16VE_E(const uint32_t* d, const DeviceHeader* dev_hdr);
300 /**
301 * https://afi.jinr.ru/TDC72VXS_DataFormat
302 */
303 BmnStatus FillTDC72VXS(const uint32_t* d, uint32_t serial, uint32_t& len, uint32_t modid);
304 /**
305 * https://afi.jinr.ru/TTVXS_DataFormat
306 */
307 BmnStatus FillTTVXS(const uint32_t* d, uint32_t serial, uint32_t& len);
308 BmnStatus ProcessGenericDevice(const uint32_t* d, const DeviceHeader* dev_hdr);
309 /**
310 * Parse custom HGND TDC data block
311 */
312 BmnStatus FillTDC250HGND(const uint32_t* d, uint32_t serial, uint32_t len);
313 /**
314 * Parse VSP data block
315 */
316 BmnStatus MapVSP(const uint32_t* d, const DeviceHeader* dev_hdr);
318 /**
319 * Parse UT24VE-TRC MStream data block
320 * https://afi.jinr.ru/DataFormatUT24VE-TRC
321 * @param d data pointer
322 * @param serial device serial
323 * @param len payload length
324 * @return operation success
325 */
326 BmnStatus FillUT24VE_TRC(const uint32_t* d, uint32_t& serial, uint32_t& len);
327 BmnStatus FillVirtualDevice(const uint32_t* d, const DeviceHeader* dh);
328 BmnStatus FillFVME2TMWR(const uint32_t* d, uint32_t serial, uint32_t& idx, uint32_t& len);
329 inline BmnSyncDigit* FillWR(uint32_t iSerial, uint64_t iEvent, int64_t t_sec, int64_t t_ns);
330
331 /**
332 * Old MSC format (periodId < 8, one record for spill)
333 */
334 BmnStatus FillMSC(const uint32_t* d, uint32_t serial, uint32_t slot, uint32_t& idx);
336 void RegisterBranches();
338
340};
341
342#endif
#define WAIT_LIMIT
Defines unique identifiers (enum) for all BM@N detector systems.
BmnStatus
Define status code.
Definition BmnEnums.h:93
@ kBMNSTAT
Statistics.
Definition BmnEnums.h:147
@ kBMNPAYLOAD
spill event.
Definition BmnEnums.h:145
__m128 v
Definition P4_F32vec4.h:1
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
double Double_t
constexpr Bool_t kTRUE
#define ClassDef(name, id)
Bool_t fSaveOutput
BmnStatus FinishRun()
BmnStatus FillTDC(const uint32_t *d, uint32_t serial, uint32_t slot, uint32_t modId, uint32_t &idx)
BmnStatus FillBlockADC(const uint32_t *d, uint32_t serial, uint8_t channel, uint16_t &len, TClonesArray *ar)
uint32_t fNTotalEvents
TClonesArray * hrb
TClonesArray * adc
virtual void FillEventHeader(FairEventHeader *feh) override
uint32_t data[10000000]
const TTimeStamp TimeZero
TString fRootFileName
BmnStatus ConvertRawToRoot()
BmnStatus FillU40VE(const uint32_t *d, uint32_t slot, uint32_t &idx, BmnTrigInfo &spillInfo)
Int_t GetUTCShift(TTimeStamp t)
uint32_t syncCounter
BmnStatus FillTQDC(const uint32_t *d, uint32_t serial, uint32_t slot, uint32_t modId, uint32_t &idx)
map< TTimeStamp, Int_t > leaps
TTree * fRawTree
virtual Source_Type GetSourceType() override
void SetPeriodId(uint32_t v)
unique_ptr< BmnMetadataRaw > metadata
TTimeStamp fRunStartTime
void SetRawEventStat()
void SetRawRootFile(TString filename)
void SetSaveOutput(bool v)
BmnStatus ProcessEvent(const uint32_t *data, uint32_t len)
BmnSpillHeader * spillHeader
BmnStatus FillFVME2TMWR(const uint32_t *d, uint32_t serial, uint32_t &idx, uint32_t &len)
TString fMetadataName
BmnStatus LoadConfig()
void SetDecoderConfigFileName(string FileName)
BmnStatus FillTDC250HGND(const uint32_t *d, uint32_t serial, uint32_t len)
Parse custom HGND TDC data block.
TString fSubName
string fDecoderConfigFileName
TClonesArray * tdc
virtual void Reset() override
int64_t fTime_s
BmnStatus ConvertStatEvent(const uint32_t *buf, uint32_t &len)
virtual void SetParUnpackers() override
BmnStatus ConvertRawToRootIterate(const uint32_t *buf, uint32_t len)
void FinalizeStat()
Finishes the spill during raw conversion.
void RegisterSpillBranches()
BmnRawSource(vector< TString > files, uint32_t period=8)
BmnIFileReader * fFileReader
BmnStatus ProcessGenericDevice(const uint32_t *d, const DeviceHeader *dev_hdr)
uint32_t GetRunId() const
Bool_t fExportExternalSpillStat
bool GetSaveOutput() const
uint32_t fDat
BmnStatus FillMSC(const uint32_t *d, uint32_t serial, uint32_t slot, uint32_t &idx)
Old MSC format (periodId < 8, one record for spill).
BmnStatus Process_FVME(const uint32_t *data, uint32_t len, uint32_t serial, BmnTrigInfo &spillInfo)
virtual bool SpecifyRunId() override
TString GetRootFileName()
uint32_t fRunId
BmnEventType fCurEvType
pt::ptree conf
Int_t GetVerbose() const
TTree * GetRawTreeSpills()
uint32_t fMaxEvent
uint32_t GetNevents() const
TClonesArray * tdc_hgnd
void SetRunId(uint32_t v)
uint32_t GetBoundaryRun(uint32_t nSmpl)
virtual ~BmnRawSource() override
void ClearRawSpillArrays()
uint32_t fPeriodId
bool GetForwardMode() const
TClonesArray * tqdc_adc
void SetVerbose(Int_t v)
BmnStatus InitUTCShift()
BmnStatus InitConverter()
TClonesArray * t0raw
TTree * fRawTreeSpills
void QuickProcessEvent(const uint32_t *d, uint32_t len)
TClonesArray * adc128
void SetTaskMode(bool v=true)
void SetForwardMode(bool v=true)
uint32_t fEventId
TClonesArray * adc64
Bool_t fExportJsonBlocks
int64_t fLengthRawFile
BmnStatus ConvertRawToRootIterateFileRead()
uint32_t GetPeriodId() const
TString fRawRunHdrName
uint32_t n_msc_spill
BmnThreadManager< BmnConverterThread > * fThreads
BmnStatus FillTDC72VXS(const uint32_t *d, uint32_t serial, uint32_t &len, uint32_t modid)
https://afi.jinr.ru/TDC72VXS_DataFormat
void RegisterBranches()
int64_t fTime_ns
BmnStatus FillUT24VE_TRC(const uint32_t *d, uint32_t &serial, uint32_t &len)
Parse UT24VE-TRC MStream data block https://afi.jinr.ru/DataFormatUT24VE-TRC.
BmnEventHeader * eventHeaderDAQ
uint32_t nSpillEvents
BmnStatus ParseJsonTLV(const uint32_t *buf, uint32_t &len)
BmnStatus FillBlockTDC(const uint32_t *d, uint32_t serial, uint16_t &len, TClonesArray *ar, uint32_t modid)
BmnStatus GetT0Info(Double_t &t0time, Double_t &t0width)
Double_t workTime_real
BmnStatus MapVSP(const uint32_t *d, const DeviceHeader *dev_hdr)
Parse VSP data block.
virtual void Close() override
bool GetTaskMode() const
TTimeStamp GetRunEndTime() const
BmnStatus FillVSP(TClonesArray *ar)
BmnEventType fPrevEvType
Int_t GetRunIdFromFile(TString name)
TClonesArray * sync
BmnStatus FillTTVXS(const uint32_t *d, uint32_t serial, uint32_t &len)
https://afi.jinr.ru/TTVXS_DataFormat
TTimeStamp GetRunStartTime() const
BmnStatus FillMSC16VE_E(const uint32_t *d, const DeviceHeader *dev_hdr)
Parse MSC16VE-E MStream data block https://afi.jinr.ru/DataFormatMSC_ETH https://afi....
virtual bool InitUnpackers() override
void BranchRegFun(TString name, BrType **ar, TTree *tree=nullptr)
TTimeStamp fRunEndTime
virtual bool Init() override
TClonesArray * adc32
uint32_t fSpillCntr
TTimeStamp utc_valid
TTree * GetRawTree()
Double_t workTime_cpu
BmnSyncDigit * FillWR(uint32_t iSerial, uint64_t iEvent, int64_t t_sec, int64_t t_ns)
TFile * fRootFileOut
int64_t fCurentPositionRawFile
bool isRawRootInputFile
TString fRawFileName
BmnStatus FillVirtualDevice(const uint32_t *d, const DeviceHeader *dh)
std::map< uint8_t, const uint32_t * > time_slice_map
uint32_t fStartEventId
virtual Int_t ReadEvent(uint32_t i=0) override
BmnStatus FillTQDC_E(const uint32_t *d, uint32_t serial, uint32_t &len)
Parse TQDC16VS-E MStream data block https://afi.jinr.ru/DataFormatTQDC16VSE.
uint32_t n_msc_spill_ar[16]
BmnStatus Process_HRB(const uint32_t *data, uint32_t len, uint32_t serial)
TClonesArray * tqdc_tdc
TClonesArray * msc
map< SysPoint, BmnSpillInfo > fSpillMap
uint32_t GetEventId() const
unique_ptr< DigiRunHeader > runHeader
uint32_t fNSignalEvents
BmnStatus ConvertRawToRootIterateFile(uint32_t limit=WAIT_LIMIT)
virtual bool ReInitUnpackers() override
TClonesArray * vsp
Class BmnTrigInfo Trigger counters of the current spill from U40VE card.
Definition BmnTrigInfo.h:15
const char * Data() const