Skip to content

Commit b117060

Browse files
authored
Merge branch 'AliceO2Group:master' into update-varNamesMap-in-A2
2 parents 1d6a66d + 1b66373 commit b117060

39 files changed

Lines changed: 4900 additions & 2317 deletions

ALICE3/TableProducer/OTF/onTheFlyDecayer.cxx

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "ALICE3/Core/TrackUtilities.h"
2121
#include "ALICE3/DataModel/tracksAlice3.h"
2222

23+
#include <CommonConstants/PhysicsConstants.h>
2324
#include <Framework/AnalysisDataModel.h>
2425
#include <Framework/AnalysisHelpers.h>
2526
#include <Framework/AnalysisTask.h>
@@ -47,13 +48,19 @@
4748
using namespace o2;
4849
using namespace o2::framework;
4950

50-
static constexpr int NumDecays = 7;
51+
static constexpr int NumDecays = 13;
5152
static constexpr int NumParameters = 1;
52-
static constexpr int DefaultParameters[NumDecays][NumParameters]{{1}, {1}, {1}, {1}, {1}, {1}, {1}};
53+
static constexpr std::array<std::array<int, NumParameters>, NumDecays> DefaultParameters{{{1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}, {1}}};
5354
static const std::vector<std::string> parameterNames{"enable"};
5455
static const std::vector<std::string> particleNames{"K0s",
5556
"Lambda",
5657
"Anti-Lambda",
58+
"SigmaPlus",
59+
"Anti-SigmaPlus",
60+
"SigmaMinus",
61+
"Anti-SigmaMinus",
62+
"Xi0",
63+
"Anti-Xi0",
5764
"Xi",
5865
"Anti-Xi",
5966
"Omega",
@@ -62,6 +69,12 @@ static const std::vector<std::string> particleNames{"K0s",
6269
static const std::vector<int> pdgCodes{PDG_t::kK0Short,
6370
PDG_t::kLambda0,
6471
PDG_t::kLambda0Bar,
72+
PDG_t::kSigmaPlus,
73+
PDG_t::kSigmaBarMinus,
74+
PDG_t::kSigmaMinus,
75+
PDG_t::kSigmaBarPlus,
76+
o2::constants::physics::kXi0,
77+
-o2::constants::physics::kXi0,
6578
PDG_t::kXiMinus,
6679
PDG_t::kXiPlusBar,
6780
PDG_t::kOmegaMinus,
@@ -78,13 +91,13 @@ struct OnTheFlyDecayer {
7891
Produces<aod::OTFDecayerBits> tableOTFDecayerBits;
7992

8093
o2::upgrade::Decayer decayer;
81-
Service<o2::framework::O2DatabasePDG> pdgDB;
94+
Service<o2::framework::O2DatabasePDG> pdgDB{};
8295
HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject};
8396

8497
Configurable<int> seed{"seed", 0, "Set seed for particle decayer"};
8598
Configurable<float> magneticField{"magneticField", 20., "Magnetic field (kG)"};
8699
Configurable<LabeledArray<int>> enabledDecays{"enabledDecays",
87-
{DefaultParameters[0], NumDecays, NumParameters, particleNames, parameterNames},
100+
{DefaultParameters[0].data(), NumDecays, NumParameters, particleNames, parameterNames},
88101
"Enable option for particle to be decayed: 0 - no, 1 - yes"};
89102

90103
std::size_t indexOffset = 0;
@@ -99,7 +112,7 @@ struct OnTheFlyDecayer {
99112
decayer.setSeed(seed);
100113
decayer.setBField(magneticField);
101114
for (int i = 0; i < NumDecays; ++i) {
102-
if (enabledDecays->get(particleNames[i].c_str(), "enable")) {
115+
if (enabledDecays->get(particleNames[i].c_str(), "enable") != 0) {
103116
LOG(info) << " --- Decay enabled: " << pdgCodes[i];
104117
mEnabledDecays.push_back(pdgCodes[i]);
105118
}
@@ -146,9 +159,9 @@ struct OnTheFlyDecayer {
146159

147160
const float decayRadius = decayer.getDecayRadius();
148161
const float trackVelocity = o2::upgrade::computeParticleVelocity(particle.p(), pdgDB->GetParticle(particle.pdgCode())->Mass());
149-
const int charge = pdgDB->GetParticle(particle.pdgCode())->Charge() / 3;
162+
const int charge = static_cast<int>(pdgDB->GetParticle(particle.pdgCode())->Charge() / 3);
150163
float trackLength{-1.f};
151-
if (!charge) {
164+
if (charge == 0) {
152165
const float dx = particle.vx() - decayer.getSecondaryVertexX();
153166
const float dy = particle.vy() - decayer.getSecondaryVertexY();
154167
const float dz = particle.vz() - decayer.getSecondaryVertexZ();

ALICE3/TableProducer/alice3MulticharmFinder.cxx

Lines changed: 230 additions & 173 deletions
Large diffs are not rendered by default.

PWGCF/EbyEFluctuations/Tasks/meanPtFlucId.cxx

Lines changed: 551 additions & 315 deletions
Large diffs are not rendered by default.

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)