Skip to content

Commit 882dfbf

Browse files
rspijkersalibuild
andauthored
PWGLF: add mixed events process (AliceO2Group#5279)
* add mixed events process * Please consider the following formatting changes (#10) --------- Co-authored-by: ALICE Builder <alibuild@users.noreply.github.com>
1 parent 8c4bc6a commit 882dfbf

File tree

1 file changed

+99
-10
lines changed

1 file changed

+99
-10
lines changed

PWGLF/Tasks/Strangeness/cascadecorrelations.cxx

Lines changed: 99 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include <TDatabasePDG.h>
4343

4444
using namespace o2;
45+
using namespace o2::soa;
4546
using namespace o2::constants::math;
4647
using namespace o2::framework;
4748
using namespace o2::framework::expressions;
@@ -75,6 +76,7 @@ struct cascadeSelector {
7576
Configurable<float> tpcNsigmaPion{"tpcNsigmaPion", 3, "TPC NSigma pion <- lambda"};
7677
Configurable<int> minTPCCrossedRows{"minTPCCrossedRows", 80, "min N TPC crossed rows"}; // TODO: finetune! 80 > 159/2, so no split tracks?
7778
Configurable<int> minITSClusters{"minITSClusters", 4, "minimum number of ITS clusters"};
79+
// Configurable<float> etaTracks{"etaTracks", 0.8, "min/max of eta for tracks"}
7880

7981
// Selection criteria - compatible with core wagon autodetect - copied from cascadeanalysis.cxx
8082
//*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*+-+*
@@ -261,6 +263,9 @@ struct cascadeSelector {
261263
}; // struct
262264

263265
struct cascadeCorrelations {
266+
267+
Configurable<float> zVertexCut{"zVertexCut", 10, "Cut on PV position"};
268+
264269
AxisSpec invMassAxis = {2000, 1.0f, 3.0f, "Inv. Mass (GeV/c^{2})"};
265270
AxisSpec deltaPhiAxis = {100, -PI / 2, 1.5 * PI, "#Delta#varphi"};
266271
AxisSpec deltaEtaAxis = {40, -2, 2, "#Delta#eta"};
@@ -310,12 +315,39 @@ struct cascadeCorrelations {
310315
{"hOmXiSS", "hOmXiSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
311316
{"hOmOmOS", "hOmOmOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
312317
{"hOmOmSS", "hOmOmSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
318+
319+
// ad hoc mixed events
320+
{"MixedEvents/hMEVz1", "hMEVz1", {HistType::kTH1F, {vertexAxis}}},
321+
{"MixedEvents/hMEVz2", "hMEVz2", {HistType::kTH1F, {vertexAxis}}},
322+
{"MixedEvents/hMEDeltaPhiSS", "hMEDeltaPhiSS", {HistType::kTH1F, {deltaPhiAxis}}},
323+
{"MixedEvents/hMEDeltaPhiOS", "hMEDeltaPhiOS", {HistType::kTH1F, {deltaPhiAxis}}},
324+
{"MixedEvents/hMEXiXiOS", "hMEXiXiOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
325+
{"MixedEvents/hMEXiXiSS", "hMEXiXiSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
326+
{"MixedEvents/hMEXiOmOS", "hMEXiOmOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
327+
{"MixedEvents/hMEXiOmSS", "hMEXiOmSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
328+
{"MixedEvents/hMEOmXiOS", "hMEOmXiOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
329+
{"MixedEvents/hMEOmXiSS", "hMEOmXiSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
330+
{"MixedEvents/hMEOmOmOS", "hMEOmOmOS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
331+
{"MixedEvents/hMEOmOmSS", "hMEOmOmSS", {HistType::kTHnSparseF, {deltaPhiAxis, deltaEtaAxis, ptAxis, ptAxis, invMassAxis, invMassAxis, selectionFlagAxis, selectionFlagAxis, vertexAxis, multiplicityAxis}}},
313332
},
314333
};
315334

335+
// cascade filter
316336
Filter Selector = aod::cascadeflags::isSelected > 0;
317337

318-
void process(soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults>::iterator const& collision, soa::Filtered<aod::CascDataExtSelected> const& Cascades, aod::V0sLinked const&, aod::V0Datas const&, FullTracksExtIU const&)
338+
// Mixed events setup:
339+
using myCascades = soa::Filtered<aod::CascDataExtSelected>;
340+
using myCollisions = soa::Join<aod::Collisions, aod::EvSels, aod::FT0Mults>;
341+
342+
SliceCache cache;
343+
ConfigurableAxis axisVtxZ{"axisVtxZ", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"};
344+
ConfigurableAxis axisMult{"axisMult", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100, 1000}, "Mixing bins - multiplicity"};
345+
using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultFT0M<aod::mult::MultFT0A, aod::mult::MultFT0C>>;
346+
BinningType colBinning{{axisVtxZ, axisMult}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1.
347+
// Preslice<aod::CascDataExtSelected> collisionSliceCascades = aod::CascDataExtSelected::collisionId;
348+
SameKindPair<myCollisions, myCascades, BinningType> pair{colBinning, 5, -1, &cache};
349+
350+
void processSameEvent(myCollisions::iterator const& collision, myCascades const& Cascades, aod::V0sLinked const&, aod::V0Datas const&, FullTracksExtIU const&)
319351
{
320352
if (!collision.sel8()) {
321353
return;
@@ -380,6 +412,8 @@ struct cascadeCorrelations {
380412
double invMassXiAssoc = assoc.mXi();
381413
double invMassOmAssoc = assoc.mOmega();
382414

415+
double weight = 1.; // Will be changed by Efficiency-correction
416+
383417
// Fill the correct histograms based on same-sign or opposite-sign
384418
if (trigger.sign() * assoc.sign() < 0) { // opposite-sign
385419
// check for autocorrelations between mis-identified kaons (omega bach) and protons (lambda daughter) TODO: improve logic?
@@ -409,10 +443,10 @@ struct cascadeCorrelations {
409443
}
410444

411445
registry.fill(HIST("hDeltaPhiOS"), dphi);
412-
registry.fill(HIST("hXiXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M());
413-
registry.fill(HIST("hXiOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M());
414-
registry.fill(HIST("hOmXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M());
415-
registry.fill(HIST("hOmOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M());
446+
registry.fill(HIST("hXiXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight);
447+
registry.fill(HIST("hXiOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight);
448+
registry.fill(HIST("hOmXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight);
449+
registry.fill(HIST("hOmOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight);
416450
} else { // same-sign
417451
// make sure to check for autocorrelations - only possible in same-sign correlations (if PID is correct)
418452
if (posIdTrigg == posIdAssoc && negIdTrigg == negIdAssoc) {
@@ -448,13 +482,68 @@ struct cascadeCorrelations {
448482
}
449483
}
450484
registry.fill(HIST("hDeltaPhiSS"), dphi);
451-
registry.fill(HIST("hXiXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M());
452-
registry.fill(HIST("hXiOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M());
453-
registry.fill(HIST("hOmXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M());
454-
registry.fill(HIST("hOmOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M());
485+
registry.fill(HIST("hXiXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight);
486+
registry.fill(HIST("hXiOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight);
487+
registry.fill(HIST("hOmXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight);
488+
registry.fill(HIST("hOmOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), collision.posZ(), collision.multFT0M(), weight);
455489
}
456490
} // correlations
457-
} // process
491+
} // process same event
492+
493+
void processMixedEvent(myCollisions const& collisions, myCascades const& Cascades,
494+
aod::V0sLinked const&, aod::V0Datas const&, FullTracksExtIU const&)
495+
{
496+
// mixed events
497+
498+
for (auto& [col1, cascades1, col2, cascades2] : pair) {
499+
if (!col1.sel8() || !col2.sel8())
500+
continue;
501+
if (TMath::Abs(col1.posZ()) > zVertexCut || TMath::Abs(col2.posZ()) > zVertexCut)
502+
continue;
503+
504+
registry.fill(HIST("MixedEvents/hMEVz1"), col1.posZ());
505+
registry.fill(HIST("MixedEvents/hMEVz2"), col2.posZ());
506+
507+
for (auto& [casc1, casc2] : combinations(CombinationsFullIndexPolicy(cascades1, cascades2))) {
508+
// specify FullIndexPolicy since the cascades are from different collisions
509+
auto* triggerAddress = &casc1;
510+
auto* assocAddress = &casc2;
511+
if (assocAddress->pt() > triggerAddress->pt()) {
512+
std::swap(triggerAddress, assocAddress);
513+
}
514+
auto trigger = *triggerAddress;
515+
auto assoc = *assocAddress;
516+
517+
double deta = trigger.eta() - assoc.eta();
518+
double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -0.5 * PI);
519+
520+
double invMassXiTrigg = trigger.mXi();
521+
double invMassOmTrigg = trigger.mOmega();
522+
double invMassXiAssoc = assoc.mXi();
523+
double invMassOmAssoc = assoc.mOmega();
524+
525+
double weight = 1.; // Will be changed by Efficiency-correction
526+
527+
if (trigger.sign() * assoc.sign() < 0) { // opposite-sign
528+
registry.fill(HIST("MixedEvents/hMEDeltaPhiOS"), dphi);
529+
registry.fill(HIST("MixedEvents/hMEXiXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight);
530+
registry.fill(HIST("MixedEvents/hMEXiOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight);
531+
registry.fill(HIST("MixedEvents/hMEOmXiOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight);
532+
registry.fill(HIST("MixedEvents/hMEOmOmOS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight);
533+
} else { // same sign
534+
registry.fill(HIST("MixedEvents/hMEDeltaPhiSS"), dphi);
535+
registry.fill(HIST("MixedEvents/hMEXiXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight);
536+
registry.fill(HIST("MixedEvents/hMEXiOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight);
537+
registry.fill(HIST("MixedEvents/hMEOmXiSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassXiAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight);
538+
registry.fill(HIST("MixedEvents/hMEOmOmSS"), dphi, deta, trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, trigger.isSelected(), assoc.isSelected(), col1.posZ(), col1.multFT0M(), weight);
539+
}
540+
} // correlations
541+
} // collisions
542+
} // process mixed events
543+
544+
PROCESS_SWITCH(cascadeCorrelations, processSameEvent, "Process same events", true);
545+
PROCESS_SWITCH(cascadeCorrelations, processMixedEvent, "Process mixed events", true);
546+
458547
}; // struct
459548

460549
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

0 commit comments

Comments
 (0)