@@ -55,22 +55,29 @@ struct sigmaminustask {
5555 {
5656 // Axes
5757 const AxisSpec ptAxis{100 , -10 , 10 , " #it{p}_{T} (GeV/#it{c})" };
58- const AxisSpec nSigmaPiAxis{1000 , -1000 , 1000 , " n#sigma_{#pi}" };
59- const AxisSpec nSigmaPrAxis{1000 , -1000 , 1000 , " n#sigma_{p}" };
58+ const AxisSpec nSigmaPiAxis{60 , -30 , 30 , " n#sigma_{#pi}" };
59+ const AxisSpec nSigmaPrAxis{60 , -30 , 30 , " n#sigma_{p}" };
6060 const AxisSpec sigmaMassAxis{100 , 1.1 , 1.4 , " m (GeV/#it{c}^{2})" };
6161 const AxisSpec xiMassAxis{100 , 1.2 , 1.6 , " m_{#Xi} (GeV/#it{c}^{2})" };
6262 const AxisSpec pdgAxis{10001 , -5000 , 5000 , " PDG code" };
6363 const AxisSpec vertexZAxis{100 , -15 ., 15 ., " vrtx_{Z} [cm]" };
64+ const AxisSpec dcaMothAxis{100 , 0 , 1 , " DCA [cm]" };
65+ const AxisSpec dcaDaugAxis{200 , 0 , 20 , " DCA [cm]" };
6466
6567 const AxisSpec ptResolutionAxis{100 , -0.5 , 0.5 , " #it{p}_{T}^{rec} - #it{p}_{T}^{gen} (GeV/#it{c})" };
6668 const AxisSpec massResolutionAxis{100 , -0.1 , 0.1 , " m_{rec} - m_{gen} (GeV/#it{c}^{2})" };
69+
6770 const AxisSpec boolAxis{2 , -0.5 , 1.5 , " Boolean value (0=false, 1=true)" };
71+ const AxisSpec filtersAxis{10 , -0.5 , 9.5 , " Filter index" };
72+
6873 // Event selection
6974 rEventSelection.add (" hVertexZRec" , " hVertexZRec" , {HistType::kTH1F , {vertexZAxis}});
7075 // Sigma-minus reconstruction
7176 rSigmaMinus.add (" h2MassSigmaMinusPt" , " h2MassSigmaMinusPt" , {HistType::kTH2F , {ptAxis, sigmaMassAxis}});
7277 rSigmaMinus.add (" h2SigmaMassVsXiMass" , " h2SigmaMassVsXiMass" , {HistType::kTH2F , {xiMassAxis, sigmaMassAxis}});
7378 rSigmaMinus.add (" h2NSigmaTPCPiPt" , " h2NSigmaTPCPiPt" , {HistType::kTH2F , {ptAxis, nSigmaPiAxis}});
79+ rSigmaMinus.add (" h2DCAMothPt" , " h2DCAMothPt" , {HistType::kTH2F , {ptAxis, dcaMothAxis}});
80+ rSigmaMinus.add (" h2DCADaugPt" , " h2DCADaugPt" , {HistType::kTH2F , {ptAxis, dcaDaugAxis}});
7481
7582 if (doprocessMC) {
7683 // Add MC histograms if needed
@@ -93,6 +100,7 @@ struct sigmaminustask {
93100 if (doprocessFindable) {
94101 // Add findable Sigma histograms
95102 rSigmaMinus.add (" h2MassPtFindable" , " h2MassPtFindable" , {HistType::kTH2F , {ptAxis, sigmaMassAxis}});
103+ rSigmaMinus.add (" hFilterIndex" , " hFilterIndex" , {HistType::kTH1F , {filtersAxis}});
96104 }
97105 }
98106
@@ -113,6 +121,8 @@ struct sigmaminustask {
113121 rSigmaMinus.fill (HIST (" h2MassSigmaMinusPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.mSigmaMinus ());
114122 rSigmaMinus.fill (HIST (" h2SigmaMassVsXiMass" ), kinkCand.mXiMinus (), kinkCand.mSigmaMinus ());
115123 rSigmaMinus.fill (HIST (" h2NSigmaPiPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), dauTrack.tpcNSigmaPi ());
124+ rSigmaMinus.fill (HIST (" h2DCAMothPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.dcaMothPv ());
125+ rSigmaMinus.fill (HIST (" h2DCADaugPt" ), kinkCand.mothSign () * kinkCand.ptDaug (), kinkCand.dcaDaugPv ());
116126
117127 if (fillOutputTree) {
118128 outputDataTable (kinkCand.xDecVtx (), kinkCand.yDecVtx (), kinkCand.zDecVtx (),
@@ -199,7 +209,9 @@ struct sigmaminustask {
199209 rSigmaMinus.fill (HIST (" h2MassPtMCRec" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.mSigmaMinus ());
200210 rSigmaMinus.fill (HIST (" h2MassResolution" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.mSigmaMinus () - MotherMassMC);
201211 rSigmaMinus.fill (HIST (" h2PtResolution" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.ptMoth () - MotherpTMC);
202-
212+ rSigmaMinus.fill (HIST (" h2DCAMothPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.dcaMothPv ());
213+ rSigmaMinus.fill (HIST (" h2DCADaugPt" ), kinkCand.mothSign () * kinkCand.ptDaug (), kinkCand.dcaDaugPv ());
214+
203215 if (std::abs (mcTrackPiDau.pdgCode ()) == 211 ) {
204216 rSigmaMinus.fill (HIST (" h2NSigmaTOFPiPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), dauTrack.tofNSigmaPi ());
205217 } else if (std::abs (mcTrackPiDau.pdgCode ()) == 2212 ) {
@@ -272,12 +284,6 @@ struct sigmaminustask {
272284 void processFindable (TracksFull const & tracks, aod::McTrackLabels const & trackLabelsMC, aod::McParticles const &)
273285 {
274286 for (const auto & motherTrack : tracks) {
275-
276- // Filter: ITS but no TPC (mother candidates)
277- if (!motherTrack.hasITS () || motherTrack.hasTPC ()) {
278- continue ;
279- }
280-
281287 // Check if mother is Sigma in MC
282288 auto mcLabelMother = trackLabelsMC.rawIteratorAt (motherTrack.globalIndex ());
283289 if (!mcLabelMother.has_mcParticle ()) {
@@ -289,17 +295,11 @@ struct sigmaminustask {
289295 }
290296
291297 for (const auto & daughterTrack : tracks) {
292- // Filter: ITS and TPC (daughter candidates)
293- if (!daughterTrack.hasITS () || !daughterTrack.hasTPC ()) {
294- continue ;
295- }
296-
298+ // Check if daughter is pi/proton
297299 auto mcLabelDaughter = trackLabelsMC.rawIteratorAt (daughterTrack.globalIndex ());
298300 if (!mcLabelDaughter.has_mcParticle ()) {
299301 continue ;
300302 }
301-
302- // Check if daughter is pi/proton
303303 auto mcDaughter = mcLabelDaughter.mcParticle_as <aod::McParticles>();
304304 if (std::abs (mcDaughter.pdgCode ()) != 211 && std::abs (mcDaughter.pdgCode ()) != 2212 ) {
305305 continue ;
@@ -315,13 +315,58 @@ struct sigmaminustask {
315315 }
316316 }
317317 }
318+ if (!isValidPair) {
319+ continue ;
320+ }
321+
322+ float mcMass = std::sqrt (mcMother.e () * mcMother.e () - mcMother.p () * mcMother.p ());
323+ int sigmaSign = mcMother.pdgCode () > 0 ? 1 : -1 ;
324+ rSigmaMinus.fill (HIST (" h2MassPtFindable" ), sigmaSign * mcMother.pt (), mcMass);
325+
326+ // Define filter index and progressively apply kinkbuilder cuts to track pairs
327+ int filterIndex = 0 ;
328+ rSigmaMinus.fill (HIST (" hFilterIndex" ), filterIndex);
329+
330+ // 1 - tracks with right ITS, TPC, TOF signals
331+ if (motherTrack.has_collision () && motherTrack.hasITS () && !motherTrack.hasTPC () && !motherTrack.hasTOF () &&
332+ daughterTrack.hasITS () && daughterTrack.hasTPC ()) {
333+ filterIndex += 1 ;
334+ rSigmaMinus.fill (HIST (" hFilterIndex" ), filterIndex);
335+ } else {
336+ continue ;
337+ }
318338
319- if (isValidPair) {
320- // All requirements satisfied: fill histogram
321- float mcMass = std::sqrt (mcMother.e () * mcMother.e () - mcMother.p () * mcMother.p ());
322- int sigmaSign = mcMother.pdgCode () > 0 ? 1 : -1 ;
323- rSigmaMinus.fill (HIST (" h2MassPtFindable" ), sigmaSign * mcMother.pt (), mcMass);
339+ // 2, 3 - mother track ITS properties
340+ if (motherTrack.itsNCls () < 6 &&
341+ motherTrack.itsNClsInnerBarrel () == 3 && motherTrack.itsChi2NCl () < 36 ) {
342+ filterIndex += 1 ;
343+ rSigmaMinus.fill (HIST (" hFilterIndex" ), filterIndex);
344+ }
345+ if (filterIndex > 1 && motherTrack.pt () > 0.5 ) {
346+ filterIndex += 1 ;
347+ rSigmaMinus.fill (HIST (" hFilterIndex" ), filterIndex);
348+ } else {
349+ continue ; // Skip if mother track does not pass ITS cuts
324350 }
351+
352+ // 4 - daughter track ITS+TPC properties
353+ if (daughterTrack.itsNClsInnerBarrel () == 0 && daughterTrack.itsNCls () < 4 &&
354+ daughterTrack.tpcNClsCrossedRows () > 0.8 * daughterTrack.tpcNClsFindable () && daughterTrack.tpcNClsFound () > 80 ) {
355+ filterIndex += 1 ;
356+ rSigmaMinus.fill (HIST (" hFilterIndex" ), filterIndex);
357+ } else {
358+ continue ; // Skip if daughter track does not pass ITS+TPC cuts
359+ }
360+
361+ // 5 - geometric cuts
362+ if (std::abs (motherTrack.eta ()) < 1.0 && std::abs (daughterTrack.eta ()) < 1.0 &&
363+ std::abs (motherTrack.phi () - daughterTrack.phi ()) < 100.0 ) {
364+ filterIndex += 1 ;
365+ rSigmaMinus.fill (HIST (" hFilterIndex" ), filterIndex);
366+ } else {
367+ continue ; // Skip if geometric cuts are not satisfied
368+ }
369+
325370 }
326371 }
327372 }
@@ -334,4 +379,3 @@ WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
334379 return WorkflowSpec{
335380 adaptAnalysisTask<sigmaminustask>(cfgc)};
336381}
337-
0 commit comments