BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnDecoder.cxx
Go to the documentation of this file.
1#include "BmnDecoder.h"
2// System
3#include <arpa/inet.h> /* For ntohl for Big Endian LAND. */
4// C++
5#include <bitset>
6#include <chrono>
7#include <iostream>
8// ROOT
9#include "TStopwatch.h"
10#include "TSystem.h"
11// FairRoot
12#include "FairLogger.h"
13// BmnRoot
14#include "BmnADCDigit.h"
15#include "BmnConverterTools.h"
16#include "BmnGemStripDigit.h"
17#include "BmnHRBDigit.h"
18#include "BmnMSCDigit.h"
19#include "BmnRawDataDecoder.h"
20#include "BmnSyncDigit.h"
21#include "BmnTDCDigit.h"
22#include "BmnTQDCADCDigit.h"
23#include "BmnTrigDigit.h"
24#include "DigiRunHeader.h"
25#include "TangoData.h"
26#include "UniDetectorParameter.h"
27#include "UniRawFile.h"
28#include "UniRun.h"
29// Double_t realtime = 0.0;
30// Double_t converterTime = 0.0;
31
32BmnDecoder::BmnDecoder(TString file, TString outfile, ULong_t nEvents, ULong_t period)
34 , fSpillCntr(0)
36 , isTaskMode(false)
37 , isForwardMode(false)
40 , fPeriodId(period)
41 , fEventId(0)
42 , fNTotalEvents(0)
44 , fStartEventId(0)
45 , fTime_s(0)
46 , fTime_ns(0)
49 , fRawTree(nullptr)
50 , fRawTreeSpills(nullptr)
51 , fDigiTree(nullptr)
52 , fRootFileName(file)
53 , fCalibFileName("adc-calib.root")
54 , fDigiRunHdrName("DigiRunHeader")
55 , fDchMapFileName("")
57 , fGemMapFileName("")
58 , fVspMapFileName("")
65 , fZDCMapFileName("")
79 , fCscMapFileName("")
82 , fRawRunHdrName("RawRunHeader")
83 , fMetadataName("RawRunMetadata")
84 , fRootFileIn(nullptr)
85 , fRootFileOut(nullptr)
86 , fDigiFileOut(nullptr)
87 , fCalibFile(nullptr)
88 , sync(nullptr)
89 , adc32(nullptr)
90 , adc64(nullptr)
91 , adc128(nullptr)
92 , adc(nullptr)
93 , vsp_raw(nullptr)
94 , hrb(nullptr)
95 , tdc(nullptr)
96 , tqdc_tdc(nullptr)
97 , tqdc_adc(nullptr)
98 , tdc_hgnd(nullptr)
99 , eventHeaderDAQ(nullptr)
100 , rawRunHeader(nullptr)
101 , msc(nullptr)
102 , t0raw(nullptr)
103 , silicon(nullptr)
104 , sibt(nullptr)
105 , gem(nullptr)
106 , csc(nullptr)
107 , vsp(nullptr)
108 , tof400(nullptr)
109 , tof700(nullptr)
110 , tof701(nullptr)
111 , zdc(nullptr)
112 , scwall(nullptr)
113 , fhcal(nullptr)
114 , hodo(nullptr)
115 , ndet(nullptr)
116 , hgnd(nullptr)
117 , ecal(nullptr)
118 , dch(nullptr)
119 , mwpc(nullptr)
120 , msc_copy(nullptr)
121 , t0_copy(nullptr)
122 , eventHeader(nullptr)
123 , spillHeader(nullptr)
124 , fMaxEvent(nEvents)
125 , fCscMapper(nullptr)
126 , fGemMapper(nullptr)
127 , fVspMapper(nullptr)
128 , fSiliconMapper(nullptr)
129 , fSiBTMapper(nullptr)
130 , fDchMapper(nullptr)
131 , fMwpcMapper(nullptr)
132 , fTrigMapper(nullptr)
133 , fTof400Mapper(nullptr)
134 //, fTof700Mapper(nullptr) //Legacy
135 , fTof701Mapper(nullptr)
136 , fZDCMapper(nullptr)
137 , fScWallMapper(nullptr)
138 , fFHCalMapper(nullptr)
139 , fHodoMapper(nullptr)
140 , fNdetMapper(nullptr)
141 , fHgndMapper(nullptr)
142 , fECALMapper(nullptr)
143 , fMSCMapper(nullptr)
144 , nSpillEvents(0)
147 , fUseCalibFile(false)
148 , fSaveCalibFile(true)
149 , fExportJsonBocks(false)
150 , fSaveOutput(true)
151 , fT0Serial(0)
152 , fT0SyncTime(0)
153 , fT0Time(0.0)
154 , fT0Width(0.0)
155 , tai_utc_dif(0)
156 , fVerbose(0)
157 , _dfl_run_id{{8, 7814}, {9, 8974}}
158{
159 if (fRootFileName != "") {
160 // printf("fRootFileName %s\n", fRootFileName.Data());
161 fRunId = GetRunIdFromFile(fRootFileName);
162 TString subName = GetSubNameAfterRunId(file);
163 std::printf("RunId %d got from the RawRoot file (BmnDecoder ctor)\n", fRunId);
164 fDigiFileName = (outfile == "") ? Form("bmn_run%d%s_digi.root", fRunId, subName.Data()) : outfile;
165 if (fRootFileName.Length()) {
166
167 } else {
168 Int_t lastSlash = fDigiFileName.Last('/');
169 TString digiPath = (lastSlash == TString::kNPOS) ? "" : TString(fDigiFileName(0, lastSlash + 1));
170 fRootFileName = Form("%sbmn_run%d%s_raw.root", digiPath.Data(), fRunId, subName.Data());
171 }
172 fSubName = subName;
173 } else
174 LOGF(debug, "Creating decoder without input file.");
175 // InitUTCShift();
176 // Legacy
177 // for (int c = 0; c < 60; c++) {
178 // refrun_tof700_slewing[c] = 0;
179 // refchamber_tof700_slewing[c] = 0;
180 // type_tof700_slewing[c] = 0;
181 // }
182
183 // printf("Constructor of DECODER is finished\n");
184}
185
187{
188 if (fGemMapper)
189 delete fGemMapper;
190 if (fCscMapper)
191 delete fCscMapper;
192 if (fVspMapper)
193 delete fVspMapper;
194 if (fSiliconMapper)
195 delete fSiliconMapper;
196 if (fSiBTMapper)
197 delete fSiBTMapper;
198 if (fDchMapper)
199 delete fDchMapper;
200 if (fMwpcMapper)
201 delete fMwpcMapper;
202 if (fTrigMapper)
203 delete fTrigMapper;
204 if (fTof400Mapper)
205 delete fTof400Mapper;
206 // Legacy
207 // if (fTof700Mapper)
208 // delete fTof700Mapper;
209 if (fTof701Mapper)
210 delete fTof701Mapper;
211 if (fZDCMapper)
212 delete fZDCMapper;
213 if (fScWallMapper)
214 delete fScWallMapper;
215 if (fFHCalMapper)
216 delete fFHCalMapper;
217 if (fHodoMapper)
218 delete fHodoMapper;
219 if (fNdetMapper)
220 delete fNdetMapper;
221 if (fHgndMapper)
222 delete fHgndMapper;
223 if (fECALMapper)
224 delete fECALMapper;
225 if (fMSCMapper)
226 delete fMSCMapper;
227
228 if (gem)
229 delete gem;
230 if (csc)
231 delete csc;
232 if (vsp)
233 delete vsp;
234 if (msc_copy)
235 delete msc_copy;
236 if (t0_copy)
237 delete t0_copy;
238 if (dch)
239 delete dch;
240 if (mwpc)
241 delete mwpc;
242 if (silicon)
243 delete silicon;
244 if (tof400)
245 delete tof400;
246 if (tof700)
247 delete tof700;
248 if (tof701)
249 delete tof701;
250 if (zdc)
251 delete zdc;
252 if (scwall)
253 delete scwall;
254 if (fhcal)
255 delete fhcal;
256 if (hodo)
257 delete hodo;
258 if (ndet)
259 delete ndet;
260 if (hgnd)
261 delete hgnd;
262 if (ecal)
263 delete ecal;
264
265 if (eventHeader)
266 delete eventHeader;
267 if (spillHeader)
268 delete spillHeader;
269 if (eventHeaderDAQ)
270 delete eventHeaderDAQ;
271}
272
274{
275 isTaskMode = true;
276 FairRootManager* frm = FairRootManager::Instance();
277 bool save_output = fSaveOutput;
278
279 auto reg_fun = [&](TString name, TObject* ar) -> void {
280 TClass* cl = TClass::GetClass(ar->ClassName());
281 if (cl == TClonesArray::Class())
282 frm->Register(name, name + "_dir", static_cast<TClonesArray*>(ar), save_output);
283 else
284 frm->Register(name, name + "_dir", static_cast<TNamed*>(ar), save_output);
285 LOG(debug1) << "Register by class " << cl->GetName() << " : " << name;
286 return;
287 };
288 LoadConfig();
289 AssignInputs();
290 InitMappers(reg_fun);
291
292 fPedEvCntr = 0; // counter for pedestal events between two recalculations
293 fPedEvCntrBySpill = 0; // counter for pedestal events between two spills
294 fNoiseEvCntr = 0; // counter of event for noise channel detection
297 if (fUseCalibFile)
300 fNSignalEvents = 0;
301 fNTotalEvents = 0;
302 fSpillCntr = 0;
303 return kSUCCESS;
304}
305
307{
308 return kSUCCESS;
309}
310
312{
314
315 return;
316}
317
319{
320 std::printf("[INFO] " ANSI_COLOR_BLUE "Starting to decode file %s\n" ANSI_COLOR_RESET, fRootFileName.Data());
321
322 fRootFileIn = new TFile(fRootFileName, "READ");
323 if (fRootFileIn->IsOpen() == false) {
324 LOGF(error, "\n!!!!\ncannot open file %s \nDecodeDataToDigi stopped\n!!!!", fRootFileName.Data());
325 return kBMNERROR;
326 } else {
327 LOGF(info, "Input file: %s, Output file: %s", fRootFileName.Data(), fDigiFileName.Data());
328 }
329 fRawTree = (TTree*)fRootFileIn->Get("BMN_RAW");
330 AssignInputs();
331
332 fDigiFileOut = new TFile(fDigiFileName, "recreate");
333 NRawTreeEvents = fRawTree->GetEntries(); //(fMaxEvent > fRawTree->GetEntries() || fMaxEvent == 0) ?
334 // fRawTree->GetEntries() : fMaxEvent;
335 NRawTreeSpills = fRawTreeSpills ? fRawTreeSpills->GetEntries() : 0;
336 if (fMaxEvent == 0)
339 return kBMNSUCCESS;
340}
341
343{
344 if (PreInitOffline() == kBMNERROR)
345 return kBMNERROR;
346 InitDecoder();
348 return kBMNSUCCESS;
349}
350
352{
353 /****************** 1st Iter of Si/GEM mapper *************/
354 if (fGemMapper || fSiliconMapper || fCscMapper || fSiBTMapper /* || fVspMapper */) {
355 std::printf("[INFO] Searching for pedestal events\n");
356 for (Long64_t iEv = 0; iEv < NRawTreeEvents; ++iEv) {
357 fRawTree->GetEntry(iEv);
358
359 if (!eventHeaderDAQ)
360 continue;
361 fCurEventType = eventHeaderDAQ->GetEventType();
363 continue;
366 fPedEvCntr++;
367 // } else if (fVerbose == 0)
368 // DrawBar(fPedEvCntr, fEvForPedestals);
369 } else
370 break;
371 }
372 /*if (fPedEvCntr != fEvForPedestals) {
373 printf(ANSI_COLOR_RED "\n[WARNING]" ANSI_COLOR_RESET);
374 printf(" Not enough pedestal events (%d instead of %d)\n", fPedEvCntr, fEvForPedestals);
375 }*/
376 LOGF(info, "Found a total of %d pedestal events", fPedEvCntr);
378 // if (fGemMapper) {
379 // fGemMapper->DrawDebugHists2D();
380 // fGemMapper->DrawDebugHists();
381 //// fGemMapper->ClearDebugHists();
382 // return kBMNSUCCESS;
383 // }
384 // if (fSiliconMapper) {
385 // fSiliconMapper->DrawDebugHists2D();
386 // fSiliconMapper->DrawDebugHists();
387 // fSiliconMapper->ClearDebugHists();
388 //// return kBMNSUCCESS;
389 // }
390 /*fPedEvCntr = 0;
391 printf("\n[INFO]" ANSI_COLOR_BLUE " Clear noisy channels:\n" ANSI_COLOR_RESET);
392 printf("\tFilling signal profiles for station-module-layer histograms\n");
393 UInt_t nEvForNoiseCorrection = 10000;
394 printf("\tNumber of requested events is ");
395 printf(ANSI_COLOR_RED "%u\n" ANSI_COLOR_RESET, nEvForNoiseCorrection);
396 printf("\tActual number of events is ");
397 printf(ANSI_COLOR_RED "%lld\n" ANSI_COLOR_RESET, NRawTreeEvents);*/
398 std::printf("[INFO] Searching for signal events\n");
399 for (Long64_t iEv = 0; iEv < NRawTreeEvents; ++iEv) {
400 fRawTree->GetEntry(iEv);
401 if (!eventHeaderDAQ)
402 continue;
403 fCurEventType = eventHeaderDAQ->GetEventType();
405 /*CopyDataToPedMap(fPedEvCntr);
406 fPedEvCntr++;
407 if ((fPedEvCntr == fEvForPedestals - 1)) {
408 RecalculatePedestals();
409 fPedEvCntr = 0;
410 }*/
411 } else { // payload
412 // if (fPrevEventType == kBMNPEDESTAL && fPedEvCntr == fEvForPedestals - 1)
413 if (fCurEventType == kBMNPAYLOAD) {
414 fNoiseEvCntr++;
415 FillProfiles();
416 if (iEv != 0 && fNoiseEvCntr % 2500 == 0)
417 LOG(info) << "Profile event #" << fNoiseEvCntr << "/" << fEvForNoiseCorr << ";";
418 }
419 }
422 break;
423 }
424 LOGF(info, "Found a total of %d payload events", fNoiseEvCntr);
427 }
428
429 /****************** End of the 1st iter ******************/
432 fNoiseEvCntr = 0;
433 fPedEvCntr = 0;
434 vector<UInt_t> startTripEvent;
435 vector<UInt_t> endTripEvent;
436 // //check for trip information
437 // TString date_start = fRunStartTime.AsString("s"); // 1252 run
438 // TString date_end = fRunEndTime.AsString("s");
439 // std::printf("START (event %u):\t%s\n", fStartEventId, fRunStartTime.AsString());
440 // std::printf("FINISH (event %u):\t%s\n", fEventId, fRunEndTime.AsString());
441 // TangoData db_tango((char*) date_start.Data(), (char*) date_end.Data(), (char*) "gem", (char*) "trip");
442 // TangoData::enumConditions condition = TangoData::conditionEqual;
443 // bool condition_value = 1;
444 // vector<int> map_channel_run5{ 1, 3, 0, 5, 2, 6, 4, 7};
445 // vector<int> map_channel_run6_b1529{ 1, 3, 0, 5, 2, 6, 4};
446 // vector<int> map_channel_run6_a1529{ 1, 3, 0, 5, 6, 4, 2};
447 // vector<int>* map_channel = nullptr;
448 // switch (fPeriodId) {
449 // case 5:
450 // map_channel = &map_channel_run5;
451 // break;
452 // case 6:
453 // if (fRunId < 1569)
454 // map_channel = &map_channel_run6_b1529;
455 // else
456 // map_channel = &map_channel_run6_a1529;
457 // break;
458 // default:
459 // std::printf("Warning: unknown GEM Tango channel map for the run!\n");
460 // break;
461 //
462 // }
463 //
464 // UInt_t runLength = fRunEndTime.AsDouble() - fRunStartTime.AsDouble(); //in seconds.nanoseconds
465 // Double_t timeStep = runLength * 1.0 / fNTotalEvents; //time for one event
466 // //printf("Run duration = %d sec.\t TimeStep = %f sec./event\n", runLength, timeStep);
467 // if (map_channel) {
468 // TObjArray* tango_data_gem = db_tango.SearchTangoIntervals(condition, condition_value, map_channel);
469 // if (tango_data_gem) {
470 // for (Int_t i = 0; i < tango_data_gem->GetEntriesFast(); ++i) {
471 // TObjArray* currGemTripInfo = (TObjArray*) tango_data_gem->At(i);
472 // if (currGemTripInfo->GetEntriesFast() != 0)
473 // for (Int_t j = 0; j < currGemTripInfo->GetEntriesFast(); ++j) {
474 // TangoTimeInterval* ti = (TangoTimeInterval*) currGemTripInfo->At(j);
475 // startTripEvent.push_back(UInt_t((ti->start_time.Convert() - fRunStartTime.AsDouble()) /
476 // timeStep)); endTripEvent.push_back(UInt_t((ti->end_time.Convert() -
477 // fRunStartTime.AsDouble()) / timeStep));
478 // }
479 // }
480 // }
481 // }
482
483 std::printf("[INFO]");
484 std::printf(ANSI_COLOR_BLUE " Main loop over events:\n" ANSI_COLOR_RESET);
485 for (Long64_t iEv = 0; iEv < fMaxEvent; ++iEv) {
487
488 fRawTree->GetEntry(iEv);
489
490 fCurEventType = eventHeaderDAQ->GetEventType();
492 fEventId = eventHeaderDAQ->GetEventId();
493 if (iEv != 0 && iEv % 2500 == 0)
494 LOGF(info, "Decoded %7lld events. EventId %7lld", iEv, fEventId);
495 if ((fStartEventId == 0) && (fEventId))
498 TTimeStamp eventTS(time_t(fTime_s), fTime_ns);
499 fRunEndTime = eventTS;
502 LOGF(debug2, "eventTS: %s et %u", eventTS.AsString(), (uint32_t)fCurEventType);
503 if (!eventHeaderDAQ)
504 continue;
505 Bool_t isTripEvent = kFALSE;
506 for (size_t iTrip = 0; iTrip < startTripEvent.size(); ++iTrip) {
507 if (eventHeaderDAQ->GetEventId() > startTripEvent[iTrip]
508 && eventHeaderDAQ->GetEventId() < endTripEvent[iTrip])
509 {
510 isTripEvent = kTRUE;
511 break;
512 }
513 }
514 if (fVerbose > 0)
515 if ((fNSignalEvents % 5000 == 0) && ((fCurEventType == kBMNPAYLOAD) || (fCurEventType == kBMNPEDESTAL)))
516 cout << "Digitization: " << fNSignalEvents << "/" << fNTotalEvents << "/" << fMaxEvent
517 << " processed; Spill #" << fSpillCntr << endl;
518 // } else if (fVerbose == 0)
519 // DrawBar(fNSignalEvents, fMaxEvent);
522 if (fTrigMapper) {
523 fT0Time = 0.;
524 fT0Width = 0.;
526 }
527 eventHeader->SetRunId(eventHeaderDAQ->GetRunId());
528 eventHeader->SetEventId(eventHeaderDAQ->GetEventId());
529 eventHeader->SetPeriodId(eventHeaderDAQ->GetPeriodId());
530 eventHeader->SetEventTimeTS(eventTS);
531 eventHeader->SetEventTime(eventTS.AsDouble());
532 eventHeader->SetEventType(fCurEventType);
533 eventHeader->SetTripWord(isTripEvent);
534 eventHeader->SetTrigInfo(eventHeaderDAQ->GetTrigInfo());
535 eventHeader->SetTimeShift(fTimeShifts);
536 eventHeader->SetStartSignalInfo(fT0Time, fT0Width);
537 eventHeader->SetSpillStart(eventHeaderDAQ->GetSpillStart());
538 eventHeader->SetInputSignalsAR(eventHeaderDAQ->GetInputSignalsAR());
539 eventHeader->SetInputSignalsBR(eventHeaderDAQ->GetInputSignalsBR());
540 eventHeader->SetInputSignalsVector(move(eventHeaderDAQ->GetInputSignalsVector()));
541
544 if (fPedEvCntr < (fEvForPedestals - 1)) {
546 fPedEvCntr++;
547 }
548 } else {
549 if ((fPrevEventType == kBMNPEDESTAL) && (fPedEvCntr == (fEvForPedestals - 1))) {
551#ifdef ADC_QA
552 FillAdcQa();
553#endif
554 }
555 if (fCurEventType == kBMNPAYLOAD) { // payload
572 }
573 }
574 if (fMSCMapper && (fPeriodId < 8))
576
577 fDigiTree->Fill();
578#ifdef FILL_RMS
579 if (fCurEventType == kBMNPAYLOAD) { // testing RMS
580 printf("Test RMS. Exit");
581 break;
582 }
583#endif
585 eventHeader->SetSpillStart(true);
586 fSpillCntr++;
587 LOGF(info, "Spill start# %3u iEntry %6d EventId %8u", fSpillCntr, iEv, fEventId);
588 } else
589 eventHeader->SetSpillStart(false);
592 break;
593 }
594 {
595 for (UInt_t iSpillEntry = 0; iSpillEntry < NRawTreeSpills; ++iSpillEntry) {
597 fRawTreeSpills->GetEntry(iSpillEntry);
598 if (msc_copy)
599 msc_copy->AbsorbObjects(msc);
600 if (t0_copy) {
601 t0_copy->AbsorbObjects(t0raw);
602 if (t0_copy->GetEntries()) {
603 BmnT0Raw* dig = static_cast<BmnT0Raw*>(t0_copy->At(0));
604 LOG(debug) << "T0 time " << BmnFunctionSet::TimePoint2String(dig->GetTime()) << " iEntry "
605 << iSpillEntry;
606 }
607 }
608 fDigiTreeSpills->Fill();
609 }
610 }
611#ifdef ADC_QA
612 SaveAdcQa();
613#endif
614 // if (fSiliconMapper) {
615 // fSiliconMapper->DrawDebugHists2D();
616 // // fSiliconMapper->DrawDebugHists();
617 // // fSiliconMapper->ClearDebugHists();
618 // // return kBMNSUCCESS;
619 // }
620 // Legacy
621 // if (fTof700Mapper) {
622 // fTof700Mapper->WriteSlewingResults();
623 // fDigiFileOut->cd();
624 // }
626 printf("runHeader %p\n", (void*)runHeader);
627 runHeader->SetTrigConfig(rawRunHeader->GetTrigConfig());
628 runHeader->SetSpillMap(move(rawRunHeader->GetSpillMap()));
629 if (fTrigMapper) {
630 runHeader->T0Map() = fTrigMapper->T0Map();
631 runHeader->GetTrcBitMap() = fTrigMapper->GetTrcMap();
632 runHeader->GetScalerMap() = fTrigMapper->GetScalerMap();
633 }
634 if (fMSCMapper)
635 fMSCMapper->FillRunHeader(runHeader);
636 fDigiFileOut->WriteObject(runHeader, fDigiRunHdrName.Data());
637 fDigiFileOut->WriteObject(metadata, fMetadataName.Data());
638
639 std::printf(ANSI_COLOR_RED "\n=============== RUN" ANSI_COLOR_RESET);
640 std::printf(ANSI_COLOR_BLUE " %04d " ANSI_COLOR_RESET, fRunId);
641 std::printf(ANSI_COLOR_RED "SUMMARY ===============\n" ANSI_COLOR_RESET);
642 std::printf("START (event %u):\t%s\n", fStartEventId, fRunStartTime.AsString());
643 std::printf("FINISH (event %u):\t%s\n", fEventId, fRunEndTime.AsString());
644 std::printf("Total Events:\t%lu\nSignal Events:\t%lu\n", fNTotalEvents, fNSignalEvents);
645 std::printf(ANSI_COLOR_RED "================================================\n" ANSI_COLOR_RESET);
646
647#ifdef DECL_TIMERS
665#endif
666
667 if (fRawTree)
668 fRawTree->Delete();
669 // fDigiTree->Write();
670 // if (fDigiTreeSpills) fDigiTreeSpills->Write();
671
672 fDigiFileOut->Write();
673 fDigiFileOut->Close();
674 delete runHeader;
675 fRootFileIn->Close();
676 Finalize();
677 return kBMNSUCCESS;
678}
679
681{
682 auto reg_fun = [&](TString name, TObject* ar) -> void {
683 fDigiTree->Branch(name, &ar);
684 LOGF(debug1, "Register branch: %s", name.Data());
685 return;
686 };
687 LoadConfig();
688 InitMappers(reg_fun);
689
690 fPedEvCntr = 0; // counter for pedestal events between two recalculations
691 fPedEvCntrBySpill = 0; // counter for pedestal events between two spills
692 fNoiseEvCntr = 0; // counter of event for noise channel detection
695 if (fUseCalibFile)
698 fNSignalEvents = 0;
699 fNTotalEvents = 0;
700 fSpillCntr = 0;
701 return kBMNSUCCESS;
702}
703
705{
706 Assignment_Fun("SYNC", &sync, fRawTree);
707 Assignment_Fun("ADC32", &adc32, fRawTree);
708 Assignment_Fun("ADC64", &adc64, fRawTree);
709 Assignment_Fun("ADC128", &adc128, fRawTree);
710 Assignment_Fun("ADC", &adc, fRawTree);
711 Assignment_Fun("VSP_RAW", &vsp_raw, fRawTree);
712 Assignment_Fun("TDC", &tdc, fRawTree);
713 Assignment_Fun("TQDC_ADC", &tqdc_adc, fRawTree);
714 Assignment_Fun("TQDC_TDC", &tqdc_tdc, fRawTree);
715 Assignment_Fun("TDC_HGND", &tdc_hgnd, fRawTree);
716 Assignment_Fun("HRB", &hrb, fRawTree);
717 Assignment_Fun("BmnEventHeader.", &eventHeaderDAQ, fRawTree);
718 if ((!isForwardMode) && (!isTaskMode)) {
719 fRawTreeSpills = (TTree*)fRootFileIn->Get("BMN_RAW_SPILLS");
721 metadata = static_cast<BmnMetadataRaw*>(fRootFileIn->Get(fMetadataName));
722 // printf("extracted raw tcc %lu after\n",
723 // rawRunHeader->GetTrigConfig().TrigChannelConfig().size());
724 }
725 if (fRawTreeSpills) {
728 // fRawTreeSpills->SetBranchAddress("MSC", &msc);
729 // fRawTreeSpills->SetBranchAddress("T0Raw", &t0raw);
730 }
731 return;
732}
733
735{
736 if (fGemMapper) {
737 fGemMapper->SetApplyThreshold(fApplyThreshold);
738 fGemMapper->SetEvForPedestals(fEvForPedestals);
739 }
740 if (fCscMapper) {
741 fCscMapper->SetApplyThreshold(fApplyThreshold);
742 fCscMapper->SetEvForPedestals(fEvForPedestals);
743 }
744 if (fSiliconMapper) {
745 fSiliconMapper->SetApplyThreshold(fApplyThreshold);
746 fSiliconMapper->SetEvForPedestals(fEvForPedestals);
747 }
748 if (fSiBTMapper) {
749 fSiBTMapper->SetApplyThreshold(fApplyThreshold);
750 fSiBTMapper->SetEvForPedestals(fEvForPedestals);
751 }
752 // if (fVspMapper) {
753 // fVspMapper->SetApplyThreshold(fApplyThreshold);
754 // fVspMapper->SetEvForPedestals(fEvForPedestals);
755 // }
756}
757
758void BmnDecoder::InitMappers(std::function<void(TString, TObject*)> branch_reg_fun)
759{
760 uint32_t run4init = (fRunId == UNKNOWN_RUNID) ? _dfl_run_id[fPeriodId] : fRunId;
761 fDigiTree =
762 new TTree(conf.get<string>("Decoder.DigiTreeName").c_str(), conf.get<string>("Decoder.DigiTreeTitle").c_str());
764 Register_Fun("BmnEventHeader.", &eventHeader);
765 if (fRawTreeSpills) {
766 fDigiTreeSpills = new TTree("spill", "spill");
768 fDigiTreeSpills->Branch("BmnSpillHeader.", &spillHeader);
769 if (fPeriodId < 8)
771 msc_copy = new TClonesArray(msc->GetClass());
772 fDigiTreeSpills->Branch("MSC", &msc_copy);
773 t0_copy = new TClonesArray(t0raw->GetClass());
774 fDigiTreeSpills->Branch("T0Raw", &t0_copy);
775 } else {
776 msc_copy = new TClonesArray(msc->GetClass());
777 t0_copy = new TClonesArray(t0raw->GetClass());
778 }
779
780 // check if detector is in setup and is active
781 if (fDetectorSetup.count(kBC) > 0 && fDetectorSetup.at(kBC) == 1) {
783 if (fT0Serial == 0) {
784 fT0Serial = fTrigMapper->GetT0Serial();
785 LOGF(info, "T0 serial 0x%X got from trig mapping (InitMappers)", fT0Serial);
786 }
787 fTrigMapper->SetSetup(fBmnSetup);
788 } else {
790 if (fT0Serial == 0) {
791 fT0Serial = fTrigMapper->GetT0Serial();
792 LOGF(info, "T0 serial 0x%X got from trig mapping (InitMappers)", fT0Serial);
793 }
794 delete fTrigMapper;
795 fTrigMapper = nullptr;
796 }
797
798 if (fDetectorSetup.count(kMWPC) > 0 && fDetectorSetup.at(kMWPC) == 1) {
799 mwpc = new TClonesArray("BmnMwpcDigit");
800 Register_Fun("MWPC", &mwpc);
802 }
803
804 if (fDetectorSetup.count(kSILICON) > 0 && fDetectorSetup.at(kSILICON) == 1) {
805 silicon = new TClonesArray("BmnSiliconDigit");
806 Register_Fun("SILICON", &silicon);
808 fSiliconMapper->SetVerbose(0);
809#ifdef ADC_QA
810 fFsdQa = new BmnAdcQA(fPeriodId, run4init, "FSD");
811#endif
812 }
813
814 if (fDetectorSetup.count(kSiBT) > 0 && fDetectorSetup.at(kSiBT) == 1) {
815 sibt = new TClonesArray("BmnSiBTDigit");
816 Register_Fun("SiBT", &sibt);
818 }
819
820 if (fDetectorSetup.count(kGEM) > 0 && fDetectorSetup.at(kGEM) == 1) {
821 gem = new TClonesArray("BmnGemStripDigit");
822 Register_Fun("GEM", &gem);
824#ifdef ADC_QA
825 fGemQa = new BmnAdcQA(fPeriodId, run4init, "GEM");
826#endif
827 }
828
829 if (fDetectorSetup.count(kVSP) > 0 && fDetectorSetup.at(kVSP) == 1) {
830 LOGF(info, "---------- Init VSP mapper ----------");
831 vsp = new TClonesArray("BmnVSPDigit");
832 Register_Fun("VSP", &vsp);
834 }
835
836 if (fDetectorSetup.count(kTOF1) > 0 && fDetectorSetup.at(kTOF1) == 1) {
837 LOGF(info, "---------- Init TOF400 mapper ----------");
838 tof400 = new TClonesArray("BmnTof1Digit");
839 Register_Fun("TOF400", &tof400);
841 fTof400Mapper->setVerbose(fVerbose);
842 Bool_t FlagTemp = fTof400Mapper->setRun(fPeriodId, run4init);
843 if (FlagTemp == kFALSE) {
844 if (fTof400PlaceMapFileName.Sizeof() > 1 && fTof400StripMapFileName.Sizeof() > 1) {
845 TString dir = Form("%s%s", getenv("VMCWORKDIR"), "/input/");
846 FlagTemp = fTof400Mapper->setMapFromFile(dir + fTof400PlaceMapFileName.Data(),
847 dir + fTof400StripMapFileName.Data());
848 }
849 }
850 LOGF(info, "---------- Initialization of TOF400 mapper finished ----------");
851 }
852
853 if (fDetectorSetup.count(kTOF701) > 0 && fDetectorSetup.at(kTOF701) == 1) {
854 LOGF(info, "---------- Init TOF701 mapper ----------");
855 tof701 = new TClonesArray("BmnTof701Digit");
856 Register_Fun("TOF701", &tof701);
858 fTof701Mapper->setVerbose(fVerbose);
859 Bool_t FlagTemp = fTof701Mapper->setRun(fPeriodId, run4init);
860 if (FlagTemp == kFALSE) {
861 if (fTof701PlaceMapFileName.Sizeof() > 1 && fTof701StripMapFileName.Sizeof() > 1) {
862 TString dir = Form("%s%s", getenv("VMCWORKDIR"), "/input/");
863 FlagTemp = fTof701Mapper->setMapFromFile(dir + fTof701PlaceMapFileName.Data(),
864 dir + fTof701StripMapFileName.Data());
865 fTof701Mapper->setINLFromFile(Form("%s%s", dir.Data(), "TOF701_ListINLFiles_Run8.txt"));
866 }
867 }
868 LOGF(info, "---------- Initialization of TOF701 mapper finished ----------");
869 }
870
871 // Legacy
872 // if (fDetectorSetup.count(kTOF) > 0 && fDetectorSetup.at(kTOF) == 1) {
873 // LOGF(info, "---------- Init TOF700 mapper ----------");
874 // if (fTOF700ReferenceRun <= 0) {
875 // UniDetectorParameter* pDetectorParameter = UniDetectorParameter::GetDetectorParameter(
876 // "TOF2", "slewing_file_id", fPeriodId,
877 // run4init); //(detector_name, parameter_name, period_number, run_number)
878 // if (pDetectorParameter) {
879 // IntValue* pReferenceRun = (IntValue*)pDetectorParameter->GetValue();
880 // fTOF700ReferenceRun = pReferenceRun->value;
881 // delete pDetectorParameter;
882 // } else {
883 // LOGF(error, "Not found slewing run ID for run %d in DB", run4init);
884 // }
885 // }
886 // tof700 = new TClonesArray("BmnTof2Digit");
887 // Register_Fun("TOF700", &tof700);
888 // fTof700Mapper = new BmnTof2Raw2DigitNew(fTof700MapFileName, fRootFileName, fTOF700ReferenceRun,
889 // fTOF700ReferenceChamber, fTof700GeomFileName);
890 // for (int i = 0; i < 60; i++) {
891 // if (type_tof700_slewing[i]) {
892 // fTof700Mapper->SetSlewingReference(i + 1, refrun_tof700_slewing[i], refchamber_tof700_slewing[i]);
893 // }
894 // }
895 // // fTof700Mapper->readSlewingT0();
896 // // fTof700Mapper->readSlewingLimits();
897 // fTof700Mapper->readSlewing();
898 // fTof700Mapper->BookSlewingResults();
899 // LOGF(info, "---------- Initialization of TOF700 mapper finished ----------");
900 // }
901
902 if (fDetectorSetup.count(kDCH) > 0 && fDetectorSetup.at(kDCH) == 1) {
903 dch = new TClonesArray("BmnDchDigit");
904 Register_Fun("DCH", &dch);
905 fDchMapper = new BmnDchRaw2Digit(fPeriodId, run4init);
906 }
907
908 if (fDetectorSetup.count(kZDC) > 0 && fDetectorSetup.at(kZDC) == 1) {
909 zdc = new TClonesArray("BmnZDCDigit");
910 Register_Fun("ZdcDigit", &zdc);
912 }
913
914 if (fDetectorSetup.count(kECAL) > 0 && fDetectorSetup.at(kECAL) == 1) {
915 ecal = new TClonesArray("BmnECALDigit");
916 Register_Fun("EcalDigit", &ecal);
917 fECALMapper = new BmnECALRaw2Digit(run4init);
918 }
919
920 if (fDetectorSetup.count(kSCWALL) > 0 && fDetectorSetup.at(kSCWALL) == 1) {
921 LOG(info) << "scwall in setup";
922 scwall = new TClonesArray("BmnScWallDigi");
923 Register_Fun("ScWallDigi", &scwall);
926 fScWallMapper->print();
927 }
928
929 if (fDetectorSetup.count(kFHCAL) > 0 && fDetectorSetup.at(kFHCAL) == 1) {
930 LOG(info) << "fhcal in setup";
931 fhcal = new TClonesArray("BmnFHCalDigi");
932 Register_Fun("FHCalDigi", &fhcal);
934 fFHCalMapper->print();
935 }
936
937 if (fDetectorSetup.count(kHODO) > 0 && fDetectorSetup.at(kHODO) == 1) {
938 LOG(info) << "hodo in setup";
939 hodo = new TClonesArray("BmnHodoDigi");
940 Register_Fun("HodoDigi", &hodo);
943 fHodoMapper->print();
944 }
945
946 if (fDetectorSetup.count(kNDET) > 0 && fDetectorSetup.at(kNDET) == 1) {
947 LOG(info) << "ndet in setup";
948 ndet = new TClonesArray("BmnNdetDigi");
949 Register_Fun("NdetDigi", &ndet);
951 fNdetMapper->print();
952 }
953
954 if (fDetectorSetup.count(kHGND) > 0 && fDetectorSetup.at(kHGND) == 1) {
955 LOG(info) << "hgnd in setup";
956 hgnd = new TClonesArray("BmnHgndDigi");
957 Register_Fun("HgndDigi", &hgnd);
959 fHgndMapper->print();
960 }
961
962 if (fDetectorSetup.count(kCSC) > 0 && fDetectorSetup.at(kCSC) == 1) {
963 csc = new TClonesArray("BmnCSCDigit");
964 Register_Fun("CSC", &csc);
966#ifdef ADC_QA
967 fCscQa = new BmnAdcQA(fPeriodId, run4init, "CSC");
968#endif
969 }
970 return;
971}
972
974{
975 TDirectory* temp_dir = gDirectory;
976 fCalibFile = new TFile(FileName, "READ");
977 if (fCalibFile)
978 if (fCalibFile->IsOpen()) {
979 if (fSiliconMapper)
980 fSiliconMapper->LoadFilterInfo(fCalibFile);
981 if (fGemMapper)
982 fGemMapper->LoadFilterInfo(fCalibFile);
983 if (fCscMapper)
984 fCscMapper->LoadFilterInfo(fCalibFile);
985 if (fSiBTMapper)
986 fSiBTMapper->LoadFilterInfo(fCalibFile);
987 // if (fVspMapper)
988 // fVspMapper->LoadFilterInfo(fCalibFile);
989 fCalibFile->Close();
992 LOGF(info, "ADC calibration file loaded!");
993 }
994 gDirectory = temp_dir;
995 return kBMNSUCCESS;
996}
997
999{
1000 fCalibFile = new TFile(FileName, "RECREATE");
1001 if (fCalibFile) {
1002 if (fSiliconMapper)
1003 fSiliconMapper->SaveFilterInfo(fCalibFile);
1004 if (fGemMapper)
1005 fGemMapper->SaveFilterInfo(fCalibFile);
1006 if (fCscMapper)
1007 fCscMapper->SaveFilterInfo(fCalibFile);
1008 if (fSiBTMapper)
1009 fSiBTMapper->SaveFilterInfo(fCalibFile);
1010 // if (fVspMapper)
1011 // fVspMapper->SaveFilterInfo(fCalibFile);
1012 fCalibFile->Close();
1013 LOGF(info, "ADC calibration file saved!");
1014 }
1015 return kBMNSUCCESS;
1016}
1017
1019{
1020 if (dch)
1021 dch->Delete();
1022 if (mwpc)
1023 mwpc->Delete();
1024 if (gem)
1025 gem->Delete();
1026 if (csc)
1027 csc->Delete();
1028 if (vsp)
1029 vsp->Delete();
1030 if (sibt)
1031 sibt->Delete();
1032 if (silicon)
1033 silicon->Delete();
1034 if (tof400)
1035 tof400->Delete();
1036 if (tof700)
1037 tof700->Delete();
1038 if (tof701)
1039 tof701->Delete();
1040 if (zdc)
1041 zdc->Delete();
1042 if (scwall)
1043 scwall->Delete();
1044 if (fhcal)
1045 fhcal->Delete();
1046 if (hodo)
1047 hodo->Delete();
1048 if (ndet)
1049 ndet->Delete();
1050 if (hgnd)
1051 hgnd->Delete();
1052 if (ecal)
1053 ecal->Delete();
1054 if (fTrigMapper)
1055 fTrigMapper->ClearArrays();
1056 fTimeShifts.clear();
1057 eventHeader->Clear();
1058}
1059
1061{
1062 if (spillHeader)
1063 spillHeader->Clear();
1064 if (msc_copy)
1065 msc_copy->Delete();
1066 if (t0_copy)
1067 t0_copy->Delete();
1068}
1069
1071{
1072 LOGF(info, "Starting to correct pedestal events");
1073 if (fGemMapper)
1074 fGemMapper->RecalculatePedestalsAugmented();
1075 if (fCscMapper)
1076 fCscMapper->RecalculatePedestalsAugmented();
1077 if (fSiliconMapper)
1078 fSiliconMapper->RecalculatePedestalsAugmented();
1079 if (fSiBTMapper)
1080 fSiBTMapper->RecalculatePedestalsAugmented();
1081 // if (fVspMapper)
1082 // fVspMapper->RecalculatePedestalsAugmented();
1083 fPedEvCntr = 0;
1084 fPedEnough = kTRUE;
1085 LOGF(info, "Finished correcting pedestal events");
1086}
1087
1089{
1090 if (fFsdQa) {
1091 UInt_t serial = 0x0AADD6E9;
1092 Int_t i_serial = fSiliconMapper->GetSerialMap()[serial];
1093 Int_t ch = 10;
1094 Int_t smpl = 3;
1095 fFsdQa->SetAveragePedestal(serial, ch, smpl, fSpillCntr, fSiliconMapper->GetPedestal(i_serial, ch, smpl));
1096 serial = 0x04E993A5;
1097 i_serial = fSiliconMapper->GetSerialMap()[serial];
1098 ch = 8;
1099 smpl = 5;
1100 fFsdQa->SetAveragePedestal(serial, ch, smpl, fSpillCntr, fSiliconMapper->GetPedestal(i_serial, ch, smpl));
1101 }
1102 if (fGemQa) {
1103 UInt_t serial = 0x0aad5333;
1104 Int_t i_serial = fGemMapper->GetSerialMap()[serial];
1105 Int_t ch = 47;
1106 Int_t smpl = 25;
1107 fGemQa->SetAveragePedestal(serial, ch, smpl, fSpillCntr, fGemMapper->GetPedestal(i_serial, ch, smpl));
1108 }
1109 if (fCscQa) {
1110 UInt_t serial = 0x0A7B2235;
1111 Int_t i_serial = fCscMapper->GetSerialMap()[serial];
1112 Int_t ch = 7;
1113 Int_t smpl = 14;
1114 fCscQa->SetAveragePedestal(serial, ch, smpl, fSpillCntr, fCscMapper->GetPedestal(i_serial, ch, smpl));
1115 }
1116}
1117
1119{
1120 if (fFsdQa)
1121 fFsdQa->SaveHists();
1122 if (fGemQa)
1123 fGemQa->SaveHists();
1124 if (fCscQa)
1125 fCscQa->SaveHists();
1126}
1127
1129{
1130 if (fGemMapper)
1131 fGemMapper->FillProfiles(adc32);
1132 if (fCscMapper)
1133 fCscMapper->FillProfiles(adc32);
1134 if (fSiliconMapper)
1135 fSiliconMapper->FillProfiles(adc128);
1136 // if (fVspMapper)
1137 // fVspMapper->FillProfiles(vsp_raw);
1138 // if (fSiBTMapper) fSiBTMapper->FillProfiles(adc64);
1139}
1140
1142{
1143 LOGF(info, "Marking noisy channels from signal events");
1144 if (fGemMapper)
1145 fGemMapper->FillNoisyChannels();
1146 if (fCscMapper) {
1147 // BmnRawDataDecoder::samplesCsc = 32;
1148 // BmnRawDataDecoder::threshCsc = 2;
1149 fCscMapper->FillNoisyChannels();
1150 }
1151 // if (fVspMapper) {
1152 // // BmnRawDataDecoder::samplesCsc = 32;
1153 // // BmnRawDataDecoder::threshCsc = 2;
1154 // fVspMapper->FillNoisyChannels();
1155 // }
1156 if (fSiliconMapper) {
1157 // extremely high picks
1161 fSiliconMapper->FillNoisyChannels();
1162
1163 // low groups of noisy channels
1167
1168 fSiliconMapper->FillNoisyChannels();
1169 }
1170 // if (fSiBTMapper) fSiBTMapper->FillNoisyChannels();
1171}
1172
1174{
1177 fCurEventType = eventHeaderDAQ->GetEventType();
1178 fEventId = eventHeaderDAQ->GetEventId();
1179 // LOGF(info, "iEv %6u fPedEnough %d, fNoiseEnough %d", fEventId, fPedEnough, fNoiseEnough);
1181 TTimeStamp eventTS(time_t(fTime_s), fTime_ns);
1182 fRunEndTime = eventTS;
1186 fNTotalEvents++;
1187
1188 if (fVerbose > 0) {
1189 if ((fNSignalEvents % 5000 == 0) && ((fCurEventType == kBMNPAYLOAD) || (fCurEventType == kBMNPEDESTAL)))
1190 LOG(info) << "Digitization: " << fNSignalEvents << "/" << fNTotalEvents << "/" << fMaxEvent
1191 << " processed; Spill #" << fSpillCntr;
1192 }
1193 // printf("fCurEventType %d\n", fCurEventType);
1194 fT0Time = 0.;
1197 if (fTrigMapper) {
1198 fT0Time = 0.0;
1199 fT0Width = 0.0;
1201 }
1202 if ((fCurEventType == kBMNPEDESTAL)) {
1203 // if ((Int_t)fPedEvCntr == fEvForPedestals - 1)
1204 // return kBMNERROR; // FIX return!
1206 } else if (fCurEventType == kBMNPAYLOAD) { // payload
1208 if (fPedEvCntr >= fEvForPedestals - 1) {
1210 fPedEvCntr = 0;
1211 fPedEnough = true;
1212 }
1213 }
1214 if (fPedEnough) {
1215 if (fNoiseEnough) {
1220 } else {
1221 if (fCurEventType == kBMNPAYLOAD) {
1222 fNoiseEvCntr++;
1223 if (fVerbose > 0) {
1224 if (fNoiseEvCntr % 1000 == 0)
1225 LOG(info) << "Profile event #" << fNoiseEvCntr << "/" << fEvForNoiseCorr << ";";
1226 }
1227 FillProfiles();
1229 LOGF(info, ANSI_COLOR_BLUE " Marking noisy channels" ANSI_COLOR_RESET);
1232 fNoiseEnough = true;
1233 }
1234 }
1235 }
1236 }
1241 // Legacy
1242 // if (fTof700Mapper && fT0Time != 0. && fT0Width != 0.) fTof700Mapper->FillEvent(tdc, &fTimeShifts,
1243 // fT0Time, fT0Width, tof700);
1244 // FILL_DETECTOR(fTof700Mapper, tdc, &fTimeShifts, fT0Time, fT0Width, tof700)
1253 }
1254 eventHeader->SetRunId(eventHeaderDAQ->GetRunId());
1255 eventHeader->SetEventId(eventHeaderDAQ->GetEventId());
1256 eventHeader->SetPeriodId(eventHeaderDAQ->GetPeriodId());
1257 eventHeader->SetEventTimeTS(fRunEndTime);
1258 eventHeader->SetEventTime(fRunEndTime.AsDouble());
1259 eventHeader->SetEventType(fCurEventType);
1260 eventHeader->SetTripWord(kFALSE);
1261 eventHeader->SetTrigInfo(eventHeaderDAQ->GetTrigInfo());
1262 eventHeader->SetTimeShift(fTimeShifts);
1263 eventHeader->SetStartSignalInfo(fT0Time, fT0Width);
1264 eventHeader->SetSpillStart(eventHeaderDAQ->GetSpillStart());
1265 eventHeader->SetInputSignalsAR(eventHeaderDAQ->GetInputSignalsAR());
1266 eventHeader->SetInputSignalsBR(eventHeaderDAQ->GetInputSignalsBR());
1267 eventHeader->SetInputSignalsVector(move(eventHeaderDAQ->GetInputSignalsVector()));
1268 // fDigiTree->Fill();
1270 eventHeader->SetSpillStart(true);
1271 LOGF(info, "spill start %u", eventHeader->GetSpillStart());
1272 } else
1273 eventHeader->SetSpillStart(false);
1275 if (msc_copy)
1276 msc_copy->AbsorbObjects(msc);
1277 if (t0_copy)
1278 t0_copy->AbsorbObjects(t0raw);
1279 // LOGF(info, "Event type %u GEM %4d MSC %4d",(uint8_t)fCurEventType, gem->GetEntries(),
1280 // msc_copy->GetEntries());
1281 return kBMNSUCCESS;
1282}
1283
1290
1292{
1293 if (fT0Serial == 0)
1294 return kBMNERROR;
1295 fT0SyncTime = 0;
1296 for (Int_t i = 0; i < sync->GetEntriesFast(); ++i) {
1297 BmnSyncDigit* syncDig = (BmnSyncDigit*)sync->At(i);
1298 // if (fTrigMapper)
1299 // if (syncDig->GetSerial() == fTrigMapper->GetTrcSerial()) {
1300 // LOGF(debug, "TRC sync: %s", TTimeStamp(time_t(fTime_s), fTime_ns).AsString());
1301 // break;
1302 // }
1303 if (syncDig->GetSerial() == fT0Serial) {
1304 fT0SyncTime = syncDig->GetTime_ns() + syncDig->GetTime_sec() * 1000000000LL;
1305 fTime_s = syncDig->GetTime_sec();
1306 fTime_ns = syncDig->GetTime_ns();
1307 // printf("serial %08X sync: %s\n", syncDig->GetSerial(), TTimeStamp(time_t(fTime_s), fTime_ns).AsString());
1308 if (fRunStartTime == TimeZero) {
1310 }
1311 LOGF(debug, "T0 sync: %s", TTimeStamp(time_t(fTime_s), fTime_ns).AsString());
1312 break;
1313 }
1314 }
1315 for (Int_t i = 0; i < sync->GetEntriesFast(); ++i) {
1316 BmnSyncDigit* syncDig = (BmnSyncDigit*)sync->At(i);
1317 Long64_t syncTime = (fT0SyncTime == 0.0) ? 0 : syncDig->GetTime_ns() + syncDig->GetTime_sec() * 1000000000LL;
1318 fTimeShifts.insert(pair<UInt_t, Long64_t>(syncDig->GetSerial(), syncTime - fT0SyncTime));
1319 }
1320 return kBMNSUCCESS;
1321}
1322
1324{
1325 if (ev < fEvForPedestals) {
1326 if (fVerbose > 0)
1327 if (fPedEvCntr % 100 == 0 && fPedEvCntr > 0)
1328 cout << "Pedestal event #" << fPedEvCntr << "/" << fEvForPedestals << ";" << endl;
1329 if (fGemMapper)
1330 fGemMapper->CopyData2PedMap(adc32, ev);
1331 if (fSiliconMapper)
1332 fSiliconMapper->CopyData2PedMap(adc128, ev);
1333 if (fSiBTMapper)
1334 fSiBTMapper->CopyData2PedMap(adc64, ev);
1335 if (fCscMapper)
1336 fCscMapper->CopyData2PedMap(adc32, ev);
1337 // if (fVspMapper)
1338 // fVspMapper->CopyData2PedMap(vsp_raw, vsp);
1339 }
1340}
1341
1342// Legacy
1343// void BmnDecoder::SetTof700SlewingReference(Int_t chamber, Int_t refrun, Int_t refchamber)
1344// {
1345// if (chamber <= 0 || chamber > 60) {
1346// std::printf("Wrong slewing chamber number %d\n", chamber);
1347// return;
1348// }
1349// if (refchamber <= 0 || refchamber > 60) {
1350// std::printf("Wrong slewing reference chamber number %d\n", refchamber);
1351// return;
1352// }
1353// if (refrun < 0 || refrun > 9999) {
1354// std::printf("Wrong slewing reference run number %d\n", refrun);
1355// return;
1356// }
1357// refrun_tof700_slewing[chamber - 1] = refrun;
1358// refchamber_tof700_slewing[chamber - 1] = refchamber;
1359// type_tof700_slewing[chamber - 1] = 1;
1360// return;
1361// }
1362
1364{
1365 fRunId = 0;
1366 TPRegexp re(".+\\.root");
1367 TPRegexp re_data(".*\\w+_\\w+_\\w+_(\\d+)([^/]*)\\.data");
1368 if (re.MatchB(name)) {
1369 fRootFileIn = new TFile(name, "READ");
1370 if (fRootFileIn->IsOpen()) {
1371 BmnEventHeader* tempHdr = nullptr;
1372 TTree* RawTree = (TTree*)fRootFileIn->Get("BMN_RAW");
1373 if (RawTree) {
1374 RawTree->SetBranchAddress("BmnEventHeader.", &tempHdr);
1375 if (RawTree->GetEntriesFast()) {
1376 RawTree->GetEntry(0);
1377 fRunId = tempHdr->GetRunId();
1378 fRootFileName = name;
1379 }
1380 delete RawTree;
1381 }
1382 delete tempHdr;
1383 fRootFileIn->Close();
1384 }
1385 delete fRootFileIn;
1386 }
1387 if (fRunId > 0)
1388 return fRunId;
1389 if (fRunId <= 0) {
1390 // Int_t run = 0;
1391 // sscanf(&(((char *)name.Data())[strlen(name.Data())-9]), "%d", &run);
1392 re_data.Substitute(name, "$1");
1393
1394 // cout << name << endl;
1395
1396 return name.Atoi();
1397
1398 } else
1399 return fRunId;
1400}
1401
1403{
1404 vector<TClonesArray*>* trigArr = fTrigMapper->GetTrigArrays();
1405 BmnTrigDigit* dig = 0;
1406 for (auto ar : *trigArr) {
1407 if ((fPeriodId == 8) && (fBmnSetup == kSRCSETUP)) { // temporary crutches
1408 if ((fRunId >= 986) && (fRunId <= 1086)) {
1409 if ((strcmp(ar->GetName(), "BC2_1_A")))
1410 continue;
1411 } else {
1412 if ((strcmp(ar->GetName(), "T0_1_A")))
1413 continue;
1414 }
1415 } else {
1416 if (fPeriodId > 6) {
1417 if (fPeriodId == 8) {
1418 if (strcmp(ar->GetName(), "BC2AT"))
1419 continue;
1420 } else {
1421 if (strcmp(ar->GetName(), "BC2"))
1422 continue;
1423 }
1424 } else {
1425 if (strcmp(ar->GetName(), "T0"))
1426 continue;
1427 }
1428 }
1429 for (int i = 0; i < ar->GetEntriesFast(); i++) {
1430 dig = (BmnTrigDigit*)ar->At(i);
1431 if (dig->GetMod() == 0) {
1432 t0time = dig->GetTime();
1433 t0width = dig->GetAmp();
1434 // printf(" t0 %f t0w %f n %d\n", t0time, t0width, ar->GetEntriesFast());
1435 return kBMNSUCCESS;
1436 }
1437 }
1438 }
1439 return kBMNERROR;
1440}
1441
1443{
1444 TPRegexp re_data(".*\\w+_\\w+_\\w+_(\\d+)([^/]*)\\.data");
1445 TPRegexp re_raw(".*\\w+_run(\\d+)([^/]*)_raw\\.root");
1446 TString str(name);
1447 if (re_data.MatchB(str))
1448 re_data.Substitute(str, "$2");
1449 else {
1450 if (re_raw.MatchB(str))
1451 re_raw.Substitute(str, "$2");
1452 else
1453 return "";
1454 }
1455 return str;
1456}
1457
1459{
1460 LOGF(debug, "%s", __func__);
1461 if (fDecoderConfigFileName.length() == 0)
1462 fDecoderConfigFileName = string(getenv("VMCWORKDIR")) + "/config/bmnconf.json";
1463 pt::read_json(fDecoderConfigFileName, conf);
1464 fExportJsonBocks = conf.get<bool>("Decoder.ExportJson", false);
1465 fEvForPedestals = conf.get<Int_t>("Decoder.NEventsForPedestals", N_EV_FOR_PEDESTALS);
1466 fEvForNoiseCorr = conf.get<Int_t>("Decoder.NEventsForNoiseCorr", 20000);
1467 return kBMNSUCCESS;
1468}
1469
1470void* BmnDecoder::GetMapper(DetectorId id)
1471{
1472 switch (id) {
1473 case DetectorId::kBC:
1474 return fTrigMapper;
1475 case DetectorId::kCSC:
1476 return fCscMapper;
1477 case DetectorId::kFHCAL:
1478 return fFHCalMapper;
1479 case DetectorId::kGEM:
1480 return fGemMapper;
1481 case DetectorId::kHGND:
1482 return fHgndMapper;
1483 case DetectorId::kHODO:
1484 return fHodoMapper;
1485 case DetectorId::kNDET:
1486 return fNdetMapper;
1488 return fScWallMapper;
1490 return fSiliconMapper;
1491 case DetectorId::kSiBT:
1492 return fSiBTMapper;
1493 case DetectorId::kTOF1:
1494 return fTof400Mapper;
1496 return fTof701Mapper;
1497 case DetectorId::kVSP:
1498 return fVspMapper;
1499 default:
1500 LOGF(error, "Unsupported DetectorID");
1501 return nullptr;
1502 }
1503}
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
long Long_t
constexpr Bool_t kFALSE
double Double_t
long long Long64_t
constexpr Bool_t kTRUE
const char Option_t
#define gDirectory
char * Form(const char *fmt,...)
@ kBC
@ kSILICON
@ kNDET
@ kGEM
@ kVSP
@ kHGND
@ kTOF1
@ kFHCAL
@ kSCWALL
@ kCSC
@ kMWPC
@ kTOF701
@ kDCH
@ kECAL
@ kSiBT
@ kZDC
@ kHODO
BmnStatus
Define status code.
Definition BmnEnums.h:93
@ kBMNERROR
Error.
Definition BmnEnums.h:95
@ kBMNSUCCESS
Success.
Definition BmnEnums.h:94
@ kSRCSETUP
Definition BmnEnums.h:167
@ kBMNSETUP
Definition BmnEnums.h:166
@ kBMNPAYLOAD
spill event.
Definition BmnEnums.h:145
@ kBMNPEDESTAL
pedestal event.
Definition BmnEnums.h:144
#define ANSI_COLOR_RED
Definition BmnMath.h:16
#define ANSI_COLOR_RESET
Definition BmnMath.h:18
#define ANSI_COLOR_BLUE
Definition BmnMath.h:17
void InitMappers(std::function< void(TString, TObject *)> branch_reg_fun)
UInt_t fPeriodId
Definition BmnDecoder.h:301
bool fSaveCalibFile
Definition BmnDecoder.h:446
Int_t tai_utc_dif
Definition BmnDecoder.h:458
TString fTrigChannelMapFileName
Definition BmnDecoder.h:352
TString fDigiRunHdrName
Definition BmnDecoder.h:322
TClonesArray * t0_copy
Definition BmnDecoder.h:400
BmnStatus DecodeOffline()
bool fExportJsonBocks
Definition BmnDecoder.h:447
bool fPedEnough
Definition BmnDecoder.h:443
void Assignment_Fun(const TString name, BrType **ob, TTree *tree=nullptr)
Definition BmnDecoder.h:522
TTimeStamp fRunStartTime
Definition BmnDecoder.h:310
TClonesArray * msc_copy
Definition BmnDecoder.h:399
pt::ptree conf
Definition BmnDecoder.h:290
TTree * fDigiTree
Definition BmnDecoder.h:316
UInt_t fPedEvCntrBySpill
Definition BmnDecoder.h:438
TFile * fDigiFileOut
Definition BmnDecoder.h:359
TString GetSubNameAfterRunId(TString name)
TClonesArray * tdc_hgnd
Definition BmnDecoder.h:373
Int_t fVerbose
Definition BmnDecoder.h:459
TClonesArray * adc128
Definition BmnDecoder.h:366
TString fTof701StripMapFileName
Definition BmnDecoder.h:330
UInt_t fNoiseEvCntr
Definition BmnDecoder.h:440
BmnStatus FillTimeShiftsMap()
TString fVspMapFileName
Definition BmnDecoder.h:326
TString fSiliconMapFileName
Definition BmnDecoder.h:348
bool fUseCalibFile
Definition BmnDecoder.h:445
TString fCalibFileName
Definition BmnDecoder.h:321
BmnDchRaw2Digit * fDchMapper
Definition BmnDecoder.h:415
TString fZDCMapFileName
Definition BmnDecoder.h:333
TString fScWallCalibrationFileName
Definition BmnDecoder.h:336
TClonesArray * ecal
Definition BmnDecoder.h:396
UInt_t fEventId
Definition BmnDecoder.h:302
TString fTrigPlaceMapFileName
Definition BmnDecoder.h:351
TString fTof701PlaceMapFileName
Definition BmnDecoder.h:329
BmnStatus DecodeDataToDigiIterate()
void ConfigureStripMappers()
BmnGemRaw2Digit * fGemMapper
Definition BmnDecoder.h:411
TClonesArray * adc64
Definition BmnDecoder.h:365
Long64_t fT0SyncTime
Definition BmnDecoder.h:453
void CopyDataToPedMap(UInt_t ev)
TString fHgndCalibrationFileName
Definition BmnDecoder.h:344
BmnECALRaw2Digit * fECALMapper
Definition BmnDecoder.h:427
Int_t fTOF700ReferenceChamber
Definition BmnDecoder.h:298
DigiRunHeader * rawRunHeader
Definition BmnDecoder.h:375
BmnEventHeader * eventHeader
Definition BmnDecoder.h:403
TString fCscMapFileName
Definition BmnDecoder.h:350
BmnStatus GetT0Info(Double_t &t0time, Double_t &t0width)
BmnStatus SaveCalibFile(TString &FileName)
ULong_t fNTotalEvents
Definition BmnDecoder.h:303
TString fGemMapFileName
Definition BmnDecoder.h:325
Double_t fT0Width
Definition BmnDecoder.h:455
bool isTaskMode
Definition BmnDecoder.h:294
TClonesArray * tof701
Definition BmnDecoder.h:389
BmnAdcQA * fFsdQa
Definition BmnDecoder.h:430
TClonesArray * silicon
Definition BmnDecoder.h:382
BmnStatus LoadCalibFile(TString &FileName)
BmnMscRaw2Digit * fMSCMapper
Definition BmnDecoder.h:428
BmnTof701Raw2Digit * fTof701Mapper
Definition BmnDecoder.h:420
TString fDigiFileName
Definition BmnDecoder.h:320
void AssignInputs()
BmnHgndRaw2Digit * fHgndMapper
Definition BmnDecoder.h:426
TString fNdetCalibrationFileName
Definition BmnDecoder.h:342
void ClearSpillDigiArrays()
BmnSpillHeader * spillHeader
Definition BmnDecoder.h:404
UInt_t fSpillCntr
Definition BmnDecoder.h:292
TClonesArray * fhcal
Definition BmnDecoder.h:392
BmnFHCalRaw2Digit * fFHCalMapper
Definition BmnDecoder.h:423
TString fDchMapFileName
Definition BmnDecoder.h:323
UInt_t fT0Serial
Definition BmnDecoder.h:449
TClonesArray * dch
Definition BmnDecoder.h:397
map< uint32_t, uint32_t > _dfl_run_id
Definition BmnDecoder.h:461
BmnNdetRaw2Digit * fNdetMapper
Definition BmnDecoder.h:425
TString fScWallMapFileName
Definition BmnDecoder.h:335
TClonesArray * scwall
Definition BmnDecoder.h:391
TClonesArray * tdc
Definition BmnDecoder.h:370
UInt_t fEvForPedestals
Definition BmnDecoder.h:441
Long64_t fMaxEvent
Definition BmnDecoder.h:408
bool fApplyThreshold
Definition BmnDecoder.h:293
TClonesArray * sibt
Definition BmnDecoder.h:383
UInt_t fRunId
Definition BmnDecoder.h:300
TString fRawRunHdrName
Definition BmnDecoder.h:354
TString fTof400PlaceMapFileName
Definition BmnDecoder.h:327
TClonesArray * gem
Definition BmnDecoder.h:384
TClonesArray * csc
Definition BmnDecoder.h:385
void FillProfiles()
TClonesArray * adc32
Definition BmnDecoder.h:364
TClonesArray * vsp_raw
Definition BmnDecoder.h:368
UInt_t fStartEventId
Definition BmnDecoder.h:305
BmnSiBTRaw2Digit * fSiBTMapper
Definition BmnDecoder.h:414
Int_t fTOF700ReferenceRun
Definition BmnDecoder.h:297
TClonesArray * mwpc
Definition BmnDecoder.h:398
BmnStatus LoadConfig()
TClonesArray * ndet
Definition BmnDecoder.h:394
Double_t fT0Time
Definition BmnDecoder.h:454
Long64_t NRawTreeEvents
Definition BmnDecoder.h:406
BmnEventHeader * eventHeaderDAQ
Definition BmnDecoder.h:374
bool isSpillStart
Definition BmnDecoder.h:291
void * GetMapper(DetectorId id)
TFile * fRootFileIn
Definition BmnDecoder.h:357
TString fMSCMapFileName
Definition BmnDecoder.h:347
TClonesArray * hgnd
Definition BmnDecoder.h:395
TString fRootFileName
Definition BmnDecoder.h:319
TString fTof700MapFileName
Definition BmnDecoder.h:331
TFile * fRootFileOut
Definition BmnDecoder.h:358
std::map< DetectorId, bool > fDetectorSetup
Definition BmnDecoder.h:289
TString fHodoCalibrationFileName
Definition BmnDecoder.h:340
unordered_map< UInt_t, Long64_t > fTimeShifts
Definition BmnDecoder.h:452
BmnEventType fCurEventType
Definition BmnDecoder.h:435
BmnStatus DecodeDataToDigi()
BmnEventType fPrevEventType
Definition BmnDecoder.h:436
virtual ~BmnDecoder()
Int_t GetRunIdFromFile(TString name)
string fDecoderConfigFileName
Definition BmnDecoder.h:318
BmnStatus PreInitOffline()
ULong_t fNSignalEvents
Definition BmnDecoder.h:304
void SaveAdcQa()
void FillNoisyChannels()
TString fZDCCalibrationFileName
Definition BmnDecoder.h:334
InitStatus ReInit()
TClonesArray * tof700
Definition BmnDecoder.h:388
TString fFHCalMapFileName
Definition BmnDecoder.h:337
TString fHgndMapFileName
Definition BmnDecoder.h:343
TString fMetadataName
Definition BmnDecoder.h:355
BmnAdcQA * fCscQa
Definition BmnDecoder.h:432
TString fMwpcMapFileName
Definition BmnDecoder.h:324
TTree * fRawTree
Definition BmnDecoder.h:313
Long64_t NRawTreeSpills
Definition BmnDecoder.h:407
TClonesArray * vsp
Definition BmnDecoder.h:386
UInt_t nSpillEvents
Definition BmnDecoder.h:434
BmnSiliconRaw2Digit * fSiliconMapper
Definition BmnDecoder.h:413
TClonesArray * t0raw
Definition BmnDecoder.h:379
TClonesArray * sync
Definition BmnDecoder.h:363
BmnTof1Raw2Digit * fTof400Mapper
Definition BmnDecoder.h:418
void ClearDigiArrays()
void FillAdcQa()
TClonesArray * adc
Definition BmnDecoder.h:367
UInt_t fEvForNoiseCorr
Definition BmnDecoder.h:442
void Register_Fun(const TString name, BrType **ob)
Definition BmnDecoder.h:544
TTimeStamp fRunEndTime
Definition BmnDecoder.h:311
TTree * fDigiTreeSpills
Definition BmnDecoder.h:317
TClonesArray * tof400
Definition BmnDecoder.h:387
void Exec(Option_t *opt)
Long64_t fTime_s
Definition BmnDecoder.h:307
BmnVspRaw2Digit * fVspMapper
Definition BmnDecoder.h:412
BmnDecoder(TString file="", TString outfile="", ULong_t nEvents=0, ULong_t period=8)
const TTimeStamp TimeZero
Definition BmnDecoder.h:283
void RecalculatePedestals()
BmnStatus Finalize()
BmnMetadataRaw * metadata
Definition BmnDecoder.h:376
TFile * fCalibFile
Definition BmnDecoder.h:360
TString fFHCalCalibrationFileName
Definition BmnDecoder.h:338
TClonesArray * tqdc_adc
Definition BmnDecoder.h:372
TString fECALCalibrationFileName
Definition BmnDecoder.h:346
TString fTof400StripMapFileName
Definition BmnDecoder.h:328
bool fNoiseEnough
Definition BmnDecoder.h:444
BmnStatus InitDecoder()
TTree * fRawTreeSpills
Definition BmnDecoder.h:314
TClonesArray * hodo
Definition BmnDecoder.h:393
BmnCscRaw2Digit * fCscMapper
Definition BmnDecoder.h:410
bool fSaveOutput
Definition BmnDecoder.h:448
BmnZDCRaw2Digit * fZDCMapper
Definition BmnDecoder.h:421
BmnHodoRaw2Digit * fHodoMapper
Definition BmnDecoder.h:424
TString fNdetMapFileName
Definition BmnDecoder.h:341
TClonesArray * msc
Definition BmnDecoder.h:378
BmnScWallRaw2Digit * fScWallMapper
Definition BmnDecoder.h:422
TClonesArray * zdc
Definition BmnDecoder.h:390
BmnSetup fBmnSetup
Definition BmnDecoder.h:437
BmnTrigRaw2Digit * fTrigMapper
Definition BmnDecoder.h:417
TString fSiBTMapFileName
Definition BmnDecoder.h:349
BmnAdcQA * fGemQa
Definition BmnDecoder.h:431
InitStatus Init()
Long64_t fTime_ns
Definition BmnDecoder.h:308
bool isForwardMode
Definition BmnDecoder.h:295
TString fHodoMapFileName
Definition BmnDecoder.h:339
UInt_t fPedEvCntr
Definition BmnDecoder.h:439
TClonesArray * tqdc_tdc
Definition BmnDecoder.h:371
TClonesArray * hrb
Definition BmnDecoder.h:369
TString fTof700GeomFileName
Definition BmnDecoder.h:332
BmnMwpcRaw2Digit * fMwpcMapper
Definition BmnDecoder.h:416
TString fECALMapFileName
Definition BmnDecoder.h:345
static std::string TimePoint2String(SysPoint p)
Class BmnMetadataRaw for the configuration and raw spill information.
static double correctionSil
static double threshSil
UInt_t GetSerial() const
Long64_t GetTime_sec() const
Long64_t GetTime_ns() const
T0 module spill settings and counts.
Definition BmnT0Raw.h:70
SysPoint GetTime()
Definition BmnT0Raw.h:92
Double_t GetAmp() const
Double_t GetTime() const
Short_t GetMod() const
void SetTrigConfig(BmnTrigConfig tc)
NameChMap & GetTrcBitMap()
TRC bit map.
Name2SerCh & GetScalerMap()
MSC bit map.
T0ChMap & T0Map()
Ref to the T0 map.
void SetSpillMap(map< SysPoint, BmnSpillInfo > v)
static TClass * GetClass(Bool_t load=kTRUE, Bool_t silent=kFALSE)
static TClass * Class()
const char * GetName() const override
Bool_t MatchB(const TString &s, const TString &mods="", Int_t start=0, Int_t nMaxMatch=10)
Int_t Substitute(TString &s, const TString &replace, const TString &mods="", Int_t start=0, Int_t nMatchMax=10)
Int_t Atoi() const
static constexpr Ssiz_t kNPOS
const char * Data() const
Double_t AsDouble() const
const char * AsString(const Option_t *option="") const
virtual Int_t GetEntry(Long64_t entry, Int_t getall=0)
virtual Long64_t GetEntriesFast() const
Int_t SetBranchAddress(const char *bname, T **add, TBranch **ptr=nullptr)
#define N_EV_FOR_PEDESTALS
#define UNKNOWN_RUNID
Definition BmnDecoder.h:49
#define PRINT_DETECTOR_TIMERS(DetMapper)
Definition BmnDecoder.h:473
#define FILL_DETECTOR(DetMapper,...)
Definition BmnDecoder.h:477
Double_t Min(Double_t a, Double_t b)