diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx index c2d7484e910829f7092909646054f906c7046f00..6e1ca1adae7e17b3407c44500c7214c699f9af5c 100644 --- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx +++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx @@ -210,6 +210,7 @@ void CbmAlgoBuildRawEvents::BuildEvents() } break; } + case ECbmModuleId::kTrd2d: // Same data storage as trd 1d case ECbmModuleId::kTrd: { LoopOnSeeds<CbmTrdDigi>(); break; @@ -387,6 +388,7 @@ void CbmAlgoBuildRawEvents::SearchMatches(Double_t dSeedTime, RawEventBuilderDet } break; } + case ECbmModuleId::kTrd2d: // Same data storage as trd 1d case ECbmModuleId::kTrd: { SearchMatches<CbmTrdDigi>(dSeedTime, detMatch); break; @@ -456,8 +458,22 @@ void CbmAlgoBuildRawEvents::SearchMatches(Double_t dSeedTime, RawEventBuilderDet for (UInt_t uDigi = detMatch.fuStartIndex; uDigi < uNbSelDigis; ++uDigi) { const DigiCheck* pDigi = GetDigi<DigiCheck>(uDigi); + // Filter TRD2D digis if 1D and reverse + if (detMatch.detId == ECbmModuleId::kTrd) { + const CbmTrdDigi* pTrdDigi = GetDigi<CbmTrdDigi>(uDigi); + if (pTrdDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) { // + continue; + } + } + else if (detMatch.detId == ECbmModuleId::kTrd2d) { + const CbmTrdDigi* pTrdDigi = GetDigi<CbmTrdDigi>(uDigi); + if (pTrdDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) { // + continue; + } + } + // filter T0 digis from Tof (remove this line if T0 properly implemented) - if (detMatch.detId == ECbmModuleId::kTof && pDigi->GetAddress() == fuT0Address) { continue; } + //if (detMatch.detId == ECbmModuleId::kTof && pDigi->GetAddress() == fuT0Address) { continue; } const Double_t dTime = pDigi->GetTime(); const Double_t dTimeDiff = dTime - dSeedTime; @@ -583,6 +599,7 @@ bool CbmAlgoBuildRawEvents::CheckDataAvailable(ECbmModuleId detId) return fMuchDigis != nullptr; } } + case ECbmModuleId::kTrd2d: // Same data storage as trd 1d case ECbmModuleId::kTrd: { return fTrdDigis != nullptr; } @@ -618,6 +635,7 @@ UInt_t CbmAlgoBuildRawEvents::GetNofDigis(ECbmModuleId detId) return fMuchDigis->size(); } } + case ECbmModuleId::kTrd2d: // Same data storage as trd 1d case ECbmModuleId::kTrd: { return fTrdDigis->size(); } @@ -696,33 +714,57 @@ void CbmAlgoBuildRawEvents::CreateHistograms() fhNbDigiPerEvtTime = new TH2I("hNbDigiPerEvtTime", "nb of all digis per event vs seed time of the events; Seed time " "[s]; Nb Digis []; Events []", - 1000, 0, 0.1, 5000, 0, 5000); + 1000, 0, 0.2, 5000, 0, 5000); // fhNbDigiPerEvtTime->SetCanExtend(TH2::kAllAxes); // Breaks he MQ histogram server as cannot be merged! + AddHistoToVector(fhEventTime, "evtbuild"); + AddHistoToVector(fhEventDt, "evtbuild"); + AddHistoToVector(fhEventSize, "evtbuild"); + AddHistoToVector(fhNbDigiPerEvtTime, "evtbuild"); + outFolder->Add(fhEventTime); + outFolder->Add(fhEventDt); + outFolder->Add(fhEventSize); + outFolder->Add(fhNbDigiPerEvtTime); + /// Loop on selection detectors for (std::vector<RawEventBuilderDetector>::iterator det = fvDets.begin(); det != fvDets.end(); ++det) { /// In case name not provided, do not create the histo to avoid name conflicts! if ("Invalid" == (*det).sName) { fvhNbDigiPerEvtTimeDet.push_back(nullptr); + fvhNbDigiPerEvtDet.push_back(nullptr); continue; } TH2I* hNbDigiPerEvtTimeDet = new TH2I(Form("hNbDigiPerEvtTime%s", (*det).sName.data()), Form("nb of %s digis per event vs seed time of the events; Seed time in TS " "[s]; Nb Digis []; Events []", (*det).sName.data()), - 1000, 0, 0.1, 5000, 0, 5000); + 1000, 0, 0.2, 5000, 0, 5000); // hNbDigiPerEvtTimeDet->SetCanExtend(TH2::kAllAxes); // Breaks he MQ histogram server as cannot be merged! fvhNbDigiPerEvtTimeDet.push_back(hNbDigiPerEvtTimeDet); + + TH1I* hNbDigiPerEvtDet = + new TH1I(Form("hNbDigiPerEvt%s", (*det).sName.data()), + Form("nb of %s digis per event; Nb Digis []", (*det).sName.data()), 10000, 0, 10000); + fvhNbDigiPerEvtDet.push_back(hNbDigiPerEvtDet); + + TH1I* hTDiff = + new TH1I(Form("hTDiff%s", (*det).sName.data()), + Form("#DeltaT of %s digis to seed time of event;#DeltaT (ns); Counts []", (*det).sName.data()), 200, + (*det).fdTimeWinBeg, (*det).fdTimeWinEnd); + fvhTDiff.push_back(hTDiff); } - AddHistoToVector(fhEventTime, "evtbuild"); - AddHistoToVector(fhEventDt, "evtbuild"); - AddHistoToVector(fhEventSize, "evtbuild"); - AddHistoToVector(fhNbDigiPerEvtTime, "evtbuild"); - outFolder->Add(fhEventTime); - outFolder->Add(fhEventDt); - outFolder->Add(fhEventSize); - outFolder->Add(fhNbDigiPerEvtTime); + /// Same plots for the reference detector + TH1I* hNbDigiPerEvtDet = + new TH1I(Form("hNbDigiPerEvt%s", fRefDet.sName.data()), + Form("nb of %s digis per event; Nb Digis []", fRefDet.sName.data()), 10000, 0, 10000); + fvhNbDigiPerEvtDet.push_back(hNbDigiPerEvtDet); + + TH1I* hTDiff = + new TH1I(Form("hTDiff%s", fRefDet.sName.data()), + Form("#DeltaT of %s digis to seed time of event;#DeltaT (ns); Counts []", fRefDet.sName.data()), 200, + fRefDet.fdTimeWinBeg, fRefDet.fdTimeWinEnd); // FIXME, adjust to configured window + fvhTDiff.push_back(hTDiff); for (std::vector<TH2*>::iterator itHist = fvhNbDigiPerEvtTimeDet.begin(); itHist != fvhNbDigiPerEvtTimeDet.end(); ++itHist) { @@ -731,6 +773,94 @@ void CbmAlgoBuildRawEvents::CreateHistograms() outFolder->Add((*itHist)); } } + + for (std::vector<TH1*>::iterator itHist = fvhNbDigiPerEvtDet.begin(); itHist != fvhNbDigiPerEvtDet.end(); ++itHist) { + if (nullptr != (*itHist)) { + AddHistoToVector((*itHist), "evtbuild"); + outFolder->Add((*itHist)); + } + } + for (std::vector<TH1*>::iterator itHist = fvhTDiff.begin(); itHist != fvhTDiff.end(); ++itHist) { + if (nullptr != (*itHist)) { + AddHistoToVector((*itHist), "evtbuild"); + outFolder->Add((*itHist)); + } + } + + /// Canvases creation + // std::vector<std::pair<TCanvas*, std::string>> vCanvases = {}; + + Double_t w = 10; + Double_t h = 10; + TCanvas* fcSummary = new TCanvas("cEvBSummary", "EvB monitoring plots", w, h); + fcSummary->Divide(2, 2); + + fcSummary->cd(1); + gPad->SetGridx(); + gPad->SetGridy(); + fhEventTime->Draw("hist"); + + fcSummary->cd(2); + gPad->SetGridx(); + gPad->SetGridy(); + gPad->SetLogx(); + gPad->SetLogy(); + fhEventDt->Draw("hist"); + + fcSummary->cd(3); + gPad->SetGridx(); + gPad->SetGridy(); + gPad->SetLogy(); + fhEventSize->Draw("hist"); + + fcSummary->cd(4); + gPad->SetGridx(); + gPad->SetGridy(); + fhNbDigiPerEvtTime->Draw("colz"); + + + /// Add canvas pointers to the canvas vector + AddCanvasToVector(fcSummary, "canvases"); + + // ------------------------ // + TCanvas* fcNbDigi = new TCanvas("cEvBNbDigi", "EvB NbDigi evolution ", w, h); + if (fvhNbDigiPerEvtDet.size() <= 6) { // + fcNbDigi->Divide(2, 3); + } + else { // + fcNbDigi->Divide(3, 3); + } + int iPad = 1; + for (std::vector<TH1*>::iterator itHist = fvhNbDigiPerEvtDet.begin(); itHist != fvhNbDigiPerEvtDet.end(); ++itHist) { + if (nullptr != (*itHist)) { + fcNbDigi->cd(iPad++); + gPad->SetGridx(); + gPad->SetGridy(); + gPad->SetLogy(); + (*itHist)->Draw(); //"colz"); + } + } + AddCanvasToVector(fcNbDigi, "canvases"); + + // ------------------------ // + TCanvas* fcTdif = new TCanvas("cEvBTdif", "EvB Time Difference plots", w, h); + if (fvhNbDigiPerEvtDet.size() <= 6) { // + fcTdif->Divide(2, 3); + } + else { // + fcTdif->Divide(3, 3); + } + iPad = 1; + for (std::vector<TH1*>::iterator itHist = fvhTDiff.begin(); itHist != fvhTDiff.end(); ++itHist) { + if (nullptr != (*itHist)) { + fcTdif->cd(iPad++); + gPad->SetGridx(); + gPad->SetGridy(); + gPad->SetLogy(); + (*itHist)->Draw(); + } + } + AddCanvasToVector(fcTdif, "canvases"); } void CbmAlgoBuildRawEvents::FillHistos() @@ -744,9 +874,165 @@ void CbmAlgoBuildRawEvents::FillHistos() fhNbDigiPerEvtTime->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData()); /// Loop on selection detectors + uint32_t uNbDataTrd1d = 0; + uint32_t uNbDataTrd2d = 0; + for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) { + if (nullptr == fvhNbDigiPerEvtDet[uDetIdx]) continue; + + fvhNbDigiPerEvtDet[uDetIdx]->Fill(TMath::Max(0, evt->GetNofData(fvDets[uDetIdx].dataType))); + if (nullptr == fvhTDiff[uDetIdx]) continue; + for (int idigi = 0; idigi < evt->GetNofData(fvDets[uDetIdx].dataType); ++idigi) { + double dTimeDiff = 1.E30; + uint idx = evt->GetIndex(fvDets[uDetIdx].dataType, idigi); + switch (fvDets[uDetIdx].dataType) { + case ECbmDataType::kT0Digi: { + if (fT0DigiVec->size() <= idx) continue; + dTimeDiff = fT0DigiVec->at(idx).GetTime() - evt->GetStartTime(); + break; + } + case ECbmDataType::kStsDigi: { + auto pDigi = GetDigi<CbmStsDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + break; + } + case ECbmDataType::kMuchDigi: { + if (fbUseMuchBeamtimeDigi) { + auto pDigi = GetDigi<CbmMuchBeamTimeDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + } + else { + auto pDigi = GetDigi<CbmMuchDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + } + break; + } + case ECbmDataType::kTofDigi: { + auto pDigi = GetDigi<CbmTofDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + break; + } + case ECbmDataType::kTrdDigi: { + auto pDigi = GetDigi<CbmTrdDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) { + if (fvDets[uDetIdx].sName == "kTrd2D") continue; + ++uNbDataTrd1d; + } + else if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) { + if (fvDets[uDetIdx].sName == "kTrd") continue; + ++uNbDataTrd2d; + } + break; + } + case ECbmDataType::kRichDigi: { + auto pDigi = GetDigi<CbmRichDigi>(idx); // FIXME, need to find the proper digi template + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + break; + } + case ECbmDataType::kPsdDigi: { + auto pDigi = GetDigi<CbmPsdDigi>(idx); // FIXME, need to find the proper digi template + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + break; + } + default: LOG(error) << "Unkown dataType " << fvDets[uDetIdx].dataType; + } + + if (dTimeDiff < 1.E30) fvhTDiff[uDetIdx]->Fill(dTimeDiff); + } + } + /// Reference detector + uint32_t uRefDetIdx = fvDets.size(); + if (nullptr != fvhNbDigiPerEvtDet[uRefDetIdx]) { + + fvhNbDigiPerEvtDet[uRefDetIdx]->Fill(TMath::Max(0, evt->GetNofData(fRefDet.dataType))); + if (nullptr == fvhTDiff[uRefDetIdx]) continue; + for (int idigi = 0; idigi < evt->GetNofData(fRefDet.dataType); ++idigi) { + double dTimeDiff = 1.E30; + uint idx = evt->GetIndex(fRefDet.dataType, idigi); + switch (fRefDet.dataType) { + case ECbmDataType::kT0Digi: { + if (fT0DigiVec->size() <= idx) continue; + dTimeDiff = fT0DigiVec->at(idx).GetTime() - evt->GetStartTime(); + break; + } + case ECbmDataType::kStsDigi: { + auto pDigi = GetDigi<CbmStsDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + break; + } + case ECbmDataType::kMuchDigi: { + if (fbUseMuchBeamtimeDigi) { + auto pDigi = GetDigi<CbmMuchBeamTimeDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + } + else { + auto pDigi = GetDigi<CbmMuchDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + } + break; + } + case ECbmDataType::kTofDigi: { + auto pDigi = GetDigi<CbmTofDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + break; + } + case ECbmDataType::kTrdDigi: { + auto pDigi = GetDigi<CbmTrdDigi>(idx); + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kSPADIC) { + if (fRefDet.sName == "kTrd2D") continue; + ++uNbDataTrd1d; + } + else if (pDigi->GetType() == CbmTrdDigi::eCbmTrdAsicType::kFASP) { + if (fRefDet.sName == "kTrd") continue; + ++uNbDataTrd2d; + } + break; + } + case ECbmDataType::kRichDigi: { + auto pDigi = GetDigi<CbmRichDigi>(idx); // FIXME, need to find the proper digi template + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + break; + } + case ECbmDataType::kPsdDigi: { + auto pDigi = GetDigi<CbmPsdDigi>(idx); // FIXME, need to find the proper digi template + if (nullptr == pDigi) continue; + dTimeDiff = pDigi->GetTime() - evt->GetStartTime(); + break; + } + default: LOG(error) << "Unkown dataType " << fRefDet.dataType; + } + + if (dTimeDiff < 1.E30) fvhTDiff[uRefDetIdx]->Fill(dTimeDiff); + } + } + + /// Re-Loop on selection detectors due to detectors with same data type for (UInt_t uDetIdx = 0; uDetIdx < fvDets.size(); ++uDetIdx) { if (nullptr == fvhNbDigiPerEvtTimeDet[uDetIdx]) continue; - fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(fvDets[uDetIdx].dataType)); + + if (fvDets[uDetIdx].sName == "kTrd") { + fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd1d); + } + else if (fvDets[uDetIdx].sName == "kTrd2D") { + fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, uNbDataTrd2d); + } + else { + fvhNbDigiPerEvtTimeDet[uDetIdx]->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(fvDets[uDetIdx].dataType)); + } } dPreEvtTime = evt->GetStartTime(); } @@ -764,6 +1050,14 @@ void CbmAlgoBuildRawEvents::ResetHistograms(Bool_t /*bResetTime*/) ++itHist) { (*itHist)->Reset(); } + + for (std::vector<TH1*>::iterator itHist = fvhNbDigiPerEvtDet.begin(); itHist != fvhNbDigiPerEvtDet.end(); ++itHist) { + (*itHist)->Reset(); + } + + for (std::vector<TH1*>::iterator itHist = fvhTDiff.begin(); itHist != fvhTDiff.end(); ++itHist) { + (*itHist)->Reset(); + } /* if( kTRUE == bResetTime ) { diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h index a4cd0b5099807c96924bc92abbcd39042a8618e2..cd9892df6711ef1f74985e8279f152e115728e60 100644 --- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h +++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h @@ -94,6 +94,8 @@ static const RawEventBuilderDetector kRawEventBuilderDetMuch = RawEventBuilderDetector(ECbmModuleId::kMuch, ECbmDataType::kMuchDigi, "Much"); static const RawEventBuilderDetector kRawEventBuilderDetTrd = RawEventBuilderDetector(ECbmModuleId::kTrd, ECbmDataType::kTrdDigi, "Trd"); +static const RawEventBuilderDetector kRawEventBuilderDetTrd2D = + RawEventBuilderDetector(ECbmModuleId::kTrd2d, ECbmDataType::kTrdDigi, "kTrd2D"); static const RawEventBuilderDetector kRawEventBuilderDetTof = RawEventBuilderDetector(ECbmModuleId::kTof, ECbmDataType::kTofDigi, "Tof"); static const RawEventBuilderDetector kRawEventBuilderDetRich = @@ -185,12 +187,20 @@ public: /// Set digi containers void SetT0Digis(const std::vector<CbmTofDigi>* T0DigiVec) { fT0DigiVec = T0DigiVec; } void SetDigis(std::vector<CbmStsDigi>* StsDigis) { fStsDigis = StsDigis; } - void SetDigis(std::vector<CbmMuchDigi>* MuchDigis) { fMuchDigis = MuchDigis; } + void SetDigis(std::vector<CbmMuchDigi>* MuchDigis) + { + fMuchDigis = MuchDigis; + fbUseMuchBeamtimeDigi = kFALSE; + } void SetDigis(std::vector<CbmTrdDigi>* TrdDigis) { fTrdDigis = TrdDigis; } void SetDigis(std::vector<CbmTofDigi>* TofDigis) { fTofDigis = TofDigis; } void SetDigis(std::vector<CbmRichDigi>* RichDigis) { fRichDigis = RichDigis; } void SetDigis(std::vector<CbmPsdDigi>* PsdDigis) { fPsdDigis = PsdDigis; } - void SetDigis(std::vector<CbmMuchBeamTimeDigi>* MuchBeamTimeDigis) { fMuchBeamTimeDigis = MuchBeamTimeDigis; } + void SetDigis(std::vector<CbmMuchBeamTimeDigi>* MuchBeamTimeDigis) + { + fMuchBeamTimeDigis = MuchBeamTimeDigis; + fbUseMuchBeamtimeDigi = kTRUE; + } void SetSeedTimes(std::vector<Double_t>* SeedTimes) { fSeedTimes = SeedTimes; } @@ -256,6 +266,7 @@ private: RawEventBuilderDetector(ECbmModuleId::kSts, ECbmDataType::kStsDigi, "kSts"), RawEventBuilderDetector(ECbmModuleId::kMuch, ECbmDataType::kMuchDigi, "kMuch"), RawEventBuilderDetector(ECbmModuleId::kTrd, ECbmDataType::kTrdDigi, "kTrd"), + RawEventBuilderDetector(ECbmModuleId::kTrd2d, ECbmDataType::kTrdDigi, "kTrd2D"), RawEventBuilderDetector(ECbmModuleId::kTof, ECbmDataType::kTofDigi, "kTof"), RawEventBuilderDetector(ECbmModuleId::kRich, ECbmDataType::kRichDigi, "kRich"), RawEventBuilderDetector(ECbmModuleId::kPsd, ECbmDataType::kPsdDigi, "kPsd")}; @@ -321,6 +332,8 @@ private: TH2* fhNbDigiPerEvtTime = nullptr; //! histogram with the nb of all digis per event vs seed time of the events std::vector<TH2*> fvhNbDigiPerEvtTimeDet = {}; //! histograms with the nb of digis in each detector per event vs seed time of the events + std::vector<TH1*> fvhNbDigiPerEvtDet = {}; //! histograms with the nb of digis in each detector per event + std::vector<TH1*> fvhTDiff = {}; // digi time difference to seed /// Internal state variables UInt_t fuCurEv = 0; //! Event Counter