Skip to content

Commit 10ad23c

Browse files
authored
[ALICE3] Add additional selections with corresponding QA histograms (#11038)
1 parent 068ac24 commit 10ad23c

File tree

1 file changed

+89
-21
lines changed

1 file changed

+89
-21
lines changed

ALICE3/TableProducer/alice3-multicharm.cxx

Lines changed: 89 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ using FullTracksExt = soa::Join<aod::Tracks, aod::TracksCov>;
6969
using labeledTracks = soa::Join<aod::Tracks, aod::McTrackLabels>;
7070
using tofTracks = soa::Join<aod::Tracks, aod::UpgradeTofs>;
7171
using richTracks = soa::Join<aod::Tracks, aod::RICHs>;
72-
using alice3tracks = soa::Join<aod::Tracks, aod::TracksCov, aod::Alice3DecayMaps, aod::McTrackLabels, aod::TracksDCA, aod::TracksExtraA3>;
72+
using alice3tracks = soa::Join<aod::Tracks, aod::TracksCov, aod::Alice3DecayMaps, aod::McTrackLabels, aod::TracksDCA, aod::TracksExtraA3, aod::UpgradeTofs, aod::UpgradeTofExpectedTimes>;
7373

7474
struct alice3multicharm {
7575
SliceCache cache;
@@ -89,6 +89,8 @@ struct alice3multicharm {
8989
Configurable<float> piFromXiC_dcaZconstant{"piFromXiC_dcaZconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"};
9090
Configurable<float> piFromXiC_dcaXYpTdep{"piFromXiC_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"};
9191
Configurable<float> piFromXiC_dcaZpTdep{"piFromXiC_dcaZpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"};
92+
Configurable<float> piFromXiC_tofDiffInner{"piFromXiC_tofDiffInner", 50, "|signal - expected| (ps)"};
93+
Configurable<float> piFromXiCC_tofDiffInner{"piFromXiCC_tofDiffInner", 50, "|signal - expected| (ps)"};
9294
Configurable<float> piFromXiCC_dcaXYconstant{"piFromXiCC_dcaXYconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"};
9395
Configurable<float> piFromXiCC_dcaZconstant{"piFromXiCC_dcaZconstant", 0.001f, "[0] in |DCAxy| > [0]+[1]/pT"};
9496
Configurable<float> piFromXiCC_dcaXYpTdep{"piFromXiCC_dcaXYpTdep", 0.0, "[1] in |DCAxy| > [0]+[1]/pT"};
@@ -107,21 +109,27 @@ struct alice3multicharm {
107109
Configurable<float> minPiCCPt{"minPiCCPt", 0.3, "Minimum pT for XiCC pions"};
108110
Configurable<float> minNTracks{"minNTracks", -1, "Minimum number of tracks"};
109111

112+
Configurable<float> minXiRadius{"minXiRadius", 0.5, "Minimum R2D for XiC decay (cm)"};
110113
Configurable<float> minXiCRadius{"minXiCRadius", 0.001, "Minimum R2D for XiC decay (cm)"};
111114
Configurable<float> minXiCCRadius{"minXiCCRadius", 0.005, "Minimum R2D for XiCC decay (cm)"};
115+
Configurable<float> xicMinDecayDistanceFromPV{"xicMinDecayDistanceFromPV", 0.002, "Minimum distance for XiC decay from PV (cm)"};
112116
Configurable<float> xicMinProperLength{"xicMinProperLength", 0.002, "Minimum proper length for XiC decay (cm)"};
113117
Configurable<float> xicMaxProperLength{"xicMaxProperLength", 0.06, "Minimum proper length for XiC decay (cm)"};
114118
Configurable<float> xiccMinProperLength{"xiccMinProperLength", 0.004, "Minimum proper length for XiCC decay (cm)"};
115119
Configurable<float> xiccMaxProperLength{"xiccMaxProperLength", 999, "Minimum proper length for XiCC decay (cm)"};
116-
Configurable<float> massWindowXi{"massWindowXi", 0.015, "Mass window around Xi peak"};
117-
Configurable<float> massWindowXiC{"massWindowXiC", 0.015, "Mass window around XiC peak"};
120+
Configurable<float> xiccMaxEta{"xiccMaxEta", 1.5, "Max eta"};
121+
Configurable<float> massWindowXi{"massWindowXi", 0.015, "Mass window around Xi peak (GeV/c)"};
122+
Configurable<float> massWindowXiC{"massWindowXiC", 0.015, "Mass window around XiC peak (GeV/c)"};
118123

119124
ConfigurableAxis axisEta{"axisEta", {80, -4.0f, +4.0f}, "#eta"};
120125
ConfigurableAxis axisPt{"axisPt", {VARIABLE_WIDTH, 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f, 2.0f, 2.2f, 2.4f, 2.6f, 2.8f, 3.0f, 3.2f, 3.4f, 3.6f, 3.8f, 4.0f, 4.4f, 4.8f, 5.2f, 5.6f, 6.0f, 6.5f, 7.0f, 7.5f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 17.0f, 19.0f, 21.0f, 23.0f, 25.0f, 30.0f, 35.0f, 40.0f, 50.0f}, "pt axis for QA histograms"};
121-
ConfigurableAxis axisDCA2d{"axisDCA2d", {400, -200, 200}, "DCA2d (#mum)"};
122-
ConfigurableAxis axisDCA{"axisDCA", {200, 0, 200}, "DCA (#mum)"};
123-
ConfigurableAxis axisRadius{"axisRadius", {1000, 0, 1000}, "Decay radius (#mum)"};
126+
ConfigurableAxis axisDCA2D{"axisDCA2D", {400, -200, 200}, "DCA2d (#mum)"};
127+
ConfigurableAxis axisDCA{"axisDCA", {400, 0, 400}, "DCA (#mum)"};
128+
ConfigurableAxis axisRadius{"axisRadius", {10000, 0, 10000}, "Decay radius (#mum)"};
129+
ConfigurableAxis axisRadius2D{"axisRadius2D", {1000, 0, 100000}, "Decay radius (#mum)"};
130+
ConfigurableAxis axisRadius2DXi{"axisRadius2DXi", {1000, 0, 20}, "Decay radius (cm)"};
124131
ConfigurableAxis axisDecayLength{"axisDecayLength", {2000, 0, 2000}, "Decay lenght (#mum)"};
132+
ConfigurableAxis axisTOFTrack{"axisTOFTrack", {1000, 0, 5000}, "TOF track time"};
125133

126134
ConfigurableAxis axisXiMass{"axisXiMass", {200, 1.221f, 1.421f}, "Xi Inv Mass (GeV/c^{2})"};
127135
ConfigurableAxis axisXiCMass{"axisXiCMass", {200, 2.368f, 2.568f}, "XiC Inv Mass (GeV/c^{2})"};
@@ -421,12 +429,21 @@ struct alice3multicharm {
421429
histos.add("hPi2cPt", "hPi2cPt", kTH1D, {axisPt});
422430
histos.add("hPiccPt", "hPiccPt", kTH1D, {axisPt});
423431

432+
histos.add("hMinXiDecayRadius", "hMinXiDecayRadius", kTH1D, {axisRadius2DXi});
424433
histos.add("hMinXiCDecayRadius", "hMinXiCDecayRadius", kTH1D, {axisRadius});
425434
histos.add("hMinXiCCDecayRadius", "hMinXiCCDecayRadius", kTH1D, {axisRadius});
426435

436+
histos.add("hMinxicDecayDistanceFromPV", "hMinxicDecayDistanceFromPV", kTH1D, {axisDecayLength});
427437
histos.add("hProperLengthXiC", "hProperLengthXiC", kTH1D, {axisDecayLength});
428438
histos.add("hProperLengthXiCC", "hProperLengthXiCC", kTH1D, {axisDecayLength});
429439

440+
histos.add("hInnerTOFTrackTimeRecoPi1c", "hInnerTOFTrackTimeRecoPi1c", kTH1D, {axisTOFTrack});
441+
histos.add("hInnerTOFTrackTimeRecoPi2c", "hInnerTOFTrackTimeRecoPi2c", kTH1D, {axisTOFTrack});
442+
histos.add("hInnerTOFTrackTimeRecoPicc", "hInnerTOFTrackTimeRecoPicc", kTH1D, {axisTOFTrack});
443+
444+
histos.add("hXiRadiusVsXicRadius", "hXiRadiusVsXicRadius", kTH2D, {axisRadius2D, axisRadius2D});
445+
histos.add("hXicRadiusVsXiccRadius", "hXicRadiusVsXiccRadius", kTH2D, {axisRadius2D, axisRadius2D});
446+
430447
// These histograms bookkeep the exact number of combinations attempted
431448
// CombinationsXiC: triplets Xi-pi-pi considered per Xi
432449
// CombinationsXiCC: doublets XiC-pi considered per XiC
@@ -436,9 +453,9 @@ struct alice3multicharm {
436453
histos.add("hNTracks", "hNTracks", kTH1D, {{20000, 0, 20000}});
437454

438455
if (doDCAplots) {
439-
histos.add("h2dDCAxyVsPtXiFromXiC", "h2dDCAxyVsPtXiFromXiC", kTH2D, {axisPt, axisDCA2d});
440-
histos.add("h2dDCAxyVsPtPiFromXiC", "h2dDCAxyVsPtPiFromXiC", kTH2D, {axisPt, axisDCA2d});
441-
histos.add("h2dDCAxyVsPtPiFromXiCC", "h2dDCAxyVsPtPiFromXiCC", kTH2D, {axisPt, axisDCA2d});
456+
histos.add("h2dDCAxyVsPtXiFromXiC", "h2dDCAxyVsPtXiFromXiC", kTH2D, {axisPt, axisDCA2D});
457+
histos.add("h2dDCAxyVsPtPiFromXiC", "h2dDCAxyVsPtPiFromXiC", kTH2D, {axisPt, axisDCA2D});
458+
histos.add("h2dDCAxyVsPtPiFromXiCC", "h2dDCAxyVsPtPiFromXiCC", kTH2D, {axisPt, axisDCA2D});
442459
}
443460
}
444461

@@ -503,6 +520,9 @@ struct alice3multicharm {
503520
continue;
504521

505522
if (std::fabs(xi.dcaXY()) < xiFromXiC_dcaXYconstant || std::fabs(xi.dcaZ()) < xiFromXiC_dcaZconstant)
523+
continue; // likely a primary xi
524+
525+
if (xiCand.cascRadius() < minXiRadius)
506526
continue;
507527

508528
for (auto const& pi1c : tracksPiFromXiCgrouped) {
@@ -511,19 +531,29 @@ struct alice3multicharm {
511531
if (xiCand.posTrackId() == pi1c.globalIndex() || xiCand.negTrackId() == pi1c.globalIndex() || xiCand.bachTrackId() == pi1c.globalIndex())
512532
continue; // avoid using any track that was already used
513533
if (pi1c.pt() < minPiCPt)
514-
continue;
534+
continue; // too low momentum
535+
536+
double pi1cTOFDiffInner = std::fabs(pi1c.innerTOFTrackTimeReco() - pi1c.innerTOFExpectedTimePi());
537+
if (pi1cTOFDiffInner > piFromXiC_tofDiffInner)
538+
continue; // did not arrive at expected time
515539

516540
// second pion from XiC decay for starts here
517541
for (auto const& pi2c : tracksPiFromXiCgrouped) {
518-
519542
if (mcSameMotherCheck && !checkSameMother(xi, pi2c))
520543
continue; // keep only if same mother
544+
521545
if (pi1c.globalIndex() >= pi2c.globalIndex())
522546
continue; // avoid same-mother, avoid double-counting
547+
523548
if (xiCand.posTrackId() == pi2c.globalIndex() || xiCand.negTrackId() == pi2c.globalIndex() || xiCand.bachTrackId() == pi2c.globalIndex())
524549
continue; // avoid using any track that was already used
550+
525551
if (pi2c.pt() < minPiCPt)
526-
continue;
552+
continue; // too low momentum
553+
554+
double pi2cTOFDiffInner = std::fabs(pi2c.innerTOFTrackTimeReco() - pi2c.innerTOFExpectedTimePi());
555+
if (pi2cTOFDiffInner > piFromXiC_tofDiffInner)
556+
continue; // did not arrive at expected time
527557

528558
// if I am here, it means this is a triplet to be considered for XiC vertexing.
529559
// will now attempt to build a three-body decay candidate with these three track rows.
@@ -535,6 +565,7 @@ struct alice3multicharm {
535565

536566
if (std::fabs(thisXiCcandidate.mass - o2::constants::physics::MassXiCPlus) > massWindowXiC)
537567
continue; // out of mass region
568+
538569
histos.fill(HIST("hCharmBuilding"), 1.0f);
539570

540571
const std::array<float, 3> momentumC = {
@@ -547,9 +578,12 @@ struct alice3multicharm {
547578
if (xicDecayRadius2D < minXiCRadius)
548579
continue; // do not take if radius too small, likely a primary combination
549580

581+
histos.fill(HIST("hXiRadiusVsXicRadius"), xiCand.cascRadius() * 1e+4, xicDecayRadius2D * 1e+4);
582+
if (xicDecayRadius2D > xiCand.cascRadius())
583+
continue;
584+
550585
o2::dataformats::DCA dcaInfo;
551586
float xicdcaXY = 1e+10, xicdcaZ = 1e+10;
552-
;
553587
o2::track::TrackParCov xicTrackCopy(xicTrack); // paranoia
554588
o2::vertexing::PVertex primaryVertex;
555589
primaryVertex.setXYZ(collision.posX(), collision.posY(), collision.posZ());
@@ -560,7 +594,7 @@ struct alice3multicharm {
560594
}
561595

562596
if (std::fabs(xicdcaXY) < xiCFromXiCC_dcaXY || std::fabs(xicdcaZ) < xiCFromXiCC_dcaZ)
563-
continue;
597+
continue; // likely a primary xic
564598

565599
histos.fill(HIST("hMassXiC"), thisXiCcandidate.mass);
566600

@@ -569,10 +603,16 @@ struct alice3multicharm {
569603
for (auto const& picc : tracksPiFromXiCCgrouped) {
570604
if (mcSameMotherCheck && !checkSameMotherExtra(xi, picc))
571605
continue;
606+
572607
if (xiCand.posTrackId() == picc.globalIndex() || xiCand.negTrackId() == picc.globalIndex() || xiCand.bachTrackId() == picc.globalIndex())
573608
continue; // avoid using any track that was already used
609+
574610
if (picc.pt() < minPiCCPt)
575-
continue;
611+
continue; // too low momentum
612+
613+
double piccTOFDiffInner = std::fabs(picc.innerTOFTrackTimeReco() - picc.innerTOFExpectedTimePi());
614+
if (piccTOFDiffInner > piFromXiCC_tofDiffInner)
615+
continue; // did not arrive at expected time
576616

577617
o2::track::TrackParCov piccTrack = getTrackParCov(picc);
578618
nCombinationsCC++;
@@ -591,14 +631,34 @@ struct alice3multicharm {
591631
continue; // do not take if radius too small, likely a primary combination
592632

593633
double totalMomentumC = std::hypot(momentumC[0], momentumC[1], momentumC[2]);
594-
double xicProperLength = std::fabs(std::hypot(thisXiCcandidate.xyz[0], thisXiCcandidate.xyz[1], thisXiCcandidate.xyz[2]) - std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1], thisXiCCcandidate.xyz[2]) * totalMomentumC) / (std::fabs(totalMomentumC) * thisXiCcandidate.mass);
634+
double decayLengthXiC = std::hypot(
635+
thisXiCcandidate.xyz[0] - thisXiCCcandidate.xyz[0],
636+
thisXiCcandidate.xyz[1] - thisXiCCcandidate.xyz[1],
637+
thisXiCcandidate.xyz[2] - thisXiCCcandidate.xyz[2]);
638+
double xicProperLength = decayLengthXiC * thisXiCcandidate.mass / totalMomentumC;
595639
if (xicProperLength < xicMinProperLength || xicProperLength > xicMaxProperLength)
596-
continue;
640+
continue; // likely background
641+
642+
double xicDistanceFromPV = std::hypot(
643+
thisXiCcandidate.xyz[0] - collision.posX(),
644+
thisXiCcandidate.xyz[1] - collision.posY(),
645+
thisXiCcandidate.xyz[2] - collision.posZ());
646+
double xicDecayDistanceFromPV = xicDistanceFromPV * thisXiCcandidate.mass / totalMomentumC;
647+
if (xicDecayDistanceFromPV < xicMinDecayDistanceFromPV)
648+
continue; // too close to PV
597649

598650
double totalMomentumCC = std::hypot(momentumCC[0], momentumCC[1], momentumCC[2]);
599-
double xiccProperLength = std::fabs(std::hypot(collision.posX(), collision.posY(), collision.posZ()) - std::hypot(thisXiCCcandidate.xyz[0], thisXiCCcandidate.xyz[1], thisXiCCcandidate.xyz[2]) * totalMomentumCC) / (std::fabs(totalMomentumCC) * thisXiCCcandidate.mass);
651+
double decayLengthXiCC = std::hypot(
652+
thisXiCCcandidate.xyz[0] - collision.posX(),
653+
thisXiCCcandidate.xyz[1] - collision.posY(),
654+
thisXiCCcandidate.xyz[2] - collision.posZ());
655+
double xiccProperLength = decayLengthXiCC * thisXiCCcandidate.mass / totalMomentumCC;
600656
if (xiccProperLength < xiccMinProperLength || xiccProperLength > xicMaxProperLength)
601-
continue;
657+
continue; // likely background
658+
659+
histos.fill(HIST("hXicRadiusVsXiccRadius"), xicDecayRadius2D * 1e+4, xiccDecayRadius2D * 1e+4);
660+
if (xiccDecayRadius2D > xicDecayRadius2D)
661+
continue; // XiCC should decay before XiC
602662

603663
float xiccdcaXY = 1e+10, xiccdcaZ = 1e+10;
604664
if (xiccTrack.propagateToDCA(primaryVertex, magneticField, &dcaInfo)) {
@@ -607,16 +667,24 @@ struct alice3multicharm {
607667
}
608668

609669
if (std::fabs(xiccdcaXY) > xiCC_dcaXY || std::fabs(xiccdcaZ) > xiCC_dcaZ)
610-
continue;
670+
continue; // not pointing to PV
611671

672+
if (std::fabs(thisXiCcandidate.eta) > xiccMaxEta)
673+
continue; // not in central barrel
674+
675+
histos.fill(HIST("hMinxicDecayDistanceFromPV"), xicDecayDistanceFromPV * 1e+4);
676+
histos.fill(HIST("hInnerTOFTrackTimeRecoPi1c"), pi1cTOFDiffInner);
677+
histos.fill(HIST("hInnerTOFTrackTimeRecoPi2c"), pi2cTOFDiffInner);
678+
histos.fill(HIST("hInnerTOFTrackTimeRecoPicc"), piccTOFDiffInner);
612679
histos.fill(HIST("hDCAXiCDaughters"), thisXiCcandidate.dca * 1e+4);
613680
histos.fill(HIST("hDCAXiCCDaughters"), thisXiCCcandidate.dca * 1e+4);
614681
histos.fill(HIST("hProperLengthXiCC"), xiccProperLength * 1e+4);
615682
histos.fill(HIST("hProperLengthXiC"), xicProperLength * 1e+4);
616683
histos.fill(HIST("hMinXiCCDecayRadius"), xiccDecayRadius2D * 1e+4);
617684
histos.fill(HIST("hMinXiCDecayRadius"), xicDecayRadius2D * 1e+4);
618-
histos.fill(HIST("hPi2cPt"), pi2c.pt());
685+
histos.fill(HIST("hMinXiDecayRadius"), xiCand.cascRadius());
619686
histos.fill(HIST("hPi1cPt"), pi1c.pt());
687+
histos.fill(HIST("hPi2cPt"), pi2c.pt());
620688
histos.fill(HIST("hPiccPt"), picc.pt());
621689
histos.fill(HIST("hDCAxyXi"), std::fabs(xi.dcaXY() * 1e+4));
622690
histos.fill(HIST("hDCAzXi"), std::fabs(xi.dcaZ() * 1e+4));

0 commit comments

Comments
 (0)