Skip to content

Commit 9283224

Browse files
committed
Feat: add track-resonance processing to derived to derived builder
1 parent b1e620b commit 9283224

3 files changed

Lines changed: 162 additions & 0 deletions

File tree

‎PWGCF/Femto/Core/twoTrackResonanceBuilder.h‎

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <Math/Vector4D.h> // IWYU pragma: keep (do not replace with Math/Vector4Dfwd.h)
3434
#include <Math/Vector4Dfwd.h>
3535

36+
#include <cstdint>
3637
#include <string>
3738

3839
namespace o2::analysis::femto::twotrackresonancebuilder
@@ -341,5 +342,120 @@ class TwoTrackResonanceBuilder
341342

342343
}; // namespace twotrackresonancebuilder
343344

345+
struct ConfTwoTrackResonanceTablesDerivedToDerived : o2::framework::ConfigurableGroup {
346+
std::string prefix = std::string("TwoTrackResonanceTables");
347+
o2::framework::Configurable<int> limitRho0{"limitRho0", 1, "Require at least this many Rho0s in the collision. Set to 0 to skip Rho0s entirely (not written to output)."};
348+
o2::framework::Configurable<int> limitPhi{"limitPhi", 0, "Require at least this many Phis in the collision. Set to 0 to skip Phis entirely (not written to output)."};
349+
};
350+
351+
struct TwoTrackResonanceBuilderDerivedToDerivedProducts : o2::framework::ProducesGroup {
352+
o2::framework::Produces<o2::aod::StoredFRho0s> producedRho0s;
353+
o2::framework::Produces<o2::aod::StoredFRho0Masks> producedRho0Masks;
354+
o2::framework::Produces<o2::aod::StoredFPhis> producedPhis;
355+
o2::framework::Produces<o2::aod::StoredFPhiMasks> producedPhiMasks;
356+
};
357+
358+
class TwoTrackResonanceBuilderDerivedToDerived
359+
{
360+
public:
361+
template <typename T>
362+
void init(T& config)
363+
{
364+
mLimitRho0 = config.limitRho0.value;
365+
mLimitPhi = config.limitPhi.value;
366+
367+
if (mLimitRho0 < 0 || mLimitPhi < 0) {
368+
LOG(fatal) << "Two-track resonance limits must be non-negative (got " << mLimitRho0 << " and " << mLimitPhi << "). Breaking...";
369+
}
370+
if (mLimitRho0 == 0 && mLimitPhi == 0) {
371+
LOG(fatal) << "Both Rho0 limit and Phi limit are 0. Breaking...";
372+
}
373+
}
374+
375+
template <typename T1, typename T2, typename T3, typename T4>
376+
bool collisionHasTooFewRho0s(T1 const& col, T2 const& /*rho0Table*/, T3& partitionRho0, T4& cache)
377+
{
378+
if (mLimitRho0 == 0) { // Rho0s disabled, cannot reject on them
379+
return false;
380+
}
381+
auto rho0Slice = partitionRho0->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache);
382+
return rho0Slice.size() < static_cast<int64_t>(mLimitRho0);
383+
}
384+
385+
template <typename T1, typename T2, typename T3, typename T4>
386+
bool collisionHasTooFewPhis(T1 const& col, T2 const& /*phiTable*/, T3& partitionPhi, T4& cache)
387+
{
388+
if (mLimitPhi == 0) { // Phis disabled, cannot reject on them
389+
return false;
390+
}
391+
auto phiSlice = partitionPhi->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache);
392+
return phiSlice.size() < static_cast<int64_t>(mLimitPhi);
393+
}
394+
395+
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
396+
void processRho0s(T1 const& col, T2 const& /*rho0Table*/, T3 const& oldTrackTable, T4& partitionRho0, T5& trackBuilder, T6& cache, T7& newRho0Table, T8& newTrackTable, T9& newCollisionTable)
397+
{
398+
if (mLimitRho0 == 0) { // Rho0s disabled
399+
return;
400+
}
401+
402+
auto rho0Slice = partitionRho0->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache);
403+
404+
for (auto const& rho0 : rho0Slice) {
405+
auto posDaughter = oldTrackTable.rawIteratorAt(utils::daughterRow(rho0.posDauId(), oldTrackTable));
406+
auto negDaughter = oldTrackTable.rawIteratorAt(utils::daughterRow(rho0.negDauId(), oldTrackTable));
407+
408+
int64_t posDaughterIndex = trackBuilder.getDaughterIndex(posDaughter, newTrackTable, newCollisionTable);
409+
int64_t negDaughterIndex = trackBuilder.getDaughterIndex(negDaughter, newTrackTable, newCollisionTable);
410+
411+
newRho0Table.producedRho0s(newCollisionTable.producedCollision.lastIndex(),
412+
rho0.pt(),
413+
rho0.eta(),
414+
rho0.phi(),
415+
rho0.mass(),
416+
posDaughterIndex,
417+
negDaughterIndex);
418+
newRho0Table.producedRho0Masks(rho0.maskPosDau(),
419+
rho0.posDauHasHighMomentum(),
420+
rho0.maskNegDau(),
421+
rho0.negDauHasHighMomentum());
422+
}
423+
}
424+
425+
template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
426+
void processPhis(T1 const& col, T2 const& /*phiTable*/, T3 const& oldTrackTable, T4& partitionPhi, T5& trackBuilder, T6& cache, T7& newPhiTable, T8& newTrackTable, T9& newCollisionTable)
427+
{
428+
if (mLimitPhi == 0) { // Phis disabled
429+
return;
430+
}
431+
432+
auto phiSlice = partitionPhi->sliceByCached(o2::aod::femtobase::stored::fColId, col.globalIndex(), cache);
433+
434+
for (auto const& phi : phiSlice) {
435+
auto posDaughter = oldTrackTable.rawIteratorAt(utils::daughterRow(phi.posDauId(), oldTrackTable));
436+
auto negDaughter = oldTrackTable.rawIteratorAt(utils::daughterRow(phi.negDauId(), oldTrackTable));
437+
438+
int64_t posDaughterIndex = trackBuilder.getDaughterIndex(posDaughter, newTrackTable, newCollisionTable);
439+
int64_t negDaughterIndex = trackBuilder.getDaughterIndex(negDaughter, newTrackTable, newCollisionTable);
440+
441+
newPhiTable.producedPhis(newCollisionTable.producedCollision.lastIndex(),
442+
phi.pt(),
443+
phi.eta(),
444+
phi.phi(),
445+
phi.mass(),
446+
posDaughterIndex,
447+
negDaughterIndex);
448+
newPhiTable.producedPhiMasks(phi.maskPosDau(),
449+
phi.posDauHasHighMomentum(),
450+
phi.maskNegDau(),
451+
phi.negDauHasHighMomentum());
452+
}
453+
}
454+
455+
private:
456+
int mLimitRho0 = 0;
457+
int mLimitPhi = 0;
458+
};
459+
344460
} // namespace o2::analysis::femto::twotrackresonancebuilder
345461
#endif // PWGCF_FEMTO_CORE_TWOTRACKRESONANCEBUILDER_H_

‎PWGCF/Femto/DataModel/FemtoTables.h‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,12 +552,14 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FPhis_001, "FPHI", 1, //! femto phis
552552
femtobase::dynamic::Pz<femtobase::stored::Pt, femtobase::stored::Eta>,
553553
femtobase::dynamic::Theta<femtobase::stored::Eta>);
554554
using FPhis = FPhis_001;
555+
using StoredFPhis = StoredFPhis_001;
555556
DECLARE_SOA_TABLE_STAGED_VERSIONED(FPhiMasks_001, "FPHIMASK", 1, //! mask for phis
556557
femtotwotrackresonances::MaskPosDau,
557558
femtotwotrackresonances::PosDauHasHighMomentum,
558559
femtotwotrackresonances::MaskNegDau,
559560
femtotwotrackresonances::NegDauHasHighMomentum);
560561
using FPhiMasks = FPhiMasks_001;
562+
using StoredFPhiMasks = StoredFPhiMasks_001;
561563

562564
// table for kstars
563565
DECLARE_SOA_TABLE_STAGED_VERSIONED(FKstar0s_001, "FKSTAR0", 1, //! femto k0star
@@ -599,12 +601,14 @@ DECLARE_SOA_TABLE_STAGED_VERSIONED(FRho0s_001, "FRHO0", 1, //! femto rho0s
599601
femtobase::dynamic::Pz<femtobase::stored::Pt, femtobase::stored::Eta>,
600602
femtobase::dynamic::Theta<femtobase::stored::Eta>);
601603
using FRho0s = FRho0s_001;
604+
using StoredFRho0s = StoredFRho0s_001;
602605
DECLARE_SOA_TABLE_STAGED_VERSIONED(FRho0Masks_001, "FRHO0MASK", 1, //! rho0s masks
603606
femtotwotrackresonances::MaskPosDau,
604607
femtotwotrackresonances::PosDauHasHighMomentum,
605608
femtotwotrackresonances::MaskNegDau,
606609
femtotwotrackresonances::NegDauHasHighMomentum);
607610
using FRho0Masks = FRho0Masks_001;
611+
using StoredFRho0Masks = StoredFRho0Masks_001;
608612

609613
namespace femtov0s
610614
{

‎PWGCF/Femto/TableProducer/femtoProducerDerivedToDerived.cxx‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "PWGCF/Femto/Core/mcBuilder.h"
2020
#include "PWGCF/Femto/Core/partitions.h"
2121
#include "PWGCF/Femto/Core/trackBuilder.h"
22+
#include "PWGCF/Femto/Core/twoTrackResonanceBuilder.h"
2223
#include "PWGCF/Femto/Core/v0Builder.h"
2324
#include "PWGCF/Femto/DataModel/FemtoTables.h"
2425

@@ -47,6 +48,8 @@ struct FemtoProducerDerivedToDerived {
4748
using FemtoTracksWithMass = o2::soa::Join<FemtoTracks, o2::aod::FTrackMass>;
4849
using FemtoLambdas = o2::soa::Join<o2::aod::FLambdas, o2::aod::FLambdaMasks>;
4950
using FemtoK0shorts = o2::soa::Join<o2::aod::FK0shorts, o2::aod::FK0shortMasks>;
51+
using FemtoRho0s = o2::soa::Join<o2::aod::FRho0s, o2::aod::FRho0Masks>;
52+
using FemtoPhis = o2::soa::Join<o2::aod::FPhis, o2::aod::FPhiMasks>;
5053
using FemtoXis = o2::soa::Join<o2::aod::FXis, o2::aod::FXiMasks>;
5154
using FemtoOmegas = o2::soa::Join<o2::aod::FOmegas, o2::aod::FOmegaMasks>;
5255
using FemtoSigma = o2::soa::Join<o2::aod::FSigmas, o2::aod::FSigmaMasks>;
@@ -93,6 +96,19 @@ struct FemtoProducerDerivedToDerived {
9396
o2::framework::Partition<FemtoK0shorts> k0shortPartition = MAKE_K0SHORT_PARTITION(k0shortSelection1);
9497
o2::framework::Preslice<FemtoK0shorts> perColK0shorts = o2::aod::femtobase::stored::fColId;
9598

99+
// two-track resonance builder
100+
twotrackresonancebuilder::TwoTrackResonanceBuilderDerivedToDerived resonanceBuilder;
101+
twotrackresonancebuilder::TwoTrackResonanceBuilderDerivedToDerivedProducts resonanceBuilderProducts;
102+
twotrackresonancebuilder::ConfTwoTrackResonanceTablesDerivedToDerived confResonanceBuilder;
103+
104+
twotrackresonancebuilder::ConfRho0Selection rho0Selection;
105+
o2::framework::Partition<FemtoRho0s> rho0Partition = MAKE_RESONANCE_0_PARTITON(rho0Selection);
106+
o2::framework::Preslice<FemtoRho0s> perColRho0s = o2::aod::femtobase::stored::fColId;
107+
108+
twotrackresonancebuilder::ConfPhiSelection phiSelection;
109+
o2::framework::Partition<FemtoPhis> phiPartition = MAKE_RESONANCE_0_PARTITON(phiSelection);
110+
o2::framework::Preslice<FemtoPhis> perColPhis = o2::aod::femtobase::stored::fColId;
111+
96112
// kink builder
97113
kinkbuilder::KinkBuilderDerivedToDerived kinkBuilder;
98114
kinkbuilder::KinkBuilderDerivedToDerivedProducts kinkBuilderProducts;
@@ -143,6 +159,7 @@ struct FemtoProducerDerivedToDerived {
143159
static_cast<int>(doprocessTracksXis) + static_cast<int>(doprocessTracksOmegas) +
144160
static_cast<int>(doprocessTracksK0shorts) + static_cast<int>(doprocessTracksSigma) +
145161
static_cast<int>(doprocessTracksSigmaPlus) +
162+
static_cast<int>(doprocessTracksRho0) + static_cast<int>(doprocessTracksPhi) +
146163
static_cast<int>(doprocessTracksMc) + static_cast<int>(doprocessTracksSigmaMc) +
147164
static_cast<int>(doprocessTracksSigmaPlusMc);
148165
if (activeProcesses != 1) {
@@ -153,6 +170,7 @@ struct FemtoProducerDerivedToDerived {
153170
v0Builder.init(confV0Builder);
154171
cascadeBuilder.init(confCascadeBuilder);
155172
kinkBuilder.init(confKinkBuilder);
173+
resonanceBuilder.init(confResonanceBuilder);
156174
mcBuilder.init(confMcBuilder);
157175
}
158176

@@ -274,6 +292,30 @@ struct FemtoProducerDerivedToDerived {
274292
}
275293
PROCESS_SWITCH(FemtoProducerDerivedToDerived, processTracksSigmaPlus, "Process sigmaPlus and tracks", false);
276294

295+
void processTracksRho0(FilteredFemtoCollision const& col, FemtoTracks const& tracks, FemtoRho0s const& rho0s)
296+
{
297+
if (trackBuilder.collisionHasTooFewTracks(col, tracks, trackPartition1, trackPartition2, cache) || resonanceBuilder.collisionHasTooFewRho0s(col, rho0s, rho0Partition, cache)) {
298+
return;
299+
}
300+
trackBuilder.reset(tracks);
301+
collisionBuilder.processCollision(col, collisionBuilderProducts);
302+
trackBuilder.processTracks(col, tracks, trackPartition1, trackPartition2, cache, trackBuilderProducts, collisionBuilderProducts);
303+
resonanceBuilder.processRho0s(col, rho0s, tracks, rho0Partition, trackBuilder, cache, resonanceBuilderProducts, trackBuilderProducts, collisionBuilderProducts);
304+
}
305+
PROCESS_SWITCH(FemtoProducerDerivedToDerived, processTracksRho0, "Process rho0 and tracks", false);
306+
307+
void processTracksPhi(FilteredFemtoCollision const& col, FemtoTracks const& tracks, FemtoPhis const& phis)
308+
{
309+
if (trackBuilder.collisionHasTooFewTracks(col, tracks, trackPartition1, trackPartition2, cache) || resonanceBuilder.collisionHasTooFewPhis(col, phis, phiPartition, cache)) {
310+
return;
311+
}
312+
trackBuilder.reset(tracks);
313+
collisionBuilder.processCollision(col, collisionBuilderProducts);
314+
trackBuilder.processTracks(col, tracks, trackPartition1, trackPartition2, cache, trackBuilderProducts, collisionBuilderProducts);
315+
resonanceBuilder.processPhis(col, phis, tracks, phiPartition, trackBuilder, cache, resonanceBuilderProducts, trackBuilderProducts, collisionBuilderProducts);
316+
}
317+
PROCESS_SWITCH(FemtoProducerDerivedToDerived, processTracksPhi, "Process phi and tracks", false);
318+
277319
// mc processing
278320
// // NOTE: unlike the other process functions, this one subscribes to the full
279321
// collision table and iterates manually. The MC index maps are keyed by source

0 commit comments

Comments
 (0)