Skip to content

Commit 23b310e

Browse files
committed
PWGLF: update cascade analysis
1 parent 3c42af7 commit 23b310e

File tree

2 files changed

+58
-71
lines changed

2 files changed

+58
-71
lines changed

PWGLF/TableProducer/Strangeness/cascqaanalysis.cxx

Lines changed: 56 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <TPDGCode.h>
3535

3636
#include <algorithm>
37+
#include <cmath>
3738
#include <string>
3839
#include <vector>
3940

@@ -122,14 +123,49 @@ struct Cascqaanalysis {
122123
SliceCache cache;
123124

124125
// Random number generator for event scaling
125-
TRandom2* fRand = new TRandom2();
126+
TRandom2 fRand;
126127

127128
// Struct to select on event type
128129
typedef struct CollisionIndexAndType {
129130
int64_t index;
130131
uint8_t typeFlag;
131132
} CollisionIndexAndType;
132133

134+
template <typename TTrack>
135+
static int countITSHits(TTrack const& track)
136+
{
137+
int nHits = 0;
138+
for (unsigned int i = 0; i < 7; ++i) {
139+
if (track.itsClusterMap() & (1 << i)) {
140+
++nHits;
141+
}
142+
}
143+
return nHits;
144+
}
145+
146+
template <typename TCollision>
147+
static uint8_t buildRecoEventFlags(TCollision const& collision)
148+
{
149+
uint8_t evFlag = o2::aod::mycascades::EvFlags::EvINEL;
150+
if (collision.isInelGt0()) {
151+
evFlag |= o2::aod::mycascades::EvFlags::EvINELgt0;
152+
}
153+
if (collision.isInelGt1()) {
154+
evFlag |= o2::aod::mycascades::EvFlags::EvINELgt1;
155+
}
156+
return evFlag;
157+
}
158+
159+
template <typename TCascade, typename TCollision>
160+
static std::pair<float, float> computeCascadeCtau(TCascade const& casc, TCollision const& collision)
161+
{
162+
const float decayLength = std::hypot(casc.x() - collision.posX(), casc.y() - collision.posY(), casc.z() - collision.posZ());
163+
const float totalMomentum = std::hypot(casc.px(), casc.py(), casc.pz());
164+
const float invMomentum = 1.f / (totalMomentum + 1.e-13f);
165+
return {o2::constants::physics::MassXiMinus * decayLength * invMomentum,
166+
o2::constants::physics::MassOmegaMinus * decayLength * invMomentum};
167+
}
168+
133169
void init(InitContext const&)
134170
{
135171
TString hCandidateCounterLabels[4] = {"All candidates", "passed topo cuts", "has associated MC particle", "associated with Xi(Omega)"};
@@ -210,17 +246,13 @@ struct Cascqaanalysis {
210246
auto bachelor = cascCand.template bachelor_as<TCascTracksTo>();
211247

212248
// Basic set of selections
213-
if (cascCand.cascradius() > cascradius &&
214-
cascCand.v0radius() > v0radius &&
215-
cascCand.casccosPA(pvx, pvy, pvz) > casccospa &&
216-
cascCand.v0cosPA(pvx, pvy, pvz) > v0cospa &&
217-
std::fabs(posdau.eta()) < etadau &&
218-
std::fabs(negdau.eta()) < etadau &&
219-
std::fabs(bachelor.eta()) < etadau) {
220-
return true;
221-
} else {
222-
return false;
223-
}
249+
return cascCand.cascradius() > cascradius &&
250+
cascCand.v0radius() > v0radius &&
251+
cascCand.casccosPA(pvx, pvy, pvz) > casccospa &&
252+
cascCand.v0cosPA(pvx, pvy, pvz) > v0cospa &&
253+
std::fabs(posdau.eta()) < etadau &&
254+
std::fabs(negdau.eta()) < etadau &&
255+
std::fabs(bachelor.eta()) < etadau;
224256
}
225257

226258
template <typename TMcParticles>
@@ -419,39 +451,16 @@ struct Cascqaanalysis {
419451
registry.fill(HIST("hCandidateCounter"), 1.5); // passed topo cuts
420452
nCandSel++;
421453
// Fill table
422-
if (fRand->Rndm() < lEventScale) {
454+
if (fRand.Rndm() < lEventScale) {
423455
auto posdau = casc.posTrack_as<DauTracks>();
424456
auto negdau = casc.negTrack_as<DauTracks>();
425457
auto bachelor = casc.bachelor_as<DauTracks>();
426458

427-
// ITS N hits
428-
int posITSNhits = 0, negITSNhits = 0, bachITSNhits = 0;
429-
for (unsigned int i = 0; i < 7; i++) {
430-
if (posdau.itsClusterMap() & (1 << i)) {
431-
posITSNhits++;
432-
}
433-
if (negdau.itsClusterMap() & (1 << i)) {
434-
negITSNhits++;
435-
}
436-
if (bachelor.itsClusterMap() & (1 << i)) {
437-
bachITSNhits++;
438-
}
439-
}
440-
441-
uint8_t evFlag = 0;
442-
evFlag |= o2::aod::mycascades::EvFlags::EvINEL;
443-
if (collision.multNTracksPVeta1() > 0) {
444-
evFlag |= o2::aod::mycascades::EvFlags::EvINELgt0;
445-
}
446-
if (collision.multNTracksPVeta1() > 1) {
447-
evFlag |= o2::aod::mycascades::EvFlags::EvINELgt1;
448-
}
449-
450-
// c x tau
451-
float cascpos = std::hypot(casc.x() - collision.posX(), casc.y() - collision.posY(), casc.z() - collision.posZ());
452-
float cascptotmom = std::hypot(casc.px(), casc.py(), casc.pz());
453-
float ctauXi = o2::constants::physics::MassXiMinus * cascpos / (cascptotmom + 1e-13);
454-
float ctauOmega = o2::constants::physics::MassOmegaMinus * cascpos / (cascptotmom + 1e-13);
459+
const int posITSNhits = countITSHits(posdau);
460+
const int negITSNhits = countITSHits(negdau);
461+
const int bachITSNhits = countITSHits(bachelor);
462+
const uint8_t evFlag = buildRecoEventFlags(collision);
463+
const auto [ctauXi, ctauOmega] = computeCascadeCtau(casc, collision);
455464

456465
mycascades(collision.posZ(),
457466
collision.centFT0M(), collision.centFV0A(),
@@ -563,41 +572,17 @@ struct Cascqaanalysis {
563572
genY = cascmc.y();
564573
}
565574
}
566-
if (fRand->Rndm() < lEventScale) {
575+
if (fRand.Rndm() < lEventScale) {
567576
// Fill table
568577
auto posdau = casc.posTrack_as<DauTracks>();
569578
auto negdau = casc.negTrack_as<DauTracks>();
570579
auto bachelor = casc.bachelor_as<DauTracks>();
571580

572-
// ITS N hits
573-
int posITSNhits = 0, negITSNhits = 0, bachITSNhits = 0;
574-
for (unsigned int i = 0; i < 7; i++) {
575-
if (posdau.itsClusterMap() & (1 << i)) {
576-
posITSNhits++;
577-
}
578-
if (negdau.itsClusterMap() & (1 << i)) {
579-
negITSNhits++;
580-
}
581-
if (bachelor.itsClusterMap() & (1 << i)) {
582-
bachITSNhits++;
583-
}
584-
}
585-
586-
// Event type flag
587-
uint8_t evFlag = 0;
588-
evFlag |= o2::aod::mycascades::EvFlags::EvINEL;
589-
if (collision.multNTracksPVeta1() > 0) {
590-
evFlag |= o2::aod::mycascades::EvFlags::EvINELgt0;
591-
}
592-
if (collision.multNTracksPVeta1() > 1) {
593-
evFlag |= o2::aod::mycascades::EvFlags::EvINELgt1;
594-
}
595-
596-
// c x tau
597-
float cascpos = std::hypot(casc.x() - collision.posX(), casc.y() - collision.posY(), casc.z() - collision.posZ());
598-
float cascptotmom = std::hypot(casc.px(), casc.py(), casc.pz());
599-
float ctauXi = o2::constants::physics::MassXiMinus * cascpos / (cascptotmom + 1e-13);
600-
float ctauOmega = o2::constants::physics::MassOmegaMinus * cascpos / (cascptotmom + 1e-13);
581+
const int posITSNhits = countITSHits(posdau);
582+
const int negITSNhits = countITSHits(negdau);
583+
const int bachITSNhits = countITSHits(bachelor);
584+
const uint8_t evFlag = buildRecoEventFlags(collision);
585+
const auto [ctauXi, ctauOmega] = computeCascadeCtau(casc, collision);
601586

602587
mycascades(collision.posZ(),
603588
mcCollision.centFT0M(), 0, // mcCollision.centFV0A() to be added

PWGLF/Tasks/Strangeness/cascpostprocessing.cxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ struct cascpostprocessing {
243243
bool isCorrectlyRec = 0;
244244

245245
for (auto& candidate : mycascades) {
246+
isCandidate = false;
247+
isCorrectlyRec = false;
246248

247249
switch (evSelFlag) {
248250
case 1: {

0 commit comments

Comments
 (0)