@@ -99,15 +99,20 @@ struct KinkBuilder {
9999 Configurable<float > maxDCAMothToPV{" maxDCAMothToPV" , 0.2 , " Max DCA of the mother to the PV" };
100100 Configurable<float > minDCADaugToPV{" minDCADaugToPV" , 0.1 , " Min DCA of the daughter to the PV" };
101101 Configurable<float > minPtMoth{" minPtMoth" , 0.15 , " Minimum pT of the hypercandidate" };
102+ Configurable<float > minPtDaug{" minPtDaug" , 0.15 , " Minimum pT of the daughter candidate" };
102103 Configurable<float > maxZDiff{" maxZDiff" , 20 ., " Max z difference between the kink daughter and the mother" };
103104 Configurable<float > maxPhiDiff{" maxPhiDiff" , 100 , " Max phi difference between the kink daughter and the mother" };
104105 Configurable<float > timeMarginNS{" timeMarginNS" , 600 , " Additional time res tolerance in ns" };
106+ Configurable<float > timeMarginNSDaughter{" timeMarginNSDaughter" , 200 , " time tolerance for daughter candidate in ns" };
105107 Configurable<float > etaMaxDaug{" etaMaxDaug" , 1 ., " eta max daughter" };
106108 Configurable<float > etaMaxMoth{" etaMaxMoth" , 1 ., " eta max Mother" };
107109 Configurable<float > nTPCClusMinDaug{" nTPCClusMinDaug" , 30 , " mother NTPC clusters cut" };
108110 Configurable<float > itsChi2cut{" itsChi2cut" , 36 , " mother itsChi2 cut" };
109111 Configurable<bool > askTOFforDaug{" askTOFforDaug" , false , " If true, ask for TOF signal" };
110112 Configurable<bool > kaontopologhy{" kaontopologhy" , true , " If true, selected mother have both ITS+TPC " };
113+ Configurable<bool > ismc{" ismc" , false , " If true, additional selection crideria for daughter " };
114+ Configurable<float > minradiusKink{" minradiusKink" , 130.0 , " minradiuscut for kink vertex" };
115+ Configurable<float > maxradiusKink{" maxradiusKink" , 200.0 , " maxradiuscut for kink vertex" };
111116
112117 o2::vertexing::DCAFitterN<2 > fitter;
113118 o2::base::MatLayerCylSet* lut = nullptr ;
@@ -205,76 +210,122 @@ struct KinkBuilder {
205210 if (askTOFforDaug && !candidate.hasTOF ()) {
206211 return false ;
207212 }
213+ if (ismc && candidate.trackTimeRes () > timeMarginNSDaughter) {
214+ return false ; // ns
215+ }
216+ if (ismc && candidate.pt () < minPtDaug) {
217+ return false ; // ns
218+ }
219+
208220 return true ;
209221 }
210222
211223 template <class Tcolls , class Ttracks >
212- void fillCandidateData (const Tcolls& collisions, const Ttracks& tracks, aod::AmbiguousTracks const & ambiguousTracks, aod::BCsWithTimestamps const & bcs)
224+ void fillCandidateData (const Tcolls& collisions,
225+ const Ttracks& tracks,
226+ aod::AmbiguousTracks const & ambiguousTracks,
227+ aod::BCsWithTimestamps const & bcs)
213228 {
214229 svCreator.clearPools ();
215230 svCreator.fillBC2Coll (collisions, bcs);
216- bool isDaug;
217- bool isMoth;
231+
232+ bool isDaug = false ;
233+ bool isMoth = false ;
234+
218235 for (const auto & track : tracks) {
219- if (!track.hasTPC ())
236+ if (!track.hasTPC ()) {
220237 continue ;
238+ }
221239 isDaug = false ;
222240 isMoth = false ;
241+
242+ // Daughter: TPC-only, not PV contributor
223243 if (!track.hasITS () && !track.isPVContributor ()) {
224244 isDaug = selectDaugTrack (track);
225245 }
246+
247+ // Mother: PV contributor, ITS (+TPC if kaon topology), no TOF
226248 if (track.hasITS () && !track.hasTOF () && track.isPVContributor ()) {
227249 isMoth = selectMothTrack (track);
228250 }
229- if (!isDaug && !isMoth)
251+
252+ if (!isDaug && !isMoth) {
230253 continue ;
231- if (isMoth && std::abs (track.eta ()) > etaMaxMoth)
254+ }
255+
256+ if (isMoth && std::abs (track.eta ()) > etaMaxMoth) {
232257 continue ;
233- if (isDaug && std::abs (track.eta ()) > etaMaxDaug)
258+ }
259+ if (isDaug && std::abs (track.eta ()) > etaMaxDaug) {
234260 continue ;
261+ }
262+
235263 int pdgHypo = isMoth ? 1 : 0 ;
236264 svCreator.appendTrackCand (track, collisions, pdgHypo, ambiguousTracks, bcs);
237265 }
238266
239- auto & kinkPool = svCreator.getSVCandPool (collisions, !unlikeSignBkg);
267+ auto & kinkPool = svCreator.getSVCandPool (collisions, /* combineLikeSign= */ !unlikeSignBkg);
240268
241269 for (const auto & svCand : kinkPool) {
242270 KinkCandidate kinkCand;
243271 auto trackMoth = tracks.rawIteratorAt (svCand.tr0Idx );
244272 auto trackDaug = tracks.rawIteratorAt (svCand.tr1Idx );
273+
274+ // Mother must have collision (PV contributor)
275+ if (!trackMoth.has_collision ()) {
276+ continue ;
277+ }
278+
245279 auto const & collision = trackMoth.template collision_as <Tcolls>();
280+ if (!collision.has_bc ()) {
281+ continue ;
282+ }
246283 auto const & bc = collision.template bc_as <aod::BCsWithTimestamps>();
247284 initCCDB (bc);
248285 o2::dataformats::VertexBase primaryVertex;
249286 primaryVertex.setPos ({collision.posX (), collision.posY (), collision.posZ ()});
250- primaryVertex.setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
287+ primaryVertex.setCov (collision.covXX (), collision.covXY (), collision.covYY (),
288+ collision.covXZ (), collision.covYZ (), collision.covZZ ());
251289 kinkCand.primVtx = {primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ ()};
252290
253291 o2::track::TrackParCov trackParCovMoth = getTrackParCov (trackMoth);
254292 o2::track::TrackParCov trackParCovMothPV{trackParCovMoth};
293+
255294 std::array<float , 2 > dcaInfoMoth;
256- bool okMoth = o2::base::Propagator::Instance ()->propagateToDCABxByBz ({primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ ()}, trackParCovMothPV, 2 .f , static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value ), &dcaInfoMoth);
295+ bool okMoth = o2::base::Propagator::Instance ()->propagateToDCABxByBz (
296+ {primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ ()},
297+ trackParCovMothPV, 2 .f ,
298+ static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value ),
299+ &dcaInfoMoth);
300+
257301 if (!okMoth) {
258302 continue ;
259303 }
304+
260305 o2::track::TrackParCov trackParCovDaug = getTrackParCov (trackDaug);
261- // propagate to PV
262306 std::array<float , 2 > dcaInfoDaug;
263- bool okDaug = o2::base::Propagator::Instance ()->propagateToDCABxByBz ({primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ ()}, trackParCovDaug, 2 .f , static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value ), &dcaInfoDaug);
307+
308+ bool okDaug = o2::base::Propagator::Instance ()->propagateToDCABxByBz (
309+ {primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ ()},
310+ trackParCovDaug, 2 .f ,
311+ static_cast <o2::base::Propagator::MatCorrType>(cfgMaterialCorrection.value ),
312+ &dcaInfoDaug);
313+
264314 if (!okDaug) {
265315 continue ;
266316 }
317+
267318 if (std::abs (dcaInfoMoth[1 ]) > maxDCAMothToPV) {
268319 continue ;
269320 }
270321 if (std::abs (dcaInfoDaug[1 ]) < minDCADaugToPV) {
271322 continue ;
272323 }
324+
273325 int nCand = 0 ;
274326 try {
275327 nCand = fitter.process (trackParCovMoth, trackParCovDaug);
276328 } catch (...) {
277- LOG (error) << " Exception caught in DCA fitter process call!" ;
278329 continue ;
279330 }
280331 if (nCand == 0 ) {
@@ -283,13 +334,19 @@ struct KinkBuilder {
283334 if (!fitter.propagateTracksToVertex ()) {
284335 continue ;
285336 }
337+
286338 auto propMothTrack = fitter.getTrack (0 );
287339 auto propDaugTrack = fitter.getTrack (1 );
340+
288341 kinkCand.decVtx = fitter.getPCACandidatePos ();
289342 const int vtxp = 3 ;
290343 for (int i = 0 ; i < vtxp; i++) {
291344 kinkCand.decVtx [i] -= kinkCand.primVtx [i];
292345 }
346+ double radiusxy = std::sqrt (kinkCand.decVtx [0 ] * kinkCand.decVtx [0 ] + kinkCand.decVtx [1 ] * kinkCand.decVtx [1 ]);
347+ if (radiusxy < minradiusKink || radiusxy > maxradiusKink) {
348+ continue ;
349+ }
293350 propMothTrack.getPxPyPzGlo (kinkCand.momMoth );
294351 propDaugTrack.getPxPyPzGlo (kinkCand.momDaug );
295352 for (int i = 0 ; i < vtxp; i++) {
@@ -380,6 +437,7 @@ struct SpectraKinkPiKa {
380437 Configurable<int > pid{" pid" , 321 , " " };
381438 Configurable<int > dpid{" dpid" , 13 , " " };
382439 Configurable<bool > dpidCut{" dpidCut" , 0 , " " };
440+ Configurable<bool > dradiusCrossrow{" dradiusCrossrow" , 0 , " " };
383441 Configurable<bool > dptCut{" dptCut" , 0 , " " };
384442 Configurable<bool > qa{" qa" , 0 , " " };
385443 Configurable<int > maxtpcncle{" maxtpcncle" , 0 , " max tpc find ncle" };
@@ -636,6 +694,9 @@ struct SpectraKinkPiKa {
636694 double radiusxy = std::sqrt (kinkCand.xDecVtx () * kinkCand.xDecVtx () + kinkCand.yDecVtx () * kinkCand.yDecVtx ());
637695 if (radiusxy < minradius || radiusxy > maxradius)
638696 continue ;
697+
698+ if (dradiusCrossrow && (mothTrack.tpcNClsFound () > (-31.67 + ((11.0 / 12.0 ) * radiusxy)) || mothTrack.tpcNClsFound () < (-85.5 + ((65.0 / 95.0 ) * radiusxy))))
699+ continue ;
639700 rpiKkink.fill (HIST (" h1_tracks_data" ), 10.0 );
640701 if (std::abs (kinkCand.zDecVtx ()) < minzcut || std::abs (kinkCand.zDecVtx ()) > maxzcut)
641702 continue ;
@@ -744,10 +805,14 @@ struct SpectraKinkPiKa {
744805 rEventSelection.fill (HIST (" hVertexZRec" ), collision.posZ ());
745806 rEventSelection.fill (HIST (" hMultiplicity" ), multiplicity);
746807
747- auto kinkCandPerColl = KinkCands.sliceBy (mPerCol , collision.index ());
808+ auto kinkCandPerColl = KinkCands.sliceBy (mPerCol , collision.globalIndex ());
748809 for (const auto & kinkCand : kinkCandPerColl) {
749810 auto dauTrack = kinkCand.trackDaug_as <TracksFull>();
750811 auto mothTrack = kinkCand.trackMoth_as <TracksFull>();
812+ if (mothTrack.collisionId () != collision.globalIndex ()) {
813+ continue ; // not from this event
814+ }
815+
751816 if (!mothTrack.has_collision () || !dauTrack.has_collision ()) {
752817 continue ;
753818 }
@@ -769,8 +834,11 @@ struct SpectraKinkPiKa {
769834 v0.SetCoordinates (mothTrack.px (), mothTrack.py (), mothTrack.pz (), o2::constants::physics::MassKaonCharged);
770835
771836 double radiusxy = std::sqrt (kinkCand.xDecVtx () * kinkCand.xDecVtx () + kinkCand.yDecVtx () * kinkCand.yDecVtx ());
837+ // std::cout<<"radius check: "<<radiusxy<<std::endl;
772838 if (radiusxy < minradius || radiusxy > maxradius)
773839 continue ;
840+ if (dradiusCrossrow && (mothTrack.tpcNClsFound () > (-31.67 + ((11.0 / 12.0 ) * radiusxy)) || mothTrack.tpcNClsFound () < (-85.5 + ((65.0 / 95.0 ) * radiusxy))))
841+ continue ;
774842 rpiKkink.fill (HIST (" h1_tracks" ), 3.0 );
775843 if (std::abs (kinkCand.zDecVtx ()) < minzcut || std::abs (kinkCand.zDecVtx ()) > maxzcut)
776844 continue ;
0 commit comments