Skip to content

Commit 1d8e586

Browse files
allesgraualibuild
andauthored
[PWGCF] Extend femtoPairV0V0 task for Lambda-AntiLambda analyses (#15397)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent a0e7f62 commit 1d8e586

File tree

2 files changed

+284
-0
lines changed

2 files changed

+284
-0
lines changed

PWGCF/FemtoWorld/Tasks/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,8 @@ o2physics_add_dpl_workflow(femto-world-efficiency-task-de
5353
SOURCES femtoWorldEfficiencyTaskDe.cxx
5454
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
5555
COMPONENT_NAME Analysis)
56+
57+
o2physics_add_dpl_workflow(femto-pair-lambda-antilambda
58+
SOURCES femtoPairLambdaAntilambda.cxx
59+
PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore
60+
COMPONENT_NAME Analysis)
Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,279 @@
1+
// Copyright 2019-2025 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
/// \file FemtoPairLambdaAntilambda.cxx
13+
/// \brief Tasks that computes correlation between two v0s
14+
/// \author Anton Riedel, TU München, anton.riedel@cern.ch
15+
/// \author Barbara Gawlik, WUT Warsaw, barbara.maria.gawlik@cern.ch
16+
17+
#include "PWGCF/Femto/Core/closePairRejection.h"
18+
#include "PWGCF/Femto/Core/collisionBuilder.h"
19+
#include "PWGCF/Femto/Core/collisionHistManager.h"
20+
#include "PWGCF/Femto/Core/modes.h"
21+
#include "PWGCF/Femto/Core/pairBuilder.h"
22+
#include "PWGCF/Femto/Core/pairHistManager.h"
23+
#include "PWGCF/Femto/Core/particleCleaner.h"
24+
#include "PWGCF/Femto/Core/partitions.h"
25+
#include "PWGCF/Femto/Core/trackHistManager.h"
26+
#include "PWGCF/Femto/Core/v0Builder.h"
27+
#include "PWGCF/Femto/Core/v0HistManager.h"
28+
#include "PWGCF/Femto/DataModel/FemtoTables.h"
29+
30+
#include "Framework/ASoA.h"
31+
#include "Framework/AnalysisHelpers.h"
32+
#include "Framework/AnalysisTask.h"
33+
#include "Framework/BinningPolicy.h"
34+
#include "Framework/Configurable.h"
35+
#include "Framework/Expressions.h"
36+
#include "Framework/HistogramRegistry.h"
37+
#include "Framework/InitContext.h"
38+
#include "Framework/OutputObjHeader.h"
39+
#include "Framework/runDataProcessing.h"
40+
41+
#include <map>
42+
#include <vector>
43+
44+
using namespace o2::analysis::femto;
45+
46+
struct FemtoPairLambdaAntilambda {
47+
48+
// setup tables
49+
using FemtoCollisions = o2::soa::Join<o2::aod::FCols, o2::aod::FColMasks>;
50+
using FilteredFemtoCollisions = o2::soa::Filtered<FemtoCollisions>;
51+
using FilteredFemtoCollision = FilteredFemtoCollisions::iterator;
52+
53+
using FemtoCollisionsWithLabel = o2::soa::Join<FemtoCollisions, o2::aod::FColLabels>;
54+
using FilteredFemtoCollisionsWithLabel = o2::soa::Filtered<FemtoCollisionsWithLabel>;
55+
using FilteredFemtoCollisionWithLabel = FilteredFemtoCollisionsWithLabel::iterator;
56+
57+
using FemtoTracks = o2::soa::Join<o2::aod::FTracks, o2::aod::FTrackMasks>;
58+
using FemtoLambdas = o2::soa::Join<o2::aod::FLambdas, o2::aod::FLambdaMasks>;
59+
using FemtoK0shorts = o2::soa::Join<o2::aod::FK0shorts, o2::aod::FK0shortMasks>;
60+
61+
using FemtoTracksWithLabel = o2::soa::Join<FemtoTracks, o2::aod::FTrackLabels>;
62+
using FemtoLambdasWithLabel = o2::soa::Join<FemtoLambdas, o2::aod::FLambdaLabels>;
63+
using FemtoK0shortsWithLabel = o2::soa::Join<FemtoK0shorts, o2::aod::FK0shortLabels>;
64+
65+
o2::framework::SliceCache cache;
66+
67+
// setup collisions
68+
collisionbuilder::ConfCollisionSelection collisionSelection;
69+
o2::framework::expressions::Filter collisionFilter = MAKE_COLLISION_FILTER(collisionSelection);
70+
colhistmanager::ConfCollisionBinning confCollisionBinning;
71+
72+
// setup for daughters
73+
trackhistmanager::ConfV0PosDauBinning confPosDauBinning;
74+
trackhistmanager::ConfV0NegDauBinning confNegDauBinning;
75+
76+
// setup lambdas
77+
v0builder::ConfLambdaSelection1 confLambdaSelection;
78+
v0builder::ConfLambdaSelection2 confLambdaSelection2;
79+
particlecleaner::ConfLambdaCleaner1 confLambdaCleaner;
80+
v0histmanager::ConfLambdaBinning1 confLambdaBinning;
81+
82+
o2::framework::Partition<FemtoLambdas> lambdaPartition = MAKE_LAMBDA_PARTITION(confLambdaSelection);
83+
o2::framework::Partition<FemtoLambdas> lambdaPartition2 = MAKE_LAMBDA_PARTITION(confLambdaSelection2);
84+
o2::framework::Preslice<FemtoLambdas> perColLambdas = o2::aod::femtobase::stored::fColId;
85+
86+
o2::framework::Partition<FemtoLambdasWithLabel> lambdaWithLabelPartition = MAKE_LAMBDA_PARTITION(confLambdaSelection);
87+
o2::framework::Partition<FemtoLambdasWithLabel> lambdaWithLabelPartition2 = MAKE_LAMBDA_PARTITION(confLambdaSelection2);
88+
o2::framework::Preslice<FemtoLambdasWithLabel> perCollambdasWithLabel = o2::aod::femtobase::stored::fColId;
89+
90+
// setup k0shorts
91+
v0builder::ConfK0shortSelection1 confK0shortSelection;
92+
particlecleaner::ConfK0shortCleaner1 confK0shortCleaner;
93+
v0histmanager::ConfK0shortBinning1 confK0shortBinning;
94+
95+
o2::framework::Partition<FemtoK0shorts> k0shortPartition = MAKE_K0SHORT_PARTITION(confK0shortSelection);
96+
o2::framework::Preslice<FemtoK0shorts> perColk0shorts = o2::aod::femtobase::stored::fColId;
97+
98+
o2::framework::Partition<FemtoK0shortsWithLabel> k0shortWithLabelPartition = MAKE_K0SHORT_PARTITION(confK0shortSelection);
99+
o2::framework::Preslice<FemtoK0shortsWithLabel> perColk0shortsWithLabel = o2::aod::femtobase::stored::fColId;
100+
101+
// setup pairs
102+
pairhistmanager::ConfPairBinning confPairBinning;
103+
pairhistmanager::ConfPairCuts confPairCuts;
104+
105+
pairbuilder::PairV0V0Builder<
106+
v0histmanager::PrefixLambda1,
107+
trackhistmanager::PrefixV01PosDaughter,
108+
trackhistmanager::PrefixV01NegDaughter,
109+
v0histmanager::PrefixLambda2,
110+
trackhistmanager::PrefixV02PosDaughter,
111+
trackhistmanager::PrefixV02NegDaughter,
112+
pairhistmanager::PrefixV0V0Se,
113+
pairhistmanager::PrefixV0V0Me,
114+
closepairrejection::PrefixV0V0PosSe,
115+
closepairrejection::PrefixV0V0NegSe,
116+
closepairrejection::PrefixV0V0PosMe,
117+
closepairrejection::PrefixV0V0NegMe,
118+
modes::V0::kLambda,
119+
modes::V0::kLambda>
120+
pairLambdaLambdaBuilder;
121+
122+
pairbuilder::PairV0V0Builder<
123+
v0histmanager::PrefixK0short1,
124+
trackhistmanager::PrefixV01PosDaughter,
125+
trackhistmanager::PrefixV01NegDaughter,
126+
v0histmanager::PrefixK0short2,
127+
trackhistmanager::PrefixV02PosDaughter,
128+
trackhistmanager::PrefixV02NegDaughter,
129+
pairhistmanager::PrefixV0V0Se,
130+
pairhistmanager::PrefixV0V0Me,
131+
closepairrejection::PrefixV0V0PosSe,
132+
closepairrejection::PrefixV0V0NegSe,
133+
closepairrejection::PrefixV0V0PosMe,
134+
closepairrejection::PrefixV0V0NegMe,
135+
modes::V0::kK0short,
136+
modes::V0::kK0short>
137+
pairK0shortK0shortBuilder;
138+
139+
// setup mixing
140+
std::vector<double> defaultVtxBins{10, -10, 10};
141+
std::vector<double> defaultMultBins{50, 0, 200};
142+
std::vector<double> defaultCentBins{10, 0, 100};
143+
o2::framework::ColumnBinningPolicy<o2::aod::femtocollisions::PosZ, o2::aod::femtocollisions::Mult> mixBinsVtxMult{{defaultVtxBins, defaultMultBins}, true};
144+
o2::framework::ColumnBinningPolicy<o2::aod::femtocollisions::PosZ, o2::aod::femtocollisions::Cent> mixBinsVtxCent{{defaultVtxBins, defaultCentBins}, true};
145+
o2::framework::ColumnBinningPolicy<o2::aod::femtocollisions::PosZ, o2::aod::femtocollisions::Mult, o2::aod::femtocollisions::Cent> mixBinsVtxMultCent{{defaultVtxBins, defaultMultBins, defaultCentBins}, true};
146+
pairhistmanager::ConfMixing confMixing;
147+
148+
o2::framework::HistogramRegistry hRegistry{"FemtoV0V0", {}, o2::framework::OutputObjHandlingPolicy::AnalysisObject};
149+
150+
// setup cpr
151+
closepairrejection::ConfCprV0DaugherV0DaughterPos confCprPos;
152+
closepairrejection::ConfCprV0DaugherV0DaughterNeg confCprNeg;
153+
154+
void init(o2::framework::InitContext&)
155+
{
156+
157+
// TODO: implement lambda-k0short
158+
bool processData = doprocessLambdaLambdaSameEvent || doprocessLambdaLambdaSameEvent || doprocessK0shortK0shortSameEvent || doprocessK0shortK0shortSameEvent;
159+
bool processMc = doprocessLambdaLambdaSameEventMc || doprocessLambdaLambdaSameEventMc || doprocessK0shortK0shortSameEventMc || doprocessK0shortK0shortSameEventMc;
160+
161+
if (processData && processMc) {
162+
LOG(fatal) << "Both data and mc processing is enabled. Breaking...";
163+
}
164+
165+
bool processLambdaLambda = doprocessLambdaLambdaSameEvent || doprocessLambdaLambdaMixedEvent || doprocessLambdaLambdaSameEventMc || doprocessLambdaLambdaMixedEventMc;
166+
bool processK0shortK0short = doprocessK0shortK0shortSameEvent || doprocessK0shortK0shortMixedEvent || doprocessK0shortK0shortSameEventMc || doprocessK0shortK0shortMixedEventMc;
167+
168+
if (processLambdaLambda && processK0shortK0short) {
169+
LOG(fatal) << "Both lambda-lambda and k0short-k0short processing is enabled. Breaking...";
170+
}
171+
172+
// setup columnpolicy for binning
173+
// default values are used during instantiation, so we need to explicity update them here
174+
mixBinsVtxMult = {{confMixing.vtxBins, confMixing.multBins.value}, true};
175+
mixBinsVtxCent = {{confMixing.vtxBins.value, confMixing.centBins.value}, true};
176+
mixBinsVtxMultCent = {{confMixing.vtxBins.value, confMixing.multBins.value, confMixing.centBins.value}, true};
177+
178+
// setup histograms
179+
std::map<colhistmanager::ColHist, std::vector<o2::framework::AxisSpec>> colHistSpec;
180+
std::map<trackhistmanager::TrackHist, std::vector<o2::framework::AxisSpec>> trackHistSpec;
181+
std::map<trackhistmanager::TrackHist, std::vector<o2::framework::AxisSpec>> posDauSpec;
182+
std::map<trackhistmanager::TrackHist, std::vector<o2::framework::AxisSpec>> negDauSpec;
183+
std::map<v0histmanager::V0Hist, std::vector<o2::framework::AxisSpec>> lambdaHistSpec;
184+
std::map<v0histmanager::V0Hist, std::vector<o2::framework::AxisSpec>> k0shortHistSpec;
185+
std::map<pairhistmanager::PairHist, std::vector<o2::framework::AxisSpec>> pairV0V0HistSpec;
186+
std::map<closepairrejection::CprHist, std::vector<o2::framework::AxisSpec>> cprHistSpecPos = closepairrejection::makeCprHistSpecMap(confCprPos);
187+
std::map<closepairrejection::CprHist, std::vector<o2::framework::AxisSpec>> cprHistSpecNeg = closepairrejection::makeCprHistSpecMap(confCprNeg);
188+
189+
if (processData) {
190+
colHistSpec = colhistmanager::makeColHistSpecMap(confCollisionBinning);
191+
posDauSpec = trackhistmanager::makeTrackHistSpecMap(confPosDauBinning);
192+
negDauSpec = trackhistmanager::makeTrackHistSpecMap(confNegDauBinning);
193+
if (processLambdaLambda) {
194+
lambdaHistSpec = v0histmanager::makeV0HistSpecMap(confLambdaBinning);
195+
pairV0V0HistSpec = pairhistmanager::makePairHistSpecMap(confPairBinning);
196+
pairLambdaLambdaBuilder.init<modes::Mode::kAnalysis>(&hRegistry, confCollisionBinning, confLambdaSelection, confLambdaSelection2, confLambdaCleaner, confLambdaCleaner, confCprPos, confCprNeg, confMixing, confPairBinning, confPairCuts, colHistSpec, lambdaHistSpec, lambdaHistSpec, posDauSpec, negDauSpec, pairV0V0HistSpec, cprHistSpecPos, cprHistSpecNeg);
197+
}
198+
199+
// setup for k0short
200+
if (doprocessK0shortK0shortSameEvent || doprocessK0shortK0shortMixedEvent) {
201+
k0shortHistSpec = v0histmanager::makeV0HistSpecMap(confK0shortBinning);
202+
pairV0V0HistSpec = pairhistmanager::makePairHistSpecMap(confPairBinning);
203+
pairK0shortK0shortBuilder.init<modes::Mode::kAnalysis>(&hRegistry, confCollisionBinning, confK0shortSelection, confK0shortSelection, confK0shortCleaner, confK0shortCleaner, confCprPos, confCprNeg, confMixing, confPairBinning, confPairCuts, colHistSpec, k0shortHistSpec, k0shortHistSpec, posDauSpec, negDauSpec, pairV0V0HistSpec, cprHistSpecPos, cprHistSpecNeg);
204+
}
205+
} else {
206+
colHistSpec = colhistmanager::makeColMcHistSpecMap(confCollisionBinning);
207+
posDauSpec = trackhistmanager::makeTrackMcHistSpecMap(confPosDauBinning);
208+
negDauSpec = trackhistmanager::makeTrackMcHistSpecMap(confNegDauBinning);
209+
if (processLambdaLambda) {
210+
lambdaHistSpec = v0histmanager::makeV0McHistSpecMap(confLambdaBinning);
211+
pairV0V0HistSpec = pairhistmanager::makePairMcHistSpecMap(confPairBinning);
212+
pairLambdaLambdaBuilder.init<modes::Mode::kAnalysis_Qa>(&hRegistry, confCollisionBinning, confLambdaSelection, confLambdaSelection2, confLambdaCleaner, confLambdaCleaner, confCprPos, confCprNeg, confMixing, confPairBinning, confPairCuts, colHistSpec, lambdaHistSpec, lambdaHistSpec, posDauSpec, negDauSpec, pairV0V0HistSpec, cprHistSpecPos, cprHistSpecNeg);
213+
}
214+
215+
// setup for k0short
216+
if (doprocessK0shortK0shortSameEvent || doprocessK0shortK0shortMixedEvent) {
217+
k0shortHistSpec = v0histmanager::makeV0McHistSpecMap(confK0shortBinning);
218+
pairV0V0HistSpec = pairhistmanager::makePairMcHistSpecMap(confPairBinning);
219+
pairK0shortK0shortBuilder.init<modes::Mode::kAnalysis_Qa>(&hRegistry, confCollisionBinning, confK0shortSelection, confK0shortSelection, confK0shortCleaner, confK0shortCleaner, confCprPos, confCprNeg, confMixing, confPairBinning, confPairCuts, colHistSpec, k0shortHistSpec, k0shortHistSpec, posDauSpec, negDauSpec, pairV0V0HistSpec, cprHistSpecPos, cprHistSpecNeg);
220+
}
221+
}
222+
};
223+
224+
void processLambdaLambdaSameEvent(FilteredFemtoCollision const& col, FemtoTracks const& tracks, FemtoLambdas const& lambdas)
225+
{
226+
pairLambdaLambdaBuilder.processSameEvent<modes::Mode::kAnalysis>(col, tracks, lambdas, lambdaPartition, lambdaPartition2, cache);
227+
}
228+
PROCESS_SWITCH(FemtoPairLambdaAntilambda, processLambdaLambdaSameEvent, "Enable processing same event processing for lambda-lambda", true);
229+
230+
void processLambdaLambdaSameEventMc(FilteredFemtoCollisionWithLabel const& col, o2::aod::FMcCols const& mcCols, FemtoTracksWithLabel const& tracks, FemtoLambdasWithLabel const& lambdas, o2::aod::FMcParticles const& mcParticles, o2::aod::FMcMothers const& mcMothers, o2::aod::FMcPartMoths const& mcPartonicMothers)
231+
{
232+
pairLambdaLambdaBuilder.processSameEvent<modes::Mode::kAnalysis_Mc>(col, mcCols, tracks, lambdas, lambdaWithLabelPartition, lambdaWithLabelPartition2, mcParticles, mcMothers, mcPartonicMothers, cache);
233+
}
234+
PROCESS_SWITCH(FemtoPairLambdaAntilambda, processLambdaLambdaSameEventMc, "Enable processing same event processing for lambda-lambda with mc information", false);
235+
236+
void processLambdaLambdaMixedEvent(FilteredFemtoCollisions const& cols, FemtoTracks const& tracks, FemtoLambdas const& lambdas)
237+
{
238+
pairLambdaLambdaBuilder.processMixedEvent<modes::Mode::kAnalysis>(cols, tracks, lambdas, lambdaPartition, lambdaPartition2, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
239+
}
240+
PROCESS_SWITCH(FemtoPairLambdaAntilambda, processLambdaLambdaMixedEvent, "Enable processing mixed event processing for lambda-lambda", true);
241+
242+
void processLambdaLambdaMixedEventMc(FilteredFemtoCollisionsWithLabel const& cols, o2::aod::FMcCols const& mcCols, FemtoTracksWithLabel const& tracks, FemtoLambdasWithLabel const& /*lambdas*/, o2::aod::FMcParticles const& mcParticles, o2::aod::FMcMothers const& mcMothers, o2::aod::FMcPartMoths const& mcPartonicMothers)
243+
{
244+
pairLambdaLambdaBuilder.processMixedEvent<modes::Mode::kAnalysis_Mc>(cols, mcCols, tracks, lambdaWithLabelPartition, lambdaWithLabelPartition2, mcParticles, mcMothers, mcPartonicMothers, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
245+
}
246+
PROCESS_SWITCH(FemtoPairLambdaAntilambda, processLambdaLambdaMixedEventMc, "Enable processing mixed event processing for lambda-lambda with mc information", false);
247+
248+
void processK0shortK0shortSameEvent(FilteredFemtoCollision const& col, FemtoTracks const& tracks, FemtoK0shorts const& k0shorts)
249+
{
250+
pairK0shortK0shortBuilder.processSameEvent<modes::Mode::kAnalysis>(col, tracks, k0shorts, k0shortPartition, k0shortPartition, cache);
251+
}
252+
PROCESS_SWITCH(FemtoPairLambdaAntilambda, processK0shortK0shortSameEvent, "Enable processing same event processing for k0short-k0short", false);
253+
254+
void processK0shortK0shortSameEventMc(FilteredFemtoCollisionWithLabel const& col, o2::aod::FMcCols const& mcCols, FemtoTracksWithLabel const& tracks, FemtoK0shortsWithLabel const& k0shorts, o2::aod::FMcParticles const& mcParticles, o2::aod::FMcMothers const& mcMothers, o2::aod::FMcPartMoths const& mcPartonicMothers)
255+
{
256+
pairK0shortK0shortBuilder.processSameEvent<modes::Mode::kAnalysis_Mc>(col, mcCols, tracks, k0shorts, k0shortWithLabelPartition, k0shortWithLabelPartition, mcParticles, mcMothers, mcPartonicMothers, cache);
257+
}
258+
PROCESS_SWITCH(FemtoPairLambdaAntilambda, processK0shortK0shortSameEventMc, "Enable processing same event processing for k0short-k0short with mc information", false);
259+
260+
void processK0shortK0shortMixedEvent(FilteredFemtoCollisions const& cols, FemtoTracks const& tracks, FemtoK0shorts const& k0shorts)
261+
{
262+
pairK0shortK0shortBuilder.processMixedEvent<modes::Mode::kAnalysis>(cols, tracks, k0shorts, k0shortPartition, k0shortPartition, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
263+
}
264+
PROCESS_SWITCH(FemtoPairLambdaAntilambda, processK0shortK0shortMixedEvent, "Enable processing mixed event processing for k0short-k0short", false);
265+
266+
void processK0shortK0shortMixedEventMc(FilteredFemtoCollisionsWithLabel const& cols, o2::aod::FMcCols const& mcCols, FemtoTracksWithLabel const& tracks, FemtoK0shortsWithLabel const& /*k0shorts*/, o2::aod::FMcParticles const& mcParticles, o2::aod::FMcMothers const& mcMothers, o2::aod::FMcPartMoths const& mcPartonicMothers)
267+
{
268+
pairK0shortK0shortBuilder.processMixedEvent<modes::Mode::kAnalysis>(cols, mcCols, tracks, k0shortWithLabelPartition, k0shortWithLabelPartition, mcParticles, mcMothers, mcPartonicMothers, cache, mixBinsVtxMult, mixBinsVtxCent, mixBinsVtxMultCent);
269+
}
270+
PROCESS_SWITCH(FemtoPairLambdaAntilambda, processK0shortK0shortMixedEventMc, "Enable processing mixed event processing for k0short-k0short with mc information", false);
271+
};
272+
273+
o2::framework::WorkflowSpec defineDataProcessing(o2::framework::ConfigContext const& cfgc)
274+
{
275+
o2::framework::WorkflowSpec workflow{
276+
adaptAnalysisTask<FemtoPairLambdaAntilambda>(cfgc),
277+
};
278+
return workflow;
279+
}

0 commit comments

Comments
 (0)