Skip to content

Commit

Permalink
PWGEM/PhotonMeson: improve mixed event loop (AliceO2Group#5011)
Browse files Browse the repository at this point in the history
  • Loading branch information
dsekihat authored Mar 6, 2024
1 parent cbefa99 commit 90a18dd
Show file tree
Hide file tree
Showing 18 changed files with 520 additions and 151 deletions.
10 changes: 10 additions & 0 deletions PWGEM/PhotonMeson/TableProducer/skimmerDalitzEE.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ struct skimmerDalitzEE {
Produces<o2::aod::EMReducedEventsNee> event_nee;

// Configurables
Configurable<int> cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"};
Configurable<float> cfgCentMin{"cfgCentMin", 0, "min. centrality"};
Configurable<float> cfgCentMax{"cfgCentMax", 999.f, "max. centrality"};

Configurable<float> maxMee{"maxMee", 0.5, "max. mee to store ee pairs"};
Configurable<bool> storeLS{"storeLS", false, "flag to store LS pairs"};
Configurable<float> minpt{"minpt", 0.2, "min pt for track for loose track sample"};
Expand Down Expand Up @@ -188,6 +192,12 @@ struct skimmerDalitzEE {
void processAnalysis(MyCollisions const& collisions, MyTracks const& tracks)
{
for (auto& collision : collisions) {
float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()};
if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) {
event_nee(0, 0, 0);
continue;
}

auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::emprimaryelectron::emreducedeventId, collision.globalIndex(), cache);
auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::emprimaryelectron::emreducedeventId, collision.globalIndex(), cache);
fRegistry.fill(HIST("hNpos"), collision.centFT0C(), posTracks_per_coll.size());
Expand Down
10 changes: 10 additions & 0 deletions PWGEM/PhotonMeson/TableProducer/skimmerDalitzMuMu.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ struct skimmerDalitzMuMu {
Produces<o2::aod::EMReducedEventsNmumu> event_nmumu;

// Configurables
Configurable<int> cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"};
Configurable<float> cfgCentMin{"cfgCentMin", 0, "min. centrality"};
Configurable<float> cfgCentMax{"cfgCentMax", 999.f, "max. centrality"};

Configurable<float> maxMmumu{"maxMmumu", 1.1, "max. mmumu to store mumu pairs"};
Configurable<bool> storeLS{"storeLS", false, "flag to store LS pairs"};
Configurable<float> minpt{"minpt", 0.05, "min pt for track"};
Expand Down Expand Up @@ -169,6 +173,12 @@ struct skimmerDalitzMuMu {
void process(MyCollisions const& collisions, MyTracks const& tracks)
{
for (auto& collision : collisions) {
float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()};
if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) {
event_nmumu(0, 0, 0);
continue;
}

auto posTracks_per_coll = posTracks->sliceByCached(o2::aod::emprimarymuon::emreducedeventId, collision.globalIndex(), cache);
auto negTracks_per_coll = negTracks->sliceByCached(o2::aod::emprimarymuon::emreducedeventId, collision.globalIndex(), cache);

Expand Down
69 changes: 52 additions & 17 deletions PWGEM/PhotonMeson/Tasks/MaterialBudget.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ using MyV0Photon = MyV0Photons::iterator;

struct MaterialBudget {

Configurable<float> CentMin{"CentMin", -1, "min. centrality"};
Configurable<float> CentMax{"CentMax", 999, "max. centrality"};
Configurable<std::string> CentEstimator{"CentEstimator", "FT0M", "centrality estimator"};
Configurable<int> cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"};
Configurable<float> cfgCentMin{"cfgCentMin", 0, "min. centrality"};
Configurable<float> cfgCentMax{"cfgCentMax", 999, "max. centrality"};

Configurable<std::string> fConfigTagCuts{"cfgTagCuts", "qc", "Comma separated list of V0 photon cuts for tag"};
Configurable<std::string> fConfigProbeCuts{"cfgProbeCuts", "qc,wwire_ib", "Comma separated list of V0 photon cuts for probe"};
Expand Down Expand Up @@ -216,6 +216,11 @@ struct MaterialBudget {
double value[4] = {0.f};
for (auto& collision : collisions) {

const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()};
if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) {
continue;
}

o2::aod::pwgem::photon::histogram::FillHistClass<EMHistType::kEvent>(list_ev_pair_before, "", collision);
if (!fEMEventCut.IsSelected(collision)) {
continue;
Expand Down Expand Up @@ -251,6 +256,15 @@ struct MaterialBudget {
THashList* list_pair_ss = static_cast<THashList*>(fMainList->FindObject("Pair")->FindObject(pairnames[pairtype].data()));

for (auto& collision : collisions) {
const float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()};
if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) {
continue;
}

if (!fEMEventCut.IsSelected(collision)) {
continue;
}

auto photons1_coll = photons1.sliceBy(perCollision1, collision.globalIndex());
auto photons2_coll = photons2.sliceBy(perCollision2, collision.globalIndex());

Expand Down Expand Up @@ -293,24 +307,38 @@ struct MaterialBudget {

Configurable<int> ndepth{"ndepth", 10, "depth for event mixing"};
ConfigurableAxis ConfVtxBins{"ConfVtxBins", {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"};
ConfigurableAxis ConfMultBins{"ConfMultBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.f, 20.0f, 40.0f, 60.0f, 80.0f, 100.0f, 200.0f, 1e+10f}, "Mixing bins - multiplicity"};
using BinningType = ColumnBinningPolicy<aod::collision::PosZ, aod::mult::MultNTracksPV>;
BinningType colBinning{{ConfVtxBins, ConfMultBins}, true};

template <PairType pairtype, typename TEvents, typename TPhotons1, typename TPhotons2, typename TPreslice1, typename TPreslice2, typename TCuts1, typename TCuts2, typename TPairCuts, typename TLegs>
void MixedEventPairing(TEvents const& collisions, TPhotons1 const& photons1, TPhotons2 const& photons2, TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, TCuts1 const& tagcuts, TCuts2 const& probecuts, TPairCuts const& paircuts, TLegs const& legs)
ConfigurableAxis ConfCentBins{"ConfCentBins", {VARIABLE_WIDTH, 0.0f, 5.0f, 10.0f, 20.0f, 30.0f, 40.0f, 50.0f, 60.0f, 70.0f, 80.0f, 90.0f, 100.0f, 999.f}, "Mixing bins - centrality"};
using BinningType_M = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentFT0M>;
using BinningType_A = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentFT0A>;
using BinningType_C = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentFT0C>;
BinningType_M colBinning_M{{ConfVtxBins, ConfCentBins}, true};
BinningType_A colBinning_A{{ConfVtxBins, ConfCentBins}, true};
BinningType_C colBinning_C{{ConfVtxBins, ConfCentBins}, true};

template <PairType pairtype, typename TEvents, typename TPhotons1, typename TPhotons2, typename TPreslice1, typename TPreslice2, typename TCuts1, typename TCuts2, typename TPairCuts, typename TLegs, typename TMixedBinning>
void MixedEventPairing(TEvents const& collisions, TPhotons1 const& photons1, TPhotons2 const& photons2, TPreslice1 const& perCollision1, TPreslice2 const& perCollision2, TCuts1 const& tagcuts, TCuts2 const& probecuts, TPairCuts const& paircuts, TLegs const& legs, TMixedBinning const& colBinning)
{
THashList* list_pair_ss = static_cast<THashList*>(fMainList->FindObject("Pair")->FindObject(pairnames[pairtype].data()));
// LOGF(info, "Number of collisions after filtering: %d", collisions.size());
for (auto& [collision1, collision2] : soa::selfCombinations(colBinning, ndepth, -1, collisions, collisions)) { // internally, CombinationsStrictlyUpperIndexPolicy(collisions, collisions) is called.

// LOGF(info, "Mixed event globalIndex: (%d, %d) , ngpcm: (%d, %d), ngphos: (%d, %d), ngemc: (%d, %d)",
// collision1.globalIndex(), collision2.globalIndex(), collision1.ngpcm(), collision2.ngpcm(), collision1.ngphos(), collision2.ngphos(), collision1.ngemc(), collision2.ngemc());
// LOGF(info, "Mixed event globalIndex: (%d, %d) , ngpcm: (%d, %d), ngphos: (%d, %d), ngemc: (%d, %d)", collision1.globalIndex(), collision2.globalIndex(), collision1.ngpcm(), collision2.ngpcm(), collision1.ngphos(), collision2.ngphos(), collision1.ngemc(), collision2.ngemc());

const float centralities1[3] = {collision1.centFT0M(), collision1.centFT0A(), collision1.centFT0C()};
const float centralities2[3] = {collision2.centFT0M(), collision2.centFT0A(), collision2.centFT0C()};

if (centralities1[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities1[cfgCentEstimator]) {
continue;
}
if (centralities2[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities2[cfgCentEstimator]) {
continue;
}
if (!fEMEventCut.IsSelected(collision1) || !fEMEventCut.IsSelected(collision2)) {
continue;
}

auto photons_coll1 = photons1.sliceBy(perCollision1, collision1.globalIndex());
auto photons_coll2 = photons2.sliceBy(perCollision2, collision2.globalIndex());
// LOGF(info, "collision1: posZ = %f, numContrib = %d , sel8 = %d | collision2: posZ = %f, numContrib = %d , sel8 = %d",
// collision1.posZ(), collision1.numContrib(), collision1.sel8(), collision2.posZ(), collision2.numContrib(), collision2.sel8());
// LOGF(info, "collision1: posZ = %f, numContrib = %d , sel8 = %d | collision2: posZ = %f, numContrib = %d , sel8 = %d", collision1.posZ(), collision1.numContrib(), collision1.sel8(), collision2.posZ(), collision2.numContrib(), collision2.sel8());

double value[6] = {0.f};
float phi_cp2 = 0.f, eta_cp2 = 0.f;
Expand Down Expand Up @@ -349,8 +377,9 @@ struct MaterialBudget {
} // end of different collision combinations
}

Partition<MyCollisions> grouped_collisions = CentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < CentMax; // this goes to same event.
Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true && CentMin < o2::aod::cent::centFT0M&& o2::aod::cent::centFT0M < CentMax;
Partition<MyCollisions> grouped_collisions = cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax; // this goes to same event.
Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true;
Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax);
Filter collisionFilter_subsys = o2::aod::emreducedevent::ngpcm >= 2;
using MyFilteredCollisions = soa::Filtered<MyCollisions>; // this goes to mixed event.

Expand All @@ -359,7 +388,13 @@ struct MaterialBudget {
fillsinglephoton<PairType::kPCMPCM>(grouped_collisions, v0photons, perCollision_pcm, fProbeCuts, legs);
SameEventPairing<PairType::kPCMPCM>(filtered_collisions, v0photons, v0photons, perCollision_pcm, perCollision_pcm, fTagCuts, fProbeCuts, fPairCuts, legs);
if (fDoMixing) {
MixedEventPairing<PairType::kPCMPCM>(filtered_collisions, v0photons, v0photons, perCollision_pcm, perCollision_pcm, fTagCuts, fProbeCuts, fPairCuts, legs);
if (cfgCentEstimator == 0) {
MixedEventPairing<PairType::kPCMPCM>(filtered_collisions, v0photons, v0photons, perCollision_pcm, perCollision_pcm, fTagCuts, fProbeCuts, fPairCuts, legs, colBinning_M);
} else if (cfgCentEstimator == 1) {
MixedEventPairing<PairType::kPCMPCM>(filtered_collisions, v0photons, v0photons, perCollision_pcm, perCollision_pcm, fTagCuts, fProbeCuts, fPairCuts, legs, colBinning_A);
} else if (cfgCentEstimator == 2) {
MixedEventPairing<PairType::kPCMPCM>(filtered_collisions, v0photons, v0photons, perCollision_pcm, perCollision_pcm, fTagCuts, fProbeCuts, fPairCuts, legs, colBinning_C);
}
}
}

Expand Down
35 changes: 26 additions & 9 deletions PWGEM/PhotonMeson/Tasks/MaterialBudgetMC.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ using namespace o2::aod::photonpair;
using namespace o2::aod::pwgem::mcutil;
using namespace o2::aod::pwgem::photon;

using MyCollisions = soa::Join<aod::EMReducedEvents, aod::EMReducedEventsMult, aod::EMReducedEventsCent, aod::EMReducedEventsNgPCM>;
using MyCollisions = soa::Join<aod::EMReducedEvents, aod::EMReducedEventsMult, aod::EMReducedEventsCent, aod::EMReducedEventsNgPCM, aod::EMReducedMCEventLabels>;
using MyCollision = MyCollisions::iterator;

using MyV0Photons = soa::Join<aod::V0PhotonsKF, aod::V0KFEMReducedEventIds>;
Expand All @@ -57,9 +57,9 @@ using MyMCV0Leg = MyMCV0Legs::iterator;

struct MaterialBudgetMC {

Configurable<float> CentMin{"CentMin", -1, "min. centrality"};
Configurable<float> CentMax{"CentMax", 999, "max. centrality"};
Configurable<std::string> CentEstimator{"CentEstimator", "FT0M", "centrality estimator"};
Configurable<int> cfgCentEstimator{"cfgCentEstimator", 2, "FT0M:0, FT0A:1, FT0C:2"};
Configurable<float> cfgCentMin{"cfgCentMin", 0, "min. centrality"};
Configurable<float> cfgCentMax{"cfgCentMax", 999, "max. centrality"};

Configurable<float> maxY{"maxY", 0.9, "maximum rapidity for generated particles"};
Configurable<float> maxRgen{"maxRgen", 90.f, "maximum radius for generated particles"};
Expand Down Expand Up @@ -232,6 +232,10 @@ struct MaterialBudgetMC {
THashList* list_v0 = static_cast<THashList*>(fMainList->FindObject("V0"));
double value[4] = {0.f};
for (auto& collision : collisions) {
float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()};
if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) {
continue;
}

o2::aod::pwgem::photon::histogram::FillHistClass<EMHistType::kEvent>(list_ev_pair_before, "", collision);
if (!fEMEventCut.IsSelected(collision)) {
Expand Down Expand Up @@ -284,6 +288,14 @@ struct MaterialBudgetMC {
THashList* list_pair_ss = static_cast<THashList*>(fMainList->FindObject("Pair")->FindObject(pairnames[pairtype].data()));

for (auto& collision : collisions) {
float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()};
if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) {
continue;
}
if (!fEMEventCut.IsSelected(collision)) {
continue;
}

auto photons1_coll = photons1.sliceBy(perCollision1, collision.globalIndex());
auto photons2_coll = photons2.sliceBy(perCollision2, collision.globalIndex());

Expand Down Expand Up @@ -357,10 +369,11 @@ struct MaterialBudgetMC {
} // end of collision loop
}

Partition<MyCollisions> grouped_collisions = CentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < CentMax; // this goes to same event.
Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true && CentMin < o2::aod::cent::centFT0M&& o2::aod::cent::centFT0M < CentMax;
Partition<MyCollisions> grouped_collisions = cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax; // this goes to same event.
Filter collisionFilter_common = nabs(o2::aod::collision::posZ) < 10.f && o2::aod::collision::numContrib > (uint16_t)0 && o2::aod::evsel::sel8 == true;
Filter collisionFilter_centrality = (cfgCentMin < o2::aod::cent::centFT0M && o2::aod::cent::centFT0M < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0A && o2::aod::cent::centFT0A < cfgCentMax) || (cfgCentMin < o2::aod::cent::centFT0C && o2::aod::cent::centFT0C < cfgCentMax);
Filter collisionFilter_subsys = o2::aod::emreducedevent::ngpcm >= 2;
using MyFilteredCollisions = soa::Filtered<MyCollisions>; // this goes to mixed event.
using MyFilteredCollisions = soa::Filtered<MyCollisions>; // this goes to same event pairing.

void processMBMC(MyCollisions const& collisions, MyFilteredCollisions const& filtered_collisions, MyV0Photons const& v0photons, MyMCV0Legs const& legs, aod::EMMCParticles const& mcparticles, aod::EMReducedMCEvents const& mccollisions)
{
Expand All @@ -369,12 +382,16 @@ struct MaterialBudgetMC {
}

PresliceUnsorted<aod::EMMCParticles> perMcCollision = aod::emmcparticle::emreducedmceventId;
void processGen(soa::Join<MyCollisions, aod::EMReducedMCEventLabels> const& collisions, aod::EMReducedMCEvents const&, aod::EMMCParticles const& mcparticles)
void processGen(MyCollisions const& collisions, aod::EMReducedMCEvents const&, aod::EMMCParticles const& mcparticles)
{
// loop over mc stack and fill histograms for pure MC truth signals
// all MC tracks which belong to the MC event corresponding to the current reconstructed event

for (auto& collision : collisions) {
for (auto& collision : grouped_collisions) {
float centralities[3] = {collision.centFT0M(), collision.centFT0A(), collision.centFT0C()};
if (centralities[cfgCentEstimator] < cfgCentMin || cfgCentMax < centralities[cfgCentEstimator]) {
continue;
}
auto mccollision = collision.emreducedmcevent();
// LOGF(info, "mccollision.globalIndex() = %d", mccollision.globalIndex());

Expand Down
Loading

0 comments on commit 90a18dd

Please sign in to comment.