@@ -55,9 +55,11 @@ struct NPCascCandidate {
5555 int64_t trackITSID;
5656 int64_t collisionID;
5757 float matchingChi2;
58+ float deltaPtITS;
5859 float deltaPt;
5960 float itsClusSize;
6061 bool hasReassociatedCluster;
62+ bool hasFakeReassociation;
6163 bool isGoodMatch;
6264 bool isGoodCascade;
6365 int pdgCodeMom;
@@ -346,13 +348,15 @@ struct NonPromptCascadeTask {
346348 o2::math_utils::SVector<double , 3 > cascadePos, v0Pos;
347349
348350 float cascCpa = -1 , v0Cpa = -1 ;
351+ o2::track::TrackParCov ntCascadeTrack;
349352 if (mDCAFitter .process (pionTrkParCov, protonTrkParCov)) {
350353 auto trackParCovV0 = mDCAFitter .createParentTrackParCov (0 ); // V0 track retrieved from p and pi daughters
351354 v0Pos = mDCAFitter .getPCACandidate ();
352355 if (mDCAFitter .process (trackParCovV0, bachTrkParCov)) {
353356 mDCAFitter .getTrackParamAtPCA (0 ).getPxPyPzGlo (momenta[0 ]);
354357 mDCAFitter .getTrackParamAtPCA (1 ).getPxPyPzGlo (momenta[1 ]);
355- mDCAFitter .createParentTrackParCov ().getPxPyPzGlo (cascadeMomentum);
358+ ntCascadeTrack = mDCAFitter .createParentTrackParCov ();
359+ ntCascadeTrack.getPxPyPzGlo (cascadeMomentum);
356360 std::array<float , 3 > pvPos = {primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ ()};
357361 cascadePos = mDCAFitter .getPCACandidate ();
358362 cascCpa = RecoDecay::cpa (pvPos, mDCAFitter .getPCACandidate (), cascadeMomentum);
@@ -400,6 +404,7 @@ struct NonPromptCascadeTask {
400404 if (v0part.mothersIds ()[0 ] == bachelor.mcParticle ().mothersIds ()[0 ]) {
401405 if (std::abs (motherV0.pdgCode ()) == 3312 || std::abs (motherV0.pdgCode ()) == 3334 ) {
402406 isGoodCascade = true ;
407+
403408 isOmega = (std::abs (motherV0.pdgCode ()) == 3334 );
404409 fromHF = isFromHF (motherV0);
405410 mcParticleID = v0part.mothersIds ()[0 ];
@@ -424,18 +429,19 @@ struct NonPromptCascadeTask {
424429 o2::base::Propagator::Instance ()->propagateToDCA (primaryVertex, pionTrkParCov, mBz , 2 .f , matCorr, &pionDCA);
425430 o2::base::Propagator::Instance ()->propagateToDCA (primaryVertex, bachTrkParCov, mBz , 2 .f , matCorr, &bachDCA);
426431
427- float deltaPtITSCascade{-1 .e10f }, cascITSclsSize{-1 .e10f }, matchingChi2{-1 .e10f };
428- bool hasReassociatedClusters{false };
432+ float deltaPtITSCascade{-1 .e10f }, deltaPtCascade{- 1 . e10f }, cascITSclsSize{-1 .e10f }, matchingChi2{-1 .e10f };
433+ bool hasReassociatedClusters{false }, hasFakeReassociation{ false } ;
429434 int trackedCascGlobalIndex{-1 }, itsTrackGlobalIndex{-1 }, cascITSclusters{-1 };
430435 if constexpr (requires { candidate.track (); }) {
431436 const auto & track = candidate.template track_as <TrackType>();
432- cascPVContribs |= track.isPVContributor () << 0 ;
433437 const auto & ITStrack = candidate.template itsTrack_as <TrackType>();
438+ cascPVContribs |= ITStrack.isPVContributor () << 0 ;
434439 auto trackTrkParCov = getTrackParCov (track);
435440 o2::base::Propagator::Instance ()->propagateToDCA (primaryVertex, trackTrkParCov, mBz , 2 .f , matCorr, &motherDCA);
436441 hasReassociatedClusters = (track.itsNCls () != ITStrack.itsNCls ());
437442 cascadeLvector.SetCoordinates (track.pt (), track.eta (), track.phi (), 0 );
438443 deltaPtITSCascade = std::hypot (cascadeMomentum[0 ], cascadeMomentum[1 ]) - ITStrack.pt ();
444+ deltaPtCascade = std::hypot (cascadeMomentum[0 ], cascadeMomentum[1 ]) - track.pt ();
439445 trackedCascGlobalIndex = track.globalIndex ();
440446 itsTrackGlobalIndex = ITStrack.globalIndex ();
441447 cascITSclusters = track.itsNCls ();
@@ -447,14 +453,14 @@ struct NonPromptCascadeTask {
447453
448454 if (isGoodMatch) {
449455 pdgCodeMom = track.mcParticle ().has_mothers () ? track.mcParticle ().template mothers_as <aod::McParticles>()[0 ].pdgCode () : 0 ;
456+ hasFakeReassociation = track.mcMask () & (1 << 15 );
450457 }
451458 itsTrackPDG = ITStrack.has_mcParticle () ? ITStrack.mcParticle ().pdgCode () : 0 ;
452459 }
460+ } else {
461+ o2::base::Propagator::Instance ()->propagateToDCA (primaryVertex, ntCascadeTrack, mBz , 2 .f , matCorr, &motherDCA);
453462 }
454- // bool mysel8 = collision.sel8();
455- float mc = collision.multFT0C ();
456- float ma = collision.multFT0A ();
457- candidates.emplace_back (NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId (), matchingChi2, deltaPtITSCascade, cascITSclsSize, hasReassociatedClusters, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0 ], fromHF[1 ],
463+ candidates.emplace_back (NPCascCandidate{mcParticleID, trackedCascGlobalIndex, itsTrackGlobalIndex, candidate.collisionId (), matchingChi2, deltaPtITSCascade, deltaPtCascade, cascITSclsSize, hasReassociatedClusters, hasFakeReassociation, isGoodMatch, isGoodCascade, pdgCodeMom, itsTrackPDG, fromHF[0 ], fromHF[1 ],
458464 collision.numContrib (), cascPVContribs, collision.collisionTimeRes (), primaryVertex.getX (), primaryVertex.getY (), primaryVertex.getZ (),
459465 cascadeLvector.pt (), cascadeLvector.eta (), cascadeLvector.phi (),
460466 protonTrack.pt (), protonTrack.eta (), pionTrack.pt (), pionTrack.eta (), bachelor.pt (), bachelor.eta (),
@@ -464,15 +470,15 @@ struct NonPromptCascadeTask {
464470 cascITSclusters, protonTrack.itsNCls (), pionTrack.itsNCls (), bachelor.itsNCls (), protonTrack.tpcNClsFound (), pionTrack.tpcNClsFound (), bachelor.tpcNClsFound (),
465471 protonTrack.tpcNSigmaPr (), pionTrack.tpcNSigmaPi (), bachelor.tpcNSigmaKa (), bachelor.tpcNSigmaPi (),
466472 protonTrack.hasTOF (), pionTrack.hasTOF (), bachelor.hasTOF (),
467- protonTrack.tofNSigmaPr (), pionTrack.tofNSigmaPi (), bachelor.tofNSigmaKa (), bachelor.tofNSigmaPi (), collision.sel8 (), mc, ma });
473+ protonTrack.tofNSigmaPr (), pionTrack.tofNSigmaPi (), bachelor.tofNSigmaKa (), bachelor.tofNSigmaPi (), collision.sel8 (), collision. multFT0C (), collision. multFT0A () });
468474 }
469475 }
470476
471477 template <typename CascadeType>
472478 void fillDataTable (auto const & candidates)
473479 {
474480 for (const auto & c : candidates) {
475- getDataTable<CascadeType>()(c.matchingChi2 , c.deltaPt , c.itsClusSize , c.hasReassociatedCluster ,
481+ getDataTable<CascadeType>()(c.matchingChi2 , c.deltaPtITS , c. deltaPt , c.itsClusSize , c.hasReassociatedCluster ,
476482 c.pvContributors , c.cascPVContribs , c.pvTimeResolution , c.pvX , c.pvY , c.pvZ ,
477483 c.cascPt , c.cascEta , c.cascPhi ,
478484 c.protonPt , c.protonEta , c.pionPt , c.pionEta , c.bachPt , c.bachEta ,
@@ -483,7 +489,8 @@ struct NonPromptCascadeTask {
483489 c.cascNClusITS , c.protonNClusITS , c.pionNClusITS , c.bachNClusITS , c.protonNClusTPC , c.pionNClusTPC , c.bachNClusTPC ,
484490 c.protonTPCNSigma , c.pionTPCNSigma , c.bachKaonTPCNSigma , c.bachPionTPCNSigma ,
485491 c.protonHasTOF , c.pionHasTOF , c.bachHasTOF ,
486- c.protonTOFNSigma , c.pionTOFNSigma , c.bachKaonTOFNSigma , c.bachPionTOFNSigma , c.sel8 , c.multFT0C , c.multFT0A );
492+ c.protonTOFNSigma , c.pionTOFNSigma , c.bachKaonTOFNSigma , c.bachPionTOFNSigma ,
493+ c.sel8 , c.multFT0C , c.multFT0A );
487494 }
488495 }
489496
@@ -496,19 +503,32 @@ struct NonPromptCascadeTask {
496503 continue ;
497504 }
498505 auto particle = mcParticles.iteratorAt (c.mcParticleId );
506+ int motherDecayDaughters{0 };
507+ if (c.isFromBeauty || c.isFromCharm ) {
508+ auto mom = particle.template mothers_as <aod::McParticles>()[0 ];
509+ auto daughters = mom.template daughters_as <aod::McParticles>();
510+ motherDecayDaughters = daughters.size ();
511+ for (const auto & d : daughters) {
512+ if (std::abs (d.pdgCode ()) == 11 || std::abs (d.pdgCode ()) == 13 ) {
513+ motherDecayDaughters *= -1 ;
514+ break ;
515+ }
516+ }
517+ }
499518 auto mcCollision = particle.template mcCollision_as <aod::McCollisions>();
500519 auto recCollision = collisions.iteratorAt (c.collisionID );
501520
502- getMCtable<CascadeType>()(c.matchingChi2 , c.deltaPt , c.itsClusSize , c.hasReassociatedCluster , c.isGoodMatch , c.isGoodCascade , c.pdgCodeMom , c.pdgCodeITStrack , c.isFromBeauty , c.isFromCharm ,
521+ getMCtable<CascadeType>()(c.matchingChi2 , c.deltaPtITS , c. deltaPt , c.itsClusSize , c.hasReassociatedCluster , c.isGoodMatch , c.isGoodCascade , c.pdgCodeMom , c.pdgCodeITStrack , c.isFromBeauty , c.isFromCharm ,
503522 c.pvContributors , c.cascPVContribs , c.pvTimeResolution , c.pvX , c.pvY , c.pvZ , c.cascPt , c.cascEta , c.cascPhi ,
504523 c.protonPt , c.protonEta , c.pionPt , c.pionEta , c.bachPt , c.bachEta ,
505524 c.cascDCAxy , c.cascDCAz , c.protonDCAxy , c.protonDCAz , c.pionDCAxy , c.pionDCAz , c.bachDCAxy , c.bachDCAz ,
506525 c.casccosPA , c.v0cosPA , c.massXi , c.massOmega , c.massV0 , c.cascRadius , c.v0radius , c.cascLength , c.v0length ,
507526 c.cascNClusITS , c.protonNClusITS , c.pionNClusITS , c.bachNClusITS , c.protonNClusTPC , c.pionNClusTPC , c.bachNClusTPC , c.protonTPCNSigma ,
508527 c.pionTPCNSigma , c.bachKaonTPCNSigma , c.bachPionTPCNSigma , c.protonHasTOF , c.pionHasTOF , c.bachHasTOF ,
509- c.protonTOFNSigma , c.pionTOFNSigma , c.bachKaonTOFNSigma , c.bachPionTOFNSigma , c.sel8 , c.multFT0C , c.multFT0A ,
528+ c.protonTOFNSigma , c.pionTOFNSigma , c.bachKaonTOFNSigma , c.bachPionTOFNSigma ,
529+ c.sel8 , c.multFT0C , c.multFT0A ,
510530 particle.pt (), particle.eta (), particle.phi (), particle.pdgCode (), mcCollision.posX () - particle.vx (), mcCollision.posY () - particle.vy (),
511- mcCollision.posZ () - particle.vz (), mcCollision.globalIndex () == recCollision.mcCollisionId ());
531+ mcCollision.posZ () - particle.vz (), mcCollision.globalIndex () == recCollision.mcCollisionId (), c. hasFakeReassociation , motherDecayDaughters );
512532 }
513533 }
514534
@@ -562,7 +582,20 @@ struct NonPromptCascadeTask {
562582 int pdgCodeMom = p.has_mothers () ? p.template mothers_as <aod::McParticles>()[0 ].pdgCode () : 0 ;
563583 auto mcCollision = p.template mcCollision_as <aod::McCollisions>();
564584
565- NPCTableGen (p.pt (), p.eta (), p.phi (), p.pdgCode (), pdgCodeMom, mcCollision.posX () - p.vx (), mcCollision.posY () - p.vy (), mcCollision.posZ () - p.vz (), fromHF[0 ], fromHF[1 ]);
585+ int motherDecayDaughters{0 };
586+ if (fromHF[0 ] || fromHF[1 ]) {
587+ auto mom = p.template mothers_as <aod::McParticles>()[0 ];
588+ auto daughters = mom.template daughters_as <aod::McParticles>();
589+ motherDecayDaughters = daughters.size ();
590+ for (const auto & d : daughters) {
591+ if (std::abs (d.pdgCode ()) == 11 || std::abs (d.pdgCode ()) == 13 ) {
592+ motherDecayDaughters *= -1 ;
593+ break ;
594+ }
595+ }
596+ }
597+
598+ NPCTableGen (p.pt (), p.eta (), p.phi (), p.pdgCode (), pdgCodeMom, mcCollision.posX () - p.vx (), mcCollision.posY () - p.vy (), mcCollision.posZ () - p.vz (), fromHF[0 ], fromHF[1 ], motherDecayDaughters);
566599 }
567600 }
568601 PROCESS_SWITCH (NonPromptCascadeTask, processGenParticles, " process gen cascades: MC analysis" , false );
0 commit comments