Skip to content

Commit 629d2f5

Browse files
committed
Feat: add lite track and collision tables
1 parent 738d936 commit 629d2f5

11 files changed

Lines changed: 324 additions & 47 deletions

File tree

PWGCF/Femto/Core/cascadeBuilder.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -517,13 +517,13 @@ class CascadeBuilder
517517
collisionBuilder.template fillCollision<system>(collisionProducts, col);
518518

519519
auto bachelor = cascade.template bachelor_as<T7>();
520-
bachelorIndex = trackBuilder.template getDaughterIndex<modes::Track::kCascadeBachelor>(bachelor, trackProducts, collisionProducts);
520+
bachelorIndex = trackBuilder.template getDaughterIndex<modes::Track::kCascadeBachelor>(bachelor, trackProducts, collisionBuilder);
521521

522522
auto posDaughter = cascade.template posTrack_as<T7>();
523-
posDaughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kV0Daughter>(posDaughter, trackProducts, collisionProducts);
523+
posDaughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kV0Daughter>(posDaughter, trackProducts, collisionBuilder);
524524

525525
auto negDaughter = cascade.template negTrack_as<T7>();
526-
negDaughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kV0Daughter>(negDaughter, trackProducts, collisionProducts);
526+
negDaughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kV0Daughter>(negDaughter, trackProducts, collisionBuilder);
527527

528528
fillCascade(collisionProducts, cascadeProducts, cascade, col, bachelorIndex, posDaughterIndex, negDaughterIndex);
529529
}
@@ -551,13 +551,13 @@ class CascadeBuilder
551551
collisionBuilder.template fillMcCollision<system>(collisionProducts, col, mcCols, mcProducts, mcBuilder);
552552

553553
auto bachelor = cascade.template bachelor_as<T8>();
554-
bachelorIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kCascadeBachelor>(col, collisionProducts, mcCols, bachelor, trackProducts, mcParticles, mcBuilder, mcProducts);
554+
bachelorIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kCascadeBachelor>(col, collisionBuilder, mcCols, bachelor, trackProducts, mcParticles, mcBuilder, mcProducts);
555555

556556
auto posDaughter = cascade.template posTrack_as<T8>();
557-
posDaughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kV0Daughter>(col, collisionProducts, mcCols, posDaughter, trackProducts, mcParticles, mcBuilder, mcProducts);
557+
posDaughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kV0Daughter>(col, collisionBuilder, mcCols, posDaughter, trackProducts, mcParticles, mcBuilder, mcProducts);
558558

559559
auto negDaughter = cascade.template negTrack_as<T8>();
560-
negDaughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kV0Daughter>(col, collisionProducts, mcCols, negDaughter, trackProducts, mcParticles, mcBuilder, mcProducts);
560+
negDaughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kV0Daughter>(col, collisionBuilder, mcCols, negDaughter, trackProducts, mcParticles, mcBuilder, mcProducts);
561561

562562
fillCascade(collisionProducts, cascadeProducts, cascade, col, bachelorIndex, posDaughterIndex, negDaughterIndex);
563563
if constexpr (modes::isEqual(cascadeType, modes::Cascade::kXi)) {

PWGCF/Femto/Core/collisionBuilder.h

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ class CollisionSelection : public baseselection::BaseSelection<float, o2::analys
500500

501501
struct CollisionBuilderProducts : o2::framework::ProducesGroup {
502502
o2::framework::Produces<o2::aod::FCols> producedCollision;
503+
o2::framework::Produces<o2::aod::FLiteCols> producedLiteCollision;
503504
o2::framework::Produces<o2::aod::FColMasks> producedCollisionMask;
504505
o2::framework::Produces<o2::aod::FColPos> producedPositions;
505506
o2::framework::Produces<o2::aod::FColSphericities> producedSphericities;
@@ -511,6 +512,7 @@ struct CollisionBuilderProducts : o2::framework::ProducesGroup {
511512
struct ConfCollisionTables : o2::framework::ConfigurableGroup {
512513
std::string prefix = std::string("CollisionTables");
513514
o2::framework::Configurable<int> produceCollisions{"produceCollisions", -1, "Produce Collisions (-1: auto; 0 off; 1 on)"};
515+
o2::framework::Configurable<int> produceLiteCollisions{"produceLiteCollisions", -1, "Produce Lite Collisions (-1: auto; 0 off; 1 on)"};
514516
o2::framework::Configurable<int> produceCollisionMasks{"produceCollisionMasks", -1, "Produce Collision Masks (-1: auto; 0 off; 1 on)"};
515517
o2::framework::Configurable<int> producePositions{"producePositions", -1, "Produce Positions (-1: auto; 0 off; 1 on)"};
516518
o2::framework::Configurable<int> produceSphericities{"produceSphericities", -1, "Produce Sphericity (-1: auto; 0 off; 1 on)"};
@@ -536,13 +538,21 @@ class CollisionBuilder
536538
mSubGeneratorId = confFilter.subGeneratorId.value;
537539

538540
mProducedCollisions = utils::enableTable("FCols_001", confTable.produceCollisions.value, initContext);
541+
mProducedLiteCollisions = utils::enableTable("FLiteCols_001", confTable.produceLiteCollisions.value, initContext);
539542
mProducedCollisionMasks = utils::enableTable("FColMasks_001", confTable.produceCollisionMasks.value, initContext);
540543
mProducedPositions = utils::enableTable("FColPos_001", confTable.producePositions.value, initContext);
541544
mProducedSphericities = utils::enableTable("FColSphericities_001", confTable.produceSphericities.value, initContext);
542545
mProducedMultiplicities = utils::enableTable("FColMults_001", confTable.produceMults.value, initContext);
543546
mProducedCentralities = utils::enableTable("FColCents_001", confTable.produceCents.value, initContext);
544547
mProduceQns = utils::enableTable("FColQnBins_001", confTable.produceQns.value, initContext);
545-
if (mProducedCollisions || mProducedCollisionMasks || mProducedPositions || mProducedSphericities || mProducedMultiplicities || mProducedCentralities) {
548+
549+
if (mProducedCollisions && mProducedLiteCollisions) {
550+
LOG(fatal) << "FCols and FLiteCols are mutually exclusive -- enable only one. "
551+
<< "FLiteCols is meant to only replace FCols at the producer stage (for better compression in derived data); "
552+
<< "use the dedicated converter task to reconstruct FCols from FLiteCols downstream.";
553+
}
554+
555+
if (mProducedCollisions || mProducedLiteCollisions || mProducedCollisionMasks || mProducedPositions || mProducedSphericities || mProducedMultiplicities || mProducedCentralities) {
546556
mFillAnyTable = true;
547557
} else {
548558
LOG(info) << "No tables configured, Selection object will not be configured...";
@@ -616,17 +626,25 @@ class CollisionBuilder
616626
if (!mFillAnyTable) {
617627
return;
618628
}
619-
620629
if (mCollisionAlreadyFilled) {
621630
return;
622631
}
623-
624632
if (mProducedCollisions) {
625633
collisionProducts.producedCollision(col.posZ(),
626634
col.multNTracksPV(),
627635
mCollisionSelection.getCentrality(),
628636
static_cast<int8_t>(mCollisionSelection.getMagneticField()));
637+
638+
mCurrentCollisionIndex = collisionProducts.producedCollision.lastIndex();
639+
}
640+
if (mProducedLiteCollisions) {
641+
collisionProducts.producedLiteCollision(o2::aod::femtocollisions::lite::binPosZ(col.posZ()),
642+
o2::aod::femtocollisions::lite::binMult(col.multNTracksPV()),
643+
o2::aod::femtocollisions::lite::binCent(mCollisionSelection.getCentrality()),
644+
static_cast<int8_t>(mCollisionSelection.getMagneticField()));
645+
mCurrentCollisionIndex = collisionProducts.producedLiteCollision.lastIndex();
629646
}
647+
630648
if (mProducedCollisionMasks) {
631649
collisionProducts.producedCollisionMask(mCollisionSelection.getBitmask());
632650
}
@@ -673,18 +691,25 @@ class CollisionBuilder
673691
mcBuilder.template fillMcCollisionWithLabel<system>(mcProducts, col, mcCols);
674692
}
675693

676-
void reset() { mCollisionAlreadyFilled = false; }
694+
[[nodiscard]] int64_t collisionIndex() const { return mCurrentCollisionIndex; }
695+
void reset()
696+
{
697+
mCollisionAlreadyFilled = false;
698+
mCurrentCollisionIndex = -1;
699+
}
677700

678701
private:
679702
CollisionSelection<SelectionHistName, FilterHistName> mCollisionSelection;
680703
bool mCollisionAlreadyFilled = false;
704+
int64_t mCurrentCollisionIndex = -1;
681705
int mRunNumber = -1;
682706
std::string mGrpPath = std::string("");
683707
int mMagFieldForced = 0;
684708
int mMagField = 0;
685709
int mSubGeneratorId = -1;
686710
bool mFillAnyTable = false;
687711
bool mProducedCollisions = false;
712+
bool mProducedLiteCollisions = false;
688713
bool mProducedCollisionMasks = false;
689714
bool mProducedPositions = false;
690715
bool mProducedSphericities = false;

PWGCF/Femto/Core/femtoUtils.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424

2525
#include <TPDGCode.h>
2626

27+
#include <algorithm>
2728
#include <cmath>
2829
#include <concepts>
2930
#include <cstdint>
31+
#include <limits>
3032
#include <optional>
3133
#include <unordered_map>
3234

@@ -228,6 +230,56 @@ inline int signum(T x)
228230
return (T(0) < x) - (x < T(0));
229231
}
230232

233+
template <typename T>
234+
inline T binLinear(float value, float lo, float hi, float step)
235+
{
236+
float v = std::clamp(value, lo, hi);
237+
auto idx = static_cast<int64_t>(std::round((v - lo) / step));
238+
auto maxIdx = static_cast<int64_t>(std::numeric_limits<T>::max()) - static_cast<int64_t>(std::numeric_limits<T>::min());
239+
idx = std::clamp(idx, static_cast<int64_t>(0), maxIdx);
240+
return static_cast<T>(idx + std::numeric_limits<T>::min());
241+
}
242+
243+
template <typename T>
244+
inline float unBinLinear(T binned, float lo, float step)
245+
{
246+
auto idx = static_cast<int64_t>(binned) - static_cast<int64_t>(std::numeric_limits<T>::min());
247+
return lo + static_cast<float>(idx) * step;
248+
}
249+
250+
template <typename T>
251+
inline T binLogSigned(float signedValue, float magMin, float magMax)
252+
{
253+
static_assert(std::is_unsigned_v<T>, "binLogSigned requires an unsigned storage type");
254+
constexpr uint32_t TotalBits = sizeof(T) * 8;
255+
constexpr uint32_t HalfLevels = 1u << (TotalBits - 1);
256+
uint32_t sign = (signedValue < 0.f) ? 1u : 0u;
257+
float mag = std::clamp(std::fabs(signedValue), magMin, magMax);
258+
float logLo = std::log(magMin);
259+
float logHi = std::log(magMax);
260+
float step = (logHi - logLo) / static_cast<float>(HalfLevels - 1);
261+
auto idx = static_cast<uint32_t>(std::round((std::log(mag) - logLo) / step));
262+
idx = std::clamp(idx, 0u, HalfLevels - 1);
263+
return static_cast<T>((sign << (TotalBits - 1)) | idx);
264+
}
265+
266+
template <typename T>
267+
inline float unBinLogSigned(T binned, float magMin, float magMax)
268+
{
269+
constexpr uint32_t TotalBits = sizeof(T) * 8;
270+
constexpr uint32_t HalfLevels = 1u << (TotalBits - 1);
271+
constexpr T SignMask = static_cast<T>(1u << (TotalBits - 1));
272+
constexpr T MagMask = static_cast<T>(SignMask - 1);
273+
float sign = (binned & SignMask) ? -1.f : 1.f;
274+
uint32_t idx = binned & MagMask;
275+
float logLo = std::log(magMin);
276+
float logHi = std::log(magMax);
277+
float step = (logHi - logLo) / static_cast<float>(HalfLevels - 1);
278+
float mag = std::exp(logLo + static_cast<float>(idx) * step);
279+
return sign * mag;
280+
}
281+
231282
}; // namespace utils
232283
}; // namespace o2::analysis::femto
284+
//
233285
#endif // PWGCF_FEMTO_CORE_FEMTOUTILS_H_

PWGCF/Femto/Core/kinkBuilder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ class KinkBuilder
547547
collisionBuilder.template fillCollision<system>(collisionProducts, col);
548548

549549
auto daughter = kink.template trackDaug_as<T7>();
550-
daughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kKinkDaughter>(daughter, trackProducts, collisionProducts);
550+
daughterIndex = trackBuilder.template getDaughterIndex<modes::Track::kKinkDaughter>(daughter, trackProducts, collisionBuilder);
551551
if constexpr (modes::isEqual(kinkType, modes::Kink::kSigma)) {
552552
fillSigma(collisionProducts, kinkProducts, kink, daughterIndex);
553553
}
@@ -581,7 +581,7 @@ class KinkBuilder
581581
collisionBuilder.template fillMcCollision<system>(collisionProducts, col, mcCols, mcProducts, mcBuilder);
582582

583583
auto daughter = kink.template trackDaug_as<T8>();
584-
daughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kKinkDaughter>(col, collisionProducts, mcCols, daughter, trackProducts, mcParticles, mcBuilder, mcProducts);
584+
daughterIndex = trackBuilder.template getDaughterIndex<system, modes::Track::kKinkDaughter>(col, collisionBuilder, mcCols, daughter, trackProducts, mcParticles, mcBuilder, mcProducts);
585585

586586
if constexpr (modes::isEqual(kinkType, modes::Kink::kSigma)) {
587587
fillSigma(collisionProducts, kinkProducts, kink, daughterIndex);

PWGCF/Femto/Core/mcBuilder.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ class McBuilder
162162
void fillMcCollisionWithLabel(T1& mcProducts, T2 const& col, T3 const& /*mcCols*/)
163163
{
164164
if (!mProduceCollisionLabels) {
165+
mcProducts.producedCollisionLabels(-1);
165166
return;
166167
}
167168
// Case: This reconstructed collision has an MC collision
@@ -265,6 +266,7 @@ class McBuilder
265266
void fillMcSigmaWithLabel(T1 const& col, T2 const& mcCols, T3 const& sigmaDaughter, T4 const& mcParticles, T5& mcProducts)
266267
{
267268
if (!mProduceSigmaLabels) {
269+
mcProducts.producedSigmaLabels(-1);
268270
return;
269271
}
270272
fillMcLabelGeneric<system>(col, mcCols, sigmaDaughter, mcParticles, mcProducts, [](auto& prod, int64_t p) { prod.producedSigmaLabels(p); }, true);
@@ -274,6 +276,7 @@ class McBuilder
274276
void fillMcSigmaPlusWithLabel(T1 const& col, T2 const& mcCols, T3 const& sigmaPlusDaughter, T4 const& mcParticles, T5& mcProducts)
275277
{
276278
if (!mProduceSigmaPlusLabels) {
279+
mcProducts.producedSigmaPlusLabels(-1);
277280
return;
278281
}
279282
fillMcLabelGeneric<system>(col, mcCols, sigmaPlusDaughter, mcParticles, mcProducts, [](auto& prod, int64_t p) { prod.producedSigmaPlusLabels(p); }, true);

0 commit comments

Comments
 (0)