Skip to content

Commit 64cd97f

Browse files
authored
[PWGCF] adding 2prong-2prong correlations (#8686)
1 parent cc1907f commit 64cd97f

File tree

1 file changed

+87
-13
lines changed

1 file changed

+87
-13
lines changed

PWGCF/Tasks/correlations.cxx

Lines changed: 87 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
// granted to it by virtue of its status as an Intergovernmental Organization
1010
// or submit itself to any jurisdiction.
1111
#include <experimental/type_traits>
12+
#include <vector>
13+
#include <string>
1214

1315
#include <TH1F.h>
1416
#include <cmath>
@@ -104,7 +106,7 @@ struct CorrelationTask {
104106
// This filter is applied to AOD and derived data (column names are identical)
105107
Filter collisionZVtxFilter = nabs(aod::collision::posZ) < cfgCutVertex;
106108
// This filter is only applied to AOD
107-
Filter collisionVertexTypeFilter = (aod::collision::flags & (uint16_t)aod::collision::CollisionFlagsRun2::Run2VertexerTracks) == (uint16_t)aod::collision::CollisionFlagsRun2::Run2VertexerTracks;
109+
Filter collisionVertexTypeFilter = (aod::collision::flags & static_cast<uint16_t>(aod::collision::CollisionFlagsRun2::Run2VertexerTracks)) == static_cast<uint16_t>(aod::collision::CollisionFlagsRun2::Run2VertexerTracks);
108110

109111
// Track filters
110112
Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPt) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true));
@@ -185,6 +187,9 @@ struct CorrelationTask {
185187
std::vector<AxisSpec> userAxis;
186188
if (cfgMassAxis != 0)
187189
userAxis.emplace_back(axisInvMass, "m (GeV/c^2)");
190+
if (doprocessSame2Prong2Prong)
191+
userAxis.emplace_back(axisInvMass, "m (GeV/c^2)");
192+
188193
same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, userAxis));
189194
mixed.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, userAxis));
190195

@@ -241,7 +246,7 @@ struct CorrelationTask {
241246
for (auto& track1 : tracks1) {
242247
if constexpr (std::experimental::is_detected<hasInvMass, typename TTracks1::iterator>::value) {
243248
if constexpr (std::experimental::is_detected<hasDecay, typename TTracks1::iterator>::value) {
244-
if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << (uint32_t)track1.decay())) == 0u)
249+
if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast<uint32_t>(track1.decay()))) == 0u)
245250
continue;
246251
}
247252
registry.fill(HIST("invMass"), track1.invMass(), track1.pt(), multiplicity);
@@ -317,7 +322,7 @@ struct CorrelationTask {
317322
}
318323

319324
if constexpr (std::experimental::is_detected<hasDecay, typename TTracks1::iterator>::value) {
320-
if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << (uint32_t)track1.decay())) == 0u)
325+
if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast<uint32_t>(track1.decay()))) == 0u)
321326
continue;
322327
}
323328

@@ -375,28 +380,68 @@ struct CorrelationTask {
375380
}
376381
}
377382

383+
if constexpr (std::experimental::is_detected<hasDecay, typename TTracks2::iterator>::value) {
384+
if (cfgDecayParticleMask != 0 && (cfgDecayParticleMask & (1u << static_cast<uint32_t>(track2.decay()))) == 0u)
385+
continue;
386+
}
387+
388+
if constexpr (std::experimental::is_detected<hasDecay, typename TTracks1::iterator>::value && std::experimental::is_detected<hasDecay, typename TTracks2::iterator>::value) {
389+
if (doprocessSame2Prong2Prong && (track1.decay() == track2.decay() || track1.decay() > 1 || track2.decay() > 1)) {
390+
continue;
391+
}
392+
} // D0 and anti-D0 selection
393+
394+
if constexpr (std::experimental::is_detected<hasProng0Id, typename TTracks1::iterator>::value) {
395+
if constexpr (std::experimental::is_detected<hasProng0Id, typename TTracks2::iterator>::value) {
396+
if (track1.cfTrackProng0Id() == track2.cfTrackProng0Id()) {
397+
continue;
398+
}
399+
}
400+
if constexpr (std::experimental::is_detected<hasProng1Id, typename TTracks2::iterator>::value) {
401+
if (track1.cfTrackProng0Id() == track2.cfTrackProng1Id()) {
402+
continue;
403+
}
404+
}
405+
}
406+
407+
if constexpr (std::experimental::is_detected<hasProng1Id, typename TTracks1::iterator>::value) {
408+
if constexpr (std::experimental::is_detected<hasProng0Id, typename TTracks2::iterator>::value) {
409+
if (track1.cfTrackProng1Id() == track2.cfTrackProng0Id()) {
410+
continue;
411+
}
412+
}
413+
if constexpr (std::experimental::is_detected<hasProng1Id, typename TTracks2::iterator>::value) {
414+
if (track1.cfTrackProng1Id() == track2.cfTrackProng1Id()) {
415+
continue;
416+
}
417+
}
418+
} // no shared prong for two mothers
419+
378420
if (cfgPtOrder != 0 && track2.pt() >= track1.pt()) {
379421
continue;
380422
}
381423

382-
if (cfgAssociatedCharge != 0 && cfgAssociatedCharge * track2.sign() < 0) {
383-
continue;
424+
if constexpr (std::experimental::is_detected<hasSign, typename TTracks2::iterator>::value) {
425+
if (cfgAssociatedCharge != 0 && cfgAssociatedCharge * track2.sign() < 0) {
426+
continue;
427+
}
384428
}
385429

386-
if constexpr (std::experimental::is_detected<hasSign, typename TTracks1::iterator>::value) {
430+
if constexpr (std::experimental::is_detected<hasSign, typename TTracks1::iterator>::value && std::experimental::is_detected<hasSign, typename TTracks2::iterator>::value) {
387431
if (cfgPairCharge != 0 && cfgPairCharge * track1.sign() * track2.sign() < 0) {
388432
continue;
389433
}
390434
}
391435

392436
if constexpr (std::is_same<TTracks1, TTracks2>::value) {
393437
if constexpr (step >= CorrelationContainer::kCFStepReconstructed) {
394-
if (cfg.mPairCuts && mPairCuts.conversionCuts(track1, track2)) {
395-
continue;
396-
}
397-
398-
if (cfgTwoTrackCut > 0 && mPairCuts.twoTrackCut(track1, track2, magField)) {
399-
continue;
438+
if constexpr (std::experimental::is_detected<hasSign, typename TTracks1::iterator>::value && std::experimental::is_detected<hasSign, typename TTracks2::iterator>::value) {
439+
if (cfg.mPairCuts && mPairCuts.conversionCuts(track1, track2)) {
440+
continue;
441+
}
442+
if (cfgTwoTrackCut > 0 && mPairCuts.twoTrackCut(track1, track2, magField)) {
443+
continue;
444+
}
400445
}
401446
}
402447
}
@@ -417,7 +462,12 @@ struct CorrelationTask {
417462
}
418463

419464
// last param is the weight
420-
if (cfgMassAxis) {
465+
if (cfgMassAxis && doprocessSame2Prong2Prong) {
466+
if constexpr (std::experimental::is_detected<hasInvMass, typename TTracks1::iterator>::value && std::experimental::is_detected<hasInvMass, typename TTracks2::iterator>::value)
467+
target->getPairHist()->Fill(step, track1.eta() - track2.eta(), track2.pt(), track1.pt(), multiplicity, deltaPhi, posZ, track2.invMass(), track1.invMass(), associatedWeight);
468+
else
469+
LOGF(fatal, "Can not fill mass axis without invMass column. \n no mass for two particles");
470+
} else if (cfgMassAxis) {
421471
if constexpr (std::experimental::is_detected<hasInvMass, typename TTracks1::iterator>::value)
422472
target->getPairHist()->Fill(step, track1.eta() - track2.eta(), track2.pt(), track1.pt(), multiplicity, deltaPhi, posZ, track1.invMass(), associatedWeight);
423473
else
@@ -547,6 +597,30 @@ struct CorrelationTask {
547597
}
548598
PROCESS_SWITCH(CorrelationTask, processSame2ProngDerived, "Process same event on derived data", false);
549599

600+
void processSame2Prong2Prong(derivedCollisions::iterator const& collision, soa::Filtered<aod::CF2ProngTracks> const& p2tracks)
601+
{
602+
BinningTypeDerived configurableBinningDerived{{axisVertex, axisMultiplicity}, true}; // true is for 'ignore overflows' (true by default). Underflows and overflows will have bin -1.
603+
if (cfgVerbosity > 0) {
604+
LOGF(info, "processSame2ProngDerived: 2-prong candidates: %d | Vertex: %.1f | Multiplicity/Centrality: %.1f", p2tracks.size(), collision.posZ(), collision.multiplicity());
605+
}
606+
loadEfficiency(collision.timestamp());
607+
608+
const auto multiplicity = collision.multiplicity();
609+
610+
int bin = configurableBinningDerived.getBin({collision.posZ(), collision.multiplicity()});
611+
registry.fill(HIST("eventcount_same"), bin);
612+
fillQA(collision, multiplicity, p2tracks, p2tracks);
613+
614+
same->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed);
615+
fillCorrelations<CorrelationContainer::kCFStepReconstructed>(same, p2tracks, p2tracks, multiplicity, collision.posZ(), 0, 1.0f);
616+
617+
if (cfg.mEfficiencyAssociated || cfg.mEfficiencyTrigger) {
618+
same->fillEvent(multiplicity, CorrelationContainer::kCFStepCorrected);
619+
fillCorrelations<CorrelationContainer::kCFStepCorrected>(same, p2tracks, p2tracks, multiplicity, collision.posZ(), 0, 1.0f);
620+
}
621+
}
622+
PROCESS_SWITCH(CorrelationTask, processSame2Prong2Prong, "Process same event on derived data", false);
623+
550624
using BinningTypeAOD = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentRun2V0M>;
551625
void processMixedAOD(aodCollisions& collisions, aodTracks const& tracks, aod::BCsWithTimestamps const&)
552626
{

0 commit comments

Comments
 (0)