@@ -26,11 +26,16 @@ using namespace o2;
2626using namespace o2 ::framework;
2727using namespace o2 ::framework::expressions;
2828
29- using TracksFull = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCPi>;
29+ using TracksFull = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCPi, aod::pidTPCPr, aod::pidTPCKa >;
3030using CollisionsFull = soa::Join<aod::Collisions, aod::EvSel>;
3131using CollisionsFullMC = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSel>;
3232
3333struct sigmaminustask {
34+
35+ // Output Tables
36+ Produces<aod::SlimKinkCands> outputDataTable;
37+ Produces<aod::SlimKinkCandsMC> outputDataTableMC;
38+
3439 // Histograms are defined with HistogramRegistry
3540 HistogramRegistry rEventSelection{" eventSelection" , {}, OutputObjHandlingPolicy::AnalysisObject, true , true };
3641 HistogramRegistry rSigmaMinus{" sigmaminus" , {}, OutputObjHandlingPolicy::AnalysisObject, true , true };
@@ -39,6 +44,8 @@ struct sigmaminustask {
3944 Configurable<float > cutzvertex{" cutzvertex" , 10 .0f , " Accepted z-vertex range (cm)" };
4045 Configurable<float > cutNSigmaPi{" cutNSigmaPi" , 4 , " NSigmaTPCPion" };
4146
47+ Configurable<bool > fillOutputTree{" fillOutputTree" , true , " If true, fill the output tree with Kink candidates" };
48+
4249 Preslice<aod::KinkCands> mPerCol = aod::track::collisionId;
4350
4451 void init (InitContext const &)
@@ -71,14 +78,26 @@ struct sigmaminustask {
7178 return ;
7279 }
7380 rEventSelection.fill (HIST (" hVertexZRec" ), collision.posZ ());
81+
7482 for (const auto & kinkCand : KinkCands) {
7583 auto dauTrack = kinkCand.trackDaug_as <TracksFull>();
84+
7685 if (abs (dauTrack.tpcNSigmaPi ()) > cutNSigmaPi) {
7786 continue ;
7887 }
88+
7989 rSigmaMinus.fill (HIST (" h2MassSigmaMinusPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.mSigmaMinus ());
8090 rSigmaMinus.fill (HIST (" h2SigmaMassVsXiMass" ), kinkCand.mXiMinus (), kinkCand.mSigmaMinus ());
8191 rSigmaMinus.fill (HIST (" h2NSigmaPiPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), dauTrack.tpcNSigmaPi ());
92+
93+ if (fillOutputTree) {
94+ outputDataTable (kinkCand.xDecVtx (), kinkCand.yDecVtx (), kinkCand.zDecVtx (),
95+ kinkCand.pxMoth (), kinkCand.pyMoth (), kinkCand.pzMoth (),
96+ kinkCand.pxDaug (), kinkCand.pyDaug (), kinkCand.pzDaug (),
97+ kinkCand.dcaMothPv (), kinkCand.dcaDaugPv (), kinkCand.dcaKinkTopo (),
98+ kinkCand.mothSign (), dauTrack.tpcNSigmaPi (), dauTrack.tpcNSigmaPr (), dauTrack.tpcNSigmaKa ());
99+ }
100+
82101 }
83102 }
84103 PROCESS_SWITCH (sigmaminustask, processData, " Data processing" , true );
@@ -92,7 +111,9 @@ struct sigmaminustask {
92111
93112 rEventSelection.fill (HIST (" hVertexZRec" ), collision.posZ ());
94113 auto kinkCandPerColl = KinkCands.sliceBy (mPerCol , collision.globalIndex ());
114+
95115 for (const auto & kinkCand : kinkCandPerColl) {
116+
96117 auto dauTrack = kinkCand.trackDaug_as <TracksFull>();
97118 auto mothTrack = kinkCand.trackMoth_as <TracksFull>();
98119 if (dauTrack.sign () != mothTrack.sign ()) {
@@ -106,6 +127,7 @@ struct sigmaminustask {
106127 rSigmaMinus.fill (HIST (" h2MassSigmaMinusPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.mSigmaMinus ());
107128 rSigmaMinus.fill (HIST (" h2SigmaMassVsXiMass" ), kinkCand.mXiMinus (), kinkCand.mSigmaMinus ());
108129 rSigmaMinus.fill (HIST (" h2NSigmaPiPt" ), kinkCand.mothSign () * kinkCand.ptMoth (), dauTrack.tpcNSigmaPi ());
130+
109131 // do MC association
110132 auto mcLabSigma = trackLabelsMC.rawIteratorAt (mothTrack.globalIndex ());
111133 auto mcLabPiDau = trackLabelsMC.rawIteratorAt (dauTrack.globalIndex ());
@@ -123,10 +145,23 @@ struct sigmaminustask {
123145 continue ;
124146 }
125147 rSigmaMinus.fill (HIST (" h2MassPtMCRec" ), kinkCand.mothSign () * kinkCand.ptMoth (), kinkCand.mSigmaMinus ());
148+
149+ // fill the output table with Mc information
150+ outputDataTableMC (kinkCand.xDecVtx (), kinkCand.yDecVtx (), kinkCand.zDecVtx (),
151+ kinkCand.pxMoth (), kinkCand.pyMoth (), kinkCand.pzMoth (),
152+ kinkCand.pxDaug (), kinkCand.pyDaug (), kinkCand.pzDaug (),
153+ kinkCand.dcaMothPv (), kinkCand.dcaDaugPv (), kinkCand.dcaKinkTopo (),
154+ kinkCand.mothSign (),
155+ dauTrack.tpcNSigmaPi (), dauTrack.tpcNSigmaPr (), dauTrack.tpcNSigmaKa (),
156+ mcTrackSigma.pdgCode (), mcTrackPiDau.pdgCode (),
157+ kinkCand.ptMoth (), kinkCand.mSigmaMinus ());
158+
126159 }
127- }
128- }
129- }
160+ } // MC association and selection
161+ } // kink cand loop
162+ } // collision loop
163+
164+ // Loop over all generated particles to fill MC histograms
130165 for (const auto & mcPart : particlesMC) {
131166 if (std::abs (mcPart.pdgCode ()) != 3112 || std::abs (mcPart.y ()) > 0.5 ) {
132167 continue ;
@@ -136,7 +171,7 @@ struct sigmaminustask {
136171 }
137172 bool hasSigmaDaughter = false ;
138173 for (const auto & daughter : mcPart.daughters_as <aod::McParticles>()) {
139- if (std::abs (daughter.pdgCode ()) == 211 ) { // Sigma PDG code
174+ if (std::abs (daughter.pdgCode ()) == 211 ) { // Pi PDG code
140175 hasSigmaDaughter = true ;
141176 break ; // Found a pi daughter, exit loop
142177 }
@@ -149,6 +184,7 @@ struct sigmaminustask {
149184 rSigmaMinus.fill (HIST (" h2MassPtMCGen" ), sigmaSign * mcPart.pt (), mcMass);
150185 }
151186 }
187+
152188 PROCESS_SWITCH (sigmaminustask, processMC, " MC processing" , false );
153189};
154190
0 commit comments