12#include "FairLogger.h"
14#include "BmnADCDigit.h"
16#include "BmnGemStripDigit.h"
17#include "BmnHRBDigit.h"
18#include "BmnMSCDigit.h"
20#include "BmnSyncDigit.h"
21#include "BmnTDCDigit.h"
22#include "BmnTQDCADCDigit.h"
23#include "DigiRunHeader.h"
25#include "UniDetectorParameter.h"
26#include "UniRawFile.h"
32 : isSpillStart(kFALSE)
34 , fApplyThreshold(kTRUE)
36 , isForwardMode(false)
37 , fTOF700ReferenceRun(0)
38 , fTOF700ReferenceChamber(0)
46 , fRunStartTime(TimeZero)
47 , fRunEndTime(TimeZero)
49 , fRawTreeSpills(nullptr)
52 , fCalibFileName(
"adc-calib.root")
53 , fDigiRunHdrName(
"DigiRunHeader")
55 , fMwpcMapFileName(
"")
58 , fTof400PlaceMapFileName(
"")
59 , fTof400StripMapFileName(
"")
60 , fTof701PlaceMapFileName(
"")
61 , fTof701StripMapFileName(
"")
62 , fTof700MapFileName(
"")
63 , fTof700GeomFileName(
"")
65 , fZDCCalibrationFileName(
"")
66 , fScWallMapFileName(
"")
67 , fScWallCalibrationFileName(
"")
68 , fFHCalMapFileName(
"")
69 , fFHCalCalibrationFileName(
"")
70 , fHodoMapFileName(
"")
71 , fHodoCalibrationFileName(
"")
72 , fNdetMapFileName(
"")
73 , fNdetCalibrationFileName(
"")
74 , fHgndMapFileName(
"")
75 , fHgndCalibrationFileName(
"")
76 , fECALMapFileName(
"")
77 , fECALCalibrationFileName(
"")
79 , fTrigPlaceMapFileName(
"")
80 , fTrigChannelMapFileName(
"")
81 , fRawRunHdrName(
"RawRunHeader")
82 , fMetadataName(
"RawRunMetadata")
83 , fRootFileIn(nullptr)
84 , fRootFileOut(nullptr)
85 , fDigiFileOut(nullptr)
98 , eventHeaderDAQ(nullptr)
99 , rawRunHeader(nullptr)
121 , eventHeader(nullptr)
122 , spillHeader(nullptr)
124 , fCscMapper(nullptr)
125 , fGemMapper(nullptr)
126 , fVspMapper(nullptr)
127 , fSiliconMapper(nullptr)
128 , fSiBTMapper(nullptr)
129 , fDchMapper(nullptr)
130 , fMwpcMapper(nullptr)
131 , fTrigMapper(nullptr)
132 , fTof400Mapper(nullptr)
134 , fTof701Mapper(nullptr)
135 , fZDCMapper(nullptr)
136 , fScWallMapper(nullptr)
137 , fFHCalMapper(nullptr)
138 , fHodoMapper(nullptr)
139 , fNdetMapper(nullptr)
140 , fHgndMapper(nullptr)
141 , fECALMapper(nullptr)
142 , fMSCMapper(nullptr)
146 , fUseCalibFile(false)
147 , fSaveCalibFile(true)
148 , fExportJsonBocks(false)
156 , _dfl_run_id{{8, 7814}, {9, 8974}}
158 if (fRootFileName !=
"") {
160 fRunId = GetRunIdFromFile(fRootFileName);
161 TString subName = GetSubNameAfterRunId(file);
162 std::printf(
"RunId %d got from the RawRoot file (BmnDecoder ctor)\n", fRunId);
163 fDigiFileName = (outfile ==
"") ? Form(
"bmn_run%d%s_digi.root", fRunId, subName.Data()) : outfile;
164 if (fRootFileName.Length()) {
167 Int_t lastSlash = fDigiFileName.Last(
'/');
168 TString digiPath = (lastSlash == TString::kNPOS) ?
"" : TString(fDigiFileName(0, lastSlash + 1));
169 fRootFileName = Form(
"%sbmn_run%d%s_raw.root", digiPath.Data(), fRunId, subName.Data());
173 LOGF(debug,
"Creating decoder without input file.");
194 delete fSiliconMapper;
204 delete fTof400Mapper;
209 delete fTof701Mapper;
213 delete fScWallMapper;
269 delete eventHeaderDAQ;
275 FairRootManager* frm = FairRootManager::Instance();
276 bool save_output = fSaveOutput;
278 auto reg_fun = [&](TString name, TObject* ar) ->
void {
279 TClass* cl = TClass::GetClass(ar->ClassName());
280 if (cl == TClonesArray::Class())
281 frm->Register(name, name +
"_dir",
static_cast<TClonesArray*
>(ar), save_output);
283 frm->Register(name, name +
"_dir",
static_cast<TNamed*
>(ar), save_output);
284 LOG(debug1) <<
"Register by class " << cl->GetName() <<
" : " << name;
292 fPedEvCntrBySpill = 0;
295 fNoiseEnough = kFALSE;
297 LoadCalibFile(fCalibFileName);
321 fRootFileIn =
new TFile(fRootFileName,
"READ");
322 if (fRootFileIn->IsOpen() ==
false) {
323 LOGF(error,
"\n!!!!\ncannot open file %s \nDecodeDataToDigi stopped\n!!!!", fRootFileName.Data());
326 LOGF(info,
"Input file: %s, Output file: %s", fRootFileName.Data(), fDigiFileName.Data());
328 fRawTree = (TTree*)fRootFileIn->Get(
"BMN_RAW");
331 fDigiFileOut =
new TFile(fDigiFileName,
"recreate");
332 NRawTreeEvents = fRawTree->GetEntries();
334 NRawTreeSpills = fRawTreeSpills ? fRawTreeSpills->GetEntries() : 0;
336 fMaxEvent = NRawTreeEvents;
337 fMaxEvent = Min(fMaxEvent, NRawTreeEvents);
356 if (fGemMapper || fSiliconMapper || fCscMapper || fSiBTMapper ) {
357 std::printf(
"[INFO] Searching for pedestal events\n");
358 for (Long64_t iEv = 0; iEv < NRawTreeEvents; ++iEv) {
359 fRawTree->GetEntry(iEv);
366 if (fPedEvCntr != fEvForPedestals) {
367 CopyDataToPedMap(fPedEvCntr);
378 LOGF(info,
"Found a total of %d pedestal events", fPedEvCntr);
400 std::printf(
"[INFO] Searching for signal events\n");
401 for (Long64_t iEv = 0; iEv < NRawTreeEvents; ++iEv) {
402 fRawTree->GetEntry(iEv);
418 if (iEv != 0 && fNoiseEvCntr % 2500 == 0)
419 LOG(info) <<
"Profile event #" << fNoiseEvCntr <<
"/" << fEvForNoiseCorr <<
";";
422 fPrevEventType = fCurEventType;
423 if (fNoiseEvCntr >= fEvForNoiseCorr)
426 LOGF(info,
"Found a total of %d payload events", fNoiseEvCntr);
433 fPrevEventType = fCurEventType;
436 vector<UInt_t> startTripEvent;
437 vector<UInt_t> endTripEvent;
485 std::printf(
"[INFO]");
487 for (Long64_t iEv = 0; iEv < fMaxEvent; ++iEv) {
490 fRawTree->GetEntry(iEv);
497 if (iEv != 0 && iEv % 2500 == 0)
498 LOGF(info,
"Decoded %7lld events. EventId %7lld", iEv, fEventId);
499 if ((fStartEventId == 0) && (fEventId))
500 fStartEventId = fEventId;
504 Bool_t isTripEvent = kFALSE;
505 for (
size_t iTrip = 0; iTrip < startTripEvent.size(); ++iTrip) {
506 if (eventHeaderDAQ->
GetEventId() > startTripEvent[iTrip]
507 && eventHeaderDAQ->
GetEventId() < endTripEvent[iTrip])
515 cout <<
"Digitization: " << fNSignalEvents <<
"/" << fNTotalEvents <<
"/" << fMaxEvent
516 <<
" processed; Spill #" << fSpillCntr << endl;
522 fTrigMapper->
FillEvent(tqdc_tdc, tqdc_adc, fTimeShifts);
528 fTrigMapper->
FillEvent(tdc, fTimeShifts);
535 GetT0Info(fT0Time, fT0Width);
537 eventHeader->SetRunId(eventHeaderDAQ->GetRunId());
540 eventHeader->
SetEventTimeTS(TTimeStamp(time_t(fTime_s), fTime_ns));
541 eventHeader->SetEventTime(TTimeStamp(time_t(fTime_s), fTime_ns).AsDouble());
556 if (fPedEvCntr < (fEvForPedestals - 1)) {
557 CopyDataToPedMap(fPedEvCntr);
561 if ((fPrevEventType ==
kBMNPEDESTAL) && (fPedEvCntr == (fEvForPedestals - 1))) {
592 fSiliconMapper->
FillEvent(adc128, silicon);
601 fVspMapper->
FillEvent(vsp_raw, vsp, eventHeader);
605 fDchMapper->
FillEvent(tdc, &fTimeShifts, dch, fT0Time);
621 fTof400Mapper->
FillEvent(tdc, &fTimeShifts, tof400);
641 fTof701Mapper->
FillEvent(tdc, &fTimeShifts, tof701);
673 fHodoMapper->
fillEvent(tqdc_tdc, tqdc_adc, hodo);
681 fNdetMapper->
fillEvent(tqdc_tdc, tqdc_adc, &fTimeShifts, ndet);
689 fHgndMapper->
fillEvent(tdc_hgnd, eventHeader, hgnd);
704 if (fMSCMapper && (fPeriodId < 8))
705 fMSCMapper->
SumEvent7(msc, eventHeader, spillHeader, fPedEvCntrBySpill);
710 printf(
"Test RMS. Exit");
717 LOGF(info,
"Spill start# %3u iEntry %6d EventId %8u", fSpillCntr, iEv, fEventId);
720 fPrevEventType = fCurEventType;
721 if ((Long_t)fNSignalEvents >= fMaxEvent)
725 for (UInt_t iSpillEntry = 0; iSpillEntry < NRawTreeSpills; ++iSpillEntry) {
727 fRawTreeSpills->GetEntry(iSpillEntry);
728 msc_copy->AbsorbObjects(msc);
729 t0_copy->AbsorbObjects(t0raw);
730 if (t0_copy->GetEntries()) {
736 fDigiTreeSpills->Fill();
753 fRunEndTime = TTimeStamp(time_t(fTime_s), fTime_ns);
764 fDigiFileOut->WriteObject(runHeader, fDigiRunHdrName.Data());
765 fDigiFileOut->WriteObject(metadata, fMetadataName.Data());
770 std::printf(
"START (event %u):\t%s\n", fStartEventId, fRunStartTime.AsString());
771 std::printf(
"FINISH (event %u):\t%s\n", fEventId, fRunEndTime.AsString());
772 std::printf(
"Total Events:\t%lu\nSignal Events:\t%lu\n", fNTotalEvents, fNSignalEvents);
780 fDigiFileOut->Write();
781 fDigiFileOut->Close();
783 fRootFileIn->Close();
790 auto reg_fun = [&](TString name, TObject* ar) ->
void {
791 fDigiTree->Branch(name, &ar);
792 LOGF(debug1,
"Register branch: %s", name.Data());
799 fPedEvCntrBySpill = 0;
802 fNoiseEnough = kFALSE;
804 LoadCalibFile(fCalibFileName);
814 Assignment_Fun(
"SYNC", &sync, fRawTree);
815 Assignment_Fun(
"ADC32", &adc32, fRawTree);
816 Assignment_Fun(
"ADC64", &adc64, fRawTree);
817 Assignment_Fun(
"ADC128", &adc128, fRawTree);
818 Assignment_Fun(
"ADC", &adc, fRawTree);
819 Assignment_Fun(
"VSP_RAW", &vsp_raw, fRawTree);
820 Assignment_Fun(
"TDC", &tdc, fRawTree);
821 Assignment_Fun(
"TQDC_ADC", &tqdc_adc, fRawTree);
822 Assignment_Fun(
"TQDC_TDC", &tqdc_tdc, fRawTree);
823 Assignment_Fun(
"TDC_HGND", &tdc_hgnd, fRawTree);
824 Assignment_Fun(
"HRB", &hrb, fRawTree);
825 Assignment_Fun(
"BmnEventHeader.", &eventHeaderDAQ, fRawTree);
826 if ((!isForwardMode) && (!isTaskMode)) {
827 fRawTreeSpills = (TTree*)fRootFileIn->Get(
"BMN_RAW_SPILLS");
828 rawRunHeader =
static_cast<DigiRunHeader*
>(fRootFileIn->Get(fRawRunHdrName));
829 metadata =
static_cast<BmnMetadataRaw*
>(fRootFileIn->Get(fMetadataName));
833 if (fRawTreeSpills) {
834 Assignment_Fun(
"MSC", &msc, fRawTreeSpills);
835 Assignment_Fun(
"T0Raw", &t0raw, fRawTreeSpills);
852 if (fSiliconMapper) {
868 uint32_t run4init = (fRunId ==
UNKNOWN_RUNID) ? _dfl_run_id[fPeriodId] : fRunId;
870 new TTree(conf.get<
string>(
"Decoder.DigiTreeName").c_str(), conf.get<
string>(
"Decoder.DigiTreeTitle").c_str());
872 Register_Fun(
"BmnEventHeader.", &eventHeader);
873 if (fRawTreeSpills) {
874 fDigiTreeSpills =
new TTree(
"spill",
"spill");
876 fDigiTreeSpills->Branch(
"BmnSpillHeader.", &spillHeader);
878 fMSCMapper =
new BmnMscRaw2Digit(fPeriodId, run4init, fMSCMapFileName, fRawTreeSpills, fDigiTreeSpills);
879 msc_copy =
new TClonesArray(msc->GetClass());
880 fDigiTreeSpills->Branch(
"MSC", &msc_copy);
881 t0_copy =
new TClonesArray(t0raw->GetClass());
882 fDigiTreeSpills->Branch(
"T0Raw", &t0_copy);
884 msc_copy =
new TClonesArray(msc->GetClass());
885 t0_copy =
new TClonesArray(t0raw->GetClass());
889 if (fDetectorSetup.count(
kBC) > 0 && fDetectorSetup.at(
kBC) == 1) {
890 fTrigMapper =
new BmnTrigRaw2Digit(fTrigPlaceMapFileName, fTrigChannelMapFileName, branch_reg_fun);
891 if (fT0Serial == 0) {
893 LOGF(info,
"T0 serial 0x%X got from trig mapping (InitMappers)", fT0Serial);
898 if (fDetectorSetup.count(
kMWPC) > 0 && fDetectorSetup.at(
kMWPC) == 1) {
899 mwpc =
new TClonesArray(
"BmnMwpcDigit");
900 Register_Fun(
"MWPC", &mwpc);
904 if (fDetectorSetup.count(
kSILICON) > 0 && fDetectorSetup.at(
kSILICON) == 1) {
905 silicon =
new TClonesArray(
"BmnSiliconDigit");
906 Register_Fun(
"SILICON", &silicon);
907 fSiliconMapper =
new BmnSiliconRaw2Digit(fPeriodId, run4init, fSiliconMapFileName, fBmnSetup);
910 fFsdQa =
new BmnAdcQA(fPeriodId, run4init,
"FSD");
914 if (fDetectorSetup.count(
kSiBT) > 0 && fDetectorSetup.at(
kSiBT) == 1) {
915 sibt =
new TClonesArray(
"BmnSiBTDigit");
916 Register_Fun(
"SiBT", &sibt);
917 fSiBTMapper =
new BmnSiBTRaw2Digit(fPeriodId, run4init, fSiBTMapFileName, fBmnSetup);
920 if (fDetectorSetup.count(
kGEM) > 0 && fDetectorSetup.at(
kGEM) == 1) {
921 gem =
new TClonesArray(
"BmnGemStripDigit");
922 Register_Fun(
"GEM", &gem);
923 fGemMapper =
new BmnGemRaw2Digit(fPeriodId, run4init, fGemMapFileName, fBmnSetup);
925 fGemQa =
new BmnAdcQA(fPeriodId, run4init,
"GEM");
929 if (fDetectorSetup.count(
kVSP) > 0 && fDetectorSetup.at(
kVSP) == 1) {
930 LOGF(info,
"---------- Init VSP mapper ----------");
931 vsp =
new TClonesArray(
"BmnVSPDigit");
932 Register_Fun(
"VSP", &vsp);
933 fVspMapper =
new BmnVspRaw2Digit(fPeriodId, run4init, fVspMapFileName, fBmnSetup);
936 if (fDetectorSetup.count(
kTOF1) > 0 && fDetectorSetup.at(
kTOF1) == 1) {
937 LOGF(info,
"---------- Init TOF400 mapper ----------");
938 tof400 =
new TClonesArray(
"BmnTof1Digit");
939 Register_Fun(
"TOF400", &tof400);
942 Bool_t FlagTemp = fTof400Mapper->
setRun(fPeriodId, run4init);
943 if (FlagTemp == kFALSE) {
944 if (fTof400PlaceMapFileName.Sizeof() > 1 && fTof400StripMapFileName.Sizeof() > 1) {
945 TString dir = Form(
"%s%s", getenv(
"VMCWORKDIR"),
"/input/");
946 FlagTemp = fTof400Mapper->
setMapFromFile(dir + fTof400PlaceMapFileName.Data(),
947 dir + fTof400StripMapFileName.Data());
950 LOGF(info,
"---------- Initialization of TOF400 mapper finished ----------");
953 if (fDetectorSetup.count(
kTOF701) > 0 && fDetectorSetup.at(
kTOF701) == 1) {
954 LOGF(info,
"---------- Init TOF701 mapper ----------");
955 tof701 =
new TClonesArray(
"BmnTof701Digit");
956 Register_Fun(
"TOF701", &tof701);
959 Bool_t FlagTemp = fTof701Mapper->
setRun(fPeriodId, run4init);
960 if (FlagTemp == kFALSE) {
961 if (fTof701PlaceMapFileName.Sizeof() > 1 && fTof701StripMapFileName.Sizeof() > 1) {
962 TString dir = Form(
"%s%s", getenv(
"VMCWORKDIR"),
"/input/");
963 FlagTemp = fTof701Mapper->
setMapFromFile(dir + fTof701PlaceMapFileName.Data(),
964 dir + fTof701StripMapFileName.Data());
965 fTof701Mapper->
setINLFromFile(Form(
"%s%s", dir.Data(),
"TOF701_ListINLFiles_Run8.txt"));
968 LOGF(info,
"---------- Initialization of TOF701 mapper finished ----------");
1002 if (fDetectorSetup.count(
kDCH) > 0 && fDetectorSetup.at(
kDCH) == 1) {
1003 dch =
new TClonesArray(
"BmnDchDigit");
1004 Register_Fun(
"DCH", &dch);
1008 if (fDetectorSetup.count(
kZDC) > 0 && fDetectorSetup.at(
kZDC) == 1) {
1009 zdc =
new TClonesArray(
"BmnZDCDigit");
1010 Register_Fun(
"ZdcDigit", &zdc);
1011 fZDCMapper =
new BmnZDCRaw2Digit(fPeriodId, run4init, fZDCMapFileName, fZDCCalibrationFileName);
1014 if (fDetectorSetup.count(
kECAL) > 0 && fDetectorSetup.at(
kECAL) == 1) {
1015 ecal =
new TClonesArray(
"BmnECALDigit");
1016 Register_Fun(
"EcalDigit", &ecal);
1020 if (fDetectorSetup.count(
kSCWALL) > 0 && fDetectorSetup.at(
kSCWALL) == 1) {
1021 LOG(info) <<
"scwall in setup";
1022 scwall =
new TClonesArray(
"BmnScWallDigi");
1023 Register_Fun(
"ScWallDigi", &scwall);
1024 fScWallMapper =
new BmnScWallRaw2Digit(fPeriodId, run4init, fScWallMapFileName, fScWallCalibrationFileName);
1025 fScWallMapper->
print();
1028 if (fDetectorSetup.count(
kFHCAL) > 0 && fDetectorSetup.at(
kFHCAL) == 1) {
1029 LOG(info) <<
"fhcal in setup";
1030 fhcal =
new TClonesArray(
"BmnFHCalDigi");
1031 Register_Fun(
"FHCalDigi", &fhcal);
1032 fFHCalMapper =
new BmnFHCalRaw2Digit(fPeriodId, run4init, fFHCalMapFileName, fFHCalCalibrationFileName);
1033 fFHCalMapper->
print();
1036 if (fDetectorSetup.count(
kHODO) > 0 && fDetectorSetup.at(
kHODO) == 1) {
1037 LOG(info) <<
"hodo in setup";
1038 hodo =
new TClonesArray(
"BmnHodoDigi");
1039 Register_Fun(
"HodoDigi", &hodo);
1041 new BmnHodoRaw2Digit(fPeriodId, run4init, fHodoMapFileName.Data(), fHodoCalibrationFileName.Data());
1042 fHodoMapper->
print();
1045 if (fDetectorSetup.count(
kNDET) > 0 && fDetectorSetup.at(
kNDET) == 1) {
1046 LOG(info) <<
"ndet in setup";
1047 ndet =
new TClonesArray(
"BmnNdetDigi");
1048 Register_Fun(
"NdetDigi", &ndet);
1049 fNdetMapper =
new BmnNdetRaw2Digit(fPeriodId, run4init, fNdetMapFileName, fNdetCalibrationFileName);
1050 fNdetMapper->
print();
1053 if (fDetectorSetup.count(
kHGND) > 0 && fDetectorSetup.at(
kHGND) == 1) {
1054 LOG(info) <<
"hgnd in setup";
1055 hgnd =
new TClonesArray(
"BmnHgndDigi");
1056 Register_Fun(
"HgndDigi", &hgnd);
1057 fHgndMapper =
new BmnHgndRaw2Digit(fPeriodId, fRunId, fHgndMapFileName.Data(), fHgndCalibrationFileName.Data());
1058 fHgndMapper->
print();
1061 if (fDetectorSetup.count(
kCSC) > 0 && fDetectorSetup.at(
kCSC) == 1) {
1062 csc =
new TClonesArray(
"BmnCSCDigit");
1063 Register_Fun(
"CSC", &csc);
1064 fCscMapper =
new BmnCscRaw2Digit(fPeriodId, run4init, fCscMapFileName, fBmnSetup);
1066 fCscQa =
new BmnAdcQA(fPeriodId, run4init,
"CSC");
1072BmnStatus BmnDecoder::LoadCalibFile(TString& FileName)
1074 TDirectory* temp_dir = gDirectory;
1075 fCalibFile =
new TFile(FileName,
"READ");
1077 if (fCalibFile->IsOpen()) {
1088 fCalibFile->Close();
1090 fNoiseEnough = kTRUE;
1091 LOGF(info,
"ADC calibration file loaded!");
1093 gDirectory = temp_dir;
1097BmnStatus BmnDecoder::SaveCalibFile(TString& FileName)
1099 fCalibFile =
new TFile(FileName,
"RECREATE");
1111 fCalibFile->Close();
1112 LOGF(info,
"ADC calibration file saved!");
1155 fTimeShifts.clear();
1156 eventHeader->
Clear();
1162 spillHeader->
Clear();
1171 LOGF(info,
"Starting to correct pedestal events");
1184 LOGF(info,
"Finished correcting pedestal events");
1190 UInt_t serial = 0x0AADD6E9;
1191 Int_t i_serial = fSiliconMapper->
GetSerialMap()[serial];
1195 serial = 0x04E993A5;
1202 UInt_t serial = 0x0aad5333;
1209 UInt_t serial = 0x0A7B2235;
1242 LOGF(info,
"Marking noisy channels from signal events");
1255 if (fSiliconMapper) {
1279 FillTimeShiftsMap();
1287 LOG(info) <<
"Digitization: " << fNSignalEvents <<
"/" << fNTotalEvents <<
"/" << fMaxEvent
1288 <<
" processed; Spill #" << fSpillCntr;
1293 fTrigMapper->
FillEvent(tqdc_tdc, tqdc_adc, fTimeShifts);
1294 fTrigMapper->
FillEvent(tdc, fTimeShifts);
1297 GetT0Info(fT0Time, fT0Width);
1302 CopyDataToPedMap(fPedEvCntr++);
1305 if (fPedEvCntr >= fEvForPedestals - 1) {
1318 fSiliconMapper->
FillEvent(adc128, silicon);
1325 if (fNoiseEvCntr % 1000 == 0)
1326 LOG(info) <<
"Profile event #" << fNoiseEvCntr <<
"/" << fEvForNoiseCorr <<
";";
1329 if (fNoiseEvCntr >= fEvForNoiseCorr) {
1333 fNoiseEnough =
true;
1341 fDchMapper->
FillEvent(tdc, &fTimeShifts, dch, fT0Time);
1345 fTof400Mapper->
FillEvent(tdc, &fTimeShifts, tof400);
1352 fTof701Mapper->
FillEvent(tdc, &fTimeShifts, tof701);
1360 fHodoMapper->
fillEvent(tqdc_tdc, tqdc_adc, hodo);
1362 fNdetMapper->
fillEvent(tqdc_tdc, tqdc_adc, &fTimeShifts, ndet);
1364 fHgndMapper->
fillEvent(tdc_hgnd, eventHeader, hgnd);
1368 fRunEndTime = TTimeStamp(time_t(fTime_s), fTime_ns);
1369 eventHeader->SetRunId(eventHeaderDAQ->GetRunId());
1373 eventHeader->SetEventTime(fRunEndTime.AsDouble());
1391 fPrevEventType = fCurEventType;
1393 msc_copy->AbsorbObjects(msc);
1395 t0_copy->AbsorbObjects(t0raw);
1403 if (fUseCalibFile && fNoiseEnough)
1404 SaveCalibFile(fCalibFileName);
1408BmnStatus BmnDecoder::FillTimeShiftsMap()
1413 for (Int_t
i = 0;
i < sync->GetEntriesFast(); ++
i) {
1420 if (syncDig->
GetSerial() == fT0Serial) {
1425 if (fRunStartTime == TimeZero) {
1426 fRunStartTime = TTimeStamp(time_t(fTime_s), fTime_ns);
1428 LOGF(debug,
"T0 sync: %s", TTimeStamp(time_t(fTime_s), fTime_ns).AsString());
1432 for (Int_t
i = 0;
i < sync->GetEntriesFast(); ++
i) {
1434 Long64_t syncTime = (fT0SyncTime == 0.0) ? 0 : syncDig->GetTime_ns() + syncDig->GetTime_sec() * 1000000000LL;
1435 fTimeShifts.insert(pair<UInt_t, Long64_t>(syncDig->
GetSerial(), syncTime - fT0SyncTime));
1440void BmnDecoder::CopyDataToPedMap(UInt_t ev)
1442 if (ev < fEvForPedestals) {
1444 if (fPedEvCntr % 100 == 0 && fPedEvCntr > 0)
1445 cout <<
"Pedestal event #" << fPedEvCntr <<
"/" << fEvForPedestals <<
";" << endl;
1483 TPRegexp re(
".+\\.root");
1484 TPRegexp re_data(
".*\\w+_\\w+_\\w+_(\\d+)([^/]*)\\.data");
1485 if (re.MatchB(name)) {
1486 fRootFileIn =
new TFile(name,
"READ");
1487 if (fRootFileIn->IsOpen()) {
1489 TTree* RawTree = (TTree*)fRootFileIn->Get(
"BMN_RAW");
1491 RawTree->SetBranchAddress(
"BmnEventHeader.", &tempHdr);
1492 if (RawTree->GetEntriesFast()) {
1493 RawTree->GetEntry(0);
1494 fRunId = tempHdr->GetRunId();
1495 fRootFileName = name;
1500 fRootFileIn->Close();
1509 re_data.Substitute(name,
"$1");
1519BmnStatus BmnDecoder::GetT0Info(Double_t& t0time, Double_t& t0width)
1521 vector<TClonesArray*>* trigArr = fTrigMapper->
GetTrigArrays();
1523 for (
auto ar : *trigArr) {
1524 if ((fPeriodId == 8) && (fBmnSetup ==
kSRCSETUP)) {
1525 if ((fRunId >= 986) && (fRunId <= 1086)) {
1526 if ((strcmp(ar->GetName(),
"BC2_1_A")))
1529 if ((strcmp(ar->GetName(),
"T0_1_A")))
1533 if (fPeriodId > 6) {
1534 if (fPeriodId == 8) {
1535 if (strcmp(ar->GetName(),
"BC2AT"))
1538 if (strcmp(ar->GetName(),
"BC2"))
1542 if (strcmp(ar->GetName(),
"T0"))
1546 for (
int i = 0;
i < ar->GetEntriesFast();
i++) {
1548 if (dig->
GetMod() == 0) {
1561 TPRegexp re_data(
".*\\w+_\\w+_\\w+_(\\d+)([^/]*)\\.data");
1562 TPRegexp re_raw(
".*\\w+_run(\\d+)([^/]*)_raw\\.root");
1564 if (re_data.MatchB(str))
1565 re_data.Substitute(str,
"$2");
1567 if (re_raw.MatchB(str))
1568 re_raw.Substitute(str,
"$2");
1577 LOGF(debug,
"%s", __func__);
1578 if (fDecoderConfigFileName.length() == 0)
1579 fDecoderConfigFileName = string(getenv(
"VMCWORKDIR")) +
"/config/bmnconf.json";
1580 pt::read_json(fDecoderConfigFileName, conf);
1581 fExportJsonBocks = conf.get<
bool>(
"Decoder.ExportJson",
false);
1582 fEvForPedestals = conf.get<Int_t>(
"Decoder.NEventsForPedestals",
N_EV_FOR_PEDESTALS);
1583 fEvForNoiseCorr = conf.get<Int_t>(
"Decoder.NEventsForNoiseCorr", 20000);
1595 return fFHCalMapper;
1605 return fScWallMapper;
1607 return fSiliconMapper;
1611 return fTof400Mapper;
1613 return fTof701Mapper;
1617 LOGF(error,
"Unsupported DetectorID");
BmnStatus RecalculatePedestalsAugmented()
Float_t GetPedestal(Int_t iSer, Int_t ch, Int_t smpl)
BmnStatus SaveFilterInfo(TFile *cTalibFile)
void CopyData2PedMap(TClonesArray *adc, UInt_t ev)
unordered_map< UInt_t, Int_t > & GetSerialMap()
void SetEvForPedestals(UInt_t v)
void SetApplyThreshold(bool b)
BmnStatus LoadFilterInfo(TFile *cTalibFile)
void SetAveragePedestal(UInt_t ser, Int_t ch, Int_t smpl, Int_t spill_id, Double_t content)
BmnStatus FillNoisyChannels()
BmnStatus FillProfiles(TClonesArray *adc)
BmnStatus FillEvent(TClonesArray *adc, TClonesArray *csc)
void FillEvent(TClonesArray *tdc, unordered_map< UInt_t, Long64_t > *ts, TClonesArray *dch, Double_t t0)
void InitMappers(std::function< void(TString, TObject *)> branch_reg_fun)
BmnStatus DecodeOffline()
TString GetSubNameAfterRunId(TString name)
BmnStatus DecodeDataToDigiIterate()
void ConfigureStripMappers()
void ClearSpillDigiArrays()
void * GetMapper(DetectorId id)
BmnStatus DecodeDataToDigi()
Int_t GetRunIdFromFile(TString name)
BmnStatus PreInitOffline()
BmnDecoder(TString file="", TString outfile="", ULong_t nEvents=0, ULong_t period=8)
void RecalculatePedestals()
void fillEvent(TClonesArray *data, TClonesArray *ecaldigit)
void fillEvent(TClonesArray *data, TClonesArray *FHCaldigit)
static std::string TimePoint2String(SysPoint p)
BmnStatus FillEvent(TClonesArray *adc, TClonesArray *gem)
BmnStatus FillNoisyChannels()
BmnStatus FillProfiles(TClonesArray *adc)
void fillEvent(TClonesArray *tdc_data, BmnEventHeader *hdr, TClonesArray *digits)
void fillEvent(TClonesArray *tdc_data, TClonesArray *adc_data, TClonesArray *Hododigit)
BmnStatus SumEvent7(TClonesArray *msc, BmnEventHeader *hdr, BmnSpillHeader *sh, UInt_t &nPedEvBySpill)
void FillRunHeader(DigiRunHeader *rh)
void FillEvent(TClonesArray *hrb, TClonesArray *mwpc)
void fillEvent(TClonesArray *tdc_data, TClonesArray *adc_data, unordered_map< UInt_t, Long64_t > *mapTS, TClonesArray *Ndetdigit)
static double correctionSil
void fillEvent(TClonesArray *data, TClonesArray *ScWalldigit)
BmnStatus FillEvent(TClonesArray *adc, TClonesArray *sts)
BmnStatus FillProfiles(TClonesArray *adc)
BmnStatus FillEvent(TClonesArray *adc, TClonesArray *sts)
BmnStatus FillNoisyChannels()
Long64_t GetTime_sec() const
Long64_t GetTime_ns() const
void setVerbose(Int_t verbose)
Bool_t setRun(Int_t nPerion, Int_t nRun)
Bool_t setMapFromFile(TString placementMapFile, TString mapFile)
void FillEvent(TClonesArray *data, unordered_map< UInt_t, Long64_t > *mapTS, TClonesArray *tof1digit)
Bool_t setMapFromFile(TString placementMapFile, TString mapFile)
void setVerbose(Int_t verbose)
void FillEvent(TClonesArray *data, unordered_map< UInt_t, Long64_t > *mapTS, TClonesArray *Tof701digit)
Bool_t setRun(Int_t nPerion, Int_t nRun)
void setINLFromFile(std::string INLFile)
vector< TClonesArray * > * GetTrigArrays()
Name2SerCh & GetScalerMap()
void SetSetup(BmnSetup stp)
BmnStatus FillEvent(TClonesArray *tdc, unordered_map< UInt_t, Long64_t > &tsMap)
BmnStatus FillEvent(TClonesArray *adc, TClonesArray *digits, BmnEventHeader *eh=nullptr)
void fillEvent(TClonesArray *data, TClonesArray *zdcdigit)
#define N_EV_FOR_PEDESTALS