Skip to content

Commit 8004c29

Browse files
committed
Add PID selections to Xic trigger cuts
1 parent 0861112 commit 8004c29

1 file changed

Lines changed: 129 additions & 51 deletions

File tree

PWGHF/TableProducer/candidateCreatorXicToXiPiPi.cxx

Lines changed: 129 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ struct HfCandidateCreatorXicToXiPiPi {
120120
Configurable<float> minDecayLength{"minDecayLength", 0.015, "Minimum decay length (computed with DCAFitter)"};
121121
Configurable<float> minCosPA{"minCosPA", 0.9, "Minimum coine of pointing angle (computed with DCAFitter)"};
122122
Configurable<float> maxChi2Pca{"maxChi2Pca", 3., "Maximum chi2 PCA (computed with DCAFitter)"};
123+
Configurable<float> maxNsigmaXiDaus{"maxNsigmaXiDaus", 3., "Maximum PID Nsigma values for Xi daughters (both TPC and TOF)"};
123124
} softTrigCuts;
124125

125126
Service<o2::ccdb::BasicCCDBManager> ccdb{};
@@ -231,9 +232,26 @@ struct HfCandidateCreatorXicToXiPiPi {
231232
/// \param pVecCascade is the cascade momentum vector
232233
/// \param trackParBachelor is the array with two bachelor track parametrisations
233234
/// \param collision is the collision containing the candidate
235+
/// \param nSigTpcBachelorPi is the TPC n-sigma for the Xi bachelor track with pion hypothesis
236+
/// \param nSigTofBachelorPi is the TOF n-sigma for the Xi bachelor track with pion hypothesis
237+
/// \param nSigTpcPiFromLambda is the TPC n-sigma for the pion track from the Lambda decay with pion hypothesis
238+
/// \param nSigTofPiFromLambda is the TOF n-sigma for the pion track from the Lambda decay with pion hypothesis
239+
/// \param nSigTpcPrFromLambda is the TPC n-sigma for the proton track from the Lambda decay with proton hypothesis
240+
/// \param nSigTofPrFromLambda is the TOF n-sigma for the proton track from the Lambda decay with proton hypothesis
241+
/// \return true if the candidate passes the software trigger selections, otherwise false
234242
template <typename TTrackParCov, typename Coll>
235-
bool isSelectedXicSoftwareTriggers(std::array<float, 3> const& pVecCascade, std::array<TTrackParCov, 2> const& trackParBachelor, Coll const& collision)
243+
bool isSelectedXicSoftwareTriggers(std::array<float, 3> const& pVecCascade, std::array<TTrackParCov, 2> const& trackParBachelor, Coll const& collision, float nSigTpcBachelorPi, float nSigTofBachelorPi, float nSigTpcPiFromLambda, float nSigTofPiFromLambda, float nSigTpcPrFromLambda, float nSigTofPrFromLambda, bool hasTofBachelorPi, bool hasTofPiFromLambda, bool hasTofPrFromLambda)
236244
{
245+
if (std::abs(nSigTpcBachelorPi) < softTrigCuts.maxNsigmaXiDaus || (hasTofBachelorPi && std::abs(nSigTofBachelorPi) < softTrigCuts.maxNsigmaXiDaus)) {
246+
return false;
247+
}
248+
if (std::abs(nSigTpcPiFromLambda) < softTrigCuts.maxNsigmaXiDaus || (hasTofPiFromLambda && std::abs(nSigTofPiFromLambda) < softTrigCuts.maxNsigmaXiDaus)) {
249+
return false;
250+
}
251+
if (std::abs(nSigTpcPrFromLambda) < softTrigCuts.maxNsigmaXiDaus || (hasTofPrFromLambda && std::abs(nSigTofPrFromLambda) < softTrigCuts.maxNsigmaXiDaus)) {
252+
return false;
253+
}
254+
237255
int nCand{0};
238256
try {
239257
nCand = df2Prong.process(trackParBachelor[0], trackParBachelor[1]);
@@ -349,13 +367,42 @@ struct HfCandidateCreatorXicToXiPiPi {
349367
trackCasc.setAbsCharge(1);
350368
trackCasc.setPID(o2::track::PID::XiMinus);
351369

370+
//----------------------------calculate physical properties-----------------------
371+
// Charge of charm baryon
372+
int8_t const signXic = casc.sign() < 0 ? +1 : -1;
373+
352374
//----------------------------fit SV and create XicPlus track------------------
353375
auto trackParCovCharmBachelor0 = getTrackParCov(trackCharmBachelor0);
354376
auto trackParCovCharmBachelor1 = getTrackParCov(trackCharmBachelor1);
355377

356378
// if enabled, apply selections of software trigger
379+
float pPiFromLambda{}, pPrFromLambda{}, nSigTpcBachelorPi{}, nSigTofBachelorPi{}, nSigTpcPiFromLambda{}, nSigTofPiFromLambda{}, nSigTpcPrFromLambda{}, nSigTofPrFromLambda{};
357380
if (softTrigCuts.applySoftwareTrigSelections) {
358-
if (!isSelectedXicSoftwareTriggers(pVecCasc, std::array{trackParCovCharmBachelor0, trackParCovCharmBachelor1}, collision)) {
381+
// get PID information already here
382+
auto trackPionFromXi = casc.bachelor_as<TracksWCovDcaPidPrPi>();
383+
auto trackPosLambdaDaughter = casc.posTrack_as<TracksWCovDcaPidPrPi>();
384+
auto trackNegLambdaDaughter = casc.negTrack_as<TracksWCovDcaPidPrPi>();
385+
nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi();
386+
nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi();
387+
bool hasTofBachelorPi = trackPionFromXi.hasTOF();
388+
bool hasTofPiFromLambda = false;
389+
bool hasTofPrFromLambda = false;
390+
if (signXic == +1) {
391+
pPiFromLambda = trackNegLambdaDaughter.p();
392+
nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi();
393+
nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi();
394+
pPrFromLambda = trackPosLambdaDaughter.p();
395+
nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr();
396+
nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr();
397+
} else {
398+
pPiFromLambda = trackPosLambdaDaughter.p();
399+
nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi();
400+
nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi();
401+
pPrFromLambda = trackNegLambdaDaughter.p();
402+
nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr();
403+
nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr();
404+
}
405+
if (!isSelectedXicSoftwareTriggers(pVecCasc, std::array{trackParCovCharmBachelor0, trackParCovCharmBachelor1}, collision, nSigTpcBachelorPi, nSigTofBachelorPi, nSigTpcPiFromLambda, nSigTofPiFromLambda, nSigTpcPrFromLambda, nSigTofPrFromLambda)) {
359406
continue;
360407
}
361408
}
@@ -371,10 +418,6 @@ struct HfCandidateCreatorXicToXiPiPi {
371418
}
372419
registry.fill(HIST("hCandCounter"), VertexFit);
373420

374-
//----------------------------calculate physical properties-----------------------
375-
// Charge of charm baryon
376-
int8_t const signXic = casc.sign() < 0 ? +1 : -1;
377-
378421
// get SV properties
379422
const auto& secondaryVertex = df.getPCACandidate();
380423
auto chi2SV = df.getChi2AtPCACandidate();
@@ -436,28 +479,29 @@ struct HfCandidateCreatorXicToXiPiPi {
436479
float const nSigTofPiFromXicPlus0 = trackCharmBachelor0.tofNSigmaPi();
437480
float const nSigTpcPiFromXicPlus1 = trackCharmBachelor1.tpcNSigmaPi();
438481
float const nSigTofPiFromXicPlus1 = trackCharmBachelor1.tofNSigmaPi();
439-
// Bachelor pion
440-
auto trackPionFromXi = casc.bachelor_as<TracksWCovDcaPidPrPi>();
441-
float const nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi();
442-
float const nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi();
443-
// Lambda daughters
444-
auto trackPosLambdaDaughter = casc.posTrack_as<TracksWCovDcaPidPrPi>();
445-
auto trackNegLambdaDaughter = casc.negTrack_as<TracksWCovDcaPidPrPi>();
446-
float pPiFromLambda{}, pPrFromLambda{}, nSigTpcPiFromLambda{}, nSigTofPiFromLambda{}, nSigTpcPrFromLambda{}, nSigTofPrFromLambda{};
447-
if (signXic == +1) {
448-
pPiFromLambda = trackNegLambdaDaughter.p();
449-
nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi();
450-
nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi();
451-
pPrFromLambda = trackPosLambdaDaughter.p();
452-
nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr();
453-
nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr();
454-
} else {
455-
pPiFromLambda = trackPosLambdaDaughter.p();
456-
nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi();
457-
nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi();
458-
pPrFromLambda = trackNegLambdaDaughter.p();
459-
nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr();
460-
nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr();
482+
if (!softTrigCuts.applySoftwareTrigSelections) {
483+
// Bachelor pion
484+
auto trackPionFromXi = casc.bachelor_as<TracksWCovDcaPidPrPi>();
485+
nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi();
486+
nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi();
487+
// Lambda daughters
488+
auto trackPosLambdaDaughter = casc.posTrack_as<TracksWCovDcaPidPrPi>();
489+
auto trackNegLambdaDaughter = casc.negTrack_as<TracksWCovDcaPidPrPi>();
490+
if (signXic == +1) {
491+
pPiFromLambda = trackNegLambdaDaughter.p();
492+
nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi();
493+
nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi();
494+
pPrFromLambda = trackPosLambdaDaughter.p();
495+
nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr();
496+
nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr();
497+
} else {
498+
pPiFromLambda = trackPosLambdaDaughter.p();
499+
nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi();
500+
nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi();
501+
pPrFromLambda = trackNegLambdaDaughter.p();
502+
nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr();
503+
nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr();
504+
}
461505
}
462506

463507
//--------------------------------------------fill histograms----------------------------------------------------------------
@@ -546,11 +590,40 @@ struct HfCandidateCreatorXicToXiPiPi {
546590
auto trackCharmBachelor1 = rowTrackIndexXicPlus.prong1_as<TracksWCovExtraPidPrPi>();
547591

548592
// if enabled, apply selections of software trigger
593+
float pPiFromLambda{}, pPrFromLambda{}, nSigTpcBachelorPi{}, nSigTofBachelorPi{}, nSigTpcPiFromLambda{}, nSigTofPiFromLambda{}, nSigTpcPrFromLambda{}, nSigTofPrFromLambda{};
549594
if (softTrigCuts.applySoftwareTrigSelections) {
595+
// get PID information already here
596+
auto trackPionFromXi = casc.bachelor_as<TracksWCovDcaPidPrPi>();
597+
auto trackPosLambdaDaughter = casc.posTrack_as<TracksWCovDcaPidPrPi>();
598+
auto trackNegLambdaDaughter = casc.negTrack_as<TracksWCovDcaPidPrPi>();
599+
nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi();
600+
nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi();
601+
bool hasTofBachelorPi = trackPionFromXi.hasTOF();
602+
bool hasTofPiFromLambda = false;
603+
bool hasTofPrFromLambda = false;
604+
if (signXic == +1) {
605+
pPiFromLambda = trackNegLambdaDaughter.p();
606+
nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi();
607+
nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi();
608+
hasTofPiFromLambda = trackNegLambdaDaughter.hasTOF();
609+
pPrFromLambda = trackPosLambdaDaughter.p();
610+
nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr();
611+
nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr();
612+
hasTofPrFromLambda = trackPosLambdaDaughter.hasTOF();
613+
} else {
614+
pPiFromLambda = trackPosLambdaDaughter.p();
615+
nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi();
616+
nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi();
617+
hasTofPiFromLambda = trackPosLambdaDaughter.hasTOF();
618+
pPrFromLambda = trackNegLambdaDaughter.p();
619+
nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr();
620+
nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr();
621+
hasTofPrFromLambda = trackNegLambdaDaughter.hasTOF();
622+
}
550623
auto trackParCovCharmBachelor0 = getTrackParCov(trackCharmBachelor0);
551624
auto trackParCovCharmBachelor1 = getTrackParCov(trackCharmBachelor1);
552625
std::array<float, 3> const pVecCasc = {casc.px(), casc.py(), casc.pz()};
553-
if (!isSelectedXicSoftwareTriggers(pVecCasc, std::array{trackParCovCharmBachelor0, trackParCovCharmBachelor1}, collision)) {
626+
if (!isSelectedXicSoftwareTriggers(pVecCasc, std::array{trackParCovCharmBachelor0, trackParCovCharmBachelor1}, collision, nSigTpcBachelorPi, nSigTofBachelorPi, nSigTpcPiFromLambda, nSigTofPiFromLambda, nSigTpcPrFromLambda, nSigTofPrFromLambda, hasTofBachelorPi, hasTofPiFromLambda, hasTofPrFromLambda)) {
554627
continue;
555628
}
556629
}
@@ -730,28 +803,33 @@ struct HfCandidateCreatorXicToXiPiPi {
730803
float const nSigTofPiFromXicPlus0 = trackCharmBachelor0.tofNSigmaPi();
731804
float const nSigTpcPiFromXicPlus1 = trackCharmBachelor1.tpcNSigmaPi();
732805
float const nSigTofPiFromXicPlus1 = trackCharmBachelor1.tofNSigmaPi();
733-
// Bachelor pion
734-
auto trackPionFromXi = casc.bachelor_as<TracksWCovExtraPidPrPi>();
735-
float const nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi();
736-
float const nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi();
737-
// Lambda daughters
738-
auto trackPosLambdaDaughter = casc.posTrack_as<TracksWCovExtraPidPrPi>();
739-
auto trackNegLambdaDaughter = casc.negTrack_as<TracksWCovExtraPidPrPi>();
740-
float pPiFromLambda{}, pPrFromLambda{}, nSigTpcPiFromLambda{}, nSigTofPiFromLambda{}, nSigTpcPrFromLambda{}, nSigTofPrFromLambda{};
741-
if (signXic == +1) {
742-
pPiFromLambda = trackNegLambdaDaughter.p();
743-
nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi();
744-
nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi();
745-
pPrFromLambda = trackPosLambdaDaughter.p();
746-
nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr();
747-
nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr();
748-
} else {
749-
pPiFromLambda = trackPosLambdaDaughter.p();
750-
nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi();
751-
nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi();
752-
pPrFromLambda = trackNegLambdaDaughter.p();
753-
nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr();
754-
nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr();
806+
if (!softTrigCuts.applySoftwareTrigSelections) {
807+
// Bachelor pion
808+
auto trackPionFromXi = casc.bachelor_as<TracksWCovDcaPidPrPi>();
809+
nSigTpcBachelorPi = trackPionFromXi.tpcNSigmaPi();
810+
nSigTofBachelorPi = trackPionFromXi.tofNSigmaPi();
811+
// Lambda daughters
812+
auto trackPosLambdaDaughter = casc.posTrack_as<TracksWCovDcaPidPrPi>();
813+
auto trackNegLambdaDaughter = casc.negTrack_as<TracksWCovDcaPidPrPi>();
814+
if (signXic == +1) {
815+
pPiFromLambda = trackNegLambdaDaughter.p();
816+
nSigTpcPiFromLambda = trackNegLambdaDaughter.tpcNSigmaPi();
817+
nSigTofPiFromLambda = trackNegLambdaDaughter.tofNSigmaPi();
818+
hasTofPiFromLambda = trackNegLambdaDaughter.hasTOF();
819+
pPrFromLambda = trackPosLambdaDaughter.p();
820+
nSigTpcPrFromLambda = trackPosLambdaDaughter.tpcNSigmaPr();
821+
nSigTofPrFromLambda = trackPosLambdaDaughter.tofNSigmaPr();
822+
hasTofPrFromLambda = trackPosLambdaDaughter.hasTOF();
823+
} else {
824+
pPiFromLambda = trackPosLambdaDaughter.p();
825+
nSigTpcPiFromLambda = trackPosLambdaDaughter.tpcNSigmaPi();
826+
nSigTofPiFromLambda = trackPosLambdaDaughter.tofNSigmaPi();
827+
hasTofPiFromLambda = trackPosLambdaDaughter.hasTOF();
828+
pPrFromLambda = trackNegLambdaDaughter.p();
829+
nSigTpcPrFromLambda = trackNegLambdaDaughter.tpcNSigmaPr();
830+
nSigTofPrFromLambda = trackNegLambdaDaughter.tofNSigmaPr();
831+
hasTofPrFromLambda = trackNegLambdaDaughter.hasTOF();
832+
}
755833
}
756834

757835
//-------------------------------fill histograms--------------------------------------------

0 commit comments

Comments
 (0)