From 08a12b988284b3c9a8bc29cf8bbac8405ffccad4 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Wed, 14 Sep 2022 15:16:41 +0200 Subject: [PATCH 01/29] Reinstating everything from a backup --- PWGUD/DataModel/UPCFilterCentralBarrel.h | 42 ++++ PWGUD/TableProducer/CMakeLists.txt | 6 + .../TableProducer/upcFilterCentralBarrel.cxx | 190 ++++++++++++++++++ PWGUD/Tasks/CMakeLists.txt | 10 + PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx | 72 +++++++ 5 files changed, 320 insertions(+) create mode 100644 PWGUD/DataModel/UPCFilterCentralBarrel.h create mode 100644 PWGUD/TableProducer/upcFilterCentralBarrel.cxx create mode 100644 PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx diff --git a/PWGUD/DataModel/UPCFilterCentralBarrel.h b/PWGUD/DataModel/UPCFilterCentralBarrel.h new file mode 100644 index 00000000000..9cba97184be --- /dev/null +++ b/PWGUD/DataModel/UPCFilterCentralBarrel.h @@ -0,0 +1,42 @@ +// 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. +/// +/// \brief +/// \author Roman Lavicka, roman.lavicka@cern.ch +/// \since 12.07.2022 + +#ifndef O2_ANALYSIS_UPCFILTERCENTRALBARREL_H +#define O2_ANALYSIS_UPCFILTERCENTRALBARREL_H + +enum MyParticle { P_ELECTRON = 0, P_MUON = 1, P_PION = 2, P_KAON = 3, P_PROTON = 4}; + +namespace o2::aod +{ + + namespace upccentralbarrel + { + DECLARE_SOA_COLUMN(IsTwoTracks, isTwoTracks, bool); //! Exactly two tracks were found + DECLARE_SOA_COLUMN(IsFourTracks, isFourTracks, bool); //! Exactly four tracks were found + DECLARE_SOA_COLUMN(FlagWhichParticle, flagWhichParticle, int); //! Flag the particle according to TPC and TOF + DECLARE_SOA_COLUMN(ReachedTOF, reachedTOF, bool); //! Mark, if track hits TOF + } // namespace upccentralbarrel + + DECLARE_SOA_TABLE(UPCTrackCandidates, "AOD", "UPCCANDIDATES", //! Table with UPC track candidates + o2::soa::Index<>, + collision::PosX, collision::PosY, collision::PosZ, collision::NumContrib, + track::Pt, track::P, + upccentralbarrel::IsTwoTracks, upccentralbarrel::IsFourTracks, + upccentralbarrel::FlagWhichParticle, upccentralbarrel::ReachedTOF); + using UPCTrackCandidate = UPCTrackCandidates::iterator; + +} // namespace o2::aod + +#endif // O2_ANALYSIS_UPCFILTERCENTRALBARREL_H diff --git a/PWGUD/TableProducer/CMakeLists.txt b/PWGUD/TableProducer/CMakeLists.txt index 5ab117e2bca..f69a0d121fc 100644 --- a/PWGUD/TableProducer/CMakeLists.txt +++ b/PWGUD/TableProducer/CMakeLists.txt @@ -23,3 +23,9 @@ o2physics_add_dpl_workflow(upccand-producer SOURCES UPCCandidateProducer.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::UPCCutparHolder COMPONENT_NAME Analysis) + + +o2physics_add_dpl_workflow(upc-filter-central-barrel + SOURCES upcFilterCentralBarrel.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGUD/TableProducer/upcFilterCentralBarrel.cxx b/PWGUD/TableProducer/upcFilterCentralBarrel.cxx new file mode 100644 index 00000000000..892774431fa --- /dev/null +++ b/PWGUD/TableProducer/upcFilterCentralBarrel.cxx @@ -0,0 +1,190 @@ +// 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. +/// +/// \brief +/// \author Roman Lavicka, roman.lavicka@cern.ch +/// \since 12.07.2022 + +//#include +//#include + +// O2 headers +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" + +// O2Physics headers +#include "PWGUD/DataModel/UPCFilterCentralBarrel.h" +#include "Common/DataModel/PIDResponse.h" + +using namespace o2; +using namespace o2::framework; + +template +int TestTPConlyPIDhypothesis(TCs barrelTrack) +// Choose, which particle it is according to PID of TPC only +{ + + float pidTPC[5]; + pidTPC[P_ELECTRON] = TMath::Abs(barrelTrack.tpcNSigmaEl()); + pidTPC[P_MUON] = TMath::Abs(barrelTrack.tpcNSigmaMu()); + pidTPC[P_PION] = TMath::Abs(barrelTrack.tpcNSigmaPi()); + pidTPC[P_KAON] = TMath::Abs(barrelTrack.tpcNSigmaKa()); + pidTPC[P_PROTON] = TMath::Abs(barrelTrack.tpcNSigmaPr()); + + return std::distance(std::begin(pidTPC), std::min_element(std::begin(pidTPC), std::end(pidTPC))); + +} + + +template +int TestPIDhypothesis(TCs barrelTrack) +// Choose, which particle it is according to PID of TPC and TOF +{ + + float pidTPC[5], pidTOF[5]; + pidTPC[P_ELECTRON] = TMath::Abs(barrelTrack.tpcNSigmaEl()); + pidTPC[P_MUON] = TMath::Abs(barrelTrack.tpcNSigmaMu()); + pidTPC[P_PION] = TMath::Abs(barrelTrack.tpcNSigmaPi()); + pidTPC[P_KAON] = TMath::Abs(barrelTrack.tpcNSigmaKa()); + pidTPC[P_PROTON] = TMath::Abs(barrelTrack.tpcNSigmaPr()); + pidTOF[P_ELECTRON] = TMath::Abs(barrelTrack.tofNSigmaEl()); + pidTOF[P_MUON] = TMath::Abs(barrelTrack.tofNSigmaMu()); + pidTOF[P_PION] = TMath::Abs(barrelTrack.tofNSigmaPi()); + pidTOF[P_KAON] = TMath::Abs(barrelTrack.tofNSigmaKa()); + pidTOF[P_PROTON] = TMath::Abs(barrelTrack.tofNSigmaPr()); + + int _id_TPC = std::distance(std::begin(pidTPC), std::min_element(std::begin(pidTPC), std::end(pidTPC))); + float pidTPCpick[3] = {pidTPC[0], pidTPC[1], pidTPC[2]}; + int _id_TPC_pick = std::distance(std::begin(pidTPCpick), std::min_element(std::begin(pidTPCpick), std::end(pidTPCpick))); + + int _id_TOF = std::distance(std::begin(pidTOF), std::min_element(std::begin(pidTOF), std::end(pidTOF))); +// + if (pidTOF[_id_TOF] < 999.){ + if (_id_TPC == P_ELECTRON || _id_TPC == P_MUON || _id_TPC == P_PION){ + if (_id_TOF == P_KAON ) return P_KAON; // probably kaon + else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton + else { + if (_id_TPC == P_ELECTRON) return P_ELECTRON; // probably electron + else if (_id_TPC == P_MUON) return P_MUON; // probably muon + else return P_PION; // probably pion + } + } + else if (_id_TPC == P_KAON){ + if (_id_TOF == P_KAON ) return P_KAON; // probably kaon + else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton + else { + if (_id_TPC_pick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron + else if (_id_TPC_pick == P_MUON) return P_MUON; // probably misidentified muon + else if (_id_TPC_pick == P_PION) return P_PION; // probably misidentified pion + } + } + else { + if (_id_TOF == P_KAON ) return P_KAON; // probably kaon + else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton + else { + if (_id_TPC_pick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron + else if (_id_TPC_pick == P_MUON) return P_MUON; // probably misidentified muon + else if (_id_TPC_pick == P_PION) return P_PION; // probably misidentified pion + } + } + } + else return _id_TPC; + + return -1; +} + + +struct UPCFilterCentralBarrel { + + HistogramRegistry registry{ + "registry", + { + {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCelectronIdentified", "Tracks identified as electrons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCmuonIdentified", "Tracks identified as muons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCpionIdentified", "Tracks identified as pions;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCkaonIdentified", "Tracks identified as kaons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCprotonIdentified", "Tracks identified as protons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } } + } + }; + + // declare shortcuts + using TCs = soa::Join; + + // init + void init(InitContext&){} // end init + + // declare production of table + Produces selectedUPCcandidateTracks; + + // declate configurables + Configurable maxNSigmaTPC{"maxNSigmaTPC", 4, {"Maximum allowed TPC PID sigma for the most probable particle; default it 4."}}; + Configurable maxNSigmaTOF{"maxNSigmaTOF", 4, {"Maximum allowed TOF PID sigma for the most probable particle; default it 4."}}; + + // process + void process(aod::Collision const& collision, TCs& barrelTracks) { + + for (auto & barrelTrack: barrelTracks) { + + bool isTwoTracks = false; + bool isFourTracks = false; + int whatTrack = 0; + bool reachedTOF = barrelTrack.hasTOF(); + + // Selection criteria + if (barrelTrack.p() < 0.1 ) continue; + + if (collision.numContrib() == 2) isTwoTracks = true; + if (collision.numContrib() == 4) isFourTracks = true; + + if (isTwoTracks && reachedTOF){ + whatTrack = TestTPConlyPIDhypothesis(barrelTrack); +// whatTrack = TestPIDhypothesis(barrelTrack); + LOGP(info,"momentum={}",barrelTrack.p()); + LOGP(info,"TPC"); + LOGP(info,"El={}, Mu={}, Pi={}, Ka={}, Pr={}, ",barrelTrack.tpcNSigmaEl(), barrelTrack.tpcNSigmaMu(), barrelTrack.tpcNSigmaPi(), barrelTrack.tpcNSigmaKa(), barrelTrack.tpcNSigmaPr()); + LOGP(info,"tpcExpSigmaEl={} tpcExpSignalDiffEl={}, tpcSignal={}",barrelTrack.tpcExpSigmaEl(),barrelTrack.tpcExpSignalDiffEl(),barrelTrack.tpcSignal()); + LOGP(info,"TOF"); + LOGP(info,"El={}, Mu={}, Pi={}, Ka={}, Pr={}, ",barrelTrack.tofNSigmaEl(), barrelTrack.tofNSigmaMu(), barrelTrack.tofNSigmaPi(), barrelTrack.tofNSigmaKa(), barrelTrack.tofNSigmaPr()); + LOGP(info,"tofExpSigmaEl={} tofExpSignalEl={} tofExpSignalDiffEl={}",barrelTrack.tofExpSigmaEl(),barrelTrack.tofExpSignalDiffEl(),barrelTrack.tofExpSignalDiffEl()); + LOGP(info,"************* this tracks is ={}", whatTrack); + + registry.get(HIST("hTPCsignalVsMom"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 0) registry.get(HIST("hTPCelectronIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 1) registry.get(HIST("hTPCmuonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 2) registry.get(HIST("hTPCpionIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 3) registry.get(HIST("hTPCkaonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 4) registry.get(HIST("hTPCprotonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + + } + + + + selectedUPCcandidateTracks(collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), + barrelTrack.pt(), barrelTrack.p(), + isTwoTracks, isFourTracks, whatTrack, reachedTOF); + + } // end loop over barrel tracks + + } // end process + +}; + + + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"upc-filter-central-barrel"}) + }; +} \ No newline at end of file diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index fa3d0b3e171..a528a5b2876 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -43,3 +43,13 @@ o2physics_add_dpl_workflow(upccand-analyzer SOURCES UPCCandidateAnalyzer.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(upc-track-skimmer-qa + SOURCES UPCTrackSkimmerQA.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(upc-central-barrel-analyzer + SOURCES upcCentralBarrelAnalyzer.cxx + PUBLIC_LINK_LIBRARIES O2::Framework + COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx new file mode 100644 index 00000000000..dc570745d1e --- /dev/null +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx @@ -0,0 +1,72 @@ +// 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. +/// +/// \brief +/// \author Roman Lavicka, roman.lavicka@cern.ch +/// \since 12.07.2022 + +// O2 headers +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" + +// O2Physics headers +#include "PWGUD/DataModel/UPCFilterCentralBarrel.h" + +using namespace o2; +using namespace o2::framework; + +struct UPCCentralBarrelAnalyzer { + + HistogramRegistry registry{ + "registry", + { + {"hRegNtracks", ";n tracks; Entries", { HistType::kTH1F, { { 201,-0.5,200.5 } } } }, + {"hRegChannels", ";channel; Entries", { HistType::kTH1I, { { 4,-0.5,3.5 } } } }, + {"hRegPvsPt", ";Track #it{p} (GeV/#it{c}); Track #it{p}_{T} (GeV/#it{c})", { HistType::kTH2F, { { 2000,0.,2. }, { 2000,0.,2. } } } }, + {"hRegPvsPt2trks", ";Track #it{p} (GeV/#it{c}); Track #it{p}_{T} (GeV/#it{c})", { HistType::kTH2F, { { 2000,0.,2. }, { 2000,0.,2. } } } }, + {"hRegPvsPt4trks", ";Track #it{p} (GeV/#it{c}); Track #it{p}_{T} (GeV/#it{c})", { HistType::kTH2F, { { 2000,0.,2. }, { 2000,0.,2. } } } } + } + }; + + void init(InitContext&){} + + void process(aod::UPCTrackCandidates const& upcTracks) { + + for (auto & upcTrack: upcTracks) { + + registry.get(HIST("hRegNtracks"))->Fill(upcTrack.numContrib()); + registry.get(HIST("hRegPvsPt"))->Fill(upcTrack.p(),upcTrack.pt()); + if (upcTrack.isTwoTracks()) { + registry.get(HIST("hRegChannels"))->Fill(1); + registry.get(HIST("hRegPvsPt2trks"))->Fill(upcTrack.p(),upcTrack.pt()); + } + else if (upcTrack.isFourTracks()) { + registry.get(HIST("hRegChannels"))->Fill(2); + registry.get(HIST("hRegPvsPt4trks"))->Fill(upcTrack.p(),upcTrack.pt()); + } + else if (upcTrack.isTwoTracks() && upcTrack.isFourTracks()) registry.get(HIST("hRegChannels"))->Fill(3); + else registry.get(HIST("hRegChannels"))->Fill(0); + + } // end loop over barrel tracks + + + } // end process + +}; + + + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"upc-central-barrel-analyzer"}) + }; +} \ No newline at end of file From 7449646d99bcf234cd0bef22f451be733f6ac79b Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 20 Sep 2022 15:21:26 +0200 Subject: [PATCH 02/29] some testing modifications for data filter (2 process, probably delete later on) and new file just for MC setup --- PWGUD/TableProducer/CMakeLists.txt | 7 +- .../TableProducer/upcFilterCentralBarrel.cxx | 40 +++- PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 223 ++++++++++++++++++ 3 files changed, 266 insertions(+), 4 deletions(-) create mode 100644 PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx diff --git a/PWGUD/TableProducer/CMakeLists.txt b/PWGUD/TableProducer/CMakeLists.txt index f69a0d121fc..699b296b08f 100644 --- a/PWGUD/TableProducer/CMakeLists.txt +++ b/PWGUD/TableProducer/CMakeLists.txt @@ -28,4 +28,9 @@ o2physics_add_dpl_workflow(upccand-producer o2physics_add_dpl_workflow(upc-filter-central-barrel SOURCES upcFilterCentralBarrel.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(upc-mc-central-barrel + SOURCES upcMonteCarloCentralBarrel.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGUD/TableProducer/upcFilterCentralBarrel.cxx b/PWGUD/TableProducer/upcFilterCentralBarrel.cxx index 892774431fa..2d00aeb46a4 100644 --- a/PWGUD/TableProducer/upcFilterCentralBarrel.cxx +++ b/PWGUD/TableProducer/upcFilterCentralBarrel.cxx @@ -105,9 +105,14 @@ int TestPIDhypothesis(TCs barrelTrack) struct UPCFilterCentralBarrel { + // Global varialbes + bool isMonteCarloData = false; + + HistogramRegistry registry{ "registry", { + {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {10,-0.5,9.5} } } }, {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, {"hTPCelectronIdentified", "Tracks identified as electrons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, {"hTPCmuonIdentified", "Tracks identified as muons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, @@ -118,7 +123,7 @@ struct UPCFilterCentralBarrel { }; // declare shortcuts - using TCs = soa::Join; @@ -133,10 +138,22 @@ struct UPCFilterCentralBarrel { Configurable maxNSigmaTOF{"maxNSigmaTOF", 4, {"Maximum allowed TOF PID sigma for the most probable particle; default it 4."}}; // process - void process(aod::Collision const& collision, TCs& barrelTracks) { + void analyseBarrelTracks(aod::Collision const& collision, + aod::McCollisions const& mcCollisions, + MeasuredTCs& barrelTracks) + { + +// auto & mcCollision: mcCollisions::iterator; + + registry.get(HIST("hEffectOfSelections"))->Fill(3); + + LOGF(info, "vtx-z (data) = %f", collision.posZ()); + if (mcCollisions != nullptr) LOGF(info, "vtx-z (data) = %f | size (MC) = %d", collision.posZ(), mcCollisions.size()); for (auto & barrelTrack: barrelTracks) { + registry.get(HIST("hEffectOfSelections"))->Fill(0); + bool isTwoTracks = false; bool isFourTracks = false; int whatTrack = 0; @@ -144,11 +161,13 @@ struct UPCFilterCentralBarrel { // Selection criteria if (barrelTrack.p() < 0.1 ) continue; + registry.get(HIST("hEffectOfSelections"))->Fill(1); if (collision.numContrib() == 2) isTwoTracks = true; if (collision.numContrib() == 4) isFourTracks = true; if (isTwoTracks && reachedTOF){ + registry.get(HIST("hEffectOfSelections"))->Fill(2); whatTrack = TestTPConlyPIDhypothesis(barrelTrack); // whatTrack = TestPIDhypothesis(barrelTrack); LOGP(info,"momentum={}",barrelTrack.p()); @@ -177,7 +196,22 @@ struct UPCFilterCentralBarrel { } // end loop over barrel tracks - } // end process + } // end data analysis + + void processMeasuredData(aod::Collision const& collision, + MeasuredTCs& barrelTracks){ + analyseBarrelTracks(collision, (aod::McCollisions)nullptr, barrelTracks); + } // end processMeasuredData + + void processMonteCarloData(aod::Collision const& collision, + aod::McCollisions const& mcCollisions, + MeasuredTCs& barrelTracks){ + isMonteCarloData = true; + analyseBarrelTracks(collision, mcCollisions, barrelTracks); + } // end processMonteCarloData + + PROCESS_SWITCH(UPCFilterCentralBarrel, processMeasuredData, "Process tables with measured data only", false); + PROCESS_SWITCH(UPCFilterCentralBarrel, processMonteCarloData, "Process tables with Monte Carlo data", false); }; diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx new file mode 100644 index 00000000000..10978324e9a --- /dev/null +++ b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx @@ -0,0 +1,223 @@ +// 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. +/// +/// \brief +/// \author Roman Lavicka, roman.lavicka@cern.ch +/// \since 12.07.2022 + +//#include +//#include + +// O2 headers +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" + +// O2Physics headers +#include "Common/DataModel/PIDResponse.h" + +using namespace o2; +using namespace o2::framework; + +template +int TestTPConlyPIDhypothesis(TCs barrelTrack) +// Choose, which particle it is according to PID of TPC only +{ + + float pidTPC[5]; + pidTPC[P_ELECTRON] = TMath::Abs(barrelTrack.tpcNSigmaEl()); + pidTPC[P_MUON] = TMath::Abs(barrelTrack.tpcNSigmaMu()); + pidTPC[P_PION] = TMath::Abs(barrelTrack.tpcNSigmaPi()); + pidTPC[P_KAON] = TMath::Abs(barrelTrack.tpcNSigmaKa()); + pidTPC[P_PROTON] = TMath::Abs(barrelTrack.tpcNSigmaPr()); + + return std::distance(std::begin(pidTPC), std::min_element(std::begin(pidTPC), std::end(pidTPC))); + +} + + +template +int TestPIDhypothesis(TCs barrelTrack) +// Choose, which particle it is according to PID of TPC and TOF +{ + + float pidTPC[5], pidTOF[5]; + pidTPC[P_ELECTRON] = TMath::Abs(barrelTrack.tpcNSigmaEl()); + pidTPC[P_MUON] = TMath::Abs(barrelTrack.tpcNSigmaMu()); + pidTPC[P_PION] = TMath::Abs(barrelTrack.tpcNSigmaPi()); + pidTPC[P_KAON] = TMath::Abs(barrelTrack.tpcNSigmaKa()); + pidTPC[P_PROTON] = TMath::Abs(barrelTrack.tpcNSigmaPr()); + pidTOF[P_ELECTRON] = TMath::Abs(barrelTrack.tofNSigmaEl()); + pidTOF[P_MUON] = TMath::Abs(barrelTrack.tofNSigmaMu()); + pidTOF[P_PION] = TMath::Abs(barrelTrack.tofNSigmaPi()); + pidTOF[P_KAON] = TMath::Abs(barrelTrack.tofNSigmaKa()); + pidTOF[P_PROTON] = TMath::Abs(barrelTrack.tofNSigmaPr()); + + int _id_TPC = std::distance(std::begin(pidTPC), std::min_element(std::begin(pidTPC), std::end(pidTPC))); + float pidTPCpick[3] = {pidTPC[0], pidTPC[1], pidTPC[2]}; + int _id_TPC_pick = std::distance(std::begin(pidTPCpick), std::min_element(std::begin(pidTPCpick), std::end(pidTPCpick))); + + int _id_TOF = std::distance(std::begin(pidTOF), std::min_element(std::begin(pidTOF), std::end(pidTOF))); +// + if (pidTOF[_id_TOF] < 999.){ + if (_id_TPC == P_ELECTRON || _id_TPC == P_MUON || _id_TPC == P_PION){ + if (_id_TOF == P_KAON ) return P_KAON; // probably kaon + else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton + else { + if (_id_TPC == P_ELECTRON) return P_ELECTRON; // probably electron + else if (_id_TPC == P_MUON) return P_MUON; // probably muon + else return P_PION; // probably pion + } + } + else if (_id_TPC == P_KAON){ + if (_id_TOF == P_KAON ) return P_KAON; // probably kaon + else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton + else { + if (_id_TPC_pick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron + else if (_id_TPC_pick == P_MUON) return P_MUON; // probably misidentified muon + else if (_id_TPC_pick == P_PION) return P_PION; // probably misidentified pion + } + } + else { + if (_id_TOF == P_KAON ) return P_KAON; // probably kaon + else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton + else { + if (_id_TPC_pick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron + else if (_id_TPC_pick == P_MUON) return P_MUON; // probably misidentified muon + else if (_id_TPC_pick == P_PION) return P_PION; // probably misidentified pion + } + } + } + else return _id_TPC; + + return -1; +} + + +struct UPCFilterCentralBarrel { + + // Global varialbes + bool isMonteCarloData = false; + + + HistogramRegistry registry{ + "registry", + { + {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {10,-0.5,9.5} } } }, + {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCelectronIdentified", "Tracks identified as electrons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCmuonIdentified", "Tracks identified as muons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCpionIdentified", "Tracks identified as pions;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCkaonIdentified", "Tracks identified as kaons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCprotonIdentified", "Tracks identified as protons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } } + } + }; + + // declare shortcuts + using MeasuredTCs = soa::Join; + + // init + void init(InitContext&){} // end init + + // declare production of table + Produces selectedUPCcandidateTracks; + + // declate configurables + Configurable maxNSigmaTPC{"maxNSigmaTPC", 4, {"Maximum allowed TPC PID sigma for the most probable particle; default it 4."}}; + Configurable maxNSigmaTOF{"maxNSigmaTOF", 4, {"Maximum allowed TOF PID sigma for the most probable particle; default it 4."}}; + + // process + void analyseBarrelTracks(aod::Collision const& collision, + aod::McCollisions const& mcCollisions, + MeasuredTCs& barrelTracks) + { + +// auto & mcCollision: mcCollisions::iterator; + + registry.get(HIST("hEffectOfSelections"))->Fill(3); + + LOGF(info, "vtx-z (data) = %f", collision.posZ()); + if (mcCollisions != nullptr) LOGF(info, "vtx-z (data) = %f | size (MC) = %d", collision.posZ(), mcCollisions.size()); + + for (auto & barrelTrack: barrelTracks) { + + registry.get(HIST("hEffectOfSelections"))->Fill(0); + + bool isTwoTracks = false; + bool isFourTracks = false; + int whatTrack = 0; + bool reachedTOF = barrelTrack.hasTOF(); + + // Selection criteria + if (barrelTrack.p() < 0.1 ) continue; + registry.get(HIST("hEffectOfSelections"))->Fill(1); + + if (collision.numContrib() == 2) isTwoTracks = true; + if (collision.numContrib() == 4) isFourTracks = true; + + if (isTwoTracks && reachedTOF){ + registry.get(HIST("hEffectOfSelections"))->Fill(2); + whatTrack = TestTPConlyPIDhypothesis(barrelTrack); +// whatTrack = TestPIDhypothesis(barrelTrack); + LOGP(info,"momentum={}",barrelTrack.p()); + LOGP(info,"TPC"); + LOGP(info,"El={}, Mu={}, Pi={}, Ka={}, Pr={}, ",barrelTrack.tpcNSigmaEl(), barrelTrack.tpcNSigmaMu(), barrelTrack.tpcNSigmaPi(), barrelTrack.tpcNSigmaKa(), barrelTrack.tpcNSigmaPr()); + LOGP(info,"tpcExpSigmaEl={} tpcExpSignalDiffEl={}, tpcSignal={}",barrelTrack.tpcExpSigmaEl(),barrelTrack.tpcExpSignalDiffEl(),barrelTrack.tpcSignal()); + LOGP(info,"TOF"); + LOGP(info,"El={}, Mu={}, Pi={}, Ka={}, Pr={}, ",barrelTrack.tofNSigmaEl(), barrelTrack.tofNSigmaMu(), barrelTrack.tofNSigmaPi(), barrelTrack.tofNSigmaKa(), barrelTrack.tofNSigmaPr()); + LOGP(info,"tofExpSigmaEl={} tofExpSignalEl={} tofExpSignalDiffEl={}",barrelTrack.tofExpSigmaEl(),barrelTrack.tofExpSignalDiffEl(),barrelTrack.tofExpSignalDiffEl()); + LOGP(info,"************* this tracks is ={}", whatTrack); + + registry.get(HIST("hTPCsignalVsMom"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 0) registry.get(HIST("hTPCelectronIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 1) registry.get(HIST("hTPCmuonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 2) registry.get(HIST("hTPCpionIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 3) registry.get(HIST("hTPCkaonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + if (whatTrack == 4) registry.get(HIST("hTPCprotonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); + + } + + + + selectedUPCcandidateTracks(collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), + barrelTrack.pt(), barrelTrack.p(), + isTwoTracks, isFourTracks, whatTrack, reachedTOF); + + } // end loop over barrel tracks + + } // end data analysis + + void processMeasuredData(aod::Collision const& collision, + MeasuredTCs& barrelTracks){ + analyseBarrelTracks(collision, (aod::McCollisions)nullptr, barrelTracks); + } // end processMeasuredData + + void processMonteCarloData(aod::Collision const& collision, + aod::McCollisions const& mcCollisions, + MeasuredTCs& barrelTracks){ + isMonteCarloData = true; + analyseBarrelTracks(collision, mcCollisions, barrelTracks); + } // end processMonteCarloData + + PROCESS_SWITCH(UPCFilterCentralBarrel, processMeasuredData, "Process tables with measured data only", false); + PROCESS_SWITCH(UPCFilterCentralBarrel, processMonteCarloData, "Process tables with Monte Carlo data", false); + +}; + + + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"upc-filter-central-barrel"}) + }; +} \ No newline at end of file From b8b7fef2c624c5421dcea0e300a3675bb8b4354c Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 20 Sep 2022 15:28:14 +0200 Subject: [PATCH 03/29] initial cleaning of the copied file --- PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 146 +-------------------- 1 file changed, 4 insertions(+), 142 deletions(-) diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx index 10978324e9a..eeea0293b38 100644 --- a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx +++ b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx @@ -22,85 +22,11 @@ #include "Framework/AnalysisDataModel.h" // O2Physics headers -#include "Common/DataModel/PIDResponse.h" +//#include "Common/DataModel/PIDResponse.h" using namespace o2; using namespace o2::framework; -template -int TestTPConlyPIDhypothesis(TCs barrelTrack) -// Choose, which particle it is according to PID of TPC only -{ - - float pidTPC[5]; - pidTPC[P_ELECTRON] = TMath::Abs(barrelTrack.tpcNSigmaEl()); - pidTPC[P_MUON] = TMath::Abs(barrelTrack.tpcNSigmaMu()); - pidTPC[P_PION] = TMath::Abs(barrelTrack.tpcNSigmaPi()); - pidTPC[P_KAON] = TMath::Abs(barrelTrack.tpcNSigmaKa()); - pidTPC[P_PROTON] = TMath::Abs(barrelTrack.tpcNSigmaPr()); - - return std::distance(std::begin(pidTPC), std::min_element(std::begin(pidTPC), std::end(pidTPC))); - -} - - -template -int TestPIDhypothesis(TCs barrelTrack) -// Choose, which particle it is according to PID of TPC and TOF -{ - - float pidTPC[5], pidTOF[5]; - pidTPC[P_ELECTRON] = TMath::Abs(barrelTrack.tpcNSigmaEl()); - pidTPC[P_MUON] = TMath::Abs(barrelTrack.tpcNSigmaMu()); - pidTPC[P_PION] = TMath::Abs(barrelTrack.tpcNSigmaPi()); - pidTPC[P_KAON] = TMath::Abs(barrelTrack.tpcNSigmaKa()); - pidTPC[P_PROTON] = TMath::Abs(barrelTrack.tpcNSigmaPr()); - pidTOF[P_ELECTRON] = TMath::Abs(barrelTrack.tofNSigmaEl()); - pidTOF[P_MUON] = TMath::Abs(barrelTrack.tofNSigmaMu()); - pidTOF[P_PION] = TMath::Abs(barrelTrack.tofNSigmaPi()); - pidTOF[P_KAON] = TMath::Abs(barrelTrack.tofNSigmaKa()); - pidTOF[P_PROTON] = TMath::Abs(barrelTrack.tofNSigmaPr()); - - int _id_TPC = std::distance(std::begin(pidTPC), std::min_element(std::begin(pidTPC), std::end(pidTPC))); - float pidTPCpick[3] = {pidTPC[0], pidTPC[1], pidTPC[2]}; - int _id_TPC_pick = std::distance(std::begin(pidTPCpick), std::min_element(std::begin(pidTPCpick), std::end(pidTPCpick))); - - int _id_TOF = std::distance(std::begin(pidTOF), std::min_element(std::begin(pidTOF), std::end(pidTOF))); -// - if (pidTOF[_id_TOF] < 999.){ - if (_id_TPC == P_ELECTRON || _id_TPC == P_MUON || _id_TPC == P_PION){ - if (_id_TOF == P_KAON ) return P_KAON; // probably kaon - else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton - else { - if (_id_TPC == P_ELECTRON) return P_ELECTRON; // probably electron - else if (_id_TPC == P_MUON) return P_MUON; // probably muon - else return P_PION; // probably pion - } - } - else if (_id_TPC == P_KAON){ - if (_id_TOF == P_KAON ) return P_KAON; // probably kaon - else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton - else { - if (_id_TPC_pick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron - else if (_id_TPC_pick == P_MUON) return P_MUON; // probably misidentified muon - else if (_id_TPC_pick == P_PION) return P_PION; // probably misidentified pion - } - } - else { - if (_id_TOF == P_KAON ) return P_KAON; // probably kaon - else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton - else { - if (_id_TPC_pick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron - else if (_id_TPC_pick == P_MUON) return P_MUON; // probably misidentified muon - else if (_id_TPC_pick == P_PION) return P_PION; // probably misidentified pion - } - } - } - else return _id_TPC; - - return -1; -} - struct UPCFilterCentralBarrel { @@ -112,90 +38,26 @@ struct UPCFilterCentralBarrel { "registry", { {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {10,-0.5,9.5} } } }, - {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCelectronIdentified", "Tracks identified as electrons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCmuonIdentified", "Tracks identified as muons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCpionIdentified", "Tracks identified as pions;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCkaonIdentified", "Tracks identified as kaons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCprotonIdentified", "Tracks identified as protons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } } } }; // declare shortcuts - using MeasuredTCs = soa::Join; + using MeasuredTCs = soa::Join; // init void init(InitContext&){} // end init - // declare production of table - Produces selectedUPCcandidateTracks; - - // declate configurables - Configurable maxNSigmaTPC{"maxNSigmaTPC", 4, {"Maximum allowed TPC PID sigma for the most probable particle; default it 4."}}; - Configurable maxNSigmaTOF{"maxNSigmaTOF", 4, {"Maximum allowed TOF PID sigma for the most probable particle; default it 4."}}; - // process void analyseBarrelTracks(aod::Collision const& collision, aod::McCollisions const& mcCollisions, - MeasuredTCs& barrelTracks) - { - -// auto & mcCollision: mcCollisions::iterator; + MeasuredTCs& barrelTracks){ registry.get(HIST("hEffectOfSelections"))->Fill(3); LOGF(info, "vtx-z (data) = %f", collision.posZ()); if (mcCollisions != nullptr) LOGF(info, "vtx-z (data) = %f | size (MC) = %d", collision.posZ(), mcCollisions.size()); - for (auto & barrelTrack: barrelTracks) { - - registry.get(HIST("hEffectOfSelections"))->Fill(0); - - bool isTwoTracks = false; - bool isFourTracks = false; - int whatTrack = 0; - bool reachedTOF = barrelTrack.hasTOF(); - - // Selection criteria - if (barrelTrack.p() < 0.1 ) continue; - registry.get(HIST("hEffectOfSelections"))->Fill(1); - - if (collision.numContrib() == 2) isTwoTracks = true; - if (collision.numContrib() == 4) isFourTracks = true; - - if (isTwoTracks && reachedTOF){ - registry.get(HIST("hEffectOfSelections"))->Fill(2); - whatTrack = TestTPConlyPIDhypothesis(barrelTrack); -// whatTrack = TestPIDhypothesis(barrelTrack); - LOGP(info,"momentum={}",barrelTrack.p()); - LOGP(info,"TPC"); - LOGP(info,"El={}, Mu={}, Pi={}, Ka={}, Pr={}, ",barrelTrack.tpcNSigmaEl(), barrelTrack.tpcNSigmaMu(), barrelTrack.tpcNSigmaPi(), barrelTrack.tpcNSigmaKa(), barrelTrack.tpcNSigmaPr()); - LOGP(info,"tpcExpSigmaEl={} tpcExpSignalDiffEl={}, tpcSignal={}",barrelTrack.tpcExpSigmaEl(),barrelTrack.tpcExpSignalDiffEl(),barrelTrack.tpcSignal()); - LOGP(info,"TOF"); - LOGP(info,"El={}, Mu={}, Pi={}, Ka={}, Pr={}, ",barrelTrack.tofNSigmaEl(), barrelTrack.tofNSigmaMu(), barrelTrack.tofNSigmaPi(), barrelTrack.tofNSigmaKa(), barrelTrack.tofNSigmaPr()); - LOGP(info,"tofExpSigmaEl={} tofExpSignalEl={} tofExpSignalDiffEl={}",barrelTrack.tofExpSigmaEl(),barrelTrack.tofExpSignalDiffEl(),barrelTrack.tofExpSignalDiffEl()); - LOGP(info,"************* this tracks is ={}", whatTrack); - - registry.get(HIST("hTPCsignalVsMom"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 0) registry.get(HIST("hTPCelectronIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 1) registry.get(HIST("hTPCmuonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 2) registry.get(HIST("hTPCpionIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 3) registry.get(HIST("hTPCkaonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 4) registry.get(HIST("hTPCprotonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - - } - - - - selectedUPCcandidateTracks(collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), - barrelTrack.pt(), barrelTrack.p(), - isTwoTracks, isFourTracks, whatTrack, reachedTOF); - - } // end loop over barrel tracks - - } // end data analysis + } // end analyseBarrelTracks void processMeasuredData(aod::Collision const& collision, MeasuredTCs& barrelTracks){ From e3c835d59902d0a11a1d534b02d0a3234f9867d1 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Wed, 21 Sep 2022 10:06:59 +0200 Subject: [PATCH 04/29] now it is really clean workspace --- PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 33 ++++++++-------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx index eeea0293b38..e937a0e4858 100644 --- a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx +++ b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx @@ -31,8 +31,6 @@ using namespace o2::framework; struct UPCFilterCentralBarrel { // Global varialbes - bool isMonteCarloData = false; - HistogramRegistry registry{ "registry", @@ -48,31 +46,22 @@ struct UPCFilterCentralBarrel { void init(InitContext&){} // end init // process - void analyseBarrelTracks(aod::Collision const& collision, - aod::McCollisions const& mcCollisions, - MeasuredTCs& barrelTracks){ + void processSimulatorLevel(aod::Collision const& collision, + aod::McCollisions const& mcCollisions, + MeasuredTCs& barrelTracks){ - registry.get(HIST("hEffectOfSelections"))->Fill(3); + } // end processSimulatorLevel - LOGF(info, "vtx-z (data) = %f", collision.posZ()); - if (mcCollisions != nullptr) LOGF(info, "vtx-z (data) = %f | size (MC) = %d", collision.posZ(), mcCollisions.size()); + void processGeneratorLevel(aod::McCollision const& mcCollision, + aod::McParticles const& mcParticles){ - } // end analyseBarrelTracks + - void processMeasuredData(aod::Collision const& collision, - MeasuredTCs& barrelTracks){ - analyseBarrelTracks(collision, (aod::McCollisions)nullptr, barrelTracks); - } // end processMeasuredData - void processMonteCarloData(aod::Collision const& collision, - aod::McCollisions const& mcCollisions, - MeasuredTCs& barrelTracks){ - isMonteCarloData = true; - analyseBarrelTracks(collision, mcCollisions, barrelTracks); - } // end processMonteCarloData + } // end processGeneratorLevel - PROCESS_SWITCH(UPCFilterCentralBarrel, processMeasuredData, "Process tables with measured data only", false); - PROCESS_SWITCH(UPCFilterCentralBarrel, processMonteCarloData, "Process tables with Monte Carlo data", false); + PROCESS_SWITCH(UPCFilterCentralBarrel, processSimulatorLevel, "Iterate MC tables with reconstructed data", false); + PROCESS_SWITCH(UPCFilterCentralBarrel, processGeneratorLevel, "Iterate MC tables with generated data", false); }; @@ -80,6 +69,6 @@ struct UPCFilterCentralBarrel { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-filter-central-barrel"}) + adaptAnalysisTask(cfgc, TaskName{"upc-mc-central-barrel"}) }; } \ No newline at end of file From 3f442c3172bc3bda2562c46fbb6e868d5cfa1d77 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Wed, 21 Sep 2022 10:08:53 +0200 Subject: [PATCH 05/29] makefile correction in the correct folder --- PWGUD/TableProducer/CMakeLists.txt | 7 +------ PWGUD/Tasks/CMakeLists.txt | 5 +++++ PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/PWGUD/TableProducer/CMakeLists.txt b/PWGUD/TableProducer/CMakeLists.txt index 699b296b08f..f69a0d121fc 100644 --- a/PWGUD/TableProducer/CMakeLists.txt +++ b/PWGUD/TableProducer/CMakeLists.txt @@ -28,9 +28,4 @@ o2physics_add_dpl_workflow(upccand-producer o2physics_add_dpl_workflow(upc-filter-central-barrel SOURCES upcFilterCentralBarrel.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(upc-mc-central-barrel - SOURCES upcMonteCarloCentralBarrel.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index a528a5b2876..deedc2752dc 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -53,3 +53,8 @@ o2physics_add_dpl_workflow(upc-central-barrel-analyzer SOURCES upcCentralBarrelAnalyzer.cxx PUBLIC_LINK_LIBRARIES O2::Framework COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(upc-mc-central-barrel + SOURCES upcMonteCarloCentralBarrel.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx index e937a0e4858..14e400c3376 100644 --- a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx +++ b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx @@ -55,7 +55,7 @@ struct UPCFilterCentralBarrel { void processGeneratorLevel(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles){ - + } // end processGeneratorLevel From e011f4d8a5b3213a56ee1767b51e646c3e1c7d0f Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Wed, 21 Sep 2022 10:10:06 +0200 Subject: [PATCH 06/29] commenting out troublesome line for now --- PWGUD/TableProducer/upcFilterCentralBarrel.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/TableProducer/upcFilterCentralBarrel.cxx b/PWGUD/TableProducer/upcFilterCentralBarrel.cxx index 2d00aeb46a4..4807d6e558c 100644 --- a/PWGUD/TableProducer/upcFilterCentralBarrel.cxx +++ b/PWGUD/TableProducer/upcFilterCentralBarrel.cxx @@ -148,7 +148,7 @@ struct UPCFilterCentralBarrel { registry.get(HIST("hEffectOfSelections"))->Fill(3); LOGF(info, "vtx-z (data) = %f", collision.posZ()); - if (mcCollisions != nullptr) LOGF(info, "vtx-z (data) = %f | size (MC) = %d", collision.posZ(), mcCollisions.size()); + //if (mcCollisions != nullptr) LOGF(info, "vtx-z (data) = %f | size (MC) = %d", collision.posZ(), mcCollisions.size()); for (auto & barrelTrack: barrelTracks) { From 8c0d812115b8d5915ada42ef799724e10c7dd29a Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Thu, 13 Oct 2022 08:46:56 +0200 Subject: [PATCH 07/29] many modification for analysis of UPC MC --- PWGUD/Tasks/CMakeLists.txt | 6 +- PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 345 ++++++++++++++++++++- 2 files changed, 336 insertions(+), 15 deletions(-) diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index deedc2752dc..359aa27b2ba 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -55,6 +55,6 @@ o2physics_add_dpl_workflow(upc-central-barrel-analyzer COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-mc-central-barrel - SOURCES upcMonteCarloCentralBarrel.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) + SOURCES upcMonteCarloCentralBarrel.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx index 14e400c3376..d6abbe9bb72 100644 --- a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx +++ b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx @@ -20,48 +20,369 @@ #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" +//#include "CommonConstants/PhysicsConstants.h" // O2Physics headers //#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/TrackSelectionTables.h" + +// ROOT headers +#include "TLorentzVector.h" using namespace o2; using namespace o2::framework; +using namespace o2::framework::expressions; +template +int getElectronCharge(T generatedElectron) +// Check if particle is electron or positron and return charge accordingly. Return zero if particle is not electron/positron +{ + if (generatedElectron.pdgCode() == 11) return -1; + else if (generatedElectron.pdgCode() == -11) return 1; + else return 0; +} -struct UPCFilterCentralBarrel { +struct UpcMCCentralBarrel { + // helper function + float invariantMass(float E, float px, float py, float pz){ + float im = E*E - px*px - py*py - pz*py; + return TMath::Sqrt(im); + } // Global varialbes + bool isFirstReconstructedCollisions, isFirstGeneratedCollisions; + int countCollisions; + int32_t indexCollision; - HistogramRegistry registry{ + HistogramRegistry registry{ "registry", { {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {10,-0.5,9.5} } } }, + {"hNcontributionsToReconstructedCollision", ";Number of contributions in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNgeneratedParticles", ";Number of particles in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNreconstructedTracks", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNcontributionsToVertex", ";Number of contributors to vertex (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNreconstructedTracksWithGeneratedParticle", ";Number of tracks in a collision with asociated generated particle (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNreconstructedTracksWithoutGeneratedParticle", ";Number of tracks in a collision without asociated generated particle (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNreconstructedPrimaryTracks", ";Number of primary tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNgeneratedPrimaryParticlesOfReconstructedTracks", ";Number of primary generated particles in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNgeneratedPrimaryElectronsOfReconstructedTracks", ";Number of primary generated electron in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNgeneratedElectrons", ";Number of electrons in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNrecoVSgene", ";Number of reconstructed tracks in a collision (-);Number of generated particles in a collisions", { HistType::kTH2D, { {30,-0.5,29.5}, {30,-0.5,29.5} } } }, + {"hNrecoVSgeneMany", ";Number of reconstructed tracks in a collision (-);Number of generated particles in a collisions", { HistType::kTH2D, { {3000,-0.5,2999.5}, {3000,-0.5,2999.5} } } }, + {"hNgeneratedPrimaryElectrons", ";Number of primary electrons from mother decay in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNreconstructedCollisions", ";Number of asociated reconstructed collisions in a generated collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNgeneratedParticlesWithRecoColl", ";Number of generated particles in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNgeneratedPrimaryParticlesWithRecoColl", ";Number of generated primary particles from mother decay in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNgeneratedElectronsWithRecoColl", ";Number of generated electrons in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNgeneratedPrimaryElectronsWithRecoColl", ";Number of generated primary electrons from mother decay in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,2.8,3.4} } } }, + {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, + {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, + {"hMotherPhi", ";Mother #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-TMath::Pi(),TMath::Pi()} } } }, + {"hMotherRapidity", ";Mother #y (-);Number of events (-)", { HistType::kTH1D, { {500,-2.,2.} } } }, + {"hVtxZ", ";Vertex z-position (cm);Number of events (-)", { HistType::kTH1D, { {1000,-30.,30.} } } }, + {"hVtxZrecToGen", ";Vertex z-position: (reconstructed collision) - (generated collisions) (cm);Number of events (-)", { HistType::kTH1D, { {1000,-.5,.5} } } }, + {"hVtxTransversal", ";Vertex x-position (cm);Vertex y-position (cm)", { HistType::kTH2D, { {1000,-0.1,0.1}, {1000,-0.1,0.1} } } }, } }; + // declare configurables + Configurable verboseInfo{"verboseInfo", true, {"Print general info to terminal; default it true."}}; + Configurable verboseDebug{"verboseDebug", false, {"Print debug info to terminal; default it false."}}; + Configurable verboseCurrent{"verboseCurrent", false, {"Print current info to terminal; default it false."}}; + + // declare filters + Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; + // declare shortcuts - using MeasuredTCs = soa::Join; + using ReconstructedTCs = soa::Join; + using ReconstructedCollision = soa::Join::iterator; + // using ReconstructedCollision = soa::Filtered>::iterator; + // init - void init(InitContext&){} // end init + void init(InitContext&){ + if (verboseInfo) LOGF(info,"####################################### INIT METHOD #######################################"); + countCollisions = 0; + indexCollision = -1; + isFirstReconstructedCollisions = true; + isFirstGeneratedCollisions = true; + } // end init + + // run (always called before process :( ) + void run(ProcessingContext& context){ + + if (verboseInfo) LOGF(info,"####################################### RUN METHOD #######################################"); + if (verboseDebug) LOGF(info,"countCollisions = %d",countCollisions); + + } // end run + + // declare preslices = table cross-connections + Preslice perMcCollision = aod::mcparticle::mcCollisionId; + Preslice perBC = aod::mccollision::bcId; + Preslice perCollision = aod::track::collisionId; // process - void processSimulatorLevel(aod::Collision const& collision, - aod::McCollisions const& mcCollisions, - MeasuredTCs& barrelTracks){ + void processSimulatorLevel(ReconstructedCollision const& reconstructedCollision, + aod::McCollisions const& generatedCollisions, + ReconstructedTCs const& reconstructedBarrelTracks, + aod::McParticles const& generatedParticles){ + + if(isFirstReconstructedCollisions){ + isFirstReconstructedCollisions = false; + if (verboseInfo) LOGF(info,"####################################### START LOOPING OVER RECONSTRUCTED COLLISIONS #######################################"); + } + + registry.get(HIST("hEffectOfSelections"))->Fill(0); + registry.get(HIST("hNcontributionsToReconstructedCollision"))->Fill(reconstructedCollision.numContrib()); + + auto thisReconstructedCollisionGeneratedParticles = generatedParticles.sliceBy(perMcCollision, reconstructedCollision.mcCollision().globalIndex()); + auto thisBunchCrossingGeneratedCollisions = generatedCollisions.sliceBy(perBC,reconstructedCollision.bcId()); +// auto thisReconstructedCollisionReconstructedTracks = reconstructedBarrelTracks.sliceBy(perCollision, reconstructedCollision.globalIndex()); + + if (verboseInfo) LOGF(info,"####################################### NEW COLLISION #######################################"); + countCollisions++; + if (verboseCurrent) LOGF(info,"Global idx of reconstructedCollision %d; global idx of associated reconstructedCollision.mcCollision() %d", + reconstructedCollision.globalIndex(),reconstructedCollision.mcCollision().globalIndex()); + if (verboseCurrent) LOGF(info,"%d generated collisions in bunch crossing %d related to this reconstructed collisions", + thisBunchCrossingGeneratedCollisions.size(),reconstructedCollision.bcId()); + + int nGeneratedParticlesInThisReconstructedCollision = thisReconstructedCollisionGeneratedParticles.size(); + int nReconstructedTracksInThisReconstructedCollision = reconstructedBarrelTracks.size(); +// int nReconstructedTracksInThisReconstructedCollisionAlternative = thisReconstructedCollisionReconstructedTracks.size(); + if (verboseDebug) LOGF(info,"collision number = %d has %d contributors",countCollisions,reconstructedCollision.numContrib()); + if (verboseDebug) LOGF(info,"This slice: number of reconstructed tracks = %d, number of generated particles in this slice %d", + reconstructedBarrelTracks.size(),nGeneratedParticlesInThisReconstructedCollision); +// if (verboseCurrent) LOGF(info,"%d reconstructed tracks according to preslice",nReconstructedTracksInThisReconstructedCollisionAlternative); +// + registry.get(HIST("hNgeneratedParticles"))->Fill(nGeneratedParticlesInThisReconstructedCollision); + registry.get(HIST("hNreconstructedTracks"))->Fill(nReconstructedTracksInThisReconstructedCollision); + registry.get(HIST("hNrecoVSgene"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); + registry.get(HIST("hNrecoVSgeneMany"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); + registry.get(HIST("hVtxZ"))->Fill(reconstructedCollision.posZ()); + registry.get(HIST("hVtxZrecToGen"))->Fill(reconstructedCollision.posZ()-reconstructedCollision.mcCollision().posZ()); + registry.get(HIST("hVtxTransversal"))->Fill(reconstructedCollision.posX(),reconstructedCollision.posY()); + + int countReconstructedPrimaryTracks = 0; + int countReconstructedTracksWithGeneratedParticle = 0; + int countReconstructedTracksWithoutGeneratedParticle = 0; + int countPrimaryGeneratedParticlesWithReconstructedTrack = 0; + int countPrimaryGeneratedElectronsWithReconstructedTrack = 0; + int countContributorsToVertex = 0; + for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ +// if (!reconstructedBarrelTrack.has_mcParticle()) { +// LOGF(warning, "No MC particle for track, skip..."); +// continue; +// } + if (reconstructedBarrelTrack.isPVContributor()) countContributorsToVertex++; + if (reconstructedBarrelTrack.has_mcParticle()) { + countReconstructedTracksWithGeneratedParticle++; + auto generatedParticle = reconstructedBarrelTrack.mcParticle(); + if (verboseCurrent) LOGF(info,"Global idx of track in reconstructedBarrelTrack %d, is Vtx contributor %d, global idx of particle in reconstructedBarrelTrack.mcParticle() %d, is Primary %d", + reconstructedBarrelTrack.globalIndex(),reconstructedBarrelTrack.isPVContributor(),generatedParticle.globalIndex(),generatedParticle.isPhysicalPrimary()); + if (generatedParticle.isPhysicalPrimary()) { + countPrimaryGeneratedParticlesWithReconstructedTrack++; + if (TMath::Abs(generatedParticle.pdgCode()) == 11) countPrimaryGeneratedElectronsWithReconstructedTrack++; + } + } + else countReconstructedTracksWithoutGeneratedParticle++; + if (reconstructedBarrelTrack.isPVContributor()) countReconstructedPrimaryTracks++; + } + +// for (auto& reconstructedBarrelTrack : thisReconstructedCollisionReconstructedTracks){ +// if (reconstructedBarrelTrack.has_mcParticle()) { +// auto generatedParticle = reconstructedBarrelTrack.mcParticle(); +// if (verboseCurrent) LOGF(info,"Global idx of track in thisReconstructedCollisionReconstructedTracks %d",reconstructedBarrelTrack.globalIndex()); +// if (verboseCurrent) LOGF(info,"Global idx of particle in thisReconstructedCollisionReconstructedTracks.mcParticle() %d, is Primary %d",generatedParticle.globalIndex(),generatedParticle.isPhysicalPrimary()); +// } +// } + + registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); + registry.get(HIST("hNreconstructedTracksWithGeneratedParticle"))->Fill(countReconstructedTracksWithGeneratedParticle); + registry.get(HIST("hNreconstructedTracksWithoutGeneratedParticle"))->Fill(countReconstructedTracksWithoutGeneratedParticle); + registry.get(HIST("hNreconstructedPrimaryTracks"))->Fill(countReconstructedPrimaryTracks); + registry.get(HIST("hNgeneratedPrimaryParticlesOfReconstructedTracks"))->Fill(countPrimaryGeneratedParticlesWithReconstructedTrack); + registry.get(HIST("hNgeneratedPrimaryElectronsOfReconstructedTracks"))->Fill(countPrimaryGeneratedElectronsWithReconstructedTrack); + + TLorentzVector sumOfVertexTracks, trackFromVertex; + if (countContributorsToVertex == 2) { + for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ + if (!reconstructedBarrelTrack.isPVContributor()) continue; + trackFromVertex.SetPxPyPzE(reconstructedBarrelTrack.px(),reconstructedBarrelTrack.py(),reconstructedBarrelTrack.pz(), + reconstructedBarrelTrack.energy(constants::physics::MassElectron)); + sumOfVertexTracks+=trackFromVertex; + } + } + + registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); + registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); + registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); + registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); + registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); + registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // MC TRUTH STARTS HERE +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + for (auto& generatedParticle : thisReconstructedCollisionGeneratedParticles){ + if (verboseCurrent) LOGF(info,"Global idx of particle in thisReconstructedCollisionGeneratedParticles %d, is Primary %d",generatedParticle.globalIndex(),generatedParticle.isPhysicalPrimary()); + } + + TLorentzVector candidateJpsi, electron; + int countGeneratedElectrons = 0; + int countGeneratedPrimaryElectrons = 0; + int countGeneratedPrimaryParticles = 0; + for (auto & generatedParticle: thisReconstructedCollisionGeneratedParticles){ + if (verboseDebug) LOGF(info,"Particle type = %d",generatedParticle.pdgCode()); + if (verboseDebug) LOGF(info,"Particle isPhysicalPrimary = %d",generatedParticle.isPhysicalPrimary()); + if (generatedParticle.isPhysicalPrimary()) countGeneratedPrimaryParticles++; + if (TMath::Abs(generatedParticle.pdgCode()) == 11) { + registry.get(HIST("hEffectOfSelections"))->Fill(1); + countGeneratedElectrons++; + } + if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ + registry.get(HIST("hEffectOfSelections"))->Fill(2); + countGeneratedPrimaryElectrons++; + electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); + } + } + if(countGeneratedPrimaryElectrons==2){ + int electronCharge = 0; + for (auto & generatedParticle: thisReconstructedCollisionGeneratedParticles){ + if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ + electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); + candidateJpsi+=electron; + if (electronCharge == 0) electronCharge = getElectronCharge(generatedParticle); + else if (electronCharge == getElectronCharge(generatedParticle))continue; + } + } + } + registry.get(HIST("hNgeneratedElectronsWithRecoColl"))->Fill(countGeneratedElectrons); + registry.get(HIST("hNgeneratedPrimaryElectronsWithRecoColl"))->Fill(countGeneratedPrimaryElectrons); + registry.get(HIST("hNgeneratedPrimaryParticlesWithRecoColl"))->Fill(countGeneratedPrimaryParticles); + +// registry.get(HIST("hInvariantMass"))->Fill(candidateJpsi.M()); +// registry.get(HIST("hMotherP"))->Fill(candidateJpsi.P()); +// registry.get(HIST("hMotherPt"))->Fill(candidateJpsi.Pt()); +// registry.get(HIST("hMotherPhi"))->Fill(candidateJpsi.Phi()); +// registry.get(HIST("hMotherRapidity"))->Fill(candidateJpsi.Rapidity()); } // end processSimulatorLevel - void processGeneratorLevel(aod::McCollision const& mcCollision, - aod::McParticles const& mcParticles){ + void processGeneratorLevel(aod::McCollision const& generatedCollision, + soa::SmallGroups> const& reconstructedCollisions, + aod::McParticles const& generatedParticles){ + if(isFirstGeneratedCollisions){ + isFirstGeneratedCollisions = false; + if (verboseInfo) LOGF(info,"####################################### START LOOPING OVER GENERATED COLLISIONS #######################################"); + } + + if (verboseInfo) LOGF(info,"####################################### NEW COLLISION #######################################"); + countCollisions++; + int countElectrons = 0; + int countElectronsWithRecoColl = 0; + int countPrimaryElectrons = 0; + int countPrimaryElectronsWithRecoColl = 0; + if (verboseDebug) LOGF(info,"countCollisions = %d, number of particles in this collision %d",countCollisions,generatedParticles.size()); + if (verboseDebug) LOGF(info, "(truth) Generators id = %d, MC weight = %f", generatedCollision.generatorsID(), generatedCollision.weight()); + if (verboseDebug) LOGF(info, "(reco) collisions.size = %d", reconstructedCollisions.size()); + if (verboseDebug) LOGF(info, "(truth) BC id = %d, collision time = %f, impact parameter = %f", generatedCollision.bcId(), generatedCollision.t(), generatedCollision.impactParameter()); + if (verboseDebug) LOGF(info, "(truth) vtx-x = %f, vtx-y = %f, vtx-z = %f", generatedCollision.posX(), generatedCollision.posY(), generatedCollision.posZ()); + + registry.get(HIST("hNgeneratedParticles"))->Fill(generatedParticles.size()); + registry.get(HIST("hVtxZ"))->Fill(generatedCollision.posZ()); + registry.get(HIST("hVtxTransversal"))->Fill(generatedCollision.posX(),generatedCollision.posY()); + + registry.get(HIST("hNreconstructedCollisions"))->Fill(reconstructedCollisions.size()); + if (reconstructedCollisions.size()>0) { + for (auto& reconstructedCollision : reconstructedCollisions) { + registry.get(HIST("hNgeneratedParticlesWithRecoColl"))->Fill(generatedParticles.size()); + registry.get(HIST("hVtxZrecToGen"))->Fill(reconstructedCollision.posZ()-generatedCollision.posZ()); + } + } + + TLorentzVector candidateJpsi, electron; + for (auto & generatedParticle: generatedParticles){ + if (verboseDebug) LOGF(info,"Particle type = %d",generatedParticle.pdgCode()); + if (verboseDebug) LOGF(info,"Particle isPhysicalPrimary = %d",generatedParticle.isPhysicalPrimary()); + if (TMath::Abs(generatedParticle.pdgCode()) == 11) { + countElectrons++; + if (reconstructedCollisions.size()>0) countElectronsWithRecoColl++; + } + if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ + countPrimaryElectrons++; + if (reconstructedCollisions.size()>0) countPrimaryElectronsWithRecoColl++; + electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); + candidateJpsi+=electron; + } + } + registry.get(HIST("hNgeneratedElectrons"))->Fill(countElectrons); + registry.get(HIST("hNgeneratedElectronsWithRecoColl"))->Fill(countElectronsWithRecoColl); + registry.get(HIST("hNgeneratedPrimaryElectrons"))->Fill(countPrimaryElectrons); + registry.get(HIST("hNgeneratedPrimaryElectronsWithRecoColl"))->Fill(countPrimaryElectronsWithRecoColl); + registry.get(HIST("hInvariantMass"))->Fill(candidateJpsi.M()); + registry.get(HIST("hMotherP"))->Fill(candidateJpsi.P()); + registry.get(HIST("hMotherPt"))->Fill(candidateJpsi.Pt()); + registry.get(HIST("hMotherPhi"))->Fill(candidateJpsi.Phi()); + registry.get(HIST("hMotherRapidity"))->Fill(candidateJpsi.Rapidity()); } // end processGeneratorLevel - PROCESS_SWITCH(UPCFilterCentralBarrel, processSimulatorLevel, "Iterate MC tables with reconstructed data", false); - PROCESS_SWITCH(UPCFilterCentralBarrel, processGeneratorLevel, "Iterate MC tables with generated data", false); + void processTest1(aod::McCollision const& generatedCollision, + aod::McParticles const& generatedParticles){ + if (verboseDebug) LOGF(info,"n particles %d",generatedParticles.size()); + + }// end processGeneratorLevelTest + + void processTest2(aod::McCollision const& generatedCollision){ + + }// end processGeneratorLevelTest + + void processTest3(aod::McParticles const& generatedParticles){ + if (verboseDebug) LOGF(info,"n particles %d",generatedParticles.size()); + }// end processGeneratorLevelTest + + void processTest4(aod::McParticle const& generatedParticle){ + + if (generatedParticle.mcCollisionId() < indexCollision) LOGF(warning,"WARNING: previous index %d, this index %d",indexCollision,generatedParticle.mcCollisionId()); + indexCollision = generatedParticle.mcCollisionId(); + }// end processGeneratorLevelTest + + int largestIndex = 0; + + void processTest5(soa::Join::iterator const& collision, + aod::McCollisions const& generatedCollisions){ + + if (collision.has_mcCollision()) { + auto generatedCollision = collision.mcCollision(); + if (largestIndex <= generatedCollision.globalIndex()) largestIndex = generatedCollision.globalIndex(); + } + + }// end processGeneratorLevelTest5 + + void processAnalysisFinished(aod::Collisions const& collisions){ + + if (verboseInfo) LOGF(info,"####################################### END #######################################"); + if (verboseDebug) LOGF(info,"countCollisions = %d, largestIndex = %d",countCollisions,largestIndex); + isFirstReconstructedCollisions = true; + isFirstGeneratedCollisions = true; + + } // end processAnalysisFinished + + PROCESS_SWITCH(UpcMCCentralBarrel, processSimulatorLevel, "Iterate MC tables with reconstructed data", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processGeneratorLevel, "Iterate MC tables with generated data", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest1, "Test with data", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest2, "Test with data", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest3, "Test with data", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest4, "Test with data", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest5, "Test with data", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processAnalysisFinished, "Simply runs in the end", true); }; @@ -69,6 +390,6 @@ struct UPCFilterCentralBarrel { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-mc-central-barrel"}) + adaptAnalysisTask(cfgc, TaskName{"upc-mc-central-barrel"}) }; } \ No newline at end of file From ffb350bf518566279aea3262116a274c4db66823 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Thu, 3 Nov 2022 15:30:20 +0100 Subject: [PATCH 08/29] Task to do basic analysis of electron MC ready - general --- PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h | 351 ++++++++++++++++++ PWGUD/Tasks/CMakeLists.txt | 5 - PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 222 +++++++---- 3 files changed, 500 insertions(+), 78 deletions(-) create mode 100644 PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h diff --git a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h b/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h new file mode 100644 index 00000000000..39298e9dcfc --- /dev/null +++ b/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h @@ -0,0 +1,351 @@ +// 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. +/// +/// \brief +/// \author Roman Lavicka, roman.lavicka@cern.ch +/// \since 27.10.2022 + +#ifndef ALISW_UPCMONTECARLOCENTRALBARRELHELPER_H +#define ALISW_UPCMONTECARLOCENTRALBARRELHELPER_H + + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +template +bool isEvSelFITempty(C collision) +// Get FIT information from EventSelection task for each collision +{ + if (collision.has_foundFT0() || collision.has_foundFV0() || collision.has_foundFDD()) return false; + else return true; +} + +template +bool trackSelection(T track, int selection) +// Do selection of reconstructed track +{ + if (selection==0) return true; + // Is central barrel propagated track + if (selection==1 && track.trackType()!=1) return false; + // Is central barrel vertex contributor + if (selection==2 && track.isPVContributor()!=1) return false; + // Is central barrel track selection global track + if (selection==3 && track.isQualityTrack()!=1) return false; + // Is central barrel track selection global track + if (selection==4 && track.isPrimaryTrack()!=1) return false; + // Is central barrel track selection global track + if (selection==5 && track.isGlobalTrack()!=1) return false; + + return true; +} + +template +bool selectTrack(T track, int setOfCuts) +// Do selection of reconstructed track +{ + if (setOfCuts<1) return true; + // Is central barrel propagated track) + if (setOfCuts<2 && trackSelection(track,1)!=1) return false; + // Is central barrel vertex contributor + if (setOfCuts<3 && trackSelection(track,2)!=1) return false; + + return true; +} + +template +int getElectronCharge(E generatedElectron) +// Check if particle is electron or positron and return charge accordingly. Return zero if particle is not electron/positron +{ + if (generatedElectron.pdgCode() == 11) return -1; + else if (generatedElectron.pdgCode() == -11) return 1; + else return 0; +} + +template < typename C> +void fillEventSelectionHistogram(HistogramRegistry ®istry, C collision) +// Fill into histogram information from EventSelection task for each collision +{ + + for (int i = 0; i < kNsel; i++) { + if(collision.selection()[i]) registry.get(HIST("hEventSelectionTaskParameters"))->Fill(i); + } + + const int nXbins = registry.get(HIST("hEventSelectionTask"))->GetXaxis()->GetNbins(); + registry.get(HIST("hEventSelectionTask"))->SetNdivisions(nXbins, "X"); + if (collision.sel7()) registry.get(HIST("hEventSelectionTask"))->Fill(0); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(1,70,0.02,30,-1,-1,"sel7"); + if (collision.sel8()) registry.get(HIST("hEventSelectionTask"))->Fill(1); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(2,70,0.02,30,-1,-1,"sel8"); + if (collision.bbV0A()) registry.get(HIST("hEventSelectionTask"))->Fill(2); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(3,70,0.02,30,-1,-1,"bbV0A"); + if (collision.bbV0C()) registry.get(HIST("hEventSelectionTask"))->Fill(3); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(4,70,0.02,30,-1,-1,"bbV0C"); + if (collision.bgV0A()) registry.get(HIST("hEventSelectionTask"))->Fill(4); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(5,70,0.02,30,-1,-1,"bgV0A"); + if (collision.bgV0C()) registry.get(HIST("hEventSelectionTask"))->Fill(5); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(6,70,0.02,30,-1,-1,"bgV0C"); + if (collision.bbFDA()) registry.get(HIST("hEventSelectionTask"))->Fill(6); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(7,70,0.02,30,-1,-1,"bbFDA"); + if (collision.bbFDC()) registry.get(HIST("hEventSelectionTask"))->Fill(7); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(8,70,0.02,30,-1,-1,"bbFDC"); + if (collision.bgFDA()) registry.get(HIST("hEventSelectionTask"))->Fill(8); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(9,70,0.02,30,-1,-1,"bgFDA"); + if (collision.bgFDC()) registry.get(HIST("hEventSelectionTask"))->Fill(9); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(10,70,0.02,30,-1,-1,"bgFDC"); + if (collision.has_foundBC()) registry.get(HIST("hEventSelectionTask"))->Fill(10); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(11,70,0.02,30,-1,-1,"has_foundBC"); + if (collision.has_foundFT0()) registry.get(HIST("hEventSelectionTask"))->Fill(11); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(12,70,0.02,30,-1,-1,"has_foundFT0"); + if (collision.has_foundFV0()) registry.get(HIST("hEventSelectionTask"))->Fill(12); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(13,70,0.02,30,-1,-1,"has_foundFV0"); + if (collision.has_foundFDD()) registry.get(HIST("hEventSelectionTask"))->Fill(13); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(14,70,0.02,30,-1,-1,"has_foundFDD"); + +} + +template +void fillTrackSelectionHistogram(HistogramRegistry ®istry, Ts tracks, C collision) +// Fill into histogram effect of track selection for all tracks +{ + + const int nXbins = registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->GetNbins(); + registry.get(HIST("hEffectOfTrackSelections"))->SetNdivisions(nXbins, "X"); + + for (auto& track : tracks){ + if (trackSelection(track,0)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(0); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(1,70,0.02,30,-1,-1,"no cut"); + if (trackSelection(track,1)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(1); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(2,70,0.02,30,-1,-1,"propagated"); + if (trackSelection(track,3)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(2); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(3,70,0.02,30,-1,-1,"quality"); + if (trackSelection(track,4)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(3); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(4,70,0.02,30,-1,-1,"primary"); + if (trackSelection(track,5)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(4); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(5,70,0.02,30,-1,-1,"global"); + if (trackSelection(track,2)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(5); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(6,70,0.02,30,-1,-1,"PV contributor"); + + + if (!trackSelection(track,2)) continue; + if (!trackSelection(track,5)) continue; + bool hasITS = track.hasITS(); + bool hasTPC = track.hasTPC(); + bool hasTOF = track.hasTOF(); + if (hasITS) registry.get(HIST("hEffectOfTrackSelections"))->Fill(10); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(11,70,0.02,30,-1,-1,"ITS"); + if (hasTPC) registry.get(HIST("hEffectOfTrackSelections"))->Fill(11); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(12,70,0.02,30,-1,-1,"TPC"); + if (hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(12); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(13,70,0.02,30,-1,-1,"TOF"); + if (hasITS && hasTPC) registry.get(HIST("hEffectOfTrackSelections"))->Fill(13); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(14,70,0.02,30,-1,-1,"ITS+TPC"); + if (hasITS && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(14); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(15,70,0.02,30,-1,-1,"ITS+TOF"); + if (hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(15); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(16,70,0.02,30,-1,-1,"TPC+TOF"); + if (hasITS && hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(16); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(17,70,0.02,30,-1,-1,"ITS+TPC+TOF"); + if (isEvSelFITempty(collision)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(17); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(18,70,0.02,30,-1,-1,"FIT empty"); + + } +} + +template +bool isFITempty(uint64_t bc, + std::map& bcsWithFT0, + std::map& bcsWithFDD, + std::map& bcsWithFV0A, + FTs ft0s, FDs fdds, FVs fv0as) +// Return true if FIT had no signal +{ + // FIT beam-gas flags + bool isBGFT0A, isBGFT0C, isBGFV0A, isBGFDDA, isBGFDDC; + // FIT beam-beam flags + bool isBBFT0A, isBBFT0C, isBBFV0A, isBBFDDA, isBBFDDC; + + // use "default" parameters + float fV0ABBlower = -3.0; // ns + float fV0ABBupper = +2.0; // ns + float fV0ABGlower = 2.0; // ns + float fV0ABGupper = 5.0; // ns + + float fFDABBlower = -3.0; // ns + float fFDABBupper = +3.0; // ns + float fFDABGlower = 10.0; // ns + float fFDABGupper = 13.0; // ns + float fFDCBBlower = -3.0; // ns + float fFDCBBupper = +3.0; // ns + float fFDCBGlower = -10.0; // ns + float fFDCBGupper = -3.0; // ns + + float fT0ABBlower = -1.0; // ns + float fT0ABBupper = +1.0; // ns + float fT0CBBlower = -1.0; // ns + float fT0CBBupper = +1.0; // ns + float fT0ABGlower = +1.0; // ns + float fT0ABGupper = +4.0; // ns + float fT0CBGlower = -4.0; // ns + float fT0CBGupper = -1.0; // ns + + float timeFV0A = -999.f; + float timeFT0A = -999.f; + float timeFT0C = -999.f; + float timeFDDA = -999.f; + float timeFDDC = -999.f; + float timeV0ABG = -999.f; + float timeT0ABG = -999.f; + float timeT0CBG = -999.f; + float timeFDABG = -999.f; + float timeFDCBG = -999.f; + + // check FIT info in the same BC + auto it = bcsWithFT0.find(bc); + if (it != bcsWithFT0.end()) { + const auto& ft0 = ft0s.iteratorAt(it->second); + timeFT0A = ft0.timeA(); + timeFT0C = ft0.timeC(); + } + + it = bcsWithFDD.find(bc); + if (it != bcsWithFDD.end()) { + const auto& fdd = fdds.iteratorAt(it->second); + timeFDDA = fdd.timeA(); + timeFDDC = fdd.timeC(); + } + + it = bcsWithFV0A.find(bc); + if (it != bcsWithFV0A.end()) { + const auto& fv0a = fv0as.iteratorAt(it->second); + timeFV0A = fv0a.time(); + } + + // check beam-gas + it = bcsWithFT0.find(bc - 1); + if (it != bcsWithFT0.end()) { + const auto& ft0 = ft0s.iteratorAt(it->second); + timeT0ABG = ft0.timeA(); + timeT0CBG = ft0.timeC(); + } + + it = bcsWithFDD.find(bc - 5); + if (it != bcsWithFDD.end()) { + const auto& ft0 = fdds.iteratorAt(it->second); + timeFDABG = ft0.timeA(); + timeFDCBG = ft0.timeC(); + } + + it = bcsWithFV0A.find(bc - 1); + if (it != bcsWithFV0A.end()) { + const auto& fv0a = fv0as.iteratorAt(it->second); + timeV0ABG = fv0a.time(); + } + + // beam-gas flags + isBGFV0A = timeV0ABG > fV0ABGlower && timeV0ABG < fV0ABGupper; + isBGFDDA = timeFDABG > fFDABGlower && timeFDABG < fFDABGupper; + isBGFDDC = timeFDCBG > fFDCBGlower && timeFDCBG < fFDCBGupper; + isBGFT0A = timeT0ABG > fT0ABGlower && timeT0ABG < fT0ABGupper; + isBGFT0C = timeT0CBG > fT0CBGlower && timeT0CBG < fT0CBGupper; + + // beam-beam flags + isBBFT0A = timeFT0A > fT0ABBlower && timeFT0A < fT0ABBupper; + isBBFT0C = timeFT0C > fT0CBBlower && timeFT0C < fT0CBBupper; + isBBFV0A = timeFV0A > fV0ABBlower && timeFV0A < fV0ABBupper; + isBBFDDA = timeFDDA > fFDABBlower && timeFDDA < fFDABBupper; + isBBFDDC = timeFDDC > fFDCBBlower && timeFDDC < fFDCBBupper; + + // check FT0 signal + bool hasNoFT0 = true; + bool isBB = isBBFT0A || isBBFT0C; + bool isBG = isBGFT0A || isBGFT0C; + hasNoFT0 = !isBB && !isBG; + // check FV0 signal + bool hasNoFV0A = true; + isBB = isBBFV0A; + isBG = isBGFV0A; + hasNoFV0A = !isBB && !isBG; + // check FDD signal + bool hasNoFDD = true; + isBB = isBBFDDA || isBBFDDC; + isBG = isBGFDDA || isBGFDDC; + hasNoFDD = !isBB && !isBG; + + if (hasNoFT0 && hasNoFV0A && hasNoFDD) return true; + else return false; +} + +float invariantMass(float E, float px, float py, float pz) +// Just a simple function to return invariant mass +{ + float im = E*E - px*px - py*py - pz*py; + return TMath::Sqrt(im); +} + +template +void printCollisionData(C collision, MCs generatedCollisions, P slice) +// Function to print collision info +{ + + // sliced TF generated collisions according to BC id of the current reconstructed collision + auto slicedGeneratedCollisions = generatedCollisions.sliceBy(slice,collision.bcId()); + + LOGF(info,"Reconstructed collision idx: %d; Associated generated collision idx: %d", + collision.globalIndex(),collision.mcCollision().globalIndex()); + LOGF(info,"%d generated collisions in bunch crossing %d related to this reconstructed collisions", + slicedGeneratedCollisions.size(),collision.bcId()); +} + +template +void printTrackData(T track) +// Function to print basic info on track and its associated mc particle +{ + if (track.has_mcParticle()) { + auto mcparticle = track.mcParticle(); + LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d;" + " Associated MC particle idx %d, primary %d, PDG code %d", + track.globalIndex(),track.isPVContributor(),track.hasITS(),track.hasTPC(),track.hasTOF(), + mcparticle.globalIndex(),mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); + } +} + +template +void printCollisionTracksData(Ts tracks, int setOfCuts) +// Function to loop over tracks associated to a collision and print basic info +{ + int countNoMCparticle = 0; + for (auto& track : tracks){ + if (!selectTrack(track,setOfCuts)) continue; + if (track.has_mcParticle()) { + printTrackData(track); + } + else countNoMCparticle++; + } + if (countNoMCparticle > 0) LOGF(warning,"This collision has %d tracks without associated mc particle",countNoMCparticle); +} + +template +void printCollisionGeneratedParticles(MPs particles, P slice, C collision){ + auto slicedParticles = particles.sliceBy(slice, collision.mcCollision().globalIndex()); + for (auto& slicedParticle : slicedParticles){ + LOGF(info,"Particle idx %d, primary %d",slicedParticle.globalIndex(),slicedParticle.isPhysicalPrimary()); + } +} + +void printLargeMessage(std::string info) +// Helper to printf info message to terminal +{ + LOGF(info,"################################### %s ###################################",info); +} + + +#endif //ALISW_UPCMONTECARLOCENTRALBARRELHELPER_H diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 359aa27b2ba..515b3b46f1d 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -44,11 +44,6 @@ o2physics_add_dpl_workflow(upccand-analyzer PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(upc-track-skimmer-qa - SOURCES UPCTrackSkimmerQA.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(upc-central-barrel-analyzer SOURCES upcCentralBarrelAnalyzer.cxx PUBLIC_LINK_LIBRARIES O2::Framework diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx index d6abbe9bb72..abff3dbedd9 100644 --- a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx +++ b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx @@ -23,44 +23,40 @@ //#include "CommonConstants/PhysicsConstants.h" // O2Physics headers -//#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/CCDB/EventSelectionParams.h" +#include "PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h" +#include "PWGUD/DataModel/UDTables.h" // ROOT headers #include "TLorentzVector.h" +#include "TDatabasePDG.h" using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -template -int getElectronCharge(T generatedElectron) -// Check if particle is electron or positron and return charge accordingly. Return zero if particle is not electron/positron -{ - if (generatedElectron.pdgCode() == 11) return -1; - else if (generatedElectron.pdgCode() == -11) return 1; - else return 0; -} - struct UpcMCCentralBarrel { - // helper function - float invariantMass(float E, float px, float py, float pz){ - float im = E*E - px*px - py*py - pz*py; - return TMath::Sqrt(im); - } // Global varialbes bool isFirstReconstructedCollisions, isFirstGeneratedCollisions; int countCollisions; int32_t indexCollision; + Service pdg; - HistogramRegistry registry{ + HistogramRegistry registry{ "registry", { - {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {10,-0.5,9.5} } } }, + {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEffectOfTrackSelections", "Effect of track cuts;Selection (-);Number of tracks (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEventSelectionTask", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEventSelectionTaskParameters", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {kNsel,-0.5,kNsel-0.5} } } }, {"hNcontributionsToReconstructedCollision", ";Number of contributions in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, {"hNgeneratedParticles", ";Number of particles in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, {"hNreconstructedTracks", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNreconstructedTracksWide", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {1000,-0.5,999.5} } } }, {"hNcontributionsToVertex", ";Number of contributors to vertex (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, {"hNreconstructedTracksWithGeneratedParticle", ";Number of tracks in a collision with asociated generated particle (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, {"hNreconstructedTracksWithoutGeneratedParticle", ";Number of tracks in a collision without asociated generated particle (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, @@ -79,42 +75,59 @@ struct UpcMCCentralBarrel { {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,2.8,3.4} } } }, {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, + {"hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, {"hMotherPhi", ";Mother #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-TMath::Pi(),TMath::Pi()} } } }, {"hMotherRapidity", ";Mother #y (-);Number of events (-)", { HistType::kTH1D, { {500,-2.,2.} } } }, {"hVtxZ", ";Vertex z-position (cm);Number of events (-)", { HistType::kTH1D, { {1000,-30.,30.} } } }, {"hVtxZrecToGen", ";Vertex z-position: (reconstructed collision) - (generated collisions) (cm);Number of events (-)", { HistType::kTH1D, { {1000,-.5,.5} } } }, {"hVtxTransversal", ";Vertex x-position (cm);Vertex y-position (cm)", { HistType::kTH2D, { {1000,-0.1,0.1}, {1000,-0.1,0.1} } } }, + {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCelectronIdentified", ";Track from generated electron #it{p} (GeV/#it{c});Track from generated electron TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCsignalVtxContributors", ";Vtx contributor 1 - TPC d#it{E}/d#it{x} (arb. units);Vtx contributor 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, + {"hTPCsignalGeneratedElectrons", ";Track from generated electron 1 - TPC d#it{E}/d#it{x} (arb. units);Track from generated electron 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, + {"hTrackP", ";Track #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, + {"hTrackPt", ";Track #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,5.} } } }, + {"hTrackPhi", ";Track #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-2*TMath::Pi(),2*TMath::Pi()} } } }, + {"hTrackEta", ";Track #eta (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } }, + {"hTrackEnergy", ";Track Energy (GeV);Number of events (-)", { HistType::kTH1D, { {500,0.,100.} } } }, + {"hTrackRapidity", ";Track rapidity (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } }, + {"hPDGcodes", ";PDG codes (-);Number of events (-)", { HistType::kTH1D, { {6001,-3000.,3000.} } } } } }; // declare configurables Configurable verboseInfo{"verboseInfo", true, {"Print general info to terminal; default it true."}}; + Configurable printMetaInfo{"printMetaInfo", false, {"Print general info to terminal about collision, tracks, particles...; default it false."}}; Configurable verboseDebug{"verboseDebug", false, {"Print debug info to terminal; default it false."}}; - Configurable verboseCurrent{"verboseCurrent", false, {"Print current info to terminal; default it false."}}; + Configurable applyTrackCuts{"applyTrackCuts", 0, {"Apply n selections on track; default it no cut."}}; + Configurable applySingleTrackCut{"applySingleTrackCut", 0, {"Apply selection n on track, applyTrackCuts must be at maximum for full usage; default it no cut."}}; // declare filters - Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; +// Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; // declare shortcuts - using ReconstructedTCs = soa::Join; - using ReconstructedCollision = soa::Join::iterator; + using ReconstructedTCs = soa::Join; + using ReconstructedCollision = soa::Join::iterator; // using ReconstructedCollision = soa::Filtered>::iterator; // init void init(InitContext&){ - if (verboseInfo) LOGF(info,"####################################### INIT METHOD #######################################"); + if (verboseInfo) printLargeMessage("INIT METHOD"); countCollisions = 0; indexCollision = -1; isFirstReconstructedCollisions = true; isFirstGeneratedCollisions = true; + } // end init // run (always called before process :( ) void run(ProcessingContext& context){ - if (verboseInfo) LOGF(info,"####################################### RUN METHOD #######################################"); + if (verboseInfo) printLargeMessage("RUN METHOD"); if (verboseDebug) LOGF(info,"countCollisions = %d",countCollisions); } // end run @@ -122,43 +135,42 @@ struct UpcMCCentralBarrel { // declare preslices = table cross-connections Preslice perMcCollision = aod::mcparticle::mcCollisionId; Preslice perBC = aod::mccollision::bcId; - Preslice perCollision = aod::track::collisionId; // process void processSimulatorLevel(ReconstructedCollision const& reconstructedCollision, aod::McCollisions const& generatedCollisions, ReconstructedTCs const& reconstructedBarrelTracks, - aod::McParticles const& generatedParticles){ + aod::McParticles const& generatedParticles, + aod::BCs const& bcs, + aod::FT0s const& ft0s, + aod::FDDs const& fdds, + aod::FV0As const& fv0as){ if(isFirstReconstructedCollisions){ isFirstReconstructedCollisions = false; - if (verboseInfo) LOGF(info,"####################################### START LOOPING OVER RECONSTRUCTED COLLISIONS #######################################"); + if (verboseInfo) printLargeMessage("START LOOPING OVER RECONSTRUCTED COLLISIONS"); } - + if (verboseInfo) printLargeMessage("NEW COLLISION"); + if (printMetaInfo) printCollisionData(reconstructedCollision, generatedCollisions, perBC); + countCollisions++; registry.get(HIST("hEffectOfSelections"))->Fill(0); + + fillEventSelectionHistogram(registry,reconstructedCollision); + fillTrackSelectionHistogram(registry,reconstructedBarrelTracks,reconstructedCollision); + registry.get(HIST("hNcontributionsToReconstructedCollision"))->Fill(reconstructedCollision.numContrib()); auto thisReconstructedCollisionGeneratedParticles = generatedParticles.sliceBy(perMcCollision, reconstructedCollision.mcCollision().globalIndex()); - auto thisBunchCrossingGeneratedCollisions = generatedCollisions.sliceBy(perBC,reconstructedCollision.bcId()); -// auto thisReconstructedCollisionReconstructedTracks = reconstructedBarrelTracks.sliceBy(perCollision, reconstructedCollision.globalIndex()); - - if (verboseInfo) LOGF(info,"####################################### NEW COLLISION #######################################"); - countCollisions++; - if (verboseCurrent) LOGF(info,"Global idx of reconstructedCollision %d; global idx of associated reconstructedCollision.mcCollision() %d", - reconstructedCollision.globalIndex(),reconstructedCollision.mcCollision().globalIndex()); - if (verboseCurrent) LOGF(info,"%d generated collisions in bunch crossing %d related to this reconstructed collisions", - thisBunchCrossingGeneratedCollisions.size(),reconstructedCollision.bcId()); int nGeneratedParticlesInThisReconstructedCollision = thisReconstructedCollisionGeneratedParticles.size(); int nReconstructedTracksInThisReconstructedCollision = reconstructedBarrelTracks.size(); -// int nReconstructedTracksInThisReconstructedCollisionAlternative = thisReconstructedCollisionReconstructedTracks.size(); if (verboseDebug) LOGF(info,"collision number = %d has %d contributors",countCollisions,reconstructedCollision.numContrib()); if (verboseDebug) LOGF(info,"This slice: number of reconstructed tracks = %d, number of generated particles in this slice %d", reconstructedBarrelTracks.size(),nGeneratedParticlesInThisReconstructedCollision); -// if (verboseCurrent) LOGF(info,"%d reconstructed tracks according to preslice",nReconstructedTracksInThisReconstructedCollisionAlternative); -// + registry.get(HIST("hNgeneratedParticles"))->Fill(nGeneratedParticlesInThisReconstructedCollision); registry.get(HIST("hNreconstructedTracks"))->Fill(nReconstructedTracksInThisReconstructedCollision); + registry.get(HIST("hNreconstructedTracksWide"))->Fill(nReconstructedTracksInThisReconstructedCollision); registry.get(HIST("hNrecoVSgene"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); registry.get(HIST("hNrecoVSgeneMany"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); registry.get(HIST("hVtxZ"))->Fill(reconstructedCollision.posZ()); @@ -171,33 +183,28 @@ struct UpcMCCentralBarrel { int countPrimaryGeneratedParticlesWithReconstructedTrack = 0; int countPrimaryGeneratedElectronsWithReconstructedTrack = 0; int countContributorsToVertex = 0; + int countGlobalContributorsToVertex = 0; for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ -// if (!reconstructedBarrelTrack.has_mcParticle()) { -// LOGF(warning, "No MC particle for track, skip..."); -// continue; -// } + if (!selectTrack(reconstructedBarrelTrack,applyTrackCuts)) continue; if (reconstructedBarrelTrack.isPVContributor()) countContributorsToVertex++; + if (selectTrack(reconstructedBarrelTrack,2)) countGlobalContributorsToVertex++; if (reconstructedBarrelTrack.has_mcParticle()) { + if (reconstructedBarrelTrack.hasTPC()) registry.get(HIST("hTPCsignalVsMom"))->Fill(reconstructedBarrelTrack.p(),reconstructedBarrelTrack.tpcSignal()); countReconstructedTracksWithGeneratedParticle++; auto generatedParticle = reconstructedBarrelTrack.mcParticle(); - if (verboseCurrent) LOGF(info,"Global idx of track in reconstructedBarrelTrack %d, is Vtx contributor %d, global idx of particle in reconstructedBarrelTrack.mcParticle() %d, is Primary %d", - reconstructedBarrelTrack.globalIndex(),reconstructedBarrelTrack.isPVContributor(),generatedParticle.globalIndex(),generatedParticle.isPhysicalPrimary()); if (generatedParticle.isPhysicalPrimary()) { countPrimaryGeneratedParticlesWithReconstructedTrack++; - if (TMath::Abs(generatedParticle.pdgCode()) == 11) countPrimaryGeneratedElectronsWithReconstructedTrack++; + if (TMath::Abs(generatedParticle.pdgCode()) == 11) { + countPrimaryGeneratedElectronsWithReconstructedTrack++; + if (reconstructedBarrelTrack.hasTPC()) registry.get(HIST("hTPCelectronIdentified"))->Fill(reconstructedBarrelTrack.p(),reconstructedBarrelTrack.tpcSignal()); + } } } else countReconstructedTracksWithoutGeneratedParticle++; if (reconstructedBarrelTrack.isPVContributor()) countReconstructedPrimaryTracks++; } -// for (auto& reconstructedBarrelTrack : thisReconstructedCollisionReconstructedTracks){ -// if (reconstructedBarrelTrack.has_mcParticle()) { -// auto generatedParticle = reconstructedBarrelTrack.mcParticle(); -// if (verboseCurrent) LOGF(info,"Global idx of track in thisReconstructedCollisionReconstructedTracks %d",reconstructedBarrelTrack.globalIndex()); -// if (verboseCurrent) LOGF(info,"Global idx of particle in thisReconstructedCollisionReconstructedTracks.mcParticle() %d, is Primary %d",generatedParticle.globalIndex(),generatedParticle.isPhysicalPrimary()); -// } -// } + if (printMetaInfo) printCollisionTracksData(reconstructedBarrelTracks,applyTrackCuts); registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); registry.get(HIST("hNreconstructedTracksWithGeneratedParticle"))->Fill(countReconstructedTracksWithGeneratedParticle); @@ -206,30 +213,108 @@ struct UpcMCCentralBarrel { registry.get(HIST("hNgeneratedPrimaryParticlesOfReconstructedTracks"))->Fill(countPrimaryGeneratedParticlesWithReconstructedTrack); registry.get(HIST("hNgeneratedPrimaryElectronsOfReconstructedTracks"))->Fill(countPrimaryGeneratedElectronsWithReconstructedTrack); + // + // Playing around + // + printLargeMessage("Primary + Global + FIT"); + for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ + if (!trackSelection(reconstructedBarrelTrack,2)) continue; + if (!trackSelection(reconstructedBarrelTrack,5)) continue; + if (isEvSelFITempty(reconstructedCollision)) continue; + printTrackData(reconstructedBarrelTrack); + registry.get(HIST("hTrackP"))->Fill(reconstructedBarrelTrack.p()); + registry.get(HIST("hTrackPt"))->Fill(reconstructedBarrelTrack.pt()); + registry.get(HIST("hTrackPhi"))->Fill(reconstructedBarrelTrack.phi()); + registry.get(HIST("hTrackEta"))->Fill(reconstructedBarrelTrack.eta()); + if (reconstructedBarrelTrack.has_mcParticle()) { + auto mcparticle = reconstructedBarrelTrack.mcParticle(); + registry.get(HIST("hPDGcodes"))->Fill(mcparticle.pdgCode()); + auto pdgInfo = pdg->GetParticle(mcparticle.pdgCode()); + if (pdgInfo != nullptr) { + float mass = pdgInfo->Mass(); + registry.get(HIST("hTrackEnergy"))->Fill(reconstructedBarrelTrack.energy(mass)); + registry.get(HIST("hTrackRapidity"))->Fill(reconstructedBarrelTrack.rapidity(mass)); + } + } + + } + + // + // fetching FT0, FDD, FV0 information + // + std::map BCsWithFT0; + // collect BCs with FT0 signals + for (const auto& ft0 : ft0s) { + uint64_t bc = ft0.bc().globalBC(); + BCsWithFT0[bc] = ft0.globalIndex(); + } + std::map BCsWithFDD; + // collect BCs with FDD signals + for (const auto& fdd : fdds) { + uint64_t bc = fdd.bc().globalBC(); + BCsWithFDD[bc] = fdd.globalIndex(); + } + std::map BCsWithFV0A; + // collect BCs with FV0A signals + for (const auto& fv0a : fv0as) { + uint64_t bc = fv0a.bc().globalBC(); + BCsWithFV0A[bc] = fv0a.globalIndex(); + } + bool FITisEmpty = isFITempty(reconstructedCollision.bcId(), BCsWithFT0, BCsWithFDD, BCsWithFV0A, ft0s, fdds, fv0as); + if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(1); + FITisEmpty = isEvSelFITempty(reconstructedCollision); + if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(2); + if (countContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(3); + if (countGlobalContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(4); + + + // + // TPC signal info starts here + // TLorentzVector sumOfVertexTracks, trackFromVertex; + float dedxVC1 = -999.; + float dedxVC2 = -999.; + float dedxEl1 = -999.; + float dedxEl2 = -999.; + int countTrks = 0; if (countContributorsToVertex == 2) { for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ if (!reconstructedBarrelTrack.isPVContributor()) continue; + countTrks++; trackFromVertex.SetPxPyPzE(reconstructedBarrelTrack.px(),reconstructedBarrelTrack.py(),reconstructedBarrelTrack.pz(), reconstructedBarrelTrack.energy(constants::physics::MassElectron)); sumOfVertexTracks+=trackFromVertex; + if (reconstructedBarrelTrack.hasTPC()){ + if (countTrks == 1) dedxVC1 = reconstructedBarrelTrack.tpcSignal(); + else if (countTrks == 2) dedxVC2 = reconstructedBarrelTrack.tpcSignal(); + else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); + if (reconstructedBarrelTrack.has_mcParticle()) { + auto generatedParticle = reconstructedBarrelTrack.mcParticle(); + if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11) { + if (countTrks == 1) dedxEl1 = reconstructedBarrelTrack.tpcSignal(); + else if (countTrks == 2) dedxEl2 = reconstructedBarrelTrack.tpcSignal(); + else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); + } + } + } } + registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC1,dedxVC2); + registry.get(HIST("hTPCsignalGeneratedElectrons"))->Fill(dedxEl1,dedxEl2); + registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); + registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); + registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); + registry.get(HIST("hMotherPwide"))->Fill(sumOfVertexTracks.P()); + registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); + registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); + registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); } - registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); - registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); - registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); - registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); - registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); - registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MC TRUTH STARTS HERE //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - for (auto& generatedParticle : thisReconstructedCollisionGeneratedParticles){ - if (verboseCurrent) LOGF(info,"Global idx of particle in thisReconstructedCollisionGeneratedParticles %d, is Primary %d",generatedParticle.globalIndex(),generatedParticle.isPhysicalPrimary()); - } + if (printMetaInfo) printCollisionGeneratedParticles(generatedParticles,perMcCollision,reconstructedCollision); TLorentzVector candidateJpsi, electron; int countGeneratedElectrons = 0; @@ -240,11 +325,9 @@ struct UpcMCCentralBarrel { if (verboseDebug) LOGF(info,"Particle isPhysicalPrimary = %d",generatedParticle.isPhysicalPrimary()); if (generatedParticle.isPhysicalPrimary()) countGeneratedPrimaryParticles++; if (TMath::Abs(generatedParticle.pdgCode()) == 11) { - registry.get(HIST("hEffectOfSelections"))->Fill(1); countGeneratedElectrons++; } if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ - registry.get(HIST("hEffectOfSelections"))->Fill(2); countGeneratedPrimaryElectrons++; electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); } @@ -264,12 +347,6 @@ struct UpcMCCentralBarrel { registry.get(HIST("hNgeneratedPrimaryElectronsWithRecoColl"))->Fill(countGeneratedPrimaryElectrons); registry.get(HIST("hNgeneratedPrimaryParticlesWithRecoColl"))->Fill(countGeneratedPrimaryParticles); -// registry.get(HIST("hInvariantMass"))->Fill(candidateJpsi.M()); -// registry.get(HIST("hMotherP"))->Fill(candidateJpsi.P()); -// registry.get(HIST("hMotherPt"))->Fill(candidateJpsi.Pt()); -// registry.get(HIST("hMotherPhi"))->Fill(candidateJpsi.Phi()); -// registry.get(HIST("hMotherRapidity"))->Fill(candidateJpsi.Rapidity()); - } // end processSimulatorLevel void processGeneratorLevel(aod::McCollision const& generatedCollision, @@ -326,6 +403,7 @@ struct UpcMCCentralBarrel { registry.get(HIST("hNgeneratedPrimaryElectronsWithRecoColl"))->Fill(countPrimaryElectronsWithRecoColl); registry.get(HIST("hInvariantMass"))->Fill(candidateJpsi.M()); registry.get(HIST("hMotherP"))->Fill(candidateJpsi.P()); + registry.get(HIST("hMotherPwide"))->Fill(candidateJpsi.P()); registry.get(HIST("hMotherPt"))->Fill(candidateJpsi.Pt()); registry.get(HIST("hMotherPhi"))->Fill(candidateJpsi.Phi()); registry.get(HIST("hMotherRapidity"))->Fill(candidateJpsi.Rapidity()); @@ -334,10 +412,8 @@ struct UpcMCCentralBarrel { } // end processGeneratorLevel - void processTest1(aod::McCollision const& generatedCollision, - aod::McParticles const& generatedParticles){ + void processTest1(aod::McCollision const& generatedCollision, aod::McParticles const& generatedParticles){ if (verboseDebug) LOGF(info,"n particles %d",generatedParticles.size()); - }// end processGeneratorLevelTest void processTest2(aod::McCollision const& generatedCollision){ From bd5f89b7d5a5b9cffd441ce00c4db69d97cd8cc0 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Thu, 3 Nov 2022 15:35:00 +0100 Subject: [PATCH 09/29] deleting some useless tasks to have it clean for the next step --- PWGUD/DataModel/UPCFilterCentralBarrel.h | 42 ---- PWGUD/TableProducer/CMakeLists.txt | 6 - .../TableProducer/upcFilterCentralBarrel.cxx | 224 ------------------ PWGUD/Tasks/CMakeLists.txt | 11 +- PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx | 72 ------ 5 files changed, 3 insertions(+), 352 deletions(-) delete mode 100644 PWGUD/DataModel/UPCFilterCentralBarrel.h delete mode 100644 PWGUD/TableProducer/upcFilterCentralBarrel.cxx delete mode 100644 PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx diff --git a/PWGUD/DataModel/UPCFilterCentralBarrel.h b/PWGUD/DataModel/UPCFilterCentralBarrel.h deleted file mode 100644 index 9cba97184be..00000000000 --- a/PWGUD/DataModel/UPCFilterCentralBarrel.h +++ /dev/null @@ -1,42 +0,0 @@ -// 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. -/// -/// \brief -/// \author Roman Lavicka, roman.lavicka@cern.ch -/// \since 12.07.2022 - -#ifndef O2_ANALYSIS_UPCFILTERCENTRALBARREL_H -#define O2_ANALYSIS_UPCFILTERCENTRALBARREL_H - -enum MyParticle { P_ELECTRON = 0, P_MUON = 1, P_PION = 2, P_KAON = 3, P_PROTON = 4}; - -namespace o2::aod -{ - - namespace upccentralbarrel - { - DECLARE_SOA_COLUMN(IsTwoTracks, isTwoTracks, bool); //! Exactly two tracks were found - DECLARE_SOA_COLUMN(IsFourTracks, isFourTracks, bool); //! Exactly four tracks were found - DECLARE_SOA_COLUMN(FlagWhichParticle, flagWhichParticle, int); //! Flag the particle according to TPC and TOF - DECLARE_SOA_COLUMN(ReachedTOF, reachedTOF, bool); //! Mark, if track hits TOF - } // namespace upccentralbarrel - - DECLARE_SOA_TABLE(UPCTrackCandidates, "AOD", "UPCCANDIDATES", //! Table with UPC track candidates - o2::soa::Index<>, - collision::PosX, collision::PosY, collision::PosZ, collision::NumContrib, - track::Pt, track::P, - upccentralbarrel::IsTwoTracks, upccentralbarrel::IsFourTracks, - upccentralbarrel::FlagWhichParticle, upccentralbarrel::ReachedTOF); - using UPCTrackCandidate = UPCTrackCandidates::iterator; - -} // namespace o2::aod - -#endif // O2_ANALYSIS_UPCFILTERCENTRALBARREL_H diff --git a/PWGUD/TableProducer/CMakeLists.txt b/PWGUD/TableProducer/CMakeLists.txt index f69a0d121fc..5ab117e2bca 100644 --- a/PWGUD/TableProducer/CMakeLists.txt +++ b/PWGUD/TableProducer/CMakeLists.txt @@ -23,9 +23,3 @@ o2physics_add_dpl_workflow(upccand-producer SOURCES UPCCandidateProducer.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::UPCCutparHolder COMPONENT_NAME Analysis) - - -o2physics_add_dpl_workflow(upc-filter-central-barrel - SOURCES upcFilterCentralBarrel.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGUD/TableProducer/upcFilterCentralBarrel.cxx b/PWGUD/TableProducer/upcFilterCentralBarrel.cxx deleted file mode 100644 index 4807d6e558c..00000000000 --- a/PWGUD/TableProducer/upcFilterCentralBarrel.cxx +++ /dev/null @@ -1,224 +0,0 @@ -// 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. -/// -/// \brief -/// \author Roman Lavicka, roman.lavicka@cern.ch -/// \since 12.07.2022 - -//#include -//#include - -// O2 headers -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" - -// O2Physics headers -#include "PWGUD/DataModel/UPCFilterCentralBarrel.h" -#include "Common/DataModel/PIDResponse.h" - -using namespace o2; -using namespace o2::framework; - -template -int TestTPConlyPIDhypothesis(TCs barrelTrack) -// Choose, which particle it is according to PID of TPC only -{ - - float pidTPC[5]; - pidTPC[P_ELECTRON] = TMath::Abs(barrelTrack.tpcNSigmaEl()); - pidTPC[P_MUON] = TMath::Abs(barrelTrack.tpcNSigmaMu()); - pidTPC[P_PION] = TMath::Abs(barrelTrack.tpcNSigmaPi()); - pidTPC[P_KAON] = TMath::Abs(barrelTrack.tpcNSigmaKa()); - pidTPC[P_PROTON] = TMath::Abs(barrelTrack.tpcNSigmaPr()); - - return std::distance(std::begin(pidTPC), std::min_element(std::begin(pidTPC), std::end(pidTPC))); - -} - - -template -int TestPIDhypothesis(TCs barrelTrack) -// Choose, which particle it is according to PID of TPC and TOF -{ - - float pidTPC[5], pidTOF[5]; - pidTPC[P_ELECTRON] = TMath::Abs(barrelTrack.tpcNSigmaEl()); - pidTPC[P_MUON] = TMath::Abs(barrelTrack.tpcNSigmaMu()); - pidTPC[P_PION] = TMath::Abs(barrelTrack.tpcNSigmaPi()); - pidTPC[P_KAON] = TMath::Abs(barrelTrack.tpcNSigmaKa()); - pidTPC[P_PROTON] = TMath::Abs(barrelTrack.tpcNSigmaPr()); - pidTOF[P_ELECTRON] = TMath::Abs(barrelTrack.tofNSigmaEl()); - pidTOF[P_MUON] = TMath::Abs(barrelTrack.tofNSigmaMu()); - pidTOF[P_PION] = TMath::Abs(barrelTrack.tofNSigmaPi()); - pidTOF[P_KAON] = TMath::Abs(barrelTrack.tofNSigmaKa()); - pidTOF[P_PROTON] = TMath::Abs(barrelTrack.tofNSigmaPr()); - - int _id_TPC = std::distance(std::begin(pidTPC), std::min_element(std::begin(pidTPC), std::end(pidTPC))); - float pidTPCpick[3] = {pidTPC[0], pidTPC[1], pidTPC[2]}; - int _id_TPC_pick = std::distance(std::begin(pidTPCpick), std::min_element(std::begin(pidTPCpick), std::end(pidTPCpick))); - - int _id_TOF = std::distance(std::begin(pidTOF), std::min_element(std::begin(pidTOF), std::end(pidTOF))); -// - if (pidTOF[_id_TOF] < 999.){ - if (_id_TPC == P_ELECTRON || _id_TPC == P_MUON || _id_TPC == P_PION){ - if (_id_TOF == P_KAON ) return P_KAON; // probably kaon - else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton - else { - if (_id_TPC == P_ELECTRON) return P_ELECTRON; // probably electron - else if (_id_TPC == P_MUON) return P_MUON; // probably muon - else return P_PION; // probably pion - } - } - else if (_id_TPC == P_KAON){ - if (_id_TOF == P_KAON ) return P_KAON; // probably kaon - else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton - else { - if (_id_TPC_pick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron - else if (_id_TPC_pick == P_MUON) return P_MUON; // probably misidentified muon - else if (_id_TPC_pick == P_PION) return P_PION; // probably misidentified pion - } - } - else { - if (_id_TOF == P_KAON ) return P_KAON; // probably kaon - else if (_id_TOF == P_PROTON) return P_PROTON; // probably proton - else { - if (_id_TPC_pick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron - else if (_id_TPC_pick == P_MUON) return P_MUON; // probably misidentified muon - else if (_id_TPC_pick == P_PION) return P_PION; // probably misidentified pion - } - } - } - else return _id_TPC; - - return -1; -} - - -struct UPCFilterCentralBarrel { - - // Global varialbes - bool isMonteCarloData = false; - - - HistogramRegistry registry{ - "registry", - { - {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {10,-0.5,9.5} } } }, - {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCelectronIdentified", "Tracks identified as electrons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCmuonIdentified", "Tracks identified as muons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCpionIdentified", "Tracks identified as pions;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCkaonIdentified", "Tracks identified as kaons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCprotonIdentified", "Tracks identified as protons;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } } - } - }; - - // declare shortcuts - using MeasuredTCs = soa::Join; - - // init - void init(InitContext&){} // end init - - // declare production of table - Produces selectedUPCcandidateTracks; - - // declate configurables - Configurable maxNSigmaTPC{"maxNSigmaTPC", 4, {"Maximum allowed TPC PID sigma for the most probable particle; default it 4."}}; - Configurable maxNSigmaTOF{"maxNSigmaTOF", 4, {"Maximum allowed TOF PID sigma for the most probable particle; default it 4."}}; - - // process - void analyseBarrelTracks(aod::Collision const& collision, - aod::McCollisions const& mcCollisions, - MeasuredTCs& barrelTracks) - { - -// auto & mcCollision: mcCollisions::iterator; - - registry.get(HIST("hEffectOfSelections"))->Fill(3); - - LOGF(info, "vtx-z (data) = %f", collision.posZ()); - //if (mcCollisions != nullptr) LOGF(info, "vtx-z (data) = %f | size (MC) = %d", collision.posZ(), mcCollisions.size()); - - for (auto & barrelTrack: barrelTracks) { - - registry.get(HIST("hEffectOfSelections"))->Fill(0); - - bool isTwoTracks = false; - bool isFourTracks = false; - int whatTrack = 0; - bool reachedTOF = barrelTrack.hasTOF(); - - // Selection criteria - if (barrelTrack.p() < 0.1 ) continue; - registry.get(HIST("hEffectOfSelections"))->Fill(1); - - if (collision.numContrib() == 2) isTwoTracks = true; - if (collision.numContrib() == 4) isFourTracks = true; - - if (isTwoTracks && reachedTOF){ - registry.get(HIST("hEffectOfSelections"))->Fill(2); - whatTrack = TestTPConlyPIDhypothesis(barrelTrack); -// whatTrack = TestPIDhypothesis(barrelTrack); - LOGP(info,"momentum={}",barrelTrack.p()); - LOGP(info,"TPC"); - LOGP(info,"El={}, Mu={}, Pi={}, Ka={}, Pr={}, ",barrelTrack.tpcNSigmaEl(), barrelTrack.tpcNSigmaMu(), barrelTrack.tpcNSigmaPi(), barrelTrack.tpcNSigmaKa(), barrelTrack.tpcNSigmaPr()); - LOGP(info,"tpcExpSigmaEl={} tpcExpSignalDiffEl={}, tpcSignal={}",barrelTrack.tpcExpSigmaEl(),barrelTrack.tpcExpSignalDiffEl(),barrelTrack.tpcSignal()); - LOGP(info,"TOF"); - LOGP(info,"El={}, Mu={}, Pi={}, Ka={}, Pr={}, ",barrelTrack.tofNSigmaEl(), barrelTrack.tofNSigmaMu(), barrelTrack.tofNSigmaPi(), barrelTrack.tofNSigmaKa(), barrelTrack.tofNSigmaPr()); - LOGP(info,"tofExpSigmaEl={} tofExpSignalEl={} tofExpSignalDiffEl={}",barrelTrack.tofExpSigmaEl(),barrelTrack.tofExpSignalDiffEl(),barrelTrack.tofExpSignalDiffEl()); - LOGP(info,"************* this tracks is ={}", whatTrack); - - registry.get(HIST("hTPCsignalVsMom"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 0) registry.get(HIST("hTPCelectronIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 1) registry.get(HIST("hTPCmuonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 2) registry.get(HIST("hTPCpionIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 3) registry.get(HIST("hTPCkaonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - if (whatTrack == 4) registry.get(HIST("hTPCprotonIdentified"))->Fill(barrelTrack.p(),barrelTrack.tpcSignal()); - - } - - - - selectedUPCcandidateTracks(collision.posX(), collision.posY(), collision.posZ(), collision.numContrib(), - barrelTrack.pt(), barrelTrack.p(), - isTwoTracks, isFourTracks, whatTrack, reachedTOF); - - } // end loop over barrel tracks - - } // end data analysis - - void processMeasuredData(aod::Collision const& collision, - MeasuredTCs& barrelTracks){ - analyseBarrelTracks(collision, (aod::McCollisions)nullptr, barrelTracks); - } // end processMeasuredData - - void processMonteCarloData(aod::Collision const& collision, - aod::McCollisions const& mcCollisions, - MeasuredTCs& barrelTracks){ - isMonteCarloData = true; - analyseBarrelTracks(collision, mcCollisions, barrelTracks); - } // end processMonteCarloData - - PROCESS_SWITCH(UPCFilterCentralBarrel, processMeasuredData, "Process tables with measured data only", false); - PROCESS_SWITCH(UPCFilterCentralBarrel, processMonteCarloData, "Process tables with Monte Carlo data", false); - -}; - - - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-filter-central-barrel"}) - }; -} \ No newline at end of file diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 515b3b46f1d..a053e63ac3e 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -44,12 +44,7 @@ o2physics_add_dpl_workflow(upccand-analyzer PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(upc-central-barrel-analyzer - SOURCES upcCentralBarrelAnalyzer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework - COMPONENT_NAME Analysis) - o2physics_add_dpl_workflow(upc-mc-central-barrel - SOURCES upcMonteCarloCentralBarrel.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) + SOURCES upcMonteCarloCentralBarrel.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx deleted file mode 100644 index dc570745d1e..00000000000 --- a/PWGUD/Tasks/upcCentralBarrelAnalyzer.cxx +++ /dev/null @@ -1,72 +0,0 @@ -// 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. -/// -/// \brief -/// \author Roman Lavicka, roman.lavicka@cern.ch -/// \since 12.07.2022 - -// O2 headers -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" - -// O2Physics headers -#include "PWGUD/DataModel/UPCFilterCentralBarrel.h" - -using namespace o2; -using namespace o2::framework; - -struct UPCCentralBarrelAnalyzer { - - HistogramRegistry registry{ - "registry", - { - {"hRegNtracks", ";n tracks; Entries", { HistType::kTH1F, { { 201,-0.5,200.5 } } } }, - {"hRegChannels", ";channel; Entries", { HistType::kTH1I, { { 4,-0.5,3.5 } } } }, - {"hRegPvsPt", ";Track #it{p} (GeV/#it{c}); Track #it{p}_{T} (GeV/#it{c})", { HistType::kTH2F, { { 2000,0.,2. }, { 2000,0.,2. } } } }, - {"hRegPvsPt2trks", ";Track #it{p} (GeV/#it{c}); Track #it{p}_{T} (GeV/#it{c})", { HistType::kTH2F, { { 2000,0.,2. }, { 2000,0.,2. } } } }, - {"hRegPvsPt4trks", ";Track #it{p} (GeV/#it{c}); Track #it{p}_{T} (GeV/#it{c})", { HistType::kTH2F, { { 2000,0.,2. }, { 2000,0.,2. } } } } - } - }; - - void init(InitContext&){} - - void process(aod::UPCTrackCandidates const& upcTracks) { - - for (auto & upcTrack: upcTracks) { - - registry.get(HIST("hRegNtracks"))->Fill(upcTrack.numContrib()); - registry.get(HIST("hRegPvsPt"))->Fill(upcTrack.p(),upcTrack.pt()); - if (upcTrack.isTwoTracks()) { - registry.get(HIST("hRegChannels"))->Fill(1); - registry.get(HIST("hRegPvsPt2trks"))->Fill(upcTrack.p(),upcTrack.pt()); - } - else if (upcTrack.isFourTracks()) { - registry.get(HIST("hRegChannels"))->Fill(2); - registry.get(HIST("hRegPvsPt4trks"))->Fill(upcTrack.p(),upcTrack.pt()); - } - else if (upcTrack.isTwoTracks() && upcTrack.isFourTracks()) registry.get(HIST("hRegChannels"))->Fill(3); - else registry.get(HIST("hRegChannels"))->Fill(0); - - } // end loop over barrel tracks - - - } // end process - -}; - - - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-central-barrel-analyzer"}) - }; -} \ No newline at end of file From c35b99d6118dba7882ad70d71e5c2917b06d3e98 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Thu, 10 Nov 2022 17:04:43 +0100 Subject: [PATCH 10/29] Ready to work with UD tables. PVcontrib and mccollision connection not solved --- PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h | 358 ++++++++++-------- PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 242 ++++++------ 2 files changed, 315 insertions(+), 285 deletions(-) diff --git a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h b/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h index 39298e9dcfc..1d479d24cde 100644 --- a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h +++ b/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h @@ -21,6 +21,67 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; + +float momentum(float px, float py, float pz) +// Just a simple function to return momentum +{ + return TMath::Sqrt(px*px+py*py+pz*py); +} + +float invariantMass(float E, float px, float py, float pz) +// Just a simple function to return invariant mass +{ + return TMath::Sqrt(E*E-px*px-py*py-pz*py); +} + +float phi(float px, float py) +// Just a simple function to return azimuthal angle +{ + if (px!=0) return TMath::ATan(py/px); + return -999.; +} + +float eta(float px, float py, float pz) +// Just a simple function to return pseudorapidity +{ + float eta = -999.; + float mom = momentum(px,py,pz); + if (mom!=0) eta = TMath::ATanH(pz/mom); + if (-1. +int getElectronCharge(E generatedElectron) +// Check if particle is electron or positron and return charge accordingly. Return zero if particle is not electron/positron +{ + if (generatedElectron.pdgCode() == 11) return -1; + else if (generatedElectron.pdgCode() == -11) return 1; + else return 0; +} + +template +int64_t getEvSelsIndexOfThisCollisionBC(Es infoEvSels, uint64_t globalBC) +// reads full event selection table end return global index corresponding to given global BC. Return -1 when fails. +{ + for (auto& infoEvSel : infoEvSels){ + if (infoEvSel.bcId() == globalBC) return infoEvSel.globalIndex(); + } + return -1; +} + template bool isEvSelFITempty(C collision) // Get FIT information from EventSelection task for each collision @@ -30,20 +91,127 @@ bool isEvSelFITempty(C collision) } template -bool trackSelection(T track, int selection) +bool isFITempty(T FITinfo) +// Return true if FIT had no signal +{ + // check FT0 signal + bool hasNoFT0 = true; + bool isBB = FITinfo.bbFT0A() || FITinfo.bbFT0C(); + bool isBG = FITinfo.bgFT0A() || FITinfo.bgFT0C(); + hasNoFT0 = !isBB && !isBG; + // check FV0 signal + bool hasNoFV0A = true; + isBB = FITinfo.bbFV0A(); + isBG = FITinfo.bgFV0A(); + hasNoFV0A = !isBB && !isBG; + // check FDD signal + bool hasNoFDD = true; + isBB = FITinfo.bbFDDA() || FITinfo.bbFDDC(); + isBG = FITinfo.bgFDDA() || FITinfo.bgFDDC(); + hasNoFDD = !isBB && !isBG; + + if (hasNoFT0 && hasNoFV0A && hasNoFDD) return true; + else return false; +} + +template +bool isUDprimaryTrack(T udtrack) +// TrackSelection::kPrimaryTracks = kGoldenChi2 | kDCAxy | kDCAz; +{ + // temporary hardcoded input + float maxDcaXY = 0.5;// in mm + float maxDcaZ = 2.;// in mm + // selection GoldenChi2 + // seems to be always true for Run 3... at least it is not coded + // selection DCAxy + if (abs(udtrack.dcaXY()) > maxDcaXY) return false; + // selection DCAz + if (abs(udtrack.dcaZ()) > maxDcaZ) return false; + // passed all selections + return true; +} + +template +bool isUDinAcceptanceTrack(T udtrack) +// TrackSelection::kInAcceptanceTracks = kPtRange | kEtaRange; +{ + // temporary hardcoded input + float minPt = 0.;// in GeV + float minEta = -10.; + float maxPt = 10.;// in GeV + float maxEta = 10.; + float currentEta = eta(udtrack.px(),udtrack.py(),udtrack.pz()); + // selection pt + if (udtrack.pt() < minPt || udtrack.pt() > maxPt) return false; + // selection eta + if (currentEta < minEta || currentEta > maxEta) return false; + // passed all selections + return true; +} + +template +bool isUDqualityTrack(T udtrack) +// TrackSelection::kQualityTracks = kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits; +{ + // temporary hardcoded input + float cutITSchi2ndf = 6.; + uint8_t cutNitsClusters = 4; + float cutTPCchi2ndf = 4.; + int16_t cutNtpcClusters = 0; + int16_t cutNtpcCrossedRows = 70; + float cutCrossedRowsOverNclusters = 0.8; + // track type + // ignoring for the moment (its either innermost update track (0) or propagated track (1), the rest is Run 2) + // ITS hits + // ignoring for the moment (some crazy function which I haven't found anywhere to be used) + // ITS refit + if (!udtrack.hasITS()) return false; + // ITS chi2/ndf + if (udtrack.itsChi2NCl() > cutITSchi2ndf) return false; + // ITS n clusters + if (udtrack.itsNCls() < cutNitsClusters) return false; + // TPC refit + if (!udtrack.hasTPC()) return false; + // TPC chi2/ndf + if (udtrack.tpcChi2NCl() > cutTPCchi2ndf) return false; + // TPC n clusters + int16_t nFoundClusters = udtrack.tpcNClsFindable() - udtrack.tpcNClsFindableMinusFound(); + if (nFoundClusters < cutNtpcClusters) return false; + // TPC crossed rows + if (udtrack.tpcNClsCrossedRows() < cutNtpcCrossedRows) return false; + // TPC crossed rows over n clusters + float crossedRowsOverNclusters = (float)udtrack.tpcNClsCrossedRows()/nFoundClusters; + if (crossedRowsOverNclusters < cutCrossedRowsOverNclusters) return false; + // passed all selections + return true; +} + +template +bool isUDglobalTrack(T udtrack) +// combine quality+primary+acceptance +{ + if (!isUDinAcceptanceTrack(udtrack)) return false; + if (!isUDprimaryTrack(udtrack)) return false; + if (!isUDqualityTrack(udtrack)) return false; + return true; +} + +template +bool trackSelection(T udtrack, int selection) // Do selection of reconstructed track { + if (selection==0) return true; // Is central barrel propagated track - if (selection==1 && track.trackType()!=1) return false; + // TODO //if (selection==1 && track.trackType()!=1) return false; // Is central barrel vertex contributor - if (selection==2 && track.isPVContributor()!=1) return false; + // TODO //if (selection==2 && track.isPVContributor()!=1) return false; // Is central barrel track selection global track - if (selection==3 && track.isQualityTrack()!=1) return false; + if (selection==3 && isUDqualityTrack(udtrack)!=1) return false; // Is central barrel track selection global track - if (selection==4 && track.isPrimaryTrack()!=1) return false; + if (selection==4 && isUDprimaryTrack(udtrack)!=1) return false; // Is central barrel track selection global track - if (selection==5 && track.isGlobalTrack()!=1) return false; + if (selection==5 && isUDglobalTrack(udtrack)!=1) return false; return true; } @@ -61,15 +229,6 @@ bool selectTrack(T track, int setOfCuts) return true; } -template -int getElectronCharge(E generatedElectron) -// Check if particle is electron or positron and return charge accordingly. Return zero if particle is not electron/positron -{ - if (generatedElectron.pdgCode() == 11) return -1; - else if (generatedElectron.pdgCode() == -11) return 1; - else return 0; -} - template < typename C> void fillEventSelectionHistogram(HistogramRegistry ®istry, C collision) // Fill into histogram information from EventSelection task for each collision @@ -154,166 +313,35 @@ void fillTrackSelectionHistogram(HistogramRegistry ®istry, Ts tracks, C colli registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(16,70,0.02,30,-1,-1,"TPC+TOF"); if (hasITS && hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(16); registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(17,70,0.02,30,-1,-1,"ITS+TPC+TOF"); - if (isEvSelFITempty(collision)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(17); + if (isFITempty(collision)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(17); registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(18,70,0.02,30,-1,-1,"FIT empty"); } } -template -bool isFITempty(uint64_t bc, - std::map& bcsWithFT0, - std::map& bcsWithFDD, - std::map& bcsWithFV0A, - FTs ft0s, FDs fdds, FVs fv0as) -// Return true if FIT had no signal -{ - // FIT beam-gas flags - bool isBGFT0A, isBGFT0C, isBGFV0A, isBGFDDA, isBGFDDC; - // FIT beam-beam flags - bool isBBFT0A, isBBFT0C, isBBFV0A, isBBFDDA, isBBFDDC; - - // use "default" parameters - float fV0ABBlower = -3.0; // ns - float fV0ABBupper = +2.0; // ns - float fV0ABGlower = 2.0; // ns - float fV0ABGupper = 5.0; // ns - - float fFDABBlower = -3.0; // ns - float fFDABBupper = +3.0; // ns - float fFDABGlower = 10.0; // ns - float fFDABGupper = 13.0; // ns - float fFDCBBlower = -3.0; // ns - float fFDCBBupper = +3.0; // ns - float fFDCBGlower = -10.0; // ns - float fFDCBGupper = -3.0; // ns - - float fT0ABBlower = -1.0; // ns - float fT0ABBupper = +1.0; // ns - float fT0CBBlower = -1.0; // ns - float fT0CBBupper = +1.0; // ns - float fT0ABGlower = +1.0; // ns - float fT0ABGupper = +4.0; // ns - float fT0CBGlower = -4.0; // ns - float fT0CBGupper = -1.0; // ns - - float timeFV0A = -999.f; - float timeFT0A = -999.f; - float timeFT0C = -999.f; - float timeFDDA = -999.f; - float timeFDDC = -999.f; - float timeV0ABG = -999.f; - float timeT0ABG = -999.f; - float timeT0CBG = -999.f; - float timeFDABG = -999.f; - float timeFDCBG = -999.f; - - // check FIT info in the same BC - auto it = bcsWithFT0.find(bc); - if (it != bcsWithFT0.end()) { - const auto& ft0 = ft0s.iteratorAt(it->second); - timeFT0A = ft0.timeA(); - timeFT0C = ft0.timeC(); - } - - it = bcsWithFDD.find(bc); - if (it != bcsWithFDD.end()) { - const auto& fdd = fdds.iteratorAt(it->second); - timeFDDA = fdd.timeA(); - timeFDDC = fdd.timeC(); - } - - it = bcsWithFV0A.find(bc); - if (it != bcsWithFV0A.end()) { - const auto& fv0a = fv0as.iteratorAt(it->second); - timeFV0A = fv0a.time(); - } - - // check beam-gas - it = bcsWithFT0.find(bc - 1); - if (it != bcsWithFT0.end()) { - const auto& ft0 = ft0s.iteratorAt(it->second); - timeT0ABG = ft0.timeA(); - timeT0CBG = ft0.timeC(); - } - - it = bcsWithFDD.find(bc - 5); - if (it != bcsWithFDD.end()) { - const auto& ft0 = fdds.iteratorAt(it->second); - timeFDABG = ft0.timeA(); - timeFDCBG = ft0.timeC(); - } - - it = bcsWithFV0A.find(bc - 1); - if (it != bcsWithFV0A.end()) { - const auto& fv0a = fv0as.iteratorAt(it->second); - timeV0ABG = fv0a.time(); - } - - // beam-gas flags - isBGFV0A = timeV0ABG > fV0ABGlower && timeV0ABG < fV0ABGupper; - isBGFDDA = timeFDABG > fFDABGlower && timeFDABG < fFDABGupper; - isBGFDDC = timeFDCBG > fFDCBGlower && timeFDCBG < fFDCBGupper; - isBGFT0A = timeT0ABG > fT0ABGlower && timeT0ABG < fT0ABGupper; - isBGFT0C = timeT0CBG > fT0CBGlower && timeT0CBG < fT0CBGupper; - - // beam-beam flags - isBBFT0A = timeFT0A > fT0ABBlower && timeFT0A < fT0ABBupper; - isBBFT0C = timeFT0C > fT0CBBlower && timeFT0C < fT0CBBupper; - isBBFV0A = timeFV0A > fV0ABBlower && timeFV0A < fV0ABBupper; - isBBFDDA = timeFDDA > fFDABBlower && timeFDDA < fFDABBupper; - isBBFDDC = timeFDDC > fFDCBBlower && timeFDDC < fFDCBBupper; - - // check FT0 signal - bool hasNoFT0 = true; - bool isBB = isBBFT0A || isBBFT0C; - bool isBG = isBGFT0A || isBGFT0C; - hasNoFT0 = !isBB && !isBG; - // check FV0 signal - bool hasNoFV0A = true; - isBB = isBBFV0A; - isBG = isBGFV0A; - hasNoFV0A = !isBB && !isBG; - // check FDD signal - bool hasNoFDD = true; - isBB = isBBFDDA || isBBFDDC; - isBG = isBGFDDA || isBGFDDC; - hasNoFDD = !isBB && !isBG; - - if (hasNoFT0 && hasNoFV0A && hasNoFDD) return true; - else return false; -} - -float invariantMass(float E, float px, float py, float pz) -// Just a simple function to return invariant mass -{ - float im = E*E - px*px - py*py - pz*py; - return TMath::Sqrt(im); -} - -template -void printCollisionData(C collision, MCs generatedCollisions, P slice) -// Function to print collision info +template +void printTrackData(T track) +// Function to print basic info on track { - - // sliced TF generated collisions according to BC id of the current reconstructed collision - auto slicedGeneratedCollisions = generatedCollisions.sliceBy(slice,collision.bcId()); - - LOGF(info,"Reconstructed collision idx: %d; Associated generated collision idx: %d", - collision.globalIndex(),collision.mcCollision().globalIndex()); - LOGF(info,"%d generated collisions in bunch crossing %d related to this reconstructed collisions", - slicedGeneratedCollisions.size(),collision.bcId()); + // TODO return to this version once PVContributor is fixed + // LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d;" + // " Associated MC particle idx %d, primary %d, PDG code %d", + LOGF(info,"Track idx %d, hasITS %d, hasTPC %d, hasTOF %d", + track.globalIndex(),track.hasITS(),track.hasTPC(),track.hasTOF()); } template -void printTrackData(T track) +void printTrackParticleData(T track) // Function to print basic info on track and its associated mc particle { - if (track.has_mcParticle()) { - auto mcparticle = track.mcParticle(); - LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d;" - " Associated MC particle idx %d, primary %d, PDG code %d", - track.globalIndex(),track.isPVContributor(),track.hasITS(),track.hasTPC(),track.hasTOF(), + LOGF(info,"Track idx %d, hasITS %d, hasTPC %d, hasTOF %d", + track.globalIndex(),track.hasITS(),track.hasTPC(),track.hasTOF()); + if (track.has_udMcParticle()) { + auto mcparticle = track.udMcParticle(); + // TODO return to this version once PVContributor is fixed + // LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d;" + // " Associated MC particle idx %d, primary %d, PDG code %d", + LOGF(info," Associated MC particle idx %d, primary %d, PDG code %d", mcparticle.globalIndex(),mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); } } @@ -325,7 +353,7 @@ void printCollisionTracksData(Ts tracks, int setOfCuts) int countNoMCparticle = 0; for (auto& track : tracks){ if (!selectTrack(track,setOfCuts)) continue; - if (track.has_mcParticle()) { + if (track.has_udMcParticle()) { printTrackData(track); } else countNoMCparticle++; diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx index abff3dbedd9..6d0cc469c0e 100644 --- a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx +++ b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx @@ -13,20 +13,14 @@ /// \author Roman Lavicka, roman.lavicka@cern.ch /// \since 12.07.2022 -//#include -//#include - // O2 headers #include "Framework/runDataProcessing.h" #include "Framework/AnalysisTask.h" #include "Framework/AnalysisDataModel.h" -//#include "CommonConstants/PhysicsConstants.h" // O2Physics headers -#include "Common/DataModel/PIDResponse.h" -#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/TrackSelection.h" #include "Common/DataModel/EventSelection.h" -#include "Common/CCDB/EventSelectionParams.h" #include "PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h" #include "PWGUD/DataModel/UDTables.h" @@ -107,12 +101,8 @@ struct UpcMCCentralBarrel { // Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; // declare shortcuts - using ReconstructedTCs = soa::Join; - using ReconstructedCollision = soa::Join::iterator; - // using ReconstructedCollision = soa::Filtered>::iterator; - + using ReconstructedTracks = soa::Join; + using ReconstructedCollision = soa::Join::iterator; // init void init(InitContext&){ @@ -134,47 +124,41 @@ struct UpcMCCentralBarrel { // declare preslices = table cross-connections Preslice perMcCollision = aod::mcparticle::mcCollisionId; - Preslice perBC = aod::mccollision::bcId; // process void processSimulatorLevel(ReconstructedCollision const& reconstructedCollision, - aod::McCollisions const& generatedCollisions, - ReconstructedTCs const& reconstructedBarrelTracks, - aod::McParticles const& generatedParticles, - aod::BCs const& bcs, - aod::FT0s const& ft0s, - aod::FDDs const& fdds, - aod::FV0As const& fv0as){ + aod::UDMcCollisions const& generatedCollisions, + ReconstructedTracks const& reconstructedBarrelTracks, + aod::UDMcParticles const& generatedParticles, + soa::Join const& infoEventSelection){ + if(isFirstReconstructedCollisions){ isFirstReconstructedCollisions = false; if (verboseInfo) printLargeMessage("START LOOPING OVER RECONSTRUCTED COLLISIONS"); } if (verboseInfo) printLargeMessage("NEW COLLISION"); - if (printMetaInfo) printCollisionData(reconstructedCollision, generatedCollisions, perBC); countCollisions++; registry.get(HIST("hEffectOfSelections"))->Fill(0); - fillEventSelectionHistogram(registry,reconstructedCollision); + auto thisCollisionEventSelectionInfo = infoEventSelection.iteratorAt(getEvSelsIndexOfThisCollisionBC(infoEventSelection,reconstructedCollision.globalBC())); + fillEventSelectionHistogram(registry,thisCollisionEventSelectionInfo); fillTrackSelectionHistogram(registry,reconstructedBarrelTracks,reconstructedCollision); registry.get(HIST("hNcontributionsToReconstructedCollision"))->Fill(reconstructedCollision.numContrib()); - auto thisReconstructedCollisionGeneratedParticles = generatedParticles.sliceBy(perMcCollision, reconstructedCollision.mcCollision().globalIndex()); - - int nGeneratedParticlesInThisReconstructedCollision = thisReconstructedCollisionGeneratedParticles.size(); + // TODO fix when you can touch mcccollision // int nGeneratedParticlesInThisReconstructedCollision = ????????; int nReconstructedTracksInThisReconstructedCollision = reconstructedBarrelTracks.size(); if (verboseDebug) LOGF(info,"collision number = %d has %d contributors",countCollisions,reconstructedCollision.numContrib()); - if (verboseDebug) LOGF(info,"This slice: number of reconstructed tracks = %d, number of generated particles in this slice %d", - reconstructedBarrelTracks.size(),nGeneratedParticlesInThisReconstructedCollision); + // TODO fix when you can touch mcccollision //if (verboseDebug) LOGF(info,"This slice: number of reconstructed tracks = %d, number of generated particles in this slice %d", reconstructedBarrelTracks.size(),nGeneratedParticlesInThisReconstructedCollision); - registry.get(HIST("hNgeneratedParticles"))->Fill(nGeneratedParticlesInThisReconstructedCollision); + // TODO fix when you can touch mcccollision //registry.get(HIST("hNgeneratedParticles"))->Fill(nGeneratedParticlesInThisReconstructedCollision); registry.get(HIST("hNreconstructedTracks"))->Fill(nReconstructedTracksInThisReconstructedCollision); registry.get(HIST("hNreconstructedTracksWide"))->Fill(nReconstructedTracksInThisReconstructedCollision); - registry.get(HIST("hNrecoVSgene"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); - registry.get(HIST("hNrecoVSgeneMany"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); + // TODO fix when you can touch mcccollision //registry.get(HIST("hNrecoVSgene"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); + // TODO fix when you can touch mcccollision //registry.get(HIST("hNrecoVSgeneMany"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); registry.get(HIST("hVtxZ"))->Fill(reconstructedCollision.posZ()); - registry.get(HIST("hVtxZrecToGen"))->Fill(reconstructedCollision.posZ()-reconstructedCollision.mcCollision().posZ()); + // TODO find a way how to fill in this histogram //registry.get(HIST("hVtxZrecToGen"))->Fill(reconstructedCollision.posZ()-reconstructedCollision.mcCollision().posZ()); registry.get(HIST("hVtxTransversal"))->Fill(reconstructedCollision.posX(),reconstructedCollision.posY()); int countReconstructedPrimaryTracks = 0; @@ -185,23 +169,25 @@ struct UpcMCCentralBarrel { int countContributorsToVertex = 0; int countGlobalContributorsToVertex = 0; for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ + float thisTrackMomentum = momentum(reconstructedBarrelTrack.px(),reconstructedBarrelTrack.py(),reconstructedBarrelTrack.pz()); + float thisTrackTPCsignal = reconstructedBarrelTrack.tpcSignal(); if (!selectTrack(reconstructedBarrelTrack,applyTrackCuts)) continue; - if (reconstructedBarrelTrack.isPVContributor()) countContributorsToVertex++; + // TODO get tag for PV contributor //if (reconstructedBarrelTrack.isPVContributor()) countContributorsToVertex++; if (selectTrack(reconstructedBarrelTrack,2)) countGlobalContributorsToVertex++; - if (reconstructedBarrelTrack.has_mcParticle()) { - if (reconstructedBarrelTrack.hasTPC()) registry.get(HIST("hTPCsignalVsMom"))->Fill(reconstructedBarrelTrack.p(),reconstructedBarrelTrack.tpcSignal()); + if (reconstructedBarrelTrack.has_udMcParticle()) { + if (reconstructedBarrelTrack.hasTPC()) registry.get(HIST("hTPCsignalVsMom"))->Fill(thisTrackMomentum,thisTrackTPCsignal); countReconstructedTracksWithGeneratedParticle++; - auto generatedParticle = reconstructedBarrelTrack.mcParticle(); + auto generatedParticle = reconstructedBarrelTrack.udMcParticle(); if (generatedParticle.isPhysicalPrimary()) { countPrimaryGeneratedParticlesWithReconstructedTrack++; if (TMath::Abs(generatedParticle.pdgCode()) == 11) { countPrimaryGeneratedElectronsWithReconstructedTrack++; - if (reconstructedBarrelTrack.hasTPC()) registry.get(HIST("hTPCelectronIdentified"))->Fill(reconstructedBarrelTrack.p(),reconstructedBarrelTrack.tpcSignal()); + if (reconstructedBarrelTrack.hasTPC()) registry.get(HIST("hTPCelectronIdentified"))->Fill(thisTrackMomentum,thisTrackTPCsignal); } } } else countReconstructedTracksWithoutGeneratedParticle++; - if (reconstructedBarrelTrack.isPVContributor()) countReconstructedPrimaryTracks++; + // TODO get tag for PV contributor //if (reconstructedBarrelTrack.isPVContributor()) countReconstructedPrimaryTracks++; } if (printMetaInfo) printCollisionTracksData(reconstructedBarrelTracks,applyTrackCuts); @@ -220,49 +206,33 @@ struct UpcMCCentralBarrel { for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ if (!trackSelection(reconstructedBarrelTrack,2)) continue; if (!trackSelection(reconstructedBarrelTrack,5)) continue; - if (isEvSelFITempty(reconstructedCollision)) continue; + if (isFITempty(reconstructedCollision)) continue; printTrackData(reconstructedBarrelTrack); - registry.get(HIST("hTrackP"))->Fill(reconstructedBarrelTrack.p()); + float trkPx = reconstructedBarrelTrack.px(); + float trkPy = reconstructedBarrelTrack.py(); + float trkPz = reconstructedBarrelTrack.pz(); + registry.get(HIST("hTrackP"))->Fill(momentum(trkPx,trkPy,trkPz)); registry.get(HIST("hTrackPt"))->Fill(reconstructedBarrelTrack.pt()); - registry.get(HIST("hTrackPhi"))->Fill(reconstructedBarrelTrack.phi()); - registry.get(HIST("hTrackEta"))->Fill(reconstructedBarrelTrack.eta()); - if (reconstructedBarrelTrack.has_mcParticle()) { - auto mcparticle = reconstructedBarrelTrack.mcParticle(); + registry.get(HIST("hTrackPhi"))->Fill(phi(trkPx,trkPy)); + registry.get(HIST("hTrackEta"))->Fill(eta(trkPx,trkPy,trkPz)); + if (reconstructedBarrelTrack.has_udMcParticle()) { + auto mcparticle = reconstructedBarrelTrack.udMcParticle(); registry.get(HIST("hPDGcodes"))->Fill(mcparticle.pdgCode()); auto pdgInfo = pdg->GetParticle(mcparticle.pdgCode()); if (pdgInfo != nullptr) { float mass = pdgInfo->Mass(); - registry.get(HIST("hTrackEnergy"))->Fill(reconstructedBarrelTrack.energy(mass)); - registry.get(HIST("hTrackRapidity"))->Fill(reconstructedBarrelTrack.rapidity(mass)); + registry.get(HIST("hTrackEnergy"))->Fill(energy(mass,trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass,trkPx,trkPy,trkPz)); } } - } // // fetching FT0, FDD, FV0 information // - std::map BCsWithFT0; - // collect BCs with FT0 signals - for (const auto& ft0 : ft0s) { - uint64_t bc = ft0.bc().globalBC(); - BCsWithFT0[bc] = ft0.globalIndex(); - } - std::map BCsWithFDD; - // collect BCs with FDD signals - for (const auto& fdd : fdds) { - uint64_t bc = fdd.bc().globalBC(); - BCsWithFDD[bc] = fdd.globalIndex(); - } - std::map BCsWithFV0A; - // collect BCs with FV0A signals - for (const auto& fv0a : fv0as) { - uint64_t bc = fv0a.bc().globalBC(); - BCsWithFV0A[bc] = fv0a.globalIndex(); - } - bool FITisEmpty = isFITempty(reconstructedCollision.bcId(), BCsWithFT0, BCsWithFDD, BCsWithFV0A, ft0s, fdds, fv0as); + bool FITisEmpty = isFITempty(reconstructedCollision); if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(1); - FITisEmpty = isEvSelFITempty(reconstructedCollision); + FITisEmpty = isEvSelFITempty(thisCollisionEventSelectionInfo); if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(2); if (countContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(3); if (countGlobalContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(4); @@ -279,17 +249,17 @@ struct UpcMCCentralBarrel { int countTrks = 0; if (countContributorsToVertex == 2) { for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ - if (!reconstructedBarrelTrack.isPVContributor()) continue; + // TODO get tag for PV contributor //if (!reconstructedBarrelTrack.isPVContributor()) continue; countTrks++; trackFromVertex.SetPxPyPzE(reconstructedBarrelTrack.px(),reconstructedBarrelTrack.py(),reconstructedBarrelTrack.pz(), - reconstructedBarrelTrack.energy(constants::physics::MassElectron)); + energy(constants::physics::MassElectron,reconstructedBarrelTrack.px(),reconstructedBarrelTrack.py(),reconstructedBarrelTrack.pz())); sumOfVertexTracks+=trackFromVertex; if (reconstructedBarrelTrack.hasTPC()){ if (countTrks == 1) dedxVC1 = reconstructedBarrelTrack.tpcSignal(); else if (countTrks == 2) dedxVC2 = reconstructedBarrelTrack.tpcSignal(); else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); - if (reconstructedBarrelTrack.has_mcParticle()) { - auto generatedParticle = reconstructedBarrelTrack.mcParticle(); + if (reconstructedBarrelTrack.has_udMcParticle()) { + auto generatedParticle = reconstructedBarrelTrack.udMcParticle(); if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11) { if (countTrks == 1) dedxEl1 = reconstructedBarrelTrack.tpcSignal(); else if (countTrks == 2) dedxEl2 = reconstructedBarrelTrack.tpcSignal(); @@ -314,38 +284,39 @@ struct UpcMCCentralBarrel { //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MC TRUTH STARTS HERE //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - if (printMetaInfo) printCollisionGeneratedParticles(generatedParticles,perMcCollision,reconstructedCollision); +// TODO fix when you can touch mcccollision +// if (printMetaInfo) printCollisionGeneratedParticles(generatedParticles,perMcCollision,reconstructedCollision); +// TLorentzVector candidateJpsi, electron; +// int countGeneratedElectrons = 0; +// int countGeneratedPrimaryElectrons = 0; +// int countGeneratedPrimaryParticles = 0; +// for (auto & generatedParticle: ???){ +// if (verboseDebug) LOGF(info,"Particle type = %d",generatedParticle.pdgCode()); +// if (verboseDebug) LOGF(info,"Particle isPhysicalPrimary = %d",generatedParticle.isPhysicalPrimary()); +// if (generatedParticle.isPhysicalPrimary()) countGeneratedPrimaryParticles++; +// if (TMath::Abs(generatedParticle.pdgCode()) == 11) { +// countGeneratedElectrons++; +// } +// if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ +// countGeneratedPrimaryElectrons++; +// electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); +// } +// } +// if(countGeneratedPrimaryElectrons==2){ +// int electronCharge = 0; +// for (auto & generatedParticle: ???){ +// if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ +// electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); +// candidateJpsi+=electron; +// if (electronCharge == 0) electronCharge = getElectronCharge(generatedParticle); +// else if (electronCharge == getElectronCharge(generatedParticle))continue; +// } +// } +// } +// registry.get(HIST("hNgeneratedElectronsWithRecoColl"))->Fill(countGeneratedElectrons); +// registry.get(HIST("hNgeneratedPrimaryElectronsWithRecoColl"))->Fill(countGeneratedPrimaryElectrons); +// registry.get(HIST("hNgeneratedPrimaryParticlesWithRecoColl"))->Fill(countGeneratedPrimaryParticles); - TLorentzVector candidateJpsi, electron; - int countGeneratedElectrons = 0; - int countGeneratedPrimaryElectrons = 0; - int countGeneratedPrimaryParticles = 0; - for (auto & generatedParticle: thisReconstructedCollisionGeneratedParticles){ - if (verboseDebug) LOGF(info,"Particle type = %d",generatedParticle.pdgCode()); - if (verboseDebug) LOGF(info,"Particle isPhysicalPrimary = %d",generatedParticle.isPhysicalPrimary()); - if (generatedParticle.isPhysicalPrimary()) countGeneratedPrimaryParticles++; - if (TMath::Abs(generatedParticle.pdgCode()) == 11) { - countGeneratedElectrons++; - } - if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ - countGeneratedPrimaryElectrons++; - electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); - } - } - if(countGeneratedPrimaryElectrons==2){ - int electronCharge = 0; - for (auto & generatedParticle: thisReconstructedCollisionGeneratedParticles){ - if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ - electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); - candidateJpsi+=electron; - if (electronCharge == 0) electronCharge = getElectronCharge(generatedParticle); - else if (electronCharge == getElectronCharge(generatedParticle))continue; - } - } - } - registry.get(HIST("hNgeneratedElectronsWithRecoColl"))->Fill(countGeneratedElectrons); - registry.get(HIST("hNgeneratedPrimaryElectronsWithRecoColl"))->Fill(countGeneratedPrimaryElectrons); - registry.get(HIST("hNgeneratedPrimaryParticlesWithRecoColl"))->Fill(countGeneratedPrimaryParticles); } // end processSimulatorLevel @@ -409,26 +380,27 @@ struct UpcMCCentralBarrel { registry.get(HIST("hMotherRapidity"))->Fill(candidateJpsi.Rapidity()); - } // end processGeneratorLevel void processTest1(aod::McCollision const& generatedCollision, aod::McParticles const& generatedParticles){ if (verboseDebug) LOGF(info,"n particles %d",generatedParticles.size()); - }// end processGeneratorLevelTest + }// end processTest1 void processTest2(aod::McCollision const& generatedCollision){ - }// end processGeneratorLevelTest + LOGF(info,"MC generators ID %d",generatedCollision.generatorsID()); + + }// end processTest2 void processTest3(aod::McParticles const& generatedParticles){ if (verboseDebug) LOGF(info,"n particles %d",generatedParticles.size()); - }// end processGeneratorLevelTest + }// end processTest3 void processTest4(aod::McParticle const& generatedParticle){ if (generatedParticle.mcCollisionId() < indexCollision) LOGF(warning,"WARNING: previous index %d, this index %d",indexCollision,generatedParticle.mcCollisionId()); indexCollision = generatedParticle.mcCollisionId(); - }// end processGeneratorLevelTest + }// end processTest4 int largestIndex = 0; @@ -440,25 +412,55 @@ struct UpcMCCentralBarrel { if (largestIndex <= generatedCollision.globalIndex()) largestIndex = generatedCollision.globalIndex(); } - }// end processGeneratorLevelTest5 + }// end processTest5 - void processAnalysisFinished(aod::Collisions const& collisions){ + void processTest6(aod::Collision const& collision){ - if (verboseInfo) LOGF(info,"####################################### END #######################################"); - if (verboseDebug) LOGF(info,"countCollisions = %d, largestIndex = %d",countCollisions,largestIndex); - isFirstReconstructedCollisions = true; - isFirstGeneratedCollisions = true; + LOGF(info,"Collision BC id %d",collision.bcId()); + + }// end processTest6 + + + void processTestUDtable1(soa::Join::iterator const& track, + aod::UDMcParticles const& particles){ + + LOGF(info,"IDX %d, mask %d",track.udMcParticleId(),track.mcMask()); + printTrackParticleData(track); + + }// end processTestUDtable1 + + void processTestUDtable2(soa::Join::iterator const& track){ + +// printTrackData(track); + + if (isUDglobalTrack(track)) { + LOGF(info,"++++++"); + LOGF(info,"isUDprimaryTrack(track) %b",isUDprimaryTrack(track)); + LOGF(info,"isUDinAcceptanceTrack(track) %b",isUDinAcceptanceTrack(track)); + LOGF(info,"isUDqualityTrack(track) %b",isUDqualityTrack(track)); + } + + + }// end processTestUDtable2 + + void processTestUDtable3(aod::UDCollision const& collision){ + + LOGF(info,"IDX %d, globalBC %d",collision.globalIndex(),collision.globalBC()); + + }// end processTestUDtable3 - } // end processAnalysisFinished PROCESS_SWITCH(UpcMCCentralBarrel, processSimulatorLevel, "Iterate MC tables with reconstructed data", false); PROCESS_SWITCH(UpcMCCentralBarrel, processGeneratorLevel, "Iterate MC tables with generated data", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest1, "Test with data", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest2, "Test with data", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest3, "Test with data", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest4, "Test with data", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest5, "Test with data", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processAnalysisFinished, "Simply runs in the end", true); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest1, "Test MC collision + particles", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest2, "Test MC collisions", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest3, "Test MC particles", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest4, "Test single MC particle", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTest5, "Test index sorting of MC collisions in reco collision", false) + PROCESS_SWITCH(UpcMCCentralBarrel, processTest6, "Test single collision", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTestUDtable1, "Test tracks and its particles from UD table", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTestUDtable2, "Test tracks from UD table", false); + PROCESS_SWITCH(UpcMCCentralBarrel, processTestUDtable3, "Test collisions from UD table", false); }; From 4b5333f6e4263343c7dcb23d0ada0c4b9a7ade7c Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Thu, 10 Nov 2022 18:08:15 +0100 Subject: [PATCH 11/29] Task cleaned and ready --- PWGUD/Tasks/CMakeLists.txt | 5 + PWGUD/Tasks/romanCentralBarrel.cxx | 230 +++++++++++++++++++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 PWGUD/Tasks/romanCentralBarrel.cxx diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index a053e63ac3e..323911a0afd 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -48,3 +48,8 @@ o2physics_add_dpl_workflow(upc-mc-central-barrel SOURCES upcMonteCarloCentralBarrel.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(roman-central-barrel + SOURCES romanCentralBarrel.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/romanCentralBarrel.cxx b/PWGUD/Tasks/romanCentralBarrel.cxx new file mode 100644 index 00000000000..8cbbcd74434 --- /dev/null +++ b/PWGUD/Tasks/romanCentralBarrel.cxx @@ -0,0 +1,230 @@ +// 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. +/// +/// \brief +/// \author Roman Lavicka, roman.lavicka@cern.ch +/// \since 10.11.2022 + +// O2 headers +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" + +// O2Physics headers +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/EventSelection.h" +#include "PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h" +#include "PWGUD/DataModel/UDTables.h" + +// ROOT headers +#include "TLorentzVector.h" +#include "TDatabasePDG.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct RomanCentralBarrel { + + // Global varialbes + int countCollisions; + Service pdg; + + HistogramRegistry registry{ + "registry", + { + {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEffectOfTrackSelections", "Effect of track cuts;Selection (-);Number of tracks (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEventSelectionTask", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEventSelectionTaskParameters", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {kNsel,-0.5,kNsel-0.5} } } }, + {"hNcontributionsToCollision", ";Number of contributions in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNtracks", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNtracksWide", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {1000,-0.5,999.5} } } }, + {"hNcontributionsToVertex", ";Number of contributors to vertex (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNprimaryTracks", ";Number of primary tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,2.8,3.4} } } }, + {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, + {"hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, + {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, + {"hMotherPhi", ";Mother #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-TMath::Pi(),TMath::Pi()} } } }, + {"hMotherRapidity", ";Mother #y (-);Number of events (-)", { HistType::kTH1D, { {500,-2.,2.} } } }, + {"hVtxZ", ";Vertex z-position (cm);Number of events (-)", { HistType::kTH1D, { {1000,-30.,30.} } } }, + {"hVtxTransversal", ";Vertex x-position (cm);Vertex y-position (cm)", { HistType::kTH2D, { {1000,-0.1,0.1}, {1000,-0.1,0.1} } } }, + {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCsignalVtxContributors", ";Vtx contributor 1 - TPC d#it{E}/d#it{x} (arb. units);Vtx contributor 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, + {"hTPCsignalElectrons", ";Identified electron 1 - TPC d#it{E}/d#it{x} (arb. units);Identified electron 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, + {"hTrackP", ";Track #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, + {"hTrackPt", ";Track #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,5.} } } }, + {"hTrackPhi", ";Track #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-2*TMath::Pi(),2*TMath::Pi()} } } }, + {"hTrackEta", ";Track #eta (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } }, + {"hTrackEnergy", ";Track Energy (GeV);Number of events (-)", { HistType::kTH1D, { {500,0.,100.} } } }, + {"hTrackRapidity", ";Track rapidity (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } } + } + }; + + // declare configurables + Configurable verboseInfo{"verboseInfo", true, {"Print general info to terminal; default it true."}}; + Configurable printMetaInfo{"printMetaInfo", false, {"Print general info to terminal about collision, tracks, particles...; default it false."}}; + Configurable verboseDebug{"verboseDebug", false, {"Print debug info to terminal; default it false."}}; + Configurable applyTrackCuts{"applyTrackCuts", 0, {"Apply n selections on track; default it no cut."}}; + Configurable applySingleTrackCut{"applySingleTrackCut", 0, {"Apply selection n on track, applyTrackCuts must be at maximum for full usage; default it no cut."}}; + + // declare filters +// Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; + + // declare shortcuts + using FullTracks = soa::Join; + using FullCollision = soa::Join::iterator; + + // init + void init(InitContext&){ + if (verboseInfo) printLargeMessage("INIT METHOD"); + countCollisions = 0; + + } // end init + + // run + void run(ProcessingContext& context){ + + if (verboseInfo) printLargeMessage("RUN METHOD"); + if (verboseDebug) LOGF(info,"countCollisions = %d",countCollisions); + + } // end run + + + // process + void processCentralBarrel(FullCollision const& collision, + FullTracks const& tracks, + soa::Join const& infoEventSelection){ + + const float massEl = constants::physics::MassElectron; + const float massMu = constants::physics::MassMuon; + const float massPi = constants::physics::MassPionCharged; + const float massKa = constants::physics::MassKaonCharged; + const float massPr = constants::physics::MassProton; + + if (verboseInfo) printLargeMessage("NEW COLLISION"); + countCollisions++; + registry.get(HIST("hEffectOfSelections"))->Fill(0); +/* + auto thisCollisionEventSelectionInfo = infoEventSelection.iteratorAt(getEvSelsIndexOfThisCollisionBC(infoEventSelection,collision.globalBC())); + fillEventSelectionHistogram(registry,thisCollisionEventSelectionInfo); + fillTrackSelectionHistogram(registry,tracks,collision); + + registry.get(HIST("hNcontributionsToCollision"))->Fill(collision.numContrib()); + + int nTracksInThisCollision = tracks.size(); + if (verboseDebug) LOGF(info,"collision number = %d has %d contributors",countCollisions,collision.numContrib()); + + registry.get(HIST("hNtracks"))->Fill(nTracksInThisCollision); + registry.get(HIST("hNtracksWide"))->Fill(nTracksInThisCollision); + registry.get(HIST("hVtxZ"))->Fill(collision.posZ()); + registry.get(HIST("hVtxTransversal"))->Fill(collision.posX(),collision.posY()); + + int countPrimaryTracks = 0; + int countContributorsToVertex = 0; + int countGlobalContributorsToVertex = 0; + for (auto& track : tracks){ + float thisTrackMomentum = momentum(track.px(),track.py(),track.pz()); + float thisTrackTPCsignal = track.tpcSignal(); + if (!selectTrack(track,applyTrackCuts)) continue; + // TODO get tag for PV contributor //if (track.isPVContributor()) countContributorsToVertex++; + if (selectTrack(track,2)) countGlobalContributorsToVertex++; + // TODO get tag for PV contributor //if (track.isPVContributor()) countPrimaryTracks++; + } + + registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); + registry.get(HIST("hNprimaryTracks"))->Fill(countPrimaryTracks); + + // + // Playing around + // + if (verboseInfo) printLargeMessage("Primary + Global + FIT"); + for (auto& track : tracks){ + if (!trackSelection(track,2)) continue; + if (!trackSelection(track,5)) continue; + if (isFITempty(collision)) continue; + printTrackData(track); + float trkPx = track.px(); + float trkPy = track.py(); + float trkPz = track.pz(); + registry.get(HIST("hTrackP"))->Fill(momentum(trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackPt"))->Fill(track.pt()); + registry.get(HIST("hTrackPhi"))->Fill(phi(trkPx,trkPy)); + registry.get(HIST("hTrackEta"))->Fill(eta(trkPx,trkPy,trkPz)); + float mass = massEl;//TODO do proper mass estimate + registry.get(HIST("hTrackEnergy"))->Fill(energy(mass,trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass,trkPx,trkPy,trkPz)); + } + + // + // fetching FT0, FDD, FV0 information + // + bool FITisEmpty = isFITempty(collision); + if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(1); + FITisEmpty = isEvSelFITempty(thisCollisionEventSelectionInfo); + if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(2); + if (countContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(3); + if (countGlobalContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(4); + + + // + // TPC signal info starts here + // + TLorentzVector sumOfVertexTracks, trackFromVertex; + float dedxVC1 = -999.; + float dedxVC2 = -999.; + float dedxEl1 = -999.; + float dedxEl2 = -999.; + int countTrks = 0; + if (countContributorsToVertex == 2) { + for (auto& track : tracks){ + // TODO get tag for PV contributor //if (!track.isPVContributor()) continue; + countTrks++; + trackFromVertex.SetPxPyPzE(track.px(),track.py(),track.pz(), + energy(constants::physics::MassElectron,track.px(),track.py(),track.pz())); + sumOfVertexTracks+=trackFromVertex; + if (track.hasTPC()){ + if (countTrks == 1) dedxVC1 = track.tpcSignal(); + else if (countTrks == 2) dedxVC2 = track.tpcSignal(); + else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); + +// if (countTrks == 1) dedxEl1 = track.tpcSignal();// TODO +// else if (countTrks == 2) dedxEl2 = track.tpcSignal();// TODO +// else LOGP(warning,"!!!Strange behaviour in the loop, check!!!");// TODO + } + } + registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC1,dedxVC2); + registry.get(HIST("hTPCsignalElectrons"))->Fill(dedxEl1,dedxEl2); + registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); + registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); + registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); + registry.get(HIST("hMotherPwide"))->Fill(sumOfVertexTracks.P()); + registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); + registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); + registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); + } + */ + } // end processCentralBarrel + + + PROCESS_SWITCH(RomanCentralBarrel, processCentralBarrel, "Iterate central barrel data using UD tables", true); + +}; + + + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"roman-central-barrel"}) + }; +} \ No newline at end of file From 8ac93f479b3cef06e30ac5a2bc0cedc0b75b3f76 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Thu, 10 Nov 2022 20:04:05 +0100 Subject: [PATCH 12/29] PID selector implemented --- PWGUD/Core/RomanPIDhelper.h | 65 ++++++++++++++++++++++++++++++ PWGUD/Tasks/romanCentralBarrel.cxx | 33 ++++++++------- 2 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 PWGUD/Core/RomanPIDhelper.h diff --git a/PWGUD/Core/RomanPIDhelper.h b/PWGUD/Core/RomanPIDhelper.h new file mode 100644 index 00000000000..9b0b9b6707e --- /dev/null +++ b/PWGUD/Core/RomanPIDhelper.h @@ -0,0 +1,65 @@ +// +// Created by Roman Lavička on 10.11.2022. +// + +#ifndef ALISW_ROMANPIDHELPER_H +#define ALISW_ROMANPIDHELPER_H + +enum MyParticle { P_ELECTRON = 0, P_MUON = 1, P_PION = 2, P_KAON = 3, P_PROTON = 4}; + +template +int testPIDhypothesis(T trackPIDinfo) +// Choose, which particle it is according to PID +{ + float nSigmaTPC[5]; + nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); + nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); + nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); + nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); + nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); + int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); + float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; + int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); + + float nSigmaTOF[5]; + nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); + nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); + nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); + nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); + nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); + int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); + + // do PID using TPC+TOF + if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()){ + if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION){ + if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon + else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton + else { + if (enumChoiceTPC == P_ELECTRON) return P_ELECTRON; // probably electron + else if (enumChoiceTPC == P_MUON) return P_MUON; // probably muon + else return P_PION; // probably pion + } + } + else { + if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon + else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton + else { + if (enumChoiceTPCpick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron + else if (enumChoiceTPCpick == P_MUON) return P_MUON; // probably misidentified muon + else if (enumChoiceTPCpick == P_PION) return P_PION; // probably misidentified pion + } + } + } + // do PID using TPC only + else if (trackPIDinfo.hasTPC()) return enumChoiceTPC; + // do PID using TOF only + else if (trackPIDinfo.hasTOF()) return enumChoiceTOF; + // give warning and return non-sense + else { + LOGF(warn,"testPIDhypothesis failed - track did not leave information in TPC or TOF"); + return -1; + } +} + + +#endif //ALISW_ROMANPIDHELPER_H diff --git a/PWGUD/Tasks/romanCentralBarrel.cxx b/PWGUD/Tasks/romanCentralBarrel.cxx index 8cbbcd74434..67204572ff9 100644 --- a/PWGUD/Tasks/romanCentralBarrel.cxx +++ b/PWGUD/Tasks/romanCentralBarrel.cxx @@ -21,8 +21,9 @@ // O2Physics headers #include "Common/Core/TrackSelection.h" #include "Common/DataModel/EventSelection.h" -#include "PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h" #include "PWGUD/DataModel/UDTables.h" +#include "PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h" +#include "PWGUD/Core/RomanPIDhelper.h" // ROOT headers #include "TLorentzVector.h" @@ -106,16 +107,16 @@ struct RomanCentralBarrel { FullTracks const& tracks, soa::Join const& infoEventSelection){ - const float massEl = constants::physics::MassElectron; - const float massMu = constants::physics::MassMuon; - const float massPi = constants::physics::MassPionCharged; - const float massKa = constants::physics::MassKaonCharged; - const float massPr = constants::physics::MassProton; + const float P_MASS[5] = {constants::physics::MassElectron, + constants::physics::MassMuon, + constants::physics::MassPionCharged, + constants::physics::MassKaonCharged, + constants::physics::MassProton}; if (verboseInfo) printLargeMessage("NEW COLLISION"); countCollisions++; registry.get(HIST("hEffectOfSelections"))->Fill(0); -/* + auto thisCollisionEventSelectionInfo = infoEventSelection.iteratorAt(getEvSelsIndexOfThisCollisionBC(infoEventSelection,collision.globalBC())); fillEventSelectionHistogram(registry,thisCollisionEventSelectionInfo); fillTrackSelectionHistogram(registry,tracks,collision); @@ -137,9 +138,9 @@ struct RomanCentralBarrel { float thisTrackMomentum = momentum(track.px(),track.py(),track.pz()); float thisTrackTPCsignal = track.tpcSignal(); if (!selectTrack(track,applyTrackCuts)) continue; - // TODO get tag for PV contributor //if (track.isPVContributor()) countContributorsToVertex++; + if (isUDprimaryTrack(track)) countContributorsToVertex++; if (selectTrack(track,2)) countGlobalContributorsToVertex++; - // TODO get tag for PV contributor //if (track.isPVContributor()) countPrimaryTracks++; + if (isUDprimaryTrack(track)) countPrimaryTracks++; } registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); @@ -153,7 +154,7 @@ struct RomanCentralBarrel { if (!trackSelection(track,2)) continue; if (!trackSelection(track,5)) continue; if (isFITempty(collision)) continue; - printTrackData(track); + if (printMetaInfo) printTrackData(track); float trkPx = track.px(); float trkPy = track.py(); float trkPz = track.pz(); @@ -161,9 +162,12 @@ struct RomanCentralBarrel { registry.get(HIST("hTrackPt"))->Fill(track.pt()); registry.get(HIST("hTrackPhi"))->Fill(phi(trkPx,trkPy)); registry.get(HIST("hTrackEta"))->Fill(eta(trkPx,trkPy,trkPz)); - float mass = massEl;//TODO do proper mass estimate - registry.get(HIST("hTrackEnergy"))->Fill(energy(mass,trkPx,trkPy,trkPz)); - registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass,trkPx,trkPy,trkPz)); + int typeParticle = testPIDhypothesis(track); + if (typeParticle >= 0 && typeParticle < (sizeof(P_MASS)/sizeof(float))){ + float mass = P_MASS[typeParticle]; + registry.get(HIST("hTrackEnergy"))->Fill(energy(mass,trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass,trkPx,trkPy,trkPz)); + } } // @@ -188,6 +192,7 @@ struct RomanCentralBarrel { int countTrks = 0; if (countContributorsToVertex == 2) { for (auto& track : tracks){ + testPIDhypothesis(track); // TODO get tag for PV contributor //if (!track.isPVContributor()) continue; countTrks++; trackFromVertex.SetPxPyPzE(track.px(),track.py(),track.pz(), @@ -213,7 +218,7 @@ struct RomanCentralBarrel { registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); } - */ + } // end processCentralBarrel From 8fe24999f763fe1af25e1c991dc78dc6f65853f1 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Thu, 10 Nov 2022 20:44:59 +0100 Subject: [PATCH 13/29] PID ready --- PWGUD/Core/RomanPIDhelper.h | 2 +- PWGUD/Tasks/romanCentralBarrel.cxx | 39 +++++++++++++++++------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/PWGUD/Core/RomanPIDhelper.h b/PWGUD/Core/RomanPIDhelper.h index 9b0b9b6707e..cad903ec47b 100644 --- a/PWGUD/Core/RomanPIDhelper.h +++ b/PWGUD/Core/RomanPIDhelper.h @@ -56,7 +56,7 @@ int testPIDhypothesis(T trackPIDinfo) else if (trackPIDinfo.hasTOF()) return enumChoiceTOF; // give warning and return non-sense else { - LOGF(warn,"testPIDhypothesis failed - track did not leave information in TPC or TOF"); + LOGF(warning,"testPIDhypothesis failed - track did not leave information in TPC or TOF"); return -1; } } diff --git a/PWGUD/Tasks/romanCentralBarrel.cxx b/PWGUD/Tasks/romanCentralBarrel.cxx index 67204572ff9..430b3adab68 100644 --- a/PWGUD/Tasks/romanCentralBarrel.cxx +++ b/PWGUD/Tasks/romanCentralBarrel.cxx @@ -135,14 +135,14 @@ struct RomanCentralBarrel { int countContributorsToVertex = 0; int countGlobalContributorsToVertex = 0; for (auto& track : tracks){ - float thisTrackMomentum = momentum(track.px(),track.py(),track.pz()); - float thisTrackTPCsignal = track.tpcSignal(); if (!selectTrack(track,applyTrackCuts)) continue; if (isUDprimaryTrack(track)) countContributorsToVertex++; if (selectTrack(track,2)) countGlobalContributorsToVertex++; if (isUDprimaryTrack(track)) countPrimaryTracks++; + if (track.hasTPC()) { + registry.get(HIST("hTPCsignalVsMom"))->Fill(momentum(track.px(),track.py(),track.pz()),track.tpcSignal()); + } } - registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); registry.get(HIST("hNprimaryTracks"))->Fill(countPrimaryTracks); @@ -185,31 +185,36 @@ struct RomanCentralBarrel { // TPC signal info starts here // TLorentzVector sumOfVertexTracks, trackFromVertex; - float dedxVC1 = -999.; - float dedxVC2 = -999.; - float dedxEl1 = -999.; - float dedxEl2 = -999.; + float dedxVC[2] = {-999.,-999.}; + const int NPARTICLES = 5;//TODO think of more elegant way how to pass this info + float dedx[2][NPARTICLES] = {{-999.,-999.,-999.,-999.,-999.},{-999.,-999.,-999.,-999.,-999.}}; int countTrks = 0; if (countContributorsToVertex == 2) { for (auto& track : tracks){ - testPIDhypothesis(track); - // TODO get tag for PV contributor //if (!track.isPVContributor()) continue; + if (!isUDprimaryTrack(track)) continue; countTrks++; trackFromVertex.SetPxPyPzE(track.px(),track.py(),track.pz(), energy(constants::physics::MassElectron,track.px(),track.py(),track.pz())); sumOfVertexTracks+=trackFromVertex; if (track.hasTPC()){ - if (countTrks == 1) dedxVC1 = track.tpcSignal(); - else if (countTrks == 2) dedxVC2 = track.tpcSignal(); + if (countTrks == 1) dedxVC[0] = track.tpcSignal(); + else if (countTrks == 2) dedxVC[1] = track.tpcSignal(); else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); - -// if (countTrks == 1) dedxEl1 = track.tpcSignal();// TODO -// else if (countTrks == 2) dedxEl2 = track.tpcSignal();// TODO -// else LOGP(warning,"!!!Strange behaviour in the loop, check!!!");// TODO + int typeParticle = testPIDhypothesis(track); + if (typeParticle >= 0 && typeParticle <= NPARTICLES){ + if (countTrks == 1) dedx[0][typeParticle] = track.tpcSignal(); + else if (countTrks == 2) dedx[1][typeParticle] = track.tpcSignal(); + else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); + } } } - registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC1,dedxVC2); - registry.get(HIST("hTPCsignalElectrons"))->Fill(dedxEl1,dedxEl2); + registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC[0],dedxVC[1]); + // pairs of different particles are filled in the following histograms, but outside of the range + registry.get(HIST("hTPCsignalElectrons"))->Fill(dedx[0][P_ELECTRON],dedx[1][P_ELECTRON]); + registry.get(HIST("hTPCsignalMuons"))->Fill(dedx[0][P_MUON],dedx[1][P_MUON]); + registry.get(HIST("hTPCsignalPions"))->Fill(dedx[0][P_PION],dedx[1][P_PION]); + registry.get(HIST("hTPCsignalKaons"))->Fill(dedx[0][P_KAON],dedx[1][P_KAON]); + registry.get(HIST("hTPCsignalProtons"))->Fill(dedx[0][P_PROTON],dedx[1][P_PROTON]); registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); From 0dfd9504e9bb846a554efb047fbe05e58b26aabb Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Fri, 18 Nov 2022 16:37:26 +0100 Subject: [PATCH 14/29] midchange --- PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h | 2 +- PWGUD/Tasks/romanCentralBarrel.cxx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h b/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h index 1d479d24cde..6539ad4ef95 100644 --- a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h +++ b/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h @@ -205,7 +205,7 @@ bool trackSelection(T udtrack, int selection) // Is central barrel propagated track // TODO //if (selection==1 && track.trackType()!=1) return false; // Is central barrel vertex contributor - // TODO //if (selection==2 && track.isPVContributor()!=1) return false; + if (selection==2 && udtrack.isPVContributor()!=1) return false; // Is central barrel track selection global track if (selection==3 && isUDqualityTrack(udtrack)!=1) return false; // Is central barrel track selection global track diff --git a/PWGUD/Tasks/romanCentralBarrel.cxx b/PWGUD/Tasks/romanCentralBarrel.cxx index 430b3adab68..3ee3425cd8e 100644 --- a/PWGUD/Tasks/romanCentralBarrel.cxx +++ b/PWGUD/Tasks/romanCentralBarrel.cxx @@ -83,7 +83,7 @@ struct RomanCentralBarrel { // Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; // declare shortcuts - using FullTracks = soa::Join; + using FullTracks = soa::Join; using FullCollision = soa::Join::iterator; // init @@ -136,7 +136,7 @@ struct RomanCentralBarrel { int countGlobalContributorsToVertex = 0; for (auto& track : tracks){ if (!selectTrack(track,applyTrackCuts)) continue; - if (isUDprimaryTrack(track)) countContributorsToVertex++; + if (trackSelection(track,2)) countContributorsToVertex++; if (selectTrack(track,2)) countGlobalContributorsToVertex++; if (isUDprimaryTrack(track)) countPrimaryTracks++; if (track.hasTPC()) { From 0b5ed62f2f79ae1d4be7ddb6e8455d2929a053c4 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Mon, 21 Nov 2022 11:05:37 +0100 Subject: [PATCH 15/29] isPVContributor working everywhere --- PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h | 60 +++++++++---------- PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 4 +- 2 files changed, 29 insertions(+), 35 deletions(-) diff --git a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h b/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h index 6539ad4ef95..b238cff2905 100644 --- a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h +++ b/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h @@ -16,6 +16,7 @@ #ifndef ALISW_UPCMONTECARLOCENTRALBARRELHELPER_H #define ALISW_UPCMONTECARLOCENTRALBARRELHELPER_H +#include "PWGUD/DataModel/UDTables.h" using namespace o2; using namespace o2::framework; @@ -64,7 +65,7 @@ float rapidity(float mass, float px, float py, float pz) } template -int getElectronCharge(E generatedElectron) +int getElectronCharge(E const& generatedElectron) // Check if particle is electron or positron and return charge accordingly. Return zero if particle is not electron/positron { if (generatedElectron.pdgCode() == 11) return -1; @@ -73,7 +74,7 @@ int getElectronCharge(E generatedElectron) } template -int64_t getEvSelsIndexOfThisCollisionBC(Es infoEvSels, uint64_t globalBC) +int64_t getEvSelsIndexOfThisCollisionBC(Es const& infoEvSels, uint64_t globalBC) // reads full event selection table end return global index corresponding to given global BC. Return -1 when fails. { for (auto& infoEvSel : infoEvSels){ @@ -83,7 +84,7 @@ int64_t getEvSelsIndexOfThisCollisionBC(Es infoEvSels, uint64_t globalBC) } template -bool isEvSelFITempty(C collision) +bool isEvSelFITempty(C const& collision) // Get FIT information from EventSelection task for each collision { if (collision.has_foundFT0() || collision.has_foundFV0() || collision.has_foundFDD()) return false; @@ -91,7 +92,7 @@ bool isEvSelFITempty(C collision) } template -bool isFITempty(T FITinfo) +bool isFITempty(T const& FITinfo) // Return true if FIT had no signal { // check FT0 signal @@ -115,7 +116,7 @@ bool isFITempty(T FITinfo) } template -bool isUDprimaryTrack(T udtrack) +bool isUDprimaryTrack(T const& udtrack) // TrackSelection::kPrimaryTracks = kGoldenChi2 | kDCAxy | kDCAz; { // temporary hardcoded input @@ -132,7 +133,7 @@ bool isUDprimaryTrack(T udtrack) } template -bool isUDinAcceptanceTrack(T udtrack) +bool isUDinAcceptanceTrack(T const& udtrack) // TrackSelection::kInAcceptanceTracks = kPtRange | kEtaRange; { // temporary hardcoded input @@ -150,7 +151,7 @@ bool isUDinAcceptanceTrack(T udtrack) } template -bool isUDqualityTrack(T udtrack) +bool isUDqualityTrack(T const& udtrack) // TrackSelection::kQualityTracks = kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits; { // temporary hardcoded input @@ -161,9 +162,9 @@ bool isUDqualityTrack(T udtrack) int16_t cutNtpcCrossedRows = 70; float cutCrossedRowsOverNclusters = 0.8; // track type - // ignoring for the moment (its either innermost update track (0) or propagated track (1), the rest is Run 2) + // TODO //ignoring for the moment (its either innermost update track (0) or propagated track (1), the rest is Run 2). // ITS hits - // ignoring for the moment (some crazy function which I haven't found anywhere to be used) + // TODO //ignoring for the moment (some crazy function which I haven't found anywhere to be used) // ITS refit if (!udtrack.hasITS()) return false; // ITS chi2/ndf @@ -187,7 +188,7 @@ bool isUDqualityTrack(T udtrack) } template -bool isUDglobalTrack(T udtrack) +bool isUDglobalTrack(T const& udtrack) // combine quality+primary+acceptance { if (!isUDinAcceptanceTrack(udtrack)) return false; @@ -197,27 +198,27 @@ bool isUDglobalTrack(T udtrack) } template -bool trackSelection(T udtrack, int selection) +bool trackSelection(T const& udtrack, int selection) // Do selection of reconstructed track { if (selection==0) return true; // Is central barrel propagated track - // TODO //if (selection==1 && track.trackType()!=1) return false; + // TODO //if (selection==1 && udtrack.trackType()!=1) return false; // Is central barrel vertex contributor if (selection==2 && udtrack.isPVContributor()!=1) return false; // Is central barrel track selection global track - if (selection==3 && isUDqualityTrack(udtrack)!=1) return false; + if (selection==3 && isUDqualityTrack(udtrack)!=1) return false; // Is central barrel track selection global track - if (selection==4 && isUDprimaryTrack(udtrack)!=1) return false; + if (selection==4 && isUDprimaryTrack(udtrack)!=1) return false; // Is central barrel track selection global track - if (selection==5 && isUDglobalTrack(udtrack)!=1) return false; + if (selection==5 && isUDglobalTrack(udtrack)!=1) return false; return true; } template -bool selectTrack(T track, int setOfCuts) +bool selectTrack(T const& track, int setOfCuts) // Do selection of reconstructed track { if (setOfCuts<1) return true; @@ -230,7 +231,7 @@ bool selectTrack(T track, int setOfCuts) } template < typename C> -void fillEventSelectionHistogram(HistogramRegistry ®istry, C collision) +void fillEventSelectionHistogram(HistogramRegistry ®istry, C const& collision) // Fill into histogram information from EventSelection task for each collision { @@ -272,7 +273,7 @@ void fillEventSelectionHistogram(HistogramRegistry ®istry, C collision) } template -void fillTrackSelectionHistogram(HistogramRegistry ®istry, Ts tracks, C collision) +void fillTrackSelectionHistogram(HistogramRegistry ®istry, Ts const& tracks, C const& collision) // Fill into histogram effect of track selection for all tracks { @@ -320,41 +321,34 @@ void fillTrackSelectionHistogram(HistogramRegistry ®istry, Ts tracks, C colli } template -void printTrackData(T track) +void printTrackData(T const& track) // Function to print basic info on track { - // TODO return to this version once PVContributor is fixed - // LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d;" - // " Associated MC particle idx %d, primary %d, PDG code %d", - LOGF(info,"Track idx %d, hasITS %d, hasTPC %d, hasTOF %d", - track.globalIndex(),track.hasITS(),track.hasTPC(),track.hasTOF()); + LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d", + track.globalIndex(),track.isPVContributor(),track.hasITS(),track.hasTPC(),track.hasTOF()); } template -void printTrackParticleData(T track) +void printTrackParticleData(T const& track) // Function to print basic info on track and its associated mc particle { - LOGF(info,"Track idx %d, hasITS %d, hasTPC %d, hasTOF %d", - track.globalIndex(),track.hasITS(),track.hasTPC(),track.hasTOF()); + printTrackData(track); if (track.has_udMcParticle()) { auto mcparticle = track.udMcParticle(); - // TODO return to this version once PVContributor is fixed - // LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d;" - // " Associated MC particle idx %d, primary %d, PDG code %d", LOGF(info," Associated MC particle idx %d, primary %d, PDG code %d", mcparticle.globalIndex(),mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); } } template -void printCollisionTracksData(Ts tracks, int setOfCuts) +void printCollisionTracksData(Ts const& tracks, int setOfCuts) // Function to loop over tracks associated to a collision and print basic info { int countNoMCparticle = 0; for (auto& track : tracks){ if (!selectTrack(track,setOfCuts)) continue; if (track.has_udMcParticle()) { - printTrackData(track); + printTrackParticleData(track); } else countNoMCparticle++; } @@ -362,7 +356,7 @@ void printCollisionTracksData(Ts tracks, int setOfCuts) } template -void printCollisionGeneratedParticles(MPs particles, P slice, C collision){ +void printCollisionGeneratedParticles(MPs const& particles, P const& slice, C const& collision){ auto slicedParticles = particles.sliceBy(slice, collision.mcCollision().globalIndex()); for (auto& slicedParticle : slicedParticles){ LOGF(info,"Particle idx %d, primary %d",slicedParticle.globalIndex(),slicedParticle.isPhysicalPrimary()); diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx index 6d0cc469c0e..72b3161f64c 100644 --- a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx +++ b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx @@ -101,7 +101,7 @@ struct UpcMCCentralBarrel { // Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; // declare shortcuts - using ReconstructedTracks = soa::Join; + using ReconstructedTracks = soa::Join; using ReconstructedCollision = soa::Join::iterator; // init @@ -421,7 +421,7 @@ struct UpcMCCentralBarrel { }// end processTest6 - void processTestUDtable1(soa::Join::iterator const& track, + void processTestUDtable1(soa::Join::iterator const& track, aod::UDMcParticles const& particles){ LOGF(info,"IDX %d, mask %d",track.udMcParticleId(),track.mcMask()); From 75dc414682d157489300aa9c7b4855f99dac249a Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Mon, 21 Nov 2022 15:33:04 +0100 Subject: [PATCH 16/29] Invarinat mass histos added. Task isolated. --- ...eCarloCentralBarrelHelper.h => RLhelper.h} | 76 ++- PWGUD/Core/RomanPIDhelper.h | 65 --- PWGUD/Tasks/CMakeLists.txt | 9 +- ...rel.cxx => upcCentralBarrelAnalyzerRL.cxx} | 36 +- PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx | 473 ------------------ 5 files changed, 91 insertions(+), 568 deletions(-) rename PWGUD/Core/{UPCMonteCarloCentralBarrelHelper.h => RLhelper.h} (84%) delete mode 100644 PWGUD/Core/RomanPIDhelper.h rename PWGUD/Tasks/{romanCentralBarrel.cxx => upcCentralBarrelAnalyzerRL.cxx} (86%) delete mode 100644 PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx diff --git a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h b/PWGUD/Core/RLhelper.h similarity index 84% rename from PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h rename to PWGUD/Core/RLhelper.h index b238cff2905..446396f26a3 100644 --- a/PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h +++ b/PWGUD/Core/RLhelper.h @@ -1,20 +1,9 @@ -// 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". +// Created by Roman Lavička on 10.11.2022. // -// 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. -/// -/// \brief -/// \author Roman Lavicka, roman.lavicka@cern.ch -/// \since 27.10.2022 -#ifndef ALISW_UPCMONTECARLOCENTRALBARRELHELPER_H -#define ALISW_UPCMONTECARLOCENTRALBARRELHELPER_H +#ifndef ALISW_RLHELPER_H +#define ALISW_RLHELPER_H #include "PWGUD/DataModel/UDTables.h" @@ -22,6 +11,63 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; +enum MyParticle { P_ELECTRON = 0, P_MUON = 1, P_PION = 2, P_KAON = 3, P_PROTON = 4}; + +template +int testPIDhypothesis(T trackPIDinfo) +// Choose, which particle it is according to PID +{ + float nSigmaTPC[5]; + nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); + nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); + nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); + nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); + nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); + int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); + float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; + int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); + + float nSigmaTOF[5]; + nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); + nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); + nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); + nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); + nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); + int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); + + // do PID using TPC+TOF + if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()){ + if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION){ + if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon + else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton + else { + if (enumChoiceTPC == P_ELECTRON) return P_ELECTRON; // probably electron + else if (enumChoiceTPC == P_MUON) return P_MUON; // probably muon + else return P_PION; // probably pion + } + } + else { + if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon + else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton + else { + if (enumChoiceTPCpick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron + else if (enumChoiceTPCpick == P_MUON) return P_MUON; // probably misidentified muon + else if (enumChoiceTPCpick == P_PION) return P_PION; // probably misidentified pion + } + } + } + // do PID using TPC only + else if (trackPIDinfo.hasTPC()) return enumChoiceTPC; + // do PID using TOF only + else if (trackPIDinfo.hasTOF()) return enumChoiceTOF; + // give warning and return non-sense + else { + LOGF(warning,"testPIDhypothesis failed - track did not leave information in TPC or TOF"); + return -1; + } + return -1; +} + float momentum(float px, float py, float pz) // Just a simple function to return momentum @@ -370,4 +416,4 @@ void printLargeMessage(std::string info) } -#endif //ALISW_UPCMONTECARLOCENTRALBARRELHELPER_H +#endif //ALISW_RLHELPER_H diff --git a/PWGUD/Core/RomanPIDhelper.h b/PWGUD/Core/RomanPIDhelper.h deleted file mode 100644 index cad903ec47b..00000000000 --- a/PWGUD/Core/RomanPIDhelper.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// Created by Roman Lavička on 10.11.2022. -// - -#ifndef ALISW_ROMANPIDHELPER_H -#define ALISW_ROMANPIDHELPER_H - -enum MyParticle { P_ELECTRON = 0, P_MUON = 1, P_PION = 2, P_KAON = 3, P_PROTON = 4}; - -template -int testPIDhypothesis(T trackPIDinfo) -// Choose, which particle it is according to PID -{ - float nSigmaTPC[5]; - nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); - nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); - nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); - nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); - nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); - int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); - float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; - int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); - - float nSigmaTOF[5]; - nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); - nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); - nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); - nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); - nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); - int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); - - // do PID using TPC+TOF - if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()){ - if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION){ - if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon - else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton - else { - if (enumChoiceTPC == P_ELECTRON) return P_ELECTRON; // probably electron - else if (enumChoiceTPC == P_MUON) return P_MUON; // probably muon - else return P_PION; // probably pion - } - } - else { - if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon - else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton - else { - if (enumChoiceTPCpick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron - else if (enumChoiceTPCpick == P_MUON) return P_MUON; // probably misidentified muon - else if (enumChoiceTPCpick == P_PION) return P_PION; // probably misidentified pion - } - } - } - // do PID using TPC only - else if (trackPIDinfo.hasTPC()) return enumChoiceTPC; - // do PID using TOF only - else if (trackPIDinfo.hasTOF()) return enumChoiceTOF; - // give warning and return non-sense - else { - LOGF(warning,"testPIDhypothesis failed - track did not leave information in TPC or TOF"); - return -1; - } -} - - -#endif //ALISW_ROMANPIDHELPER_H diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 323911a0afd..3887ffe3782 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -44,12 +44,7 @@ o2physics_add_dpl_workflow(upccand-analyzer PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(upc-mc-central-barrel - SOURCES upcMonteCarloCentralBarrel.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) - -o2physics_add_dpl_workflow(roman-central-barrel - SOURCES romanCentralBarrel.cxx +o2physics_add_dpl_workflow(upc-central-barrel-rl + SOURCES upcCentralBarrelAnalyzerRL.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/romanCentralBarrel.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx similarity index 86% rename from PWGUD/Tasks/romanCentralBarrel.cxx rename to PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx index 3ee3425cd8e..b30f4e362a2 100644 --- a/PWGUD/Tasks/romanCentralBarrel.cxx +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx @@ -22,8 +22,7 @@ #include "Common/Core/TrackSelection.h" #include "Common/DataModel/EventSelection.h" #include "PWGUD/DataModel/UDTables.h" -#include "PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h" -#include "PWGUD/Core/RomanPIDhelper.h" +#include "PWGUD/Core/RLhelper.h" // ROOT headers #include "TLorentzVector.h" @@ -33,7 +32,7 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -struct RomanCentralBarrel { +struct CentralBarrelAnalyzerRL { // Global varialbes int countCollisions; @@ -53,6 +52,11 @@ struct RomanCentralBarrel { {"hNprimaryTracks", ";Number of primary tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,2.8,3.4} } } }, {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassElEl", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassMuMu", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassPiPi", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassKaKa", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassPrPr", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, {"hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, @@ -101,7 +105,6 @@ struct RomanCentralBarrel { } // end run - // process void processCentralBarrel(FullCollision const& collision, FullTracks const& tracks, @@ -190,6 +193,8 @@ struct RomanCentralBarrel { float dedx[2][NPARTICLES] = {{-999.,-999.,-999.,-999.,-999.},{-999.,-999.,-999.,-999.,-999.}}; int countTrks = 0; if (countContributorsToVertex == 2) { + int twinParticles = -1; + bool isTwinParticles = false; for (auto& track : tracks){ if (!isUDprimaryTrack(track)) continue; countTrks++; @@ -202,8 +207,16 @@ struct RomanCentralBarrel { else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); int typeParticle = testPIDhypothesis(track); if (typeParticle >= 0 && typeParticle <= NPARTICLES){ - if (countTrks == 1) dedx[0][typeParticle] = track.tpcSignal(); - else if (countTrks == 2) dedx[1][typeParticle] = track.tpcSignal(); + if (countTrks == 1) { + dedx[0][typeParticle] = track.tpcSignal(); + twinParticles = typeParticle; + } + else if (countTrks == 2) { + dedx[1][typeParticle] = track.tpcSignal(); + if (twinParticles == typeParticle){ + isTwinParticles = true; + } + } else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); } } @@ -222,12 +235,19 @@ struct RomanCentralBarrel { registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); + if (isTwinParticles){ + if (twinParticles == P_ELECTRON) registry.get(HIST("hInvariantMassElEl"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_MUON) registry.get(HIST("hInvariantMassMuMu"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_PION) registry.get(HIST("hInvariantMassPiPi"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_KAON) registry.get(HIST("hInvariantMassKaKa"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_PROTON) registry.get(HIST("hInvariantMassPrPr"))->Fill(sumOfVertexTracks.M()); + } } } // end processCentralBarrel - PROCESS_SWITCH(RomanCentralBarrel, processCentralBarrel, "Iterate central barrel data using UD tables", true); + PROCESS_SWITCH(CentralBarrelAnalyzerRL, processCentralBarrel, "Iterate central barrel data using UD tables", true); }; @@ -235,6 +255,6 @@ struct RomanCentralBarrel { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"roman-central-barrel"}) + adaptAnalysisTask(cfgc, TaskName{"upc-central-barrel-rl"}) }; } \ No newline at end of file diff --git a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx b/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx deleted file mode 100644 index 72b3161f64c..00000000000 --- a/PWGUD/Tasks/upcMonteCarloCentralBarrel.cxx +++ /dev/null @@ -1,473 +0,0 @@ -// 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. -/// -/// \brief -/// \author Roman Lavicka, roman.lavicka@cern.ch -/// \since 12.07.2022 - -// O2 headers -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" - -// O2Physics headers -#include "Common/Core/TrackSelection.h" -#include "Common/DataModel/EventSelection.h" -#include "PWGUD/Core/UPCMonteCarloCentralBarrelHelper.h" -#include "PWGUD/DataModel/UDTables.h" - -// ROOT headers -#include "TLorentzVector.h" -#include "TDatabasePDG.h" - -using namespace o2; -using namespace o2::framework; -using namespace o2::framework::expressions; - -struct UpcMCCentralBarrel { - - // Global varialbes - bool isFirstReconstructedCollisions, isFirstGeneratedCollisions; - int countCollisions; - int32_t indexCollision; - Service pdg; - - HistogramRegistry registry{ - "registry", - { - {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEffectOfTrackSelections", "Effect of track cuts;Selection (-);Number of tracks (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEventSelectionTask", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEventSelectionTaskParameters", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {kNsel,-0.5,kNsel-0.5} } } }, - {"hNcontributionsToReconstructedCollision", ";Number of contributions in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNgeneratedParticles", ";Number of particles in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNreconstructedTracks", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNreconstructedTracksWide", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {1000,-0.5,999.5} } } }, - {"hNcontributionsToVertex", ";Number of contributors to vertex (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNreconstructedTracksWithGeneratedParticle", ";Number of tracks in a collision with asociated generated particle (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNreconstructedTracksWithoutGeneratedParticle", ";Number of tracks in a collision without asociated generated particle (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNreconstructedPrimaryTracks", ";Number of primary tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNgeneratedPrimaryParticlesOfReconstructedTracks", ";Number of primary generated particles in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNgeneratedPrimaryElectronsOfReconstructedTracks", ";Number of primary generated electron in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNgeneratedElectrons", ";Number of electrons in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNrecoVSgene", ";Number of reconstructed tracks in a collision (-);Number of generated particles in a collisions", { HistType::kTH2D, { {30,-0.5,29.5}, {30,-0.5,29.5} } } }, - {"hNrecoVSgeneMany", ";Number of reconstructed tracks in a collision (-);Number of generated particles in a collisions", { HistType::kTH2D, { {3000,-0.5,2999.5}, {3000,-0.5,2999.5} } } }, - {"hNgeneratedPrimaryElectrons", ";Number of primary electrons from mother decay in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNreconstructedCollisions", ";Number of asociated reconstructed collisions in a generated collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNgeneratedParticlesWithRecoColl", ";Number of generated particles in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNgeneratedPrimaryParticlesWithRecoColl", ";Number of generated primary particles from mother decay in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNgeneratedElectronsWithRecoColl", ";Number of generated electrons in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNgeneratedPrimaryElectronsWithRecoColl", ";Number of generated primary electrons from mother decay in a reconstructed collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,2.8,3.4} } } }, - {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, - {"hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, - {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, - {"hMotherPhi", ";Mother #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-TMath::Pi(),TMath::Pi()} } } }, - {"hMotherRapidity", ";Mother #y (-);Number of events (-)", { HistType::kTH1D, { {500,-2.,2.} } } }, - {"hVtxZ", ";Vertex z-position (cm);Number of events (-)", { HistType::kTH1D, { {1000,-30.,30.} } } }, - {"hVtxZrecToGen", ";Vertex z-position: (reconstructed collision) - (generated collisions) (cm);Number of events (-)", { HistType::kTH1D, { {1000,-.5,.5} } } }, - {"hVtxTransversal", ";Vertex x-position (cm);Vertex y-position (cm)", { HistType::kTH2D, { {1000,-0.1,0.1}, {1000,-0.1,0.1} } } }, - {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCelectronIdentified", ";Track from generated electron #it{p} (GeV/#it{c});Track from generated electron TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCsignalVtxContributors", ";Vtx contributor 1 - TPC d#it{E}/d#it{x} (arb. units);Vtx contributor 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, - {"hTPCsignalGeneratedElectrons", ";Track from generated electron 1 - TPC d#it{E}/d#it{x} (arb. units);Track from generated electron 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, - {"hTrackP", ";Track #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, - {"hTrackPt", ";Track #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,5.} } } }, - {"hTrackPhi", ";Track #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-2*TMath::Pi(),2*TMath::Pi()} } } }, - {"hTrackEta", ";Track #eta (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } }, - {"hTrackEnergy", ";Track Energy (GeV);Number of events (-)", { HistType::kTH1D, { {500,0.,100.} } } }, - {"hTrackRapidity", ";Track rapidity (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } }, - {"hPDGcodes", ";PDG codes (-);Number of events (-)", { HistType::kTH1D, { {6001,-3000.,3000.} } } } - } - }; - - // declare configurables - Configurable verboseInfo{"verboseInfo", true, {"Print general info to terminal; default it true."}}; - Configurable printMetaInfo{"printMetaInfo", false, {"Print general info to terminal about collision, tracks, particles...; default it false."}}; - Configurable verboseDebug{"verboseDebug", false, {"Print debug info to terminal; default it false."}}; - Configurable applyTrackCuts{"applyTrackCuts", 0, {"Apply n selections on track; default it no cut."}}; - Configurable applySingleTrackCut{"applySingleTrackCut", 0, {"Apply selection n on track, applyTrackCuts must be at maximum for full usage; default it no cut."}}; - - // declare filters -// Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; - - // declare shortcuts - using ReconstructedTracks = soa::Join; - using ReconstructedCollision = soa::Join::iterator; - - // init - void init(InitContext&){ - if (verboseInfo) printLargeMessage("INIT METHOD"); - countCollisions = 0; - indexCollision = -1; - isFirstReconstructedCollisions = true; - isFirstGeneratedCollisions = true; - - } // end init - - // run (always called before process :( ) - void run(ProcessingContext& context){ - - if (verboseInfo) printLargeMessage("RUN METHOD"); - if (verboseDebug) LOGF(info,"countCollisions = %d",countCollisions); - - } // end run - - // declare preslices = table cross-connections - Preslice perMcCollision = aod::mcparticle::mcCollisionId; - - // process - void processSimulatorLevel(ReconstructedCollision const& reconstructedCollision, - aod::UDMcCollisions const& generatedCollisions, - ReconstructedTracks const& reconstructedBarrelTracks, - aod::UDMcParticles const& generatedParticles, - soa::Join const& infoEventSelection){ - - - if(isFirstReconstructedCollisions){ - isFirstReconstructedCollisions = false; - if (verboseInfo) printLargeMessage("START LOOPING OVER RECONSTRUCTED COLLISIONS"); - } - if (verboseInfo) printLargeMessage("NEW COLLISION"); - countCollisions++; - registry.get(HIST("hEffectOfSelections"))->Fill(0); - - auto thisCollisionEventSelectionInfo = infoEventSelection.iteratorAt(getEvSelsIndexOfThisCollisionBC(infoEventSelection,reconstructedCollision.globalBC())); - fillEventSelectionHistogram(registry,thisCollisionEventSelectionInfo); - fillTrackSelectionHistogram(registry,reconstructedBarrelTracks,reconstructedCollision); - - registry.get(HIST("hNcontributionsToReconstructedCollision"))->Fill(reconstructedCollision.numContrib()); - - // TODO fix when you can touch mcccollision // int nGeneratedParticlesInThisReconstructedCollision = ????????; - int nReconstructedTracksInThisReconstructedCollision = reconstructedBarrelTracks.size(); - if (verboseDebug) LOGF(info,"collision number = %d has %d contributors",countCollisions,reconstructedCollision.numContrib()); - // TODO fix when you can touch mcccollision //if (verboseDebug) LOGF(info,"This slice: number of reconstructed tracks = %d, number of generated particles in this slice %d", reconstructedBarrelTracks.size(),nGeneratedParticlesInThisReconstructedCollision); - - // TODO fix when you can touch mcccollision //registry.get(HIST("hNgeneratedParticles"))->Fill(nGeneratedParticlesInThisReconstructedCollision); - registry.get(HIST("hNreconstructedTracks"))->Fill(nReconstructedTracksInThisReconstructedCollision); - registry.get(HIST("hNreconstructedTracksWide"))->Fill(nReconstructedTracksInThisReconstructedCollision); - // TODO fix when you can touch mcccollision //registry.get(HIST("hNrecoVSgene"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); - // TODO fix when you can touch mcccollision //registry.get(HIST("hNrecoVSgeneMany"))->Fill(nReconstructedTracksInThisReconstructedCollision,nGeneratedParticlesInThisReconstructedCollision); - registry.get(HIST("hVtxZ"))->Fill(reconstructedCollision.posZ()); - // TODO find a way how to fill in this histogram //registry.get(HIST("hVtxZrecToGen"))->Fill(reconstructedCollision.posZ()-reconstructedCollision.mcCollision().posZ()); - registry.get(HIST("hVtxTransversal"))->Fill(reconstructedCollision.posX(),reconstructedCollision.posY()); - - int countReconstructedPrimaryTracks = 0; - int countReconstructedTracksWithGeneratedParticle = 0; - int countReconstructedTracksWithoutGeneratedParticle = 0; - int countPrimaryGeneratedParticlesWithReconstructedTrack = 0; - int countPrimaryGeneratedElectronsWithReconstructedTrack = 0; - int countContributorsToVertex = 0; - int countGlobalContributorsToVertex = 0; - for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ - float thisTrackMomentum = momentum(reconstructedBarrelTrack.px(),reconstructedBarrelTrack.py(),reconstructedBarrelTrack.pz()); - float thisTrackTPCsignal = reconstructedBarrelTrack.tpcSignal(); - if (!selectTrack(reconstructedBarrelTrack,applyTrackCuts)) continue; - // TODO get tag for PV contributor //if (reconstructedBarrelTrack.isPVContributor()) countContributorsToVertex++; - if (selectTrack(reconstructedBarrelTrack,2)) countGlobalContributorsToVertex++; - if (reconstructedBarrelTrack.has_udMcParticle()) { - if (reconstructedBarrelTrack.hasTPC()) registry.get(HIST("hTPCsignalVsMom"))->Fill(thisTrackMomentum,thisTrackTPCsignal); - countReconstructedTracksWithGeneratedParticle++; - auto generatedParticle = reconstructedBarrelTrack.udMcParticle(); - if (generatedParticle.isPhysicalPrimary()) { - countPrimaryGeneratedParticlesWithReconstructedTrack++; - if (TMath::Abs(generatedParticle.pdgCode()) == 11) { - countPrimaryGeneratedElectronsWithReconstructedTrack++; - if (reconstructedBarrelTrack.hasTPC()) registry.get(HIST("hTPCelectronIdentified"))->Fill(thisTrackMomentum,thisTrackTPCsignal); - } - } - } - else countReconstructedTracksWithoutGeneratedParticle++; - // TODO get tag for PV contributor //if (reconstructedBarrelTrack.isPVContributor()) countReconstructedPrimaryTracks++; - } - - if (printMetaInfo) printCollisionTracksData(reconstructedBarrelTracks,applyTrackCuts); - - registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); - registry.get(HIST("hNreconstructedTracksWithGeneratedParticle"))->Fill(countReconstructedTracksWithGeneratedParticle); - registry.get(HIST("hNreconstructedTracksWithoutGeneratedParticle"))->Fill(countReconstructedTracksWithoutGeneratedParticle); - registry.get(HIST("hNreconstructedPrimaryTracks"))->Fill(countReconstructedPrimaryTracks); - registry.get(HIST("hNgeneratedPrimaryParticlesOfReconstructedTracks"))->Fill(countPrimaryGeneratedParticlesWithReconstructedTrack); - registry.get(HIST("hNgeneratedPrimaryElectronsOfReconstructedTracks"))->Fill(countPrimaryGeneratedElectronsWithReconstructedTrack); - - // - // Playing around - // - printLargeMessage("Primary + Global + FIT"); - for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ - if (!trackSelection(reconstructedBarrelTrack,2)) continue; - if (!trackSelection(reconstructedBarrelTrack,5)) continue; - if (isFITempty(reconstructedCollision)) continue; - printTrackData(reconstructedBarrelTrack); - float trkPx = reconstructedBarrelTrack.px(); - float trkPy = reconstructedBarrelTrack.py(); - float trkPz = reconstructedBarrelTrack.pz(); - registry.get(HIST("hTrackP"))->Fill(momentum(trkPx,trkPy,trkPz)); - registry.get(HIST("hTrackPt"))->Fill(reconstructedBarrelTrack.pt()); - registry.get(HIST("hTrackPhi"))->Fill(phi(trkPx,trkPy)); - registry.get(HIST("hTrackEta"))->Fill(eta(trkPx,trkPy,trkPz)); - if (reconstructedBarrelTrack.has_udMcParticle()) { - auto mcparticle = reconstructedBarrelTrack.udMcParticle(); - registry.get(HIST("hPDGcodes"))->Fill(mcparticle.pdgCode()); - auto pdgInfo = pdg->GetParticle(mcparticle.pdgCode()); - if (pdgInfo != nullptr) { - float mass = pdgInfo->Mass(); - registry.get(HIST("hTrackEnergy"))->Fill(energy(mass,trkPx,trkPy,trkPz)); - registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass,trkPx,trkPy,trkPz)); - } - } - } - - // - // fetching FT0, FDD, FV0 information - // - bool FITisEmpty = isFITempty(reconstructedCollision); - if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(1); - FITisEmpty = isEvSelFITempty(thisCollisionEventSelectionInfo); - if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(2); - if (countContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(3); - if (countGlobalContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(4); - - - // - // TPC signal info starts here - // - TLorentzVector sumOfVertexTracks, trackFromVertex; - float dedxVC1 = -999.; - float dedxVC2 = -999.; - float dedxEl1 = -999.; - float dedxEl2 = -999.; - int countTrks = 0; - if (countContributorsToVertex == 2) { - for (auto& reconstructedBarrelTrack : reconstructedBarrelTracks){ - // TODO get tag for PV contributor //if (!reconstructedBarrelTrack.isPVContributor()) continue; - countTrks++; - trackFromVertex.SetPxPyPzE(reconstructedBarrelTrack.px(),reconstructedBarrelTrack.py(),reconstructedBarrelTrack.pz(), - energy(constants::physics::MassElectron,reconstructedBarrelTrack.px(),reconstructedBarrelTrack.py(),reconstructedBarrelTrack.pz())); - sumOfVertexTracks+=trackFromVertex; - if (reconstructedBarrelTrack.hasTPC()){ - if (countTrks == 1) dedxVC1 = reconstructedBarrelTrack.tpcSignal(); - else if (countTrks == 2) dedxVC2 = reconstructedBarrelTrack.tpcSignal(); - else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); - if (reconstructedBarrelTrack.has_udMcParticle()) { - auto generatedParticle = reconstructedBarrelTrack.udMcParticle(); - if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11) { - if (countTrks == 1) dedxEl1 = reconstructedBarrelTrack.tpcSignal(); - else if (countTrks == 2) dedxEl2 = reconstructedBarrelTrack.tpcSignal(); - else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); - } - } - } - } - registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC1,dedxVC2); - registry.get(HIST("hTPCsignalGeneratedElectrons"))->Fill(dedxEl1,dedxEl2); - registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); - registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); - registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); - registry.get(HIST("hMotherPwide"))->Fill(sumOfVertexTracks.P()); - registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); - registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); - registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); - } - - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // MC TRUTH STARTS HERE -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// TODO fix when you can touch mcccollision -// if (printMetaInfo) printCollisionGeneratedParticles(generatedParticles,perMcCollision,reconstructedCollision); -// TLorentzVector candidateJpsi, electron; -// int countGeneratedElectrons = 0; -// int countGeneratedPrimaryElectrons = 0; -// int countGeneratedPrimaryParticles = 0; -// for (auto & generatedParticle: ???){ -// if (verboseDebug) LOGF(info,"Particle type = %d",generatedParticle.pdgCode()); -// if (verboseDebug) LOGF(info,"Particle isPhysicalPrimary = %d",generatedParticle.isPhysicalPrimary()); -// if (generatedParticle.isPhysicalPrimary()) countGeneratedPrimaryParticles++; -// if (TMath::Abs(generatedParticle.pdgCode()) == 11) { -// countGeneratedElectrons++; -// } -// if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ -// countGeneratedPrimaryElectrons++; -// electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); -// } -// } -// if(countGeneratedPrimaryElectrons==2){ -// int electronCharge = 0; -// for (auto & generatedParticle: ???){ -// if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ -// electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); -// candidateJpsi+=electron; -// if (electronCharge == 0) electronCharge = getElectronCharge(generatedParticle); -// else if (electronCharge == getElectronCharge(generatedParticle))continue; -// } -// } -// } -// registry.get(HIST("hNgeneratedElectronsWithRecoColl"))->Fill(countGeneratedElectrons); -// registry.get(HIST("hNgeneratedPrimaryElectronsWithRecoColl"))->Fill(countGeneratedPrimaryElectrons); -// registry.get(HIST("hNgeneratedPrimaryParticlesWithRecoColl"))->Fill(countGeneratedPrimaryParticles); - - - } // end processSimulatorLevel - - void processGeneratorLevel(aod::McCollision const& generatedCollision, - soa::SmallGroups> const& reconstructedCollisions, - aod::McParticles const& generatedParticles){ - - if(isFirstGeneratedCollisions){ - isFirstGeneratedCollisions = false; - if (verboseInfo) LOGF(info,"####################################### START LOOPING OVER GENERATED COLLISIONS #######################################"); - } - - if (verboseInfo) LOGF(info,"####################################### NEW COLLISION #######################################"); - countCollisions++; - int countElectrons = 0; - int countElectronsWithRecoColl = 0; - int countPrimaryElectrons = 0; - int countPrimaryElectronsWithRecoColl = 0; - if (verboseDebug) LOGF(info,"countCollisions = %d, number of particles in this collision %d",countCollisions,generatedParticles.size()); - if (verboseDebug) LOGF(info, "(truth) Generators id = %d, MC weight = %f", generatedCollision.generatorsID(), generatedCollision.weight()); - if (verboseDebug) LOGF(info, "(reco) collisions.size = %d", reconstructedCollisions.size()); - if (verboseDebug) LOGF(info, "(truth) BC id = %d, collision time = %f, impact parameter = %f", generatedCollision.bcId(), generatedCollision.t(), generatedCollision.impactParameter()); - if (verboseDebug) LOGF(info, "(truth) vtx-x = %f, vtx-y = %f, vtx-z = %f", generatedCollision.posX(), generatedCollision.posY(), generatedCollision.posZ()); - - registry.get(HIST("hNgeneratedParticles"))->Fill(generatedParticles.size()); - registry.get(HIST("hVtxZ"))->Fill(generatedCollision.posZ()); - registry.get(HIST("hVtxTransversal"))->Fill(generatedCollision.posX(),generatedCollision.posY()); - - registry.get(HIST("hNreconstructedCollisions"))->Fill(reconstructedCollisions.size()); - if (reconstructedCollisions.size()>0) { - for (auto& reconstructedCollision : reconstructedCollisions) { - registry.get(HIST("hNgeneratedParticlesWithRecoColl"))->Fill(generatedParticles.size()); - registry.get(HIST("hVtxZrecToGen"))->Fill(reconstructedCollision.posZ()-generatedCollision.posZ()); - } - } - - TLorentzVector candidateJpsi, electron; - for (auto & generatedParticle: generatedParticles){ - if (verboseDebug) LOGF(info,"Particle type = %d",generatedParticle.pdgCode()); - if (verboseDebug) LOGF(info,"Particle isPhysicalPrimary = %d",generatedParticle.isPhysicalPrimary()); - if (TMath::Abs(generatedParticle.pdgCode()) == 11) { - countElectrons++; - if (reconstructedCollisions.size()>0) countElectronsWithRecoColl++; - } - if (generatedParticle.isPhysicalPrimary() && TMath::Abs(generatedParticle.pdgCode()) == 11){ - countPrimaryElectrons++; - if (reconstructedCollisions.size()>0) countPrimaryElectronsWithRecoColl++; - electron.SetPxPyPzE(generatedParticle.px(),generatedParticle.py(),generatedParticle.pz(),generatedParticle.e()); - candidateJpsi+=electron; - } - } - registry.get(HIST("hNgeneratedElectrons"))->Fill(countElectrons); - registry.get(HIST("hNgeneratedElectronsWithRecoColl"))->Fill(countElectronsWithRecoColl); - registry.get(HIST("hNgeneratedPrimaryElectrons"))->Fill(countPrimaryElectrons); - registry.get(HIST("hNgeneratedPrimaryElectronsWithRecoColl"))->Fill(countPrimaryElectronsWithRecoColl); - registry.get(HIST("hInvariantMass"))->Fill(candidateJpsi.M()); - registry.get(HIST("hMotherP"))->Fill(candidateJpsi.P()); - registry.get(HIST("hMotherPwide"))->Fill(candidateJpsi.P()); - registry.get(HIST("hMotherPt"))->Fill(candidateJpsi.Pt()); - registry.get(HIST("hMotherPhi"))->Fill(candidateJpsi.Phi()); - registry.get(HIST("hMotherRapidity"))->Fill(candidateJpsi.Rapidity()); - - - } // end processGeneratorLevel - - void processTest1(aod::McCollision const& generatedCollision, aod::McParticles const& generatedParticles){ - if (verboseDebug) LOGF(info,"n particles %d",generatedParticles.size()); - }// end processTest1 - - void processTest2(aod::McCollision const& generatedCollision){ - - LOGF(info,"MC generators ID %d",generatedCollision.generatorsID()); - - }// end processTest2 - - void processTest3(aod::McParticles const& generatedParticles){ - if (verboseDebug) LOGF(info,"n particles %d",generatedParticles.size()); - }// end processTest3 - - void processTest4(aod::McParticle const& generatedParticle){ - - if (generatedParticle.mcCollisionId() < indexCollision) LOGF(warning,"WARNING: previous index %d, this index %d",indexCollision,generatedParticle.mcCollisionId()); - indexCollision = generatedParticle.mcCollisionId(); - }// end processTest4 - - int largestIndex = 0; - - void processTest5(soa::Join::iterator const& collision, - aod::McCollisions const& generatedCollisions){ - - if (collision.has_mcCollision()) { - auto generatedCollision = collision.mcCollision(); - if (largestIndex <= generatedCollision.globalIndex()) largestIndex = generatedCollision.globalIndex(); - } - - }// end processTest5 - - void processTest6(aod::Collision const& collision){ - - LOGF(info,"Collision BC id %d",collision.bcId()); - - }// end processTest6 - - - void processTestUDtable1(soa::Join::iterator const& track, - aod::UDMcParticles const& particles){ - - LOGF(info,"IDX %d, mask %d",track.udMcParticleId(),track.mcMask()); - printTrackParticleData(track); - - }// end processTestUDtable1 - - void processTestUDtable2(soa::Join::iterator const& track){ - -// printTrackData(track); - - if (isUDglobalTrack(track)) { - LOGF(info,"++++++"); - LOGF(info,"isUDprimaryTrack(track) %b",isUDprimaryTrack(track)); - LOGF(info,"isUDinAcceptanceTrack(track) %b",isUDinAcceptanceTrack(track)); - LOGF(info,"isUDqualityTrack(track) %b",isUDqualityTrack(track)); - } - - - }// end processTestUDtable2 - - void processTestUDtable3(aod::UDCollision const& collision){ - - LOGF(info,"IDX %d, globalBC %d",collision.globalIndex(),collision.globalBC()); - - }// end processTestUDtable3 - - - PROCESS_SWITCH(UpcMCCentralBarrel, processSimulatorLevel, "Iterate MC tables with reconstructed data", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processGeneratorLevel, "Iterate MC tables with generated data", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest1, "Test MC collision + particles", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest2, "Test MC collisions", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest3, "Test MC particles", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest4, "Test single MC particle", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTest5, "Test index sorting of MC collisions in reco collision", false) - PROCESS_SWITCH(UpcMCCentralBarrel, processTest6, "Test single collision", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTestUDtable1, "Test tracks and its particles from UD table", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTestUDtable2, "Test tracks from UD table", false); - PROCESS_SWITCH(UpcMCCentralBarrel, processTestUDtable3, "Test collisions from UD table", false); - -}; - - - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-mc-central-barrel"}) - }; -} \ No newline at end of file From f6dabb5dc54074a3b604c41c0905995b0c7c21f6 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 09:05:58 +0100 Subject: [PATCH 17/29] changing indentation to tabs. Adding copyright. --- PWGUD/Core/RLhelper.h | 17 +++++++++++--- PWGUD/Tasks/CMakeLists.txt | 48 +++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index 446396f26a3..e602225c6fc 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -1,6 +1,17 @@ +// 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. // -// Created by Roman Lavička on 10.11.2022. +// 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. +/// +/// \brief +/// \author Roman Lavicka, roman.lavicka@cern.ch +/// \since 10.11.2022 #ifndef ALISW_RLHELPER_H #define ALISW_RLHELPER_H @@ -371,7 +382,7 @@ void printTrackData(T const& track) // Function to print basic info on track { LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d", - track.globalIndex(),track.isPVContributor(),track.hasITS(),track.hasTPC(),track.hasTOF()); + track.globalIndex(),track.isPVContributor(),track.hasITS(),track.hasTPC(),track.hasTOF()); } template @@ -382,7 +393,7 @@ void printTrackParticleData(T const& track) if (track.has_udMcParticle()) { auto mcparticle = track.udMcParticle(); LOGF(info," Associated MC particle idx %d, primary %d, PDG code %d", - mcparticle.globalIndex(),mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); + mcparticle.globalIndex(),mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); } } diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index 3887ffe3782..c06a963be9d 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -10,41 +10,41 @@ # or submit itself to any jurisdiction. o2physics_add_dpl_workflow(upc - SOURCES upcAnalysis.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase - COMPONENT_NAME Analysis) + SOURCES upcAnalysis.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-forward - SOURCES upcForward.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsVertexing - COMPONENT_NAME Analysis) + SOURCES upcForward.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsVertexing + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(diff-mcdatascanner - SOURCES diffMCDataScanner.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) + SOURCES diffMCDataScanner.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(diff-mcqa - SOURCES diffMCQA.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder - COMPONENT_NAME Analysis) + SOURCES diffMCQA.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(diff-qa - SOURCES diffQA.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder - COMPONENT_NAME Analysis) + SOURCES diffQA.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(dgcand-analyzer - SOURCES DGCandAnalyzer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder O2Physics::UDGoodRunSelector O2Physics::DGPIDSelector - COMPONENT_NAME Analysis) + SOURCES DGCandAnalyzer.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder O2Physics::UDGoodRunSelector O2Physics::DGPIDSelector + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upccand-analyzer - SOURCES UPCCandidateAnalyzer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase - COMPONENT_NAME Analysis) + SOURCES UPCCandidateAnalyzer.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-central-barrel-rl - SOURCES upcCentralBarrelAnalyzerRL.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) + SOURCES upcCentralBarrelAnalyzerRL.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) From 49424d12f96b6f1861940e0e356f95eb2124b1f1 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 09:13:25 +0100 Subject: [PATCH 18/29] changing indentation to spaces --- PWGUD/Core/RLhelper.h | 522 ++++++++++----------- PWGUD/Tasks/CMakeLists.txt | 48 +- PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx | 430 ++++++++--------- 3 files changed, 500 insertions(+), 500 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index e602225c6fc..6b747dae5fe 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -28,230 +28,230 @@ template int testPIDhypothesis(T trackPIDinfo) // Choose, which particle it is according to PID { - float nSigmaTPC[5]; - nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); - nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); - nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); - nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); - nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); - int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); - float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; - int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); - - float nSigmaTOF[5]; - nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); - nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); - nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); - nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); - nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); - int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); - - // do PID using TPC+TOF - if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()){ - if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION){ - if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon - else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton - else { - if (enumChoiceTPC == P_ELECTRON) return P_ELECTRON; // probably electron - else if (enumChoiceTPC == P_MUON) return P_MUON; // probably muon - else return P_PION; // probably pion - } - } - else { - if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon - else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton - else { - if (enumChoiceTPCpick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron - else if (enumChoiceTPCpick == P_MUON) return P_MUON; // probably misidentified muon - else if (enumChoiceTPCpick == P_PION) return P_PION; // probably misidentified pion - } - } - } - // do PID using TPC only - else if (trackPIDinfo.hasTPC()) return enumChoiceTPC; - // do PID using TOF only - else if (trackPIDinfo.hasTOF()) return enumChoiceTOF; - // give warning and return non-sense - else { - LOGF(warning,"testPIDhypothesis failed - track did not leave information in TPC or TOF"); - return -1; - } - return -1; + float nSigmaTPC[5]; + nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); + nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); + nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); + nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); + nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); + int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); + float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; + int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); + + float nSigmaTOF[5]; + nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); + nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); + nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); + nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); + nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); + int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); + + // do PID using TPC+TOF + if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()){ + if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION){ + if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon + else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton + else { + if (enumChoiceTPC == P_ELECTRON) return P_ELECTRON; // probably electron + else if (enumChoiceTPC == P_MUON) return P_MUON; // probably muon + else return P_PION; // probably pion + } + } + else { + if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon + else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton + else { + if (enumChoiceTPCpick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron + else if (enumChoiceTPCpick == P_MUON) return P_MUON; // probably misidentified muon + else if (enumChoiceTPCpick == P_PION) return P_PION; // probably misidentified pion + } + } + } + // do PID using TPC only + else if (trackPIDinfo.hasTPC()) return enumChoiceTPC; + // do PID using TOF only + else if (trackPIDinfo.hasTOF()) return enumChoiceTOF; + // give warning and return non-sense + else { + LOGF(warning,"testPIDhypothesis failed - track did not leave information in TPC or TOF"); + return -1; + } + return -1; } float momentum(float px, float py, float pz) // Just a simple function to return momentum { - return TMath::Sqrt(px*px+py*py+pz*py); + return TMath::Sqrt(px*px+py*py+pz*py); } float invariantMass(float E, float px, float py, float pz) // Just a simple function to return invariant mass { - return TMath::Sqrt(E*E-px*px-py*py-pz*py); + return TMath::Sqrt(E*E-px*px-py*py-pz*py); } float phi(float px, float py) // Just a simple function to return azimuthal angle { - if (px!=0) return TMath::ATan(py/px); - return -999.; + if (px!=0) return TMath::ATan(py/px); + return -999.; } float eta(float px, float py, float pz) // Just a simple function to return pseudorapidity { - float eta = -999.; - float mom = momentum(px,py,pz); - if (mom!=0) eta = TMath::ATanH(pz/mom); - if (-1. int getElectronCharge(E const& generatedElectron) // Check if particle is electron or positron and return charge accordingly. Return zero if particle is not electron/positron { - if (generatedElectron.pdgCode() == 11) return -1; - else if (generatedElectron.pdgCode() == -11) return 1; - else return 0; + if (generatedElectron.pdgCode() == 11) return -1; + else if (generatedElectron.pdgCode() == -11) return 1; + else return 0; } template int64_t getEvSelsIndexOfThisCollisionBC(Es const& infoEvSels, uint64_t globalBC) // reads full event selection table end return global index corresponding to given global BC. Return -1 when fails. { - for (auto& infoEvSel : infoEvSels){ - if (infoEvSel.bcId() == globalBC) return infoEvSel.globalIndex(); - } - return -1; + for (auto& infoEvSel : infoEvSels){ + if (infoEvSel.bcId() == globalBC) return infoEvSel.globalIndex(); + } + return -1; } template bool isEvSelFITempty(C const& collision) // Get FIT information from EventSelection task for each collision { - if (collision.has_foundFT0() || collision.has_foundFV0() || collision.has_foundFDD()) return false; - else return true; + if (collision.has_foundFT0() || collision.has_foundFV0() || collision.has_foundFDD()) return false; + else return true; } template bool isFITempty(T const& FITinfo) // Return true if FIT had no signal { - // check FT0 signal - bool hasNoFT0 = true; - bool isBB = FITinfo.bbFT0A() || FITinfo.bbFT0C(); - bool isBG = FITinfo.bgFT0A() || FITinfo.bgFT0C(); - hasNoFT0 = !isBB && !isBG; - // check FV0 signal - bool hasNoFV0A = true; - isBB = FITinfo.bbFV0A(); - isBG = FITinfo.bgFV0A(); - hasNoFV0A = !isBB && !isBG; - // check FDD signal - bool hasNoFDD = true; - isBB = FITinfo.bbFDDA() || FITinfo.bbFDDC(); - isBG = FITinfo.bgFDDA() || FITinfo.bgFDDC(); - hasNoFDD = !isBB && !isBG; - - if (hasNoFT0 && hasNoFV0A && hasNoFDD) return true; - else return false; + // check FT0 signal + bool hasNoFT0 = true; + bool isBB = FITinfo.bbFT0A() || FITinfo.bbFT0C(); + bool isBG = FITinfo.bgFT0A() || FITinfo.bgFT0C(); + hasNoFT0 = !isBB && !isBG; + // check FV0 signal + bool hasNoFV0A = true; + isBB = FITinfo.bbFV0A(); + isBG = FITinfo.bgFV0A(); + hasNoFV0A = !isBB && !isBG; + // check FDD signal + bool hasNoFDD = true; + isBB = FITinfo.bbFDDA() || FITinfo.bbFDDC(); + isBG = FITinfo.bgFDDA() || FITinfo.bgFDDC(); + hasNoFDD = !isBB && !isBG; + + if (hasNoFT0 && hasNoFV0A && hasNoFDD) return true; + else return false; } template bool isUDprimaryTrack(T const& udtrack) // TrackSelection::kPrimaryTracks = kGoldenChi2 | kDCAxy | kDCAz; { - // temporary hardcoded input - float maxDcaXY = 0.5;// in mm - float maxDcaZ = 2.;// in mm - // selection GoldenChi2 - // seems to be always true for Run 3... at least it is not coded - // selection DCAxy - if (abs(udtrack.dcaXY()) > maxDcaXY) return false; - // selection DCAz - if (abs(udtrack.dcaZ()) > maxDcaZ) return false; - // passed all selections - return true; + // temporary hardcoded input + float maxDcaXY = 0.5;// in mm + float maxDcaZ = 2.;// in mm + // selection GoldenChi2 + // seems to be always true for Run 3... at least it is not coded + // selection DCAxy + if (abs(udtrack.dcaXY()) > maxDcaXY) return false; + // selection DCAz + if (abs(udtrack.dcaZ()) > maxDcaZ) return false; + // passed all selections + return true; } template bool isUDinAcceptanceTrack(T const& udtrack) // TrackSelection::kInAcceptanceTracks = kPtRange | kEtaRange; { - // temporary hardcoded input - float minPt = 0.;// in GeV - float minEta = -10.; - float maxPt = 10.;// in GeV - float maxEta = 10.; - float currentEta = eta(udtrack.px(),udtrack.py(),udtrack.pz()); - // selection pt - if (udtrack.pt() < minPt || udtrack.pt() > maxPt) return false; - // selection eta - if (currentEta < minEta || currentEta > maxEta) return false; - // passed all selections - return true; + // temporary hardcoded input + float minPt = 0.;// in GeV + float minEta = -10.; + float maxPt = 10.;// in GeV + float maxEta = 10.; + float currentEta = eta(udtrack.px(),udtrack.py(),udtrack.pz()); + // selection pt + if (udtrack.pt() < minPt || udtrack.pt() > maxPt) return false; + // selection eta + if (currentEta < minEta || currentEta > maxEta) return false; + // passed all selections + return true; } template bool isUDqualityTrack(T const& udtrack) // TrackSelection::kQualityTracks = kTrackType | kTPCNCls | kTPCCrossedRows | kTPCCrossedRowsOverNCls | kTPCChi2NDF | kTPCRefit | kITSNCls | kITSChi2NDF | kITSRefit | kITSHits; { - // temporary hardcoded input - float cutITSchi2ndf = 6.; - uint8_t cutNitsClusters = 4; - float cutTPCchi2ndf = 4.; - int16_t cutNtpcClusters = 0; - int16_t cutNtpcCrossedRows = 70; - float cutCrossedRowsOverNclusters = 0.8; - // track type - // TODO //ignoring for the moment (its either innermost update track (0) or propagated track (1), the rest is Run 2). - // ITS hits - // TODO //ignoring for the moment (some crazy function which I haven't found anywhere to be used) - // ITS refit - if (!udtrack.hasITS()) return false; - // ITS chi2/ndf - if (udtrack.itsChi2NCl() > cutITSchi2ndf) return false; - // ITS n clusters - if (udtrack.itsNCls() < cutNitsClusters) return false; - // TPC refit - if (!udtrack.hasTPC()) return false; - // TPC chi2/ndf - if (udtrack.tpcChi2NCl() > cutTPCchi2ndf) return false; - // TPC n clusters - int16_t nFoundClusters = udtrack.tpcNClsFindable() - udtrack.tpcNClsFindableMinusFound(); - if (nFoundClusters < cutNtpcClusters) return false; - // TPC crossed rows - if (udtrack.tpcNClsCrossedRows() < cutNtpcCrossedRows) return false; - // TPC crossed rows over n clusters - float crossedRowsOverNclusters = (float)udtrack.tpcNClsCrossedRows()/nFoundClusters; - if (crossedRowsOverNclusters < cutCrossedRowsOverNclusters) return false; - // passed all selections - return true; + // temporary hardcoded input + float cutITSchi2ndf = 6.; + uint8_t cutNitsClusters = 4; + float cutTPCchi2ndf = 4.; + int16_t cutNtpcClusters = 0; + int16_t cutNtpcCrossedRows = 70; + float cutCrossedRowsOverNclusters = 0.8; + // track type + // TODO //ignoring for the moment (its either innermost update track (0) or propagated track (1), the rest is Run 2). + // ITS hits + // TODO //ignoring for the moment (some crazy function which I haven't found anywhere to be used) + // ITS refit + if (!udtrack.hasITS()) return false; + // ITS chi2/ndf + if (udtrack.itsChi2NCl() > cutITSchi2ndf) return false; + // ITS n clusters + if (udtrack.itsNCls() < cutNitsClusters) return false; + // TPC refit + if (!udtrack.hasTPC()) return false; + // TPC chi2/ndf + if (udtrack.tpcChi2NCl() > cutTPCchi2ndf) return false; + // TPC n clusters + int16_t nFoundClusters = udtrack.tpcNClsFindable() - udtrack.tpcNClsFindableMinusFound(); + if (nFoundClusters < cutNtpcClusters) return false; + // TPC crossed rows + if (udtrack.tpcNClsCrossedRows() < cutNtpcCrossedRows) return false; + // TPC crossed rows over n clusters + float crossedRowsOverNclusters = (float)udtrack.tpcNClsCrossedRows()/nFoundClusters; + if (crossedRowsOverNclusters < cutCrossedRowsOverNclusters) return false; + // passed all selections + return true; } template bool isUDglobalTrack(T const& udtrack) // combine quality+primary+acceptance { - if (!isUDinAcceptanceTrack(udtrack)) return false; - if (!isUDprimaryTrack(udtrack)) return false; - if (!isUDqualityTrack(udtrack)) return false; - return true; + if (!isUDinAcceptanceTrack(udtrack)) return false; + if (!isUDprimaryTrack(udtrack)) return false; + if (!isUDqualityTrack(udtrack)) return false; + return true; } template @@ -259,32 +259,32 @@ bool trackSelection(T const& udtrack, int selection) // Do selection of reconstructed track { - if (selection==0) return true; - // Is central barrel propagated track - // TODO //if (selection==1 && udtrack.trackType()!=1) return false; - // Is central barrel vertex contributor - if (selection==2 && udtrack.isPVContributor()!=1) return false; - // Is central barrel track selection global track - if (selection==3 && isUDqualityTrack(udtrack)!=1) return false; - // Is central barrel track selection global track - if (selection==4 && isUDprimaryTrack(udtrack)!=1) return false; - // Is central barrel track selection global track - if (selection==5 && isUDglobalTrack(udtrack)!=1) return false; - - return true; + if (selection==0) return true; + // Is central barrel propagated track + // TODO //if (selection==1 && udtrack.trackType()!=1) return false; + // Is central barrel vertex contributor + if (selection==2 && udtrack.isPVContributor()!=1) return false; + // Is central barrel track selection global track + if (selection==3 && isUDqualityTrack(udtrack)!=1) return false; + // Is central barrel track selection global track + if (selection==4 && isUDprimaryTrack(udtrack)!=1) return false; + // Is central barrel track selection global track + if (selection==5 && isUDglobalTrack(udtrack)!=1) return false; + + return true; } template bool selectTrack(T const& track, int setOfCuts) // Do selection of reconstructed track { - if (setOfCuts<1) return true; - // Is central barrel propagated track) - if (setOfCuts<2 && trackSelection(track,1)!=1) return false; - // Is central barrel vertex contributor - if (setOfCuts<3 && trackSelection(track,2)!=1) return false; + if (setOfCuts<1) return true; + // Is central barrel propagated track) + if (setOfCuts<2 && trackSelection(track,1)!=1) return false; + // Is central barrel vertex contributor + if (setOfCuts<3 && trackSelection(track,2)!=1) return false; - return true; + return true; } template < typename C> @@ -292,40 +292,40 @@ void fillEventSelectionHistogram(HistogramRegistry ®istry, C const& collision // Fill into histogram information from EventSelection task for each collision { - for (int i = 0; i < kNsel; i++) { - if(collision.selection()[i]) registry.get(HIST("hEventSelectionTaskParameters"))->Fill(i); - } - - const int nXbins = registry.get(HIST("hEventSelectionTask"))->GetXaxis()->GetNbins(); - registry.get(HIST("hEventSelectionTask"))->SetNdivisions(nXbins, "X"); - if (collision.sel7()) registry.get(HIST("hEventSelectionTask"))->Fill(0); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(1,70,0.02,30,-1,-1,"sel7"); - if (collision.sel8()) registry.get(HIST("hEventSelectionTask"))->Fill(1); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(2,70,0.02,30,-1,-1,"sel8"); - if (collision.bbV0A()) registry.get(HIST("hEventSelectionTask"))->Fill(2); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(3,70,0.02,30,-1,-1,"bbV0A"); - if (collision.bbV0C()) registry.get(HIST("hEventSelectionTask"))->Fill(3); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(4,70,0.02,30,-1,-1,"bbV0C"); - if (collision.bgV0A()) registry.get(HIST("hEventSelectionTask"))->Fill(4); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(5,70,0.02,30,-1,-1,"bgV0A"); - if (collision.bgV0C()) registry.get(HIST("hEventSelectionTask"))->Fill(5); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(6,70,0.02,30,-1,-1,"bgV0C"); - if (collision.bbFDA()) registry.get(HIST("hEventSelectionTask"))->Fill(6); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(7,70,0.02,30,-1,-1,"bbFDA"); - if (collision.bbFDC()) registry.get(HIST("hEventSelectionTask"))->Fill(7); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(8,70,0.02,30,-1,-1,"bbFDC"); - if (collision.bgFDA()) registry.get(HIST("hEventSelectionTask"))->Fill(8); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(9,70,0.02,30,-1,-1,"bgFDA"); - if (collision.bgFDC()) registry.get(HIST("hEventSelectionTask"))->Fill(9); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(10,70,0.02,30,-1,-1,"bgFDC"); - if (collision.has_foundBC()) registry.get(HIST("hEventSelectionTask"))->Fill(10); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(11,70,0.02,30,-1,-1,"has_foundBC"); - if (collision.has_foundFT0()) registry.get(HIST("hEventSelectionTask"))->Fill(11); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(12,70,0.02,30,-1,-1,"has_foundFT0"); - if (collision.has_foundFV0()) registry.get(HIST("hEventSelectionTask"))->Fill(12); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(13,70,0.02,30,-1,-1,"has_foundFV0"); - if (collision.has_foundFDD()) registry.get(HIST("hEventSelectionTask"))->Fill(13); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(14,70,0.02,30,-1,-1,"has_foundFDD"); + for (int i = 0; i < kNsel; i++) { + if(collision.selection()[i]) registry.get(HIST("hEventSelectionTaskParameters"))->Fill(i); + } + + const int nXbins = registry.get(HIST("hEventSelectionTask"))->GetXaxis()->GetNbins(); + registry.get(HIST("hEventSelectionTask"))->SetNdivisions(nXbins, "X"); + if (collision.sel7()) registry.get(HIST("hEventSelectionTask"))->Fill(0); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(1,70,0.02,30,-1,-1,"sel7"); + if (collision.sel8()) registry.get(HIST("hEventSelectionTask"))->Fill(1); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(2,70,0.02,30,-1,-1,"sel8"); + if (collision.bbV0A()) registry.get(HIST("hEventSelectionTask"))->Fill(2); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(3,70,0.02,30,-1,-1,"bbV0A"); + if (collision.bbV0C()) registry.get(HIST("hEventSelectionTask"))->Fill(3); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(4,70,0.02,30,-1,-1,"bbV0C"); + if (collision.bgV0A()) registry.get(HIST("hEventSelectionTask"))->Fill(4); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(5,70,0.02,30,-1,-1,"bgV0A"); + if (collision.bgV0C()) registry.get(HIST("hEventSelectionTask"))->Fill(5); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(6,70,0.02,30,-1,-1,"bgV0C"); + if (collision.bbFDA()) registry.get(HIST("hEventSelectionTask"))->Fill(6); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(7,70,0.02,30,-1,-1,"bbFDA"); + if (collision.bbFDC()) registry.get(HIST("hEventSelectionTask"))->Fill(7); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(8,70,0.02,30,-1,-1,"bbFDC"); + if (collision.bgFDA()) registry.get(HIST("hEventSelectionTask"))->Fill(8); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(9,70,0.02,30,-1,-1,"bgFDA"); + if (collision.bgFDC()) registry.get(HIST("hEventSelectionTask"))->Fill(9); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(10,70,0.02,30,-1,-1,"bgFDC"); + if (collision.has_foundBC()) registry.get(HIST("hEventSelectionTask"))->Fill(10); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(11,70,0.02,30,-1,-1,"has_foundBC"); + if (collision.has_foundFT0()) registry.get(HIST("hEventSelectionTask"))->Fill(11); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(12,70,0.02,30,-1,-1,"has_foundFT0"); + if (collision.has_foundFV0()) registry.get(HIST("hEventSelectionTask"))->Fill(12); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(13,70,0.02,30,-1,-1,"has_foundFV0"); + if (collision.has_foundFDD()) registry.get(HIST("hEventSelectionTask"))->Fill(13); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(14,70,0.02,30,-1,-1,"has_foundFDD"); } @@ -334,96 +334,96 @@ void fillTrackSelectionHistogram(HistogramRegistry ®istry, Ts const& tracks, // Fill into histogram effect of track selection for all tracks { - const int nXbins = registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->GetNbins(); - registry.get(HIST("hEffectOfTrackSelections"))->SetNdivisions(nXbins, "X"); - - for (auto& track : tracks){ - if (trackSelection(track,0)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(0); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(1,70,0.02,30,-1,-1,"no cut"); - if (trackSelection(track,1)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(1); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(2,70,0.02,30,-1,-1,"propagated"); - if (trackSelection(track,3)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(2); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(3,70,0.02,30,-1,-1,"quality"); - if (trackSelection(track,4)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(3); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(4,70,0.02,30,-1,-1,"primary"); - if (trackSelection(track,5)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(4); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(5,70,0.02,30,-1,-1,"global"); - if (trackSelection(track,2)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(5); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(6,70,0.02,30,-1,-1,"PV contributor"); - - - if (!trackSelection(track,2)) continue; - if (!trackSelection(track,5)) continue; - bool hasITS = track.hasITS(); - bool hasTPC = track.hasTPC(); - bool hasTOF = track.hasTOF(); - if (hasITS) registry.get(HIST("hEffectOfTrackSelections"))->Fill(10); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(11,70,0.02,30,-1,-1,"ITS"); - if (hasTPC) registry.get(HIST("hEffectOfTrackSelections"))->Fill(11); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(12,70,0.02,30,-1,-1,"TPC"); - if (hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(12); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(13,70,0.02,30,-1,-1,"TOF"); - if (hasITS && hasTPC) registry.get(HIST("hEffectOfTrackSelections"))->Fill(13); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(14,70,0.02,30,-1,-1,"ITS+TPC"); - if (hasITS && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(14); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(15,70,0.02,30,-1,-1,"ITS+TOF"); - if (hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(15); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(16,70,0.02,30,-1,-1,"TPC+TOF"); - if (hasITS && hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(16); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(17,70,0.02,30,-1,-1,"ITS+TPC+TOF"); - if (isFITempty(collision)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(17); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(18,70,0.02,30,-1,-1,"FIT empty"); - - } + const int nXbins = registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->GetNbins(); + registry.get(HIST("hEffectOfTrackSelections"))->SetNdivisions(nXbins, "X"); + + for (auto& track : tracks){ + if (trackSelection(track,0)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(0); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(1,70,0.02,30,-1,-1,"no cut"); + if (trackSelection(track,1)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(1); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(2,70,0.02,30,-1,-1,"propagated"); + if (trackSelection(track,3)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(2); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(3,70,0.02,30,-1,-1,"quality"); + if (trackSelection(track,4)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(3); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(4,70,0.02,30,-1,-1,"primary"); + if (trackSelection(track,5)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(4); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(5,70,0.02,30,-1,-1,"global"); + if (trackSelection(track,2)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(5); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(6,70,0.02,30,-1,-1,"PV contributor"); + + + if (!trackSelection(track,2)) continue; + if (!trackSelection(track,5)) continue; + bool hasITS = track.hasITS(); + bool hasTPC = track.hasTPC(); + bool hasTOF = track.hasTOF(); + if (hasITS) registry.get(HIST("hEffectOfTrackSelections"))->Fill(10); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(11,70,0.02,30,-1,-1,"ITS"); + if (hasTPC) registry.get(HIST("hEffectOfTrackSelections"))->Fill(11); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(12,70,0.02,30,-1,-1,"TPC"); + if (hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(12); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(13,70,0.02,30,-1,-1,"TOF"); + if (hasITS && hasTPC) registry.get(HIST("hEffectOfTrackSelections"))->Fill(13); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(14,70,0.02,30,-1,-1,"ITS+TPC"); + if (hasITS && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(14); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(15,70,0.02,30,-1,-1,"ITS+TOF"); + if (hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(15); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(16,70,0.02,30,-1,-1,"TPC+TOF"); + if (hasITS && hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(16); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(17,70,0.02,30,-1,-1,"ITS+TPC+TOF"); + if (isFITempty(collision)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(17); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(18,70,0.02,30,-1,-1,"FIT empty"); + + } } template void printTrackData(T const& track) // Function to print basic info on track { - LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d", - track.globalIndex(),track.isPVContributor(),track.hasITS(),track.hasTPC(),track.hasTOF()); + LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d", + track.globalIndex(),track.isPVContributor(),track.hasITS(),track.hasTPC(),track.hasTOF()); } template void printTrackParticleData(T const& track) // Function to print basic info on track and its associated mc particle { - printTrackData(track); - if (track.has_udMcParticle()) { - auto mcparticle = track.udMcParticle(); - LOGF(info," Associated MC particle idx %d, primary %d, PDG code %d", - mcparticle.globalIndex(),mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); - } + printTrackData(track); + if (track.has_udMcParticle()) { + auto mcparticle = track.udMcParticle(); + LOGF(info," Associated MC particle idx %d, primary %d, PDG code %d", + mcparticle.globalIndex(),mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); + } } template void printCollisionTracksData(Ts const& tracks, int setOfCuts) // Function to loop over tracks associated to a collision and print basic info { - int countNoMCparticle = 0; - for (auto& track : tracks){ - if (!selectTrack(track,setOfCuts)) continue; - if (track.has_udMcParticle()) { - printTrackParticleData(track); - } - else countNoMCparticle++; - } - if (countNoMCparticle > 0) LOGF(warning,"This collision has %d tracks without associated mc particle",countNoMCparticle); + int countNoMCparticle = 0; + for (auto& track : tracks){ + if (!selectTrack(track,setOfCuts)) continue; + if (track.has_udMcParticle()) { + printTrackParticleData(track); + } + else countNoMCparticle++; + } + if (countNoMCparticle > 0) LOGF(warning,"This collision has %d tracks without associated mc particle",countNoMCparticle); } template void printCollisionGeneratedParticles(MPs const& particles, P const& slice, C const& collision){ - auto slicedParticles = particles.sliceBy(slice, collision.mcCollision().globalIndex()); - for (auto& slicedParticle : slicedParticles){ - LOGF(info,"Particle idx %d, primary %d",slicedParticle.globalIndex(),slicedParticle.isPhysicalPrimary()); - } + auto slicedParticles = particles.sliceBy(slice, collision.mcCollision().globalIndex()); + for (auto& slicedParticle : slicedParticles){ + LOGF(info,"Particle idx %d, primary %d",slicedParticle.globalIndex(),slicedParticle.isPhysicalPrimary()); + } } void printLargeMessage(std::string info) // Helper to printf info message to terminal { - LOGF(info,"################################### %s ###################################",info); + LOGF(info,"################################### %s ###################################",info); } diff --git a/PWGUD/Tasks/CMakeLists.txt b/PWGUD/Tasks/CMakeLists.txt index c06a963be9d..3887ffe3782 100644 --- a/PWGUD/Tasks/CMakeLists.txt +++ b/PWGUD/Tasks/CMakeLists.txt @@ -10,41 +10,41 @@ # or submit itself to any jurisdiction. o2physics_add_dpl_workflow(upc - SOURCES upcAnalysis.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase - COMPONENT_NAME Analysis) + SOURCES upcAnalysis.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-forward - SOURCES upcForward.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsVertexing - COMPONENT_NAME Analysis) + SOURCES upcForward.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase O2::DetectorsVertexing + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(diff-mcdatascanner - SOURCES diffMCDataScanner.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) + SOURCES diffMCDataScanner.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(diff-mcqa - SOURCES diffMCQA.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder - COMPONENT_NAME Analysis) + SOURCES diffMCQA.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(diff-qa - SOURCES diffQA.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder - COMPONENT_NAME Analysis) + SOURCES diffQA.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(dgcand-analyzer - SOURCES DGCandAnalyzer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder O2Physics::UDGoodRunSelector O2Physics::DGPIDSelector - COMPONENT_NAME Analysis) + SOURCES DGCandAnalyzer.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::DGCutparHolder O2Physics::UDGoodRunSelector O2Physics::DGPIDSelector + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upccand-analyzer - SOURCES UPCCandidateAnalyzer.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase - COMPONENT_NAME Analysis) + SOURCES UPCCandidateAnalyzer.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2::DetectorsBase + COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(upc-central-barrel-rl - SOURCES upcCentralBarrelAnalyzerRL.cxx - PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) + SOURCES upcCentralBarrelAnalyzerRL.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx index b30f4e362a2..1bcf6507235 100644 --- a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx @@ -34,227 +34,227 @@ using namespace o2::framework::expressions; struct CentralBarrelAnalyzerRL { - // Global varialbes - int countCollisions; - Service pdg; - - HistogramRegistry registry{ - "registry", - { - {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEffectOfTrackSelections", "Effect of track cuts;Selection (-);Number of tracks (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEventSelectionTask", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEventSelectionTaskParameters", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {kNsel,-0.5,kNsel-0.5} } } }, - {"hNcontributionsToCollision", ";Number of contributions in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNtracks", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNtracksWide", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {1000,-0.5,999.5} } } }, - {"hNcontributionsToVertex", ";Number of contributors to vertex (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNprimaryTracks", ";Number of primary tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,2.8,3.4} } } }, - {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassElEl", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassMuMu", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassPiPi", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassKaKa", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassPrPr", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, - {"hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, - {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, - {"hMotherPhi", ";Mother #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-TMath::Pi(),TMath::Pi()} } } }, - {"hMotherRapidity", ";Mother #y (-);Number of events (-)", { HistType::kTH1D, { {500,-2.,2.} } } }, - {"hVtxZ", ";Vertex z-position (cm);Number of events (-)", { HistType::kTH1D, { {1000,-30.,30.} } } }, - {"hVtxTransversal", ";Vertex x-position (cm);Vertex y-position (cm)", { HistType::kTH2D, { {1000,-0.1,0.1}, {1000,-0.1,0.1} } } }, - {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCsignalVtxContributors", ";Vtx contributor 1 - TPC d#it{E}/d#it{x} (arb. units);Vtx contributor 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, - {"hTPCsignalElectrons", ";Identified electron 1 - TPC d#it{E}/d#it{x} (arb. units);Identified electron 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, - {"hTrackP", ";Track #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, - {"hTrackPt", ";Track #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,5.} } } }, - {"hTrackPhi", ";Track #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-2*TMath::Pi(),2*TMath::Pi()} } } }, - {"hTrackEta", ";Track #eta (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } }, - {"hTrackEnergy", ";Track Energy (GeV);Number of events (-)", { HistType::kTH1D, { {500,0.,100.} } } }, - {"hTrackRapidity", ";Track rapidity (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } } - } - }; - - // declare configurables - Configurable verboseInfo{"verboseInfo", true, {"Print general info to terminal; default it true."}}; - Configurable printMetaInfo{"printMetaInfo", false, {"Print general info to terminal about collision, tracks, particles...; default it false."}}; - Configurable verboseDebug{"verboseDebug", false, {"Print debug info to terminal; default it false."}}; - Configurable applyTrackCuts{"applyTrackCuts", 0, {"Apply n selections on track; default it no cut."}}; - Configurable applySingleTrackCut{"applySingleTrackCut", 0, {"Apply selection n on track, applyTrackCuts must be at maximum for full usage; default it no cut."}}; - - // declare filters + // Global varialbes + int countCollisions; + Service pdg; + + HistogramRegistry registry{ + "registry", + { + {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEffectOfTrackSelections", "Effect of track cuts;Selection (-);Number of tracks (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEventSelectionTask", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, + {"hEventSelectionTaskParameters", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {kNsel,-0.5,kNsel-0.5} } } }, + {"hNcontributionsToCollision", ";Number of contributions in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNtracks", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNtracksWide", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {1000,-0.5,999.5} } } }, + {"hNcontributionsToVertex", ";Number of contributors to vertex (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hNprimaryTracks", ";Number of primary tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, + {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,2.8,3.4} } } }, + {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassElEl", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassMuMu", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassPiPi", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassKaKa", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hInvariantMassPrPr", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, + {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, + {"hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, + {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, + {"hMotherPhi", ";Mother #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-TMath::Pi(),TMath::Pi()} } } }, + {"hMotherRapidity", ";Mother #y (-);Number of events (-)", { HistType::kTH1D, { {500,-2.,2.} } } }, + {"hVtxZ", ";Vertex z-position (cm);Number of events (-)", { HistType::kTH1D, { {1000,-30.,30.} } } }, + {"hVtxTransversal", ";Vertex x-position (cm);Vertex y-position (cm)", { HistType::kTH2D, { {1000,-0.1,0.1}, {1000,-0.1,0.1} } } }, + {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, + {"hTPCsignalVtxContributors", ";Vtx contributor 1 - TPC d#it{E}/d#it{x} (arb. units);Vtx contributor 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, + {"hTPCsignalElectrons", ";Identified electron 1 - TPC d#it{E}/d#it{x} (arb. units);Identified electron 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, + {"hTrackP", ";Track #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, + {"hTrackPt", ";Track #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,5.} } } }, + {"hTrackPhi", ";Track #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-2*TMath::Pi(),2*TMath::Pi()} } } }, + {"hTrackEta", ";Track #eta (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } }, + {"hTrackEnergy", ";Track Energy (GeV);Number of events (-)", { HistType::kTH1D, { {500,0.,100.} } } }, + {"hTrackRapidity", ";Track rapidity (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } } + } + }; + + // declare configurables + Configurable verboseInfo{"verboseInfo", true, {"Print general info to terminal; default it true."}}; + Configurable printMetaInfo{"printMetaInfo", false, {"Print general info to terminal about collision, tracks, particles...; default it false."}}; + Configurable verboseDebug{"verboseDebug", false, {"Print debug info to terminal; default it false."}}; + Configurable applyTrackCuts{"applyTrackCuts", 0, {"Apply n selections on track; default it no cut."}}; + Configurable applySingleTrackCut{"applySingleTrackCut", 0, {"Apply selection n on track, applyTrackCuts must be at maximum for full usage; default it no cut."}}; + + // declare filters // Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; - // declare shortcuts - using FullTracks = soa::Join; - using FullCollision = soa::Join::iterator; - - // init - void init(InitContext&){ - if (verboseInfo) printLargeMessage("INIT METHOD"); - countCollisions = 0; - - } // end init - - // run - void run(ProcessingContext& context){ - - if (verboseInfo) printLargeMessage("RUN METHOD"); - if (verboseDebug) LOGF(info,"countCollisions = %d",countCollisions); - - } // end run - - // process - void processCentralBarrel(FullCollision const& collision, - FullTracks const& tracks, - soa::Join const& infoEventSelection){ - - const float P_MASS[5] = {constants::physics::MassElectron, - constants::physics::MassMuon, - constants::physics::MassPionCharged, - constants::physics::MassKaonCharged, - constants::physics::MassProton}; - - if (verboseInfo) printLargeMessage("NEW COLLISION"); - countCollisions++; - registry.get(HIST("hEffectOfSelections"))->Fill(0); - - auto thisCollisionEventSelectionInfo = infoEventSelection.iteratorAt(getEvSelsIndexOfThisCollisionBC(infoEventSelection,collision.globalBC())); - fillEventSelectionHistogram(registry,thisCollisionEventSelectionInfo); - fillTrackSelectionHistogram(registry,tracks,collision); - - registry.get(HIST("hNcontributionsToCollision"))->Fill(collision.numContrib()); - - int nTracksInThisCollision = tracks.size(); - if (verboseDebug) LOGF(info,"collision number = %d has %d contributors",countCollisions,collision.numContrib()); - - registry.get(HIST("hNtracks"))->Fill(nTracksInThisCollision); - registry.get(HIST("hNtracksWide"))->Fill(nTracksInThisCollision); - registry.get(HIST("hVtxZ"))->Fill(collision.posZ()); - registry.get(HIST("hVtxTransversal"))->Fill(collision.posX(),collision.posY()); - - int countPrimaryTracks = 0; - int countContributorsToVertex = 0; - int countGlobalContributorsToVertex = 0; - for (auto& track : tracks){ - if (!selectTrack(track,applyTrackCuts)) continue; - if (trackSelection(track,2)) countContributorsToVertex++; - if (selectTrack(track,2)) countGlobalContributorsToVertex++; - if (isUDprimaryTrack(track)) countPrimaryTracks++; - if (track.hasTPC()) { - registry.get(HIST("hTPCsignalVsMom"))->Fill(momentum(track.px(),track.py(),track.pz()),track.tpcSignal()); - } - } - registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); - registry.get(HIST("hNprimaryTracks"))->Fill(countPrimaryTracks); - - // - // Playing around - // - if (verboseInfo) printLargeMessage("Primary + Global + FIT"); - for (auto& track : tracks){ - if (!trackSelection(track,2)) continue; - if (!trackSelection(track,5)) continue; - if (isFITempty(collision)) continue; - if (printMetaInfo) printTrackData(track); - float trkPx = track.px(); - float trkPy = track.py(); - float trkPz = track.pz(); - registry.get(HIST("hTrackP"))->Fill(momentum(trkPx,trkPy,trkPz)); - registry.get(HIST("hTrackPt"))->Fill(track.pt()); - registry.get(HIST("hTrackPhi"))->Fill(phi(trkPx,trkPy)); - registry.get(HIST("hTrackEta"))->Fill(eta(trkPx,trkPy,trkPz)); - int typeParticle = testPIDhypothesis(track); - if (typeParticle >= 0 && typeParticle < (sizeof(P_MASS)/sizeof(float))){ - float mass = P_MASS[typeParticle]; - registry.get(HIST("hTrackEnergy"))->Fill(energy(mass,trkPx,trkPy,trkPz)); - registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass,trkPx,trkPy,trkPz)); - } - } - - // - // fetching FT0, FDD, FV0 information - // - bool FITisEmpty = isFITempty(collision); - if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(1); - FITisEmpty = isEvSelFITempty(thisCollisionEventSelectionInfo); - if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(2); - if (countContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(3); - if (countGlobalContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(4); - - - // - // TPC signal info starts here - // - TLorentzVector sumOfVertexTracks, trackFromVertex; - float dedxVC[2] = {-999.,-999.}; - const int NPARTICLES = 5;//TODO think of more elegant way how to pass this info - float dedx[2][NPARTICLES] = {{-999.,-999.,-999.,-999.,-999.},{-999.,-999.,-999.,-999.,-999.}}; - int countTrks = 0; - if (countContributorsToVertex == 2) { - int twinParticles = -1; - bool isTwinParticles = false; - for (auto& track : tracks){ - if (!isUDprimaryTrack(track)) continue; - countTrks++; - trackFromVertex.SetPxPyPzE(track.px(),track.py(),track.pz(), - energy(constants::physics::MassElectron,track.px(),track.py(),track.pz())); - sumOfVertexTracks+=trackFromVertex; - if (track.hasTPC()){ - if (countTrks == 1) dedxVC[0] = track.tpcSignal(); - else if (countTrks == 2) dedxVC[1] = track.tpcSignal(); - else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); - int typeParticle = testPIDhypothesis(track); - if (typeParticle >= 0 && typeParticle <= NPARTICLES){ - if (countTrks == 1) { - dedx[0][typeParticle] = track.tpcSignal(); - twinParticles = typeParticle; - } - else if (countTrks == 2) { - dedx[1][typeParticle] = track.tpcSignal(); - if (twinParticles == typeParticle){ - isTwinParticles = true; - } - } - else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); - } - } - } - registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC[0],dedxVC[1]); - // pairs of different particles are filled in the following histograms, but outside of the range - registry.get(HIST("hTPCsignalElectrons"))->Fill(dedx[0][P_ELECTRON],dedx[1][P_ELECTRON]); - registry.get(HIST("hTPCsignalMuons"))->Fill(dedx[0][P_MUON],dedx[1][P_MUON]); - registry.get(HIST("hTPCsignalPions"))->Fill(dedx[0][P_PION],dedx[1][P_PION]); - registry.get(HIST("hTPCsignalKaons"))->Fill(dedx[0][P_KAON],dedx[1][P_KAON]); - registry.get(HIST("hTPCsignalProtons"))->Fill(dedx[0][P_PROTON],dedx[1][P_PROTON]); - registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); - registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); - registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); - registry.get(HIST("hMotherPwide"))->Fill(sumOfVertexTracks.P()); - registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); - registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); - registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); - if (isTwinParticles){ - if (twinParticles == P_ELECTRON) registry.get(HIST("hInvariantMassElEl"))->Fill(sumOfVertexTracks.M()); - if (twinParticles == P_MUON) registry.get(HIST("hInvariantMassMuMu"))->Fill(sumOfVertexTracks.M()); - if (twinParticles == P_PION) registry.get(HIST("hInvariantMassPiPi"))->Fill(sumOfVertexTracks.M()); - if (twinParticles == P_KAON) registry.get(HIST("hInvariantMassKaKa"))->Fill(sumOfVertexTracks.M()); - if (twinParticles == P_PROTON) registry.get(HIST("hInvariantMassPrPr"))->Fill(sumOfVertexTracks.M()); - } - } - - } // end processCentralBarrel - - - PROCESS_SWITCH(CentralBarrelAnalyzerRL, processCentralBarrel, "Iterate central barrel data using UD tables", true); + // declare shortcuts + using FullTracks = soa::Join; + using FullCollision = soa::Join::iterator; + + // init + void init(InitContext&){ + if (verboseInfo) printLargeMessage("INIT METHOD"); + countCollisions = 0; + + } // end init + + // run + void run(ProcessingContext& context){ + + if (verboseInfo) printLargeMessage("RUN METHOD"); + if (verboseDebug) LOGF(info,"countCollisions = %d",countCollisions); + + } // end run + + // process + void processCentralBarrel(FullCollision const& collision, + FullTracks const& tracks, + soa::Join const& infoEventSelection){ + + const float P_MASS[5] = {constants::physics::MassElectron, + constants::physics::MassMuon, + constants::physics::MassPionCharged, + constants::physics::MassKaonCharged, + constants::physics::MassProton}; + + if (verboseInfo) printLargeMessage("NEW COLLISION"); + countCollisions++; + registry.get(HIST("hEffectOfSelections"))->Fill(0); + + auto thisCollisionEventSelectionInfo = infoEventSelection.iteratorAt(getEvSelsIndexOfThisCollisionBC(infoEventSelection,collision.globalBC())); + fillEventSelectionHistogram(registry,thisCollisionEventSelectionInfo); + fillTrackSelectionHistogram(registry,tracks,collision); + + registry.get(HIST("hNcontributionsToCollision"))->Fill(collision.numContrib()); + + int nTracksInThisCollision = tracks.size(); + if (verboseDebug) LOGF(info,"collision number = %d has %d contributors",countCollisions,collision.numContrib()); + + registry.get(HIST("hNtracks"))->Fill(nTracksInThisCollision); + registry.get(HIST("hNtracksWide"))->Fill(nTracksInThisCollision); + registry.get(HIST("hVtxZ"))->Fill(collision.posZ()); + registry.get(HIST("hVtxTransversal"))->Fill(collision.posX(),collision.posY()); + + int countPrimaryTracks = 0; + int countContributorsToVertex = 0; + int countGlobalContributorsToVertex = 0; + for (auto& track : tracks){ + if (!selectTrack(track,applyTrackCuts)) continue; + if (trackSelection(track,2)) countContributorsToVertex++; + if (selectTrack(track,2)) countGlobalContributorsToVertex++; + if (isUDprimaryTrack(track)) countPrimaryTracks++; + if (track.hasTPC()) { + registry.get(HIST("hTPCsignalVsMom"))->Fill(momentum(track.px(),track.py(),track.pz()),track.tpcSignal()); + } + } + registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); + registry.get(HIST("hNprimaryTracks"))->Fill(countPrimaryTracks); + + // + // Playing around + // + if (verboseInfo) printLargeMessage("Primary + Global + FIT"); + for (auto& track : tracks){ + if (!trackSelection(track,2)) continue; + if (!trackSelection(track,5)) continue; + if (isFITempty(collision)) continue; + if (printMetaInfo) printTrackData(track); + float trkPx = track.px(); + float trkPy = track.py(); + float trkPz = track.pz(); + registry.get(HIST("hTrackP"))->Fill(momentum(trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackPt"))->Fill(track.pt()); + registry.get(HIST("hTrackPhi"))->Fill(phi(trkPx,trkPy)); + registry.get(HIST("hTrackEta"))->Fill(eta(trkPx,trkPy,trkPz)); + int typeParticle = testPIDhypothesis(track); + if (typeParticle >= 0 && typeParticle < (sizeof(P_MASS)/sizeof(float))){ + float mass = P_MASS[typeParticle]; + registry.get(HIST("hTrackEnergy"))->Fill(energy(mass,trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass,trkPx,trkPy,trkPz)); + } + } + + // + // fetching FT0, FDD, FV0 information + // + bool FITisEmpty = isFITempty(collision); + if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(1); + FITisEmpty = isEvSelFITempty(thisCollisionEventSelectionInfo); + if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(2); + if (countContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(3); + if (countGlobalContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(4); + + + // + // TPC signal info starts here + // + TLorentzVector sumOfVertexTracks, trackFromVertex; + float dedxVC[2] = {-999.,-999.}; + const int NPARTICLES = 5;//TODO think of more elegant way how to pass this info + float dedx[2][NPARTICLES] = {{-999.,-999.,-999.,-999.,-999.},{-999.,-999.,-999.,-999.,-999.}}; + int countTrks = 0; + if (countContributorsToVertex == 2) { + int twinParticles = -1; + bool isTwinParticles = false; + for (auto& track : tracks){ + if (!isUDprimaryTrack(track)) continue; + countTrks++; + trackFromVertex.SetPxPyPzE(track.px(),track.py(),track.pz(), + energy(constants::physics::MassElectron,track.px(),track.py(),track.pz())); + sumOfVertexTracks+=trackFromVertex; + if (track.hasTPC()){ + if (countTrks == 1) dedxVC[0] = track.tpcSignal(); + else if (countTrks == 2) dedxVC[1] = track.tpcSignal(); + else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); + int typeParticle = testPIDhypothesis(track); + if (typeParticle >= 0 && typeParticle <= NPARTICLES){ + if (countTrks == 1) { + dedx[0][typeParticle] = track.tpcSignal(); + twinParticles = typeParticle; + } + else if (countTrks == 2) { + dedx[1][typeParticle] = track.tpcSignal(); + if (twinParticles == typeParticle){ + isTwinParticles = true; + } + } + else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); + } + } + } + registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC[0],dedxVC[1]); + // pairs of different particles are filled in the following histograms, but outside of the range + registry.get(HIST("hTPCsignalElectrons"))->Fill(dedx[0][P_ELECTRON],dedx[1][P_ELECTRON]); + registry.get(HIST("hTPCsignalMuons"))->Fill(dedx[0][P_MUON],dedx[1][P_MUON]); + registry.get(HIST("hTPCsignalPions"))->Fill(dedx[0][P_PION],dedx[1][P_PION]); + registry.get(HIST("hTPCsignalKaons"))->Fill(dedx[0][P_KAON],dedx[1][P_KAON]); + registry.get(HIST("hTPCsignalProtons"))->Fill(dedx[0][P_PROTON],dedx[1][P_PROTON]); + registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); + registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); + registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); + registry.get(HIST("hMotherPwide"))->Fill(sumOfVertexTracks.P()); + registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); + registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); + registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); + if (isTwinParticles){ + if (twinParticles == P_ELECTRON) registry.get(HIST("hInvariantMassElEl"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_MUON) registry.get(HIST("hInvariantMassMuMu"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_PION) registry.get(HIST("hInvariantMassPiPi"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_KAON) registry.get(HIST("hInvariantMassKaKa"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_PROTON) registry.get(HIST("hInvariantMassPrPr"))->Fill(sumOfVertexTracks.M()); + } + } + + } // end processCentralBarrel + + + PROCESS_SWITCH(CentralBarrelAnalyzerRL, processCentralBarrel, "Iterate central barrel data using UD tables", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-central-barrel-rl"}) - }; + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"upc-central-barrel-rl"}) + }; } \ No newline at end of file From 92d6fd276404a6208be27cc49586f6aef31be7ef Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 09:19:40 +0100 Subject: [PATCH 19/29] found one hidden tab -> changing it to space --- PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx index 1bcf6507235..b9427e758da 100644 --- a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx @@ -84,7 +84,7 @@ struct CentralBarrelAnalyzerRL { Configurable applySingleTrackCut{"applySingleTrackCut", 0, {"Apply selection n on track, applyTrackCuts must be at maximum for full usage; default it no cut."}}; // declare filters -// Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; +// Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; // declare shortcuts using FullTracks = soa::Join; From 8e80f1aab154101654614b5c56d2c3eb87fd5b39 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 09:27:23 +0100 Subject: [PATCH 20/29] clang formating? --- PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx index b9427e758da..0113ba219dc 100644 --- a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx @@ -84,7 +84,7 @@ struct CentralBarrelAnalyzerRL { Configurable applySingleTrackCut{"applySingleTrackCut", 0, {"Apply selection n on track, applyTrackCuts must be at maximum for full usage; default it no cut."}}; // declare filters -// Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; + // Filter nCollisionContributorsFilter = aod::collision::numContrib > 2; // declare shortcuts using FullTracks = soa::Join; From 91a74807874473657e71ccfa5fa1f6440de41fc4 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 09:41:30 +0100 Subject: [PATCH 21/29] improvement of FITinfo function --- PWGUD/Core/RLhelper.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index 6b747dae5fe..e4a086abdaa 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -153,20 +153,17 @@ bool isFITempty(T const& FITinfo) // Return true if FIT had no signal { // check FT0 signal - bool hasNoFT0 = true; bool isBB = FITinfo.bbFT0A() || FITinfo.bbFT0C(); bool isBG = FITinfo.bgFT0A() || FITinfo.bgFT0C(); - hasNoFT0 = !isBB && !isBG; + bool hasNoFT0 = !isBB && !isBG; // check FV0 signal - bool hasNoFV0A = true; isBB = FITinfo.bbFV0A(); isBG = FITinfo.bgFV0A(); - hasNoFV0A = !isBB && !isBG; + bool hasNoFV0A = !isBB && !isBG; // check FDD signal - bool hasNoFDD = true; isBB = FITinfo.bbFDDA() || FITinfo.bbFDDC(); isBG = FITinfo.bgFDDA() || FITinfo.bgFDDC(); - hasNoFDD = !isBB && !isBG; + bool hasNoFDD = !isBB && !isBG; if (hasNoFT0 && hasNoFV0A && hasNoFDD) return true; else return false; From 2b7f7833c6cacdc3ebaf7237f862a05c429e88f6 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 22 Nov 2022 08:42:00 +0000 Subject: [PATCH 22/29] Please consider the following formatting changes --- PWGUD/Core/RLhelper.h | 370 +++++++++++++-------- PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx | 255 +++++++------- 2 files changed, 362 insertions(+), 263 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index e4a086abdaa..0adb223b46c 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -22,7 +22,11 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -enum MyParticle { P_ELECTRON = 0, P_MUON = 1, P_PION = 2, P_KAON = 3, P_PROTON = 4}; +enum MyParticle { P_ELECTRON = 0, + P_MUON = 1, + P_PION = 2, + P_KAON = 3, + P_PROTON = 4 }; template int testPIDhypothesis(T trackPIDinfo) @@ -47,55 +51,66 @@ int testPIDhypothesis(T trackPIDinfo) int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); // do PID using TPC+TOF - if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()){ - if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION){ - if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon - else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton + if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()) { + if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION) { + if (enumChoiceTOF == P_KAON) + return P_KAON; // probably kaon + else if (enumChoiceTOF == P_PROTON) + return P_PROTON; // probably proton else { - if (enumChoiceTPC == P_ELECTRON) return P_ELECTRON; // probably electron - else if (enumChoiceTPC == P_MUON) return P_MUON; // probably muon - else return P_PION; // probably pion + if (enumChoiceTPC == P_ELECTRON) + return P_ELECTRON; // probably electron + else if (enumChoiceTPC == P_MUON) + return P_MUON; // probably muon + else + return P_PION; // probably pion } - } - else { - if (enumChoiceTOF == P_KAON ) return P_KAON; // probably kaon - else if (enumChoiceTOF == P_PROTON) return P_PROTON; // probably proton + } else { + if (enumChoiceTOF == P_KAON) + return P_KAON; // probably kaon + else if (enumChoiceTOF == P_PROTON) + return P_PROTON; // probably proton else { - if (enumChoiceTPCpick == P_ELECTRON) return P_ELECTRON; // probably misidentified electron - else if (enumChoiceTPCpick == P_MUON) return P_MUON; // probably misidentified muon - else if (enumChoiceTPCpick == P_PION) return P_PION; // probably misidentified pion + if (enumChoiceTPCpick == P_ELECTRON) + return P_ELECTRON; // probably misidentified electron + else if (enumChoiceTPCpick == P_MUON) + return P_MUON; // probably misidentified muon + else if (enumChoiceTPCpick == P_PION) + return P_PION; // probably misidentified pion } } } // do PID using TPC only - else if (trackPIDinfo.hasTPC()) return enumChoiceTPC; + else if (trackPIDinfo.hasTPC()) + return enumChoiceTPC; // do PID using TOF only - else if (trackPIDinfo.hasTOF()) return enumChoiceTOF; + else if (trackPIDinfo.hasTOF()) + return enumChoiceTOF; // give warning and return non-sense else { - LOGF(warning,"testPIDhypothesis failed - track did not leave information in TPC or TOF"); + LOGF(warning, "testPIDhypothesis failed - track did not leave information in TPC or TOF"); return -1; } return -1; } - float momentum(float px, float py, float pz) // Just a simple function to return momentum { - return TMath::Sqrt(px*px+py*py+pz*py); + return TMath::Sqrt(px * px + py * py + pz * py); } float invariantMass(float E, float px, float py, float pz) // Just a simple function to return invariant mass { - return TMath::Sqrt(E*E-px*px-py*py-pz*py); + return TMath::Sqrt(E * E - px * px - py * py - pz * py); } float phi(float px, float py) // Just a simple function to return azimuthal angle { - if (px!=0) return TMath::ATan(py/px); + if (px != 0) + return TMath::ATan(py / px); return -999.; } @@ -103,39 +118,45 @@ float eta(float px, float py, float pz) // Just a simple function to return pseudorapidity { float eta = -999.; - float mom = momentum(px,py,pz); - if (mom!=0) eta = TMath::ATanH(pz/mom); - if (-1. int getElectronCharge(E const& generatedElectron) // Check if particle is electron or positron and return charge accordingly. Return zero if particle is not electron/positron { - if (generatedElectron.pdgCode() == 11) return -1; - else if (generatedElectron.pdgCode() == -11) return 1; - else return 0; + if (generatedElectron.pdgCode() == 11) + return -1; + else if (generatedElectron.pdgCode() == -11) + return 1; + else + return 0; } template int64_t getEvSelsIndexOfThisCollisionBC(Es const& infoEvSels, uint64_t globalBC) // reads full event selection table end return global index corresponding to given global BC. Return -1 when fails. { - for (auto& infoEvSel : infoEvSels){ - if (infoEvSel.bcId() == globalBC) return infoEvSel.globalIndex(); + for (auto& infoEvSel : infoEvSels) { + if (infoEvSel.bcId() == globalBC) + return infoEvSel.globalIndex(); } return -1; } @@ -144,8 +165,10 @@ template bool isEvSelFITempty(C const& collision) // Get FIT information from EventSelection task for each collision { - if (collision.has_foundFT0() || collision.has_foundFV0() || collision.has_foundFDD()) return false; - else return true; + if (collision.has_foundFT0() || collision.has_foundFV0() || collision.has_foundFDD()) + return false; + else + return true; } template @@ -165,8 +188,10 @@ bool isFITempty(T const& FITinfo) isBG = FITinfo.bgFDDA() || FITinfo.bgFDDC(); bool hasNoFDD = !isBB && !isBG; - if (hasNoFT0 && hasNoFV0A && hasNoFDD) return true; - else return false; + if (hasNoFT0 && hasNoFV0A && hasNoFDD) + return true; + else + return false; } template @@ -174,14 +199,16 @@ bool isUDprimaryTrack(T const& udtrack) // TrackSelection::kPrimaryTracks = kGoldenChi2 | kDCAxy | kDCAz; { // temporary hardcoded input - float maxDcaXY = 0.5;// in mm - float maxDcaZ = 2.;// in mm + float maxDcaXY = 0.5; // in mm + float maxDcaZ = 2.; // in mm // selection GoldenChi2 // seems to be always true for Run 3... at least it is not coded // selection DCAxy - if (abs(udtrack.dcaXY()) > maxDcaXY) return false; + if (abs(udtrack.dcaXY()) > maxDcaXY) + return false; // selection DCAz - if (abs(udtrack.dcaZ()) > maxDcaZ) return false; + if (abs(udtrack.dcaZ()) > maxDcaZ) + return false; // passed all selections return true; } @@ -191,15 +218,17 @@ bool isUDinAcceptanceTrack(T const& udtrack) // TrackSelection::kInAcceptanceTracks = kPtRange | kEtaRange; { // temporary hardcoded input - float minPt = 0.;// in GeV + float minPt = 0.; // in GeV float minEta = -10.; - float maxPt = 10.;// in GeV + float maxPt = 10.; // in GeV float maxEta = 10.; - float currentEta = eta(udtrack.px(),udtrack.py(),udtrack.pz()); + float currentEta = eta(udtrack.px(), udtrack.py(), udtrack.pz()); // selection pt - if (udtrack.pt() < minPt || udtrack.pt() > maxPt) return false; + if (udtrack.pt() < minPt || udtrack.pt() > maxPt) + return false; // selection eta - if (currentEta < minEta || currentEta > maxEta) return false; + if (currentEta < minEta || currentEta > maxEta) + return false; // passed all selections return true; } @@ -220,23 +249,31 @@ bool isUDqualityTrack(T const& udtrack) // ITS hits // TODO //ignoring for the moment (some crazy function which I haven't found anywhere to be used) // ITS refit - if (!udtrack.hasITS()) return false; + if (!udtrack.hasITS()) + return false; // ITS chi2/ndf - if (udtrack.itsChi2NCl() > cutITSchi2ndf) return false; + if (udtrack.itsChi2NCl() > cutITSchi2ndf) + return false; // ITS n clusters - if (udtrack.itsNCls() < cutNitsClusters) return false; + if (udtrack.itsNCls() < cutNitsClusters) + return false; // TPC refit - if (!udtrack.hasTPC()) return false; + if (!udtrack.hasTPC()) + return false; // TPC chi2/ndf - if (udtrack.tpcChi2NCl() > cutTPCchi2ndf) return false; + if (udtrack.tpcChi2NCl() > cutTPCchi2ndf) + return false; // TPC n clusters int16_t nFoundClusters = udtrack.tpcNClsFindable() - udtrack.tpcNClsFindableMinusFound(); - if (nFoundClusters < cutNtpcClusters) return false; + if (nFoundClusters < cutNtpcClusters) + return false; // TPC crossed rows - if (udtrack.tpcNClsCrossedRows() < cutNtpcCrossedRows) return false; + if (udtrack.tpcNClsCrossedRows() < cutNtpcCrossedRows) + return false; // TPC crossed rows over n clusters - float crossedRowsOverNclusters = (float)udtrack.tpcNClsCrossedRows()/nFoundClusters; - if (crossedRowsOverNclusters < cutCrossedRowsOverNclusters) return false; + float crossedRowsOverNclusters = (float)udtrack.tpcNClsCrossedRows() / nFoundClusters; + if (crossedRowsOverNclusters < cutCrossedRowsOverNclusters) + return false; // passed all selections return true; } @@ -245,9 +282,12 @@ template bool isUDglobalTrack(T const& udtrack) // combine quality+primary+acceptance { - if (!isUDinAcceptanceTrack(udtrack)) return false; - if (!isUDprimaryTrack(udtrack)) return false; - if (!isUDqualityTrack(udtrack)) return false; + if (!isUDinAcceptanceTrack(udtrack)) + return false; + if (!isUDprimaryTrack(udtrack)) + return false; + if (!isUDqualityTrack(udtrack)) + return false; return true; } @@ -256,17 +296,22 @@ bool trackSelection(T const& udtrack, int selection) // Do selection of reconstructed track { - if (selection==0) return true; + if (selection == 0) + return true; // Is central barrel propagated track // TODO //if (selection==1 && udtrack.trackType()!=1) return false; // Is central barrel vertex contributor - if (selection==2 && udtrack.isPVContributor()!=1) return false; + if (selection == 2 && udtrack.isPVContributor() != 1) + return false; // Is central barrel track selection global track - if (selection==3 && isUDqualityTrack(udtrack)!=1) return false; + if (selection == 3 && isUDqualityTrack(udtrack) != 1) + return false; // Is central barrel track selection global track - if (selection==4 && isUDprimaryTrack(udtrack)!=1) return false; + if (selection == 4 && isUDprimaryTrack(udtrack) != 1) + return false; // Is central barrel track selection global track - if (selection==5 && isUDglobalTrack(udtrack)!=1) return false; + if (selection == 5 && isUDglobalTrack(udtrack) != 1) + return false; return true; } @@ -275,102 +320,133 @@ template bool selectTrack(T const& track, int setOfCuts) // Do selection of reconstructed track { - if (setOfCuts<1) return true; + if (setOfCuts < 1) + return true; // Is central barrel propagated track) - if (setOfCuts<2 && trackSelection(track,1)!=1) return false; + if (setOfCuts < 2 && trackSelection(track, 1) != 1) + return false; // Is central barrel vertex contributor - if (setOfCuts<3 && trackSelection(track,2)!=1) return false; + if (setOfCuts < 3 && trackSelection(track, 2) != 1) + return false; return true; } -template < typename C> -void fillEventSelectionHistogram(HistogramRegistry ®istry, C const& collision) +template +void fillEventSelectionHistogram(HistogramRegistry& registry, C const& collision) // Fill into histogram information from EventSelection task for each collision { for (int i = 0; i < kNsel; i++) { - if(collision.selection()[i]) registry.get(HIST("hEventSelectionTaskParameters"))->Fill(i); + if (collision.selection()[i]) + registry.get(HIST("hEventSelectionTaskParameters"))->Fill(i); } const int nXbins = registry.get(HIST("hEventSelectionTask"))->GetXaxis()->GetNbins(); registry.get(HIST("hEventSelectionTask"))->SetNdivisions(nXbins, "X"); - if (collision.sel7()) registry.get(HIST("hEventSelectionTask"))->Fill(0); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(1,70,0.02,30,-1,-1,"sel7"); - if (collision.sel8()) registry.get(HIST("hEventSelectionTask"))->Fill(1); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(2,70,0.02,30,-1,-1,"sel8"); - if (collision.bbV0A()) registry.get(HIST("hEventSelectionTask"))->Fill(2); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(3,70,0.02,30,-1,-1,"bbV0A"); - if (collision.bbV0C()) registry.get(HIST("hEventSelectionTask"))->Fill(3); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(4,70,0.02,30,-1,-1,"bbV0C"); - if (collision.bgV0A()) registry.get(HIST("hEventSelectionTask"))->Fill(4); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(5,70,0.02,30,-1,-1,"bgV0A"); - if (collision.bgV0C()) registry.get(HIST("hEventSelectionTask"))->Fill(5); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(6,70,0.02,30,-1,-1,"bgV0C"); - if (collision.bbFDA()) registry.get(HIST("hEventSelectionTask"))->Fill(6); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(7,70,0.02,30,-1,-1,"bbFDA"); - if (collision.bbFDC()) registry.get(HIST("hEventSelectionTask"))->Fill(7); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(8,70,0.02,30,-1,-1,"bbFDC"); - if (collision.bgFDA()) registry.get(HIST("hEventSelectionTask"))->Fill(8); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(9,70,0.02,30,-1,-1,"bgFDA"); - if (collision.bgFDC()) registry.get(HIST("hEventSelectionTask"))->Fill(9); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(10,70,0.02,30,-1,-1,"bgFDC"); - if (collision.has_foundBC()) registry.get(HIST("hEventSelectionTask"))->Fill(10); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(11,70,0.02,30,-1,-1,"has_foundBC"); - if (collision.has_foundFT0()) registry.get(HIST("hEventSelectionTask"))->Fill(11); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(12,70,0.02,30,-1,-1,"has_foundFT0"); - if (collision.has_foundFV0()) registry.get(HIST("hEventSelectionTask"))->Fill(12); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(13,70,0.02,30,-1,-1,"has_foundFV0"); - if (collision.has_foundFDD()) registry.get(HIST("hEventSelectionTask"))->Fill(13); - registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(14,70,0.02,30,-1,-1,"has_foundFDD"); - + if (collision.sel7()) + registry.get(HIST("hEventSelectionTask"))->Fill(0); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(1, 70, 0.02, 30, -1, -1, "sel7"); + if (collision.sel8()) + registry.get(HIST("hEventSelectionTask"))->Fill(1); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(2, 70, 0.02, 30, -1, -1, "sel8"); + if (collision.bbV0A()) + registry.get(HIST("hEventSelectionTask"))->Fill(2); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(3, 70, 0.02, 30, -1, -1, "bbV0A"); + if (collision.bbV0C()) + registry.get(HIST("hEventSelectionTask"))->Fill(3); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(4, 70, 0.02, 30, -1, -1, "bbV0C"); + if (collision.bgV0A()) + registry.get(HIST("hEventSelectionTask"))->Fill(4); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(5, 70, 0.02, 30, -1, -1, "bgV0A"); + if (collision.bgV0C()) + registry.get(HIST("hEventSelectionTask"))->Fill(5); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(6, 70, 0.02, 30, -1, -1, "bgV0C"); + if (collision.bbFDA()) + registry.get(HIST("hEventSelectionTask"))->Fill(6); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(7, 70, 0.02, 30, -1, -1, "bbFDA"); + if (collision.bbFDC()) + registry.get(HIST("hEventSelectionTask"))->Fill(7); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(8, 70, 0.02, 30, -1, -1, "bbFDC"); + if (collision.bgFDA()) + registry.get(HIST("hEventSelectionTask"))->Fill(8); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(9, 70, 0.02, 30, -1, -1, "bgFDA"); + if (collision.bgFDC()) + registry.get(HIST("hEventSelectionTask"))->Fill(9); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(10, 70, 0.02, 30, -1, -1, "bgFDC"); + if (collision.has_foundBC()) + registry.get(HIST("hEventSelectionTask"))->Fill(10); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(11, 70, 0.02, 30, -1, -1, "has_foundBC"); + if (collision.has_foundFT0()) + registry.get(HIST("hEventSelectionTask"))->Fill(11); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(12, 70, 0.02, 30, -1, -1, "has_foundFT0"); + if (collision.has_foundFV0()) + registry.get(HIST("hEventSelectionTask"))->Fill(12); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(13, 70, 0.02, 30, -1, -1, "has_foundFV0"); + if (collision.has_foundFDD()) + registry.get(HIST("hEventSelectionTask"))->Fill(13); + registry.get(HIST("hEventSelectionTask"))->GetXaxis()->ChangeLabel(14, 70, 0.02, 30, -1, -1, "has_foundFDD"); } template -void fillTrackSelectionHistogram(HistogramRegistry ®istry, Ts const& tracks, C const& collision) +void fillTrackSelectionHistogram(HistogramRegistry& registry, Ts const& tracks, C const& collision) // Fill into histogram effect of track selection for all tracks { const int nXbins = registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->GetNbins(); registry.get(HIST("hEffectOfTrackSelections"))->SetNdivisions(nXbins, "X"); - for (auto& track : tracks){ - if (trackSelection(track,0)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(0); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(1,70,0.02,30,-1,-1,"no cut"); - if (trackSelection(track,1)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(1); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(2,70,0.02,30,-1,-1,"propagated"); - if (trackSelection(track,3)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(2); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(3,70,0.02,30,-1,-1,"quality"); - if (trackSelection(track,4)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(3); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(4,70,0.02,30,-1,-1,"primary"); - if (trackSelection(track,5)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(4); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(5,70,0.02,30,-1,-1,"global"); - if (trackSelection(track,2)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(5); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(6,70,0.02,30,-1,-1,"PV contributor"); - - - if (!trackSelection(track,2)) continue; - if (!trackSelection(track,5)) continue; + for (auto& track : tracks) { + if (trackSelection(track, 0)) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(0); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(1, 70, 0.02, 30, -1, -1, "no cut"); + if (trackSelection(track, 1)) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(1); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(2, 70, 0.02, 30, -1, -1, "propagated"); + if (trackSelection(track, 3)) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(2); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(3, 70, 0.02, 30, -1, -1, "quality"); + if (trackSelection(track, 4)) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(3); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(4, 70, 0.02, 30, -1, -1, "primary"); + if (trackSelection(track, 5)) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(4); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(5, 70, 0.02, 30, -1, -1, "global"); + if (trackSelection(track, 2)) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(5); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(6, 70, 0.02, 30, -1, -1, "PV contributor"); + + if (!trackSelection(track, 2)) + continue; + if (!trackSelection(track, 5)) + continue; bool hasITS = track.hasITS(); bool hasTPC = track.hasTPC(); bool hasTOF = track.hasTOF(); - if (hasITS) registry.get(HIST("hEffectOfTrackSelections"))->Fill(10); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(11,70,0.02,30,-1,-1,"ITS"); - if (hasTPC) registry.get(HIST("hEffectOfTrackSelections"))->Fill(11); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(12,70,0.02,30,-1,-1,"TPC"); - if (hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(12); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(13,70,0.02,30,-1,-1,"TOF"); - if (hasITS && hasTPC) registry.get(HIST("hEffectOfTrackSelections"))->Fill(13); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(14,70,0.02,30,-1,-1,"ITS+TPC"); - if (hasITS && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(14); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(15,70,0.02,30,-1,-1,"ITS+TOF"); - if (hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(15); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(16,70,0.02,30,-1,-1,"TPC+TOF"); - if (hasITS && hasTPC && hasTOF) registry.get(HIST("hEffectOfTrackSelections"))->Fill(16); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(17,70,0.02,30,-1,-1,"ITS+TPC+TOF"); - if (isFITempty(collision)) registry.get(HIST("hEffectOfTrackSelections"))->Fill(17); - registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(18,70,0.02,30,-1,-1,"FIT empty"); - + if (hasITS) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(10); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(11, 70, 0.02, 30, -1, -1, "ITS"); + if (hasTPC) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(11); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(12, 70, 0.02, 30, -1, -1, "TPC"); + if (hasTOF) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(12); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(13, 70, 0.02, 30, -1, -1, "TOF"); + if (hasITS && hasTPC) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(13); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(14, 70, 0.02, 30, -1, -1, "ITS+TPC"); + if (hasITS && hasTOF) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(14); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(15, 70, 0.02, 30, -1, -1, "ITS+TOF"); + if (hasTPC && hasTOF) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(15); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(16, 70, 0.02, 30, -1, -1, "TPC+TOF"); + if (hasITS && hasTPC && hasTOF) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(16); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(17, 70, 0.02, 30, -1, -1, "ITS+TPC+TOF"); + if (isFITempty(collision)) + registry.get(HIST("hEffectOfTrackSelections"))->Fill(17); + registry.get(HIST("hEffectOfTrackSelections"))->GetXaxis()->ChangeLabel(18, 70, 0.02, 30, -1, -1, "FIT empty"); } } @@ -378,8 +454,8 @@ template void printTrackData(T const& track) // Function to print basic info on track { - LOGF(info,"Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d", - track.globalIndex(),track.isPVContributor(),track.hasITS(),track.hasTPC(),track.hasTOF()); + LOGF(info, "Track idx %d, vtx contributor %d, hasITS %d, hasTPC %d, hasTOF %d", + track.globalIndex(), track.isPVContributor(), track.hasITS(), track.hasTPC(), track.hasTOF()); } template @@ -389,8 +465,8 @@ void printTrackParticleData(T const& track) printTrackData(track); if (track.has_udMcParticle()) { auto mcparticle = track.udMcParticle(); - LOGF(info," Associated MC particle idx %d, primary %d, PDG code %d", - mcparticle.globalIndex(),mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); + LOGF(info, " Associated MC particle idx %d, primary %d, PDG code %d", + mcparticle.globalIndex(), mcparticle.isPhysicalPrimary(), mcparticle.pdgCode()); } } @@ -399,29 +475,31 @@ void printCollisionTracksData(Ts const& tracks, int setOfCuts) // Function to loop over tracks associated to a collision and print basic info { int countNoMCparticle = 0; - for (auto& track : tracks){ - if (!selectTrack(track,setOfCuts)) continue; + for (auto& track : tracks) { + if (!selectTrack(track, setOfCuts)) + continue; if (track.has_udMcParticle()) { printTrackParticleData(track); - } - else countNoMCparticle++; + } else + countNoMCparticle++; } - if (countNoMCparticle > 0) LOGF(warning,"This collision has %d tracks without associated mc particle",countNoMCparticle); + if (countNoMCparticle > 0) + LOGF(warning, "This collision has %d tracks without associated mc particle", countNoMCparticle); } template -void printCollisionGeneratedParticles(MPs const& particles, P const& slice, C const& collision){ +void printCollisionGeneratedParticles(MPs const& particles, P const& slice, C const& collision) +{ auto slicedParticles = particles.sliceBy(slice, collision.mcCollision().globalIndex()); - for (auto& slicedParticle : slicedParticles){ - LOGF(info,"Particle idx %d, primary %d",slicedParticle.globalIndex(),slicedParticle.isPhysicalPrimary()); + for (auto& slicedParticle : slicedParticles) { + LOGF(info, "Particle idx %d, primary %d", slicedParticle.globalIndex(), slicedParticle.isPhysicalPrimary()); } } void printLargeMessage(std::string info) // Helper to printf info message to terminal { - LOGF(info,"################################### %s ###################################",info); + LOGF(info, "################################### %s ###################################", info); } - #endif //ALISW_RLHELPER_H diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx index 0113ba219dc..7d8631beeec 100644 --- a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx @@ -40,41 +40,38 @@ struct CentralBarrelAnalyzerRL { HistogramRegistry registry{ "registry", - { - {"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEffectOfTrackSelections", "Effect of track cuts;Selection (-);Number of tracks (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEventSelectionTask", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {20,-0.5,19.5} } } }, - {"hEventSelectionTaskParameters", ";Selection (-);Number of events (-)", { HistType::kTH1D, { {kNsel,-0.5,kNsel-0.5} } } }, - {"hNcontributionsToCollision", ";Number of contributions in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNtracks", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNtracksWide", ";Number of tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {1000,-0.5,999.5} } } }, - {"hNcontributionsToVertex", ";Number of contributors to vertex (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hNprimaryTracks", ";Number of primary tracks in a collision (-);Number of events (-)", { HistType::kTH1D, { {30,-0.5,29.5} } } }, - {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,2.8,3.4} } } }, - {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassElEl", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassMuMu", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassPiPi", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassKaKa", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hInvariantMassPrPr", ";Invariant mass (GeV/c^{2});Number of events (-)", { HistType::kTH1D, { {1200,1.0,5.} } } }, - {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, - {"hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, - {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,2.} } } }, - {"hMotherPhi", ";Mother #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-TMath::Pi(),TMath::Pi()} } } }, - {"hMotherRapidity", ";Mother #y (-);Number of events (-)", { HistType::kTH1D, { {500,-2.,2.} } } }, - {"hVtxZ", ";Vertex z-position (cm);Number of events (-)", { HistType::kTH1D, { {1000,-30.,30.} } } }, - {"hVtxTransversal", ";Vertex x-position (cm);Vertex y-position (cm)", { HistType::kTH2D, { {1000,-0.1,0.1}, {1000,-0.1,0.1} } } }, - {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 200,0.,2. }, { 950,10.,200. } } } }, - {"hTPCsignalVtxContributors", ";Vtx contributor 1 - TPC d#it{E}/d#it{x} (arb. units);Vtx contributor 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, - {"hTPCsignalElectrons", ";Identified electron 1 - TPC d#it{E}/d#it{x} (arb. units);Identified electron 2 - TPC d#it{E}/d#it{x} (arb. units)", { HistType::kTH2F, { { 950,10.,200. }, { 950,10.,200. } } } }, - {"hTrackP", ";Track #it{p} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,10.} } } }, - {"hTrackPt", ";Track #it{p_{#rm T}} (GeV/c);Number of events (-)", { HistType::kTH1D, { {500,0.,5.} } } }, - {"hTrackPhi", ";Track #phi (rad);Number of events (-)", { HistType::kTH1D, { {50,-2*TMath::Pi(),2*TMath::Pi()} } } }, - {"hTrackEta", ";Track #eta (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } }, - {"hTrackEnergy", ";Track Energy (GeV);Number of events (-)", { HistType::kTH1D, { {500,0.,100.} } } }, - {"hTrackRapidity", ";Track rapidity (-);Number of events (-)", { HistType::kTH1D, { {500,-7.,7.} } } } - } - }; + {{"hEffectOfSelections", "Effect of cuts;Selection (-);Number of events (-)", {HistType::kTH1D, {{20, -0.5, 19.5}}}}, + {"hEffectOfTrackSelections", "Effect of track cuts;Selection (-);Number of tracks (-)", {HistType::kTH1D, {{20, -0.5, 19.5}}}}, + {"hEventSelectionTask", ";Selection (-);Number of events (-)", {HistType::kTH1D, {{20, -0.5, 19.5}}}}, + {"hEventSelectionTaskParameters", ";Selection (-);Number of events (-)", {HistType::kTH1D, {{kNsel, -0.5, kNsel - 0.5}}}}, + {"hNcontributionsToCollision", ";Number of contributions in a collision (-);Number of events (-)", {HistType::kTH1D, {{30, -0.5, 29.5}}}}, + {"hNtracks", ";Number of tracks in a collision (-);Number of events (-)", {HistType::kTH1D, {{30, -0.5, 29.5}}}}, + {"hNtracksWide", ";Number of tracks in a collision (-);Number of events (-)", {HistType::kTH1D, {{1000, -0.5, 999.5}}}}, + {"hNcontributionsToVertex", ";Number of contributors to vertex (-);Number of events (-)", {HistType::kTH1D, {{30, -0.5, 29.5}}}}, + {"hNprimaryTracks", ";Number of primary tracks in a collision (-);Number of events (-)", {HistType::kTH1D, {{30, -0.5, 29.5}}}}, + {"hInvariantMass", ";Invariant mass (GeV/c^{2});Number of events (-)", {HistType::kTH1D, {{1200, 2.8, 3.4}}}}, + {"hInvariantMassWide", ";Invariant mass (GeV/c^{2});Number of events (-)", {HistType::kTH1D, {{1200, 1.0, 5.}}}}, + {"hInvariantMassElEl", ";Invariant mass (GeV/c^{2});Number of events (-)", {HistType::kTH1D, {{1200, 1.0, 5.}}}}, + {"hInvariantMassMuMu", ";Invariant mass (GeV/c^{2});Number of events (-)", {HistType::kTH1D, {{1200, 1.0, 5.}}}}, + {"hInvariantMassPiPi", ";Invariant mass (GeV/c^{2});Number of events (-)", {HistType::kTH1D, {{1200, 1.0, 5.}}}}, + {"hInvariantMassKaKa", ";Invariant mass (GeV/c^{2});Number of events (-)", {HistType::kTH1D, {{1200, 1.0, 5.}}}}, + {"hInvariantMassPrPr", ";Invariant mass (GeV/c^{2});Number of events (-)", {HistType::kTH1D, {{1200, 1.0, 5.}}}}, + {"hMotherP", ";Mother #it{p} (GeV/c);Number of events (-)", {HistType::kTH1D, {{500, 0., 2.}}}}, + {"hMotherPwide", ";Mother #it{p} (GeV/c);Number of events (-)", {HistType::kTH1D, {{500, 0., 10.}}}}, + {"hMotherPt", ";Mother #it{p_{#rm T}} (GeV/c);Number of events (-)", {HistType::kTH1D, {{500, 0., 2.}}}}, + {"hMotherPhi", ";Mother #phi (rad);Number of events (-)", {HistType::kTH1D, {{50, -TMath::Pi(), TMath::Pi()}}}}, + {"hMotherRapidity", ";Mother #y (-);Number of events (-)", {HistType::kTH1D, {{500, -2., 2.}}}}, + {"hVtxZ", ";Vertex z-position (cm);Number of events (-)", {HistType::kTH1D, {{1000, -30., 30.}}}}, + {"hVtxTransversal", ";Vertex x-position (cm);Vertex y-position (cm)", {HistType::kTH2D, {{1000, -0.1, 0.1}, {1000, -0.1, 0.1}}}}, + {"hTPCsignalVsMom", "All tracks;#it{p} (GeV/#it{c});TPC d#it{E}/d#it{x} (arb. units)", {HistType::kTH2F, {{200, 0., 2.}, {950, 10., 200.}}}}, + {"hTPCsignalVtxContributors", ";Vtx contributor 1 - TPC d#it{E}/d#it{x} (arb. units);Vtx contributor 2 - TPC d#it{E}/d#it{x} (arb. units)", {HistType::kTH2F, {{950, 10., 200.}, {950, 10., 200.}}}}, + {"hTPCsignalElectrons", ";Identified electron 1 - TPC d#it{E}/d#it{x} (arb. units);Identified electron 2 - TPC d#it{E}/d#it{x} (arb. units)", {HistType::kTH2F, {{950, 10., 200.}, {950, 10., 200.}}}}, + {"hTrackP", ";Track #it{p} (GeV/c);Number of events (-)", {HistType::kTH1D, {{500, 0., 10.}}}}, + {"hTrackPt", ";Track #it{p_{#rm T}} (GeV/c);Number of events (-)", {HistType::kTH1D, {{500, 0., 5.}}}}, + {"hTrackPhi", ";Track #phi (rad);Number of events (-)", {HistType::kTH1D, {{50, -2 * TMath::Pi(), 2 * TMath::Pi()}}}}, + {"hTrackEta", ";Track #eta (-);Number of events (-)", {HistType::kTH1D, {{500, -7., 7.}}}}, + {"hTrackEnergy", ";Track Energy (GeV);Number of events (-)", {HistType::kTH1D, {{500, 0., 100.}}}}, + {"hTrackRapidity", ";Track rapidity (-);Number of events (-)", {HistType::kTH1D, {{500, -7., 7.}}}}}}; // declare configurables Configurable verboseInfo{"verboseInfo", true, {"Print general info to terminal; default it true."}}; @@ -91,59 +88,71 @@ struct CentralBarrelAnalyzerRL { using FullCollision = soa::Join::iterator; // init - void init(InitContext&){ - if (verboseInfo) printLargeMessage("INIT METHOD"); + void init(InitContext&) + { + if (verboseInfo) + printLargeMessage("INIT METHOD"); countCollisions = 0; } // end init // run - void run(ProcessingContext& context){ + void run(ProcessingContext& context) + { - if (verboseInfo) printLargeMessage("RUN METHOD"); - if (verboseDebug) LOGF(info,"countCollisions = %d",countCollisions); + if (verboseInfo) + printLargeMessage("RUN METHOD"); + if (verboseDebug) + LOGF(info, "countCollisions = %d", countCollisions); } // end run // process void processCentralBarrel(FullCollision const& collision, - FullTracks const& tracks, - soa::Join const& infoEventSelection){ + FullTracks const& tracks, + soa::Join const& infoEventSelection) + { const float P_MASS[5] = {constants::physics::MassElectron, - constants::physics::MassMuon, - constants::physics::MassPionCharged, - constants::physics::MassKaonCharged, - constants::physics::MassProton}; + constants::physics::MassMuon, + constants::physics::MassPionCharged, + constants::physics::MassKaonCharged, + constants::physics::MassProton}; - if (verboseInfo) printLargeMessage("NEW COLLISION"); + if (verboseInfo) + printLargeMessage("NEW COLLISION"); countCollisions++; registry.get(HIST("hEffectOfSelections"))->Fill(0); - auto thisCollisionEventSelectionInfo = infoEventSelection.iteratorAt(getEvSelsIndexOfThisCollisionBC(infoEventSelection,collision.globalBC())); - fillEventSelectionHistogram(registry,thisCollisionEventSelectionInfo); - fillTrackSelectionHistogram(registry,tracks,collision); + auto thisCollisionEventSelectionInfo = infoEventSelection.iteratorAt(getEvSelsIndexOfThisCollisionBC(infoEventSelection, collision.globalBC())); + fillEventSelectionHistogram(registry, thisCollisionEventSelectionInfo); + fillTrackSelectionHistogram(registry, tracks, collision); registry.get(HIST("hNcontributionsToCollision"))->Fill(collision.numContrib()); int nTracksInThisCollision = tracks.size(); - if (verboseDebug) LOGF(info,"collision number = %d has %d contributors",countCollisions,collision.numContrib()); + if (verboseDebug) + LOGF(info, "collision number = %d has %d contributors", countCollisions, collision.numContrib()); registry.get(HIST("hNtracks"))->Fill(nTracksInThisCollision); registry.get(HIST("hNtracksWide"))->Fill(nTracksInThisCollision); registry.get(HIST("hVtxZ"))->Fill(collision.posZ()); - registry.get(HIST("hVtxTransversal"))->Fill(collision.posX(),collision.posY()); + registry.get(HIST("hVtxTransversal"))->Fill(collision.posX(), collision.posY()); int countPrimaryTracks = 0; int countContributorsToVertex = 0; int countGlobalContributorsToVertex = 0; - for (auto& track : tracks){ - if (!selectTrack(track,applyTrackCuts)) continue; - if (trackSelection(track,2)) countContributorsToVertex++; - if (selectTrack(track,2)) countGlobalContributorsToVertex++; - if (isUDprimaryTrack(track)) countPrimaryTracks++; + for (auto& track : tracks) { + if (!selectTrack(track, applyTrackCuts)) + continue; + if (trackSelection(track, 2)) + countContributorsToVertex++; + if (selectTrack(track, 2)) + countGlobalContributorsToVertex++; + if (isUDprimaryTrack(track)) + countPrimaryTracks++; if (track.hasTPC()) { - registry.get(HIST("hTPCsignalVsMom"))->Fill(momentum(track.px(),track.py(),track.pz()),track.tpcSignal()); + registry.get(HIST("hTPCsignalVsMom"))->Fill(momentum(track.px(), track.py(), track.pz()), track.tpcSignal()); } } registry.get(HIST("hNcontributionsToVertex"))->Fill(countContributorsToVertex); @@ -152,24 +161,29 @@ struct CentralBarrelAnalyzerRL { // // Playing around // - if (verboseInfo) printLargeMessage("Primary + Global + FIT"); - for (auto& track : tracks){ - if (!trackSelection(track,2)) continue; - if (!trackSelection(track,5)) continue; - if (isFITempty(collision)) continue; - if (printMetaInfo) printTrackData(track); + if (verboseInfo) + printLargeMessage("Primary + Global + FIT"); + for (auto& track : tracks) { + if (!trackSelection(track, 2)) + continue; + if (!trackSelection(track, 5)) + continue; + if (isFITempty(collision)) + continue; + if (printMetaInfo) + printTrackData(track); float trkPx = track.px(); float trkPy = track.py(); float trkPz = track.pz(); - registry.get(HIST("hTrackP"))->Fill(momentum(trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackP"))->Fill(momentum(trkPx, trkPy, trkPz)); registry.get(HIST("hTrackPt"))->Fill(track.pt()); - registry.get(HIST("hTrackPhi"))->Fill(phi(trkPx,trkPy)); - registry.get(HIST("hTrackEta"))->Fill(eta(trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackPhi"))->Fill(phi(trkPx, trkPy)); + registry.get(HIST("hTrackEta"))->Fill(eta(trkPx, trkPy, trkPz)); int typeParticle = testPIDhypothesis(track); - if (typeParticle >= 0 && typeParticle < (sizeof(P_MASS)/sizeof(float))){ + if (typeParticle >= 0 && typeParticle < (sizeof(P_MASS) / sizeof(float))) { float mass = P_MASS[typeParticle]; - registry.get(HIST("hTrackEnergy"))->Fill(energy(mass,trkPx,trkPy,trkPz)); - registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass,trkPx,trkPy,trkPz)); + registry.get(HIST("hTrackEnergy"))->Fill(energy(mass, trkPx, trkPy, trkPz)); + registry.get(HIST("hTrackRapidity"))->Fill(rapidity(mass, trkPx, trkPy, trkPz)); } } @@ -177,57 +191,63 @@ struct CentralBarrelAnalyzerRL { // fetching FT0, FDD, FV0 information // bool FITisEmpty = isFITempty(collision); - if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(1); + if (FITisEmpty) + registry.get(HIST("hEffectOfSelections"))->Fill(1); FITisEmpty = isEvSelFITempty(thisCollisionEventSelectionInfo); - if (FITisEmpty) registry.get(HIST("hEffectOfSelections"))->Fill(2); - if (countContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(3); - if (countGlobalContributorsToVertex == 2) registry.get(HIST("hEffectOfSelections"))->Fill(4); - + if (FITisEmpty) + registry.get(HIST("hEffectOfSelections"))->Fill(2); + if (countContributorsToVertex == 2) + registry.get(HIST("hEffectOfSelections"))->Fill(3); + if (countGlobalContributorsToVertex == 2) + registry.get(HIST("hEffectOfSelections"))->Fill(4); // // TPC signal info starts here // TLorentzVector sumOfVertexTracks, trackFromVertex; - float dedxVC[2] = {-999.,-999.}; - const int NPARTICLES = 5;//TODO think of more elegant way how to pass this info - float dedx[2][NPARTICLES] = {{-999.,-999.,-999.,-999.,-999.},{-999.,-999.,-999.,-999.,-999.}}; + float dedxVC[2] = {-999., -999.}; + const int NPARTICLES = 5; //TODO think of more elegant way how to pass this info + float dedx[2][NPARTICLES] = {{-999., -999., -999., -999., -999.}, {-999., -999., -999., -999., -999.}}; int countTrks = 0; if (countContributorsToVertex == 2) { int twinParticles = -1; bool isTwinParticles = false; - for (auto& track : tracks){ - if (!isUDprimaryTrack(track)) continue; + for (auto& track : tracks) { + if (!isUDprimaryTrack(track)) + continue; countTrks++; - trackFromVertex.SetPxPyPzE(track.px(),track.py(),track.pz(), - energy(constants::physics::MassElectron,track.px(),track.py(),track.pz())); - sumOfVertexTracks+=trackFromVertex; - if (track.hasTPC()){ - if (countTrks == 1) dedxVC[0] = track.tpcSignal(); - else if (countTrks == 2) dedxVC[1] = track.tpcSignal(); - else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); + trackFromVertex.SetPxPyPzE(track.px(), track.py(), track.pz(), + energy(constants::physics::MassElectron, track.px(), track.py(), track.pz())); + sumOfVertexTracks += trackFromVertex; + if (track.hasTPC()) { + if (countTrks == 1) + dedxVC[0] = track.tpcSignal(); + else if (countTrks == 2) + dedxVC[1] = track.tpcSignal(); + else + LOGP(warning, "!!!Strange behaviour in the loop, check!!!"); int typeParticle = testPIDhypothesis(track); - if (typeParticle >= 0 && typeParticle <= NPARTICLES){ - if (countTrks == 1) { - dedx[0][typeParticle] = track.tpcSignal(); - twinParticles = typeParticle; + if (typeParticle >= 0 && typeParticle <= NPARTICLES) { + if (countTrks == 1) { + dedx[0][typeParticle] = track.tpcSignal(); + twinParticles = typeParticle; + } else if (countTrks == 2) { + dedx[1][typeParticle] = track.tpcSignal(); + if (twinParticles == typeParticle) { + isTwinParticles = true; } - else if (countTrks == 2) { - dedx[1][typeParticle] = track.tpcSignal(); - if (twinParticles == typeParticle){ - isTwinParticles = true; - } - } - else LOGP(warning,"!!!Strange behaviour in the loop, check!!!"); + } else + LOGP(warning, "!!!Strange behaviour in the loop, check!!!"); } } } - registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC[0],dedxVC[1]); + registry.get(HIST("hTPCsignalVtxContributors"))->Fill(dedxVC[0], dedxVC[1]); // pairs of different particles are filled in the following histograms, but outside of the range - registry.get(HIST("hTPCsignalElectrons"))->Fill(dedx[0][P_ELECTRON],dedx[1][P_ELECTRON]); - registry.get(HIST("hTPCsignalMuons"))->Fill(dedx[0][P_MUON],dedx[1][P_MUON]); - registry.get(HIST("hTPCsignalPions"))->Fill(dedx[0][P_PION],dedx[1][P_PION]); - registry.get(HIST("hTPCsignalKaons"))->Fill(dedx[0][P_KAON],dedx[1][P_KAON]); - registry.get(HIST("hTPCsignalProtons"))->Fill(dedx[0][P_PROTON],dedx[1][P_PROTON]); + registry.get(HIST("hTPCsignalElectrons"))->Fill(dedx[0][P_ELECTRON], dedx[1][P_ELECTRON]); + registry.get(HIST("hTPCsignalMuons"))->Fill(dedx[0][P_MUON], dedx[1][P_MUON]); + registry.get(HIST("hTPCsignalPions"))->Fill(dedx[0][P_PION], dedx[1][P_PION]); + registry.get(HIST("hTPCsignalKaons"))->Fill(dedx[0][P_KAON], dedx[1][P_KAON]); + registry.get(HIST("hTPCsignalProtons"))->Fill(dedx[0][P_PROTON], dedx[1][P_PROTON]); registry.get(HIST("hInvariantMass"))->Fill(sumOfVertexTracks.M()); registry.get(HIST("hInvariantMassWide"))->Fill(sumOfVertexTracks.M()); registry.get(HIST("hMotherP"))->Fill(sumOfVertexTracks.P()); @@ -235,26 +255,27 @@ struct CentralBarrelAnalyzerRL { registry.get(HIST("hMotherPt"))->Fill(sumOfVertexTracks.Pt()); registry.get(HIST("hMotherPhi"))->Fill(sumOfVertexTracks.Phi()); registry.get(HIST("hMotherRapidity"))->Fill(sumOfVertexTracks.Rapidity()); - if (isTwinParticles){ - if (twinParticles == P_ELECTRON) registry.get(HIST("hInvariantMassElEl"))->Fill(sumOfVertexTracks.M()); - if (twinParticles == P_MUON) registry.get(HIST("hInvariantMassMuMu"))->Fill(sumOfVertexTracks.M()); - if (twinParticles == P_PION) registry.get(HIST("hInvariantMassPiPi"))->Fill(sumOfVertexTracks.M()); - if (twinParticles == P_KAON) registry.get(HIST("hInvariantMassKaKa"))->Fill(sumOfVertexTracks.M()); - if (twinParticles == P_PROTON) registry.get(HIST("hInvariantMassPrPr"))->Fill(sumOfVertexTracks.M()); + if (isTwinParticles) { + if (twinParticles == P_ELECTRON) + registry.get(HIST("hInvariantMassElEl"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_MUON) + registry.get(HIST("hInvariantMassMuMu"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_PION) + registry.get(HIST("hInvariantMassPiPi"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_KAON) + registry.get(HIST("hInvariantMassKaKa"))->Fill(sumOfVertexTracks.M()); + if (twinParticles == P_PROTON) + registry.get(HIST("hInvariantMassPrPr"))->Fill(sumOfVertexTracks.M()); } } } // end processCentralBarrel - PROCESS_SWITCH(CentralBarrelAnalyzerRL, processCentralBarrel, "Iterate central barrel data using UD tables", true); - }; - - -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"upc-central-barrel-rl"}) - }; + adaptAnalysisTask(cfgc, TaskName{"upc-central-barrel-rl"})}; } \ No newline at end of file From 3ecc640efdcd46e977b40c9987fa55ed73d31f40 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 10:03:37 +0100 Subject: [PATCH 23/29] changes to satisfy MegaLinter --- PWGUD/Core/RLhelper.h | 77 ++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index 0adb223b46c..158c30ccc87 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -13,8 +13,11 @@ /// \author Roman Lavicka, roman.lavicka@cern.ch /// \since 10.11.2022 -#ifndef ALISW_RLHELPER_H -#define ALISW_RLHELPER_H +#ifndef PWGUD_CORE_RLHELPER_H_ +#define PWGUD_CORE_RLHELPER_H_ + +#include +#include #include "PWGUD/DataModel/UDTables.h" @@ -51,47 +54,59 @@ int testPIDhypothesis(T trackPIDinfo) int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); // do PID using TPC+TOF - if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()) { - if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION) { - if (enumChoiceTOF == P_KAON) - return P_KAON; // probably kaon - else if (enumChoiceTOF == P_PROTON) - return P_PROTON; // probably proton + if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()){ + if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION){ + if (enumChoiceTOF == P_KAON ) { + return P_KAON; // probably kaon + } + else if (enumChoiceTOF == P_PROTON) { + return P_PROTON; // probably proton + } else { - if (enumChoiceTPC == P_ELECTRON) - return P_ELECTRON; // probably electron - else if (enumChoiceTPC == P_MUON) - return P_MUON; // probably muon - else - return P_PION; // probably pion + if (enumChoiceTPC == P_ELECTRON) { + return P_ELECTRON; // probably electron + } + else if (enumChoiceTPC == P_MUON) { + return P_MUON; // probably muon + } + else { + return P_PION; // probably pion + } } - } else { - if (enumChoiceTOF == P_KAON) - return P_KAON; // probably kaon - else if (enumChoiceTOF == P_PROTON) - return P_PROTON; // probably proton + } + else { + if (enumChoiceTOF == P_KAON ) { + return P_KAON; // probably kaon + } + else if (enumChoiceTOF == P_PROTON) { + return P_PROTON; // probably proton + } else { - if (enumChoiceTPCpick == P_ELECTRON) - return P_ELECTRON; // probably misidentified electron - else if (enumChoiceTPCpick == P_MUON) - return P_MUON; // probably misidentified muon - else if (enumChoiceTPCpick == P_PION) - return P_PION; // probably misidentified pion + if (enumChoiceTPCpick == P_ELECTRON) { + return P_ELECTRON; // probably misidentified electron + } + else if (enumChoiceTPCpick == P_MUON) { + return P_MUON; // probably misidentified muon + } + else { + return P_PION; // probably misidentified pion + } } } } // do PID using TPC only - else if (trackPIDinfo.hasTPC()) - return enumChoiceTPC; + else if (trackPIDinfo.hasTPC()) { + return enumChoiceTPC; + } // do PID using TOF only - else if (trackPIDinfo.hasTOF()) - return enumChoiceTOF; + else if (trackPIDinfo.hasTOF()) { + return enumChoiceTOF; + } // give warning and return non-sense else { LOGF(warning, "testPIDhypothesis failed - track did not leave information in TPC or TOF"); return -1; } - return -1; } float momentum(float px, float py, float pz) @@ -502,4 +517,4 @@ void printLargeMessage(std::string info) LOGF(info, "################################### %s ###################################", info); } -#endif //ALISW_RLHELPER_H +#endif //PWGUD_CORE_RLHELPER_H_ From f224a858c9f034b1b83e88f38287ac1b3dc76785 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 10:24:04 +0100 Subject: [PATCH 24/29] empty end line added --- PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx index 7d8631beeec..62c9cd2f854 100644 --- a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx @@ -278,4 +278,4 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc, TaskName{"upc-central-barrel-rl"})}; -} \ No newline at end of file +} From 0a1d755bf9fabdb5308e379c9b0734ae2b9aa4fa Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 22 Nov 2022 09:25:40 +0000 Subject: [PATCH 25/29] Please consider the following formatting changes --- PWGUD/Core/RLhelper.h | 67 +++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 38 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index 158c30ccc87..9822315945a 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -54,54 +54,45 @@ int testPIDhypothesis(T trackPIDinfo) int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); // do PID using TPC+TOF - if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()){ - if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION){ - if (enumChoiceTOF == P_KAON ) { - return P_KAON; // probably kaon - } - else if (enumChoiceTOF == P_PROTON) { - return P_PROTON; // probably proton - } - else { + if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()) { + if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION) { + if (enumChoiceTOF == P_KAON) { + return P_KAON; // probably kaon + } else if (enumChoiceTOF == P_PROTON) { + return P_PROTON; // probably proton + } else { if (enumChoiceTPC == P_ELECTRON) { - return P_ELECTRON; // probably electron - } - else if (enumChoiceTPC == P_MUON) { - return P_MUON; // probably muon - } - else { - return P_PION; // probably pion - } + return P_ELECTRON; // probably electron + } else if (enumChoiceTPC == P_MUON) { + return P_MUON; // probably muon + } else { + return P_PION; // probably pion + } } - } - else { - if (enumChoiceTOF == P_KAON ) { - return P_KAON; // probably kaon - } - else if (enumChoiceTOF == P_PROTON) { - return P_PROTON; // probably proton - } - else { + } else { + if (enumChoiceTOF == P_KAON) { + return P_KAON; // probably kaon + } else if (enumChoiceTOF == P_PROTON) { + return P_PROTON; // probably proton + } else { if (enumChoiceTPCpick == P_ELECTRON) { - return P_ELECTRON; // probably misidentified electron - } - else if (enumChoiceTPCpick == P_MUON) { - return P_MUON; // probably misidentified muon - } - else { - return P_PION; // probably misidentified pion - } + return P_ELECTRON; // probably misidentified electron + } else if (enumChoiceTPCpick == P_MUON) { + return P_MUON; // probably misidentified muon + } else { + return P_PION; // probably misidentified pion + } } } } // do PID using TPC only else if (trackPIDinfo.hasTPC()) { - return enumChoiceTPC; - } + return enumChoiceTPC; + } // do PID using TOF only else if (trackPIDinfo.hasTOF()) { - return enumChoiceTOF; - } + return enumChoiceTOF; + } // give warning and return non-sense else { LOGF(warning, "testPIDhypothesis failed - track did not leave information in TPC or TOF"); From e0f92e9055f479b5f7d223da10aa6b314e9e43e4 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 10:36:29 +0100 Subject: [PATCH 26/29] MegaLinter corrections --- PWGUD/Core/RLhelper.h | 113 +++++++++++++++++++++--------------------- 1 file changed, 57 insertions(+), 56 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index 9822315945a..2b0b62dea4c 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -35,62 +35,63 @@ template int testPIDhypothesis(T trackPIDinfo) // Choose, which particle it is according to PID { - float nSigmaTPC[5]; - nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); - nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); - nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); - nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); - nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); - int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); - float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; - int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); - - float nSigmaTOF[5]; - nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); - nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); - nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); - nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); - nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); - int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); - - // do PID using TPC+TOF - if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()) { - if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION) { - if (enumChoiceTOF == P_KAON) { - return P_KAON; // probably kaon - } else if (enumChoiceTOF == P_PROTON) { - return P_PROTON; // probably proton - } else { - if (enumChoiceTPC == P_ELECTRON) { - return P_ELECTRON; // probably electron - } else if (enumChoiceTPC == P_MUON) { - return P_MUON; // probably muon - } else { - return P_PION; // probably pion - } - } - } else { - if (enumChoiceTOF == P_KAON) { - return P_KAON; // probably kaon - } else if (enumChoiceTOF == P_PROTON) { - return P_PROTON; // probably proton - } else { - if (enumChoiceTPCpick == P_ELECTRON) { - return P_ELECTRON; // probably misidentified electron - } else if (enumChoiceTPCpick == P_MUON) { - return P_MUON; // probably misidentified muon - } else { - return P_PION; // probably misidentified pion - } - } - } - } - // do PID using TPC only - else if (trackPIDinfo.hasTPC()) { - return enumChoiceTPC; - } - // do PID using TOF only - else if (trackPIDinfo.hasTOF()) { + float nSigmaTPC[5]; + nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); + nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); + nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); + nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); + nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); + int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), + std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); + float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; + int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), + std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); + + float nSigmaTOF[5]; + nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); + nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); + nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); + nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); + nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); + int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), + std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); + + // do PID using TPC+TOF + if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()) { + if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION) { + if (enumChoiceTOF == P_KAON) { + return P_KAON; // probably kaon + } else if (enumChoiceTOF == P_PROTON) { + return P_PROTON; // probably proton + } else { + if (enumChoiceTPC == P_ELECTRON) { + return P_ELECTRON; // probably electron + } else if (enumChoiceTPC == P_MUON) { + return P_MUON; // probably muon + } else { + return P_PION; // probably pion + } + } + } else { + if (enumChoiceTOF == P_KAON) { + return P_KAON; // probably kaon + } else if (enumChoiceTOF == P_PROTON) { + return P_PROTON; // probably proton + } else { + if (enumChoiceTPCpick == P_ELECTRON) { + return P_ELECTRON; // probably misidentified electron + } else if (enumChoiceTPCpick == P_MUON) { + return P_MUON; // probably misidentified muon + } else { + return P_PION; // probably misidentified pion + } + } + } + // do PID using TPC only + } else if (trackPIDinfo.hasTPC()) { + return enumChoiceTPC; + // do PID using TOF only + } else if (trackPIDinfo.hasTOF()) { return enumChoiceTOF; } // give warning and return non-sense From 2aae66e45df3d8db702e8587a893496a910009a8 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 22 Nov 2022 09:37:11 +0000 Subject: [PATCH 27/29] Please consider the following formatting changes --- PWGUD/Core/RLhelper.h | 112 +++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index 2b0b62dea4c..d58bab13f85 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -35,62 +35,62 @@ template int testPIDhypothesis(T trackPIDinfo) // Choose, which particle it is according to PID { - float nSigmaTPC[5]; - nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); - nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); - nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); - nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); - nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); - int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), - std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); - float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; - int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), - std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); - - float nSigmaTOF[5]; - nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); - nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); - nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); - nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); - nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); - int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), - std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); - - // do PID using TPC+TOF - if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()) { - if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION) { - if (enumChoiceTOF == P_KAON) { - return P_KAON; // probably kaon - } else if (enumChoiceTOF == P_PROTON) { - return P_PROTON; // probably proton - } else { - if (enumChoiceTPC == P_ELECTRON) { - return P_ELECTRON; // probably electron - } else if (enumChoiceTPC == P_MUON) { - return P_MUON; // probably muon - } else { - return P_PION; // probably pion - } - } - } else { - if (enumChoiceTOF == P_KAON) { - return P_KAON; // probably kaon - } else if (enumChoiceTOF == P_PROTON) { - return P_PROTON; // probably proton - } else { - if (enumChoiceTPCpick == P_ELECTRON) { - return P_ELECTRON; // probably misidentified electron - } else if (enumChoiceTPCpick == P_MUON) { - return P_MUON; // probably misidentified muon - } else { - return P_PION; // probably misidentified pion - } - } - } - // do PID using TPC only - } else if (trackPIDinfo.hasTPC()) { - return enumChoiceTPC; - // do PID using TOF only + float nSigmaTPC[5]; + nSigmaTPC[P_ELECTRON] = trackPIDinfo.tpcNSigmaEl(); + nSigmaTPC[P_MUON] = trackPIDinfo.tpcNSigmaMu(); + nSigmaTPC[P_PION] = trackPIDinfo.tpcNSigmaPi(); + nSigmaTPC[P_KAON] = trackPIDinfo.tpcNSigmaKa(); + nSigmaTPC[P_PROTON] = trackPIDinfo.tpcNSigmaPr(); + int enumChoiceTPC = std::distance(std::begin(nSigmaTPC), + std::min_element(std::begin(nSigmaTPC), std::end(nSigmaTPC))); + float nSigmaTPCpick[3] = {nSigmaTPC[P_ELECTRON], nSigmaTPC[P_MUON], nSigmaTPC[P_PION]}; + int enumChoiceTPCpick = std::distance(std::begin(nSigmaTPCpick), + std::min_element(std::begin(nSigmaTPCpick), std::end(nSigmaTPCpick))); + + float nSigmaTOF[5]; + nSigmaTOF[P_ELECTRON] = trackPIDinfo.tofNSigmaEl(); + nSigmaTOF[P_MUON] = trackPIDinfo.tofNSigmaMu(); + nSigmaTOF[P_PION] = trackPIDinfo.tofNSigmaPi(); + nSigmaTOF[P_KAON] = trackPIDinfo.tofNSigmaKa(); + nSigmaTOF[P_PROTON] = trackPIDinfo.tofNSigmaPr(); + int enumChoiceTOF = std::distance(std::begin(nSigmaTOF), + std::min_element(std::begin(nSigmaTOF), std::end(nSigmaTOF))); + + // do PID using TPC+TOF + if (trackPIDinfo.hasTPC() && trackPIDinfo.hasTOF()) { + if (enumChoiceTPC == P_ELECTRON || enumChoiceTPC == P_MUON || enumChoiceTPC == P_PION) { + if (enumChoiceTOF == P_KAON) { + return P_KAON; // probably kaon + } else if (enumChoiceTOF == P_PROTON) { + return P_PROTON; // probably proton + } else { + if (enumChoiceTPC == P_ELECTRON) { + return P_ELECTRON; // probably electron + } else if (enumChoiceTPC == P_MUON) { + return P_MUON; // probably muon + } else { + return P_PION; // probably pion + } + } + } else { + if (enumChoiceTOF == P_KAON) { + return P_KAON; // probably kaon + } else if (enumChoiceTOF == P_PROTON) { + return P_PROTON; // probably proton + } else { + if (enumChoiceTPCpick == P_ELECTRON) { + return P_ELECTRON; // probably misidentified electron + } else if (enumChoiceTPCpick == P_MUON) { + return P_MUON; // probably misidentified muon + } else { + return P_PION; // probably misidentified pion + } + } + } + // do PID using TPC only + } else if (trackPIDinfo.hasTPC()) { + return enumChoiceTPC; + // do PID using TOF only } else if (trackPIDinfo.hasTOF()) { return enumChoiceTOF; } From 13419cf91e8c37fa8177f68c04825e4362ad8da9 Mon Sep 17 00:00:00 2001 From: Roman Lavicka Date: Tue, 22 Nov 2022 11:27:30 +0100 Subject: [PATCH 28/29] MegaLinter correction again --- PWGUD/Core/RLhelper.h | 9 +++++---- PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index d58bab13f85..4a9cf006650 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -93,8 +93,8 @@ int testPIDhypothesis(T trackPIDinfo) // do PID using TOF only } else if (trackPIDinfo.hasTOF()) { return enumChoiceTOF; - } // give warning and return non-sense + } else { LOGF(warning, "testPIDhypothesis failed - track did not leave information in TPC or TOF"); return -1; @@ -278,7 +278,7 @@ bool isUDqualityTrack(T const& udtrack) if (udtrack.tpcNClsCrossedRows() < cutNtpcCrossedRows) return false; // TPC crossed rows over n clusters - float crossedRowsOverNclusters = (float)udtrack.tpcNClsCrossedRows() / nFoundClusters; + float crossedRowsOverNclusters = static_cast(udtrack.tpcNClsCrossedRows()) / nFoundClusters; if (crossedRowsOverNclusters < cutCrossedRowsOverNclusters) return false; // passed all selections @@ -487,8 +487,9 @@ void printCollisionTracksData(Ts const& tracks, int setOfCuts) continue; if (track.has_udMcParticle()) { printTrackParticleData(track); - } else - countNoMCparticle++; + } else { + countNoMCparticle++; + } } if (countNoMCparticle > 0) LOGF(warning, "This collision has %d tracks without associated mc particle", countNoMCparticle); diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx index 62c9cd2f854..fffece2f10b 100644 --- a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx @@ -236,8 +236,9 @@ struct CentralBarrelAnalyzerRL { if (twinParticles == typeParticle) { isTwinParticles = true; } - } else - LOGP(warning, "!!!Strange behaviour in the loop, check!!!"); + } else { + LOGP(warning, "!!!Strange behaviour in the loop, check!!!"); + } } } } From e98102554ac8c840c9af9ebcc5e19e8df26ea385 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 22 Nov 2022 10:28:31 +0000 Subject: [PATCH 29/29] Please consider the following formatting changes --- PWGUD/Core/RLhelper.h | 9 ++++----- PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/PWGUD/Core/RLhelper.h b/PWGUD/Core/RLhelper.h index 4a9cf006650..2c210c87174 100644 --- a/PWGUD/Core/RLhelper.h +++ b/PWGUD/Core/RLhelper.h @@ -93,9 +93,8 @@ int testPIDhypothesis(T trackPIDinfo) // do PID using TOF only } else if (trackPIDinfo.hasTOF()) { return enumChoiceTOF; - // give warning and return non-sense - } - else { + // give warning and return non-sense + } else { LOGF(warning, "testPIDhypothesis failed - track did not leave information in TPC or TOF"); return -1; } @@ -488,8 +487,8 @@ void printCollisionTracksData(Ts const& tracks, int setOfCuts) if (track.has_udMcParticle()) { printTrackParticleData(track); } else { - countNoMCparticle++; - } + countNoMCparticle++; + } } if (countNoMCparticle > 0) LOGF(warning, "This collision has %d tracks without associated mc particle", countNoMCparticle); diff --git a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx index fffece2f10b..7e10493728a 100644 --- a/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx +++ b/PWGUD/Tasks/upcCentralBarrelAnalyzerRL.cxx @@ -237,8 +237,8 @@ struct CentralBarrelAnalyzerRL { isTwinParticles = true; } } else { - LOGP(warning, "!!!Strange behaviour in the loop, check!!!"); - } + LOGP(warning, "!!!Strange behaviour in the loop, check!!!"); + } } } }