Skip to content

Commit d47a91b

Browse files
fmazzascFrancesco Mazzaschialibuild
authored
[Trigger,PWGLF] Add sigma+ - proton trigger (#14825)
Co-authored-by: Francesco Mazzaschi <[email protected]> Co-authored-by: ALICE Action Bot <[email protected]>
1 parent 23c29b9 commit d47a91b

File tree

2 files changed

+166
-11
lines changed

2 files changed

+166
-11
lines changed

EventFiltering/PWGLF/strangenessFilter.cxx

Lines changed: 164 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "../filterTables.h"
1818

19+
#include "PWGLF/DataModel/LFKinkDecayTables.h"
1920
#include "PWGLF/DataModel/LFParticleIdentification.h"
2021
#include "PWGLF/DataModel/LFStrangenessTables.h"
2122
#include "PWGLF/Utils/strangenessBuilderHelper.h"
@@ -26,6 +27,7 @@
2627
#include "Common/DataModel/Centrality.h"
2728
#include "Common/DataModel/EventSelection.h"
2829
#include "Common/DataModel/Multiplicity.h"
30+
#include "Common/DataModel/PIDResponseTOF.h"
2931
#include "Common/DataModel/TrackSelectionTables.h"
3032

3133
#include "CCDB/BasicCCDBManager.h"
@@ -42,6 +44,8 @@
4244
#include "ReconstructionDataFormats/TrackParametrization.h"
4345

4446
#include "TVector3.h"
47+
#include <Math/GenVector/Boost.h>
48+
#include <TLorentzVector.h>
4549

4650
#include <cmath>
4751

@@ -78,8 +82,10 @@ struct strangenessFilter {
7882
HistogramRegistry QAHistosTopologicalVariables{"QAHistosTopologicalVariables", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
7983
HistogramRegistry QAHistosTriggerParticles{"QAHistosTriggerParticles", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
8084
HistogramRegistry QAHistosStrangenessTracking{"QAHistosStrangenessTracking", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
85+
HistogramRegistry QAHistosSigma{"QAHistosSigma", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
86+
8187
HistogramRegistry EventsvsMultiplicity{"EventsvsMultiplicity", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
82-
OutputObj<TH1D> hProcessedEvents{TH1D("hProcessedEvents", "Strangeness - event filtered;; Number of events", 20, -1., 19.)};
88+
OutputObj<TH1D> hProcessedEvents{TH1D("hProcessedEvents", "Strangeness - event filtered;; Number of events", 21, -1., 20.)};
8389
OutputObj<TH1F> hCandidate{TH1F("hCandidate", "; Candidate pass selection; Number of events", 30, 0., 30.)};
8490
OutputObj<TH1F> hEvtvshMinPt{TH1F("hEvtvshMinPt", " Number of h-Omega events with pT_h higher than thrd; min p_{T, trigg} (GeV/c); Number of events", 11, 0., 11.)};
8591

@@ -164,9 +170,11 @@ struct strangenessFilter {
164170
Configurable<float> massWindowXiNsigma{"massWindowXiNsigma", 6, "Inv. mass window for tracked Xi"};
165171

166172
// Selections criteria for tracks
167-
Configurable<float> hEta{"hEta", 0.9f, "Eta range for trigger particles"};
168-
Configurable<float> hMinPt{"hMinPt", 1.0f, "Min pt for trigger particles"};
169-
Configurable<bool> isTrackFilter{"isTrackFilter", true, "Apply track myTrackSelections"};
173+
struct : ConfigurableGroup {
174+
Configurable<float> hEta{"hEta", 0.9f, "Eta range for trigger particles"};
175+
Configurable<float> hMinPt{"hMinPt", 1.0f, "Min pt for trigger particles"};
176+
Configurable<bool> isTrackFilter{"isTrackFilter", true, "Apply track myTrackSelections"};
177+
} cfgTrackCuts;
170178

171179
// Settings for strangeness tracking filter
172180
Configurable<std::string> ccdbUrl{"ccdbUrl", "http://alice-ccdb.cern.ch", "url of the ccdb repository"};
@@ -196,6 +204,23 @@ struct strangenessFilter {
196204
Configurable<float> maxCpaTrackedXi{"maxCpaTrackedXi", 1., "Maximum CPA for tracked cascades"};
197205
Configurable<float> minDcaTrackedOmega{"minDcaTrackedOmega", -1., "Minimum DCA for tracked cascades (ST)"};
198206
Configurable<float> maxCpaTrackedOmega{"maxCpaTrackedOmega", 1., "Maximum CPA for tracked cascades (ST)"};
207+
208+
// Settings for sigmaplus filter
209+
struct : ConfigurableGroup {
210+
Configurable<float> nsigmatpcSigma{"nsigmatpcSigma", 3.f, "N Sigmas TPC Sigma"};
211+
Configurable<float> nsigmatofSigma{"nsigmatofSigma", 3.f, "N Sigmas TOF Sigma"};
212+
Configurable<float> minMassSigma{"minMassSigma", 1.15f, "min mass for Sigma"};
213+
Configurable<float> maxMassSigma{"maxMassSigma", 1.25f, "max mass for Sigma"};
214+
Configurable<float> minPtSigma{"minPtSigma", 1.2f, "min Pt for Sigma"};
215+
Configurable<float> minQtAPSigma{"minQtAPSigma", 0.15f, "min QtAP for Sigma"};
216+
Configurable<float> maxQtAPSigma{"maxQtAPSigma", 0.20f, "max QtAP for Sigma"};
217+
Configurable<float> maxDCAtoPVSigma{"maxDCAtoPVSigma", 0.1f, "Max DCA to primary vertex for Sigma candidates (cm)"};
218+
Configurable<float> minRadiusSigma{"minRadiusSigma", 19.f, "Min radius for Sigma+ decay vertex (cm)"};
219+
Configurable<float> minCosPASigma{"minCosPASigma", 0.995f, "Min Cosine of pointing angle for Sigma candidates"};
220+
Configurable<float> minPtProtonTOF{"minPtProtonTOF", 0.75f, "Min Pt for proton to have TOF signal (GeV/c)"};
221+
Configurable<float> maxKStarSigmaProton{"maxKStarSigmaProton", 0.8f, "Max k* for Sigma-Proton pairs (GeV/c)"};
222+
} cfgSigma;
223+
199224
Configurable<LabeledArray<double>> parSigmaMass{
200225
"parSigmaMass",
201226
{stfilter::massSigmaParameters[0], 4, 2,
@@ -215,7 +240,7 @@ struct strangenessFilter {
215240

216241
bool selectTrack(const auto& track)
217242
{
218-
return track.pt() > hMinPt && std::abs(track.eta()) < hEta && track.tpcNClsCrossedRows() >= tpcmincrossedrows && track.tpcChi2NCl() <= 4.f && track.itsChi2NCl() <= 36.f && (track.itsClusterMap() & 0x7) != 0;
243+
return track.pt() > cfgTrackCuts.hMinPt && std::abs(track.eta()) < cfgTrackCuts.hEta && track.tpcNClsCrossedRows() >= tpcmincrossedrows && track.tpcChi2NCl() <= 4.f && track.itsChi2NCl() <= 36.f && (track.itsClusterMap() & 0x7) != 0;
219244
}
220245
bool selectTrackOHM(const auto& track)
221246
{
@@ -296,6 +321,48 @@ struct strangenessFilter {
296321
return true;
297322
}
298323

324+
float getAlphaAP(const std::array<float, 3>& momMother, const std::array<float, 3>& momKink)
325+
{
326+
std::array<float, 3> momMissing = {momMother[0] - momKink[0], momMother[1] - momKink[1], momMother[2] - momKink[2]};
327+
float lQlP = std::inner_product(momMother.begin(), momMother.end(), momKink.begin(), 0.f);
328+
float lQlN = std::inner_product(momMother.begin(), momMother.end(), momMissing.begin(), 0.f);
329+
return (lQlP - lQlN) / (lQlP + lQlN);
330+
}
331+
332+
float getQtAP(const std::array<float, 3>& momMother, const std::array<float, 3>& momKink)
333+
{
334+
float dp = std::inner_product(momMother.begin(), momMother.end(), momKink.begin(), 0.f);
335+
float p2V0 = std::inner_product(momMother.begin(), momMother.end(), momMother.begin(), 0.f);
336+
float p2A = std::inner_product(momKink.begin(), momKink.end(), momKink.begin(), 0.f);
337+
return std::sqrt(p2A - dp * dp / p2V0);
338+
}
339+
340+
float getCosPA(const std::array<float, 3>& momMother, const std::array<float, 3>& decayVertex, const std::array<float, 3>& primaryVertex)
341+
{
342+
std::array<float, 3> decayVec = {decayVertex[0] - primaryVertex[0], decayVertex[1] - primaryVertex[1], decayVertex[2] - primaryVertex[2]};
343+
float dotProduct = std::inner_product(momMother.begin(), momMother.end(), decayVec.begin(), 0.f);
344+
float momMotherMag = std::sqrt(std::inner_product(momMother.begin(), momMother.end(), momMother.begin(), 0.f));
345+
float decayVecMag = std::sqrt(std::inner_product(decayVec.begin(), decayVec.end(), decayVec.begin(), 0.f));
346+
return dotProduct / (momMotherMag * decayVecMag);
347+
}
348+
349+
float getKStar(TLorentzVector const& part1, TLorentzVector const& part2)
350+
{
351+
TLorentzVector trackSum, PartOneCMS, PartTwoCMS, trackRelK;
352+
trackSum = part1 + part2;
353+
const float beta = trackSum.Beta();
354+
const float betax = beta * std::cos(trackSum.Phi()) * std::sin(trackSum.Theta());
355+
const float betay = beta * std::sin(trackSum.Phi()) * std::sin(trackSum.Theta());
356+
const float betaz = beta * std::cos(trackSum.Theta());
357+
PartOneCMS.SetXYZM(part1.Px(), part1.Py(), part1.Pz(), part1.M());
358+
PartTwoCMS.SetXYZM(part2.Px(), part2.Py(), part2.Pz(), part2.M());
359+
const ROOT::Math::Boost boostPRF = ROOT::Math::Boost(-betax, -betay, -betaz);
360+
PartOneCMS = boostPRF(PartOneCMS);
361+
PartTwoCMS = boostPRF(PartTwoCMS);
362+
trackRelK = PartOneCMS - PartTwoCMS;
363+
return 0.5 * trackRelK.P();
364+
}
365+
299366
void init(o2::framework::InitContext&)
300367
{
301368
// set V0 parameters in the helper
@@ -345,6 +412,7 @@ struct strangenessFilter {
345412
hProcessedEvents->GetXaxis()->SetBinLabel(18, aod::filtering::OmegaHighMultTrk::columnLabel());
346413
hProcessedEvents->GetXaxis()->SetBinLabel(19, aod::filtering::HighMultFT0M::columnLabel());
347414
hProcessedEvents->GetXaxis()->SetBinLabel(20, aod::filtering::HighMultTrk::columnLabel());
415+
hProcessedEvents->GetXaxis()->SetBinLabel(21, aod::filtering::SigmaProton::columnLabel());
348416

349417
hCandidate->GetXaxis()->SetBinLabel(1, "All");
350418
hCandidate->GetXaxis()->SetBinLabel(2, "PassBuilderSel");
@@ -530,6 +598,13 @@ struct strangenessFilter {
530598
QAHistosStrangenessTracking.add("hPtVsMassTrkOmega", "cascades;p_{T} (GeV/#it{c});m (GeV/#it{c}^2)", HistType::kTH2D, {{200, 0., 10.}, {1000, 1.6, 2.1}});
531599
QAHistosStrangenessTracking.add("hPtVsMassTrkXiSelected", "cascades;p_{T} (GeV/#it{c});m (GeV/#it{c}^2)", HistType::kTH2D, {{200, 0., 10.}, {1000, 1.2, 1.7}});
532600
QAHistosStrangenessTracking.add("hPtVsMassTrkOmegaSelected", "cascades;p_{T} (GeV/#it{c});m (GeV/#it{c}^2)", HistType::kTH2D, {{200, 0., 10.}, {1000, 1.6, 2.1}});
601+
602+
// Sigma QA histograms
603+
QAHistosSigma.add("hPtVsMassSigmaPlus", ";p_{T} (GeV/#it{c});m (GeV/#it{c}^2)", HistType::kTH2D, {{20, -5, 5.}, {50, 1.1, 1.3}});
604+
QAHistosSigma.add("hDecayRadiusSigma", ";R (cm)", HistType::kTH1D, {{100, 0., 40.}});
605+
QAHistosSigma.add("hPtNSigmaTPCPrPair", ";p_{T} (GeV/#it{c});#sigma_{TPC}", HistType::kTH2D, {{200, -5., 5.}, {200, -5., 5.}});
606+
QAHistosSigma.add("hPtNSigmaTOFPrPair", ";p_{T} (GeV/#it{c});#sigma_{TOF}", HistType::kTH2D, {{200, -5., 5.}, {200, -5., 5.}});
607+
QAHistosSigma.add("hKStarSigmaPr", ";k*", HistType::kTH1D, {{200, 0., 2}});
533608
}
534609
}
535610

@@ -566,7 +641,7 @@ struct strangenessFilter {
566641

567642
// Tables
568643
using CollisionCandidates = soa::Join<aod::Collisions, aod::EvSels, aod::MultZeqs, aod::FT0Mults, aod::MultsGlobal>::iterator;
569-
using TrackCandidates = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCLfFullPi, aod::pidTPCLfFullPr, aod::pidTPCLfFullKa>;
644+
using TrackCandidates = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCLfFullPi, aod::pidTPCLfFullPr, aod::pidTPCLfFullKa, aod::pidTOFFullPr>;
570645

571646
float getMassWindow(const stfilter::species s, const float pt, const float nsigma = 6)
572647
{
@@ -580,14 +655,14 @@ struct strangenessFilter {
580655

581656
void fillTriggerTable(bool keepEvent[])
582657
{
583-
strgtable(keepEvent[0], keepEvent[1], keepEvent[2], keepEvent[3], keepEvent[4], keepEvent[5], keepEvent[6], keepEvent[7], keepEvent[8], keepEvent[9], keepEvent[10], keepEvent[11], keepEvent[12], keepEvent[13], keepEvent[14], keepEvent[15]);
658+
strgtable(keepEvent[0], keepEvent[1], keepEvent[2], keepEvent[3], keepEvent[4], keepEvent[5], keepEvent[6], keepEvent[7], keepEvent[8], keepEvent[9], keepEvent[10], keepEvent[11], keepEvent[12], keepEvent[13], keepEvent[14], keepEvent[15], keepEvent[16]);
584659
}
585660

586-
void process(CollisionCandidates const& collision, TrackCandidates const& tracks, aod::Cascades const& cascadesBase, aod::AssignedTrackedCascades const& trackedCascades, aod::AssignedTrackedV0s const& /*trackedV0s*/, aod::AssignedTracked3Bodys const& /*tracked3Bodys*/, aod::V0s const& v0Base, aod::BCs const&, aod::FT0s const& /*ft0s*/)
661+
void process(CollisionCandidates const& collision, TrackCandidates const& tracks, aod::Cascades const& cascadesBase, aod::AssignedTrackedCascades const& trackedCascades, aod::KinkCands const& kinkCands, aod::AssignedTrackedV0s const& /*trackedV0s*/, aod::AssignedTracked3Bodys const& /*tracked3Bodys*/, aod::V0s const& v0Base, aod::BCs const&, aod::FT0s const& /*ft0s*/)
587662
{
588663
// Is event good? [0] = Omega, [1] = high-pT hadron + Omega, [2] = 2Xi, [3] = 3Xi, [4] = 4Xi, [5] single-Xi, [6] Omega with high radius
589664
// [7] tracked Xi, [8] tracked Omega, [9] Omega + high mult event
590-
bool keepEvent[16]{}; // explicitly zero-initialised
665+
bool keepEvent[17]{}; // explicitly zero-initialised
591666
std::vector<std::array<int64_t, 2>> v0sFromOmegaID;
592667
std::vector<std::array<int64_t, 2>> v0sFromXiID;
593668

@@ -1109,7 +1184,7 @@ struct strangenessFilter {
11091184
// QA tracks
11101185
int triggcounterAllEv = 0;
11111186
for (auto track : tracks) { // start loop over tracks
1112-
if (isTrackFilter && !selectTrack(track)) {
1187+
if (cfgTrackCuts.isTrackFilter && !selectTrack(track)) {
11131188
continue;
11141189
}
11151190
triggcounterAllEv++;
@@ -1373,6 +1448,82 @@ struct strangenessFilter {
13731448
}
13741449
}
13751450
}
1451+
// // Sigma - proton trigger definition
1452+
for (const auto& kinkCand : kinkCands) {
1453+
auto dauTrack = kinkCand.trackDaug_as<TrackCandidates>();
1454+
if (!dauTrack.hasTPC() || !dauTrack.hasTOF()) {
1455+
continue;
1456+
}
1457+
if (std::abs(dauTrack.tpcNSigmaPr()) > cfgSigma.nsigmatpcSigma || std::abs(dauTrack.tofNSigmaPr()) > cfgSigma.nsigmatofSigma) {
1458+
continue;
1459+
}
1460+
if (kinkCand.ptMoth() < cfgSigma.minPtSigma) {
1461+
continue;
1462+
}
1463+
if (kinkCand.mSigmaPlus() < cfgSigma.minMassSigma || kinkCand.mSigmaPlus() > cfgSigma.maxMassSigma) {
1464+
continue;
1465+
}
1466+
QAHistosSigma.fill(HIST("hPtVsMassSigmaPlus"), kinkCand.mothSign() * kinkCand.ptMoth(), kinkCand.mSigmaPlus());
1467+
std::array<float, 3> momMoth = {kinkCand.pxMoth(), kinkCand.pyMoth(), kinkCand.pzMoth()};
1468+
std::array<float, 3> momDaug = {kinkCand.pxDaug(), kinkCand.pyDaug(), kinkCand.pzDaug()};
1469+
std::array<float, 3> primaryVtx = {collision.posX(), collision.posY(), collision.posZ()};
1470+
std::array<float, 3> decayVtx = {kinkCand.xDecVtx(), kinkCand.yDecVtx(), kinkCand.zDecVtx()};
1471+
float qtAP = getQtAP(momMoth, momDaug);
1472+
float alphaAP = getAlphaAP(momMoth, momDaug);
1473+
float cosPA = getCosPA(momMoth, decayVtx, primaryVtx);
1474+
if (alphaAP < 0) {
1475+
continue;
1476+
}
1477+
if (qtAP < cfgSigma.minQtAPSigma || qtAP > cfgSigma.maxQtAPSigma) {
1478+
continue;
1479+
}
1480+
if (cosPA < cfgSigma.minCosPASigma) {
1481+
continue;
1482+
}
1483+
if (std::abs(kinkCand.dcaMothPv()) > cfgSigma.maxDCAtoPVSigma) {
1484+
continue;
1485+
}
1486+
float decRad = std::hypot(kinkCand.xDecVtx(), kinkCand.yDecVtx());
1487+
if (decRad < cfgSigma.minRadiusSigma) {
1488+
continue;
1489+
}
1490+
QAHistosSigma.fill(HIST("hDecayRadiusSigma"), decRad);
1491+
// pair a proton
1492+
bool isProtonPaired = false;
1493+
for (auto track : tracks) {
1494+
if (track.globalIndex() == dauTrack.globalIndex()) {
1495+
continue;
1496+
}
1497+
if (std::abs(track.tpcNSigmaPr()) > cfgSigma.nsigmatpcSigma) {
1498+
continue;
1499+
}
1500+
QAHistosSigma.fill(HIST("hPtNSigmaTPCPrPair"), track.sign() * track.pt(), track.tpcNSigmaPr());
1501+
TLorentzVector sigmaVec, protonVec;
1502+
sigmaVec.SetXYZM(kinkCand.pxMoth(), kinkCand.pyMoth(), kinkCand.pzMoth(), o2::constants::physics::MassSigmaPlus);
1503+
protonVec.SetXYZM(track.px(), track.py(), track.pz(), o2::constants::physics::MassProton);
1504+
float kstar = getKStar(sigmaVec, protonVec);
1505+
if (kstar > cfgSigma.maxKStarSigmaProton) {
1506+
continue;
1507+
}
1508+
QAHistosSigma.fill(HIST("hKStarSigmaPr"), kstar);
1509+
if (track.pt() < cfgSigma.minPtProtonTOF) {
1510+
isProtonPaired = true;
1511+
break;
1512+
}
1513+
if (!track.hasTOF()) {
1514+
continue;
1515+
}
1516+
QAHistosSigma.fill(HIST("hPtNSigmaTOFPrPair"), track.sign() * track.pt(), track.tofNSigmaPr());
1517+
if (std::abs(track.tofNSigmaPr()) > cfgSigma.nsigmatofSigma) {
1518+
continue;
1519+
}
1520+
isProtonPaired = true;
1521+
break;
1522+
}
1523+
if (isProtonPaired) {
1524+
keepEvent[16] = true;
1525+
}
1526+
}
13761527

13771528
// Fill centrality dependent histos
13781529
if (keepEvent[0]) {
@@ -1426,6 +1577,9 @@ struct strangenessFilter {
14261577
if (keepEvent[15]) {
14271578
hProcessedEvents->Fill(18.5);
14281579
}
1580+
if (keepEvent[16]) {
1581+
hProcessedEvents->Fill(19.5);
1582+
}
14291583
// Filling the table
14301584
fillTriggerTable(keepEvent);
14311585
}

EventFiltering/filterTables.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ DECLARE_SOA_COLUMN(LambdaLambda, lambdaLambda, bool); //! at least 2
174174
DECLARE_SOA_COLUMN(OmegaHighMultTrk, hasOmegaHighMultTrk, bool); //! at least 1 Omega + high-mult track event
175175
DECLARE_SOA_COLUMN(HighMultFT0M, hasHighMultFT0M, bool); //! at least 1 Omega + high-mult track event
176176
DECLARE_SOA_COLUMN(HighMultTrk, hasHighMultTrk, bool); //! at least 1 Omega + high-mult track event
177+
DECLARE_SOA_COLUMN(SigmaProton, hasSigmaProton, bool); //! at least 1 Sigma - proton candidate
177178
// F1-proton
178179
DECLARE_SOA_COLUMN(TriggerEventF1Proton, triggereventf1proton, bool); //! F1 - proton femto trigger event
179180

@@ -334,7 +335,7 @@ using FullJetFilter = FullJetFilters::iterator;
334335

335336
// strangeness (lf)
336337
DECLARE_SOA_TABLE(StrangenessFilters, "AOD", "LFStrgFilters", //!
337-
filtering::Omega, filtering::hadronOmega, filtering::DoubleXi, filtering::TripleXi, filtering::QuadrupleXi, filtering::SingleXiYN, filtering::OmegaLargeRadius, filtering::TrackedXi, filtering::TrackedOmega, filtering::OmegaHighMult, filtering::DoubleOmega, filtering::OmegaXi, filtering::LambdaLambda, filtering::OmegaHighMultTrk, filtering::HighMultFT0M, filtering::HighMultTrk);
338+
filtering::Omega, filtering::hadronOmega, filtering::DoubleXi, filtering::TripleXi, filtering::QuadrupleXi, filtering::SingleXiYN, filtering::OmegaLargeRadius, filtering::TrackedXi, filtering::TrackedOmega, filtering::OmegaHighMult, filtering::DoubleOmega, filtering::OmegaXi, filtering::LambdaLambda, filtering::OmegaHighMultTrk, filtering::HighMultFT0M, filtering::HighMultTrk, filtering::SigmaProton);
338339
using StrangenessFilter = StrangenessFilters::iterator;
339340

340341
// F1 proton

0 commit comments

Comments
 (0)