Skip to content

Commit 08a03a1

Browse files
committed
Adding leading particle QA and second-to-leading jet studies. Studying Armenteros Lambdas
1 parent 34e7250 commit 08a03a1

File tree

3 files changed

+274
-183
lines changed

3 files changed

+274
-183
lines changed

PWGLF/DataModel/lambdaJetPolarizationIons.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ DECLARE_SOA_COLUMN(JetEta, jetEta, float);
3737
DECLARE_SOA_COLUMN(JetPhi, jetPhi, float);
3838
DECLARE_SOA_COLUMN(JetNConstituents, jetNConstituents, uint64_t);
3939

40+
DECLARE_SOA_COLUMN(LeadParticlePt, leadParticlePt, float);
41+
DECLARE_SOA_COLUMN(LeadParticleEta, leadParticleEta, float);
42+
DECLARE_SOA_COLUMN(LeadParticlePhi, leadParticlePhi, float);
43+
4044
DECLARE_SOA_COLUMN(V0Pt, v0Pt, float);
4145
DECLARE_SOA_COLUMN(V0Eta, v0Eta, float);
4246
DECLARE_SOA_COLUMN(V0Phi, v0Phi, float);
@@ -54,7 +58,6 @@ DECLARE_SOA_COLUMN(NegEta, negEta, float);
5458
DECLARE_SOA_COLUMN(NegPhi, negPhi, float);
5559

5660
// (TODO: add dynamic columns with jet px, py, pz)
57-
// (TODO: add leading particle as one of the columns!)
5861

5962
} // namespace lambdajetpol
6063

@@ -65,6 +68,12 @@ DECLARE_SOA_TABLE(RingJets, "AOD", "RINGJETS", // Renamed to follow convention o
6568
lambdajetpol::JetPhi,
6669
lambdajetpol::JetNConstituents);
6770

71+
DECLARE_SOA_TABLE(RingLeadP, "AOD", "RINGLEADP", // Leading particle table
72+
lambdajetpol::CollisionId,
73+
lambdajetpol::LeadParticlePt,
74+
lambdajetpol::LeadParticleEta,
75+
lambdajetpol::LeadParticlePhi);
76+
6877
DECLARE_SOA_TABLE(RingLaV0s, "AOD", "RINGLAV0S", // Had to write this in a shorter form because the derived data did not accept long names
6978
lambdajetpol::CollisionId,
7079
lambdajetpol::V0Pt,

PWGLF/TableProducer/Strangeness/lambdaJetPolarizationIons.cxx

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ struct lambdajetpolarizationions {
175175
// } products;
176176
Produces<o2::aod::RingLaV0s> tableV0s;
177177
Produces<o2::aod::RingJets> tableJets;
178+
Produces<o2::aod::RingLeadP> tableLeadParticles;
178179
Produces<o2::aod::RingCollisions> tableCollisions;
179180

180181
// Define histogram registries:
@@ -838,7 +839,11 @@ struct lambdajetpolarizationions {
838839

839840
// Check if doing the right thing in AP space please
840841
histos.add("GeneralQA/h2dArmenterosAll", "h2dArmenterosAll", kTH2D, {axisConfigurations.axisAPAlpha, axisConfigurations.axisAPQt});
841-
histos.add("GeneralQA/h2dArmenterosSelected", "h2dArmenterosSelected", kTH2D, {axisConfigurations.axisAPAlpha, axisConfigurations.axisAPQt});
842+
histos.add("GeneralQA/h2dArmenterosKinematicSelected", "h2dArmenterosKinematicSelected", kTH2D, {axisConfigurations.axisAPAlpha, axisConfigurations.axisAPQt});
843+
histos.add("GeneralQA/h2dArmenterosFullSelected", "h2dArmenterosFullSelected", kTH2D, {axisConfigurations.axisAPAlpha, axisConfigurations.axisAPQt});
844+
histos.add("GeneralQA/h2dArmenterosFullSelectedLambda", "h2dArmenterosFullSelectedLambda", kTH2D, {axisConfigurations.axisAPAlpha, axisConfigurations.axisAPQt});
845+
histos.add("GeneralQA/h2dArmenterosFullSelectedAntiLambda", "h2dArmenterosFullSelectedAntiLambda", kTH2D, {axisConfigurations.axisAPAlpha, axisConfigurations.axisAPQt});
846+
histos.add("GeneralQA/h2dArmenterosFullSelectedAmbiguous", "h2dArmenterosFullSelectedAmbiguous", kTH2D, {axisConfigurations.axisAPAlpha, axisConfigurations.axisAPQt});
842847

843848
// Jets histograms:
844849
// Histogram that needs to be present even out of QA:
@@ -1300,12 +1305,32 @@ struct lambdajetpolarizationions {
13001305
return true;
13011306
}
13021307

1303-
// (TODO: possible function to distinguish ambiguous candidates that pass both the Lambda_hypothesis true (i.e., a Lambda) or false (i.e., an AntiLambda))
1304-
// template <typename TV0>
1305-
// bool isCandidateLambda(TV0 const& v0){
1306-
//
1308+
// Function to help distinguish ambiguous candidates (via Armenteros) that pass both
1309+
// the Lambda_hypothesis true (i.e., a Lambda) or false (i.e., an AntiLambda) checks
1310+
// (This function is only called in about 1-3% of the Lambda-Like V0s which remain ambiguous after all other cuts)
1311+
// (TODO: add a histogram that tracks the amount of ambiguous candidates distinguished
1312+
// by Armenteros, so that we can reconstruct the full ambiguous candidates number from
1313+
// the number of ambiguous even after Armenteros and the total number before the cut)
1314+
// int isCandidateArmenterosLambda(const float alpha, const float qt){
1315+
// // Remove K0s band
1316+
// if (std::abs(alpha) < v0Selections.armK0AlphaThreshold && qt < v0Selections.armK0QtThreshold) return kIsArmenterosK0;
1317+
// // std::abs(alpha) < 0.2 && qt < 0.1
1318+
// if (std::abs(alpha) < v0Selections.armMinAlpha) return kArmenterosAmbiguous;
1319+
// // std::abs(alpha) < 0.01f
1320+
// // Lambda selection
1321+
// if (alpha > 0) return kIsArmenterosLambda;
1322+
// else return kIsArmenterosAntiLambda;
13071323
// }
13081324

1325+
// TODO: another possible check that could be done (if not implemented already inside mLambda() getters)
1326+
// template <typename TV0>
1327+
// int isCandidateMassLambda(TV0 const& v0) {
1328+
// float m1 = v0.mLambda(); // proton=positive
1329+
// float m2 = v0.mAntiLambda(); // proton=negative
1330+
// float d = std::abs(m1 - mLambdaTrue) - std::abs(m2 - mLambdaTrue);
1331+
// if (d < 0.f) return +1; // Lambda
1332+
// else return -1; // AntiLambda
1333+
// }
13091334

13101335
void processJetsData(SelCollisionsSimple::iterator const& collision, PseudoJetTracks const& tracks, aod::BCsWithTimestamps const& bcs){ // Uses BCsWithTimestamps to get timestamps for rejectTPCsectorBoundary
13111336
float centrality = -1.0f; // Just a placeholder
@@ -1342,6 +1367,12 @@ struct lambdajetpolarizationions {
13421367
// Reject empty events
13431368
if (fjParticles.size() < 1) return;
13441369

1370+
auto const& leadingParticle = fjParticles[leadingParticleIdx];
1371+
tableLeadParticles(collIdx,
1372+
leadingParticle.pt(),
1373+
leadingParticle.eta(),
1374+
leadingParticle.phi());
1375+
13451376
// Start jet clusterization:
13461377
// Cluster particles using the anti-kt algorithm
13471378
fastjet::JetDefinition jetDef(mapFJAlgorithm(jetConfigurations.jetAlgorithm), jetConfigurations.radiusJet, mapFJRecombScheme(jetConfigurations.jetRecombScheme));
@@ -1435,8 +1466,6 @@ struct lambdajetpolarizationions {
14351466
histos.fill(HIST("JetKinematicsQA/h2dJetsPerEventvsCosThetaToLead"), selectedJets, cosTheta);
14361467
}
14371468
// Leading particle comparisons:
1438-
auto const& leadingParticle = fjParticles[leadingParticleIdx];
1439-
14401469
histos.fill(HIST("JetVsLeadingParticleQA/hLeadingParticlePt"), leadingParticle.pt());
14411470
histos.fill(HIST("JetVsLeadingParticleQA/hLeadingParticleEta"), leadingParticle.eta());
14421471
histos.fill(HIST("JetVsLeadingParticleQA/hLeadingParticlePhi"), leadingParticle.phi());
@@ -1538,8 +1567,6 @@ struct lambdajetpolarizationions {
15381567
histos.fill(HIST("JetKinematicsQA/hLeadingJetPhi"), leadingJet.phi());
15391568

15401569
// Leading particle comparisons:
1541-
auto const& leadingParticle = fjParticles[leadingParticleIdx];
1542-
15431570
histos.fill(HIST("JetVsLeadingParticleQA/hLeadingParticlePt"), leadingParticle.pt());
15441571
histos.fill(HIST("JetVsLeadingParticleQA/hLeadingParticleEta"), leadingParticle.eta());
15451572
histos.fill(HIST("JetVsLeadingParticleQA/hLeadingParticlePhi"), leadingParticle.phi());
@@ -1597,10 +1624,10 @@ struct lambdajetpolarizationions {
15971624
for (auto const& v0 : fullV0s){
15981625
V0SelCounter.resetForNewV0();
15991626
V0SelCounter.fill(); // Fill for all v0 candidates
1627+
if (doArmenterosQA) histos.fill(HIST("GeneralQA/h2dArmenterosAll"), v0.alpha(), v0.qtarm()); // fill AP plot for all V0s
16001628
if (!passesGenericV0Cuts(v0)) continue;
16011629

1602-
// fill AP plot for all V0s
1603-
if (doArmenterosQA) histos.fill(HIST("GeneralQA/h2dArmenterosAll"), v0.alpha(), v0.qtarm());
1630+
if (doArmenterosQA) histos.fill(HIST("GeneralQA/h2dArmenterosKinematicSelected"), v0.alpha(), v0.qtarm());
16041631

16051632
// Else, just continue the loop:
16061633
bool isLambda = false;
@@ -1611,8 +1638,22 @@ struct lambdajetpolarizationions {
16111638
if (!isLambda && !isAntiLambda) continue; // Candidate is not considered to be a Lambda (TODO: expand this to a full if block with QA about rejections)
16121639
// hasValidV0 = true;
16131640

1614-
if (doArmenterosQA) histos.fill(HIST("GeneralQA/h2dArmenterosSelected"), v0.alpha(), v0.qtarm()); // cross-check
1615-
if (isLambda && isAntiLambda) histos.fill(HIST("hAmbiguousLambdaCandidates"), 0);
1641+
if (doArmenterosQA) histos.fill(HIST("GeneralQA/h2dArmenterosFullSelected"), v0.alpha(), v0.qtarm()); // cross-check
1642+
if (isLambda && !isAntiLambda) histos.fill(HIST("GeneralQA/h2dArmenterosFullSelectedLambda"), v0.alpha(), v0.qtarm());
1643+
if (!isLambda && isAntiLambda) histos.fill(HIST("GeneralQA/h2dArmenterosFullSelectedAntiLambda"), v0.alpha(), v0.qtarm());
1644+
1645+
// int lambdaIdx = -1; // No need to pass armenteros
1646+
if (isLambda && isAntiLambda) {
1647+
histos.fill(HIST("hAmbiguousLambdaCandidates"), 0);
1648+
if (doArmenterosQA) histos.fill(HIST("GeneralQA/h2dArmenterosFullSelectedAmbiguous"), v0.alpha(), v0.qtarm()); // To know the discerning power of Armenteros in an Ambiguous Lambda vs AntiLambda case
1649+
1650+
// Armenteros cut is not worth it! From QA histograms, only about 0.05% of ambiguous candidates are in the regions probable to be Lamda/AntiLambdas!
1651+
// The statistics gain is not worth it.
1652+
// // Third and final check to distinguish between Lambda and AntiLambda ambiguous v0s:
1653+
// // (This check is only performed to recycle AMBIGUOUS candidates! Not a hard cut on all candidates!)
1654+
// lambdaIdx = isCandidateArmenterosLambda(v0.alpha(), v0.qtarm());
1655+
}
1656+
// if (lambdaIdx == kIsArmenterosK0) continue; // Should just skip this step then!
16161657

16171658
if (doEventQA) fillEventSelectionQA(lastBinEvSel, centrality); // hasRingV0 passes
16181659

0 commit comments

Comments
 (0)