Skip to content

Commit 8ecfb76

Browse files
committed
Added V0 daughter- and topological cuts
1 parent 8014bed commit 8ecfb76

File tree

1 file changed

+112
-88
lines changed

1 file changed

+112
-88
lines changed

PWGCF/MultiparticleCorrelations/Tasks/threeParticleCorrelations.cxx

Lines changed: 112 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,22 @@ struct ThreeParticleCorrelations {
4343
float trackPtMin = 0.2, trackPtMax = 3.0;
4444
float trackEtaMax = 0.8;
4545

46+
// Track PID parameters
4647
double pionID = 0.0, kaonID = 1.0, protonID = 2.0;
47-
float nSigma0 = 0.0, nSigma2 = 2.0, nSigma4 = 4.0;
48-
48+
float nSigma0 = 0.0, nSigma2 = 2.0, nSigma4 = 4.0, nSigma5 = 5.0;
49+
50+
// V0 filter parameters
51+
float tpcNCrossedRowsMin = 70.0;
52+
float decayRMin = 1.2, ctauMax = 30.0;
53+
float cosPAMin = 0.995;
54+
float dcaProtonMin = 0.05, dcaPionMin = 0.2;
55+
int dcaV0DauMax = 1;
56+
57+
// Track filter parameters
4958
float pionPtMin = 0.3, pionPtMax = 2.3, kaonPtMin = 0.5, kaonPtMax = 2.5, protonPtMin = 0.5, protonPtMax = 2.5;
5059
float pionPtMid = 1.5, kaonPtMid1 = 1.5, kaonPtMid2 = 2.0, protonPtMid = 0.7;
5160

61+
// RD filter parameters
5262
float dEtaMax = 0.05, dEtaMin = 0.022;
5363
float dPhiStarMinOS = 0.075, dPhiStarMinSS = 0.12;
5464
float rMin = 0.8, rMax = 2.5;
@@ -64,13 +74,13 @@ struct ThreeParticleCorrelations {
6474
HistogramRegistry rQARegistry{"QARegistry", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
6575

6676
// Collision & Event filters
67-
Filter collCent = aod::cent::centFT0C > centMin&& aod::cent::centFT0C < centMax;
77+
Filter collCent = aod::cent::centFT0C > centMin && aod::cent::centFT0C < centMax;
6878
Filter collZvtx = nabs(aod::collision::posZ) < zvtxMax;
6979
Filter mcCollZvtx = nabs(aod::mccollision::posZ) < zvtxMax;
7080
Filter evSelect = aod::evsel::sel8 == true;
7181

7282
// Track filters
73-
Filter trackPt = aod::track::pt > trackPtMin&& aod::track::pt < trackPtMax;
83+
Filter trackPt = aod::track::pt > trackPtMin && aod::track::pt < trackPtMax;
7484
Filter trackEta = nabs(aod::track::eta) < trackEtaMax;
7585
Filter globalTracks = requireGlobalTrackInFilter();
7686

@@ -98,8 +108,8 @@ struct ThreeParticleCorrelations {
98108
aod::pidTOFFullPi, aod::pidTOFFullKa, aod::pidTOFFullPr, aod::pidTOFbeta>>;
99109

100110
// Partitions
101-
Partition<MyFilteredMCParticles> mcTracks = aod::mcparticle::pt > trackPtMin&& aod::mcparticle::pt < trackPtMax;
102-
Partition<MyFilteredMCParticles> mcV0s = aod::mcparticle::pt > v0PtMin&& aod::mcparticle::pt < v0PtMax&& nabs(aod::mcparticle::eta) < v0EtaMax;
111+
Partition<MyFilteredMCParticles> mcTracks = aod::mcparticle::pt > trackPtMin && aod::mcparticle::pt < trackPtMax;
112+
Partition<MyFilteredMCParticles> mcV0s = aod::mcparticle::pt > v0PtMin && aod::mcparticle::pt < v0PtMax && nabs(aod::mcparticle::eta) < v0EtaMax;
103113
Partition<MyFilteredMCParticles> mcTriggers = ((aod::mcparticle::pdgCode == static_cast<int>(kLambda0) || aod::mcparticle::pdgCode == static_cast<int>(kLambda0Bar)) &&
104114
aod::mcparticle::pt > v0PtMin && aod::mcparticle::pt < v0PtMax && nabs(aod::mcparticle::eta) < v0EtaMax);
105115
Partition<MyFilteredMCParticles> mcAssociates = (((aod::mcparticle::pdgCode == static_cast<int>(kPiPlus) || aod::mcparticle::pdgCode == static_cast<int>(kPiMinus)) && aod::mcparticle::pt > pionPtMin && aod::mcparticle::pt < pionPtMax) ||
@@ -156,8 +166,8 @@ struct ThreeParticleCorrelations {
156166
// QA & PID
157167
rQARegistry.add("hNEvents", "hNEvents", {HistType::kTH1D, {{3, 0, 3}}});
158168
rQARegistry.get<TH1>(HIST("hNEvents"))->GetXaxis()->SetBinLabel(1, "All");
159-
rQARegistry.get<TH1>(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "kNoSameBunchPileup");
160-
rQARegistry.get<TH1>(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "kIsGoodZvtxFT0vsPV");
169+
rQARegistry.get<TH1>(HIST("hNEvents"))->GetXaxis()->SetBinLabel(2, "kIsGoodZvtxFT0vsPV");
170+
rQARegistry.get<TH1>(HIST("hNEvents"))->GetXaxis()->SetBinLabel(3, "kNoSameBunchPileup");
161171

162172
rQARegistry.add("hEventCentrality", "hEventCentrality", {HistType::kTH1D, {{centralityAxis}}});
163173
rQARegistry.add("hEventCentrality_MC", "hEventCentrality_MC", {HistType::kTH1D, {{centralityAxis}}});
@@ -366,7 +376,7 @@ struct ThreeParticleCorrelations {
366376

367377
// Start of the Same-Event correlations
368378
for (const auto& trigger : v0s) {
369-
if (v0Filters(trigger, false)) {
379+
if (v0Filters(collision, trigger, tracks)) {
370380

371381
rQARegistry.fill(HIST("hPtV0"), trigger.pt(), collision.centFT0C());
372382
triggSign = v0Sign(trigger);
@@ -429,7 +439,7 @@ struct ThreeParticleCorrelations {
429439
// End of the Same-Event correlations
430440
}
431441

432-
void processMixed(MyFilteredCollisions const&, aod::V0Datas const&, MyFilteredTracks const&, aod::BCsWithTimestamps const&)
442+
void processMixed(MyFilteredCollisions const&, aod::V0Datas const&, MyFilteredTracks const& tracks, aod::BCsWithTimestamps const&)
433443
{
434444

435445
// Start of the Mixed-Event correlations
@@ -441,7 +451,7 @@ struct ThreeParticleCorrelations {
441451
auto bc = coll_1.bc_as<aod::BCsWithTimestamps>();
442452
auto bField = getMagneticField(bc.timestamp());
443453
for (const auto& [trigger, associate] : soa::combinations(soa::CombinationsFullIndexPolicy(v0_1, track_2))) {
444-
if (v0Filters(trigger, false) && trackFilters(associate)) {
454+
if (v0Filters(coll_1, trigger, tracks) && trackFilters(associate)) {
445455
if (radialDistanceFilter(trigger, associate, bField, true) && fakeV0Filter(trigger, associate)) {
446456

447457
triggSign = v0Sign(trigger);
@@ -758,7 +768,7 @@ struct ThreeParticleCorrelations {
758768

759769
for (const auto& v0 : v0s) {
760770

761-
if (!v0.has_mcParticle() || v0.pt() < v0PtMin || v0.pt() > v0PtMax || std::abs(v0.eta()) > v0EtaMax) {
771+
if (!v0.has_mcParticle() || v0.pt() <= v0PtMin || v0.pt() >= v0PtMax || std::abs(v0.eta()) >= v0EtaMax) {
762772
continue;
763773
}
764774
auto particle = v0.mcParticle();
@@ -772,7 +782,7 @@ struct ThreeParticleCorrelations {
772782
rMCRegistry.fill(HIST("hRecLambdaN"), v0.pt(), v0.eta(), collision.centFT0C());
773783
}
774784

775-
if (v0Filters(v0, true)) {
785+
if (v0Filters(collision, v0, tracks)) {
776786

777787
// V0 efficiency - Reconstructed
778788
if (v0Sign(v0) == 1) { // Lambdas
@@ -887,150 +897,164 @@ struct ThreeParticleCorrelations {
887897

888898
//==========================================================================================================================================================================================================================================================================
889899

890-
template <class CollCand>
891-
bool acceptEvent(const CollCand& collision, bool FillHist) // Event filter
900+
template <class Col>
901+
bool acceptEvent(const Col& col, bool FillHist) // Event filter
892902
{
893903

894904
if (FillHist) {
895905
rQARegistry.fill(HIST("hNEvents"), 0.5);
896906
}
897907

898-
if (!collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { // kNoSameBunchPileup
899-
return kFALSE;
908+
if (!col.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { // kIsGoodZvtxFT0vsPV
909+
return false;
900910
}
901911
if (FillHist) {
902912
rQARegistry.fill(HIST("hNEvents"), 1.5);
903913
}
904914

905-
if (!collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { // kIsGoodZvtxFT0vsPV
906-
return kFALSE;
915+
if (!col.selection_bit(aod::evsel::kNoSameBunchPileup)) { // kNoSameBunchPileup
916+
return false;
907917
}
908918
if (FillHist) {
909919
rQARegistry.fill(HIST("hNEvents"), 2.5);
910920
}
911-
912-
return kTRUE;
921+
922+
return true;
913923
}
914924

915-
template <class V0Cand>
916-
bool v0Filters(const V0Cand& v0, bool MCRec) // V0 filter
925+
template <class Col, class V0Cand, typename T>
926+
bool v0Filters(const Col& col, const V0Cand& v0, T const&) // V0 filter
917927
{
928+
929+
// Kinematic cuts
930+
if (v0.pt() <= v0PtMin || v0.pt() >= v0PtMax || std::abs(v0.eta()) >= v0EtaMax) {
931+
return false;
932+
}
918933

919-
if (v0.pt() < v0PtMin || v0.pt() > v0PtMax)
920-
return kFALSE;
921-
if (std::abs(v0.eta()) > v0EtaMax)
922-
return kFALSE;
923-
924-
if (!MCRec) { // Data
925-
if (v0Sign(v0) == 1) {
926-
const auto& posDaughter = v0.template posTrack_as<MyFilteredTracks>();
927-
if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) {
928-
return kFALSE;
929-
}
930-
} else if (v0Sign(v0) == -1) {
931-
const auto& negDaughter = v0.template negTrack_as<MyFilteredTracks>();
932-
if (std::abs(negDaughter.tpcNSigmaPr()) > nSigma4) {
933-
return kFALSE;
934-
}
934+
// Daughter cuts
935+
auto posDaughter = v0.template posTrack_as<T>();
936+
auto negDaughter = v0.template negTrack_as<T>();
937+
if (std::abs(posDaughter.eta()) >= trackEtaMax || std::abs(negDaughter.eta()) >= trackEtaMax) {
938+
return false;
939+
}
940+
if (posDaughter.tpcNClsCrossedRows() <= tpcNCrossedRowsMin || negDaughter.tpcNClsCrossedRows() <= tpcNCrossedRowsMin) {
941+
return false;
942+
}
943+
if (v0Sign(v0) == 1) {
944+
if (std::abs(posDaughter.tpcNSigmaPr()) >= nSigma5 || std::abs(negDaughter.tpcNSigmaPi()) >= nSigma5) {
945+
return false;
935946
}
936-
} else { // MC Reconstructed
937-
if (v0Sign(v0) == 1) {
938-
const auto& posDaughter = v0.template posTrack_as<MyFilteredMCTracks>();
939-
if (std::abs(posDaughter.tpcNSigmaPr()) > nSigma4) {
940-
return kFALSE;
941-
}
942-
} else if (v0Sign(v0) == -1) {
943-
const auto& negDaughter = v0.template negTrack_as<MyFilteredMCTracks>();
944-
if (std::abs(negDaughter.tpcNSigmaPr()) > nSigma4) {
945-
return kFALSE;
946-
}
947+
if (std::abs(v0.dcapostopv()) <= dcaProtonMin || std::abs(v0.dcanegtopv()) <= dcaPionMin) {
948+
return false;
949+
}
950+
} else if (v0Sign(v0) == -1) {
951+
if (std::abs(posDaughter.tpcNSigmaPi()) >= nSigma5 || std::abs(negDaughter.tpcNSigmaPr()) >= nSigma5) {
952+
return false;
947953
}
954+
if (std::abs(v0.dcapostopv()) <= dcaPionMin || std::abs(v0.dcanegtopv()) <= dcaProtonMin) {
955+
return false;
956+
}
957+
}
958+
959+
// Topological cuts
960+
float ctau = v0.distovertotmom(col.posX(), col.posY(), col.posZ()) * MassLambda0;
961+
if (v0.v0radius() <= decayRMin) {
962+
return false;
963+
}
964+
if (ctau >= ctauMax) {
965+
return false;
966+
}
967+
if (v0.v0cosPA() <= cosPAMin) {
968+
return false;
969+
}
970+
if (v0.dcaV0daughters() >= dcaV0DauMax) {
971+
return false;
948972
}
949973

950-
return kTRUE;
974+
return true;
951975
}
952976

953977
template <class TrackCand>
954978
bool trackFilters(const TrackCand& track) // Track filter
955979
{
956980

957981
if (!track.hasTOF()) {
958-
return kFALSE;
982+
return false;
959983
}
960984

961985
if (trackPID(track)[0] == pionID) { // Pions
962-
if (std::abs(track.tpcNSigmaPi()) > nSigma4) {
963-
return kFALSE;
986+
if (std::abs(track.tpcNSigmaPi()) >= nSigma4) {
987+
return false;
964988
}
965989
if (track.pt() < pionPtMin) {
966-
return kFALSE;
990+
return false;
967991
} else if (track.pt() > pionPtMin && track.pt() < pionPtMid) {
968-
if (std::abs(track.tofNSigmaPi()) > nSigma4) {
969-
return kFALSE;
992+
if (std::abs(track.tofNSigmaPi()) >= nSigma4) {
993+
return false;
970994
}
971995
} else if (track.pt() > pionPtMid && track.pt() < pionPtMax) {
972-
if (track.tofNSigmaPi() < -nSigma4 || track.tofNSigmaPi() > nSigma0) {
973-
return kFALSE;
996+
if (track.tofNSigmaPi() <= -nSigma4 || track.tofNSigmaPi() >= nSigma0) {
997+
return false;
974998
}
975999
} else if (track.pt() > pionPtMax) {
976-
return kFALSE;
1000+
return false;
9771001
}
9781002

9791003
} else if (trackPID(track)[0] == kaonID) { // Kaons
980-
if (std::abs(track.tpcNSigmaKa()) > nSigma4) {
981-
return kFALSE;
1004+
if (std::abs(track.tpcNSigmaKa()) >= nSigma4) {
1005+
return false;
9821006
}
9831007
if (track.pt() < kaonPtMin) {
984-
return kFALSE;
1008+
return false;
9851009
} else if (track.pt() > kaonPtMin && track.pt() < kaonPtMid1) {
986-
if (std::abs(track.tofNSigmaKa()) > nSigma4) {
987-
return kFALSE;
1010+
if (std::abs(track.tofNSigmaKa()) >= nSigma4) {
1011+
return false;
9881012
}
9891013
} else if (track.pt() > kaonPtMid1 && track.pt() < kaonPtMid2) {
990-
if (track.tofNSigmaKa() < -nSigma2 || track.tofNSigmaKa() > nSigma4) {
991-
return kFALSE;
1014+
if (track.tofNSigmaKa() <= -nSigma2 || track.tofNSigmaKa() >= nSigma4) {
1015+
return false;
9921016
}
9931017
} else if (track.pt() > kaonPtMid2 && track.pt() < kaonPtMax) {
994-
if (track.tofNSigmaKa() < nSigma0 || track.tofNSigmaKa() > nSigma4) {
995-
return kFALSE;
1018+
if (track.tofNSigmaKa() <= nSigma0 || track.tofNSigmaKa() >= nSigma4) {
1019+
return false;
9961020
}
9971021
} else if (track.pt() > kaonPtMax) {
998-
return kFALSE;
1022+
return false;
9991023
}
10001024

10011025
} else if (trackPID(track)[0] == protonID) { // Protons
1002-
if (std::abs(track.tpcNSigmaPr()) > nSigma4) {
1003-
return kFALSE;
1026+
if (std::abs(track.tpcNSigmaPr()) >= nSigma4) {
1027+
return false;
10041028
}
10051029
if (track.pt() < protonPtMin) {
1006-
return kFALSE;
1030+
return false;
10071031
} else if (track.pt() > protonPtMin && track.pt() < protonPtMid) {
1008-
if (track.tofNSigmaPr() < -nSigma2 || track.tofNSigmaPr() > nSigma4) {
1009-
return kFALSE;
1032+
if (track.tofNSigmaPr() <= -nSigma2 || track.tofNSigmaPr() >= nSigma4) {
1033+
return false;
10101034
}
10111035
} else if (track.pt() > protonPtMid && track.pt() < protonPtMax) {
1012-
if (std::abs(track.tofNSigmaPr()) > nSigma4) {
1013-
return kFALSE;
1036+
if (std::abs(track.tofNSigmaPr()) >= nSigma4) {
1037+
return false;
10141038
}
10151039
} else if (track.pt() > protonPtMax) {
1016-
if (track.tofNSigmaPr() < -nSigma2 || track.tofNSigmaPr() > nSigma4) {
1017-
return kFALSE;
1040+
if (track.tofNSigmaPr() <= -nSigma2 || track.tofNSigmaPr() >= nSigma4) {
1041+
return false;
10181042
}
10191043
}
10201044
}
10211045

1022-
return kTRUE;
1046+
return true;
10231047
}
10241048

10251049
template <class V0Cand, class TrackCand>
10261050
bool correlationFilters(const V0Cand& v0, const TrackCand& track) // Correlation filter
10271051
{
10281052

10291053
if (track.globalIndex() == v0.posTrackId() || track.globalIndex() == v0.negTrackId()) {
1030-
return kFALSE;
1054+
return false;
10311055
}
10321056

1033-
return kTRUE;
1057+
return true;
10341058
}
10351059

10361060
template <class V0Cand, class TrackCand>
@@ -1040,7 +1064,7 @@ struct ThreeParticleCorrelations {
10401064
if (confFakeV0Switch) {
10411065

10421066
if (trackPID(track)[0] == kaonID) { // Kaons
1043-
return kTRUE;
1067+
return true;
10441068
}
10451069

10461070
std::array<float, 2> massArray;
@@ -1070,11 +1094,11 @@ struct ThreeParticleCorrelations {
10701094

10711095
double invMass = RecoDecay::m(std::array{dMomArray, aMomArray}, massArray);
10721096
if (invMass >= MassLambda0 - 4 * dGaussSigma && invMass <= MassLambda0 + 4 * dGaussSigma) {
1073-
return kFALSE;
1097+
return false;
10741098
}
10751099
}
10761100

1077-
return kTRUE;
1101+
return true;
10781102
}
10791103

10801104
template <class V0Cand, class TrackCand>
@@ -1132,13 +1156,13 @@ struct ThreeParticleCorrelations {
11321156
}
11331157
}
11341158

1135-
if (std::abs(dEta) < dEtaMin) {
1159+
if (std::abs(dEta) <= dEtaMin) {
11361160
if (proton.sign() * track.sign() == -1) { // OS (Electric charge)
1137-
if (std::abs(dPhiStar) < dPhiStarMinOS) {
1161+
if (std::abs(dPhiStar) <= dPhiStarMinOS) {
11381162
pass = false;
11391163
}
11401164
} else if (proton.sign() * track.sign() == 1) { // SS (Electric charge)
1141-
if (std::abs(dPhiStar) < dPhiStarMinSS) {
1165+
if (std::abs(dPhiStar) <= dPhiStarMinSS) {
11421166
pass = false;
11431167
}
11441168
}

0 commit comments

Comments
 (0)