Skip to content

Commit 8a8426f

Browse files
committed
add extra decayer information to otfParticle
1 parent 16fa0b2 commit 8a8426f

6 files changed

Lines changed: 55 additions & 25 deletions

File tree

ALICE3/Core/Decayer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ class Decayer
126126
particle.setPDG(pdgCodesDaughters[i]);
127127
particle.setVxVyVz(mVx, mVy, mVz);
128128
particle.setPxPyPzE(dau.Px(), dau.Py(), dau.Pz(), dau.E());
129+
particle.setBitOn(o2::upgrade::DecayerBits::ProducedByDecayer);
129130
decayProducts.push_back(particle);
130131
}
131132

ALICE3/Core/OTFParticle.h

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,17 @@
2121
#include <CommonConstants/MathConstants.h>
2222

2323
#include <array>
24+
#include <bitset>
2425
#include <cmath>
2526
#include <cstdint>
2627
#include <span>
2728

2829
namespace o2::upgrade
2930
{
30-
static constexpr uint8_t ProducedByDecayer = 0xFF;
31+
32+
enum class DecayerBits { ProducedByDecayer = 0,
33+
IsPrimary,
34+
IsAlive };
3135

3236
class OTFParticle
3337
{
@@ -48,20 +52,29 @@ class OTFParticle
4852
mVy = particle.vy();
4953
mVz = particle.vz();
5054
mVt = particle.vt();
55+
mFlag = particle.flags();
56+
mStatusCode = particle.statusCode();
5157
mIsFromMcParticles = true;
5258
if (particle.has_mothers()) {
5359
mIndicesMother = {particle.mothersIds().front(), particle.mothersIds().back()};
5460
}
61+
if constexpr ( requires { particle.decayerBits(); } ) {
62+
mBits = particle.decayerBits();
63+
} else {
64+
// If we are here, we created particle in the standard workflow -- without secondaries
65+
// Then we should set all particles as physical primaries accordingly
66+
setBitOn(DecayerBits::IsPrimary);
67+
}
5568
}
5669

5770
// Setters
58-
void setIsAlive(const bool isAlive) { mIsAlive = isAlive; }
5971
void setIsPrimary(const bool isPrimary) { mIsPrimary = isPrimary; }
6072
void setCollisionId(const int collisionId) { mCollisionId = collisionId; }
6173
void setPDG(const int pdg) { mPdgCode = pdg; }
6274
void setIndicesMother(const int start, const int stop) { mIndicesMother = {start, stop}; }
6375
void setIndicesDaughter(const int start, const int stop) { mIndicesDaughter = {start, stop}; }
6476
void setProductionTime(const float vt) { mVt = vt; }
77+
void setFlags(uint8_t flag) { mFlag = flag; }
6578
void setVxVyVz(const float vx, const float vy, const float vz)
6679
{
6780
mVx = vx;
@@ -88,16 +101,8 @@ class OTFParticle
88101
static constexpr float Weight = 1.f;
89102
return Weight;
90103
}
91-
uint8_t flags() const
92-
{
93-
static constexpr uint8_t Flags = 1;
94-
return Flags; // todo
95-
}
96-
int statusCode() const
97-
{
98-
static constexpr int StatusCode = 1;
99-
return StatusCode; // todo
100-
}
104+
uint8_t flags() const { return mFlag; }
105+
int statusCode() const { return mStatusCode; }
101106
float vx() const { return mVx; }
102107
float vy() const { return mVy; }
103108
float vz() const { return mVz; }
@@ -113,7 +118,8 @@ class OTFParticle
113118
float phi() const { return o2::constants::math::PI + std::atan2(-1.0f * py(), -1.0f * px()); }
114119
float eta() const
115120
{
116-
// As https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L1943
121+
// Conditionally defined to avoid FPEs
122+
// As https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L1959
117123
static constexpr float Tolerance = 1e-7f;
118124
if ((p() - mPz) < Tolerance) {
119125
return (mPz < 0.0f) ? -100.0f : 100.0f;
@@ -123,7 +129,8 @@ class OTFParticle
123129
}
124130
float y() const
125131
{
126-
// As https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L1922
132+
// Conditionally defined to avoid FPEs
133+
// As https://github.com/AliceO2Group/AliceO2/blob/dev/Framework/Core/include/Framework/AnalysisDataModel.h#L1980
127134
static constexpr float Tolerance = 1e-7f;
128135
if ((e() - mPz) < Tolerance) {
129136
return (mPz < 0.0f) ? -100.0f : 100.0f;
@@ -152,13 +159,27 @@ class OTFParticle
152159
return (mGlobalIndex != -1);
153160
}
154161

162+
// Bits
163+
bool checkBit(DecayerBits bit) const { return mBits.test(static_cast<size_t>(bit)); }
164+
void setBit(DecayerBits bit, bool value = true) { mBits.set(static_cast<size_t>(bit), value); }
165+
void setBitOn(DecayerBits bit) { mBits.set(static_cast<size_t>(bit), true); }
166+
void setBitOff(DecayerBits bit) { mBits.set(static_cast<size_t>(bit), false); }
167+
168+
std::bitset<8> getBits() const { return mBits; }
169+
uint8_t getBitsValue() const { return static_cast<uint8_t>(mBits.to_ulong()); }
170+
void setBits(std::bitset<8> bits) { mBits = bits; }
171+
155172
private:
156173
int mPdgCode{}, mGlobalIndex{-1};
157174
int mCollisionId{};
158175
float mVx{}, mVy{}, mVz{}, mVt{};
159176
float mPx{}, mPy{}, mPz{}, mE{};
160177
bool mIsAlive{}, mIsFromMcParticles{false};
161178
bool mIsPrimary{};
179+
180+
int mStatusCode{};
181+
uint8_t mFlag{};
182+
std::bitset<8> mBits{};
162183
std::array<int, 2> mIndicesMother{-1, -1}, mIndicesDaughter{-1, -1};
163184
};
164185

ALICE3/DataModel/tracksAlice3.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,15 @@ namespace mcparticle_alice3
5050
{
5151
DECLARE_SOA_COLUMN(NHits, nHits, int); //! number of silicon hits
5252
DECLARE_SOA_COLUMN(Charge, charge, float); //! particle charge
53+
DECLARE_SOA_BITMAP_COLUMN(DecayerBits, decayerBits, 8); //! Bit mask for particle produced by the OTF decayer
5354
} // namespace mcparticle_alice3
5455
DECLARE_SOA_TABLE(MCParticlesExtraA3, "AOD", "MCParticlesExtraA3",
5556
mcparticle_alice3::NHits,
5657
mcparticle_alice3::Charge);
5758
using MCParticleExtraA3 = MCParticlesExtraA3::iterator;
59+
60+
DECLARE_SOA_TABLE(OTFDecayerBits, "AOD", "OTFDecayerBits", mcparticle_alice3::DecayerBits);
61+
5862
} // namespace o2::aod
5963

6064
#endif // ALICE3_DATAMODEL_TRACKSALICE3_H_

ALICE3/TableProducer/OTF/onTheFlyDecayer.cxx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "ALICE3/Core/Decayer.h"
1919
#include "ALICE3/Core/OTFParticle.h"
20+
#include "ALICE3/DataModel/tracksAlice3.h"
2021
#include "ALICE3/Core/TrackUtilities.h"
2122

2223
#include <Framework/AnalysisDataModel.h>
@@ -72,6 +73,7 @@ namespace o2::aod { O2ORIGIN("TMP"); }
7273
struct OnTheFlyDecayer {
7374
Produces<aod::McCollisions_001> tableMcCollisions;
7475
Produces<aod::StoredMcParticles_001> tableMcParticles;
76+
Produces<aod::OTFDecayerBits> tableOTFDecayerBits;
7577

7678
o2::upgrade::Decayer decayer;
7779
Service<o2::framework::O2DatabasePDG> pdgDB;
@@ -122,15 +124,15 @@ struct OnTheFlyDecayer {
122124
for (int i = start; i < stop; i++) {
123125
o2::upgrade::OTFParticle& particle = allParticles[i];
124126
if (particle.isFromMcParticles()) {
125-
particle.setIsPrimary(true);
126-
particle.setIsAlive(true);
127+
particle.setBitOn(o2::upgrade::DecayerBits::IsPrimary);
128+
particle.setBitOn(o2::upgrade::DecayerBits::IsAlive);
127129
}
128130

129131
if (!canDecay(particle)) {
130132
continue;
131133
}
132134

133-
particle.setIsAlive(false);
135+
particle.setBitOff(o2::upgrade::DecayerBits::IsAlive);
134136
std::vector<o2::upgrade::OTFParticle> decayStack = decayer.decayParticle(pdgDB, particle);
135137
const float decayRadius = decayer.getDecayRadius();
136138
const float trackVelocity = o2::upgrade::computeParticleVelocity(particle.p(), pdgDB->GetParticle(particle.pdgCode())->Mass());
@@ -152,8 +154,8 @@ struct OnTheFlyDecayer {
152154
for (o2::upgrade::OTFParticle daughter : decayStack) {
153155
daughter.setIndicesMother(i, i);
154156
daughter.setCollisionId(mCollisionId);
155-
daughter.setIsAlive(true);
156-
daughter.setIsPrimary(false);
157+
daughter.setBitOn(o2::upgrade::DecayerBits::IsAlive);
158+
daughter.setBitOff(o2::upgrade::DecayerBits::IsPrimary);
157159
daughter.setProductionTime(trackTimeNS);
158160
allParticles.push_back(daughter);
159161
ndau++;
@@ -202,8 +204,9 @@ struct OnTheFlyDecayer {
202204
} else {
203205
histos.fill(HIST("hNaNBookkeeping"), 0);
204206
}
205-
207+
206208
// todo: status codes
209+
tableOTFDecayerBits(otfParticle.getBitsValue());
207210
tableMcParticles(otfParticle.collisionId(), otfParticle.pdgCode(), otfParticle.statusCode(), otfParticle.flags(),
208211
otfParticle.getMotherSpan(), otfParticle.getDaughters().data(), otfParticle.weight(),
209212
otfParticle.px(), otfParticle.py(), otfParticle.pz(), otfParticle.e(),

ALICE3/TableProducer/OTF/onTheFlyTracker.cxx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1930,7 +1930,8 @@ struct OnTheFlyTracker {
19301930
}
19311931
}
19321932

1933-
void processConfigurationDev(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles, const int icfg)
1933+
template <typename TMcParticles>
1934+
void processConfigurationDev(aod::McCollision const& mcCollision, TMcParticles const& mcParticles, const int icfg)
19341935
{
19351936
const std::string histPath = "Configuration_" + std::to_string(icfg) + "/";
19361937
tracksAlice3.clear();
@@ -1997,11 +1998,11 @@ struct OnTheFlyTracker {
19971998

19981999
bool reconstructed = false;
19992000
int nTrkHits = 0;
2000-
if (enablePrimarySmearing && mcParticle.isPhysicalPrimary()) {
2001+
if (enablePrimarySmearing && otfParticle.checkBit(o2::upgrade::DecayerBits::IsPrimary)) {
20012002
o2::upgrade::convertMCParticleToO2Track(mcParticle, trackParCov, pdgDB);
20022003
reconstructed = mSmearer[icfg]->smearTrack(trackParCov, mcParticle.pdgCode(), dNdEta);
20032004
nTrkHits = fastTrackerSettings.minSiliconHits;
2004-
} else if (enableSecondarySmearing) {
2005+
} else if (enableSecondarySmearing && !otfParticle.checkBit(o2::upgrade::DecayerBits::IsPrimary) && otfParticle.checkBit(o2::upgrade::DecayerBits::ProducedByDecayer) && otfParticle.checkBit(o2::upgrade::DecayerBits::IsAlive)) {
20052006
o2::track::TrackParCov perfectTrackParCov;
20062007
o2::upgrade::convertMCParticleToO2Track(mcParticle, perfectTrackParCov, pdgDB);
20072008
perfectTrackParCov.setPID(pdgCodeToPID(mcParticle.pdgCode()));
@@ -2071,7 +2072,7 @@ struct OnTheFlyTracker {
20712072
fillTracksInfo(ghostTracksAlice3, primaryVertex, icfg);
20722073
}
20732074

2074-
void processDecayer(aod::McCollision const& mcCollision, aod::McParticles const& mcParticles)
2075+
void processDecayer(aod::McCollision const& mcCollision, soa::Join<aod::McParticles, aod::OTFDecayerBits> const& mcParticles)
20752076
{
20762077
for (size_t icfg = 0; icfg < mSmearer.size(); ++icfg) {
20772078
processConfigurationDev(mcCollision, mcParticles, static_cast<int>(icfg));

ALICE3/TableProducer/alice3strangenessFinder.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ struct Alice3strangenessFinder {
418418
}
419419

420420
template <typename TCollision, typename TTracksGrouped>
421-
void processFindV0CandidateNoPid(TCollision collision, TTracksGrouped negTracksGrouped, TTracksGrouped posTracksGrouped, TTracksGrouped bachTracksGrouped)
421+
void processFindV0CandidateNoPid(const TCollision& collision, const TTracksGrouped& negTracksGrouped, const TTracksGrouped& posTracksGrouped, const TTracksGrouped& bachTracksGrouped)
422422
{
423423
const std::array<float, 3> vtx = {collision.posX(), collision.posY(), collision.posZ()};
424424
histos.fill(HIST("hEventCounter"), 1.0);

0 commit comments

Comments
 (0)