@@ -69,7 +69,7 @@ using FullTracksExt = soa::Join<aod::Tracks, aod::TracksCov>;
6969using labeledTracks = soa::Join<aod::Tracks, aod::McTrackLabels>;
7070using tofTracks = soa::Join<aod::Tracks, aod::UpgradeTofs>;
7171using 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
7474struct 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