From 530433962bb383841518a33e8f187e9b5f265a40 Mon Sep 17 00:00:00 2001 From: Tucker Hwang Date: Sat, 8 Aug 2026 16:42:00 -0700 Subject: [PATCH 1/8] First version of tree creator --- PWGJE/TableProducer/CMakeLists.txt | 5 + PWGJE/TableProducer/EECTreeCreator.cxx | 144 +++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 PWGJE/TableProducer/EECTreeCreator.cxx diff --git a/PWGJE/TableProducer/CMakeLists.txt b/PWGJE/TableProducer/CMakeLists.txt index 42d27740b1e..c7474028cee 100644 --- a/PWGJE/TableProducer/CMakeLists.txt +++ b/PWGJE/TableProducer/CMakeLists.txt @@ -116,6 +116,11 @@ o2physics_add_dpl_workflow(slim-tables-producer PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(eec-tree-creator + SOURCES EECTreeCreator.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) + o2physics_add_dpl_workflow(diff-wake-tree-producer SOURCES diffWakeTreeProducer.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore diff --git a/PWGJE/TableProducer/EECTreeCreator.cxx b/PWGJE/TableProducer/EECTreeCreator.cxx new file mode 100644 index 00000000000..be07ddaccab --- /dev/null +++ b/PWGJE/TableProducer/EECTreeCreator.cxx @@ -0,0 +1,144 @@ +#include "PWGJE/Core/JetDerivedDataUtilities.h" +#include "PWGJE/DataModel/Jet.h" +#include "PWGJE/DataModel/JetReducedData.h" + +#include +#include +#include +#include "Framework/O2DatabasePDGPlugin.h" + +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +namespace o2::aod +{ +namespace tree +{ +DECLARE_SOA_COLUMN(ZVTX, zvtx, float); +DECLARE_SOA_COLUMN(WEIGHT, weight, float); +DECLARE_SOA_COLUMN(PTHAT, ptHat, float); +DECLARE_SOA_COLUMN(MULTIPLICITY, multiplicity, float); + +DECLARE_SOA_COLUMN(DETPt, detPt, std::vector); +DECLARE_SOA_COLUMN(DETEta, detEta, std::vector); +DECLARE_SOA_COLUMN(DETPhi, detPhi, std::vector); +DECLARE_SOA_COLUMN(DETCharge, detCharge, std::vector); + +DECLARE_SOA_COLUMN(TruthPt, truthPt, std::vector); +DECLARE_SOA_COLUMN(TruthEta, truthEta, std::vector); +DECLARE_SOA_COLUMN(TruthPhi, truthPhi, std::vector); +DECLARE_SOA_COLUMN(TruthE, truthE, std::vector); +DECLARE_SOA_COLUMN(PDG, pdg, std::vector); +} + +DECLARE_SOA_TABLE(TREE, "AOD", "TREE", + tree::ZVTX, + tree::WEIGHT, + tree::PTHAT, + tree::MULTIPLICITY, + tree::DETPt, + tree::DETEta, + tree::DETPhi, + tree::DETCharge, + tree::TruthPt, + tree::TruthEta, + tree::TruthPhi, + tree::TruthE, + tree::PDG); +} + +struct EECTreeCreatorTask +{ + Service pdg; + + Configurable vertexZCut{"vertexZCut", 10.0f, "vertex Z cut"}; + + Configurable eventSelections{"eventSelections", "sel8", ""}; + Configurable trackSelections{"trackSelections", "globalTracks", ""}; + + Produces tree; + + std::vector eventSelectionBits; + int trackSelection = -1; + + Preslice particlesPerMcCollision = aod::jmcparticle::mcCollisionId; + + bool isChargedParticle(int code) + { + const float chargeUnit = 3.; + auto p = pdg->GetParticle(code); + auto charge = 0.; + if (p != nullptr) { + charge = p->Charge(); + } + return std::abs(charge) >= chargeUnit; + } + + void init(InitContext const&) + { + eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections); + trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections); + } + + void processMC(aod::JetCollisionsMCD::iterator const& collision, aod::JetTracks const& tracks, aod::JMcParticles const& mcParticles,aod::JetMcCollisions const&) + { + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; + if (std::abs(collision.posZ()) > vertexZCut) return; + + float w = collision.has_mcCollision() ? collision.mcCollision().weight() : 1.f; + float pthard = collision.has_mcCollision() ? collision.mcCollision().ptHard() : 1.f; + + std::vector detPt, detEta, detPhi; + std::vector detCharge; + + std::vector truthPt, truthEta, truthPhi, truthE; + std::vector pdg; + + for (auto const& track : tracks) + { + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; + + if( fabs(track.eta()) > 0.9) continue; + if( track.pt() < 0.15 ) continue; + + detPt.push_back(track.pt()); + detEta.push_back(track.eta()); + detPhi.push_back(track.phi()); + detCharge.push_back(track.sign()); + + } + + int mcId = collision.has_mcCollision() ? collision.mcCollisionId() : -1; + + if (mcId >= 0) + { + auto particles = mcParticles.sliceBy(particlesPerMcCollision, mcId); + + for (auto const& p : particles) + { + if( !p.isPhysicalPrimary()) continue; + if( fabs(p.eta()) > 0.9) continue; + if( p.pt() < 0.15) continue; + if( !isChargedParticle(p.pdgCode())) continue; + + truthPt.push_back(p.pt()); + truthEta.push_back(p.eta()); + truthPhi.push_back(p.phi()); + truthE.push_back(p.e()); + pdg.push_back(p.pdgCode()); + } + } + + tree( collision.posZ(), w, pthard, collision.multFT0C(), detPt, detEta, detPhi, detCharge, truthPt, truthEta, truthPhi, truthE, pdg);} + + PROCESS_SWITCH(EECTreeCreatorTask, processMC, "MC processing", true); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ adaptAnalysisTask(cfgc, TaskName{"eec-tree-creator-mc"})}; +} \ No newline at end of file From e30eaa5defd86500188fdae547404c65e2ae9546 Mon Sep 17 00:00:00 2001 From: Tucker Hwang Date: Sun, 9 Aug 2026 12:06:32 -0700 Subject: [PATCH 2/8] Add truth charge column --- PWGJE/TableProducer/EECTreeCreator.cxx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/PWGJE/TableProducer/EECTreeCreator.cxx b/PWGJE/TableProducer/EECTreeCreator.cxx index be07ddaccab..5ea2e8dac4f 100644 --- a/PWGJE/TableProducer/EECTreeCreator.cxx +++ b/PWGJE/TableProducer/EECTreeCreator.cxx @@ -32,6 +32,7 @@ DECLARE_SOA_COLUMN(TruthPt, truthPt, std::vector); DECLARE_SOA_COLUMN(TruthEta, truthEta, std::vector); DECLARE_SOA_COLUMN(TruthPhi, truthPhi, std::vector); DECLARE_SOA_COLUMN(TruthE, truthE, std::vector); +DECLARE_SOA_COLUMN(TruthCharge, truthCharge, std::vector); DECLARE_SOA_COLUMN(PDG, pdg, std::vector); } @@ -48,6 +49,7 @@ DECLARE_SOA_TABLE(TREE, "AOD", "TREE", tree::TruthEta, tree::TruthPhi, tree::TruthE, + tree::TruthCharge, tree::PDG); } @@ -78,6 +80,16 @@ struct EECTreeCreatorTask return std::abs(charge) >= chargeUnit; } + int getCharge(int code) { + auto p = pdg->GetParticle(code); + if (!p) { + LOG(fatal) << "Cannot find particle with PDG code " << code; + return 0; + } + auto charge = p->Charge() / 3.0; + return std::lround(charge); + } + void init(InitContext const&) { eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections); @@ -96,6 +108,7 @@ struct EECTreeCreatorTask std::vector detCharge; std::vector truthPt, truthEta, truthPhi, truthE; + std::vector truthCharge; std::vector pdg; for (auto const& track : tracks) @@ -129,11 +142,12 @@ struct EECTreeCreatorTask truthEta.push_back(p.eta()); truthPhi.push_back(p.phi()); truthE.push_back(p.e()); + truthCharge.push_back(getCharge(p.pdgCode())); pdg.push_back(p.pdgCode()); } } - tree( collision.posZ(), w, pthard, collision.multFT0C(), detPt, detEta, detPhi, detCharge, truthPt, truthEta, truthPhi, truthE, pdg);} + tree( collision.posZ(), w, pthard, collision.multFT0C(), detPt, detEta, detPhi, detCharge, truthPt, truthEta, truthPhi, truthE, truthCharge, pdg);} PROCESS_SWITCH(EECTreeCreatorTask, processMC, "MC processing", true); }; From cdb0d85d3dd075e4b2954752021f01974737806e Mon Sep 17 00:00:00 2001 From: Tucker Hwang Date: Sun, 9 Aug 2026 12:07:30 -0700 Subject: [PATCH 3/8] Remove RCT selections --- PWGJE/TableProducer/EECTreeCreator.cxx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/PWGJE/TableProducer/EECTreeCreator.cxx b/PWGJE/TableProducer/EECTreeCreator.cxx index 5ea2e8dac4f..11abd3cf0c6 100644 --- a/PWGJE/TableProducer/EECTreeCreator.cxx +++ b/PWGJE/TableProducer/EECTreeCreator.cxx @@ -22,6 +22,7 @@ DECLARE_SOA_COLUMN(ZVTX, zvtx, float); DECLARE_SOA_COLUMN(WEIGHT, weight, float); DECLARE_SOA_COLUMN(PTHAT, ptHat, float); DECLARE_SOA_COLUMN(MULTIPLICITY, multiplicity, float); +DECLARE_SOA_BITMAP_COLUMN(RCT, rct, 32); DECLARE_SOA_COLUMN(DETPt, detPt, std::vector); DECLARE_SOA_COLUMN(DETEta, detEta, std::vector); @@ -41,6 +42,7 @@ DECLARE_SOA_TABLE(TREE, "AOD", "TREE", tree::WEIGHT, tree::PTHAT, tree::MULTIPLICITY, + tree::RCT, tree::DETPt, tree::DETEta, tree::DETPhi, @@ -61,6 +63,7 @@ struct EECTreeCreatorTask Configurable eventSelections{"eventSelections", "sel8", ""}; Configurable trackSelections{"trackSelections", "globalTracks", ""}; + Configurable skipMBGapEvents{"skipMBGapEvents", true, "skip MB gap events"}; Produces tree; @@ -98,7 +101,8 @@ struct EECTreeCreatorTask void processMC(aod::JetCollisionsMCD::iterator const& collision, aod::JetTracks const& tracks, aod::JMcParticles const& mcParticles,aod::JetMcCollisions const&) { - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits)) return; + // do not do any RCT selections, will be done on analysis level + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, false, "", false, false)) return; if (std::abs(collision.posZ()) > vertexZCut) return; float w = collision.has_mcCollision() ? collision.mcCollision().weight() : 1.f; @@ -147,7 +151,7 @@ struct EECTreeCreatorTask } } - tree( collision.posZ(), w, pthard, collision.multFT0C(), detPt, detEta, detPhi, detCharge, truthPt, truthEta, truthPhi, truthE, truthCharge, pdg);} + tree( collision.posZ(), w, pthard, collision.multFT0C(), collision.rct_raw(), detPt, detEta, detPhi, detCharge, truthPt, truthEta, truthPhi, truthE, truthCharge, pdg);} PROCESS_SWITCH(EECTreeCreatorTask, processMC, "MC processing", true); }; From 83c18be5c3fb47ba33249c56cbafdca42458a273 Mon Sep 17 00:00:00 2001 From: Tucker Hwang Date: Mon, 10 Aug 2026 14:59:42 -0700 Subject: [PATCH 4/8] Rename tree creator file --- PWGJE/TableProducer/CMakeLists.txt | 4 ++-- .../{EECTreeCreator.cxx => berkeleyTreeProducer.cxx} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename PWGJE/TableProducer/{EECTreeCreator.cxx => berkeleyTreeProducer.cxx} (100%) diff --git a/PWGJE/TableProducer/CMakeLists.txt b/PWGJE/TableProducer/CMakeLists.txt index c7474028cee..06c12902c91 100644 --- a/PWGJE/TableProducer/CMakeLists.txt +++ b/PWGJE/TableProducer/CMakeLists.txt @@ -116,8 +116,8 @@ o2physics_add_dpl_workflow(slim-tables-producer PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(eec-tree-creator - SOURCES EECTreeCreator.cxx +o2physics_add_dpl_workflow(berkeley-tree-producer + SOURCES berkeleyTreeProducer.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGJE/TableProducer/EECTreeCreator.cxx b/PWGJE/TableProducer/berkeleyTreeProducer.cxx similarity index 100% rename from PWGJE/TableProducer/EECTreeCreator.cxx rename to PWGJE/TableProducer/berkeleyTreeProducer.cxx From 71af354826bbfe554dc9782cbf9f4434729c2e6b Mon Sep 17 00:00:00 2001 From: Tucker Hwang Date: Mon, 10 Aug 2026 15:00:23 -0700 Subject: [PATCH 5/8] Clean up code --- PWGJE/TableProducer/berkeleyTreeProducer.cxx | 136 +++++++++++-------- 1 file changed, 76 insertions(+), 60 deletions(-) diff --git a/PWGJE/TableProducer/berkeleyTreeProducer.cxx b/PWGJE/TableProducer/berkeleyTreeProducer.cxx index 11abd3cf0c6..02c098da114 100644 --- a/PWGJE/TableProducer/berkeleyTreeProducer.cxx +++ b/PWGJE/TableProducer/berkeleyTreeProducer.cxx @@ -1,3 +1,19 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file berkeleyTreeProducer.cxx +/// \brief Task to save MC events into the BerkeleyTree format +/// \author Vassu Doomra +/// \author Tucker Hwang + #include "PWGJE/Core/JetDerivedDataUtilities.h" #include "PWGJE/DataModel/Jet.h" #include "PWGJE/DataModel/JetReducedData.h" @@ -18,48 +34,52 @@ namespace o2::aod { namespace tree { -DECLARE_SOA_COLUMN(ZVTX, zvtx, float); -DECLARE_SOA_COLUMN(WEIGHT, weight, float); -DECLARE_SOA_COLUMN(PTHAT, ptHat, float); -DECLARE_SOA_COLUMN(MULTIPLICITY, multiplicity, float); -DECLARE_SOA_BITMAP_COLUMN(RCT, rct, 32); - -DECLARE_SOA_COLUMN(DETPt, detPt, std::vector); -DECLARE_SOA_COLUMN(DETEta, detEta, std::vector); -DECLARE_SOA_COLUMN(DETPhi, detPhi, std::vector); -DECLARE_SOA_COLUMN(DETCharge, detCharge, std::vector); - -DECLARE_SOA_COLUMN(TruthPt, truthPt, std::vector); -DECLARE_SOA_COLUMN(TruthEta, truthEta, std::vector); -DECLARE_SOA_COLUMN(TruthPhi, truthPhi, std::vector); -DECLARE_SOA_COLUMN(TruthE, truthE, std::vector); -DECLARE_SOA_COLUMN(TruthCharge, truthCharge, std::vector); -DECLARE_SOA_COLUMN(PDG, pdg, std::vector); +DECLARE_SOA_COLUMN(VtxZ, vtxZ, float); +DECLARE_SOA_COLUMN(Weight, weight, float); +DECLARE_SOA_COLUMN(PtHat, ptHat, float); +DECLARE_SOA_COLUMN(Multiplicity, multiplicity, float); +DECLARE_SOA_BITMAP_COLUMN(Rct, rct, 32); + +DECLARE_SOA_COLUMN(DetPt, detPt, std::vector); +DECLARE_SOA_COLUMN(DetEta, detEta, std::vector); +DECLARE_SOA_COLUMN(DetPhi, detPhi, std::vector); +DECLARE_SOA_COLUMN(DetCharge, detCharge, std::vector); + +DECLARE_SOA_COLUMN(GenPt, genPt, std::vector); +DECLARE_SOA_COLUMN(GenEta, genEta, std::vector); +DECLARE_SOA_COLUMN(GenPhi, genPhi, std::vector); +DECLARE_SOA_COLUMN(GenE, genE, std::vector); +DECLARE_SOA_COLUMN(GenCharge, genCharge, std::vector); +DECLARE_SOA_COLUMN(PdgId, pdgId, std::vector); } DECLARE_SOA_TABLE(TREE, "AOD", "TREE", - tree::ZVTX, - tree::WEIGHT, - tree::PTHAT, - tree::MULTIPLICITY, - tree::RCT, - tree::DETPt, - tree::DETEta, - tree::DETPhi, - tree::DETCharge, - tree::TruthPt, - tree::TruthEta, - tree::TruthPhi, - tree::TruthE, - tree::TruthCharge, - tree::PDG); + tree::VtxZ, + tree::Weight, + tree::PtHat, + tree::Multiplicity, + tree::Rct, + tree::DetPt, + tree::DetEta, + tree::DetPhi, + tree::DetCharge, + tree::GenPt, + tree::GenEta, + tree::GenPhi, + tree::GenE, + tree::GenCharge, + tree::PdgId); } -struct EECTreeCreatorTask +struct BerkeleyTreeProducer { Service pdg; - Configurable vertexZCut{"vertexZCut", 10.0f, "vertex Z cut"}; + Configurable vertexZCut{"vertexZCut", 10.0f, "maximum Z vertex"}; + Configurable etaMaxDet{"etaMaxDet", 0.9f, "maximum eta for det-level tracks"}; + Configurable etaMaxGen{"etaMaxGen", 0.9f, "maximum eta for gen-level particles"}; + Configurable ptMinDet{"ptMinDet", 0.15f, "minimum pt (GeV) for det-level tracks"}; + Configurable ptMinGen{"ptMinGen", 0.15f, "minimum pt (GeV) for gen-level particles"}; Configurable eventSelections{"eventSelections", "sel8", ""}; Configurable trackSelections{"trackSelections", "globalTracks", ""}; @@ -111,52 +131,48 @@ struct EECTreeCreatorTask std::vector detPt, detEta, detPhi; std::vector detCharge; - std::vector truthPt, truthEta, truthPhi, truthE; - std::vector truthCharge; - std::vector pdg; + std::vector genPt, genEta, genPhi, genE; + std::vector genCharge, pdgId; - for (auto const& track : tracks) - { + for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; - if( fabs(track.eta()) > 0.9) continue; - if( track.pt() < 0.15 ) continue; + if (std::fabs(track.eta()) > etaMaxDet) continue; + if (track.pt() < ptMinDet) continue; detPt.push_back(track.pt()); detEta.push_back(track.eta()); detPhi.push_back(track.phi()); detCharge.push_back(track.sign()); - } int mcId = collision.has_mcCollision() ? collision.mcCollisionId() : -1; - if (mcId >= 0) - { + if (mcId >= 0) { auto particles = mcParticles.sliceBy(particlesPerMcCollision, mcId); - for (auto const& p : particles) - { - if( !p.isPhysicalPrimary()) continue; - if( fabs(p.eta()) > 0.9) continue; - if( p.pt() < 0.15) continue; - if( !isChargedParticle(p.pdgCode())) continue; - - truthPt.push_back(p.pt()); - truthEta.push_back(p.eta()); - truthPhi.push_back(p.phi()); - truthE.push_back(p.e()); - truthCharge.push_back(getCharge(p.pdgCode())); - pdg.push_back(p.pdgCode()); + for (auto const& p : particles) { + if(!p.isPhysicalPrimary()) continue; + if(std::fabs(p.eta()) > etaMaxGen) continue; + if(p.pt() < ptMinGen) continue; + if(!isChargedParticle(p.pdgCode())) continue; + + genPt.push_back(p.pt()); + genEta.push_back(p.eta()); + genPhi.push_back(p.phi()); + genE.push_back(p.e()); + genCharge.push_back(getCharge(p.pdgCode())); + pdgId.push_back(p.pdgCode()); } } - tree( collision.posZ(), w, pthard, collision.multFT0C(), collision.rct_raw(), detPt, detEta, detPhi, detCharge, truthPt, truthEta, truthPhi, truthE, truthCharge, pdg);} + tree( collision.posZ(), w, pthard, collision.multFT0C(), collision.rct_raw(), detPt, detEta, detPhi, detCharge, genPt, genEta, genPhi, genE, genCharge, pdgId); + } - PROCESS_SWITCH(EECTreeCreatorTask, processMC, "MC processing", true); + PROCESS_SWITCH(BerkeleyTreeProducer, processMC, "MC processing", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ adaptAnalysisTask(cfgc, TaskName{"eec-tree-creator-mc"})}; + return WorkflowSpec{ adaptAnalysisTask(cfgc)}; } \ No newline at end of file From 0ec544db77f57be89ec1a9c7aa71b61d2deb148f Mon Sep 17 00:00:00 2001 From: Tucker Hwang Date: Sun, 30 Aug 2026 19:30:21 -0700 Subject: [PATCH 6/8] Add MC ID information and some event properties --- PWGJE/TableProducer/berkeleyTreeProducer.cxx | 75 +++++++++++++------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/PWGJE/TableProducer/berkeleyTreeProducer.cxx b/PWGJE/TableProducer/berkeleyTreeProducer.cxx index 02c098da114..916de53056b 100644 --- a/PWGJE/TableProducer/berkeleyTreeProducer.cxx +++ b/PWGJE/TableProducer/berkeleyTreeProducer.cxx @@ -32,43 +32,51 @@ using namespace o2::framework::expressions; namespace o2::aod { -namespace tree +namespace berkeleyTree { DECLARE_SOA_COLUMN(VtxZ, vtxZ, float); DECLARE_SOA_COLUMN(Weight, weight, float); DECLARE_SOA_COLUMN(PtHat, ptHat, float); DECLARE_SOA_COLUMN(Multiplicity, multiplicity, float); +DECLARE_SOA_COLUMN(Occupancy, occupancy, int); +DECLARE_SOA_COLUMN(EventSel, eventSel, uint16_t); DECLARE_SOA_BITMAP_COLUMN(Rct, rct, 32); DECLARE_SOA_COLUMN(DetPt, detPt, std::vector); DECLARE_SOA_COLUMN(DetEta, detEta, std::vector); DECLARE_SOA_COLUMN(DetPhi, detPhi, std::vector); -DECLARE_SOA_COLUMN(DetCharge, detCharge, std::vector); +DECLARE_SOA_COLUMN(DetTrackSel, detTrackSel, std::vector); +DECLARE_SOA_COLUMN(DetMcId, detMcId, std::vector); DECLARE_SOA_COLUMN(GenPt, genPt, std::vector); DECLARE_SOA_COLUMN(GenEta, genEta, std::vector); DECLARE_SOA_COLUMN(GenPhi, genPhi, std::vector); DECLARE_SOA_COLUMN(GenE, genE, std::vector); DECLARE_SOA_COLUMN(GenCharge, genCharge, std::vector); +DECLARE_SOA_COLUMN(GenMcId, genMcId, std::vector); DECLARE_SOA_COLUMN(PdgId, pdgId, std::vector); } -DECLARE_SOA_TABLE(TREE, "AOD", "TREE", - tree::VtxZ, - tree::Weight, - tree::PtHat, - tree::Multiplicity, - tree::Rct, - tree::DetPt, - tree::DetEta, - tree::DetPhi, - tree::DetCharge, - tree::GenPt, - tree::GenEta, - tree::GenPhi, - tree::GenE, - tree::GenCharge, - tree::PdgId); +DECLARE_SOA_TABLE(BerkeleyTree, "AOD", "BERKELEYTREE", + berkeleyTree::VtxZ, + berkeleyTree::Weight, + berkeleyTree::PtHat, + berkeleyTree::Multiplicity, + berkeleyTree::EventSel, + berkeleyTree::Occupancy, + berkeleyTree::Rct, + berkeleyTree::DetPt, + berkeleyTree::DetEta, + berkeleyTree::DetPhi, + berkeleyTree::DetTrackSel, + berkeleyTree::DetMcId, + berkeleyTree::GenPt, + berkeleyTree::GenEta, + berkeleyTree::GenPhi, + berkeleyTree::GenE, + berkeleyTree::GenCharge, + berkeleyTree::GenMcId, + berkeleyTree::PdgId); } struct BerkeleyTreeProducer @@ -118,21 +126,24 @@ struct BerkeleyTreeProducer eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections); trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections); } - - void processMC(aod::JetCollisionsMCD::iterator const& collision, aod::JetTracks const& tracks, aod::JMcParticles const& mcParticles,aod::JetMcCollisions const&) + + using JetParticlesWithOriginal = soa::Join; + void processMCJJ(aod::JetCollisionsMCD::iterator const& collision, aod::JetTracksMCD const& tracks, JetParticlesWithOriginal const& mcParticles,aod::JetMcCollisions const&) { // do not do any RCT selections, will be done on analysis level if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, false, "", false, false)) return; if (std::abs(collision.posZ()) > vertexZCut) return; - float w = collision.has_mcCollision() ? collision.mcCollision().weight() : 1.f; - float pthard = collision.has_mcCollision() ? collision.mcCollision().ptHard() : 1.f; + float weight = collision.has_mcCollision() ? collision.mcCollision().weight() : 1.f; + float pthat = collision.has_mcCollision() ? collision.mcCollision().ptHard() : 1.f; std::vector detPt, detEta, detPhi; - std::vector detCharge; - + std::vector detTrackSel; + std::vector detMcId; + std::vector genPt, genEta, genPhi, genE; std::vector genCharge, pdgId; + std::vector genMcId; for (auto const& track : tracks) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; @@ -143,7 +154,18 @@ struct BerkeleyTreeProducer detPt.push_back(track.pt()); detEta.push_back(track.eta()); detPhi.push_back(track.phi()); - detCharge.push_back(track.sign()); + detTrackSel.push_back(track.trackSel()); + if (track.has_mcParticle()) { + detMcId.push_back(track.mcParticleId()); + // auto mcpart = track.mcParticle_as(); + // LOGP(info, "partid type is {}", typeid(track.mcParticleId()).name()); + // LOGP(info, "globidx type is {}", typeid(mcpart.globalIndex()).name()); + // if (std::is_same_v) LOGP(info, "partid is a int."); + // if (std::is_same_v) LOGP(info, "globidx is a long."); + // // LOGP(info, "trk globalIndex {} mcParticleId {}, part globalIndex {}", track.globalIndex(), track.mcParticleId(), mcpart.globalIndex()); + // if (track.mcParticleId() != mcpart.globalIndex()) LOGP(fatal, "trk globalIndex {} mcParticleId {}, part globalIndex {}", track.globalIndex(), track.mcParticleId(), mcpart.globalIndex()); + } + else detMcId.push_back(-1); } int mcId = collision.has_mcCollision() ? collision.mcCollisionId() : -1; @@ -162,11 +184,12 @@ struct BerkeleyTreeProducer genPhi.push_back(p.phi()); genE.push_back(p.e()); genCharge.push_back(getCharge(p.pdgCode())); + genMcId.push_back(p.globalIndex()); pdgId.push_back(p.pdgCode()); } } - tree( collision.posZ(), w, pthard, collision.multFT0C(), collision.rct_raw(), detPt, detEta, detPhi, detCharge, genPt, genEta, genPhi, genE, genCharge, pdgId); + tree( collision.posZ(), weight, pthat, collision.multFT0C(), collision.eventSel(), collision.trackOccupancyInTimeRange(), collision.rct_raw(), detPt, detEta, detPhi, detTrackSel, detMcId, genPt, genEta, genPhi, genE, genCharge, genMcId, pdgId); } PROCESS_SWITCH(BerkeleyTreeProducer, processMC, "MC processing", true); From f1b1fdc4f85f9e8bfcd6af267620c0e4ae1d82b2 Mon Sep 17 00:00:00 2001 From: Tucker Hwang Date: Sun, 30 Aug 2026 19:49:46 -0700 Subject: [PATCH 7/8] Update name --- PWGJE/TableProducer/berkeleyTreeProducer.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGJE/TableProducer/berkeleyTreeProducer.cxx b/PWGJE/TableProducer/berkeleyTreeProducer.cxx index 916de53056b..bb3e87424b7 100644 --- a/PWGJE/TableProducer/berkeleyTreeProducer.cxx +++ b/PWGJE/TableProducer/berkeleyTreeProducer.cxx @@ -93,7 +93,7 @@ struct BerkeleyTreeProducer Configurable trackSelections{"trackSelections", "globalTracks", ""}; Configurable skipMBGapEvents{"skipMBGapEvents", true, "skip MB gap events"}; - Produces tree; + Produces tree; std::vector eventSelectionBits; int trackSelection = -1; From e438805cabac6daab7241115cfbadb46138263ad Mon Sep 17 00:00:00 2001 From: Tucker Hwang Date: Mon, 31 Aug 2026 10:26:23 -0700 Subject: [PATCH 8/8] Lint code --- PWGJE/TableProducer/berkeleyTreeProducer.cxx | 119 ++++++++++--------- 1 file changed, 61 insertions(+), 58 deletions(-) diff --git a/PWGJE/TableProducer/berkeleyTreeProducer.cxx b/PWGJE/TableProducer/berkeleyTreeProducer.cxx index bb3e87424b7..b5f55eec630 100644 --- a/PWGJE/TableProducer/berkeleyTreeProducer.cxx +++ b/PWGJE/TableProducer/berkeleyTreeProducer.cxx @@ -20,11 +20,12 @@ #include #include +#include #include -#include "Framework/O2DatabasePDGPlugin.h" -#include #include +#include +#include using namespace o2; using namespace o2::framework; @@ -32,7 +33,7 @@ using namespace o2::framework::expressions; namespace o2::aod { -namespace berkeleyTree +namespace berkeleytree { DECLARE_SOA_COLUMN(VtxZ, vtxZ, float); DECLARE_SOA_COLUMN(Weight, weight, float); @@ -46,41 +47,40 @@ DECLARE_SOA_COLUMN(DetPt, detPt, std::vector); DECLARE_SOA_COLUMN(DetEta, detEta, std::vector); DECLARE_SOA_COLUMN(DetPhi, detPhi, std::vector); DECLARE_SOA_COLUMN(DetTrackSel, detTrackSel, std::vector); -DECLARE_SOA_COLUMN(DetMcId, detMcId, std::vector); +DECLARE_SOA_COLUMN(DetMcId, detMcId, std::vector); DECLARE_SOA_COLUMN(GenPt, genPt, std::vector); DECLARE_SOA_COLUMN(GenEta, genEta, std::vector); DECLARE_SOA_COLUMN(GenPhi, genPhi, std::vector); DECLARE_SOA_COLUMN(GenE, genE, std::vector); DECLARE_SOA_COLUMN(GenCharge, genCharge, std::vector); -DECLARE_SOA_COLUMN(GenMcId, genMcId, std::vector); +DECLARE_SOA_COLUMN(GenMcId, genMcId, std::vector); DECLARE_SOA_COLUMN(PdgId, pdgId, std::vector); -} +} // namespace berkeleytree DECLARE_SOA_TABLE(BerkeleyTree, "AOD", "BERKELEYTREE", - berkeleyTree::VtxZ, - berkeleyTree::Weight, - berkeleyTree::PtHat, - berkeleyTree::Multiplicity, - berkeleyTree::EventSel, - berkeleyTree::Occupancy, - berkeleyTree::Rct, - berkeleyTree::DetPt, - berkeleyTree::DetEta, - berkeleyTree::DetPhi, - berkeleyTree::DetTrackSel, - berkeleyTree::DetMcId, - berkeleyTree::GenPt, - berkeleyTree::GenEta, - berkeleyTree::GenPhi, - berkeleyTree::GenE, - berkeleyTree::GenCharge, - berkeleyTree::GenMcId, - berkeleyTree::PdgId); -} - -struct BerkeleyTreeProducer -{ + berkeleytree::VtxZ, + berkeleytree::Weight, + berkeleytree::PtHat, + berkeleytree::Multiplicity, + berkeleytree::EventSel, + berkeleytree::Occupancy, + berkeleytree::Rct, + berkeleytree::DetPt, + berkeleytree::DetEta, + berkeleytree::DetPhi, + berkeleytree::DetTrackSel, + berkeleytree::DetMcId, + berkeleytree::GenPt, + berkeleytree::GenEta, + berkeleytree::GenPhi, + berkeleytree::GenE, + berkeleytree::GenCharge, + berkeleytree::GenMcId, + berkeleytree::PdgId); +} // namespace o2::aod + +struct BerkeleyTreeProducer { Service pdg; Configurable vertexZCut{"vertexZCut", 10.0f, "maximum Z vertex"}; @@ -111,7 +111,8 @@ struct BerkeleyTreeProducer return std::abs(charge) >= chargeUnit; } - int getCharge(int code) { + int getCharge(int code) + { auto p = pdg->GetParticle(code); if (!p) { LOG(fatal) << "Cannot find particle with PDG code " << code; @@ -126,46 +127,44 @@ struct BerkeleyTreeProducer eventSelectionBits = jetderiveddatautilities::initialiseEventSelectionBits(eventSelections); trackSelection = jetderiveddatautilities::initialiseTrackSelection(trackSelections); } - + using JetParticlesWithOriginal = soa::Join; - void processMCJJ(aod::JetCollisionsMCD::iterator const& collision, aod::JetTracksMCD const& tracks, JetParticlesWithOriginal const& mcParticles,aod::JetMcCollisions const&) + void processMCJJ(aod::JetCollisionsMCD::iterator const& collision, aod::JetTracksMCD const& tracks, JetParticlesWithOriginal const& mcParticles, aod::JetMcCollisions const&) { // do not do any RCT selections, will be done on analysis level - if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, false, "", false, false)) return; - if (std::abs(collision.posZ()) > vertexZCut) return; + if (!jetderiveddatautilities::selectCollision(collision, eventSelectionBits, skipMBGapEvents, false, "", false, false)) + return; + if (std::abs(collision.posZ()) > vertexZCut) + return; float weight = collision.has_mcCollision() ? collision.mcCollision().weight() : 1.f; float pthat = collision.has_mcCollision() ? collision.mcCollision().ptHard() : 1.f; std::vector detPt, detEta, detPhi; std::vector detTrackSel; - std::vector detMcId; - + std::vector detMcId; // track.mcParticleId() returns int/int32_t + std::vector genPt, genEta, genPhi, genE; std::vector genCharge, pdgId; - std::vector genMcId; + std::vector genMcId; // mcParticle.globalIndex() returns long/int64_t for (auto const& track : tracks) { - if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; + if (!jetderiveddatautilities::selectTrack(track, trackSelection)) + continue; - if (std::fabs(track.eta()) > etaMaxDet) continue; - if (track.pt() < ptMinDet) continue; + if (std::fabs(track.eta()) > etaMaxDet) + continue; + if (track.pt() < ptMinDet) + continue; detPt.push_back(track.pt()); detEta.push_back(track.eta()); detPhi.push_back(track.phi()); detTrackSel.push_back(track.trackSel()); - if (track.has_mcParticle()) { + if (track.has_mcParticle()) detMcId.push_back(track.mcParticleId()); - // auto mcpart = track.mcParticle_as(); - // LOGP(info, "partid type is {}", typeid(track.mcParticleId()).name()); - // LOGP(info, "globidx type is {}", typeid(mcpart.globalIndex()).name()); - // if (std::is_same_v) LOGP(info, "partid is a int."); - // if (std::is_same_v) LOGP(info, "globidx is a long."); - // // LOGP(info, "trk globalIndex {} mcParticleId {}, part globalIndex {}", track.globalIndex(), track.mcParticleId(), mcpart.globalIndex()); - // if (track.mcParticleId() != mcpart.globalIndex()) LOGP(fatal, "trk globalIndex {} mcParticleId {}, part globalIndex {}", track.globalIndex(), track.mcParticleId(), mcpart.globalIndex()); - } - else detMcId.push_back(-1); + else + detMcId.push_back(-1); } int mcId = collision.has_mcCollision() ? collision.mcCollisionId() : -1; @@ -174,10 +173,14 @@ struct BerkeleyTreeProducer auto particles = mcParticles.sliceBy(particlesPerMcCollision, mcId); for (auto const& p : particles) { - if(!p.isPhysicalPrimary()) continue; - if(std::fabs(p.eta()) > etaMaxGen) continue; - if(p.pt() < ptMinGen) continue; - if(!isChargedParticle(p.pdgCode())) continue; + if (!p.isPhysicalPrimary()) + continue; + if (std::fabs(p.eta()) > etaMaxGen) + continue; + if (p.pt() < ptMinGen) + continue; + if (!isChargedParticle(p.pdgCode())) + continue; genPt.push_back(p.pt()); genEta.push_back(p.eta()); @@ -189,13 +192,13 @@ struct BerkeleyTreeProducer } } - tree( collision.posZ(), weight, pthat, collision.multFT0C(), collision.eventSel(), collision.trackOccupancyInTimeRange(), collision.rct_raw(), detPt, detEta, detPhi, detTrackSel, detMcId, genPt, genEta, genPhi, genE, genCharge, genMcId, pdgId); + tree(collision.posZ(), weight, pthat, collision.multFT0C(), collision.eventSel(), collision.trackOccupancyInTimeRange(), collision.rct_raw(), detPt, detEta, detPhi, detTrackSel, detMcId, genPt, genEta, genPhi, genE, genCharge, genMcId, pdgId); } - PROCESS_SWITCH(BerkeleyTreeProducer, processMC, "MC processing", true); + PROCESS_SWITCH(BerkeleyTreeProducer, processMCJJ, "MC processing for JJ simulations", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ adaptAnalysisTask(cfgc)}; -} \ No newline at end of file + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +}