@@ -265,9 +265,32 @@ struct HfCorrelatorLcScHadrons {
265265 Configurable<bool > calEffEventWithCand{" calEffEventWithCand" , true , " Calculate the efficiency of Lc candidate" };
266266 Configurable<float > eventFractionToAnalyze{" eventFractionToAnalyze" , -1 , " Fraction of events to analyze (use only for ME offline on very large samples)" };
267267
268+ struct : ConfigurableGroup {
269+ Configurable<float > cfgDaughPrPtMax{" cfgDaughPrPtMax" , 5 ., " max. pT Daughter Proton" };
270+ Configurable<float > cfgDaughPrPtMin{" cfgDaughPrPtMin" , 0.3 , " min. pT Daughter Proton" };
271+ Configurable<float > cfgDaughPiPtMax{" cfgDaughPiPtMax" , 10 ., " max. pT Daughter Pion" };
272+ Configurable<float > cfgDaughPiPtMin{" cfgDaughPiPtMin" , 0.3 , " min. pT Daughter Pion" };
273+ Configurable<float > cfgDaughPIDCutsTPCPr{" cfgDaughPIDCutsTPCPr" , 3 ., " max. TPCnSigma Proton" };
274+ Configurable<float > cfgDaughPIDCutsTPCPi{" cfgDaughPIDCutsTPCPi" , 2 ., " max. TPCnSigma Pion" };
275+ Configurable<float > cfgDaughPIDCutsTOFPi{" cfgDaughPIDCutsTOFPi" , 2 ., " max. TOFnSigma Pion" };
276+
277+ Configurable<float > cfgV0radiusMin{" cfgV0radiusMin" , 1.2 , " minimum decay radius" };
278+ Configurable<float > cfgDCAPosToPVMin{" cfgDCAPosToPVMin" , 0.05 , " minimum DCA to PV for positive track" };
279+ Configurable<float > cfgDCANegToPVMin{" cfgDCANegToPVMin" , 0.2 , " minimum DCA to PV for negative track" };
280+ Configurable<float > cfgV0CosPA{" cfgV0CosPA" , 0.995 , " minimum v0 cosine" };
281+ Configurable<float > cfgDCAV0Dau{" cfgDCAV0Dau" , 1.0 , " maximum DCA between daughters" };
282+ Configurable<float > cfgHypMassWindow{" cfgHypMassWindow" , 0.5 , " single lambda mass selection" };
283+ Configurable<float > cfgV0PtMin{" cfgV0PtMin" , 0 , " minimum pT for lambda" };
284+ Configurable<float > cfgV0LifeTime{" cfgV0LifeTime" , 30 ., " maximum lambda lifetime" };
285+ Configurable<float > cfgPV{" cfgPV" , 10 ., " maximum z-vertex" };
286+ Configurable<int > cfgMaxOccupancy{" cfgMaxOccupancy" , 999999 , " maximum occupancy of tracks in neighbouring collisions in a given time range" };
287+ Configurable<int > cfgMinOccupancy{" cfgMinOccupancy" , 0 , " maximum occupancy of tracks in neighbouring collisions in a given time range" };
288+ } cfgV0;
289+
268290 HfHelper hfHelper;
269291 SliceCache cache;
270292 Service<o2::framework::O2DatabasePDG> pdg;
293+ double massLambda = o2::constants::physics::MassLambda;
271294 int8_t chargeCand = 3 ;
272295 int8_t signSoftPion = 0 ;
273296 int leadingIndex = 0 ;
@@ -306,6 +329,7 @@ struct HfCorrelatorLcScHadrons {
306329 // Tracks used in Data and MC
307330 using TracksData = soa::Filtered<soa::Join<aod::TracksWDca, aod::TrackSelection, aod::TracksExtra, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>>; // trackFilter applied
308331 using TracksWithMc = soa::Filtered<soa::Join<aod::TracksWDca, aod::TrackSelection, aod::TracksExtra, o2::aod::McTrackLabels, aod::pidTPCFullPi, aod::pidTPCFullKa, aod::pidTPCFullPr, aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr>>; // trackFilter applied
332+
309333 // Filters for ME
310334 Filter collisionFilter = aod::hf_selection_lc_collision::lcSel == true ;
311335 Filter lcFilter = ((o2::aod::hf_track_index::hfflag & static_cast <uint8_t >(1 << aod::hf_cand_3prong::DecayType::LcToPKPi)) != static_cast <uint8_t >(0 )) && (aod::hf_sel_candidate_lc::isSelLcToPKPi >= selectionFlagLc || aod::hf_sel_candidate_lc::isSelLcToPiKP >= selectionFlagLc);
@@ -345,6 +369,8 @@ struct HfCorrelatorLcScHadrons {
345369 AxisSpec axisPoolBin = {binsPoolBin, " PoolBin" };
346370 AxisSpec axisRapidity = {100 , -2 , 2 , " Rapidity" };
347371 AxisSpec axisSign = {5 , -2.5 , 2.5 , " Sign" };
372+ AxisSpec axisPtV0 = {500 , 0 ., 50.0 , " #it{p}_{T} (GeV/#it{c})" };
373+ AxisSpec axisMassV0 = {200 , 0 .9f , 1 .2f , " inv. mass (p #pi) (GeV/#it{c}^{2})" };
348374
349375 registry.add (" hPtCand" , " Lc,Hadron candidates;candidate #it{p}_{T} (GeV/#it{c});entries" , {HistType::kTH1F , {axisPtLc}});
350376 registry.add (" hPtProng0" , " Lc,Hadron candidates;prong 0 #it{p}_{T} (GeV/#it{c});entries" , {HistType::kTH1F , {axisPtLc}});
@@ -403,6 +429,18 @@ struct HfCorrelatorLcScHadrons {
403429 registry.add (" hPhiMcGen" , " Lc,Hadron particles - MC Gen" , {HistType::kTH1F , {axisPhi}});
404430 registry.add (" hMultFT0AMcGen" , " Lc,Hadron multiplicity FT0A - MC Gen" , {HistType::kTH1F , {axisMultiplicity}});
405431
432+ // Lambda V0 histograms
433+ registry.add (" hEventLambdaV0" , " Lambda, events" , {HistType::kTH1F , {{2 , 0 , 2 }}});
434+ registry.add (" hV0Lambda" , " V0 Lambda candidates;inv. mass (p #pi) (GeV/#it{c}^{2});GeV/#it{c};GeV/#it{c}" , {HistType::kTH3F , {{axisMassV0}, {axisPtV0}, {axisPtHadron}}});
435+ registry.add (" hV0LambdaRefl" , " V0 Lambda reflected candidates;inv. mass (p #pi) (GeV/#it{c}^{2});GeV/#it{c};GeV/#it{c}" , {HistType::kTH3F , {{axisMassV0}, {axisPtV0}, {axisPtHadron}}});
436+ registry.add (" hV0LambdaPiKRej" , " V0 Lambda candidates with #pi K rejection;inv. mass (p #pi) (GeV/#it{c}^{2});GeV/#it{c};GeV/#it{c}" , {HistType::kTH3F , {{axisMassV0}, {axisPtV0}, {axisPtHadron}}});
437+ registry.add (" hV0LambdaReflPiKRej" , " V0 Lambda reflected candidates with #pi K rejection;inv. mass (p #pi) (GeV/#it{c}^{2});GeV/#it{c};GeV/#it{c}" , {HistType::kTH3F , {{axisMassV0}, {axisPtV0}, {axisPtHadron}}});
438+ registry.add (" hV0LambdaMcRec" , " McRec V0 Lambda candidates;inv. mass (p #pi) (GeV/#it{c}^{2});GeV/#it{c};GeV/#it{c}" , {HistType::kTH3F , {{axisMassV0}, {axisPtV0}, {axisPtHadron}}});
439+ registry.add (" hV0LambdaReflMcRec" , " McRec V0 Lambda reflected candidates;inv. mass (p #pi) (GeV/#it{c}^{2});GeV/#it{c};GeV/#it{c}" , {HistType::kTH3F , {{axisMassV0}, {axisPtV0}, {axisPtHadron}}});
440+ registry.add (" hV0LambdaPiKRejMcRec" , " McRec V0 Lambda candidates with #pi K rejection;inv. mass (p #pi) (GeV/#it{c}^{2});GeV/#it{c};GeV/#it{c}" , {HistType::kTH3F , {{axisMassV0}, {axisPtV0}, {axisPtHadron}}});
441+ registry.add (" hV0LambdaReflPiKRejMcRec" , " McRec V0 Lambda reflected candidates with #pi K rejection;inv. mass (p #pi) (GeV/#it{c}^{2});GeV/#it{c};GeV/#it{c}" , {HistType::kTH3F , {{axisMassV0}, {axisPtV0}, {axisPtHadron}}});
442+
443+
406444 corrBinning = {{binsZVtx, binsMultiplicity}, true };
407445 }
408446
@@ -433,6 +471,163 @@ struct HfCorrelatorLcScHadrons {
433471 return y;
434472 }
435473
474+ template <typename TCollision, typename V0 >
475+ bool SelectionV0 (TCollision const & collision, V0 const & candidate)
476+ {
477+ if (candidate.v0radius () < cfgV0.cfgV0radiusMin ){
478+ return false ;
479+ }
480+ if (std::abs (candidate.dcapostopv ()) < cfgV0.cfgDCAPosToPVMin ){
481+ return false ;
482+ }
483+ if (std::abs (candidate.dcanegtopv ()) < cfgV0.cfgDCANegToPVMin ){
484+ return false ;
485+ }
486+ if (candidate.v0cosPA () < cfgV0.cfgV0CosPA ){
487+ return false ;
488+ }
489+ if (std::abs (candidate.dcaV0daughters ()) > cfgV0.cfgDCAV0Dau ){
490+ return false ;
491+ }
492+ if (candidate.pt () < cfgV0.cfgV0PtMin ){
493+ return false ;
494+ }
495+ if (std::abs (candidate.yLambda ()) > yCandMax){
496+ return false ;
497+ }
498+ if (candidate.distovertotmom (collision.posX (), collision.posY (), collision.posZ ()) * massLambda > cfgV0.cfgV0LifeTime ){
499+ return false ;
500+ }
501+
502+ return true ;
503+ }
504+
505+
506+ template <typename T>
507+ bool isSelectedV0Daughter (T const & track, int pid)
508+ {
509+ // if (!track.isGlobalTrackWoDCA())
510+ // return false;
511+ if (std::abs (pid) == kProton && std::abs (track.tpcNSigmaPr ()) > cfgV0.cfgDaughPIDCutsTPCPr ){
512+ return false ;
513+ }
514+ if (std::abs (pid) == kPiPlus && std::abs (track.tpcNSigmaPi ()) > cfgV0.cfgDaughPIDCutsTPCPi && std::abs (track.tofNSigmaPi ()) > cfgV0.cfgDaughPIDCutsTOFPi ){
515+ return false ;
516+ }
517+ if (std::abs (track.eta ()) > etaTrackMax){
518+ return false ;
519+ }
520+ if (std::abs (pid) == kProton && track.pt () > cfgV0.cfgDaughPrPtMax ){
521+ return false ;
522+ }
523+ if (std::abs (pid) == kProton && track.pt () < cfgV0.cfgDaughPrPtMin ){
524+ return false ;
525+ }
526+ if (std::abs (pid) == kPiPlus && track.pt () > cfgV0.cfgDaughPiPtMax ){
527+ return false ;
528+ }
529+ if (std::abs (pid) == kPiPlus && track.pt () < cfgV0.cfgDaughPiPtMin ){
530+ return false ;
531+ }
532+
533+ return true ;
534+ }
535+
536+ template <bool isMcRec = false , typename CollType, typename V0 , typename TrackType>
537+ void FillV0Histograms (CollType const & collV0, V0 const & v0s, TrackType const &)
538+ {
539+ for (auto & v0 : v0s) {
540+
541+ if (!SelectionV0 (collV0, v0)){
542+ continue ;
543+ }
544+
545+ auto posTrack_V0 = v0.template posTrack_as <TrackType>();
546+ auto negTrack_V0 = v0.template negTrack_as <TrackType>();
547+
548+ if (isSelectedV0Daughter (posTrack_V0, kProton ) && isSelectedV0Daughter (negTrack_V0, kPiPlus )) {
549+ if (std::abs (massLambda - v0.mLambda ()) < cfgV0.cfgHypMassWindow ){
550+ registry.fill (HIST (" hV0Lambda" ), v0.mLambda (), v0.pt (), posTrack_V0.pt ());
551+ registry.fill (HIST (" hV0LambdaRefl" ), v0.mAntiLambda (), v0.pt (), negTrack_V0.pt ());
552+
553+ if (passPIDSelection (posTrack_V0, trkPIDspecies, pidTPCMax, pidTOFMax, tofPIDThreshold, forceTOF)){
554+ registry.fill (HIST (" hV0LambdaPiKRej" ), v0.mLambda (), v0.pt (), posTrack_V0.pt ());
555+ registry.fill (HIST (" hV0LambdaReflPiKRej" ), v0.mAntiLambda (), v0.pt (), negTrack_V0.pt ());
556+ }
557+ }
558+
559+ }
560+ if (isSelectedV0Daughter (negTrack_V0, kProton ) && isSelectedV0Daughter (posTrack_V0, kPiPlus )) {
561+ if (std::abs (massLambda - v0.mAntiLambda ()) > cfgV0.cfgHypMassWindow ){
562+ registry.fill (HIST (" hV0Lambda" ), v0.mAntiLambda (), v0.pt (), negTrack_V0.pt ());
563+ registry.fill (HIST (" hV0LambdaRefl" ), v0.mLambda (), v0.pt (), posTrack_V0.pt ());
564+
565+ if (passPIDSelection (negTrack_V0, trkPIDspecies, pidTPCMax, pidTOFMax, tofPIDThreshold, forceTOF)){
566+ registry.fill (HIST (" hV0LambdaPiKRej" ), v0.mAntiLambda (), v0.pt (), negTrack_V0.pt ());
567+ registry.fill (HIST (" hV0LambdaReflPiKRej" ), v0.mLambda (), v0.pt (), posTrack_V0.pt ());
568+ }
569+ }
570+ }
571+ if constexpr (isMcRec){
572+ if (!v0.has_mcParticle () || !posTrack_V0.has_mcParticle () || !negTrack_V0.has_mcParticle ()){
573+ continue ;
574+ }
575+ auto v0Mc = v0.mcParticle ();
576+ auto posTrack = posTrack_V0.mcParticle ();
577+ auto negTrack = negTrack_V0.mcParticle ();
578+
579+ if (std::abs (v0Mc.pdgCode ()) == kLambda0 ) {
580+ if (std::abs (posTrack.pdgCode ()) == kProton ){
581+ registry.fill (HIST (" hV0LambdaMcRec" ), v0.mLambda (), v0.pt (), posTrack_V0.pt ());
582+ registry.fill (HIST (" hV0LambdaReflMcRec" ), v0.mAntiLambda (), v0.pt (), negTrack_V0.pt ());
583+
584+ if (passPIDSelection (posTrack_V0, trkPIDspecies, pidTPCMax, pidTOFMax, tofPIDThreshold, forceTOF)){
585+ registry.fill (HIST (" hV0LambdaPiKRejMcRec" ), v0.mLambda (), v0.pt (), posTrack_V0.pt ());
586+ registry.fill (HIST (" hV0LambdaReflPiKRejMcRec" ), v0.mAntiLambda (), v0.pt (), negTrack_V0.pt ());
587+ }
588+ }
589+ if (std::abs (negTrack.pdgCode ()) == kProton ){
590+ registry.fill (HIST (" hV0LambdaMcRec" ), v0.mAntiLambda (), v0.pt (), negTrack_V0.pt ());
591+ registry.fill (HIST (" hV0LambdaReflMcRec" ), v0.mLambda (), v0.pt (), posTrack_V0.pt ());
592+
593+ if (passPIDSelection (negTrack_V0, trkPIDspecies, pidTPCMax, pidTOFMax, tofPIDThreshold, forceTOF)){
594+ registry.fill (HIST (" hV0LambdaPiKRejMcRec" ), v0.mAntiLambda (), v0.pt (), negTrack_V0.pt ());
595+ registry.fill (HIST (" hV0LambdaReflPiKRejMcRec" ), v0.mLambda (), v0.pt (), posTrack_V0.pt ());
596+ }
597+ }
598+ }
599+
600+ }
601+
602+ }
603+ }
604+
605+ template <typename TCollision>
606+ bool eventSelV0 (TCollision collision)
607+ {
608+ if (!collision.sel8 ()) {
609+ return 0 ;
610+ }
611+
612+ if (!collision.selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV )) {
613+ return 0 ;
614+ }
615+ if (!collision.selection_bit (aod::evsel::kNoSameBunchPileup )) {
616+ return 0 ;
617+ }
618+ if (std::abs (collision.posZ ()) > cfgV0.cfgPV ) {
619+ return 0 ;
620+ }
621+ if (!collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard )) {
622+ return 0 ;
623+ }
624+ if (collision.trackOccupancyInTimeRange () > cfgV0.cfgMaxOccupancy || collision.trackOccupancyInTimeRange () < cfgV0.cfgMinOccupancy ) {
625+ return 0 ;
626+ }
627+
628+ return 1 ;
629+ } // event selection V0
630+
436631 template <typename T1 , typename T2 , typename McPart>
437632 void calculateTrkEff (T1 const & trackPos1, T2 const & trackPos2, McPart const & mcParticles)
438633 {
@@ -1189,6 +1384,33 @@ struct HfCorrelatorLcScHadrons {
11891384 }
11901385 }
11911386 PROCESS_SWITCH (HfCorrelatorLcScHadrons, processMcGenMixedEvent, " Process Mixed Event McGen" , false );
1387+
1388+ void processDataLambdaV0 (soa::Join<aod::Collisions, aod::EvSels>::iterator const & collision,
1389+ TracksData const & tracks, aod::V0Datas const & V0s)
1390+ {
1391+ registry.fill (HIST (" hEventLambdaV0" ), 0.5 );
1392+ if (!eventSelV0 (collision)) {
1393+ return ;
1394+ }
1395+ registry.fill (HIST (" hEventLambdaV0" ), 1.5 );
1396+
1397+ FillV0Histograms<false >(collision, V0s, tracks);
1398+ }
1399+ PROCESS_SWITCH (HfCorrelatorLcScHadrons, processDataLambdaV0, " Data process for v0 lambda" , false );
1400+
1401+ void processMcLambdaV0 (soa::Join<aod::Collisions, aod::EvSels>::iterator const & collision,
1402+ TracksWithMc const & tracks, soa::Join<aod::V0Datas,aod::McV0Labels> const & V0s, aod::McParticles const &)
1403+ {
1404+ registry.fill (HIST (" hEventLambdaV0" ), 0.5 );
1405+ if (!eventSelV0 (collision)) {
1406+ return ;
1407+ }
1408+ registry.fill (HIST (" hEventLambdaV0" ), 1.5 );
1409+
1410+ FillV0Histograms<true >(collision, V0s, tracks);
1411+ }
1412+ PROCESS_SWITCH (HfCorrelatorLcScHadrons, processMcLambdaV0, " Mc process for v0 lambda" , false );
1413+
11921414};
11931415
11941416WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments