diff --git a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx index ab35ad8b31f..98818bd1a80 100644 --- a/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMakerMC_withAssoc.cxx @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -64,9 +65,9 @@ #include +#include #include #include -#include #include #include #include @@ -74,9 +75,6 @@ #include #include -using std::cout; -using std::endl; - using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -134,6 +132,14 @@ constexpr static uint32_t gkMuonRealignFillMapWithCov = VarManager::ObjTypes::Mu constexpr static uint32_t gkMFTFillMap = VarManager::ObjTypes::TrackMFT; constexpr static uint32_t gkMFTCovFillMap = VarManager::ObjTypes::TrackMFT | VarManager::ObjTypes::MFTCov; +namespace dqtablemakermc_helpers +{ +inline float* varValues() { return static_cast(VarManager::fgValues); } +inline TString* varNames() { return static_cast(VarManager::fgVariableNames); } +inline TString* varUnits() { return static_cast(VarManager::fgVariableUnits); } +} // namespace dqtablemakermc_helpers + +/* template void PrintBitMap(TMap map, int nbits) { @@ -141,6 +147,7 @@ void PrintBitMap(TMap map, int nbits) cout << ((map & (TMap(1) << i)) > 0 ? "1" : "0"); } } +*/ struct TableMakerMC { @@ -177,7 +184,7 @@ struct TableMakerMC { OutputObj fOutputList{"output"}; OutputObj fStatsList{"Statistics"}; //! skimming statistics - HistogramManager* fHistMan; + HistogramManager* fHistMan = nullptr; Configurable fIsRun2{"cfgIsRun2", false, "Whether we analyze Run-2 or Run-3 data"}; @@ -250,18 +257,18 @@ struct TableMakerMC { Configurable> fModelNames{"cfgModelNames", std::vector{"model.onnx"}, "ONNX file names for each pT bin (if not from CCDB full path)"}; } fConfigVariousOptions; - Service fCCDB; + Service fCCDB{}; o2::ccdb::CcdbApi fCCDBApi; o2::parameters::GRPObject* fGrpMagRun2 = nullptr; // for run 2, we access the GRPObject from GLO/GRP/GRP o2::parameters::GRPMagField* fGrpMag = nullptr; // for run 3, we access GRPMagField from GLO/Config/GRPMagField - AnalysisCompositeCut* fEventCut; //! Event selection cut + AnalysisCompositeCut* fEventCut = nullptr; //! Event selection cut std::vector fTrackCuts; //! Barrel track cuts std::vector fMuonCuts; //! Muon track cuts bool fDoDetailedQA = false; // Bool to set detailed QA true, if QA is set true - int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. + int fCurrentRun = -1; // needed to detect if the run changed and trigger update of calibrations etc. // list of MCsignal objects std::vector fMCSignals; @@ -280,7 +287,7 @@ struct TableMakerMC { o2::analysis::MlResponseMFTMuonMatch matchingMlResponse; std::vector binsPtMl; - std::array cutValues; + std::array cutValues{}; std::vector cutDirMl; // RCT flag checker @@ -334,7 +341,7 @@ struct TableMakerMC { fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); fHistMan->SetUseDefaultVariableNames(kTRUE); - fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); + fHistMan->SetDefaultVarNames(dqtablemakermc_helpers::varNames(), dqtablemakermc_helpers::varUnits()); // Only use detailed QA when QA is set true if (fConfigHistOutput.fConfigQA && fConfigHistOutput.fConfigDetailedQA) { @@ -360,7 +367,7 @@ struct TableMakerMC { } // Barrel track histograms after cuts; one directory per cut if (fConfigHistOutput.fConfigQA) { - for (auto& cut : fTrackCuts) { + for (const auto& cut : fTrackCuts) { histClasses += Form("TrackBarrel_%s;", cut->GetName()); } } @@ -373,7 +380,7 @@ struct TableMakerMC { } // Muon track histograms after cuts; one directory per cut if (fConfigHistOutput.fConfigQA) { - for (auto& muonCut : fMuonCuts) { + for (const auto& muonCut : fMuonCuts) { histClasses += Form("Muons_%s;", muonCut->GetName()); } } @@ -386,7 +393,7 @@ struct TableMakerMC { // loop over MC signals and add them to the signals array for (int isig = 0; isig < objArray->GetEntries(); ++isig) { MCSignal* sig = o2::aod::dqmcsignals::GetMCSignal(objArray->At(isig)->GetName()); - if (sig) { + if (sig != nullptr) { fMCSignals.push_back(sig); } } @@ -395,27 +402,27 @@ struct TableMakerMC { TString addMCSignalsStr = fConfigMCSignalsJSON.value; if (addMCSignalsStr != "") { std::vector addMCSignals = dqmcsignals::GetMCSignalsFromJSON(addMCSignalsStr.Data()); - for (auto& mcIt : addMCSignals) { - if (mcIt) { + for (const auto& mcIt : addMCSignals) { + if (mcIt != nullptr) { fMCSignals.push_back(mcIt); } } } - for (auto& mcIt : fMCSignals) { + for (const auto& mcIt : fMCSignals) { if (fConfigHistOutput.fConfigQA) { histClasses += Form("MCTruth_%s;", mcIt->GetName()); } if (fDoDetailedQA) { if (isBarrelEnabled) { // in case of detailed QA, setup histogram directories for each combination of reconstructed track cuts and MC signals - for (auto& cut : fTrackCuts) { + for (const auto& cut : fTrackCuts) { histClasses += Form("TrackBarrel_%s_%s;", cut->GetName(), mcIt->GetName()); } } if (isMuonEnabled) { // in case of detailed QA, setup histogram directories for each combination of reconstructed muon cuts and MC signals - for (auto& cut : fMuonCuts) { + for (const auto& cut : fMuonCuts) { histClasses += Form("Muons_%s_%s;", cut->GetName(), mcIt->GetName()); } } @@ -469,7 +476,7 @@ struct TableMakerMC { TString addEvCutsStr = fConfigCuts.fConfigEventCutsJSON.value; if (addEvCutsStr != "") { std::vector addEvCuts = dqcuts::GetCutsFromJSON(addEvCutsStr.Data()); - for (auto& cutIt : addEvCuts) { + for (const auto& cutIt : addEvCuts) { fEventCut->AddCut(cutIt); } } @@ -486,8 +493,8 @@ struct TableMakerMC { TString addTrackCutsStr = fConfigCuts.fConfigTrackCutsJSON.value; if (addTrackCutsStr != "") { std::vector addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data()); - for (auto& t : addTrackCuts) { - fTrackCuts.push_back(reinterpret_cast(t)); + for (const auto& t : addTrackCuts) { + fTrackCuts.push_back(dynamic_cast(t)); } } @@ -503,8 +510,8 @@ struct TableMakerMC { TString addMuonCutsStr = fConfigCuts.fConfigMuonCutsJSON.value; if (addMuonCutsStr != "") { std::vector addMuonCuts = dqcuts::GetCutsFromJSON(addMuonCutsStr.Data()); - for (auto& t : addMuonCuts) { - fMuonCuts.push_back(reinterpret_cast(t)); + for (const auto& t : addMuonCuts) { + fMuonCuts.push_back(dynamic_cast(t)); } } @@ -525,11 +532,11 @@ struct TableMakerMC { VarManager::ResetValues(0, VarManager::kNVars); // Loop over MC collisions - for (auto& mcCollision : mcCollisions) { + for (const auto& mcCollision : mcCollisions) { // Get MC collision information into the VarManager VarManager::FillEvent(mcCollision); // Fill histograms - fHistMan->FillHistClass("Event_MCTruth", VarManager::fgValues); + fHistMan->FillHistClass("Event_MCTruth", dqtablemakermc_helpers::varValues()); // Create the skimmed table entry for this collision eventMC(mcCollision.generatorsID(), mcCollision.posX(), mcCollision.posY(), mcCollision.posZ(), mcCollision.t(), mcCollision.weight(), mcCollision.impactParameter(), mcCollision.bestCollisionCentFT0C(), @@ -549,14 +556,14 @@ struct TableMakerMC { fLabelsMapReversed.clear(); fMCFlags.clear(); - uint16_t mcflags = static_cast(0); // flags which will hold the decisions for each MC signal + auto mcflags = static_cast(0); // flags which will hold the decisions for each MC signal int trackCounter = 0; - for (auto& mctrack : mcTracks) { + for (const auto& mctrack : mcTracks) { // check all the requested MC signals and fill the decision bit map mcflags = 0; int i = 0; - for (auto& sig : fMCSignals) { + for (const auto& sig : fMCSignals) { bool checked = false; if constexpr (soa::is_soa_filtered_v) { auto mctrack_raw = mcTracks.rawIteratorAt(mctrack.globalIndex()); @@ -580,7 +587,7 @@ struct TableMakerMC { PrintBitMap(mcflags, 16); cout << endl; if (mctrack.has_mothers()) { - for (auto& m : mctrack.mothersIds()) { + for (const auto& m : mctrack.mothersIds()) { if (m < mcTracks.size()) { // protect against bad mother indices auto aMother = mcTracks.rawIteratorAt(m); cout << "<<<<<< mother idx / pdg: " << m << " / " << aMother.pdgCode() << endl; @@ -605,7 +612,7 @@ struct TableMakerMC { } // If this MC track was not already added to the map, add it now - if (fLabelsMap.find(mctrack.globalIndex()) == fLabelsMap.end()) { + if (!fLabelsMap.contains(mctrack.globalIndex())) { fLabelsMap[mctrack.globalIndex()] = trackCounter; fLabelsMapReversed[trackCounter] = mctrack.globalIndex(); fMCFlags[mctrack.globalIndex()] = mcflags; @@ -618,8 +625,8 @@ struct TableMakerMC { VarManager::FillEvent(mcCollision); int j = 0; for (auto signal = fMCSignals.begin(); signal != fMCSignals.end(); signal++, j++) { - if (mcflags & (static_cast(1) << j)) { - fHistMan->FillHistClass(Form("MCTruth_%s", (*signal)->GetName()), VarManager::fgValues); + if ((mcflags & (static_cast(1) << j)) != 0) { + fHistMan->FillHistClass(Form("MCTruth_%s", (*signal)->GetName()), dqtablemakermc_helpers::varValues()); } } } @@ -721,14 +728,14 @@ struct TableMakerMC { // Fill the stats event histogram with the event selection bits for (int i = 0; i < o2::aod::evsel::kNsel; i++) { if (collision.selection_bit(i)) { - (reinterpret_cast(fStatsList->At(0)))->Fill(1.0, static_cast(i)); + (dynamic_cast(fStatsList->At(0)))->Fill(1.0, static_cast(i)); } } - (reinterpret_cast(fStatsList->At(0)))->Fill(1.0, static_cast(o2::aod::evsel::kNsel)); + (dynamic_cast(fStatsList->At(0)))->Fill(1.0, static_cast(o2::aod::evsel::kNsel)); auto bc = collision.template bc_as(); // store the selection decisions - uint64_t tag = static_cast(0); + auto tag = static_cast(0); // store some more information in the tag // if the BC found by event selection does not coincide with the collision.bc(), toggle the first bit auto bcEvSel = collision.template foundBC_as(); @@ -749,32 +756,32 @@ struct TableMakerMC { VarManager::FillEvent(mcCollision); } if (fDoDetailedQA) { - fHistMan->FillHistClass("Event_BeforeCuts", VarManager::fgValues); + fHistMan->FillHistClass("Event_BeforeCuts", dqtablemakermc_helpers::varValues()); } // fill stats information, before selections for (int i = 0; i < o2::aod::evsel::kNsel; i++) { if (collision.selection_bit(i)) { - (reinterpret_cast(fStatsList->At(0)))->Fill(2.0, static_cast(i)); + (dynamic_cast(fStatsList->At(0)))->Fill(2.0, static_cast(i)); } } - (reinterpret_cast(fStatsList->At(0)))->Fill(2.0, static_cast(o2::aod::evsel::kNsel)); + (dynamic_cast(fStatsList->At(0)))->Fill(2.0, static_cast(o2::aod::evsel::kNsel)); // Apply the user specified event selection - if (!fEventCut->IsSelected(VarManager::fgValues) || (fConfigRCT.fConfigUseRCT.value && !(rctChecker(collision)))) { + if (!fEventCut->IsSelected(dqtablemakermc_helpers::varValues()) || (fConfigRCT.fConfigUseRCT.value && !(rctChecker(collision)))) { continue; } // fill stats information, after selections for (int i = 0; i < o2::aod::evsel::kNsel; i++) { if (collision.selection_bit(i)) { - (reinterpret_cast(fStatsList->At(0)))->Fill(3.0, static_cast(i)); + (dynamic_cast(fStatsList->At(0)))->Fill(3.0, static_cast(i)); } } - (reinterpret_cast(fStatsList->At(0)))->Fill(3.0, static_cast(o2::aod::evsel::kNsel)); + (dynamic_cast(fStatsList->At(0)))->Fill(3.0, static_cast(o2::aod::evsel::kNsel)); // Fill historams after event cuts - fHistMan->FillHistClass("Event_AfterCuts", VarManager::fgValues); + fHistMan->FillHistClass("Event_AfterCuts", dqtablemakermc_helpers::varValues()); // create the event tables event(tag, bc.runNumber(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.collisionTime(), collision.collisionTimeRes()); @@ -836,9 +843,9 @@ struct TableMakerMC { // so in case of multiple associations, the variables depending on the collision association (e.g. DCA, secondary vertexing, etc) // have to be recomputed at analysis time for each association. - uint64_t trackFilteringTag = static_cast(0); - uint32_t trackTempFilterMap = static_cast(0); - uint16_t mcflags = static_cast(0); + uint64_t trackFilteringTag{0}; + uint32_t trackTempFilterMap{0}; + uint16_t mcflags{0}; int trackCounter = fLabelsMap.size(); // Loop over associations @@ -861,18 +868,18 @@ struct TableMakerMC { VarManager::FillTrackCollision(track, collision); } if (fDoDetailedQA) { - fHistMan->FillHistClass("TrackBarrel_BeforeCuts", VarManager::fgValues); + fHistMan->FillHistClass("TrackBarrel_BeforeCuts", dqtablemakermc_helpers::varValues()); } // apply track cuts and fill histograms int i = 0; for (auto cut = fTrackCuts.begin(); cut != fTrackCuts.end(); cut++, i++) { - if ((*cut)->IsSelected(VarManager::fgValues)) { + if ((*cut)->IsSelected(dqtablemakermc_helpers::varValues())) { trackTempFilterMap |= (static_cast(1) << i); if (fConfigHistOutput.fConfigQA) { - fHistMan->FillHistClass(Form("TrackBarrel_%s", (*cut)->GetName()), VarManager::fgValues); + fHistMan->FillHistClass(Form("TrackBarrel_%s", (*cut)->GetName()), dqtablemakermc_helpers::varValues()); } - (reinterpret_cast(fStatsList->At(1)))->Fill(static_cast(i)); + (dynamic_cast(fStatsList->At(1)))->Fill(static_cast(i)); } } if (!trackTempFilterMap) { @@ -891,7 +898,7 @@ struct TableMakerMC { trackFilteringTag |= static_cast(track.pidbit()); for (int iv0 = 0; iv0 < 5; iv0++) { if (track.pidbit() & (uint8_t(1) << iv0)) { - (reinterpret_cast(fStatsList->At(1)))->Fill(fTrackCuts.size() + static_cast(iv0)); + (dynamic_cast(fStatsList->At(1)))->Fill(fTrackCuts.size() + static_cast(iv0)); } } } // end if V0Bits @@ -942,15 +949,15 @@ struct TableMakerMC { int i = 0; // runs over the MC signals int j = 0; // runs over the track cuts // check all the specified signals and fill histograms for MC truth matched tracks - for (auto& sig : fMCSignals) { + for (const auto& sig : fMCSignals) { if (sig->CheckSignal(true, mctrack)) { mcflags |= (static_cast(1) << i); // If detailed QA is on, fill histograms for each MC signal and track cut combination if (fDoDetailedQA) { j = 0; - for (auto& cut : fTrackCuts) { + for (const auto& cut : fTrackCuts) { if (trackTempFilterMap & (uint8_t(1) << j)) { - fHistMan->FillHistClass(Form("TrackBarrel_%s_%s", cut->GetName(), sig->GetName()), VarManager::fgValues); // fill the reconstructed truth + fHistMan->FillHistClass(Form("TrackBarrel_%s_%s", cut->GetName(), sig->GetName()), dqtablemakermc_helpers::varValues()); // fill the reconstructed truth } j++; } @@ -979,7 +986,7 @@ struct TableMakerMC { { // Skim MFT tracks // So far no cuts are applied here - uint16_t mcflags = static_cast(0); + auto mcflags = static_cast(0); int trackCounter = fLabelsMap.size(); for (const auto& assoc : mftAssocs) { @@ -987,7 +994,7 @@ struct TableMakerMC { if (fConfigHistOutput.fConfigQA) { VarManager::FillTrack(track); - fHistMan->FillHistClass("MftTracks", VarManager::fgValues); + fHistMan->FillHistClass("MftTracks", dqtablemakermc_helpers::varValues()); } // write the MFT track global index in the map for skimming (to make sure we have it just once) @@ -1007,12 +1014,12 @@ struct TableMakerMC { mcflags = 0; int i = 0; // runs over the MC signals // check all the specified signals and fill histograms for MC truth matched tracks - for (auto& sig : fMCSignals) { + for (const auto& sig : fMCSignals) { if (sig->CheckSignal(true, mctrack)) { mcflags |= (static_cast(1) << i); // If detailed QA is on, fill histograms for each MC signal and track cut combination if (fDoDetailedQA) { - fHistMan->FillHistClass(Form("MFTTrack_%s", sig->GetName()), VarManager::fgValues); // fill the reconstructed truth + fHistMan->FillHistClass(Form("MFTTrack_%s", sig->GetName()), dqtablemakermc_helpers::varValues()); // fill the reconstructed truth } } i++; @@ -1050,7 +1057,7 @@ struct TableMakerMC { } } } - for (auto& pairCand : mCandidates) { + for (const auto& pairCand : mCandidates) { fBestMatch[pairCand.second.second] = true; } } @@ -1084,7 +1091,7 @@ struct TableMakerMC { } } } - for (auto& pairCand : mCandidates) { + for (const auto& pairCand : mCandidates) { fBestMatch[pairCand.second.second] = true; } } @@ -1096,10 +1103,10 @@ struct TableMakerMC { // Loop over the collision-track associations, recompute track properties depending on the collision assigned, and apply track cuts for selection // Muons are written only once, even if they constribute to more than one association, // which means that in the case of multiple associations, the track parameters are wrong and should be computed again at analysis time. - uint8_t trackFilteringTag = static_cast(0); - uint8_t trackTempFilterMap = static_cast(0); + auto trackFilteringTag = static_cast(0); + auto trackTempFilterMap = static_cast(0); fFwdTrackIndexMapReversed.clear(); - uint16_t mcflags = static_cast(0); + auto mcflags = static_cast(0); int trackCounter = fLabelsMap.size(); uint32_t offset = muonBasic.lastIndex(); @@ -1148,17 +1155,17 @@ struct TableMakerMC { } if (fDoDetailedQA) { - fHistMan->FillHistClass("Muons_BeforeCuts", VarManager::fgValues); + fHistMan->FillHistClass("Muons_BeforeCuts", dqtablemakermc_helpers::varValues()); } // check the cuts and fill histograms for each fulfilled cut int i = 0; for (auto cut = fMuonCuts.begin(); cut != fMuonCuts.end(); cut++, i++) { - if ((*cut)->IsSelected(VarManager::fgValues)) { + if ((*cut)->IsSelected(dqtablemakermc_helpers::varValues())) { trackTempFilterMap |= (uint8_t(1) << i); if (fConfigHistOutput.fConfigQA) { - fHistMan->FillHistClass(Form("Muons_%s", (*cut)->GetName()), VarManager::fgValues); + fHistMan->FillHistClass(Form("Muons_%s", (*cut)->GetName()), dqtablemakermc_helpers::varValues()); } - (reinterpret_cast(fStatsList->At(2)))->Fill(static_cast(i)); + (dynamic_cast(fStatsList->At(2)))->Fill(static_cast(i)); } } @@ -1189,14 +1196,14 @@ struct TableMakerMC { int i = 0; // runs over the MC signals int j = 0; // runs over the track cuts // check all the specified signals and fill histograms for MC truth matched tracks - for (auto& sig : fMCSignals) { + for (const auto& sig : fMCSignals) { if (sig->CheckSignal(true, mctrack)) { mcflags |= (static_cast(1) << i); if (fDoDetailedQA) { j = 0; - for (auto& cut : fMuonCuts) { + for (const auto& cut : fMuonCuts) { if (trackTempFilterMap & (uint8_t(1) << j)) { - fHistMan->FillHistClass(Form("Muons_%s_%s", cut->GetName(), sig->GetName()), VarManager::fgValues); // fill the reconstructed truth + fHistMan->FillHistClass(Form("Muons_%s_%s", cut->GetName(), sig->GetName()), dqtablemakermc_helpers::varValues()); // fill the reconstructed truth } j++; } @@ -1305,7 +1312,7 @@ struct TableMakerMC { { // Check whether the run changed and update CCDB if it did if (bcs.size() > 0 && fCurrentRun != bcs.begin().runNumber()) { - if (fIsRun2 == true) { + if (fIsRun2) { fGrpMagRun2 = fCCDB->getForTimeStamp(fConfigCCDB.fGrpMagPathRun2, bcs.begin().timestamp()); if (fGrpMagRun2 != nullptr) { o2::base::Propagator::initFieldFromGRP(fGrpMagRun2); @@ -1350,7 +1357,7 @@ struct TableMakerMC { eventMClabels.reserve(collisions.size()); eventInfo.reserve(collisions.size()); skimCollisions(collisions, bcs); - if (fCollIndexMap.size() == 0) { + if (fCollIndexMap.empty()) { return; } @@ -1368,7 +1375,7 @@ struct TableMakerMC { trackBarrel.reserve(tracksBarrel.size()); trackBarrelCov.reserve(tracksBarrel.size()); trackBarrelPID.reserve(tracksBarrel.size()); - trackBarrelAssoc.reserve(tracksBarrel.size()); + trackBarrelAssoc.reserve(trackAssocs.size()); trackBarrelLabels.reserve(tracksBarrel.size()); } @@ -1378,7 +1385,7 @@ struct TableMakerMC { map_mfttrackcovs.clear(); mftTrack.reserve(mftTracks.size()); mftTrackExtra.reserve(mftTracks.size()); - mftAssoc.reserve(mftTracks.size()); + mftAssoc.reserve(mftAssocs.size()); mftLabels.reserve(mftTracks.size()); } @@ -1390,18 +1397,18 @@ struct TableMakerMC { muonBasic.reserve(muons.size()); muonExtra.reserve(muons.size()); muonCov.reserve(muons.size()); - muonAssoc.reserve(muons.size()); + muonAssoc.reserve(fwdTrackAssocs.size()); muonLabels.reserve(muons.size()); } if constexpr (static_cast(TMFTFillMap & VarManager::ObjTypes::MFTCov)) { - for (auto& mfttrackConv : mftCovs) { + for (const auto& mfttrackConv : mftCovs) { map_mfttrackcovs[mfttrackConv.matchMFTTrackId()] = mfttrackConv.globalIndex(); } } // loop over selected collisions and select the tracks and fwd tracks to be skimmed - if (fCollIndexMap.size() > 0) { + if (!fCollIndexMap.empty()) { for (auto const& [origIdx, skimIdx] : fCollIndexMap) { auto collision = collisions.rawIteratorAt(origIdx); // group the tracks and muons for this collision @@ -1445,14 +1452,14 @@ struct TableMakerMC { std::vector mothers; if (mctrack.has_mothers()) { - for (auto& m : mctrack.mothersIds()) { + for (const auto& m : mctrack.mothersIds()) { if (m < mcParticles.size()) { // protect against bad mother indices - if (fLabelsMap.find(m) != fLabelsMap.end()) { + if (fLabelsMap.contains(m)) { mothers.push_back(fLabelsMap.find(m)->second); } } else { - cout << "Mother label (" << m << ") exceeds the McParticles size (" << mcParticles.size() << ")" << endl; - cout << " Check the MC generator" << endl; + LOG(warn) << "Mother label (" << m << ") exceeds the McParticles size (" << mcParticles.size() << ")"; + LOG(warn) << "Check the MC generator"; } } } @@ -1464,17 +1471,17 @@ struct TableMakerMC { for (int d = mctrack.daughtersIds()[0]; d <= mctrack.daughtersIds()[1]; ++d) { // TODO: remove this check as soon as issues with MC production are fixed if (d < mcParticles.size()) { // protect against bad daughter indices - if (fLabelsMap.find(d) != fLabelsMap.end()) { + if (fLabelsMap.contains(d)) { daughters.push_back(fLabelsMap.find(d)->second); } } else { - cout << "Daughter label (" << d << ") exceeds the McParticles size (" << mcParticles.size() << ")" << endl; - cout << " Check the MC generator" << endl; + LOG(warn) << "Daughter label (" << d << ") exceeds the McParticles size (" << mcParticles.size() << ")"; + LOG(warn) << "Check the MC generator"; } } } - int daughterRange[2] = {-1, -1}; - if (daughters.size() > 0) { + std::array daughterRange{-1, -1}; + if (!daughters.empty()) { daughterRange[0] = daughters[0]; daughterRange[1] = daughters[daughters.size() - 1]; } @@ -1482,24 +1489,24 @@ struct TableMakerMC { // NOTE: Here we assume that MC collisions are not filtered, so there is no new vs old index map for translation auto mcCollision = mctrack.template mcCollision_as(); trackMC(mcCollision.globalIndex(), mctrack.pdgCode(), mctrack.statusCode(), mctrack.flags(), - mothers, daughterRange, + mothers, daughterRange.data(), mctrack.weight(), mctrack.pt(), mctrack.eta(), mctrack.phi(), mctrack.e(), mctrack.vx(), mctrack.vy(), mctrack.vz(), mctrack.vt(), mcflags); for (unsigned int isig = 0; isig < fMCSignals.size(); isig++) { if (mcflags & (static_cast(1) << isig)) { - (reinterpret_cast(fStatsList->At(3)))->Fill(static_cast(isig)); + (dynamic_cast(fStatsList->At(3)))->Fill(static_cast(isig)); } } if (mcflags == 0) { - (reinterpret_cast(fStatsList->At(3)))->Fill(static_cast(fMCSignals.size())); + (dynamic_cast(fStatsList->At(3)))->Fill(static_cast(fMCSignals.size())); } } // end loop over labels } - void DefineHistograms(TString histClasses) + void DefineHistograms(const TString& histClasses) { std::unique_ptr objArray(histClasses.Tokenize(";")); - for (Int_t iclass = 0; iclass < objArray->GetEntries(); ++iclass) { + for (int iclass = 0; iclass < objArray->GetEntries(); ++iclass) { TString classStr = objArray->At(iclass)->GetName(); if (fConfigHistOutput.fConfigQA) { fHistMan->AddHistClass(classStr.Data()); @@ -1552,12 +1559,12 @@ struct TableMakerMC { fStatsList->Add(histEvents); // Track statistics: one bin for each track selection and 5 bins for V0 tags (gamma, K0s, Lambda, anti-Lambda, Omega) - TH1I* histTracks = new TH1I("TrackStats", "Track statistics", fTrackCuts.size() + 5.0, -0.5, fTrackCuts.size() - 0.5 + 5.0); + TH1I* histTracks = new TH1I("TrackStats", "Track statistics", fTrackCuts.size() + 5, -0.5, fTrackCuts.size() - 0.5 + 5.0); ib = 1; for (auto cut = fTrackCuts.begin(); cut != fTrackCuts.end(); cut++, ib++) { histTracks->GetXaxis()->SetBinLabel(ib, (*cut)->GetName()); } - const char* v0TagNames[5] = {"Photon conversion", "K^{0}_{s}", "#Lambda", "#bar{#Lambda}", "#Omega"}; + constexpr std::array v0TagNames = {"Photon conversion", "K^{0}_{s}", "#Lambda", "#bar{#Lambda}", "#Omega"}; for (int ib = 0; ib < 5; ib++) { histTracks->GetXaxis()->SetBinLabel(fTrackCuts.size() + 1 + ib, v0TagNames[ib]); } @@ -1655,7 +1662,7 @@ struct TableMakerMC { { fullSkimming(collisions, bcs, nullptr, tracksMuon, mftTracks, nullptr, fwdTrackAssocs, mftAssocs, mcCollisions, mcParticles, nullptr); /*LOGP(info, "---------------------------"); - for (auto& mcCollision : mcCollisions) { + for (const auto& mcCollision : mcCollisions) { LOGP(info, "Gen. FT0C centrality = {}", mcCollision.bestCollisionCentFT0C()); //LOGP(info, "Gen. FT0C centrality = {}", mcCollision.posZ()); } @@ -1684,11 +1691,11 @@ struct TableMakerMC { void processOnlyBCs(soa::Join::iterator const& bc) { for (int i = 0; i < o2::aod::evsel::kNsel; i++) { - if (bc.alias_bit(i) > 0) { - (reinterpret_cast(fStatsList->At(0)))->Fill(0.0, static_cast(i)); + if (static_cast(bc.alias_bit(i)) > 0) { + (dynamic_cast(fStatsList->At(0)))->Fill(0.0, static_cast(i)); } } - (reinterpret_cast(fStatsList->At(0)))->Fill(0.0, static_cast(o2::aod::evsel::kNsel)); + (dynamic_cast(fStatsList->At(0)))->Fill(0.0, static_cast(o2::aod::evsel::kNsel)); } PROCESS_SWITCH(TableMakerMC, processPP, "Produce both barrel and muon skims, pp settings", false); diff --git a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx index 4ef5b7313ca..48abbd5dc04 100644 --- a/PWGDQ/TableProducer/tableMaker_withAssoc.cxx +++ b/PWGDQ/TableProducer/tableMaker_withAssoc.cxx @@ -92,8 +92,6 @@ using namespace o2::framework::expressions; using namespace o2::aod; using namespace o2::aod::rctsel; -Zorro zorro; - // Declaration of various Joins used in the different process functions // TODO: Since DCA depends on which collision the track is associated to, we should remove writing and subscribing to DCA tables, to optimize on CPU / memory using MyBarrelTracks = soa::Join(VarManager::fgValues); } +inline TString* varNames() { return static_cast(VarManager::fgVariableNames); } +inline TString* varUnits() { return static_cast(VarManager::fgVariableUnits); } +} // namespace dqtablemaker_helpers + struct TableMaker { struct : ProducesGroup { @@ -215,7 +220,7 @@ struct TableMaker { OutputObj fOutputList{"output"}; //! the histogram manager output list OutputObj fStatsList{"Statistics"}; //! skimming statistics - HistogramManager* fHistMan; + HistogramManager* fHistMan = nullptr; // Event and track AnalysisCut configurables struct : ConfigurableGroup { @@ -320,18 +325,18 @@ struct TableMaker { Configurable fExcludeShort{"cfgTPCExcludeShort", true, "Exclude short term from long term occupancy (micro-seconds)"}; } fConfigVariousOptions; - Service fCCDB; + Service fCCDB{}; o2::ccdb::CcdbApi fCCDBApi; o2::parameters::GRPObject* fGrpMagRun2 = nullptr; // for run 2, we access the GRPObject from GLO/GRP/GRP o2::parameters::GRPMagField* fGrpMag = nullptr; // for run 3, we access GRPMagField from GLO/Config/GRPMagField - AnalysisCompositeCut* fEventCut; //! Event selection cut + AnalysisCompositeCut* fEventCut = nullptr; //! Event selection cut std::vector fTrackCuts; //! Barrel track cuts std::vector fMuonCuts; //! Muon track cuts bool fDoDetailedQA = false; // Bool to set detailed QA true, if QA is set true - int fCurrentRun; // needed to detect if the run changed and trigger update of calibrations etc. + int fCurrentRun = -1; // needed to detect if the run changed and trigger update of calibrations etc. // maps used to store index info; NOTE: std::map are sorted in ascending order by default (needed for track to collision indices) std::map fCollIndexMap; // key: old collision index, value: skimmed collision index @@ -346,7 +351,7 @@ struct TableMaker { o2::analysis::MlResponseMFTMuonMatch matchingMlResponse; std::vector binsPtMl; - std::array cutValues; + std::array cutValues{}; std::vector cutDirMl; // RCT flag checker @@ -384,6 +389,7 @@ struct TableMaker { Partition tracksNegWithCov = (((aod::track::flags & static_cast(o2::aod::track::PVContributor)) == static_cast(o2::aod::track::PVContributor)) && (aod::track::tgl < static_cast(-0.05))); ctpRateFetcher mRateFetcher; + Zorro zorro; parameters::GRPLHCIFData* mLHCIFdata = nullptr; struct { @@ -454,7 +460,7 @@ struct TableMaker { // Initialize the histogram manager fHistMan = new HistogramManager("analysisHistos", "aa", VarManager::kNVars); fHistMan->SetUseDefaultVariableNames(kTRUE); - fHistMan->SetDefaultVarNames(VarManager::fgVariableNames, VarManager::fgVariableUnits); + fHistMan->SetDefaultVarNames(dqtablemaker_helpers::varNames(), dqtablemaker_helpers::varUnits()); // Only use detailed QA when QA is set true if (fConfigHistOutput.fConfigQA && fConfigHistOutput.fConfigDetailedQA) { @@ -490,7 +496,7 @@ struct TableMaker { } if (fConfigHistOutput.fConfigQA) { // Barrel track histograms after selections; one histogram directory for each user specified selection - for (auto& cut : fTrackCuts) { + for (const auto& cut : fTrackCuts) { histClasses += Form("TrackBarrel_%s;", cut->GetName()); } } @@ -509,7 +515,7 @@ struct TableMaker { } if (fConfigHistOutput.fConfigQA) { // Muon tracks after selections; one directory per selection - for (auto& muonCut : fMuonCuts) { + for (const auto& muonCut : fMuonCuts) { histClasses += Form("Muons_%s;", muonCut->GetName()); } } @@ -555,7 +561,7 @@ struct TableMaker { TString addEvCutsStr = fConfigCuts.fConfigEventCutsJSON.value; if (addEvCutsStr != "") { std::vector addEvCuts = dqcuts::GetCutsFromJSON(addEvCutsStr.Data()); - for (auto& cutIt : addEvCuts) { + for (const auto& cutIt : addEvCuts) { fEventCut->AddCut(cutIt); } } @@ -572,8 +578,8 @@ struct TableMaker { TString addTrackCutsStr = fConfigCuts.fConfigTrackCutsJSON.value; if (addTrackCutsStr != "") { std::vector addTrackCuts = dqcuts::GetCutsFromJSON(addTrackCutsStr.Data()); - for (auto& t : addTrackCuts) { - fTrackCuts.push_back(reinterpret_cast(t)); + for (const auto& t : addTrackCuts) { + fTrackCuts.push_back(dynamic_cast(t)); } } @@ -589,19 +595,19 @@ struct TableMaker { TString addMuonCutsStr = fConfigCuts.fConfigMuonCutsJSON.value; if (addMuonCutsStr != "") { std::vector addMuonCuts = dqcuts::GetCutsFromJSON(addMuonCutsStr.Data()); - for (auto& t : addMuonCuts) { - fMuonCuts.push_back(reinterpret_cast(t)); + for (const auto& t : addMuonCuts) { + fMuonCuts.push_back(dynamic_cast(t)); } } VarManager::SetUseVars(AnalysisCut::fgUsedVars); // provide the list of required variables so that VarManager knows what to fill } - void DefineHistograms(TString histClasses) + void DefineHistograms(const TString& histClasses) { // Create histograms via HistogramManager std::unique_ptr objArray(histClasses.Tokenize(";")); - for (Int_t iclass = 0; iclass < objArray->GetEntries(); ++iclass) { + for (int iclass = 0; iclass < objArray->GetEntries(); ++iclass) { TString classStr = objArray->At(iclass)->GetName(); if (fConfigHistOutput.fConfigQA) { fHistMan->AddHistClass(classStr.Data()); @@ -680,13 +686,13 @@ struct TableMaker { fStatsList->AddAt(histBcs, kStatsBcs); // Track statistics: one bin for each track selection and 5 bins for V0 tags (gamma, K0s, Lambda, anti-Lambda, Omega) - TH1D* histTracks = new TH1D("TrackStats", "Track statistics", fTrackCuts.size() + 5.0, -0.5, fTrackCuts.size() - 0.5 + 5.0); + TH1D* histTracks = new TH1D("TrackStats", "Track statistics", fTrackCuts.size() + 5, -0.5, fTrackCuts.size() - 0.5 + 5.0); ib = 1; for (auto cut = fTrackCuts.begin(); cut != fTrackCuts.end(); cut++, ib++) { histTracks->GetXaxis()->SetBinLabel(ib, (*cut)->GetName()); } - const char* v0TagNames[5] = {"Photon conversion", "K^{0}_{s}", "#Lambda", "#bar{#Lambda}", "#Omega"}; - for (ib = 0; ib < 5; ib++) { + constexpr std::array v0TagNames{"Photon conversion", "K^{0}_{s}", "#Lambda", "#bar{#Lambda}", "#Omega"}; + for (ib = 0; ib < static_cast(v0TagNames.size()); ib++) { histTracks->GetXaxis()->SetBinLabel(fTrackCuts.size() + 1 + ib, v0TagNames[ib]); } fStatsList->AddAt(histTracks, kStatsTracks); @@ -750,7 +756,7 @@ struct TableMaker { oVtxZ[collision.globalIndex()] = collision.posZ(); // if more than one collision per bunch, add that collision to the list for that bunch - if (oBCreversed.find(bc) == oBCreversed.end()) { + if (!oBCreversed.contains(bc)) { std::vector evs = {collision.globalIndex()}; oBCreversed[bc] = evs; } else { @@ -794,7 +800,7 @@ struct TableMaker { // check if this collision is also within the short time range bool isShort = (thisBC >= pastShortBC && thisBC < futureShortBC); // loop over all collisions in this BC - for (auto& thisColl : colls) { + for (const auto& thisColl : colls) { // skip if this is the same collision if (thisColl == collision) { continue; @@ -840,8 +846,8 @@ struct TableMaker { // iterate over the time maps to obtain the median time fOccup.oMedianTimeLongA[collision] = 0.0; float sumMult = 0.0; - if (oTimeMapLongA.size() > 0) { - for (auto& [dt, mult] : oTimeMapLongA) { + if (!oTimeMapLongA.empty()) { + for (const auto& [dt, mult] : oTimeMapLongA) { sumMult += mult; if (sumMult > fOccup.oContribLongA[collision] / 2.0) { fOccup.oMedianTimeLongA[collision] = dt; @@ -851,8 +857,8 @@ struct TableMaker { } fOccup.oMedianTimeLongC[collision] = 0.0; sumMult = 0.0; - if (oTimeMapLongC.size() > 0) { - for (auto& [dt, mult] : oTimeMapLongC) { + if (!oTimeMapLongC.empty()) { + for (const auto& [dt, mult] : oTimeMapLongC) { sumMult += mult; if (sumMult > fOccup.oContribLongC[collision] / 2.0) { fOccup.oMedianTimeLongC[collision] = dt; @@ -862,8 +868,8 @@ struct TableMaker { } fOccup.oMedianTimeShortA[collision] = 0.0; sumMult = 0.0; - if (oTimeMapShortA.size() > 0) { - for (auto& [dt, mult] : oTimeMapShortA) { + if (!oTimeMapShortA.empty()) { + for (const auto& [dt, mult] : oTimeMapShortA) { sumMult += mult; if (sumMult > fOccup.oContribShortA[collision] / 2.0) { fOccup.oMedianTimeShortA[collision] = dt; @@ -873,8 +879,8 @@ struct TableMaker { } fOccup.oMedianTimeShortC[collision] = 0.0; sumMult = 0.0; - if (oTimeMapShortC.size() > 0) { - for (auto& [dt, mult] : oTimeMapShortC) { + if (!oTimeMapShortC.empty()) { + for (const auto& [dt, mult] : oTimeMapShortC) { sumMult += mult; if (sumMult > fOccup.oContribShortC[collision] / 2.0) { fOccup.oMedianTimeShortC[collision] = dt; @@ -892,12 +898,9 @@ struct TableMaker { auto bfilling = mLHCIFdata->getBunchFilling(); double nbc = bfilling.getFilledBCs().size(); - double tvxRate; - if (fConfigHistOutput.fConfigIrEstimator.value.empty()) { - tvxRate = mRateFetcher.fetch(fCCDB.service, timeStamp, bc.runNumber(), "T0VTX"); - } else { - tvxRate = mRateFetcher.fetch(fCCDB.service, timeStamp, bc.runNumber(), fConfigHistOutput.fConfigIrEstimator.value); - } + const double tvxRate = fConfigHistOutput.fConfigIrEstimator.value.empty() + ? mRateFetcher.fetch(fCCDB.service, timeStamp, bc.runNumber(), "T0VTX") + : mRateFetcher.fetch(fCCDB.service, timeStamp, bc.runNumber(), fConfigHistOutput.fConfigIrEstimator.value); double nTriggersPerFilledBC = tvxRate / nbc / o2::constants::lhc::LHCRevFreq; double mu = -std::log(1 - nTriggersPerFilledBC); @@ -1011,22 +1014,22 @@ struct TableMaker { bool isTriggerZNA = bc.selection_bit(aod::evsel::kIsBBZNA); bool isTriggerZNC = bc.selection_bit(aod::evsel::kIsBBZNC); - (reinterpret_cast(fStatsList->At(kStatsBcs)))->Fill(0.0, muTVX); + (dynamic_cast(fStatsList->At(kStatsBcs)))->Fill(0.0, muTVX); if (isTvx) { - (reinterpret_cast(fStatsList->At(kStatsBcs)))->Fill(1.0, muTVX); + (dynamic_cast(fStatsList->At(kStatsBcs)))->Fill(1.0, muTVX); if (noBorder) { - (reinterpret_cast(fStatsList->At(kStatsBcs)))->Fill(2.0, muTVX); + (dynamic_cast(fStatsList->At(kStatsBcs)))->Fill(2.0, muTVX); if (isCentral) { - (reinterpret_cast(fStatsList->At(kStatsBcs)))->Fill(3.0, muTVX); + (dynamic_cast(fStatsList->At(kStatsBcs)))->Fill(3.0, muTVX); } if (isSemiCentral) { - (reinterpret_cast(fStatsList->At(kStatsBcs)))->Fill(4.0, muTVX); + (dynamic_cast(fStatsList->At(kStatsBcs)))->Fill(4.0, muTVX); } if (isCentral || isSemiCentral) { - (reinterpret_cast(fStatsList->At(kStatsBcs)))->Fill(5.0, muTVX); + (dynamic_cast(fStatsList->At(kStatsBcs)))->Fill(5.0, muTVX); } if (isTriggerZNA && isTriggerZNC) { - (reinterpret_cast(fStatsList->At(kStatsBcs)))->Fill(6.0, muTVX); + (dynamic_cast(fStatsList->At(kStatsBcs)))->Fill(6.0, muTVX); } } } @@ -1038,10 +1041,10 @@ struct TableMaker { for (int i = 0; i < o2::aod::evsel::kNsel; i++) { if (collision.selection_bit(i)) { - (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(1.0, static_cast(i)); + (dynamic_cast(fStatsList->At(kStatsEvent)))->Fill(1.0, static_cast(i)); } } - (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(1.0, static_cast(o2::aod::evsel::kNsel)); + (dynamic_cast(fStatsList->At(kStatsEvent)))->Fill(1.0, static_cast(o2::aod::evsel::kNsel)); // apply the event filter computed by filter-PP if constexpr ((TEventFillMap & VarManager::ObjTypes::EventFilter) > 0) { @@ -1117,28 +1120,28 @@ struct TableMaker { } if (fDoDetailedQA) { - fHistMan->FillHistClass("Event_BeforeCuts", VarManager::fgValues); + fHistMan->FillHistClass("Event_BeforeCuts", dqtablemaker_helpers::varValues()); } // fill stats information, before selections for (int i = 0; i < o2::aod::evsel::kNsel; i++) { if (collision.selection_bit(i)) { - (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(2.0, static_cast(i)); + (dynamic_cast(fStatsList->At(kStatsEvent)))->Fill(2.0, static_cast(i)); } } - (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(2.0, static_cast(o2::aod::evsel::kNsel)); + (dynamic_cast(fStatsList->At(kStatsEvent)))->Fill(2.0, static_cast(o2::aod::evsel::kNsel)); if (fConfigZorro.fConfigRunZorro) { zorro.setBaseCCDBPath(fConfigCCDB.fConfigCcdbPathZorro.value); zorro.setBCtolerance(fConfigZorro.fBcTolerance); zorro.initCCDB(fCCDB.service, fCurrentRun, bc.timestamp(), fConfigZorro.fConfigZorroTrigMask.value); - zorro.populateExternalHists(fCurrentRun, reinterpret_cast(fStatsList->At(kStatsZorroInfo)), reinterpret_cast(fStatsList->At(kStatsZorroSel))); + zorro.populateExternalHists(fCurrentRun, dynamic_cast(fStatsList->At(kStatsZorroInfo)), dynamic_cast(fStatsList->At(kStatsZorroSel))); - if (!fEventCut->IsSelected(VarManager::fgValues) || (fConfigRCT.fConfigUseRCT.value && !rctChecker(collision))) { + if (!fEventCut->IsSelected(dqtablemaker_helpers::varValues()) || (fConfigRCT.fConfigUseRCT.value && !rctChecker(collision))) { continue; } - bool zorroSel = zorro.isSelected(bc.globalBC(), fConfigZorro.fBcTolerance, reinterpret_cast(fStatsList->At(kStatsZorroSel))); + bool zorroSel = zorro.isSelected(bc.globalBC(), fConfigZorro.fBcTolerance, dynamic_cast(fStatsList->At(kStatsZorroSel))); if (zorroSel) { tag |= (static_cast(true) << 56); // the same bit is used for this zorro selections from ccdb } @@ -1146,7 +1149,7 @@ struct TableMaker { continue; } } else { - if (!fEventCut->IsSelected(VarManager::fgValues) || (fConfigRCT.fConfigUseRCT.value && !rctChecker(collision))) { + if (!fEventCut->IsSelected(dqtablemaker_helpers::varValues()) || (fConfigRCT.fConfigUseRCT.value && !rctChecker(collision))) { continue; } } @@ -1154,12 +1157,12 @@ struct TableMaker { // fill stats information, after selections for (int i = 0; i < o2::aod::evsel::kNsel; i++) { if (collision.selection_bit(i)) { - (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(3.0, static_cast(i)); + (dynamic_cast(fStatsList->At(kStatsEvent)))->Fill(3.0, static_cast(i)); } } - (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(3.0, static_cast(o2::aod::evsel::kNsel)); + (dynamic_cast(fStatsList->At(kStatsEvent)))->Fill(3.0, static_cast(o2::aod::evsel::kNsel)); - fHistMan->FillHistClass("Event_AfterCuts", VarManager::fgValues); + fHistMan->FillHistClass("Event_AfterCuts", dqtablemaker_helpers::varValues()); // create the event tables outTables.event(tag, bc.runNumber(), collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), collision.collisionTime(), collision.collisionTimeRes()); @@ -1274,8 +1277,8 @@ struct TableMaker { // One can apply here cuts which depend on the association (e.g. DCA), which will discard (hopefully most) wrong associations. // Tracks are written only once, even if they constribute to more than one association - uint64_t trackFilteringTag = static_cast(0); - uint32_t trackTempFilterMap = static_cast(0); + auto trackFilteringTag = static_cast(0); + auto trackTempFilterMap = static_cast(0); // material correction for track propagation // TODO: Do we need a configurable to switch between different material correction options? @@ -1303,20 +1306,20 @@ struct TableMaker { } if (fDoDetailedQA) { - fHistMan->FillHistClass("TrackBarrel_BeforeCuts", VarManager::fgValues); + fHistMan->FillHistClass("TrackBarrel_BeforeCuts", dqtablemaker_helpers::varValues()); } // apply track cuts and fill stats histogram int i = 0; for (auto cut = fTrackCuts.begin(); cut != fTrackCuts.end(); cut++, i++) { - if ((*cut)->IsSelected(VarManager::fgValues)) { + if ((*cut)->IsSelected(dqtablemaker_helpers::varValues())) { trackTempFilterMap |= (static_cast(1) << i); // NOTE: the QA is filled here just for the first occurence of this track. // So if there are histograms of quantities which depend on the collision association, these will not be accurate if (fConfigHistOutput.fConfigQA && (fTrackIndexMap.find(track.globalIndex()) == fTrackIndexMap.end())) { - fHistMan->FillHistClass(Form("TrackBarrel_%s", (*cut)->GetName()), VarManager::fgValues); + fHistMan->FillHistClass(Form("TrackBarrel_%s", (*cut)->GetName()), dqtablemaker_helpers::varValues()); } - (reinterpret_cast(fStatsList->At(kStatsTracks)))->Fill(static_cast(i)); + (dynamic_cast(fStatsList->At(kStatsTracks)))->Fill(static_cast(i)); } } if (!trackTempFilterMap) { @@ -1335,22 +1338,22 @@ struct TableMaker { trackFilteringTag |= static_cast(track.pidbit()); for (int iv0 = 0; iv0 < 5; iv0++) { if (track.pidbit() & (uint8_t(1) << iv0)) { - (reinterpret_cast(fStatsList->At(kStatsTracks)))->Fill(fTrackCuts.size() + static_cast(iv0)); + (dynamic_cast(fStatsList->At(kStatsTracks)))->Fill(fTrackCuts.size() + static_cast(iv0)); } } // TODO: this part should be removed since the calibration histogram can be filled as any other histogram if (fConfigPostCalibTPC.fConfigIsOnlyforMaps) { if (trackFilteringTag & (static_cast(1) << VarManager::kIsConversionLeg)) { // for electron - fHistMan->FillHistClass("TrackBarrel_PostCalibElectron", VarManager::fgValues); + fHistMan->FillHistClass("TrackBarrel_PostCalibElectron", dqtablemaker_helpers::varValues()); } if (trackFilteringTag & (static_cast(1) << VarManager::kIsK0sLeg)) { // for pion - fHistMan->FillHistClass("TrackBarrel_PostCalibPion", VarManager::fgValues); + fHistMan->FillHistClass("TrackBarrel_PostCalibPion", dqtablemaker_helpers::varValues()); } if ((static_cast(trackFilteringTag & (static_cast(1) << VarManager::kIsLambdaLeg)) * (track.sign()) > 0)) { // for proton from Lambda - fHistMan->FillHistClass("TrackBarrel_PostCalibProton", VarManager::fgValues); + fHistMan->FillHistClass("TrackBarrel_PostCalibProton", dqtablemaker_helpers::varValues()); } if ((static_cast(trackFilteringTag & (static_cast(1) << VarManager::kIsALambdaLeg)) * (track.sign()) < 0)) { // for proton from AntiLambda - fHistMan->FillHistClass("TrackBarrel_PostCalibProton", VarManager::fgValues); + fHistMan->FillHistClass("TrackBarrel_PostCalibProton", dqtablemaker_helpers::varValues()); } } if (fConfigPostCalibTPC.fConfigSaveElectronSample) { // only save electron sample @@ -1372,9 +1375,9 @@ struct TableMaker { // Calculating the percentage of orphan tracks i.e., tracks which have no collisions associated to it if (!track.has_collision()) { - (reinterpret_cast(fStatsList->At(kStatsOrphanTracks)))->Fill(static_cast(-1)); + (dynamic_cast(fStatsList->At(kStatsOrphanTracks)))->Fill(static_cast(-1)); } else { - (reinterpret_cast(fStatsList->At(kStatsOrphanTracks)))->Fill(0.9); + (dynamic_cast(fStatsList->At(kStatsOrphanTracks)))->Fill(0.9); } // NOTE: The collision ID written in the table is the one of the original collision assigned in the AO2D. @@ -1438,11 +1441,11 @@ struct TableMaker { if (fConfigHistOutput.fConfigQA) { VarManager::FillTrack(track); - fHistMan->FillHistClass("MftTracks", VarManager::fgValues); + fHistMan->FillHistClass("MftTracks", dqtablemaker_helpers::varValues()); } // write the MFT track global index in the map for skimming (to make sure we have it just once) - if (fMftIndexMap.find(track.globalIndex()) == fMftIndexMap.end()) { + if (!fMftIndexMap.contains(track.globalIndex())) { uint32_t reducedEventIdx = fCollIndexMap[collision.globalIndex()]; outTables.mftTrack(reducedEventIdx, static_cast(0), track.pt(), track.eta(), track.phi()); // TODO: We are not writing the DCA at the moment, because this depend on the collision association @@ -1471,7 +1474,7 @@ struct TableMaker { } } } - for (auto& pairCand : mCandidates) { + for (const auto& pairCand : mCandidates) { fBestMatch[pairCand.second.second] = true; } } @@ -1505,7 +1508,7 @@ struct TableMaker { } } } - for (auto& pairCand : mCandidates) { + for (const auto& pairCand : mCandidates) { fBestMatch[pairCand.second.second] = true; } } @@ -1520,8 +1523,8 @@ struct TableMaker { // TODO: Currently, the TMFTFillMap is not used in this function. Is it needed ? - uint8_t trackFilteringTag = static_cast(0); - uint8_t trackTempFilterMap = static_cast(0); + auto trackFilteringTag = static_cast(0); + auto trackTempFilterMap = static_cast(0); fFwdTrackIndexMapReversed.clear(); uint32_t offset = outTables.muonBasic.lastIndex(); @@ -1573,20 +1576,20 @@ struct TableMaker { } if (fDoDetailedQA) { - fHistMan->FillHistClass("Muons_BeforeCuts", VarManager::fgValues); + fHistMan->FillHistClass("Muons_BeforeCuts", dqtablemaker_helpers::varValues()); } // check the cuts and filters int i = 0; for (auto cut = fMuonCuts.begin(); cut != fMuonCuts.end(); cut++, i++) { - if ((*cut)->IsSelected(VarManager::fgValues)) { + if ((*cut)->IsSelected(dqtablemaker_helpers::varValues())) { trackTempFilterMap |= (static_cast(1) << i); // NOTE: the QA is filled here just for the first occurence of this muon, which means the current association // will be skipped from histograms if this muon was already filled in the skimming map. // So if there are histograms of quantities which depend on the collision association, these histograms will not be completely accurate if (fConfigHistOutput.fConfigQA && (fFwdTrackIndexMap.find(muon.globalIndex()) == fFwdTrackIndexMap.end())) { - fHistMan->FillHistClass(Form("Muons_%s", (*cut)->GetName()), VarManager::fgValues); + fHistMan->FillHistClass(Form("Muons_%s", (*cut)->GetName()), dqtablemaker_helpers::varValues()); } - (reinterpret_cast(fStatsList->At(kStatsMuons)))->Fill(static_cast(i)); + (dynamic_cast(fStatsList->At(kStatsMuons)))->Fill(static_cast(i)); } } @@ -1712,7 +1715,7 @@ struct TableMaker { } VarManager::SetCalibrationType(fConfigPostCalibTPC.fConfigTPCpostCalibType, fConfigPostCalibTPC.fConfigTPCuseInterpolatedCalib); } - if (fIsRun2 == true) { + if (fIsRun2) { fGrpMagRun2 = fCCDB->getForTimeStamp(fConfigCCDB.fConfigGrpMagPathRun2, bcs.begin().timestamp()); if (fGrpMagRun2 != nullptr) { o2::base::Propagator::initFieldFromGRP(fGrpMagRun2); @@ -1755,7 +1758,7 @@ struct TableMaker { outTables.eventVtxCov.reserve(collisions.size()); skimCollisions(collisions, bcs, zdcs, ft0s, fv0as, fdds); - if (fCollIndexMap.size() == 0) { + if (fCollIndexMap.empty()) { return; } @@ -1766,7 +1769,7 @@ struct TableMaker { outTables.trackBarrel.reserve(tracksBarrel.size()); outTables.trackBarrelCov.reserve(tracksBarrel.size()); outTables.trackBarrelPID.reserve(tracksBarrel.size()); - outTables.trackBarrelAssoc.reserve(tracksBarrel.size()); + outTables.trackBarrelAssoc.reserve(trackAssocs.size()); } if constexpr (static_cast(TMFTFillMap)) { @@ -1774,7 +1777,7 @@ struct TableMaker { map_mfttrackcovs.clear(); outTables.mftTrack.reserve(mftTracks.size()); outTables.mftTrackExtra.reserve(mftTracks.size()); - outTables.mftAssoc.reserve(mftTracks.size()); + outTables.mftAssoc.reserve(mftAssocs.size()); } if constexpr (static_cast(TMuonFillMap)) { @@ -1785,11 +1788,11 @@ struct TableMaker { outTables.muonExtra.reserve(muons.size()); outTables.muonInfo.reserve(muons.size()); outTables.muonCov.reserve(muons.size()); - outTables.muonAssoc.reserve(muons.size()); + outTables.muonAssoc.reserve(fwdTrackAssocs.size()); } if constexpr (static_cast(TMFTFillMap & VarManager::ObjTypes::MFTCov)) { - for (auto& mfttrackConv : mftCovs) { + for (const auto& mfttrackConv : mftCovs) { map_mfttrackcovs[mfttrackConv.matchMFTTrackId()] = mfttrackConv.globalIndex(); } } @@ -1858,7 +1861,7 @@ struct TableMaker { } // produce the barrel-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), subscribe to the DQ event filter (filter-pp or filter-PbPb) - void processPPWithFilterBarrelOnly(MyEventsWithMultsAndFilter const& collisions, MyBCs const& bcs, aod::Zdcs& zdcs, + void processPPWithFilterBarrelOnly(MyEventsWithMultsAndFilter const& collisions, MyBCs const& bcs, aod::Zdcs const& zdcs, MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { @@ -1881,7 +1884,7 @@ struct TableMaker { } // produce the barrel-only DQ skimmed data model typically for pp/p-Pb or UPC Pb-Pb (no centrality), meant to run on skimmed data - void processPPBarrelOnly(MyEventsWithMults const& collisions, MyBCs const& bcs, aod::Zdcs& zdcs, + void processPPBarrelOnly(MyEventsWithMults const& collisions, MyBCs const& bcs, aod::Zdcs const& zdcs, MyBarrelTracksWithCov const& tracksBarrel, TrackAssoc const& trackAssocs) { @@ -1931,7 +1934,7 @@ struct TableMaker { MyBarrelTracksWithCov const& tracksBarrel, MyMuonsWithCov const& muons, MFTTracks const& mftTracks, TrackAssoc const& trackAssocs, FwdTrackAssoc const& fwdTrackAssocs, - MFTTrackAssoc const& mftAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + MFTTrackAssoc const& mftAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { fullSkimming(collisions, bcs, nullptr, tracksBarrel, muons, mftTracks, trackAssocs, fwdTrackAssocs, mftAssocs, nullptr, ft0s, fv0as, fdds); } @@ -1939,7 +1942,7 @@ struct TableMaker { // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter void processPbPbBarrelOnly(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs, MyBarrelTracksWithCov const& tracksBarrel, - TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + TrackAssoc const& trackAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { computeOccupancyEstimators(collisions, tracksPosWithCov, tracksNegWithCov, presliceWithCov, bcs); computeCollMergingTag(collisions, tracksBarrel, presliceWithCov); @@ -1949,7 +1952,7 @@ struct TableMaker { // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no TOF void processPbPbBarrelOnlyNoTOF(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs, MyBarrelTracksWithCovNoTOF const& tracksBarrel, - TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + TrackAssoc const& trackAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { computeOccupancyEstimators(collisions, tracksPosWithCovNoTOF, tracksNegWithCovNoTOF, presliceWithCovNoTOF, bcs); computeCollMergingTag(collisions, tracksBarrel, presliceWithCovNoTOF); @@ -1957,9 +1960,9 @@ struct TableMaker { } // produce the barrel-only DQ skimmed data model typically for UPC Pb-Pb (no centrality), subscribe to the DQ rapidity gap event filter (filter-PbPb) - void processPbPbWithFilterBarrelOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, MyBCs const& bcs, aod::Zdcs& zdcs, + void processPbPbWithFilterBarrelOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, MyBCs const& bcs, aod::Zdcs const& zdcs, MyBarrelTracksWithCov const& tracksBarrel, - TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + TrackAssoc const& trackAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { computeOccupancyEstimators(collisions, tracksPosWithCov, tracksNegWithCov, presliceWithCov, bcs); computeCollMergingTag(collisions, tracksBarrel, presliceWithCov); @@ -1969,7 +1972,7 @@ struct TableMaker { // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter void processPbPbBarrelOnlyWithV0Bits(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs, MyBarrelTracksWithV0Bits const& tracksBarrel, - TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + TrackAssoc const& trackAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { computeOccupancyEstimators(collisions, tracksPos, tracksNeg, preslice, bcs); computeCollMergingTag(collisions, tracksBarrel, preslice); @@ -1979,7 +1982,7 @@ struct TableMaker { // produce the barrel only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter void processPbPbBarrelOnlyWithV0BitsNoTOF(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs, MyBarrelTracksWithV0BitsNoTOF const& tracksBarrel, - TrackAssoc const& trackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + TrackAssoc const& trackAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { computeOccupancyEstimators(collisions, tracksPosNoTOF, tracksNegNoTOF, presliceNoTOF, bcs); computeCollMergingTag(collisions, tracksBarrel, presliceNoTOF); @@ -1988,14 +1991,14 @@ struct TableMaker { // produce the muon only DQ skimmed data model typically for Pb-Pb (with centrality), no subscribtion to the DQ event filter void processPbPbMuonOnly(MyEventsWithCentAndMults const& collisions, MyBCs const& bcs, - MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr, nullptr, ft0s, fv0as, fdds); } // produce the muon-only DQ skimmed data model typically for UPC Pb-Pb (no centrality), subscribe to the DQ rapidity gap event filter (filter-PbPb) - void processPbPbWithFilterMuonOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, MyBCs const& bcs, aod::Zdcs& zdcs, - MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + void processPbPbWithFilterMuonOnly(MyEventsWithMultsAndRapidityGapFilter const& collisions, MyBCs const& bcs, aod::Zdcs const& zdcs, + MyMuonsWithCov const& muons, FwdTrackAssoc const& fwdTrackAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { fullSkimming(collisions, bcs, zdcs, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr, nullptr, ft0s, fv0as, fdds); } @@ -2003,7 +2006,7 @@ struct TableMaker { // produce the muon only DQ skimmed data model typically for Pb-Pb (with centrality and flow), no subscribtion to the DQ event filter // no DCA table filled by the FwdTracExtension to optimize the memory consumption void processPbPbStreamMuonOnly(MyEventsWithCentAndMultsQvect const& collisions, MyBCs const& bcs, - MyMuonsNoDca const& muons, FwdTrackAssoc const& fwdTrackAssocs, aod::FT0s& ft0s, aod::FV0As& fv0as, aod::FDDs& fdds) + MyMuonsNoDca const& muons, FwdTrackAssoc const& fwdTrackAssocs, aod::FT0s const& ft0s, aod::FV0As const& fv0as, aod::FDDs const& fdds) { fullSkimming(collisions, bcs, nullptr, nullptr, muons, nullptr, nullptr, fwdTrackAssocs, nullptr, nullptr, ft0s, fv0as, fdds); } @@ -2036,11 +2039,11 @@ struct TableMaker { void processOnlyBCs(soa::Join::iterator const& bc) { for (int i = 0; i < o2::aod::evsel::kNsel; i++) { - if (bc.selection_bit(i) > 0) { - (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(0.0, static_cast(i)); + if (static_cast(bc.selection_bit(i)) > 0) { + (dynamic_cast(fStatsList->At(kStatsEvent)))->Fill(0.0, static_cast(i)); } } - (reinterpret_cast(fStatsList->At(kStatsEvent)))->Fill(0.0, static_cast(o2::aod::evsel::kNsel)); + (dynamic_cast(fStatsList->At(kStatsEvent)))->Fill(0.0, static_cast(o2::aod::evsel::kNsel)); } PROCESS_SWITCH(TableMaker, processPP, "Build full DQ skimmed data model for pp/p-Pb w/o event filtering (use Zorro)", false); @@ -2068,7 +2071,7 @@ struct TableMaker { PROCESS_SWITCH(TableMaker, processOnlyBCs, "Analyze the BCs to store sampled lumi", false); }; -void DefineHistograms(HistogramManager* histMan, TString histClasses, Configurable configVar) +void DefineHistograms(HistogramManager* histMan, const TString& histClasses, const Configurable& configVar) { // // Define here the histograms for all the classes required in analysis. @@ -2076,7 +2079,7 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses, Configurab // The histogram classes and their components histograms are defined below depending on the name of the histogram class // std::unique_ptr objArray(histClasses.Tokenize(";")); - for (Int_t iclass = 0; iclass < objArray->GetEntries(); ++iclass) { + for (int iclass = 0; iclass < objArray->GetEntries(); ++iclass) { TString classStr = objArray->At(iclass)->GetName(); histMan->AddHistClass(classStr.Data());