diff --git a/reco/eventbuilder/digis/CbmSeedFinderQa.cxx b/reco/eventbuilder/digis/CbmSeedFinderQa.cxx index 2ccce441faaecd1b73deed4e0ebed1d1c1ea21c8..281b54332f38e620cdc9b728ae264ef6af838efa 100644 --- a/reco/eventbuilder/digis/CbmSeedFinderQa.cxx +++ b/reco/eventbuilder/digis/CbmSeedFinderQa.cxx @@ -39,9 +39,13 @@ CbmSeedFinderQa::CbmSeedFinderQa() : fOutFolder("SeedFinderQA", "Seed finder QA" fhCorrectVsFoundNoNoise = new TH2I("fhCorrectVsFoundNoNoise", "Correct digis [pct] vs. Found digis [pct], no noise; Correct; Found ", 110, -5., 105., 110, -5., 105.); - fhTimeOffset = new TH1F("fhTimeOffset", "tSeed - tMCEvent [ns]", 20, -5, 5); + + fhTimeOffset = new TH1F("fhTimeOffsetMatched", "tSeed - tMCMatched [ns]", 20, -5, 5); fhTimeOffset->SetCanExtend(TH1::kAllAxes); + fhTimeOffsetClosest = new TH1F("fhTimeOffsetClosest", "tSeed - tMCClosest [ns]", 20, -5, 5); + fhTimeOffsetClosest->SetCanExtend(TH1::kAllAxes); + histFolder->Add(fhCorrectDigiRatio); histFolder->Add(fhCorrectDigiRatioNoNoise); histFolder->Add(fhNoiseDigiRatio); @@ -49,6 +53,7 @@ CbmSeedFinderQa::CbmSeedFinderQa() : fOutFolder("SeedFinderQA", "Seed finder QA" histFolder->Add(fhCorrectVsFound); histFolder->Add(fhCorrectVsFoundNoNoise); histFolder->Add(fhTimeOffset); + histFolder->Add(fhTimeOffsetClosest); histFolder->Add(fhLinkedMCEventsPerTrigger); histFolder->Add(fhLinkedTriggersPerMCEvent); histFolder->Add(fhMatchedTriggersPerMCEvent); @@ -67,6 +72,7 @@ CbmSeedFinderQa::~CbmSeedFinderQa() delete fhCorrectVsFound; delete fhCorrectVsFoundNoNoise; delete fhTimeOffset; + delete fhTimeOffsetClosest; delete fhLinkedMCEventsPerTrigger; delete fhLinkedTriggersPerMCEvent; delete fhMatchedTriggersPerMCEvent; @@ -82,12 +88,17 @@ void CbmSeedFinderQa::Init() fEventList = (CbmMCEventList*) FairRootManager::Instance()->GetObject("MCEventList."); } -void CbmSeedFinderQa::ResetPerTsStorage() { fvEventMatchesPerTs.clear(); } +void CbmSeedFinderQa::ResetPerTsStorage() +{ + fvEventMatchesPerTs.clear(); + fvSeedTimesPerTs.clear(); +} void CbmSeedFinderQa::FillQaSeedInfo(const int32_t WinStart, const int32_t WinEnd, const std::vector<CbmMatch>* vDigiMatch, const double seedTime) { fvSeedTimesFull.push_back(seedTime); + fvSeedTimesPerTs.push_back(seedTime); int32_t digiCount = 0; int32_t noiseDigiCount = 0; @@ -178,6 +189,8 @@ void CbmSeedFinderQa::FillQaSeedInfo(const int32_t WinStart, const int32_t WinEn void CbmSeedFinderQa::FillQaMCInfo() { const uint32_t nEvents = fEventList->GetNofEvents(); + if (nEvents == 0) { return; } + std::vector<uint32_t> vLinkedTriggersPerMCEvent; std::vector<uint32_t> vMatchedTriggersPerMCEvent; vLinkedTriggersPerMCEvent.resize(nEvents, 0); @@ -200,6 +213,21 @@ void CbmSeedFinderQa::FillQaMCInfo() for (const auto& value : vMatchedTriggersPerMCEvent) { fhMatchedTriggersPerMCEvent->Fill(value); } + + // get sorted vector of MC event times + std::vector<double> vMCEventTimes; + for (uint32_t iEvent = 0; iEvent < nEvents; iEvent++) { + vMCEventTimes.push_back(fEventList->GetEventTimeByIndex(iEvent)); + } + std::sort(std::begin(vMCEventTimes), std::end(vMCEventTimes)); + + //find closest MC event for each seed (assumes both arrays are sorted in time) + auto minElem = vMCEventTimes.begin(); + for (const auto& seedTime : fvSeedTimesPerTs) { + auto comp = [&, seedTime](double val1, double val2) { return fabs(seedTime - val1) < fabs(seedTime - val2); }; + minElem = std::min_element(minElem, vMCEventTimes.end(), comp); + fhTimeOffsetClosest->Fill(seedTime - *minElem); + } } void CbmSeedFinderQa::FillHistos() @@ -278,12 +306,15 @@ void CbmSeedFinderQa::WriteHistos() fhTimeOffset->DrawCopy("colz", ""); fCanv->cd(8); - fhLinkedMCEventsPerTrigger->DrawCopy("colz", ""); + fhTimeOffsetClosest->DrawCopy("colz", ""); fCanv->cd(9); - fhLinkedTriggersPerMCEvent->DrawCopy("colz", ""); + fhLinkedMCEventsPerTrigger->DrawCopy("colz", ""); fCanv->cd(10); + fhLinkedTriggersPerMCEvent->DrawCopy("colz", ""); + + fCanv->cd(11); fhMatchedTriggersPerMCEvent->DrawCopy("colz", ""); FairSink* sink = FairRootManager::Instance()->GetSink(); diff --git a/reco/eventbuilder/digis/CbmSeedFinderQa.h b/reco/eventbuilder/digis/CbmSeedFinderQa.h index ed0d06c29032c76d8b347fc22af3384ff1019110..d572e148281a21df7a28da6a0768c4439820435c 100644 --- a/reco/eventbuilder/digis/CbmSeedFinderQa.h +++ b/reco/eventbuilder/digis/CbmSeedFinderQa.h @@ -63,6 +63,8 @@ public: /** @brief Matches that link constructed event seeds to MC events, current timeslice only. */ std::vector<CbmMatch> fvEventMatchesPerTs; + /** @brief Vector of event seeds, current TS only. */ + std::vector<double> fvSeedTimesPerTs; /** @brief Gather QA Information. * @params WinStart Starting position of seed window. @@ -103,6 +105,7 @@ private: TH2I* fhCorrectVsFound = nullptr; /// correct digis per event vs found digis per event TH2I* fhCorrectVsFoundNoNoise = nullptr; /// correct digis per event vs found digis per event, disregarding noise TH1F* fhTimeOffset = nullptr; /// difference between true event time and seed time + TH1F* fhTimeOffsetClosest = nullptr; /// difference between seed time and closest MC event time CbmQaCanvas* fCanv; ///summary canvas