13#include <FairRootManager.h>
14#include <FairRunOnline.h>
18#include <TClonesArray.h>
23#include <THttpServer.h>
24#include <TStopwatch.h>
83 fpAlgo->SetSeedTimeWindow(0.0, dDeadT < dWindDur ? dDeadT : dWindDur);
88 if (bFlagIn == kTRUE) {
90 std::cout <<
"SetSeedFinderQa(): Cannot activate Qa when seed finder not active. Exiting." << std::endl;
112 LOG(info) <<
"No " << detName <<
" digi input.";
115 LOG(info) << detName <<
" digi input.";
116 *vDigi =
new std::vector<TDigi>;
131 FairRootManager* ioman = FairRootManager::Instance();
157 if (
fbUseMuchBeamtimeDigi) LOG(fatal) <<
"DigiEvent output branch not compatible with MuchBeamtimeDigi";
160 ioman->RegisterAny(
"DigiEvent",
fDigiEvents, kTRUE);
161 if (!
fDigiEvents) LOG(fatal) <<
"Output branch was not created";
162 LOG(info) <<
"DigiEvent out instead of CbmEvent, you will need an instance of CbmTaskMakeRecoEvents in reco macro";
164 LOG(info) <<
"Exclusive TRD extraction, DigiEvents will be comparable to CbmEvents but slower";
167 LOG(info) <<
"Inclusive TRD extraction, faster but DigiEvents will noy be comparable to CbmEvents (extra digis)";
171 fEvents =
new TClonesArray(
"CbmEvent", 100);
172 ioman->Register(
"CbmEvent",
"Cbm_Event",
fEvents, IsOutputBranchPersistent(
"CbmEvent"));
173 if (!
fEvents) LOG(fatal) <<
"Output branch was not created";
174 LOG(info) <<
"CbmEvent oupput, you will need an instance of CbmTaskEventsCloneInToOut in reco macro to update them";
178 fpAlgo->SetTimeSliceMetaDataArray(
dynamic_cast<TClonesArray*
>(ioman->GetObject(
"TimesliceMetaData")));
182 Double_t rtime =
fTimer->RealTime();
183 Double_t ctime =
fTimer->CpuTime();
184 LOG(info) <<
"CbmTaskBuildRawEvents::Init(): Real time " << rtime <<
" s, CPU time " << ctime <<
" s";
193 if (kTRUE ==
fpAlgo->InitAlgo())
217 for (
Int_t i = 0; i < nDigis; i++) {
218 const TDigi* Digi =
fDigiMan->Get<TDigi>(i);
219 vDigis->push_back(*Digi);
221 LOG(debug) <<
"Read: " << vDigis->size() <<
" " << detName <<
" digis.";
222 LOG(debug) <<
"In DigiManager: " << nDigis <<
" " << detName <<
" digis.";
237 LOG(debug2) <<
"CbmTaskBuildRawEvents::Exec => Starting sequence";
247 std::stringstream logOut;
248 logOut << std::setw(20) << std::left << GetName() <<
" [";
249 logOut << std::fixed << std::setw(8) << std::setprecision(1) << std::right << timer.RealTime() * 1000. <<
" ms] ";
250 logOut <<
"TS " <<
fNofTs;
256 logOut <<
", events " <<
fEvents->GetEntriesFast();
259 LOG(info) << logOut.str();
262 LOG(info) << seedCount <<
" trigger(s) for this TS.";
266 fTime += timer.RealTime();
268 LOG(debug2) <<
"CbmTaskBuildRawEvents::Exec => Done";
310 std::vector<CbmMatch>* vDigiMatch)
312 std::map<ECbmModuleId, UInt_t> DigiNumbers;
313 std::map<ECbmModuleId, UInt_t> DigiCounters;
314 vdSeedTimes->clear();
316 if (vDigiMatch !=
nullptr) vDigiMatch->clear();
319 DigiNumbers[system.detId] =
GetNofDigis(system.detId);
320 DigiCounters[system.detId] = 0;
325 Double_t earliestTime = -1;
328 if (DigiCounters[system.detId] < DigiNumbers[system.detId]) {
330 Double_t thisTime =
GetDigiTime(system.detId, DigiCounters[system.detId]);
331 if (thisTime < earliestTime || earliestTime == -1) {
332 nextAddedSystem = system.detId;
333 earliestTime = thisTime;
337 if (earliestTime != -1) {
339 if (vDigiMatch !=
nullptr) {
340 const CbmMatch* digiMatch =
fDigiMan->GetMatch(nextAddedSystem, DigiCounters[nextAddedSystem]);
341 vDigiMatch->push_back(*digiMatch);
343 vdSeedTimes->push_back(earliestTime);
344 DigiCounters[nextAddedSystem]++;
360 std::cout <<
"FillSeedTimesFromSlidingWindow(): Error, seed detector list empty." << std::endl;
381 std::cout <<
"FillSeedTimesFromSlidingWindow(): Error, QA set but no CbmMatch found for seed detector."
392 switch (seedDet->
detId) {
460 LOG(fatal) <<
"Trying to print timings but timer not set";
463 Double_t rtime =
fTimer->RealTime();
464 Double_t ctime =
fTimer->CpuTime();
465 LOG(info) <<
"CbmTaskBuildRawEvents: Real time " << rtime <<
" s, CPU time " << ctime <<
" s";
468 LOG(fatal) <<
"Trying to print timings but timer not set";
473 LOG(info) <<
"CbmTaskBuildRawEvents (digi copy only): Real time " << rtime <<
" s, CPU time " << ctime <<
" s";
492 std::cout << std::endl;
493 LOG(info) <<
"=====================================";
494 LOG(info) << GetName() <<
": Run summary";
495 LOG(info) <<
"Time slices : " <<
fNofTs;
500 LOG(info) <<
"Time / TS : " << std::fixed << std::setprecision(2) << 1000. *
fTime / Double_t(
fNofTs)
502 LOG(info) <<
"=====================================";
508 std::vector<CbmEvent*> vEvents =
fpAlgo->GetEventVector();
523 LOG(debug) <<
"Vector: " <<
event->ToString();
524 new ((*fEvents)[
fEvents->GetEntriesFast()])
CbmEvent(std::move(*event));
529 fpAlgo->ClearEventVector();
535 if (!FairRootManager::Instance() || !FairRootManager::Instance()->GetSink()) {
536 LOG(error) <<
"No sink found";
539 FairSink* sink = FairRootManager::Instance()->GetSink();
540 sink->WriteObject(
dynamic_cast<TObject*
>(
fpAlgo->GetOutFolder()),
nullptr);
545 std::vector<std::pair<TNamed*, std::string>> vHistos =
fpAlgo->GetHistoVector();
548 TDirectory* oldDir = NULL;
549 TFile* histoFile = NULL;
557 for (UInt_t uHisto = 0; uHisto < vHistos.size(); ++uHisto) {
559 const TString sFolder = vHistos[uHisto].second.data();
560 if (
nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
561 gDirectory->cd(sFolder);
564 vHistos[uHisto].first->Write();
569 std::vector<std::pair<TCanvas*, std::string>> vCanvases =
fpAlgo->GetCanvasVector();
572 for (UInt_t uCanvas = 0; uCanvas < vCanvases.size(); ++uCanvas) {
574 TString sFolder = vCanvases[uCanvas].second.data();
575 if (
nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
576 gDirectory->cd(sFolder);
579 vCanvases[uCanvas].first->Write();
592 std::ofstream timesUnsorted(
"digiTimesUnsorted.dat", std::ofstream::out);
593 timesUnsorted << std::setprecision(16);
596 for (UInt_t i = 0; i <
GetNofDigis(system.detId); i++) {
597 timesUnsorted <<
GetDigiTime(system.detId, i) << std::endl;
600 timesUnsorted.close();
601 LOG(info) <<
"Completed write of unsorted digi list.";
603 std::ofstream timesSorted(
"digiTimesSorted.dat", std::ofstream::out);
604 timesSorted << std::setprecision(16);
606 for (UInt_t i = 0; i <
fSeedTimes->size(); i++) {
607 timesSorted <<
fSeedTimes->at(i) << std::endl;
610 LOG(info) <<
"Completed DumpSeedTimesFromDetList(). Closing.";
617 LOG(debug) <<
"In Vector size: " << vEvents.size();
622 selEvent.
fTime =
event->GetStartTime();
623 selEvent.
fNumber =
event->GetNumber();
627 event->SortIndices();
663 for (uint32_t uDigiInEvt = 0; uDigiInEvt < uNbDigis; ++uDigiInEvt) {
ClassImp(CbmConverterManager)
ECbmModuleId
Enumerator for module Identifiers.
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kPsd
Projectile spectator detector.
@ kSts
Silicon Tracking System.
@ kMuch
Muon detection system.
@ kFsd
Forward spectator detector.
@ kRich
Ring-Imaging Cherenkov Detector.
Class for sliding window seed finder.
std::vector< CbmBmonDigi > fDigis
Data vector.
CbmPsdDigiData fPsd
PSD data.
CbmTrdDigiData fTrd
TRD data.
CbmTofDigiData fTof
TOF data.
CbmStsDigiData fSts
STS data.
CbmRichDigiData fRich
RICH data.
CbmMuchDigiData fMuch
MUCH data.
CbmBmonDigiData fBmon
Beam monitor data.
Collection of digis from all detector systems within one event.
double fTime
Event trigger time [ns].
CbmDigiData fData
Event data.
uint64_t fNumber
Event identifier.
static CbmDigiManager * Instance()
Static instance.
Class characterising one event by a collection of links (indices) to data objects,...
std::string ToString() const
static TString GetModuleNameCaps(ECbmModuleId moduleId)
std::vector< CbmMuchDigi > fDigis
Data vector.
std::vector< CbmPsdDigi > fDigis
Data vector.
std::vector< CbmRichDigi > fDigis
Data vector.
std::vector< CbmStsDigi > fDigis
Data vector.
Bool_t fbExclusiveTrdExtraction
Bool_t fbUseMuchBeamtimeDigi
void SetSeedFinderQa(Bool_t bFlagIn=kTRUE)
CbmAlgoBuildRawEvents * fpAlgo
timing only for filling of std::vector<Digi> fields
void SetSlidingWindowSeedFinder(int32_t minDigis, double dWindDur, double dDeadT, double dOffset=0.0)
UInt_t GetNofDigis(ECbmModuleId _system)
CbmDigiManager * fDigiMan
void ReadDigis(ECbmModuleId detId, std::vector< TDigi > *vDigis)
virtual InitStatus Init()
std::vector< CbmMuchBeamTimeDigi > * fMuchBeamTimeDigis
std::vector< CbmStsDigi > * fStsDigis
void FillSeedTimesFromSlidingWindow()
std::vector< CbmDigiEvent > * fDigiEvents
output container of CbmEvents
std::vector< CbmPsdDigi > * fPsdDigis
TStopwatch * fCopyTimer
is created when fbGetTimings is set before init
std::vector< Double_t > * fTempDigiTimes
Bool_t fbWriteHistosToFairSink
Switch ON/OFF filling of histograms.
TString fsOutFileName
Measure CPU time using stopwatch.
std::vector< CbmTrdDigi > * fTrdDigis
TClonesArray * fEvents
Enable/disabled loop based extraction of TRD digis due to 1D/2D.
std::vector< CbmTofDigi > * fTofDigis
CbmSeedFinderSlidingWindow * fSeedFinderSlidingWindow
Switch between MUCH digi classes.
std::vector< CbmMatch > * fvDigiMatchQa
std::vector< Double_t > * fSeedTimes
void ExtractSelectedData(std::vector< CbmEvent * > vEvents)
output container of CbmEvents
Bool_t fbGetTimings
Write histos to FairRootManager instead of separate file.
void InitDigis(ECbmModuleId detId, std::vector< TDigi > **vDigi)
virtual InitStatus ReInit()
std::vector< CbmMuchDigi > * fMuchDigis
virtual void Exec(Option_t *)
std::vector< RawEventBuilderDetector > fSeedTimeDetList
void AddSeedTimeFillerToList(RawEventBuilderDetector seedDet)
void SetIdealSeedFinder(const int32_t fileId=-1)
std::vector< CbmRichDigi > * fRichDigis
void DumpSeedTimesFromDetList()
Double_t GetDigiTime(ECbmModuleId _system, UInt_t _entry)
void FillSeedTimesFromDetList(std::vector< Double_t > *vdSeedTimes, std::vector< CbmMatch > *vDigiMatch=nullptr)
std::vector< CbmBmonDigi > * fBmonDigis
std::vector< CbmFsdDigi > * fFsdDigis
std::vector< CbmTofDigi > fDigis
Data vector.
std::vector< CbmTrdDigi > fDigis
Data vector.
ECbmModuleId detId
Settings.