From 1f067b37dec9f37d99d22d5c3b49a4152704e7a0 Mon Sep 17 00:00:00 2001 From: Sanghoon Lim Date: Thu, 3 Aug 2023 11:09:32 +0900 Subject: [PATCH 1/3] Add additional track selections --- PWGLF/Tasks/f0980analysis.cxx | 168 +++++++++++++++++++++++++--------- 1 file changed, 123 insertions(+), 45 deletions(-) diff --git a/PWGLF/Tasks/f0980analysis.cxx b/PWGLF/Tasks/f0980analysis.cxx index 16fe1ee7287..6447c820ea5 100644 --- a/PWGLF/Tasks/f0980analysis.cxx +++ b/PWGLF/Tasks/f0980analysis.cxx @@ -1,6 +1,6 @@ // 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. +// 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". @@ -13,14 +13,14 @@ #include -#include "Common/DataModel/PIDResponse.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" -#include "Framework/AnalysisTask.h" +#include "Common/DataModel/PIDResponse.h" +#include "DataFormatsParameters/GRPObject.h" #include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisTask.h" #include "Framework/runDataProcessing.h" #include "PWGLF/DataModel/LFResonanceTables.h" -#include "DataFormatsParameters/GRPObject.h" using namespace o2; using namespace o2::framework; @@ -31,27 +31,48 @@ struct f0980analysis { SliceCache cache; Preslice perRCol = aod::resodaughter::resoCollisionId; Preslice perCollision = aod::track::collisionId; - HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - - Configurable cfgMinPt{"cfgMinPt", 0.15, "Minimum transverse momentum for charged track"}; - Configurable cfgMaxEta{"cfgMaxEta", 0.8, "Maximum pseudorapidiy for charged track"}; - Configurable cfgMaxDCArToPVcut{"cfgMaxDCArToPVcut", 0.5, "Maximum transverse DCA"}; - Configurable cfgMinDCAzToPVcut{"cfgMinDCAzToPVcut", 0.0, "Minimum longitudinal DCA"}; - Configurable cfgMaxDCAzToPVcut{"cfgMaxDCAzToPVcut", 2.0, "Maximum longitudinal DCA"}; - Configurable cfgMaxTPCStandalone{"cfgMaxTPCStandalone", 2.0, "Maximum TPC PID as standalone"}; + HistogramRegistry histos{ + "histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + Configurable cfgMinPt{"cfgMinPt", 0.15, + "Minimum transverse momentum for charged track"}; + Configurable cfgMaxEta{"cfgMaxEta", 0.8, + "Maximum pseudorapidiy for charged track"}; + Configurable cfgMaxDCArToPVcut{"cfgMaxDCArToPVcut", 0.5, + "Maximum transverse DCA"}; + Configurable cfgMinDCAzToPVcut{"cfgMinDCAzToPVcut", 0.0, + "Minimum longitudinal DCA"}; + Configurable cfgMaxDCAzToPVcut{"cfgMaxDCAzToPVcut", 2.0, + "Maximum longitudinal DCA"}; + Configurable cfgMaxTPCStandalone{"cfgMaxTPCStandalone", 2.0, + "Maximum TPC PID as standalone"}; Configurable cfgMaxTPC{"cfgMaxTPC", 5.0, "Maximum TPC PID with TOF"}; Configurable cfgMaxTOF{"cfgMaxTOF", 3.0, "Maximum TOF PID with TPC"}; Configurable cfgMinRap{"cfgMinRap", -0.5, "Minimum rapidity for pair"}; Configurable cfgMaxRap{"cfgMaxRap", 0.5, "Maximum rapidity for pair"}; Configurable cfgMinTPCncr{"cfgMinTPCncr", 70, "minimum TPC cluster"}; - void init(o2::framework::InitContext&) - { - std::vector ptBinning = { - 0.0, 0.2, 0.4, 0.6, 0.8, - 1.0, 1.5, 2.0, 2.5, 3.0, - 3.5, 4.0, 4.5, 5.0, 6.0, - 7.0, 8.0, 10.0, 13.0, 20.0}; + Configurable cfgPrimaryTrack{ + "cfgPrimaryTrack", true, + "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + Configurable cfgGlobalWoDCATrack{ + "cfgGlobalWoDCATrack", true, + "Global track selection without DCA"}; // kQualityTracks (kTrackType | + // kTPCNCls | kTPCCrossedRows | + // kTPCCrossedRowsOverNCls | + // kTPCChi2NDF | kTPCRefit | + // kITSNCls | kITSChi2NDF | + // kITSRefit | kITSHits) | + // kInAcceptanceTracks (kPtRange | + // kEtaRange) + Configurable cfgPVContributor{ + "cfgPVContributor", true, + "PV contributor track selection"}; // PV Contriuibutor + + void init(o2::framework::InitContext &) { + std::vector ptBinning = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, + 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, + 5.0, 6.0, 7.0, 8.0, 10.0, 13.0, 20.0}; AxisSpec centAxis = {20, 0, 100}; AxisSpec ptAxis = {ptBinning}; @@ -59,24 +80,32 @@ struct f0980analysis { AxisSpec epAxis = {20, -constants::math::PI, constants::math::PI}; AxisSpec PIDqaAxis = {120, -6, 6}; - AxisSpec pTqaAxis = {100, 0, 20}; + AxisSpec pTqaAxis = {200, 0, 20}; - histos.add("hInvMass_f0980_US", "unlike invariant mass", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); - histos.add("hInvMass_f0980_LSpp", "++ invariant mass", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); - histos.add("hInvMass_f0980_LSmm", "-- invariant mass", {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); + histos.add("hInvMass_f0980_US", "unlike invariant mass", + {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); + histos.add("hInvMass_f0980_LSpp", "++ invariant mass", + {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); + histos.add("hInvMass_f0980_LSmm", "-- invariant mass", + {HistType::kTH3F, {massAxis, ptAxis, centAxis}}); histos.add("QA/Nsigma_TPC", "", {HistType::kTH2F, {pTqaAxis, PIDqaAxis}}); histos.add("QA/Nsigma_TOF", "", {HistType::kTH2F, {pTqaAxis, PIDqaAxis}}); histos.add("QA/TPC_TOF", "", {HistType::kTH2F, {PIDqaAxis, PIDqaAxis}}); + if (doprocessMCLight) { + histos.add("MCL/hpT_f0980_GEN", "generated f0 signals", HistType::kTH1F, + {pTqaAxis}); + histos.add("MCL/hpT_f0980_REC", "reconstructed f0 signals", + HistType::kTH3F, {massAxis, pTqaAxis, centAxis}); + } + histos.print(); } double massPi = TDatabasePDG::Instance()->GetParticle(kPiPlus)->Mass(); - template - bool SelTrack(const TrackType track) - { + template bool SelTrack(const TrackType track) { if (track.pt() < cfgMinPt) return false; if (std::fabs(track.eta()) > cfgMaxEta) @@ -85,19 +114,25 @@ struct f0980analysis { return false; if (track.dcaZ() < cfgMinDCAzToPVcut || track.dcaZ() > cfgMaxDCAzToPVcut) return false; + if (cfgPrimaryTrack && !track.isPrimaryTrack()) + return false; + if (cfgGlobalWoDCATrack && !track.isGlobalTrackWoDCA()) + return false; + if (cfgPVContributor && !track.isPVContributor()) + return false; return true; } - template - bool SelPion(const TrackType track) - { - if ((track.tofPIDselectionFlag() & aod::resodaughter::kHasTOF) != aod::resodaughter::kHasTOF) { + template bool SelPion(const TrackType track) { + if ((track.tofPIDselectionFlag() & aod::resodaughter::kHasTOF) != + aod::resodaughter::kHasTOF) { if (std::fabs(track.tpcNSigmaPi()) > cfgMaxTPCStandalone) { return false; } } else { - if (std::fabs(track.tpcNSigmaPi()) > cfgMaxTPC || std::fabs(track.tofNSigmaPi()) > cfgMaxTOF) { + if (std::fabs(track.tpcNSigmaPi()) > cfgMaxTPC || + std::fabs(track.tofNSigmaPi()) > cfgMaxTOF) { return false; } } @@ -105,12 +140,15 @@ struct f0980analysis { } template - void fillHistograms(const CollisionType& collision, const TracksType& dTracks) - { + void fillHistograms(const CollisionType &collision, + const TracksType &dTracks) { TLorentzVector Pion1, Pion2, Reco; - for (auto& [trk1, trk2] : combinations(CombinationsUpperIndexPolicy(dTracks, dTracks))) { + for (auto &[trk1, trk2] : + combinations(CombinationsUpperIndexPolicy(dTracks, dTracks))) { if (trk1.index() == trk2.index()) { + if (!SelTrack(trk1)) + continue; histos.fill(HIST("QA/Nsigma_TPC"), trk1.pt(), trk1.tpcNSigmaPi()); histos.fill(HIST("QA/Nsigma_TOF"), trk1.pt(), trk1.tofNSigmaPi()); histos.fill(HIST("QA/TPC_TOF"), trk1.tpcNSigmaPi(), trk1.tofNSigmaPi()); @@ -130,24 +168,64 @@ struct f0980analysis { continue; if (trk1.sign() * trk2.sign() < 0) { - histos.fill(HIST("hInvMass_f0980_US"), Reco.M(), Reco.Pt(), collision.multV0M()); + histos.fill(HIST("hInvMass_f0980_US"), Reco.M(), Reco.Pt(), + collision.multV0M()); + if constexpr (IsMC) { + if (abs(trk1.pdgCode()) != kPiPlus || abs(trk2.pdgCode()) != kPiPlus) + continue; + if (trk1.motherId() != trk2.motherId()) + continue; + if (abs(trk1.motherPDG()) != 9010221) + continue; + histos.fill(HIST("MCL/hpT_f0980_REC"), Reco.M(), Reco.Pt(), + collision.multV0M()); + } } else if (trk1.sign() > 0 && trk2.sign() > 0) { - histos.fill(HIST("hInvMass_f0980_LSpp"), Reco.M(), Reco.Pt(), collision.multV0M()); + histos.fill(HIST("hInvMass_f0980_LSpp"), Reco.M(), Reco.Pt(), + collision.multV0M()); } else if (trk1.sign() < 0 && trk2.sign() < 0) { - histos.fill(HIST("hInvMass_f0980_LSmm"), Reco.M(), Reco.Pt(), collision.multV0M()); + histos.fill(HIST("hInvMass_f0980_LSmm"), Reco.M(), Reco.Pt(), + collision.multV0M()); } } } - void processData(aod::ResoCollision& collision, - aod::ResoTracks const& resotracks) - { + void processData(aod::ResoCollision &collision, + aod::ResoTracks const &resotracks) { fillHistograms(collision, resotracks); - }; + } PROCESS_SWITCH(f0980analysis, processData, "Process Event for data", true); + + void processMCLight( + aod::ResoCollision &collision, + soa::Join const &resotracks, + aod::McParticles const &mcParticles) { + fillHistograms(collision, resotracks); + } + PROCESS_SWITCH(f0980analysis, processMCLight, "Process Event for MC", false); + + void processMCTrue(aod::ResoMCParents &resoParents) { + for (auto &part : resoParents) { // loop over all pre-filtered MC particles + if (abs(part.pdgCode()) != 9010221) + continue; + if (part.y() < cfgMinRap || part.y() > cfgMaxRap) { + continue; + } + bool pass = false; + if ((abs(part.daughterPDG1()) == kPiPlus && + abs(part.daughterPDG2()) == kPiPlus)) { + pass = true; + } + if (!pass) // If we have both decay products + continue; + + histos.fill(HIST("MCL/hpT_f0980_GEN"), part.pt()); + } + }; + PROCESS_SWITCH(f0980analysis, processMCTrue, "Process Event for MC", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{adaptAnalysisTask(cfgc, TaskName{"lf-f0980analysis"})}; +WorkflowSpec defineDataProcessing(ConfigContext const &cfgc) { + return WorkflowSpec{ + adaptAnalysisTask(cfgc, TaskName{"lf-f0980analysis"})}; } From e3ff6d5769ae7c1ce7f2682b502aa9218c485369 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Thu, 3 Aug 2023 02:14:40 +0000 Subject: [PATCH 2/3] Please consider the following formatting changes --- PWGLF/Tasks/f0980analysis.cxx | 74 ++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/PWGLF/Tasks/f0980analysis.cxx b/PWGLF/Tasks/f0980analysis.cxx index 6447c820ea5..e4c9147ab28 100644 --- a/PWGLF/Tasks/f0980analysis.cxx +++ b/PWGLF/Tasks/f0980analysis.cxx @@ -32,7 +32,9 @@ struct f0980analysis { Preslice perRCol = aod::resodaughter::resoCollisionId; Preslice perCollision = aod::track::collisionId; HistogramRegistry histos{ - "histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + "histos", + {}, + OutputObjHandlingPolicy::AnalysisObject}; Configurable cfgMinPt{"cfgMinPt", 0.15, "Minimum transverse momentum for charged track"}; @@ -53,25 +55,26 @@ struct f0980analysis { Configurable cfgMinTPCncr{"cfgMinTPCncr", 70, "minimum TPC cluster"}; Configurable cfgPrimaryTrack{ - "cfgPrimaryTrack", true, - "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz + "cfgPrimaryTrack", true, + "Primary track selection"}; // kGoldenChi2 | kDCAxy | kDCAz Configurable cfgGlobalWoDCATrack{ - "cfgGlobalWoDCATrack", true, - "Global track selection without DCA"}; // kQualityTracks (kTrackType | - // kTPCNCls | kTPCCrossedRows | - // kTPCCrossedRowsOverNCls | - // kTPCChi2NDF | kTPCRefit | - // kITSNCls | kITSChi2NDF | - // kITSRefit | kITSHits) | - // kInAcceptanceTracks (kPtRange | - // kEtaRange) + "cfgGlobalWoDCATrack", true, + "Global track selection without DCA"}; // kQualityTracks (kTrackType | + // kTPCNCls | kTPCCrossedRows | + // kTPCCrossedRowsOverNCls | + // kTPCChi2NDF | kTPCRefit | + // kITSNCls | kITSChi2NDF | + // kITSRefit | kITSHits) | + // kInAcceptanceTracks (kPtRange | + // kEtaRange) Configurable cfgPVContributor{ - "cfgPVContributor", true, - "PV contributor track selection"}; // PV Contriuibutor + "cfgPVContributor", true, + "PV contributor track selection"}; // PV Contriuibutor - void init(o2::framework::InitContext &) { - std::vector ptBinning = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, - 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, + void init(o2::framework::InitContext&) + { + std::vector ptBinning = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, + 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 10.0, 13.0, 20.0}; AxisSpec centAxis = {20, 0, 100}; @@ -105,7 +108,9 @@ struct f0980analysis { double massPi = TDatabasePDG::Instance()->GetParticle(kPiPlus)->Mass(); - template bool SelTrack(const TrackType track) { + template + bool SelTrack(const TrackType track) + { if (track.pt() < cfgMinPt) return false; if (std::fabs(track.eta()) > cfgMaxEta) @@ -124,7 +129,9 @@ struct f0980analysis { return true; } - template bool SelPion(const TrackType track) { + template + bool SelPion(const TrackType track) + { if ((track.tofPIDselectionFlag() & aod::resodaughter::kHasTOF) != aod::resodaughter::kHasTOF) { if (std::fabs(track.tpcNSigmaPi()) > cfgMaxTPCStandalone) { @@ -140,10 +147,11 @@ struct f0980analysis { } template - void fillHistograms(const CollisionType &collision, - const TracksType &dTracks) { + void fillHistograms(const CollisionType& collision, + const TracksType& dTracks) + { TLorentzVector Pion1, Pion2, Reco; - for (auto &[trk1, trk2] : + for (auto& [trk1, trk2] : combinations(CombinationsUpperIndexPolicy(dTracks, dTracks))) { if (trk1.index() == trk2.index()) { @@ -190,22 +198,25 @@ struct f0980analysis { } } - void processData(aod::ResoCollision &collision, - aod::ResoTracks const &resotracks) { + void processData(aod::ResoCollision& collision, + aod::ResoTracks const& resotracks) + { fillHistograms(collision, resotracks); } PROCESS_SWITCH(f0980analysis, processData, "Process Event for data", true); void processMCLight( - aod::ResoCollision &collision, - soa::Join const &resotracks, - aod::McParticles const &mcParticles) { + aod::ResoCollision& collision, + soa::Join const& resotracks, + aod::McParticles const& mcParticles) + { fillHistograms(collision, resotracks); } PROCESS_SWITCH(f0980analysis, processMCLight, "Process Event for MC", false); - void processMCTrue(aod::ResoMCParents &resoParents) { - for (auto &part : resoParents) { // loop over all pre-filtered MC particles + void processMCTrue(aod::ResoMCParents& resoParents) + { + for (auto& part : resoParents) { // loop over all pre-filtered MC particles if (abs(part.pdgCode()) != 9010221) continue; if (part.y() < cfgMinRap || part.y() > cfgMaxRap) { @@ -225,7 +236,8 @@ struct f0980analysis { PROCESS_SWITCH(f0980analysis, processMCTrue, "Process Event for MC", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const &cfgc) { +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"lf-f0980analysis"})}; + adaptAnalysisTask(cfgc, TaskName{"lf-f0980analysis"})}; } From 014255fd2dd3c49345a0dd480b6e643c70130a86 Mon Sep 17 00:00:00 2001 From: Sanghoon Lim Date: Thu, 3 Aug 2023 11:46:06 +0900 Subject: [PATCH 3/3] Fix the copyright headers --- PWGLF/Tasks/f0980analysis.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/f0980analysis.cxx b/PWGLF/Tasks/f0980analysis.cxx index e4c9147ab28..813feae559c 100644 --- a/PWGLF/Tasks/f0980analysis.cxx +++ b/PWGLF/Tasks/f0980analysis.cxx @@ -1,6 +1,6 @@ // 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. +// 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".