Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 30 additions & 27 deletions PWGHF/HFC/TableProducer/femtoDreamProducer.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ using namespace o2::analysis::femtoDream;
struct HfFemtoDreamProducer {

Produces<aod::FDCollisions> outputCollision;
Produces<aod::FDColMasks> rowMasks;
Produces<aod::FDHfCand> rowCandCharmHad;
Produces<aod::FDHfCandMC> rowCandMcCharmHad;
Produces<aod::FDHfCandMCGen> rowCandCharmHadGen;
Expand Down Expand Up @@ -275,8 +276,8 @@ struct HfFemtoDreamProducer {
}
}

template <bool isMc = false, typename TrackType, typename CollisionType, typename ProngType>
bool fillTracksForCharmHadron(CollisionType const& col, TrackType const& tracks, ProngType const& prong0, ProngType const& prong1, ProngType const& prong2, int candSize)
template <bool isMc = false, typename TrackType, typename CollisionType>
bool fillTracksForCharmHadron(CollisionType const& col, TrackType const& tracks)
{

std::vector<int> childIDs = {0, 0}; // these IDs are necessary to keep track of the children
Expand All @@ -290,9 +291,6 @@ struct HfFemtoDreamProducer {
continue;
}

if ((candSize == 1) && (track.globalIndex() == prong0.globalIndex() || track.globalIndex() == prong1.globalIndex() || track.globalIndex() == prong2.globalIndex()))
continue;

trackCuts.fillQA<aod::femtodreamparticle::ParticleType::kTrack, aod::femtodreamparticle::TrackType::kNoChild, true>(track);
// the bit-wise container of the systematic variations is obtained
auto cutContainer = trackCuts.getCutContainer<aod::femtodreamparticle::cutContainerType>(track, track.pt(), track.eta(), sqrtf(powf(track.dcaXY(), 2.f) + powf(track.dcaZ(), 2.f)));
Expand All @@ -301,7 +299,7 @@ struct HfFemtoDreamProducer {
outputPartsIndex(track.globalIndex());
// now the table is filled

outputParts(outputCollision.lastIndex() + 1,
outputParts(outputCollision.lastIndex(),
track.pt(),
track.eta(),
track.phi(),
Expand All @@ -327,8 +325,6 @@ struct HfFemtoDreamProducer {
{
const auto vtxZ = col.posZ();
const auto sizeCand = candidates.size();
if (sizeCand == 0)
return;

const auto spher = colCuts.computeSphericity(col, tracks);
float mult = 0;
Expand Down Expand Up @@ -356,6 +352,12 @@ struct HfFemtoDreamProducer {
if (colCuts.isEmptyCollision(col, tracks, trackCuts)) {
return;
}

outputCollision(vtxZ, mult, multNtr, spher, magField);
if constexpr (isMc) {
fillMcCollision(col);
}

// Filling candidate properties
rowCandCharmHad.reserve(sizeCand);
bool isTrackFilled = false;
Expand Down Expand Up @@ -386,22 +388,6 @@ struct HfFemtoDreamProducer {
float BDTScorePrompt,
float BDTScoreFD) {
if (FunctionSelection >= 1){
// Fill tracks if it is not filled for Lc Candidate in an event
if (!isTrackFilled) {
isTrackFilled = fillTracksForCharmHadron<isMc>(col, tracks, trackPos1, trackNeg, trackPos2, sizeCand);

// If track filling was successful, fill the collision table
if (isTrackFilled) {
outputCollision(vtxZ, mult, multNtr, spher, magField);
if constexpr (isMc) {
fillMcCollision(col);
}
}
}

// fill collision table if track table is filled, i.e., there is at least one Lc-p pair
if (isTrackFilled) {
// Row for candidate charm hadron
rowCandCharmHad(
outputCollision.lastIndex(),
trackPos1.sign() + trackNeg.sign() + trackPos2.sign(),
Expand All @@ -426,14 +412,31 @@ struct HfFemtoDreamProducer {
if constexpr (isMc) {
rowCandMcCharmHad(
candidate.flagMcMatchRec(),
candidate.originMcRec());
}
}
candidate.originMcRec());}
} };

fillTable(0, candidate.isSelLcToPKPi(), outputMlPKPi.at(0), outputMlPKPi.at(1), outputMlPKPi.at(2));
fillTable(1, candidate.isSelLcToPiKP(), outputMlPiKP.at(0), outputMlPiKP.at(1), outputMlPiKP.at(2));
}

if (!isTrackFilled) {
isTrackFilled = fillTracksForCharmHadron<isMc>(col, tracks);
// If track filling was successful, fill the collision table
}

aod::femtodreamcollision::BitMaskType bitTrack = 0;
if (isTrackFilled) {
bitTrack |= 1 << 0;
}

aod::femtodreamcollision::BitMaskType bitCand = 0;
if (sizeCand > 0) {
bitCand |= 1 << 0;
}

rowMasks(static_cast<aod::femtodreamcollision::BitMaskType>(bitTrack),
static_cast<aod::femtodreamcollision::BitMaskType>(bitCand),
0);
}

template <typename ParticleType>
Expand Down
52 changes: 43 additions & 9 deletions PWGHF/HFC/Tasks/taskCharmHadronsFemtoDream.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
/// \file taskCharmHadronsFemtoDream.cxx.cxx
/// \brief Tasks that reads the track tables used for the pairing and builds pairs of two tracks
/// \author Ravindra SIngh, GSI, ravindra.singh@cern.ch
/// \author Biao Zhang, Heidelberg University, biao.zhang@cern.ch

#include <vector>

Expand Down Expand Up @@ -92,11 +93,11 @@ struct HfTaskCharmHadronsFemtoDream {
ConfigurableAxis dummy{"dummy", {1, 0, 1}, "dummy axis"};

// Mixing configurables
ConfigurableAxis mixingBinMult{"mixingBinMult", {VARIABLE_WIDTH, 0.0f, 200.0f}, "Mixing bins - multiplicity"};
ConfigurableAxis mixingBinMult{"mixingBinMult", {VARIABLE_WIDTH, 0.0f, 20.0f, 60.0f, 200.0f}, "Mixing bins - multiplicity"};
ConfigurableAxis mixingBinMultPercentile{"mixingBinMultPercentile", {VARIABLE_WIDTH, 0.0f, 100.f}, "Mixing bins - multiplicity percentile"};
ConfigurableAxis mixingBinVztx{"mixingBinVztx", {VARIABLE_WIDTH, -10.0f, -4.f, 0.f, 4.f, 10.f}, "Mixing bins - z-vertex"};
Configurable<int> mixingDepth{"mixingDepth", 5, "Number of events for mixing"};
Configurable<int> mixingPolicy{"mixingBinPolicy", 0, "Binning policy for mixing - 0: multiplicity, 1: multipliciy percentile, 2: both"};
Configurable<int> mixingBinPolicy{"mixingBinPolicy", 0, "Binning policy for mixing - 0: multiplicity, 1: multipliciy percentile, 2: both"};

/// Event selection
struct : ConfigurableGroup {
Expand Down Expand Up @@ -142,10 +143,10 @@ struct HfTaskCharmHadronsFemtoDream {
using FilteredCharmMcCands = soa::Filtered<soa::Join<aod::FDHfCand, aod::FDHfCandMC>>;
using FilteredCharmMcCand = FilteredCharmMcCands::iterator;

using FilteredColisions = FDCollisions;
using FilteredColisions = soa::Filtered<soa::Join<FDCollisions, FDColMasks>>;
using FilteredColision = FilteredColisions::iterator;

using FilteredMcColisions = soa::Filtered<soa::Join<aod::FDCollisions, aod::FDMCCollLabels>>;
using FilteredMcColisions = soa::Filtered<soa::Join<aod::FDCollisions, FDColMasks, aod::FDMCCollLabels>>;
using FilteredMcColision = FilteredMcColisions::iterator;

using FilteredFDMcParts = soa::Filtered<soa::Join<aod::FDParticles, aod::FDParticlesIndex, aod::FDMCLabels>>;
Expand All @@ -154,13 +155,15 @@ struct HfTaskCharmHadronsFemtoDream {
using FilteredFDParticles = soa::Filtered<soa::Join<aod::FDParticles, aod::FDParticlesIndex>>;
using FilteredFDParticle = FilteredFDParticles::iterator;

femtodreamcollision::BitMaskType BitMask = 1 << 0;

/// Histogramming for particle 1
FemtoDreamParticleHisto<aod::femtodreamparticle::ParticleType::kTrack, 1> trackHistoPartOne;
/// Histogramming for Event
FemtoDreamEventHisto eventHisto;
/// Histogram output
HistogramRegistry registry{"CorrelationsAndQA", {}, OutputObjHandlingPolicy::AnalysisObject};

HistogramRegistry registryMixQa{"registryMixQa"};
/// Partition for particle 1

Partition<FilteredFDParticles> partitionTrk1 = (aod::femtodreamparticle::partType == uint8_t(aod::femtodreamparticle::ParticleType::kTrack));
Expand Down Expand Up @@ -203,17 +206,29 @@ struct HfTaskCharmHadronsFemtoDream {
smearingByOrigin, binInvMass);

mixedEventCont.setPDGCodes(pdgCodeTrack1, charmHadPDGCode);
registryMixQa.add("MixingQA/hSECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}});
registryMixQa.add("MixingQA/hSECollisionPool", ";bin;Entries", kTH2F, {{100, -10, 10}, {2000, 0, 200}});
registryMixQa.add("MixingQA/hMECollisionBins", ";bin;Entries", kTH1F, {{120, -0.5, 119.5}});
pairCleaner.init(&registry);
if (useCPR.value) {
pairCloseRejectionSE.init(&registry, &registry, cprDeltaPhiMax.value, cprDeltaEtaMax.value, cprPlotPerRadii.value, 1);
pairCloseRejectionME.init(&registry, &registry, cprDeltaPhiMax.value, cprDeltaEtaMax.value, cprPlotPerRadii.value, 2);
}
}

template <typename CollisionType>
void fillCollision(CollisionType const& col)
{
registryMixQa.fill(HIST("MixingQA/hSECollisionBins"), colBinningMult.getBin({col.posZ(), col.multNtr()}));
registryMixQa.fill(HIST("MixingQA/hSECollisionPool"), col.posZ(), col.multNtr());
}

/// This function processes the same event and takes care of all the histogramming
template <bool isMc, typename PartitionType, typename CandType, typename TableTracks, typename Collision>
void doSameEvent(PartitionType& sliceTrk1, CandType& sliceCharmHad, TableTracks const& parts, Collision const& col)
{
fillCollision(col);

processType = 1; // for same event
/// Histogramming same event
for (auto const& part : sliceTrk1) {
Expand All @@ -223,6 +238,9 @@ struct HfTaskCharmHadronsFemtoDream {

for (auto const& [p1, p2] : combinations(CombinationsFullIndexPolicy(sliceTrk1, sliceCharmHad))) {

if (p1.trackId() == p2.prong0Id() || p1.trackId() == p2.prong1Id() || p1.trackId() == p2.prong2Id())
continue;

if (useCPR.value) {
if (pairCloseRejectionSE.isClosePair(p1, p2, parts, col.magField())) {
continue;
Expand Down Expand Up @@ -309,11 +327,22 @@ struct HfTaskCharmHadronsFemtoDream {
// Mixed events that contain the pair of interest
processType = 2; // for mixed event

for (auto const& [collision1, collision2] : combinations(soa::CombinationsBlockFullSameIndexPolicy(policy, mixingDepth.value, -1, cols, cols))) {
Partition<CollisionType> PartitionMaskedCol1 = (aod::femtodreamcollision::bitmaskTrackOne & BitMask) == BitMask;
PartitionMaskedCol1.bindTable(cols);

Partition<CollisionType> PartitionMaskedCol2 = (aod::femtodreamcollision::bitmaskTrackTwo & BitMask) == BitMask;
PartitionMaskedCol2.bindTable(cols);

for (auto const& [collision1, collision2] : combinations(soa::CombinationsBlockFullIndexPolicy(policy, mixingDepth.value, -1, *PartitionMaskedCol1.mFiltered, *PartitionMaskedCol2.mFiltered))) {
// make sure that tracks in the same events are not mixed
if (collision1.globalIndex() == collision2.globalIndex()) {
continue;
}

const int multiplicityCol = collision1.multNtr();

registryMixQa.fill(HIST("MixingQA/hMECollisionBins"), colBinningMult.getBin({collision1.posZ(), multiplicityCol}));

auto sliceTrk1 = part1->sliceByCached(aod::femtodreamparticle::fdCollisionId, collision1.globalIndex(), cache);
auto sliceCharmHad = part2->sliceByCached(aod::femtodreamparticle::fdCollisionId, collision2.globalIndex(), cache);
for (auto& [p1, p2] : combinations(CombinationsFullIndexPolicy(sliceTrk1, sliceCharmHad))) {
Expand Down Expand Up @@ -345,7 +374,6 @@ struct HfTaskCharmHadronsFemtoDream {
if (kstar > highkstarCut) {
continue;
}

float invMass;
if (p2.candidateSelFlag() == 1) {
invMass = p2.m(std::array{o2::constants::physics::MassProton, o2::constants::physics::MassKPlus, o2::constants::physics::MassPiPlus});
Expand Down Expand Up @@ -387,6 +415,9 @@ struct HfTaskCharmHadronsFemtoDream {
FilteredFDParticles const& parts,
FilteredCharmCands const&)
{
if ((col.bitmaskTrackOne() & BitMask) != BitMask || (col.bitmaskTrackTwo() & BitMask) != BitMask) {
return;
}
eventHisto.fillQA(col);
auto sliceTrk1 = partitionTrk1->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache);
auto sliceCharmHad = partitionCharmHadron->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache);
Expand All @@ -398,7 +429,7 @@ struct HfTaskCharmHadronsFemtoDream {
FilteredFDParticles const& parts,
FilteredCharmCands const&)
{
switch (mixingPolicy.value) {
switch (mixingBinPolicy.value) {
case femtodreamcollision::kMult:
doMixedEvent<false>(cols, parts, partitionTrk1, partitionCharmHadron, colBinningMult);
break;
Expand All @@ -423,6 +454,9 @@ struct HfTaskCharmHadronsFemtoDream {
o2::aod::FDMCParticles const&,
FilteredCharmMcCands const&)
{
if ((col.bitmaskTrackOne() & BitMask) != BitMask || (col.bitmaskTrackTwo() & BitMask) != BitMask) {
return;
}
auto sliceMcTrk1 = partitionMcTrk1->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache);
auto sliceMcCharmHad = partitionMcCharmHadron->sliceByCached(aod::femtodreamparticle::fdCollisionId, col.globalIndex(), cache);

Expand All @@ -442,7 +476,7 @@ struct HfTaskCharmHadronsFemtoDream {
o2::aod::FDMCParticles const&,
FilteredCharmMcCands const&)
{
switch (mixingPolicy.value) {
switch (mixingBinPolicy.value) {
case femtodreamcollision::kMult:
doMixedEvent<true>(cols, parts, partitionMcTrk1, partitionMcCharmHadron, colBinningMult);
break;
Expand Down