From 7c295784e5ca65b5e359865266d13cd6183e7a70 Mon Sep 17 00:00:00 2001 From: Rafael Pezzi Date: Wed, 17 Nov 2021 19:13:42 +0100 Subject: [PATCH 1/6] MFT Reco task for pilot beam --- Modules/MFT/CMakeLists.txt | 2 + Modules/MFT/include/MFT/LinkDef.h | 1 + Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h | 92 ++++++ Modules/MFT/qc-mft-reco.json | 69 ++++ Modules/MFT/src/QcMFTRecoTaskExtra.cxx | 315 +++++++++++++++++++ 5 files changed, 479 insertions(+) create mode 100644 Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h create mode 100644 Modules/MFT/qc-mft-reco.json create mode 100644 Modules/MFT/src/QcMFTRecoTaskExtra.cxx diff --git a/Modules/MFT/CMakeLists.txt b/Modules/MFT/CMakeLists.txt index be797843c3..4a23bafc66 100644 --- a/Modules/MFT/CMakeLists.txt +++ b/Modules/MFT/CMakeLists.txt @@ -9,6 +9,7 @@ target_sources(O2QcMFT PRIVATE src/QcMFTClusterTask.cxx src/QcMFTTrackCheck.cxx src/QcMFTTrackTask.cxx + src/QcMFTRecoTaskExtra.cxx src/QcMFTReadoutCheck.cxx src/QcMFTReadoutTask.cxx) @@ -33,6 +34,7 @@ add_root_dictionary(O2QcMFT include/MFT/QcMFTClusterTask.h include/MFT/QcMFTTrackCheck.h include/MFT/QcMFTTrackTask.h + include/MFT/QcMFTRecoTaskExtra.h include/MFT/QcMFTReadoutCheck.h include/MFT/QcMFTReadoutTask.h include/MFT/QcMFTUtilTables.h diff --git a/Modules/MFT/include/MFT/LinkDef.h b/Modules/MFT/include/MFT/LinkDef.h index cf9ed6acd5..3f31400349 100644 --- a/Modules/MFT/include/MFT/LinkDef.h +++ b/Modules/MFT/include/MFT/LinkDef.h @@ -8,6 +8,7 @@ #pragma link C++ class o2::quality_control_modules::mft::QcMFTClusterTask + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTClusterCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTTrackTask + ; +#pragma link C++ class o2::quality_control_modules::mft::QcMFTRecoTaskExt + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTTrackCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTReadoutCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTReadoutTask + ; diff --git a/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h b/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h new file mode 100644 index 0000000000..17f1ea6415 --- /dev/null +++ b/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h @@ -0,0 +1,92 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file QcMFTRecoTaskExtra.h +/// \author Tomas Herman +/// \author Guillermo Contreras +/// \author Diana Maria Krupova +/// \author Katarina Krizkova Gajdosova + +#ifndef QC_MFT_RECO_TASKEXTRA_H +#define QC_MFT_RECO_TASKEXTRA_H + +// ROOT +#include +#include +// Quality Control +#include "QualityControl/TaskInterface.h" +// O2 +#include "CommonConstants/LHCConstants.h" + +using namespace o2::quality_control::core; +using namespace std; + +namespace o2::quality_control_modules::mft +{ + +static constexpr array minNClustersList = { 4, 5, 6, 7, 8, 9, 10 }; + +/// \brief MFT Track QC task +/// +class QcMFTRecoTaskExt /*final*/ : public TaskInterface // todo add back the "final" when doxygen is fixed +{ + public: + /// \brief Constructor + QcMFTRecoTaskExt() = default; + /// Destructor + ~QcMFTRecoTaskExt() override; + + // Definition of the methods for the template method pattern + void initialize(o2::framework::InitContext& ctx) override; + void startOfActivity(Activity& activity) override; + void startOfCycle() override; + void monitorData(o2::framework::ProcessingContext& ctx) override; + void endOfCycle() override; + void endOfActivity(Activity& activity) override; + void reset() override; + + double orbitToSeconds(uint32_t orbit, uint32_t refOrbit) + { + return (orbit - refOrbit) * o2::constants::lhc::LHCOrbitNS / 1E9; + } + + private: + unique_ptr mTrackNumberOfClusters = nullptr; + unique_ptr mCATrackNumberOfClusters = nullptr; + unique_ptr mLTFTrackNumberOfClusters = nullptr; + unique_ptr mTrackOnvQPt = nullptr; + unique_ptr mTrackChi2 = nullptr; + unique_ptr mTrackCharge = nullptr; + unique_ptr mTrackPhi = nullptr; + unique_ptr mPositiveTrackPhi = nullptr; + unique_ptr mNegativeTrackPhi = nullptr; + unique_ptr mTrackEta = nullptr; + array, 7> mTrackEtaNCls = { nullptr }; + array, 7> mTrackPhiNCls = { nullptr }; + array, 7> mTrackXYNCls = { nullptr }; + unique_ptr mCATrackEta = nullptr; + unique_ptr mLTFTrackEta = nullptr; + unique_ptr mTrackTanl = nullptr; + + unique_ptr mTrackROFNEntries = nullptr; + unique_ptr mClusterROFNEntries = nullptr; + unique_ptr mTracksBC = nullptr; + + unique_ptr mNOfTracksTime = nullptr; + unique_ptr mNOfClustersTime = nullptr; + + uint32_t mRefOrbit = 0; // Reference orbit used in relative time calculation +}; + +} // namespace o2::quality_control_modules::mft + +#endif // QC_MFT_RECO_TASKEXTRA_H diff --git a/Modules/MFT/qc-mft-reco.json b/Modules/MFT/qc-mft-reco.json new file mode 100644 index 0000000000..b0ac31dd51 --- /dev/null +++ b/Modules/MFT/qc-mft-reco.json @@ -0,0 +1,69 @@ +{ + "qc": { + "config": { + "database": { + "implementation": "CCDB", + "host": "dummy_qcdb.cern.ch:8083", + "username": "not_applicable", + "password": "not_applicable", + "name": "not_applicable" + }, + "Activity": { + "number": "42", + "type": "2" + }, + "monitoring": { + "url": "infologger:///debug?qc" + }, + "consul": { + "url": "dummy_aliecs.cern.ch:8500" + }, + "conditionDB": { + "url": "dummy_qcdb.cern.ch:8083" + } + }, + "tasks": { + "QcMFTRecoTaskExt": { + "active": "true", + "className": "o2::quality_control_modules::mft::QcMFTRecoTaskExt", + "moduleName": "QcMFT", + "detectorName": "MFT", + "cycleDurationSeconds": "60", + "maxNumberCycles": "-1", + "dataSource_comment": "The other type of dataSource is \"direct\", see basic-no-sampling.json.", + "dataSource": { + "type": "direct", + "query": "tracks:MFT/TRACKS/0;tracksrofs:MFT/MFTTrackROF/0;clusters:MFT/COMPCLUSTERS/0;clustersrofs:MFT/CLUSTERSROF/0" + }, + "taskParameters": { + "ROFLengthInBC": "198", + "MaxTrackROFSize": "100", + "MaxClusterROFSize": "5000", + "MaxDuration": "6000", + "TimeBinSize": "0.01", + "RefOrbit": "73198348" + }, + "location": "remote" + } + }, + "checks": { + "QcMFTTrackCheck": { + "active": "false", + "dataSource": [ + { + "type": "Task", + "name": "QcMFTRecoTaskExt", + "MOs": [ + "mMFTTrackCharge" + ] + } + ], + "className": "o2::quality_control_modules::mft::QcMFTTrackCheck", + "moduleName": "QcMFT", + "detectorName": "MFT", + "policy": "OnAny" + } + } + }, + "dataSamplingPolicies": [] +} \ No newline at end of file diff --git a/Modules/MFT/src/QcMFTRecoTaskExtra.cxx b/Modules/MFT/src/QcMFTRecoTaskExtra.cxx new file mode 100644 index 0000000000..3171e8ee5b --- /dev/null +++ b/Modules/MFT/src/QcMFTRecoTaskExtra.cxx @@ -0,0 +1,315 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// +/// \file QcMFTRecoTaskExtra.cxx +/// \author Tomas Herman +/// \author Guillermo Contreras +/// \author Diana Maria Krupova +/// \author Katarina Krizkova Gajdosova + +// ROOT +#include +#include +// O2 +#include +#include +#include +#include +#include +#include +// Quality Control +#include "QualityControl/QcInfoLogger.h" +#include "MFT/QcMFTRecoTaskExtra.h" + +namespace o2::quality_control_modules::mft +{ + +QcMFTRecoTaskExt::~QcMFTRecoTaskExt() +{ + /* + not needed for unique pointers + */ +} + +void QcMFTRecoTaskExt::initialize(o2::framework::InitContext& /*ctx*/) +{ + ILOG(Info, Support) << "initialize QcMFTRecoTaskExt" << ENDM; // QcInfoLogger is used. FairMQ logs will go to there as well. + + mTrackNumberOfClusters = std::make_unique("mMFTTrackNumberOfClusters", + "Number Of Clusters Per Track; # clusters; # entries", 10, 0.5, 10.5); + getObjectsManager()->startPublishing(mTrackNumberOfClusters.get()); + getObjectsManager()->addMetadata(mTrackNumberOfClusters->GetName(), "custom", "34"); + + mCATrackNumberOfClusters = std::make_unique("CA/mMFTCATrackNumberOfClusters", + "Number Of Clusters Per CA Track; # clusters; # tracks", 10, 0.5, 10.5); + getObjectsManager()->startPublishing(mCATrackNumberOfClusters.get()); + getObjectsManager()->addMetadata(mCATrackNumberOfClusters->GetName(), "custom", "34"); + + mLTFTrackNumberOfClusters = std::make_unique("LTF/mMFTLTFTrackNumberOfClusters", + "Number Of Clusters Per LTF Track; # clusters; # entries", 10, 0.5, 10.5); + getObjectsManager()->startPublishing(mLTFTrackNumberOfClusters.get()); + getObjectsManager()->addMetadata(mLTFTrackNumberOfClusters->GetName(), "custom", "34"); + + mTrackOnvQPt = std::make_unique("mMFTTrackOnvQPt", "Track q/p_{T}; q/p_{T} [1/GeV]; # entries", 50, -2, 2); + getObjectsManager()->startPublishing(mTrackOnvQPt.get()); + getObjectsManager()->addMetadata(mTrackOnvQPt->GetName(), "custom", "34"); + + mTrackChi2 = std::make_unique("mMFTTrackChi2", "Track #chi^{2}; #chi^{2}; # entries", 21, -0.5, 20.5); + getObjectsManager()->startPublishing(mTrackChi2.get()); + getObjectsManager()->addMetadata(mTrackChi2->GetName(), "custom", "34"); + + mTrackCharge = std::make_unique("mMFTTrackCharge", "Track Charge; q; # entries", 3, -1.5, 1.5); + getObjectsManager()->startPublishing(mTrackCharge.get()); + getObjectsManager()->addMetadata(mTrackCharge->GetName(), "custom", "34"); + + mTrackPhi = std::make_unique("mMFTTrackPhi", "Track #phi; #phi; # entries", 100, -3.2, 3.2); + getObjectsManager()->startPublishing(mTrackPhi.get()); + getObjectsManager()->addMetadata(mTrackPhi->GetName(), "custom", "34"); + + mPositiveTrackPhi = std::make_unique("mMFTPositiveTrackPhi", "Positive Track #phi; #phi; # entries", 100, -3.2, 3.2); + getObjectsManager()->startPublishing(mPositiveTrackPhi.get()); + getObjectsManager()->addMetadata(mPositiveTrackPhi->GetName(), "custom", "34"); + + mNegativeTrackPhi = std::make_unique("mMFTNegativeTrackPhi", "Negative Track #phi; #phi; # entries", 100, -3.2, 3.2); + getObjectsManager()->startPublishing(mNegativeTrackPhi.get()); + getObjectsManager()->addMetadata(mNegativeTrackPhi->GetName(), "custom", "34"); + + mTrackEta = std::make_unique("mMFTTrackEta", "Track #eta; #eta; # entries", 50, -4, -2); + getObjectsManager()->startPublishing(mTrackEta.get()); + getObjectsManager()->addMetadata(mTrackEta->GetName(), "custom", "34"); + + auto nHisto = 0; + for (auto minNClusters : minNClustersList) { + mTrackEtaNCls[nHisto] = std::make_unique(Form("mMFTTrackEta_%d_MinClusters", minNClusters), Form("Track #eta (NCls > %d); #eta; # entries", minNClusters), 50, -4, -2); + getObjectsManager()->startPublishing(mTrackEtaNCls[nHisto].get()); + getObjectsManager()->addMetadata(mTrackEtaNCls[nHisto]->GetName(), "custom", "34"); + + mTrackPhiNCls[nHisto] = std::make_unique(Form("mMFTTrackPhi_%d_MinClusters", minNClusters), Form("Track #phi (NCls > %d); #phi; # entries", minNClusters), 100, -3.2, 3.2); + getObjectsManager()->startPublishing(mTrackPhiNCls[nHisto].get()); + getObjectsManager()->addMetadata(mTrackPhiNCls[nHisto]->GetName(), "custom", "34"); + + mTrackXYNCls[nHisto] = std::make_unique(Form("mMFTTrackXY_%d_MinClusters", minNClusters), Form("Track Position (NCls > %d); x; y", minNClusters), 320, -16, 16, 320, -16, 16); + getObjectsManager()->startPublishing(mTrackXYNCls[nHisto].get()); + getObjectsManager()->addMetadata(mTrackXYNCls[nHisto]->GetName(), "custom", "34"); + + nHisto++; + } + + mCATrackEta = std::make_unique("CA/mMFTCATrackEta", "CA Track #eta; #eta; # entries", 50, -4, -2); + getObjectsManager()->startPublishing(mCATrackEta.get()); + getObjectsManager()->addMetadata(mCATrackEta->GetName(), "custom", "34"); + + mLTFTrackEta = std::make_unique("LTF/mMFTLTFTrackEta", "LTF Track #eta; #eta; # entries", 50, -4, -2); + getObjectsManager()->startPublishing(mLTFTrackEta.get()); + getObjectsManager()->addMetadata(mLTFTrackEta->GetName(), "custom", "34"); + + mTrackTanl = std::make_unique("mMFTTrackTanl", "Track tan #lambda; tan #lambda; # entries", 100, -25, 0); + getObjectsManager()->startPublishing(mTrackTanl.get()); + getObjectsManager()->addMetadata(mTrackTanl->GetName(), "custom", "34"); + + auto MaxClusterROFSize = 5000; + if (auto param = mCustomParameters.find("MaxClusterROFSize"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - MaxClusterROFSize: " << param->second << ENDM; + MaxClusterROFSize = stoi(param->second); + } + mClusterROFNEntries = std::make_unique("mMFTClustersROFSize", "MFT Cluster ROFs size; ROF Size; # entries", MaxClusterROFSize, 0, MaxClusterROFSize); + getObjectsManager()->startPublishing(mClusterROFNEntries.get()); + getObjectsManager()->addMetadata(mClusterROFNEntries->GetName(), "custom", "34"); + + auto MaxTrackROFSize = 1000; + if (auto param = mCustomParameters.find("MaxTrackROFSize"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - MaxTrackROFSize: " << param->second << ENDM; + MaxTrackROFSize = stoi(param->second); + } + mTrackROFNEntries = std::make_unique("mMFTTrackROFSize", "MFT Track ROFs size; ROF Size; # entries", MaxTrackROFSize, 0, MaxTrackROFSize); + getObjectsManager()->startPublishing(mTrackROFNEntries.get()); + getObjectsManager()->addMetadata(mTrackROFNEntries->GetName(), "custom", "34"); + + auto ROFLengthInBC = 198; + if (auto param = mCustomParameters.find("ROFLengthInBC"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - ROFLengthInBC: " << param->second << ENDM; + ROFLengthInBC = stoi(param->second); + } + auto ROFsPerOrbit = o2::constants::lhc::LHCMaxBunches / ROFLengthInBC; + + mTracksBC = std::make_unique("mtracksBC", "Tracks per BC (sum over orbits); BCid; # entries", ROFsPerOrbit, 0, o2::constants::lhc::LHCMaxBunches); + mTracksBC->SetMinimum(0.1); + getObjectsManager()->startPublishing(mTracksBC.get()); + getObjectsManager()->addMetadata(mTracksBC->GetName(), "custom", "34"); + + auto MaxDuration = 60.f; + if (auto param = mCustomParameters.find("MaxDuration"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - MaxDuration: " << param->second << ENDM; + MaxDuration = stof(param->second); + } + + auto TimeBinSize = 0.01f; + if (auto param = mCustomParameters.find("TimeBinSize"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - TimeBinSize: " << param->second << ENDM; + TimeBinSize = stof(param->second); + } + + auto NofTimeBins = static_cast(MaxDuration / TimeBinSize); + + mNOfTracksTime = std::make_unique("mNOfTracksTime", "Number of tracks per time bin; time (s); # entries", NofTimeBins, 0, MaxDuration); + mNOfTracksTime->SetMinimum(0.1); + getObjectsManager()->startPublishing(mNOfTracksTime.get()); + getObjectsManager()->addMetadata(mNOfTracksTime->GetName(), "custom", "34"); + + mNOfClustersTime = std::make_unique("mNOfClustersTime", "Number of clusters per time bin; time (s); # entries", NofTimeBins, 0, MaxDuration); + mNOfClustersTime->SetMinimum(0.1); + getObjectsManager()->startPublishing(mNOfClustersTime.get()); + getObjectsManager()->addMetadata(mNOfClustersTime->GetName(), "custom", "34"); + + if (auto param = mCustomParameters.find("RefOrbit"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - RefOrbit: " << param->second << ENDM; + mRefOrbit = static_cast(stoi(param->second)); + } +} + +void QcMFTRecoTaskExt::startOfActivity(Activity& /*activity*/) +{ + ILOG(Info, Support) << "startOfActivity" << ENDM; + + mTrackNumberOfClusters->Reset(); + mCATrackNumberOfClusters->Reset(); + mLTFTrackNumberOfClusters->Reset(); + mTrackOnvQPt->Reset(); + mTrackChi2->Reset(); + mTrackCharge->Reset(); + mTrackPhi->Reset(); + mPositiveTrackPhi->Reset(); + mNegativeTrackPhi->Reset(); + mTrackEta->Reset(); + auto nHisto = 0; + for (auto minNClusters : minNClustersList) { + mTrackEtaNCls[nHisto]->Reset(); + mTrackPhiNCls[nHisto]->Reset(); + mTrackXYNCls[nHisto]->Reset(); + } + mCATrackEta->Reset(); + mLTFTrackEta->Reset(); + mTrackTanl->Reset(); + + mTrackROFNEntries->Reset(); + mClusterROFNEntries->Reset(); +} + +void QcMFTRecoTaskExt::startOfCycle() +{ + ILOG(Info, Support) << "startOfCycle" << ENDM; +} + +void QcMFTRecoTaskExt::monitorData(o2::framework::ProcessingContext& ctx) +{ + // get the tracks + const auto tracks = ctx.inputs().get>("tracks"); + const auto tracksrofs = ctx.inputs().get>("tracksrofs"); + + const auto clusters = ctx.inputs().get>("clusters"); + const auto clustersrofs = ctx.inputs().get>("clustersrofs"); + + if (tracks.size() < 1) + return; + // fill the histograms + + for (const auto& rof : tracksrofs) { + mTrackROFNEntries->Fill(rof.getNEntries()); + mTracksBC->Fill(rof.getBCData().bc, rof.getNEntries()); + float seconds = orbitToSeconds(rof.getBCData().orbit, mRefOrbit) + rof.getBCData().bc * o2::constants::lhc::LHCBunchSpacingNS * 1e-9; + mNOfTracksTime->Fill(seconds, rof.getNEntries()); + } + + for (const auto& rof : clustersrofs) { + mClusterROFNEntries->Fill(rof.getNEntries()); + float seconds = orbitToSeconds(rof.getBCData().orbit, mRefOrbit) + rof.getBCData().bc * o2::constants::lhc::LHCBunchSpacingNS * 1e-9; + mNOfClustersTime->Fill(seconds, rof.getNEntries()); + } + + for (auto& oneTrack : tracks) { + mTrackNumberOfClusters->Fill(oneTrack.getNumberOfPoints()); + mTrackChi2->Fill(oneTrack.getTrackChi2()); + mTrackCharge->Fill(oneTrack.getCharge()); + mTrackPhi->Fill(oneTrack.getPhi()); + mTrackEta->Fill(oneTrack.getEta()); + mTrackTanl->Fill(oneTrack.getTanl()); + + for (auto minNClusters : minNClustersList) { + if (oneTrack.getNumberOfPoints() >= minNClusters) { + mTrackEtaNCls[minNClusters - minNClustersList[0]]->Fill(oneTrack.getEta()); + mTrackPhiNCls[minNClusters - minNClustersList[0]]->Fill(oneTrack.getPhi()); + mTrackXYNCls[minNClusters - minNClustersList[0]]->Fill(oneTrack.getX(), oneTrack.getY()); + } + } + + if (oneTrack.getCharge() == +1) { + mPositiveTrackPhi->Fill(oneTrack.getPhi()); + mTrackOnvQPt->Fill(1 / oneTrack.getPt()); + } + + if (oneTrack.getCharge() == -1) { + mNegativeTrackPhi->Fill(oneTrack.getPhi()); + mTrackOnvQPt->Fill(-1 / oneTrack.getPt()); + } + + if (oneTrack.isCA()) { + mCATrackNumberOfClusters->Fill(oneTrack.getNumberOfPoints()); + mCATrackEta->Fill(oneTrack.getEta()); + } + if (oneTrack.isLTF()) { + mLTFTrackNumberOfClusters->Fill(oneTrack.getNumberOfPoints()); + mLTFTrackEta->Fill(oneTrack.getEta()); + } + } +} + +void QcMFTRecoTaskExt::endOfCycle() +{ + ILOG(Info, Support) << "endOfCycle" << ENDM; +} + +void QcMFTRecoTaskExt::endOfActivity(Activity& /*activity*/) +{ + ILOG(Info, Support) << "endOfActivity" << ENDM; +} + +void QcMFTRecoTaskExt::reset() +{ + // clean all the monitor objects here + + ILOG(Info, Support) << "Resetting the histogram" << ENDM; + + mTrackNumberOfClusters->Reset(); + mCATrackNumberOfClusters->Reset(); + mLTFTrackNumberOfClusters->Reset(); + mTrackOnvQPt->Reset(); + mTrackChi2->Reset(); + mTrackCharge->Reset(); + mTrackPhi->Reset(); + mPositiveTrackPhi->Reset(); + mNegativeTrackPhi->Reset(); + mTrackEta->Reset(); + auto nHisto = 0; + for (auto minNClusters : minNClustersList) { + mTrackEtaNCls[nHisto]->Reset(); + mTrackPhiNCls[nHisto]->Reset(); + mTrackXYNCls[nHisto]->Reset(); + } + mCATrackEta->Reset(); + mLTFTrackEta->Reset(); + mTrackTanl->Reset(); + + mTrackROFNEntries->Reset(); + mClusterROFNEntries->Reset(); +} + +} // namespace o2::quality_control_modules::mft From 61fd3aadd86810d1de6c37a949be7ae2101def92 Mon Sep 17 00:00:00 2001 From: Rafael Pezzi Date: Thu, 18 Nov 2021 18:32:13 +0100 Subject: [PATCH 2/6] Add MFT Cluster Histos + increase bin ranges --- Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h | 3 +++ Modules/MFT/qc-mft-reco.json | 6 ++--- Modules/MFT/src/QcMFTRecoTaskExtra.cxx | 27 +++++++++++++++++--- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h b/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h index 17f1ea6415..1365e30690 100644 --- a/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h +++ b/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h @@ -84,6 +84,9 @@ class QcMFTRecoTaskExt /*final*/ : public TaskInterface // todo add back the "fi unique_ptr mNOfTracksTime = nullptr; unique_ptr mNOfClustersTime = nullptr; + std::unique_ptr mClusterSensorIndex = nullptr; + std::unique_ptr mClusterPatternIndex = nullptr; + uint32_t mRefOrbit = 0; // Reference orbit used in relative time calculation }; diff --git a/Modules/MFT/qc-mft-reco.json b/Modules/MFT/qc-mft-reco.json index b0ac31dd51..d43e4eecd4 100644 --- a/Modules/MFT/qc-mft-reco.json +++ b/Modules/MFT/qc-mft-reco.json @@ -37,11 +37,11 @@ }, "taskParameters": { "ROFLengthInBC": "198", - "MaxTrackROFSize": "100", + "MaxTrackROFSize": "1000", "MaxClusterROFSize": "5000", - "MaxDuration": "6000", + "MaxDuration": "60000", "TimeBinSize": "0.01", - "RefOrbit": "73198348" + "RefOrbit": "0" }, "location": "remote" } diff --git a/Modules/MFT/src/QcMFTRecoTaskExtra.cxx b/Modules/MFT/src/QcMFTRecoTaskExtra.cxx index 3171e8ee5b..9a04de1533 100644 --- a/Modules/MFT/src/QcMFTRecoTaskExtra.cxx +++ b/Modules/MFT/src/QcMFTRecoTaskExtra.cxx @@ -89,15 +89,16 @@ void QcMFTRecoTaskExt::initialize(o2::framework::InitContext& /*ctx*/) auto nHisto = 0; for (auto minNClusters : minNClustersList) { - mTrackEtaNCls[nHisto] = std::make_unique(Form("mMFTTrackEta_%d_MinClusters", minNClusters), Form("Track #eta (NCls > %d); #eta; # entries", minNClusters), 50, -4, -2); + mTrackEtaNCls[nHisto] = std::make_unique(Form("mMFTTrackEta_%d_MinClusters", minNClusters), Form("Track #eta (NCls >= %d); #eta; # entries", minNClusters), 50, -4, -2); getObjectsManager()->startPublishing(mTrackEtaNCls[nHisto].get()); getObjectsManager()->addMetadata(mTrackEtaNCls[nHisto]->GetName(), "custom", "34"); - mTrackPhiNCls[nHisto] = std::make_unique(Form("mMFTTrackPhi_%d_MinClusters", minNClusters), Form("Track #phi (NCls > %d); #phi; # entries", minNClusters), 100, -3.2, 3.2); + mTrackPhiNCls[nHisto] = std::make_unique(Form("mMFTTrackPhi_%d_MinClusters", minNClusters), Form("Track #phi (NCls >= %d); #phi; # entries", minNClusters), 100, -3.2, 3.2); getObjectsManager()->startPublishing(mTrackPhiNCls[nHisto].get()); getObjectsManager()->addMetadata(mTrackPhiNCls[nHisto]->GetName(), "custom", "34"); - mTrackXYNCls[nHisto] = std::make_unique(Form("mMFTTrackXY_%d_MinClusters", minNClusters), Form("Track Position (NCls > %d); x; y", minNClusters), 320, -16, 16, 320, -16, 16); + mTrackXYNCls[nHisto] = std::make_unique(Form("mMFTTrackXY_%d_MinClusters", minNClusters), Form("Track Position (NCls >= %d); x; y", minNClusters), 320, -16, 16, 320, -16, 16); + mTrackXYNCls[nHisto]->SetOption("COLZ"); getObjectsManager()->startPublishing(mTrackXYNCls[nHisto].get()); getObjectsManager()->addMetadata(mTrackXYNCls[nHisto]->GetName(), "custom", "34"); @@ -170,6 +171,12 @@ void QcMFTRecoTaskExt::initialize(o2::framework::InitContext& /*ctx*/) getObjectsManager()->startPublishing(mNOfClustersTime.get()); getObjectsManager()->addMetadata(mNOfClustersTime->GetName(), "custom", "34"); + mClusterSensorIndex = std::make_unique("mMFTClusterSensorIndex", "Chip Cluster Occupancy;Chip ID;#Entries", 936, -0.5, 935.5); + getObjectsManager()->startPublishing(mClusterSensorIndex.get()); + + mClusterPatternIndex = std::make_unique("mMFTClusterPatternIndex", "Cluster Pattern ID;Pattern ID;#Entries", 300, -0.5, 299.5); + getObjectsManager()->startPublishing(mClusterPatternIndex.get()); + if (auto param = mCustomParameters.find("RefOrbit"); param != mCustomParameters.end()) { ILOG(Info, Devel) << "Custom parameter - RefOrbit: " << param->second << ENDM; mRefOrbit = static_cast(stoi(param->second)); @@ -202,6 +209,9 @@ void QcMFTRecoTaskExt::startOfActivity(Activity& /*activity*/) mTrackROFNEntries->Reset(); mClusterROFNEntries->Reset(); + + mClusterSensorIndex->Reset(); + mClusterPatternIndex->Reset(); } void QcMFTRecoTaskExt::startOfCycle() @@ -218,8 +228,9 @@ void QcMFTRecoTaskExt::monitorData(o2::framework::ProcessingContext& ctx) const auto clusters = ctx.inputs().get>("clusters"); const auto clustersrofs = ctx.inputs().get>("clustersrofs"); - if (tracks.size() < 1) + if (!tracks.size()) { return; + } // fill the histograms for (const auto& rof : tracksrofs) { @@ -235,6 +246,11 @@ void QcMFTRecoTaskExt::monitorData(o2::framework::ProcessingContext& ctx) mNOfClustersTime->Fill(seconds, rof.getNEntries()); } + for (auto& oneCluster : clusters) { + mClusterSensorIndex->Fill(oneCluster.getSensorID()); + mClusterPatternIndex->Fill(oneCluster.getPatternID()); + } + for (auto& oneTrack : tracks) { mTrackNumberOfClusters->Fill(oneTrack.getNumberOfPoints()); mTrackChi2->Fill(oneTrack.getTrackChi2()); @@ -310,6 +326,9 @@ void QcMFTRecoTaskExt::reset() mTrackROFNEntries->Reset(); mClusterROFNEntries->Reset(); + + mClusterSensorIndex->Reset(); + mClusterPatternIndex->Reset(); } } // namespace o2::quality_control_modules::mft From 063e1eccc6d2790b8f8cde732a8a18992770b689 Mon Sep 17 00:00:00 2001 From: Rafael Pezzi Date: Fri, 19 Nov 2021 09:32:20 +0100 Subject: [PATCH 3/6] MFT Reco Task: jsons for sampled and direct source --- Modules/MFT/qc-mft-reco.json | 27 ++++++++--- Modules/MFT/qc-mft-reco_direct.json | 69 +++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 Modules/MFT/qc-mft-reco_direct.json diff --git a/Modules/MFT/qc-mft-reco.json b/Modules/MFT/qc-mft-reco.json index d43e4eecd4..6f22bc2b94 100644 --- a/Modules/MFT/qc-mft-reco.json +++ b/Modules/MFT/qc-mft-reco.json @@ -3,7 +3,7 @@ "config": { "database": { "implementation": "CCDB", - "host": "dummy_qcdb.cern.ch:8083", + "host": "qcdb.cern.ch:8083", "username": "not_applicable", "password": "not_applicable", "name": "not_applicable" @@ -16,10 +16,10 @@ "url": "infologger:///debug?qc" }, "consul": { - "url": "dummy_aliecs.cern.ch:8500" + "url": "aliecs.cern.ch:8500" }, "conditionDB": { - "url": "dummy_qcdb.cern.ch:8083" + "url": "qcdb.cern.ch:8083" } }, "tasks": { @@ -32,8 +32,8 @@ "maxNumberCycles": "-1", "dataSource_comment": "The other type of dataSource is \"direct\", see basic-no-sampling.json.", "dataSource": { - "type": "direct", - "query": "tracks:MFT/TRACKS/0;tracksrofs:MFT/MFTTrackROF/0;clusters:MFT/COMPCLUSTERS/0;clustersrofs:MFT/CLUSTERSROF/0" + "type": "dataSamplingPolicy", + "name": "mft-tracks" }, "taskParameters": { "ROFLengthInBC": "198", @@ -65,5 +65,20 @@ } } }, - "dataSamplingPolicies": [] + "dataSamplingPolicies": [ + { + "id": "mft-tracks", + "active": "true", + "machines": [], + "query": "tracks:MFT/TRACKS/0;tracksrofs:MFT/MFTTrackROF/0;clusters:MFT/COMPCLUSTERS/0;clustersrofs:MFT/CLUSTERSROF/0", + "samplingConditions": [ + { + "condition": "random", + "fraction": "0.05", + "seed": "1234" + } + ], + "blocking": "false" + } + ] } \ No newline at end of file diff --git a/Modules/MFT/qc-mft-reco_direct.json b/Modules/MFT/qc-mft-reco_direct.json new file mode 100644 index 0000000000..46803f45b7 --- /dev/null +++ b/Modules/MFT/qc-mft-reco_direct.json @@ -0,0 +1,69 @@ +{ + "qc": { + "config": { + "database": { + "implementation": "CCDB", + "host": "dummy_qcdb.cern.ch:8083", + "username": "not_applicable", + "password": "not_applicable", + "name": "not_applicable" + }, + "Activity": { + "number": "42", + "type": "2" + }, + "monitoring": { + "url": "infologger:///debug?qc" + }, + "consul": { + "url": "dummy_aliecs.cern.ch:8500" + }, + "conditionDB": { + "url": "dummy_qcdb.cern.ch:8083" + } + }, + "tasks": { + "QcMFTRecoTask": { + "active": "true", + "className": "o2::quality_control_modules::mft::QcMFTRecoTask", + "moduleName": "QcMFT", + "detectorName": "MFT", + "cycleDurationSeconds": "60", + "maxNumberCycles": "-1", + "dataSource_comment": "The other type of dataSource is \"direct\", see basic-no-sampling.json.", + "dataSource": { + "type": "direct", + "query": "tracks:MFT/TRACKS/0;tracksrofs:MFT/MFTTrackROF/0;clusters:MFT/COMPCLUSTERS/0;clustersrofs:MFT/CLUSTERSROF/0" + }, + "taskParameters": { + "ROFLengthInBC": "198", + "MaxTrackROFSize": "1000", + "MaxClusterROFSize": "5000", + "MaxDuration": "60000", + "TimeBinSize": "0.01", + "RefOrbit": "0" + }, + "location": "remote" + } + }, + "checks": { + "QcMFTTrackCheck": { + "active": "false", + "dataSource": [ + { + "type": "Task", + "name": "QcMFTRecoTask", + "MOs": [ + "mMFTTrackCharge" + ] + } + ], + "className": "o2::quality_control_modules::mft::QcMFTTrackCheck", + "moduleName": "QcMFT", + "detectorName": "MFT", + "policy": "OnAny" + } + } + }, + "dataSamplingPolicies": [] +} \ No newline at end of file From 0e487cb488a263b0fa544446e7ce63310cd7392e Mon Sep 17 00:00:00 2001 From: Rafael Pezzi Date: Fri, 26 Nov 2021 10:41:37 +0100 Subject: [PATCH 4/6] Renaming MFT reco task -> QcMFTRecoTask Also - Improved handling of direct sampling and database configs - Reducing histogram sizes --- Modules/MFT/CMakeLists.txt | 4 ++-- Modules/MFT/include/MFT/LinkDef.h | 2 +- .../{QcMFTRecoTaskExtra.h => QcMFTRecoTask.h} | 8 +++---- Modules/MFT/qc-mft-reco.json | 8 +++---- Modules/MFT/qc-mft-reco_direct.json | 10 ++++----- ...MFTRecoTaskExtra.cxx => QcMFTRecoTask.cxx} | 22 +++++++++---------- 6 files changed, 27 insertions(+), 27 deletions(-) rename Modules/MFT/include/MFT/{QcMFTRecoTaskExtra.h => QcMFTRecoTask.h} (93%) rename Modules/MFT/src/{QcMFTRecoTaskExtra.cxx => QcMFTRecoTask.cxx} (95%) diff --git a/Modules/MFT/CMakeLists.txt b/Modules/MFT/CMakeLists.txt index 4a23bafc66..b521b5ec7c 100644 --- a/Modules/MFT/CMakeLists.txt +++ b/Modules/MFT/CMakeLists.txt @@ -9,7 +9,7 @@ target_sources(O2QcMFT PRIVATE src/QcMFTClusterTask.cxx src/QcMFTTrackCheck.cxx src/QcMFTTrackTask.cxx - src/QcMFTRecoTaskExtra.cxx + src/QcMFTRecoTask.cxx src/QcMFTReadoutCheck.cxx src/QcMFTReadoutTask.cxx) @@ -34,7 +34,7 @@ add_root_dictionary(O2QcMFT include/MFT/QcMFTClusterTask.h include/MFT/QcMFTTrackCheck.h include/MFT/QcMFTTrackTask.h - include/MFT/QcMFTRecoTaskExtra.h + include/MFT/QcMFTRecoTask.h include/MFT/QcMFTReadoutCheck.h include/MFT/QcMFTReadoutTask.h include/MFT/QcMFTUtilTables.h diff --git a/Modules/MFT/include/MFT/LinkDef.h b/Modules/MFT/include/MFT/LinkDef.h index 3f31400349..61e070b010 100644 --- a/Modules/MFT/include/MFT/LinkDef.h +++ b/Modules/MFT/include/MFT/LinkDef.h @@ -8,7 +8,7 @@ #pragma link C++ class o2::quality_control_modules::mft::QcMFTClusterTask + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTClusterCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTTrackTask + ; -#pragma link C++ class o2::quality_control_modules::mft::QcMFTRecoTaskExt + ; +#pragma link C++ class o2::quality_control_modules::mft::QcMFTRecoTask + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTTrackCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTReadoutCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTReadoutTask + ; diff --git a/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h b/Modules/MFT/include/MFT/QcMFTRecoTask.h similarity index 93% rename from Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h rename to Modules/MFT/include/MFT/QcMFTRecoTask.h index 1365e30690..deb27dde65 100644 --- a/Modules/MFT/include/MFT/QcMFTRecoTaskExtra.h +++ b/Modules/MFT/include/MFT/QcMFTRecoTask.h @@ -10,7 +10,7 @@ // or submit itself to any jurisdiction. /// -/// \file QcMFTRecoTaskExtra.h +/// \file QcMFTRecoTask.h /// \author Tomas Herman /// \author Guillermo Contreras /// \author Diana Maria Krupova @@ -37,13 +37,13 @@ static constexpr array minNClustersList = { 4, 5, 6, 7, 8, 9, 10 }; /// \brief MFT Track QC task /// -class QcMFTRecoTaskExt /*final*/ : public TaskInterface // todo add back the "final" when doxygen is fixed +class QcMFTRecoTask /*final*/ : public TaskInterface // todo add back the "final" when doxygen is fixed { public: /// \brief Constructor - QcMFTRecoTaskExt() = default; + QcMFTRecoTask() = default; /// Destructor - ~QcMFTRecoTaskExt() override; + ~QcMFTRecoTask() override; // Definition of the methods for the template method pattern void initialize(o2::framework::InitContext& ctx) override; diff --git a/Modules/MFT/qc-mft-reco.json b/Modules/MFT/qc-mft-reco.json index 6f22bc2b94..dc70dfcc63 100644 --- a/Modules/MFT/qc-mft-reco.json +++ b/Modules/MFT/qc-mft-reco.json @@ -23,9 +23,9 @@ } }, "tasks": { - "QcMFTRecoTaskExt": { + "QcMFTRecoTask": { "active": "true", - "className": "o2::quality_control_modules::mft::QcMFTRecoTaskExt", + "className": "o2::quality_control_modules::mft::QcMFTRecoTask", "moduleName": "QcMFT", "detectorName": "MFT", "cycleDurationSeconds": "60", @@ -40,7 +40,7 @@ "MaxTrackROFSize": "1000", "MaxClusterROFSize": "5000", "MaxDuration": "60000", - "TimeBinSize": "0.01", + "TimeBinSize": "0.1", "RefOrbit": "0" }, "location": "remote" @@ -52,7 +52,7 @@ "dataSource": [ { "type": "Task", - "name": "QcMFTRecoTaskExt", + "name": "QcMFTRecoTask", "MOs": [ "mMFTTrackCharge" ] diff --git a/Modules/MFT/qc-mft-reco_direct.json b/Modules/MFT/qc-mft-reco_direct.json index 46803f45b7..e2f99fdacb 100644 --- a/Modules/MFT/qc-mft-reco_direct.json +++ b/Modules/MFT/qc-mft-reco_direct.json @@ -2,8 +2,8 @@ "qc": { "config": { "database": { - "implementation": "CCDB", - "host": "dummy_qcdb.cern.ch:8083", + "implementation": "Dummy", + "host": "not_applicable", "username": "not_applicable", "password": "not_applicable", "name": "not_applicable" @@ -16,10 +16,10 @@ "url": "infologger:///debug?qc" }, "consul": { - "url": "dummy_aliecs.cern.ch:8500" + "url": "" }, "conditionDB": { - "url": "dummy_qcdb.cern.ch:8083" + "url": "qcdb.cern.ch:8083" } }, "tasks": { @@ -40,7 +40,7 @@ "MaxTrackROFSize": "1000", "MaxClusterROFSize": "5000", "MaxDuration": "60000", - "TimeBinSize": "0.01", + "TimeBinSize": "0.1", "RefOrbit": "0" }, "location": "remote" diff --git a/Modules/MFT/src/QcMFTRecoTaskExtra.cxx b/Modules/MFT/src/QcMFTRecoTask.cxx similarity index 95% rename from Modules/MFT/src/QcMFTRecoTaskExtra.cxx rename to Modules/MFT/src/QcMFTRecoTask.cxx index 9a04de1533..b4813ed0f3 100644 --- a/Modules/MFT/src/QcMFTRecoTaskExtra.cxx +++ b/Modules/MFT/src/QcMFTRecoTask.cxx @@ -10,7 +10,7 @@ // or submit itself to any jurisdiction. /// -/// \file QcMFTRecoTaskExtra.cxx +/// \file QcMFTRecoTask.cxx /// \author Tomas Herman /// \author Guillermo Contreras /// \author Diana Maria Krupova @@ -28,21 +28,21 @@ #include // Quality Control #include "QualityControl/QcInfoLogger.h" -#include "MFT/QcMFTRecoTaskExtra.h" +#include "MFT/QcMFTRecoTask.h" namespace o2::quality_control_modules::mft { -QcMFTRecoTaskExt::~QcMFTRecoTaskExt() +QcMFTRecoTask::~QcMFTRecoTask() { /* not needed for unique pointers */ } -void QcMFTRecoTaskExt::initialize(o2::framework::InitContext& /*ctx*/) +void QcMFTRecoTask::initialize(o2::framework::InitContext& /*ctx*/) { - ILOG(Info, Support) << "initialize QcMFTRecoTaskExt" << ENDM; // QcInfoLogger is used. FairMQ logs will go to there as well. + ILOG(Info, Support) << "initialize QcMFTRecoTask" << ENDM; // QcInfoLogger is used. FairMQ logs will go to there as well. mTrackNumberOfClusters = std::make_unique("mMFTTrackNumberOfClusters", "Number Of Clusters Per Track; # clusters; # entries", 10, 0.5, 10.5); @@ -183,7 +183,7 @@ void QcMFTRecoTaskExt::initialize(o2::framework::InitContext& /*ctx*/) } } -void QcMFTRecoTaskExt::startOfActivity(Activity& /*activity*/) +void QcMFTRecoTask::startOfActivity(Activity& /*activity*/) { ILOG(Info, Support) << "startOfActivity" << ENDM; @@ -214,12 +214,12 @@ void QcMFTRecoTaskExt::startOfActivity(Activity& /*activity*/) mClusterPatternIndex->Reset(); } -void QcMFTRecoTaskExt::startOfCycle() +void QcMFTRecoTask::startOfCycle() { ILOG(Info, Support) << "startOfCycle" << ENDM; } -void QcMFTRecoTaskExt::monitorData(o2::framework::ProcessingContext& ctx) +void QcMFTRecoTask::monitorData(o2::framework::ProcessingContext& ctx) { // get the tracks const auto tracks = ctx.inputs().get>("tracks"); @@ -288,17 +288,17 @@ void QcMFTRecoTaskExt::monitorData(o2::framework::ProcessingContext& ctx) } } -void QcMFTRecoTaskExt::endOfCycle() +void QcMFTRecoTask::endOfCycle() { ILOG(Info, Support) << "endOfCycle" << ENDM; } -void QcMFTRecoTaskExt::endOfActivity(Activity& /*activity*/) +void QcMFTRecoTask::endOfActivity(Activity& /*activity*/) { ILOG(Info, Support) << "endOfActivity" << ENDM; } -void QcMFTRecoTaskExt::reset() +void QcMFTRecoTask::reset() { // clean all the monitor objects here From 652a29efc8585fc1071f40b720c1f88cbd916707 Mon Sep 17 00:00:00 2001 From: Rafael Pezzi Date: Fri, 26 Nov 2021 18:57:28 +0100 Subject: [PATCH 5/6] Improvements on QcMFTAsyncTask Addressing issues spotted by Tomas Herman --- Modules/MFT/CMakeLists.txt | 6 +- Modules/MFT/include/MFT/LinkDef.h | 2 +- .../MFT/{QcMFTRecoTask.h => QcMFTAsyncTask.h} | 66 +++--- .../{qc-mft-reco.json => qc-mft-async.json} | 33 +-- ...o_direct.json => qc-mft-async_direct.json} | 23 +- .../{QcMFTRecoTask.cxx => QcMFTAsyncTask.cxx} | 210 ++++++++---------- 6 files changed, 144 insertions(+), 196 deletions(-) rename Modules/MFT/include/MFT/{QcMFTRecoTask.h => QcMFTAsyncTask.h} (54%) rename Modules/MFT/{qc-mft-reco.json => qc-mft-async.json} (67%) rename Modules/MFT/{qc-mft-reco_direct.json => qc-mft-async_direct.json} (70%) rename Modules/MFT/src/{QcMFTRecoTask.cxx => QcMFTAsyncTask.cxx} (59%) diff --git a/Modules/MFT/CMakeLists.txt b/Modules/MFT/CMakeLists.txt index b521b5ec7c..93f25f69bb 100644 --- a/Modules/MFT/CMakeLists.txt +++ b/Modules/MFT/CMakeLists.txt @@ -9,7 +9,7 @@ target_sources(O2QcMFT PRIVATE src/QcMFTClusterTask.cxx src/QcMFTTrackCheck.cxx src/QcMFTTrackTask.cxx - src/QcMFTRecoTask.cxx + src/QcMFTAsyncTask.cxx src/QcMFTReadoutCheck.cxx src/QcMFTReadoutTask.cxx) @@ -34,7 +34,7 @@ add_root_dictionary(O2QcMFT include/MFT/QcMFTClusterTask.h include/MFT/QcMFTTrackCheck.h include/MFT/QcMFTTrackTask.h - include/MFT/QcMFTRecoTask.h + include/MFT/QcMFTAsyncTask.h include/MFT/QcMFTReadoutCheck.h include/MFT/QcMFTReadoutTask.h include/MFT/QcMFTUtilTables.h @@ -94,4 +94,6 @@ install(FILES qc-mft-digit.json qc-mft-cluster.json qc-mft-track.json qc-mft-readout.json + qc-mft-async.json + qc-mft-async_direct.json DESTINATION etc) diff --git a/Modules/MFT/include/MFT/LinkDef.h b/Modules/MFT/include/MFT/LinkDef.h index 61e070b010..6f78273ac0 100644 --- a/Modules/MFT/include/MFT/LinkDef.h +++ b/Modules/MFT/include/MFT/LinkDef.h @@ -8,7 +8,7 @@ #pragma link C++ class o2::quality_control_modules::mft::QcMFTClusterTask + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTClusterCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTTrackTask + ; -#pragma link C++ class o2::quality_control_modules::mft::QcMFTRecoTask + ; +#pragma link C++ class o2::quality_control_modules::mft::QcMFTAsyncTask + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTTrackCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTReadoutCheck + ; #pragma link C++ class o2::quality_control_modules::mft::QcMFTReadoutTask + ; diff --git a/Modules/MFT/include/MFT/QcMFTRecoTask.h b/Modules/MFT/include/MFT/QcMFTAsyncTask.h similarity index 54% rename from Modules/MFT/include/MFT/QcMFTRecoTask.h rename to Modules/MFT/include/MFT/QcMFTAsyncTask.h index deb27dde65..4040d767dd 100644 --- a/Modules/MFT/include/MFT/QcMFTRecoTask.h +++ b/Modules/MFT/include/MFT/QcMFTAsyncTask.h @@ -10,14 +10,14 @@ // or submit itself to any jurisdiction. /// -/// \file QcMFTRecoTask.h +/// \file QcMFTAsyncTask.h /// \author Tomas Herman /// \author Guillermo Contreras /// \author Diana Maria Krupova /// \author Katarina Krizkova Gajdosova -#ifndef QC_MFT_RECO_TASKEXTRA_H -#define QC_MFT_RECO_TASKEXTRA_H +#ifndef QC_MFT_ASYNC_TASK_H +#define QC_MFT_ASYNC_TASK_H // ROOT #include @@ -33,17 +33,15 @@ using namespace std; namespace o2::quality_control_modules::mft { -static constexpr array minNClustersList = { 4, 5, 6, 7, 8, 9, 10 }; - -/// \brief MFT Track QC task +/// \brief MFT Async QC task /// -class QcMFTRecoTask /*final*/ : public TaskInterface // todo add back the "final" when doxygen is fixed +class QcMFTAsyncTask /*final*/ : public TaskInterface // todo add back the "final" when doxygen is fixed { public: /// \brief Constructor - QcMFTRecoTask() = default; + QcMFTAsyncTask() = default; /// Destructor - ~QcMFTRecoTask() override; + ~QcMFTAsyncTask() override; // Definition of the methods for the template method pattern void initialize(o2::framework::InitContext& ctx) override; @@ -60,36 +58,38 @@ class QcMFTRecoTask /*final*/ : public TaskInterface // todo add back the "final } private: - unique_ptr mTrackNumberOfClusters = nullptr; - unique_ptr mCATrackNumberOfClusters = nullptr; - unique_ptr mLTFTrackNumberOfClusters = nullptr; - unique_ptr mTrackOnvQPt = nullptr; - unique_ptr mTrackChi2 = nullptr; - unique_ptr mTrackCharge = nullptr; - unique_ptr mTrackPhi = nullptr; - unique_ptr mPositiveTrackPhi = nullptr; - unique_ptr mNegativeTrackPhi = nullptr; - unique_ptr mTrackEta = nullptr; - array, 7> mTrackEtaNCls = { nullptr }; - array, 7> mTrackPhiNCls = { nullptr }; - array, 7> mTrackXYNCls = { nullptr }; - unique_ptr mCATrackEta = nullptr; - unique_ptr mLTFTrackEta = nullptr; - unique_ptr mTrackTanl = nullptr; - - unique_ptr mTrackROFNEntries = nullptr; - unique_ptr mClusterROFNEntries = nullptr; - unique_ptr mTracksBC = nullptr; - - unique_ptr mNOfTracksTime = nullptr; - unique_ptr mNOfClustersTime = nullptr; + std::unique_ptr mTrackNumberOfClusters = nullptr; + std::unique_ptr mCATrackNumberOfClusters = nullptr; + std::unique_ptr mLTFTrackNumberOfClusters = nullptr; + std::unique_ptr mTrackOnvQPt = nullptr; + std::unique_ptr mTrackChi2 = nullptr; + std::unique_ptr mTrackCharge = nullptr; + std::unique_ptr mTrackPhi = nullptr; + std::unique_ptr mPositiveTrackPhi = nullptr; + std::unique_ptr mNegativeTrackPhi = nullptr; + std::unique_ptr mTrackEta = nullptr; + std::array, 7> mTrackEtaNCls = { nullptr }; + std::array, 7> mTrackPhiNCls = { nullptr }; + std::array, 7> mTrackXYNCls = { nullptr }; + std::unique_ptr mCATrackEta = nullptr; + std::unique_ptr mLTFTrackEta = nullptr; + std::unique_ptr mTrackTanl = nullptr; + + std::unique_ptr mTrackROFNEntries = nullptr; + std::unique_ptr mClusterROFNEntries = nullptr; + std::unique_ptr mTracksBC = nullptr; + + std::unique_ptr mNOfTracksTime = nullptr; + std::unique_ptr mNOfClustersTime = nullptr; std::unique_ptr mClusterSensorIndex = nullptr; std::unique_ptr mClusterPatternIndex = nullptr; uint32_t mRefOrbit = 0; // Reference orbit used in relative time calculation + + static constexpr array sMinNClustersList = { 4, 5, 6, 7, 8, 9, 10 }; }; } // namespace o2::quality_control_modules::mft -#endif // QC_MFT_RECO_TASKEXTRA_H +#endif // QC_MFT_ASYNC_TASK_H diff --git a/Modules/MFT/qc-mft-reco.json b/Modules/MFT/qc-mft-async.json similarity index 67% rename from Modules/MFT/qc-mft-reco.json rename to Modules/MFT/qc-mft-async.json index dc70dfcc63..07ba09d38f 100644 --- a/Modules/MFT/qc-mft-reco.json +++ b/Modules/MFT/qc-mft-async.json @@ -3,7 +3,7 @@ "config": { "database": { "implementation": "CCDB", - "host": "qcdb.cern.ch:8083", + "host": "ccdb-test.cern.ch:8080", "username": "not_applicable", "password": "not_applicable", "name": "not_applicable" @@ -16,16 +16,16 @@ "url": "infologger:///debug?qc" }, "consul": { - "url": "aliecs.cern.ch:8500" + "url": "" }, "conditionDB": { - "url": "qcdb.cern.ch:8083" + "url": "ccdb-test.cern.ch:8080" } }, "tasks": { - "QcMFTRecoTask": { + "QcMFTAsync": { "active": "true", - "className": "o2::quality_control_modules::mft::QcMFTRecoTask", + "className": "o2::quality_control_modules::mft::QcMFTAsyncTask", "moduleName": "QcMFT", "detectorName": "MFT", "cycleDurationSeconds": "60", @@ -33,7 +33,7 @@ "dataSource_comment": "The other type of dataSource is \"direct\", see basic-no-sampling.json.", "dataSource": { "type": "dataSamplingPolicy", - "name": "mft-tracks" + "name": "mft-async" }, "taskParameters": { "ROFLengthInBC": "198", @@ -46,28 +46,11 @@ "location": "remote" } }, - "checks": { - "QcMFTTrackCheck": { - "active": "false", - "dataSource": [ - { - "type": "Task", - "name": "QcMFTRecoTask", - "MOs": [ - "mMFTTrackCharge" - ] - } - ], - "className": "o2::quality_control_modules::mft::QcMFTTrackCheck", - "moduleName": "QcMFT", - "detectorName": "MFT", - "policy": "OnAny" - } - } + "checks": {} }, "dataSamplingPolicies": [ { - "id": "mft-tracks", + "id": "mft-async", "active": "true", "machines": [], "query": "tracks:MFT/TRACKS/0;tracksrofs:MFT/MFTTrackROF/0;clusters:MFT/COMPCLUSTERS/0;clustersrofs:MFT/CLUSTERSROF/0", diff --git a/Modules/MFT/qc-mft-reco_direct.json b/Modules/MFT/qc-mft-async_direct.json similarity index 70% rename from Modules/MFT/qc-mft-reco_direct.json rename to Modules/MFT/qc-mft-async_direct.json index e2f99fdacb..7c9dbbfa3e 100644 --- a/Modules/MFT/qc-mft-reco_direct.json +++ b/Modules/MFT/qc-mft-async_direct.json @@ -23,9 +23,9 @@ } }, "tasks": { - "QcMFTRecoTask": { + "QcMFTAsync": { "active": "true", - "className": "o2::quality_control_modules::mft::QcMFTRecoTask", + "className": "o2::quality_control_modules::mft::QcMFTAsyncTask", "moduleName": "QcMFT", "detectorName": "MFT", "cycleDurationSeconds": "60", @@ -46,24 +46,7 @@ "location": "remote" } }, - "checks": { - "QcMFTTrackCheck": { - "active": "false", - "dataSource": [ - { - "type": "Task", - "name": "QcMFTRecoTask", - "MOs": [ - "mMFTTrackCharge" - ] - } - ], - "className": "o2::quality_control_modules::mft::QcMFTTrackCheck", - "moduleName": "QcMFT", - "detectorName": "MFT", - "policy": "OnAny" - } - } + "checks": {} }, "dataSamplingPolicies": [] } \ No newline at end of file diff --git a/Modules/MFT/src/QcMFTRecoTask.cxx b/Modules/MFT/src/QcMFTAsyncTask.cxx similarity index 59% rename from Modules/MFT/src/QcMFTRecoTask.cxx rename to Modules/MFT/src/QcMFTAsyncTask.cxx index b4813ed0f3..53c1adcb39 100644 --- a/Modules/MFT/src/QcMFTRecoTask.cxx +++ b/Modules/MFT/src/QcMFTAsyncTask.cxx @@ -10,7 +10,7 @@ // or submit itself to any jurisdiction. /// -/// \file QcMFTRecoTask.cxx +/// \file QcMFTAsyncTask.cxx /// \author Tomas Herman /// \author Guillermo Contreras /// \author Diana Maria Krupova @@ -28,162 +28,143 @@ #include // Quality Control #include "QualityControl/QcInfoLogger.h" -#include "MFT/QcMFTRecoTask.h" +#include "MFT/QcMFTAsyncTask.h" namespace o2::quality_control_modules::mft { -QcMFTRecoTask::~QcMFTRecoTask() +QcMFTAsyncTask::~QcMFTAsyncTask() { /* not needed for unique pointers */ } -void QcMFTRecoTask::initialize(o2::framework::InitContext& /*ctx*/) +void QcMFTAsyncTask::initialize(o2::framework::InitContext& /*ctx*/) { - ILOG(Info, Support) << "initialize QcMFTRecoTask" << ENDM; // QcInfoLogger is used. FairMQ logs will go to there as well. + ILOG(Info, Support) << "initialize QcMFTAsyncTask" << ENDM; // QcInfoLogger is used. FairMQ logs will go to there as well. - mTrackNumberOfClusters = std::make_unique("mMFTTrackNumberOfClusters", + // Loading custom parameters + auto MaxClusterROFSize = 5000; + if (auto param = mCustomParameters.find("MaxClusterROFSize"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - MaxClusterROFSize: " << param->second << ENDM; + MaxClusterROFSize = stoi(param->second); + } + + auto MaxTrackROFSize = 1000; + if (auto param = mCustomParameters.find("MaxTrackROFSize"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - MaxTrackROFSize: " << param->second << ENDM; + MaxTrackROFSize = stoi(param->second); + } + + auto ROFLengthInBC = 198; + if (auto param = mCustomParameters.find("ROFLengthInBC"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - ROFLengthInBC: " << param->second << ENDM; + ROFLengthInBC = stoi(param->second); + } + auto ROFsPerOrbit = o2::constants::lhc::LHCMaxBunches / ROFLengthInBC; + + auto MaxDuration = 60.f; + if (auto param = mCustomParameters.find("MaxDuration"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - MaxDuration: " << param->second << ENDM; + MaxDuration = stof(param->second); + } + + auto TimeBinSize = 0.01f; + if (auto param = mCustomParameters.find("TimeBinSize"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - TimeBinSize: " << param->second << ENDM; + TimeBinSize = stof(param->second); + } + + auto NofTimeBins = static_cast(MaxDuration / TimeBinSize); + + if (auto param = mCustomParameters.find("RefOrbit"); param != mCustomParameters.end()) { + ILOG(Info, Devel) << "Custom parameter - RefOrbit: " << param->second << ENDM; + mRefOrbit = static_cast(stoi(param->second)); + } + + // Creating histos + mTrackNumberOfClusters = std::make_unique("tracks/mMFTTrackNumberOfClusters", "Number Of Clusters Per Track; # clusters; # entries", 10, 0.5, 10.5); getObjectsManager()->startPublishing(mTrackNumberOfClusters.get()); - getObjectsManager()->addMetadata(mTrackNumberOfClusters->GetName(), "custom", "34"); - mCATrackNumberOfClusters = std::make_unique("CA/mMFTCATrackNumberOfClusters", + mCATrackNumberOfClusters = std::make_unique("tracks/CA/mMFTCATrackNumberOfClusters", "Number Of Clusters Per CA Track; # clusters; # tracks", 10, 0.5, 10.5); getObjectsManager()->startPublishing(mCATrackNumberOfClusters.get()); - getObjectsManager()->addMetadata(mCATrackNumberOfClusters->GetName(), "custom", "34"); - mLTFTrackNumberOfClusters = std::make_unique("LTF/mMFTLTFTrackNumberOfClusters", + mLTFTrackNumberOfClusters = std::make_unique("tracks/LTF/mMFTLTFTrackNumberOfClusters", "Number Of Clusters Per LTF Track; # clusters; # entries", 10, 0.5, 10.5); getObjectsManager()->startPublishing(mLTFTrackNumberOfClusters.get()); - getObjectsManager()->addMetadata(mLTFTrackNumberOfClusters->GetName(), "custom", "34"); - mTrackOnvQPt = std::make_unique("mMFTTrackOnvQPt", "Track q/p_{T}; q/p_{T} [1/GeV]; # entries", 50, -2, 2); + mTrackOnvQPt = std::make_unique("tracks/mMFTTrackOnvQPt", "Track q/p_{T}; q/p_{T} [1/GeV]; # entries", 50, -2, 2); getObjectsManager()->startPublishing(mTrackOnvQPt.get()); - getObjectsManager()->addMetadata(mTrackOnvQPt->GetName(), "custom", "34"); - mTrackChi2 = std::make_unique("mMFTTrackChi2", "Track #chi^{2}; #chi^{2}; # entries", 21, -0.5, 20.5); + mTrackChi2 = std::make_unique("tracks/mMFTTrackChi2", "Track #chi^{2}; #chi^{2}; # entries", 21, -0.5, 20.5); getObjectsManager()->startPublishing(mTrackChi2.get()); - getObjectsManager()->addMetadata(mTrackChi2->GetName(), "custom", "34"); - mTrackCharge = std::make_unique("mMFTTrackCharge", "Track Charge; q; # entries", 3, -1.5, 1.5); + mTrackCharge = std::make_unique("tracks/mMFTTrackCharge", "Track Charge; q; # entries", 3, -1.5, 1.5); getObjectsManager()->startPublishing(mTrackCharge.get()); - getObjectsManager()->addMetadata(mTrackCharge->GetName(), "custom", "34"); - mTrackPhi = std::make_unique("mMFTTrackPhi", "Track #phi; #phi; # entries", 100, -3.2, 3.2); + mTrackPhi = std::make_unique("tracks/mMFTTrackPhi", "Track #phi; #phi; # entries", 100, -3.2, 3.2); getObjectsManager()->startPublishing(mTrackPhi.get()); - getObjectsManager()->addMetadata(mTrackPhi->GetName(), "custom", "34"); - mPositiveTrackPhi = std::make_unique("mMFTPositiveTrackPhi", "Positive Track #phi; #phi; # entries", 100, -3.2, 3.2); + mPositiveTrackPhi = std::make_unique("tracks/mMFTPositiveTrackPhi", "Positive Track #phi; #phi; # entries", 100, -3.2, 3.2); getObjectsManager()->startPublishing(mPositiveTrackPhi.get()); - getObjectsManager()->addMetadata(mPositiveTrackPhi->GetName(), "custom", "34"); - mNegativeTrackPhi = std::make_unique("mMFTNegativeTrackPhi", "Negative Track #phi; #phi; # entries", 100, -3.2, 3.2); + mNegativeTrackPhi = std::make_unique("tracks/mMFTNegativeTrackPhi", "Negative Track #phi; #phi; # entries", 100, -3.2, 3.2); getObjectsManager()->startPublishing(mNegativeTrackPhi.get()); - getObjectsManager()->addMetadata(mNegativeTrackPhi->GetName(), "custom", "34"); - mTrackEta = std::make_unique("mMFTTrackEta", "Track #eta; #eta; # entries", 50, -4, -2); + mTrackEta = std::make_unique("tracks/mMFTTrackEta", "Track #eta; #eta; # entries", 50, -4, -2); getObjectsManager()->startPublishing(mTrackEta.get()); - getObjectsManager()->addMetadata(mTrackEta->GetName(), "custom", "34"); - auto nHisto = 0; - for (auto minNClusters : minNClustersList) { - mTrackEtaNCls[nHisto] = std::make_unique(Form("mMFTTrackEta_%d_MinClusters", minNClusters), Form("Track #eta (NCls >= %d); #eta; # entries", minNClusters), 50, -4, -2); + for (auto minNClusters : sMinNClustersList) { + auto nHisto = minNClusters - sMinNClustersList[0]; + mTrackEtaNCls[nHisto] = std::make_unique(Form("tracks/mMFTTrackEta_%d_MinClusters", minNClusters), Form("Track #eta (NCls >= %d); #eta; # entries", minNClusters), 50, -4, -2); getObjectsManager()->startPublishing(mTrackEtaNCls[nHisto].get()); - getObjectsManager()->addMetadata(mTrackEtaNCls[nHisto]->GetName(), "custom", "34"); - mTrackPhiNCls[nHisto] = std::make_unique(Form("mMFTTrackPhi_%d_MinClusters", minNClusters), Form("Track #phi (NCls >= %d); #phi; # entries", minNClusters), 100, -3.2, 3.2); + mTrackPhiNCls[nHisto] = std::make_unique(Form("tracks/mMFTTrackPhi_%d_MinClusters", minNClusters), Form("Track #phi (NCls >= %d); #phi; # entries", minNClusters), 100, -3.2, 3.2); getObjectsManager()->startPublishing(mTrackPhiNCls[nHisto].get()); - getObjectsManager()->addMetadata(mTrackPhiNCls[nHisto]->GetName(), "custom", "34"); - mTrackXYNCls[nHisto] = std::make_unique(Form("mMFTTrackXY_%d_MinClusters", minNClusters), Form("Track Position (NCls >= %d); x; y", minNClusters), 320, -16, 16, 320, -16, 16); + mTrackXYNCls[nHisto] = std::make_unique(Form("tracks/mMFTTrackXY_%d_MinClusters", minNClusters), Form("Track Position (NCls >= %d); x; y", minNClusters), 320, -16, 16, 320, -16, 16); mTrackXYNCls[nHisto]->SetOption("COLZ"); getObjectsManager()->startPublishing(mTrackXYNCls[nHisto].get()); - getObjectsManager()->addMetadata(mTrackXYNCls[nHisto]->GetName(), "custom", "34"); - - nHisto++; } - mCATrackEta = std::make_unique("CA/mMFTCATrackEta", "CA Track #eta; #eta; # entries", 50, -4, -2); + mCATrackEta = std::make_unique("tracks/CA/mMFTCATrackEta", "CA Track #eta; #eta; # entries", 50, -4, -2); getObjectsManager()->startPublishing(mCATrackEta.get()); - getObjectsManager()->addMetadata(mCATrackEta->GetName(), "custom", "34"); - mLTFTrackEta = std::make_unique("LTF/mMFTLTFTrackEta", "LTF Track #eta; #eta; # entries", 50, -4, -2); + mLTFTrackEta = std::make_unique("tracks/LTF/mMFTLTFTrackEta", "LTF Track #eta; #eta; # entries", 50, -4, -2); getObjectsManager()->startPublishing(mLTFTrackEta.get()); - getObjectsManager()->addMetadata(mLTFTrackEta->GetName(), "custom", "34"); - mTrackTanl = std::make_unique("mMFTTrackTanl", "Track tan #lambda; tan #lambda; # entries", 100, -25, 0); + mTrackTanl = std::make_unique("tracks/mMFTTrackTanl", "Track tan #lambda; tan #lambda; # entries", 100, -25, 0); getObjectsManager()->startPublishing(mTrackTanl.get()); - getObjectsManager()->addMetadata(mTrackTanl->GetName(), "custom", "34"); - auto MaxClusterROFSize = 5000; - if (auto param = mCustomParameters.find("MaxClusterROFSize"); param != mCustomParameters.end()) { - ILOG(Info, Devel) << "Custom parameter - MaxClusterROFSize: " << param->second << ENDM; - MaxClusterROFSize = stoi(param->second); - } - mClusterROFNEntries = std::make_unique("mMFTClustersROFSize", "MFT Cluster ROFs size; ROF Size; # entries", MaxClusterROFSize, 0, MaxClusterROFSize); + mClusterROFNEntries = std::make_unique("clusters/mMFTClustersROFSize", "MFT Cluster ROFs size; ROF Size; # entries", MaxClusterROFSize, 0, MaxClusterROFSize); getObjectsManager()->startPublishing(mClusterROFNEntries.get()); - getObjectsManager()->addMetadata(mClusterROFNEntries->GetName(), "custom", "34"); - auto MaxTrackROFSize = 1000; - if (auto param = mCustomParameters.find("MaxTrackROFSize"); param != mCustomParameters.end()) { - ILOG(Info, Devel) << "Custom parameter - MaxTrackROFSize: " << param->second << ENDM; - MaxTrackROFSize = stoi(param->second); - } - mTrackROFNEntries = std::make_unique("mMFTTrackROFSize", "MFT Track ROFs size; ROF Size; # entries", MaxTrackROFSize, 0, MaxTrackROFSize); + mTrackROFNEntries = std::make_unique("tracks/mMFTTrackROFSize", "MFT Track ROFs size; ROF Size; # entries", MaxTrackROFSize, 0, MaxTrackROFSize); getObjectsManager()->startPublishing(mTrackROFNEntries.get()); - getObjectsManager()->addMetadata(mTrackROFNEntries->GetName(), "custom", "34"); - - auto ROFLengthInBC = 198; - if (auto param = mCustomParameters.find("ROFLengthInBC"); param != mCustomParameters.end()) { - ILOG(Info, Devel) << "Custom parameter - ROFLengthInBC: " << param->second << ENDM; - ROFLengthInBC = stoi(param->second); - } - auto ROFsPerOrbit = o2::constants::lhc::LHCMaxBunches / ROFLengthInBC; - mTracksBC = std::make_unique("mtracksBC", "Tracks per BC (sum over orbits); BCid; # entries", ROFsPerOrbit, 0, o2::constants::lhc::LHCMaxBunches); + mTracksBC = std::make_unique("tracks/mMFTTracksBC", "Tracks per BC (sum over orbits); BCid; # entries", ROFsPerOrbit, 0, o2::constants::lhc::LHCMaxBunches); mTracksBC->SetMinimum(0.1); getObjectsManager()->startPublishing(mTracksBC.get()); - getObjectsManager()->addMetadata(mTracksBC->GetName(), "custom", "34"); - - auto MaxDuration = 60.f; - if (auto param = mCustomParameters.find("MaxDuration"); param != mCustomParameters.end()) { - ILOG(Info, Devel) << "Custom parameter - MaxDuration: " << param->second << ENDM; - MaxDuration = stof(param->second); - } - - auto TimeBinSize = 0.01f; - if (auto param = mCustomParameters.find("TimeBinSize"); param != mCustomParameters.end()) { - ILOG(Info, Devel) << "Custom parameter - TimeBinSize: " << param->second << ENDM; - TimeBinSize = stof(param->second); - } - - auto NofTimeBins = static_cast(MaxDuration / TimeBinSize); - mNOfTracksTime = std::make_unique("mNOfTracksTime", "Number of tracks per time bin; time (s); # entries", NofTimeBins, 0, MaxDuration); + mNOfTracksTime = std::make_unique("tracks/mNOfTracksTime", "Number of tracks per time bin; time (s); # entries", NofTimeBins, 0, MaxDuration); mNOfTracksTime->SetMinimum(0.1); getObjectsManager()->startPublishing(mNOfTracksTime.get()); - getObjectsManager()->addMetadata(mNOfTracksTime->GetName(), "custom", "34"); - mNOfClustersTime = std::make_unique("mNOfClustersTime", "Number of clusters per time bin; time (s); # entries", NofTimeBins, 0, MaxDuration); + mNOfClustersTime = std::make_unique("clusters/mNOfClustersTime", "Number of clusters per time bin; time (s); # entries", NofTimeBins, 0, MaxDuration); mNOfClustersTime->SetMinimum(0.1); getObjectsManager()->startPublishing(mNOfClustersTime.get()); - getObjectsManager()->addMetadata(mNOfClustersTime->GetName(), "custom", "34"); - mClusterSensorIndex = std::make_unique("mMFTClusterSensorIndex", "Chip Cluster Occupancy;Chip ID;#Entries", 936, -0.5, 935.5); + mClusterSensorIndex = std::make_unique("clusters/mMFTClusterSensorIndex", "Chip Cluster Occupancy;Chip ID;#Entries", 936, -0.5, 935.5); getObjectsManager()->startPublishing(mClusterSensorIndex.get()); - mClusterPatternIndex = std::make_unique("mMFTClusterPatternIndex", "Cluster Pattern ID;Pattern ID;#Entries", 300, -0.5, 299.5); + mClusterPatternIndex = std::make_unique("clusters/mMFTClusterPatternIndex", "Cluster Pattern ID;Pattern ID;#Entries", 300, -0.5, 299.5); getObjectsManager()->startPublishing(mClusterPatternIndex.get()); - - if (auto param = mCustomParameters.find("RefOrbit"); param != mCustomParameters.end()) { - ILOG(Info, Devel) << "Custom parameter - RefOrbit: " << param->second << ENDM; - mRefOrbit = static_cast(stoi(param->second)); - } } -void QcMFTRecoTask::startOfActivity(Activity& /*activity*/) +void QcMFTAsyncTask::startOfActivity(Activity& /*activity*/) { ILOG(Info, Support) << "startOfActivity" << ENDM; @@ -197,8 +178,8 @@ void QcMFTRecoTask::startOfActivity(Activity& /*activity*/) mPositiveTrackPhi->Reset(); mNegativeTrackPhi->Reset(); mTrackEta->Reset(); - auto nHisto = 0; - for (auto minNClusters : minNClustersList) { + for (auto minNClusters : sMinNClustersList) { + auto nHisto = minNClusters - sMinNClustersList[0]; mTrackEtaNCls[nHisto]->Reset(); mTrackPhiNCls[nHisto]->Reset(); mTrackXYNCls[nHisto]->Reset(); @@ -214,32 +195,22 @@ void QcMFTRecoTask::startOfActivity(Activity& /*activity*/) mClusterPatternIndex->Reset(); } -void QcMFTRecoTask::startOfCycle() +void QcMFTAsyncTask::startOfCycle() { ILOG(Info, Support) << "startOfCycle" << ENDM; } -void QcMFTRecoTask::monitorData(o2::framework::ProcessingContext& ctx) +void QcMFTAsyncTask::monitorData(o2::framework::ProcessingContext& ctx) { // get the tracks const auto tracks = ctx.inputs().get>("tracks"); const auto tracksrofs = ctx.inputs().get>("tracksrofs"); + // get clusters const auto clusters = ctx.inputs().get>("clusters"); const auto clustersrofs = ctx.inputs().get>("clustersrofs"); - if (!tracks.size()) { - return; - } - // fill the histograms - - for (const auto& rof : tracksrofs) { - mTrackROFNEntries->Fill(rof.getNEntries()); - mTracksBC->Fill(rof.getBCData().bc, rof.getNEntries()); - float seconds = orbitToSeconds(rof.getBCData().orbit, mRefOrbit) + rof.getBCData().bc * o2::constants::lhc::LHCBunchSpacingNS * 1e-9; - mNOfTracksTime->Fill(seconds, rof.getNEntries()); - } - + // Fill the clusters histograms for (const auto& rof : clustersrofs) { mClusterROFNEntries->Fill(rof.getNEntries()); float seconds = orbitToSeconds(rof.getBCData().orbit, mRefOrbit) + rof.getBCData().bc * o2::constants::lhc::LHCBunchSpacingNS * 1e-9; @@ -251,6 +222,15 @@ void QcMFTRecoTask::monitorData(o2::framework::ProcessingContext& ctx) mClusterPatternIndex->Fill(oneCluster.getPatternID()); } + // fill the tracks histogram + + for (const auto& rof : tracksrofs) { + mTrackROFNEntries->Fill(rof.getNEntries()); + mTracksBC->Fill(rof.getBCData().bc, rof.getNEntries()); + float seconds = orbitToSeconds(rof.getBCData().orbit, mRefOrbit) + rof.getBCData().bc * o2::constants::lhc::LHCBunchSpacingNS * 1e-9; + mNOfTracksTime->Fill(seconds, rof.getNEntries()); + } + for (auto& oneTrack : tracks) { mTrackNumberOfClusters->Fill(oneTrack.getNumberOfPoints()); mTrackChi2->Fill(oneTrack.getTrackChi2()); @@ -259,11 +239,11 @@ void QcMFTRecoTask::monitorData(o2::framework::ProcessingContext& ctx) mTrackEta->Fill(oneTrack.getEta()); mTrackTanl->Fill(oneTrack.getTanl()); - for (auto minNClusters : minNClustersList) { + for (auto minNClusters : sMinNClustersList) { if (oneTrack.getNumberOfPoints() >= minNClusters) { - mTrackEtaNCls[minNClusters - minNClustersList[0]]->Fill(oneTrack.getEta()); - mTrackPhiNCls[minNClusters - minNClustersList[0]]->Fill(oneTrack.getPhi()); - mTrackXYNCls[minNClusters - minNClustersList[0]]->Fill(oneTrack.getX(), oneTrack.getY()); + mTrackEtaNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getEta()); + mTrackPhiNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getPhi()); + mTrackXYNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getX(), oneTrack.getY()); } } @@ -288,17 +268,17 @@ void QcMFTRecoTask::monitorData(o2::framework::ProcessingContext& ctx) } } -void QcMFTRecoTask::endOfCycle() +void QcMFTAsyncTask::endOfCycle() { ILOG(Info, Support) << "endOfCycle" << ENDM; } -void QcMFTRecoTask::endOfActivity(Activity& /*activity*/) +void QcMFTAsyncTask::endOfActivity(Activity& /*activity*/) { ILOG(Info, Support) << "endOfActivity" << ENDM; } -void QcMFTRecoTask::reset() +void QcMFTAsyncTask::reset() { // clean all the monitor objects here @@ -314,8 +294,8 @@ void QcMFTRecoTask::reset() mPositiveTrackPhi->Reset(); mNegativeTrackPhi->Reset(); mTrackEta->Reset(); - auto nHisto = 0; - for (auto minNClusters : minNClustersList) { + for (auto minNClusters : sMinNClustersList) { + auto nHisto = minNClusters - sMinNClustersList[0]; mTrackEtaNCls[nHisto]->Reset(); mTrackPhiNCls[nHisto]->Reset(); mTrackXYNCls[nHisto]->Reset(); From 021cd2e6ba18e3e3e7c264acc6f9a0e631d1b73e Mon Sep 17 00:00:00 2001 From: Rafael Pezzi Date: Sat, 27 Nov 2021 19:12:29 +0100 Subject: [PATCH 6/6] Adding histogram for Eta-Phi track distribution --- Modules/MFT/include/MFT/QcMFTAsyncTask.h | 1 + Modules/MFT/src/QcMFTAsyncTask.cxx | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/Modules/MFT/include/MFT/QcMFTAsyncTask.h b/Modules/MFT/include/MFT/QcMFTAsyncTask.h index 4040d767dd..ff2ed39fe8 100644 --- a/Modules/MFT/include/MFT/QcMFTAsyncTask.h +++ b/Modules/MFT/include/MFT/QcMFTAsyncTask.h @@ -71,6 +71,7 @@ class QcMFTAsyncTask /*final*/ : public TaskInterface // todo add back the "fina std::array, 7> mTrackEtaNCls = { nullptr }; std::array, 7> mTrackPhiNCls = { nullptr }; std::array, 7> mTrackXYNCls = { nullptr }; + std::array, 7> mTrackEtaPhiNCls = { nullptr }; std::unique_ptr mCATrackEta = nullptr; std::unique_ptr mLTFTrackEta = nullptr; std::unique_ptr mTrackTanl = nullptr; diff --git a/Modules/MFT/src/QcMFTAsyncTask.cxx b/Modules/MFT/src/QcMFTAsyncTask.cxx index 53c1adcb39..9d3ceca3ee 100644 --- a/Modules/MFT/src/QcMFTAsyncTask.cxx +++ b/Modules/MFT/src/QcMFTAsyncTask.cxx @@ -128,6 +128,10 @@ void QcMFTAsyncTask::initialize(o2::framework::InitContext& /*ctx*/) mTrackXYNCls[nHisto] = std::make_unique(Form("tracks/mMFTTrackXY_%d_MinClusters", minNClusters), Form("Track Position (NCls >= %d); x; y", minNClusters), 320, -16, 16, 320, -16, 16); mTrackXYNCls[nHisto]->SetOption("COLZ"); getObjectsManager()->startPublishing(mTrackXYNCls[nHisto].get()); + + mTrackEtaPhiNCls[nHisto] = std::make_unique(Form("tracks/mMFTTrackEtaPhi_%d_MinClusters", minNClusters), Form("Track #eta , #phi (NCls >= %d); #eta; #phi", minNClusters), 50, -4, -2, 100, -3.2, 3.2); + mTrackEtaPhiNCls[nHisto]->SetOption("COLZ"); + getObjectsManager()->startPublishing(mTrackEtaPhiNCls[nHisto].get()); } mCATrackEta = std::make_unique("tracks/CA/mMFTCATrackEta", "CA Track #eta; #eta; # entries", 50, -4, -2); @@ -183,6 +187,7 @@ void QcMFTAsyncTask::startOfActivity(Activity& /*activity*/) mTrackEtaNCls[nHisto]->Reset(); mTrackPhiNCls[nHisto]->Reset(); mTrackXYNCls[nHisto]->Reset(); + mTrackEtaPhiNCls[nHisto]->Reset(); } mCATrackEta->Reset(); mLTFTrackEta->Reset(); @@ -244,6 +249,7 @@ void QcMFTAsyncTask::monitorData(o2::framework::ProcessingContext& ctx) mTrackEtaNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getEta()); mTrackPhiNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getPhi()); mTrackXYNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getX(), oneTrack.getY()); + mTrackEtaPhiNCls[minNClusters - sMinNClustersList[0]]->Fill(oneTrack.getEta(), oneTrack.getPhi()); } } @@ -299,6 +305,7 @@ void QcMFTAsyncTask::reset() mTrackEtaNCls[nHisto]->Reset(); mTrackPhiNCls[nHisto]->Reset(); mTrackXYNCls[nHisto]->Reset(); + mTrackEtaPhiNCls[nHisto]->Reset(); } mCATrackEta->Reset(); mLTFTrackEta->Reset();