Skip to content

Commit f40ea3e

Browse files
authored
[PWGHF] added Lambda0 function to calculate efficiency of data driven PID cut on proton
1 parent 5e4f15a commit f40ea3e

1 file changed

Lines changed: 222 additions & 0 deletions

File tree

PWGHF/HFC/TableProducer/correlatorLcScHadrons.cxx

Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

11941416
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)

0 commit comments

Comments
 (0)