|
34 | 34 | #include <TPDGCode.h> |
35 | 35 |
|
36 | 36 | #include <algorithm> |
| 37 | +#include <cmath> |
37 | 38 | #include <string> |
38 | 39 | #include <vector> |
39 | 40 |
|
@@ -122,14 +123,49 @@ struct Cascqaanalysis { |
122 | 123 | SliceCache cache; |
123 | 124 |
|
124 | 125 | // Random number generator for event scaling |
125 | | - TRandom2* fRand = new TRandom2(); |
| 126 | + TRandom2 fRand; |
126 | 127 |
|
127 | 128 | // Struct to select on event type |
128 | 129 | typedef struct CollisionIndexAndType { |
129 | 130 | int64_t index; |
130 | 131 | uint8_t typeFlag; |
131 | 132 | } CollisionIndexAndType; |
132 | 133 |
|
| 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 | + |
133 | 169 | void init(InitContext const&) |
134 | 170 | { |
135 | 171 | TString hCandidateCounterLabels[4] = {"All candidates", "passed topo cuts", "has associated MC particle", "associated with Xi(Omega)"}; |
@@ -210,17 +246,13 @@ struct Cascqaanalysis { |
210 | 246 | auto bachelor = cascCand.template bachelor_as<TCascTracksTo>(); |
211 | 247 |
|
212 | 248 | // 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; |
224 | 256 | } |
225 | 257 |
|
226 | 258 | template <typename TMcParticles> |
@@ -419,39 +451,16 @@ struct Cascqaanalysis { |
419 | 451 | registry.fill(HIST("hCandidateCounter"), 1.5); // passed topo cuts |
420 | 452 | nCandSel++; |
421 | 453 | // Fill table |
422 | | - if (fRand->Rndm() < lEventScale) { |
| 454 | + if (fRand.Rndm() < lEventScale) { |
423 | 455 | auto posdau = casc.posTrack_as<DauTracks>(); |
424 | 456 | auto negdau = casc.negTrack_as<DauTracks>(); |
425 | 457 | auto bachelor = casc.bachelor_as<DauTracks>(); |
426 | 458 |
|
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); |
455 | 464 |
|
456 | 465 | mycascades(collision.posZ(), |
457 | 466 | collision.centFT0M(), collision.centFV0A(), |
@@ -563,41 +572,17 @@ struct Cascqaanalysis { |
563 | 572 | genY = cascmc.y(); |
564 | 573 | } |
565 | 574 | } |
566 | | - if (fRand->Rndm() < lEventScale) { |
| 575 | + if (fRand.Rndm() < lEventScale) { |
567 | 576 | // Fill table |
568 | 577 | auto posdau = casc.posTrack_as<DauTracks>(); |
569 | 578 | auto negdau = casc.negTrack_as<DauTracks>(); |
570 | 579 | auto bachelor = casc.bachelor_as<DauTracks>(); |
571 | 580 |
|
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); |
601 | 586 |
|
602 | 587 | mycascades(collision.posZ(), |
603 | 588 | mcCollision.centFT0M(), 0, // mcCollision.centFV0A() to be added |
|
0 commit comments