From 6a98d3a88e4ca4eb887b64fae621778271b4c01b Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Fri, 23 May 2025 12:10:41 +0200 Subject: [PATCH 1/7] Add files via upload --- .../TwoParticleCorrelations/Tasks/genCorr.cxx | 358 ++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx diff --git a/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx b/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx new file mode 100644 index 00000000000..37303d6cdb8 --- /dev/null +++ b/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx @@ -0,0 +1,358 @@ +// 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 genCorr.cxx +/// +/// \brief task for correlation analysis +/// \author Abhi Modak (abhi.modak@cern.ch) and Debojit sarkar (debojit.sarkar@cern.ch) +/// \since April 22, 2025 + +#include +#include +#include +#include +#include +#include +#include + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/StepTHn.h" +#include "ReconstructionDataFormats/Track.h" +#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/Core/trackUtilities.h" +#include "CommonConstants/PhysicsConstants.h" +#include "Common/Core/TrackSelection.h" +#include "Framework/ASoAHelpers.h" +#include "Common/DataModel/FT0Corrected.h" +#include "Common/Core/RecoDecay.h" +#include "CommonConstants/MathConstants.h" +#include "FT0Base/Geometry.h" +#include "FV0Base/Geometry.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" +#include "Common/DataModel/CollisionAssociationTables.h" +#include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" + +#include "CCDB/CcdbApi.h" +#include "CCDB/BasicCCDBManager.h" +#include "DetectorsCommonDataFormats/AlignParam.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::track; +using namespace o2::aod::evsel; +using namespace o2::constants::math; + +static constexpr TrackSelectionFlags::flagtype TrackSelectionIts = + TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF | + TrackSelectionFlags::kITSHits; +static constexpr TrackSelectionFlags::flagtype TrackSelectionTpc = + TrackSelectionFlags::kTPCNCls | + TrackSelectionFlags::kTPCCrossedRowsOverNCls | + TrackSelectionFlags::kTPCChi2NDF; +static constexpr TrackSelectionFlags::flagtype TrackSelectionDca = + TrackSelectionFlags::kDCAz | TrackSelectionFlags::kDCAxy; +static constexpr TrackSelectionFlags::flagtype TrackSelectionDcaxyOnly = + TrackSelectionFlags::kDCAxy; + +AxisSpec axisEvent{10, 0.5, 9.5, "#Event", "EventAxis"}; +AxisSpec amplitudeFT0{5000, 0, 10000, "FT0 amplitude"}; +AxisSpec channelFT0Axis{96, 0.0, 96.0, "FT0 channel"}; + +struct GenCorr { + + struct : ConfigurableGroup { + Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; + Configurable nolaterthan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; + } cfgCcdbParam; + + SliceCache cache; + Service ccdb; + o2::ccdb::CcdbApi ccdbApi; + std::vector* offsetFT0; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + Configurable cfgVtxCut{"vtxRange", 10.0f, "Vertex Z range to consider"}; + Configurable cfgEtaCut{"etaRange", 1.0f, "Eta range to consider"}; + Configurable dcaZ{"dcaZ", 0.2f, "Custom DCA Z cut (ignored if negative)"}; + Configurable cfgPtCutMin{"ptCutmin", 0.2f, "minimum accepted track pT"}; + Configurable cfgPtCutMax{"ptCutmax", 10.0f, "maximum accepted track pT"}; + Configurable mixingParameter{"mixingParameter", 5, "how many events are mixed"}; + Configurable cfgMinMult{"cfgMinMult", 0, "Minimum multiplicity for collision"}; + Configurable cfgMaxMult{"cfgMaxMult", 10, "Maximum multiplicity for collision"}; + Configurable cfgSampleSize{"cfgSampleSize", 10, "Sample size for mixed event"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {72, -PIHalf, PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {40, -6, -2}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisMultME{"axisMultME", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "Mixing bins - multiplicity"}; + ConfigurableAxis axisVtxZME{"axisVtxZME", {VARIABLE_WIDTH, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Mixing bins - z-vertex"}; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + ConfigurableAxis axisVtxZ{"axisVtxZ", {40, -20, 20}, "vertex axis"}; + ConfigurableAxis axisPhi{"axisPhi", {96, 0, TwoPI}, "#phi axis"}; + ConfigurableAxis axisEtaTrig{"axisEtaTrig", {40, -1., 1.}, "#eta trig axis"}; + ConfigurableAxis axisEtaAssoc{"axisEtaAssoc", {96, 3.5, 4.9}, "#eta assoc axis"}; + ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for histograms"}; + + using coltable = soa::Join; + using trkstable = soa::Filtered>; + Preslice perCollision = aod::track::collisionId; + + OutputObj same{Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; + OutputObj mixed{Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; + + void init(InitContext const&) + { + ccdb->setURL(cfgCcdbParam.cfgURL); + ccdbApi.init("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); + LOGF(info, "Getting alignment offsets from the CCDB..."); + offsetFT0 = ccdb->getForTimeStamp>("FT0/Calib/Align", cfgCcdbParam.nolaterthan.value); + printf("Offset for FT0A: x = %.3f y = %.3f z = %.3f\n", (*offsetFT0)[0].getX(), (*offsetFT0)[0].getY(), (*offsetFT0)[0].getZ()); + printf("Offset for FT0C: x = %.3f y = %.3f z = %.3f\n", (*offsetFT0)[1].getX(), (*offsetFT0)[1].getY(), (*offsetFT0)[1].getZ()); + + // QA histos + histos.add("QA/EventHist", "events", kTH1F, {axisEvent}, false); + histos.add("QA/VtxZHist", "v_{z} (cm)", kTH1F, {axisVtxZ}, false); + histos.add("QA/hMEpvz1", ";pvz;Entries", kTH1F, {{30, -15, 15}}); + histos.add("QA/hMEpvz2", ";pvz;Entries", kTH1F, {{30, -15, 15}}); + histos.add("QA/hMixingQA", "events", kTH1F, {axisEvent}, false); + + auto hstat = histos.get(HIST("QA/EventHist")); + auto* x = hstat->GetXaxis(); + x->SetBinLabel(1, "All events"); + x->SetBinLabel(2, "sel8"); + x->SetBinLabel(3, "|vz|<10"); + + histos.add("SE/hMult", "event multiplicity", kTH1D, {axisMultiplicity}); + histos.add("SE/Trig_etavsphi", ";#eta;#phi", kTH2D, {axisPhi, axisEtaTrig}); + histos.add("SE/Trig_eta", "#eta", kTH1D, {axisEtaTrig}); + histos.add("SE/Trig_phi", "#eta", kTH1D, {axisPhi}); + histos.add("SE/Trig_pt", "p_{T}", kTH1D, {axisPtTrigger}); + histos.add("SE/hMult_used", "event multiplicity", kTH1F, {axisMultiplicity}); + histos.add("SE/Trig_hist", "trig hist", kTHnSparseF, {axisSample, axisVtxZ, axisPtTrigger}); + histos.add("SE/FT0Amp", "ftoamult", kTH2D, {channelFT0Axis, amplitudeFT0}); + histos.add("SE/FT0Aeta", "ft0a;#eta", kTH1D, {axisEtaAssoc}); + histos.add("SE/FT0Aphi", "ft0a;#phi", kTH1D, {axisPhi}); + histos.add("SE/FT0Aetavsphi", ";ft0a;#eta;#phi", kTH2D, {axisPhi, axisEtaAssoc}); + histos.add("SE/deltaEta_deltaPhi", ";#delta#eta;#delta#phi", kTH2D, {axisDeltaPhi, axisDeltaEta}); + + histos.add("ME/hMult", "event multiplicity", kTH1D, {axisMultiplicity}); + histos.add("ME/Trig_etavsphi", ";#eta;#phi", kTH2D, {axisPhi, axisEtaTrig}); + histos.add("ME/Trig_eta", "#eta", kTH1D, {axisEtaTrig}); + histos.add("ME/Trig_phi", "#eta", kTH1D, {axisPhi}); + histos.add("ME/Trig_pt", "p_{T}", kTH1D, {axisPtTrigger}); + histos.add("ME/FT0Amp", "ftoamult", kTH2D, {channelFT0Axis, amplitudeFT0}); + histos.add("ME/FT0Aeta", "ft0a;#eta", kTH1D, {axisEtaAssoc}); + histos.add("ME/FT0Aphi", "ft0a;#phi", kTH1D, {axisPhi}); + histos.add("ME/FT0Aetavsphi", ";ft0a;#eta;#phi", kTH2D, {axisPhi, axisEtaAssoc}); + histos.add("ME/deltaEta_deltaPhi", ";#delta#eta;#delta#phi", kTH2D, {axisDeltaPhi, axisDeltaEta}); + + std::vector corrAxis = {{axisSample, "Sample"}, + {axisVtxZ, "z-vtx (cm)"}, + {axisPtTrigger, "p_{T} (GeV/c)"}, + {axisPtAssoc, "p_{T} (GeV/c)"}, + {axisDeltaPhi, "#Delta#varphi (rad)"}, + {axisDeltaEta, "#Delta#eta"}}; + std::vector effAxis = {{axisVertexEfficiency, "z-vtx (cm)"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisEtaEfficiency, "#eta"}}; + + std::vector userAxis; + + same.setObject(new CorrelationContainer(Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); + mixed.setObject(new CorrelationContainer(Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); + } + + double GetPhiFT0(int chno, double offsetX, double offsetY) + { + o2::ft0::Geometry ft0Det; + ft0Det.calculateChannelCenter(); + auto chPos = ft0Det.getChannelCenter(chno); + auto phi = std::atan2(chPos.Y() + offsetY, chPos.X() + offsetX); + if (phi < 0) { + phi = TwoPI - std::abs(phi); + } + return phi; + } + + double GetEtaFT0(int chno, double offsetX, double offsetY, double offsetZ) + { + o2::ft0::Geometry ft0Det; + ft0Det.calculateChannelCenter(); + auto chPos = ft0Det.getChannelCenter(chno); + auto x = chPos.X() + offsetX; + auto y = chPos.Y() + offsetY; + auto z = chPos.Z() + offsetZ; + auto r = std::sqrt(x * x + y * y); + auto theta = std::atan2(r, z); + return -std::log(std::tan(0.5 * theta)); + } + + Filter fTrackSelectionITS = ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::ITS) && + ncheckbit(aod::track::trackCutFlag, TrackSelectionIts); + Filter fTrackSelectionTPC = ifnode(ncheckbit(aod::track::v001::detectorMap, (uint8_t)o2::aod::track::TPC), + ncheckbit(aod::track::trackCutFlag, TrackSelectionTpc), true); + Filter fTrackSelectionDCA = ifnode(dcaZ.node() > 0.f, nabs(aod::track::dcaZ) <= dcaZ && ncheckbit(aod::track::trackCutFlag, TrackSelectionDcaxyOnly), + ncheckbit(aod::track::trackCutFlag, TrackSelectionDca)); + Filter fTracksEta = nabs(aod::track::eta) < cfgEtaCut; + Filter fTracksPt = (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax); + + template + bool isEventSelected(CheckCol const& col) + { + histos.fill(HIST("QA/EventHist"), 1); + if (!col.sel8()) { + return false; + } + histos.fill(HIST("QA/EventHist"), 2); + if (std::abs(col.posZ()) >= cfgVtxCut) { + return false; + } + histos.fill(HIST("QA/EventHist"), 3); + histos.fill(HIST("QA/VtxZHist"), col.posZ()); + return true; + } + + template + void fillYield(TCollision collision, TTracks tracks, bool mixing) + { + if (mixing) { + histos.fill(HIST("ME/hMult"), tracks.size()); + for (auto const& triggerTrack : tracks) { + histos.fill(HIST("ME/Trig_etavsphi"), triggerTrack.phi(), triggerTrack.eta()); + histos.fill(HIST("ME/Trig_eta"), triggerTrack.eta()); + histos.fill(HIST("ME/Trig_phi"), triggerTrack.phi()); + histos.fill(HIST("ME/Trig_pt"), triggerTrack.pt()); + } + } else { + histos.fill(HIST("SE/hMult"), tracks.size()); + for (auto const& triggerTrack : tracks) { + histos.fill(HIST("SE/Trig_etavsphi"), triggerTrack.phi(), triggerTrack.eta()); + histos.fill(HIST("SE/Trig_eta"), triggerTrack.eta()); + histos.fill(HIST("SE/Trig_phi"), triggerTrack.phi()); + histos.fill(HIST("SE/Trig_pt"), triggerTrack.pt()); + } + } + } + + template + void fillCorrelation(TTarget target, TTriggers const& triggers, TFT0s const& ft0, bool mixing, float vz) + { + int fSampleIndex = gRandom->Uniform(0, cfgSampleSize); + if (!mixing) + histos.fill(HIST("SE/hMult_used"), triggers.size()); + for (auto const& triggerTrack : triggers) { + if (!mixing) + histos.fill(HIST("SE/Trig_hist"), fSampleIndex, vz, triggerTrack.pt()); + + auto offsetFT0Ax = (*offsetFT0)[0].getX(); + auto offsetFT0Ay = (*offsetFT0)[0].getY(); + auto offsetFT0Az = (*offsetFT0)[0].getZ(); + for (std::size_t iChA = 0; iChA < ft0.channelA().size(); iChA++) { + auto chanelid = ft0.channelA()[iChA]; + float ampl = ft0.amplitudeA()[iChA]; + if (ampl <= 0) + continue; + if (mixing) + histos.fill(HIST("ME/FT0Amp"), chanelid, ampl); + else + histos.fill(HIST("SE/FT0Amp"), chanelid, ampl); + + auto phiA = GetPhiFT0(chanelid, offsetFT0Ax, offsetFT0Ay); + auto etaA = GetEtaFT0(chanelid, offsetFT0Ax, offsetFT0Ay, offsetFT0Az); + + if (mixing) { + histos.fill(HIST("ME/FT0Aeta"), etaA); + histos.fill(HIST("ME/FT0Aphi"), phiA); + histos.fill(HIST("ME/FT0Aetavsphi"), phiA, etaA); + } else { + histos.fill(HIST("SE/FT0Aeta"), etaA); + histos.fill(HIST("SE/FT0Aphi"), phiA); + histos.fill(HIST("SE/FT0Aetavsphi"), phiA, etaA); + } + float deltaPhi = RecoDecay::constrainAngle(triggerTrack.phi() - phiA, -PIHalf); + float deltaEta = triggerTrack.eta() - etaA; + // LOGF(info, "delta eta = %f and delta phi = %f", deltaEta, deltaPhi); + if (mixing) + histos.fill(HIST("ME/deltaEta_deltaPhi"), deltaPhi, deltaEta); + else + histos.fill(HIST("SE/deltaEta_deltaPhi"), deltaPhi, deltaEta); + target->getPairHist()->Fill(step, fSampleIndex, vz, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta); + } // associated ft0 tracks + } // trigger tracks + } // fillCorrelation + + void processSE(coltable::iterator const& col, aod::FT0s const&, trkstable const& tracks) + { + if (!isEventSelected(col)) { + return; + } + if (col.has_foundFT0()) { + fillYield(col, tracks, false); + const auto& ft0 = col.foundFT0(); + if (tracks.size() < cfgMinMult || tracks.size() >= cfgMaxMult) { + return; + } + fillCorrelation(same, tracks, ft0, false, col.posZ()); + } + } // same event + + void processME(coltable const& col, aod::FT0s const&, trkstable const& tracks) + { + auto getTracksSize = [&tracks, this](coltable::iterator const& collision) { + auto associatedTracks = tracks.sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), this->cache); + return associatedTracks.size(); + }; + using MixedBinning = FlexibleBinningPolicy, aod::collision::PosZ, decltype(getTracksSize)>; + MixedBinning binningOnVtxAndMult{{getTracksSize}, {axisVtxZME, axisMultME}, true}; + for (auto const& [col1, col2] : soa::selfCombinations(binningOnVtxAndMult, mixingParameter, -1, col, col)) { + if (!isEventSelected(col1) || !isEventSelected(col2)) { + continue; + } + if (col1.globalIndex() == col2.globalIndex()) { + histos.fill(HIST("QA/hMixingQA"), 1.0); // same-collision pair counting + continue; + } + if (col1.has_foundFT0() && col2.has_foundFT0()) { + histos.fill(HIST("QA/hMEpvz1"), col1.posZ()); + histos.fill(HIST("QA/hMEpvz2"), col2.posZ()); + auto slicedTriggerTracks = tracks.sliceBy(perCollision, col1.globalIndex()); + fillYield(col1, slicedTriggerTracks, true); + const auto& ft0 = col2.foundFT0(); + if (slicedTriggerTracks.size() < cfgMinMult || slicedTriggerTracks.size() >= cfgMaxMult) { + continue; + } + fillCorrelation(mixed, slicedTriggerTracks, ft0, true, col1.posZ()); + } + } + } // mixed event + + PROCESS_SWITCH(GenCorr, processSE, "process same event", false); + PROCESS_SWITCH(GenCorr, processME, "process mixed event", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 1257766f85ca15ca57710463e9b2ba52daae6120 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Fri, 23 May 2025 12:12:08 +0200 Subject: [PATCH 2/7] Update CMakeLists.txt --- PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt index de8948f260d..590e642df77 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt +++ b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt @@ -63,6 +63,11 @@ o2physics_add_dpl_workflow(di-hadron-cor PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(gen-corr + SOURCES genCorr.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore + COMPONENT_NAME Analysis) + From 340d5b6c6fdc68f7af2ece4f77e76030c0c25191 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Fri, 23 May 2025 12:36:23 +0200 Subject: [PATCH 3/7] Fix o2 liner errors inside genCorr.cxx --- .../TwoParticleCorrelations/Tasks/genCorr.cxx | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx b/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx index 37303d6cdb8..86840953853 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx @@ -79,7 +79,7 @@ struct GenCorr { struct : ConfigurableGroup { Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; - Configurable nolaterthan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; + Configurable noLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; } cfgCcdbParam; SliceCache cache; @@ -87,11 +87,11 @@ struct GenCorr { o2::ccdb::CcdbApi ccdbApi; std::vector* offsetFT0; HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - Configurable cfgVtxCut{"vtxRange", 10.0f, "Vertex Z range to consider"}; - Configurable cfgEtaCut{"etaRange", 1.0f, "Eta range to consider"}; + Configurable cfgVtxCut{"cfgVtxCut", 10.0f, "Vertex Z range to consider"}; + Configurable cfgEtaCut{"cfgEtaCut", 1.0f, "Eta range to consider"}; Configurable dcaZ{"dcaZ", 0.2f, "Custom DCA Z cut (ignored if negative)"}; - Configurable cfgPtCutMin{"ptCutmin", 0.2f, "minimum accepted track pT"}; - Configurable cfgPtCutMax{"ptCutmax", 10.0f, "maximum accepted track pT"}; + Configurable cfgPtCutMin{"cfgPtCutMin", 0.2f, "minimum accepted track pT"}; + Configurable cfgPtCutMax{"cfgPtCutMax", 10.0f, "maximum accepted track pT"}; Configurable mixingParameter{"mixingParameter", 5, "how many events are mixed"}; Configurable cfgMinMult{"cfgMinMult", 0, "Minimum multiplicity for collision"}; Configurable cfgMaxMult{"cfgMaxMult", 10, "Maximum multiplicity for collision"}; @@ -112,9 +112,9 @@ struct GenCorr { ConfigurableAxis axisSample{"axisSample", {cfgSampleSize, 0, cfgSampleSize}, "sample axis for histograms"}; ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 80, 100}, "multiplicity / centrality axis for histograms"}; - using coltable = soa::Join; - using trkstable = soa::Filtered>; - Preslice perCollision = aod::track::collisionId; + using CollTable = soa::Join; + using TrksTable = soa::Filtered>; + Preslice perCollision = aod::track::collisionId; OutputObj same{Form("sameEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; OutputObj mixed{Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult))}; @@ -127,9 +127,9 @@ struct GenCorr { ccdb->setLocalObjectValidityChecking(); ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); LOGF(info, "Getting alignment offsets from the CCDB..."); - offsetFT0 = ccdb->getForTimeStamp>("FT0/Calib/Align", cfgCcdbParam.nolaterthan.value); - printf("Offset for FT0A: x = %.3f y = %.3f z = %.3f\n", (*offsetFT0)[0].getX(), (*offsetFT0)[0].getY(), (*offsetFT0)[0].getZ()); - printf("Offset for FT0C: x = %.3f y = %.3f z = %.3f\n", (*offsetFT0)[1].getX(), (*offsetFT0)[1].getY(), (*offsetFT0)[1].getZ()); + offsetFT0 = ccdb->getForTimeStamp>("FT0/Calib/Align", cfgCcdbParam.noLaterThan.value); + LOGF(info, "Offset for FT0A: x = %.3f y = %.3f z = %.3f\n", (*offsetFT0)[0].getX(), (*offsetFT0)[0].getY(), (*offsetFT0)[0].getZ()); + LOGF(info, "Offset for FT0C: x = %.3f y = %.3f z = %.3f\n", (*offsetFT0)[1].getX(), (*offsetFT0)[1].getY(), (*offsetFT0)[1].getZ()); // QA histos histos.add("QA/EventHist", "events", kTH1F, {axisEvent}, false); @@ -184,7 +184,7 @@ struct GenCorr { mixed.setObject(new CorrelationContainer(Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), Form("mixedEvent_%i_%i", static_cast(cfgMinMult), static_cast(cfgMaxMult)), corrAxis, effAxis, userAxis)); } - double GetPhiFT0(int chno, double offsetX, double offsetY) + double getPhiFT0(int chno, double offsetX, double offsetY) { o2::ft0::Geometry ft0Det; ft0Det.calculateChannelCenter(); @@ -196,7 +196,7 @@ struct GenCorr { return phi; } - double GetEtaFT0(int chno, double offsetX, double offsetY, double offsetZ) + double getEtaFT0(int chno, double offsetX, double offsetY, double offsetZ) { o2::ft0::Geometry ft0Det; ft0Det.calculateChannelCenter(); @@ -279,8 +279,8 @@ struct GenCorr { else histos.fill(HIST("SE/FT0Amp"), chanelid, ampl); - auto phiA = GetPhiFT0(chanelid, offsetFT0Ax, offsetFT0Ay); - auto etaA = GetEtaFT0(chanelid, offsetFT0Ax, offsetFT0Ay, offsetFT0Az); + auto phiA = getPhiFT0(chanelid, offsetFT0Ax, offsetFT0Ay); + auto etaA = getEtaFT0(chanelid, offsetFT0Ax, offsetFT0Ay, offsetFT0Az); if (mixing) { histos.fill(HIST("ME/FT0Aeta"), etaA); @@ -303,7 +303,7 @@ struct GenCorr { } // trigger tracks } // fillCorrelation - void processSE(coltable::iterator const& col, aod::FT0s const&, trkstable const& tracks) + void processSE(CollTable::iterator const& col, aod::FT0s const&, TrksTable const& tracks) { if (!isEventSelected(col)) { return; @@ -318,9 +318,9 @@ struct GenCorr { } } // same event - void processME(coltable const& col, aod::FT0s const&, trkstable const& tracks) + void processME(CollTable const& col, aod::FT0s const&, TrksTable const& tracks) { - auto getTracksSize = [&tracks, this](coltable::iterator const& collision) { + auto getTracksSize = [&tracks, this](CollTable::iterator const& collision) { auto associatedTracks = tracks.sliceByCached(o2::aod::track::collisionId, collision.globalIndex(), this->cache); return associatedTracks.size(); }; From 7e9369e5190f5ab2a786b1768028286e81bbfaef Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Fri, 23 May 2025 15:38:58 +0200 Subject: [PATCH 4/7] Update and rename genCorr.cxx to longrangeCorrelation.cxx --- .../{genCorr.cxx => longrangeCorrelation.cxx} | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) rename PWGCF/TwoParticleCorrelations/Tasks/{genCorr.cxx => longrangeCorrelation.cxx} (95%) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx similarity index 95% rename from PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx rename to PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx index 86840953853..3b15d74be4b 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/genCorr.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx @@ -9,9 +9,9 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. /// -/// \file genCorr.cxx +/// \file longrangeCorrelation.cxx /// -/// \brief task for correlation analysis +/// \brief task for long range correlation analysis /// \author Abhi Modak (abhi.modak@cern.ch) and Debojit sarkar (debojit.sarkar@cern.ch) /// \since April 22, 2025 @@ -75,11 +75,11 @@ AxisSpec axisEvent{10, 0.5, 9.5, "#Event", "EventAxis"}; AxisSpec amplitudeFT0{5000, 0, 10000, "FT0 amplitude"}; AxisSpec channelFT0Axis{96, 0.0, 96.0, "FT0 channel"}; -struct GenCorr { +struct LongrangeCorrelation { struct : ConfigurableGroup { Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; - Configurable noLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; + Configurable noLaterThan{"noLaterThan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; } cfgCcdbParam; SliceCache cache; @@ -189,11 +189,7 @@ struct GenCorr { o2::ft0::Geometry ft0Det; ft0Det.calculateChannelCenter(); auto chPos = ft0Det.getChannelCenter(chno); - auto phi = std::atan2(chPos.Y() + offsetY, chPos.X() + offsetX); - if (phi < 0) { - phi = TwoPI - std::abs(phi); - } - return phi; + return RecoDecay::phi(chPos.X() + offsetX, chPos.Y() + offsetY); } double getEtaFT0(int chno, double offsetX, double offsetY, double offsetZ) @@ -293,8 +289,7 @@ struct GenCorr { } float deltaPhi = RecoDecay::constrainAngle(triggerTrack.phi() - phiA, -PIHalf); float deltaEta = triggerTrack.eta() - etaA; - // LOGF(info, "delta eta = %f and delta phi = %f", deltaEta, deltaPhi); - if (mixing) + if (mixing) histos.fill(HIST("ME/deltaEta_deltaPhi"), deltaPhi, deltaEta); else histos.fill(HIST("SE/deltaEta_deltaPhi"), deltaPhi, deltaEta); @@ -348,11 +343,11 @@ struct GenCorr { } } // mixed event - PROCESS_SWITCH(GenCorr, processSE, "process same event", false); - PROCESS_SWITCH(GenCorr, processME, "process mixed event", false); + PROCESS_SWITCH(LongrangeCorrelation, processSE, "process same event", false); + PROCESS_SWITCH(LongrangeCorrelation, processME, "process mixed event", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 06625f5bdbd2d22cf69c21445d863cabbf6b7d97 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Fri, 23 May 2025 15:40:04 +0200 Subject: [PATCH 5/7] Update CMakeLists.txt --- PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt index 590e642df77..d150b6954db 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt +++ b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt @@ -63,8 +63,8 @@ o2physics_add_dpl_workflow(di-hadron-cor PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(gen-corr - SOURCES genCorr.cxx +o2physics_add_dpl_workflow(longrange-correlation + SOURCES longrangeCorrelation.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) From 27bc9fa8a7431269254cba8dd35102baa5f658e7 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Fri, 23 May 2025 13:40:40 +0000 Subject: [PATCH 6/7] Please consider the following formatting changes --- PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx index 3b15d74be4b..38f721b1916 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx @@ -289,7 +289,7 @@ struct LongrangeCorrelation { } float deltaPhi = RecoDecay::constrainAngle(triggerTrack.phi() - phiA, -PIHalf); float deltaEta = triggerTrack.eta() - etaA; - if (mixing) + if (mixing) histos.fill(HIST("ME/deltaEta_deltaPhi"), deltaPhi, deltaEta); else histos.fill(HIST("SE/deltaEta_deltaPhi"), deltaPhi, deltaEta); From 3d194e9ec27b8e01fc000c0ed158de179bbc7745 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Fri, 23 May 2025 16:16:00 +0200 Subject: [PATCH 7/7] Fix build/O2Physics/o2/macOS-arm error --- .../Tasks/longrangeCorrelation.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx index 38f721b1916..5fb1bc8e1c8 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangeCorrelation.cxx @@ -230,8 +230,8 @@ struct LongrangeCorrelation { return true; } - template - void fillYield(TCollision collision, TTracks tracks, bool mixing) + template + void fillYield(TTracks tracks, bool mixing) { if (mixing) { histos.fill(HIST("ME/hMult"), tracks.size()); @@ -304,7 +304,7 @@ struct LongrangeCorrelation { return; } if (col.has_foundFT0()) { - fillYield(col, tracks, false); + fillYield(tracks, false); const auto& ft0 = col.foundFT0(); if (tracks.size() < cfgMinMult || tracks.size() >= cfgMaxMult) { return; @@ -333,7 +333,7 @@ struct LongrangeCorrelation { histos.fill(HIST("QA/hMEpvz1"), col1.posZ()); histos.fill(HIST("QA/hMEpvz2"), col2.posZ()); auto slicedTriggerTracks = tracks.sliceBy(perCollision, col1.globalIndex()); - fillYield(col1, slicedTriggerTracks, true); + fillYield(slicedTriggerTracks, true); const auto& ft0 = col2.foundFT0(); if (slicedTriggerTracks.size() < cfgMinMult || slicedTriggerTracks.size() >= cfgMaxMult) { continue;