Skip to content

Commit e077a70

Browse files
committed
adding trigger condition for lambdalambda
1 parent c0e8ef5 commit e077a70

File tree

2 files changed

+131
-6
lines changed

2 files changed

+131
-6
lines changed

EventFiltering/PWGLF/strangenessFilter.cxx

Lines changed: 129 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
/// \since June 1, 2021
1616

1717
#include <cmath>
18+
#include "TVector3.h"
1819
#include "CCDB/BasicCCDBManager.h"
1920
#include "DataFormatsParameters/GRPMagField.h"
2021
#include "DataFormatsParameters/GRPObject.h"
@@ -25,6 +26,7 @@
2526
#include "Framework/AnalysisDataModel.h"
2627
#include "Framework/ASoAHelpers.h"
2728
#include "ReconstructionDataFormats/Track.h"
29+
#include "ReconstructionDataFormats/TrackParametrization.h"
2830
#include "Common/Core/RecoDecay.h"
2931
#include "Common/Core/trackUtilities.h"
3032
#include "PWGLF/DataModel/LFStrangenessTables.h"
@@ -73,10 +75,21 @@ struct strangenessFilter {
7375
HistogramRegistry QAHistosTriggerParticles{"QAHistosTriggerParticles", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
7476
HistogramRegistry QAHistosStrangenessTracking{"QAHistosStrangenessTracking", {}, OutputObjHandlingPolicy::AnalysisObject, false, true};
7577
HistogramRegistry EventsvsMultiplicity{"EventsvsMultiplicity", {}, OutputObjHandlingPolicy::AnalysisObject, true, true};
76-
OutputObj<TH1D> hProcessedEvents{TH1D("hProcessedEvents", "Strangeness - event filtered;; Number of events", 16, -1., 15.)};
78+
OutputObj<TH1D> hProcessedEvents{TH1D("hProcessedEvents", "Strangeness - event filtered;; Number of events", 17, -1., 16.)};
7779
OutputObj<TH1F> hCandidate{TH1F("hCandidate", "; Candidate pass selection; Number of events", 30, 0., 30.)};
7880
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.)};
7981

82+
// Dedicated selection criteria for lambda-lambda
83+
Configurable<float> cfgPIDPi{"cfgPIDPi", 3.0, "pion PID selection"};
84+
Configurable<float> cfgPIDPr{"cfgPIDPr", 3.0, "proton PID selection"};
85+
Configurable<float> cfgLambdaMassWindow{"cfgLambdaMassWindow", 0.01, "window for lambda mass selection"};
86+
Configurable<float> cfgCompV0Rej{"cfgCompV0Rej", 0.01, "competing V0 rejection"};
87+
88+
Configurable<float> cfgMinCPAV0V0{"cfgMinCPAV0V0", 0.8, "minimum CPA of v0v0"};
89+
Configurable<float> cfgMaxRadiusV0V0{"cfgMaxRadiusV0V0", 10.0, "maximum radius of v0v0"};
90+
Configurable<float> cfgMaxDistanceV0V0{"cfgMaxDistanceV0V0", 5.0, "maximum distance of v0v0"};
91+
Configurable<float> cfgMaxDCAV0V0{"cfgMaxDCAV0V0", 5.0, "maximum DCA of v0v0"};
92+
8093
// Selection criteria for cascades
8194
Configurable<bool> useCascadeMomentumAtPrimVtx{"useCascadeMomentumAtPrimVtx", false, "use cascade momentum at PV"};
8295
Configurable<bool> doextraQA{"doextraQA", 1, "do extra QA"};
@@ -177,6 +190,50 @@ struct strangenessFilter {
177190
{
178191
return track.pt() > hMinPt && std::abs(track.eta()) < hEta && track.tpcNClsCrossedRows() >= tpcmincrossedrows && track.tpcCrossedRowsOverFindableCls() >= 0.8f && track.tpcChi2NCl() <= 4.f && track.itsChi2NCl() <= 36.f && (track.itsClusterMap() & 0x7) != 0;
179192
}
193+
/// lambda-lambda analysis dedicated selections
194+
float getV0V0DCA(TVector3 v01pos, TVector3 v01mom, TVector3 v02pos, TVector3 v02mom)
195+
{
196+
TVector3 posdiff = v02pos - v01pos;
197+
TVector3 cross = v01mom.Cross(v02mom);
198+
TVector3 dcaVec = (posdiff.Dot(cross) / cross.Mag2()) * cross;
199+
return dcaVec.Mag();
200+
}
201+
float getV0V0CPA(TVector3 v01mom, TVector3 v02mom)
202+
{
203+
return v01mom.Dot(v02mom) / (v01mom.Mag() * v02mom.Mag());
204+
}
205+
float getV0V0Distance(TVector3 v01pos, TVector3 v02pos)
206+
{
207+
TVector3 posdiff = v02pos - v01pos;
208+
return posdiff.Mag();
209+
}
210+
float getV0V0Radius(TVector3 v01pos, TVector3 v01mom, TVector3 v02pos, TVector3 v02mom)
211+
{
212+
TVector3 posdiff = v02pos - v01pos;
213+
v01mom *= 1./v01mom.Mag();
214+
v02mom *= 1./v02mom.Mag();
215+
float dd = 1. - TMath::Power(v01mom.Dot(v02mom), 2);
216+
if (dd < 1e-5)
217+
return 999;
218+
float tt = posdiff.Dot(v01mom - v01mom.Dot(v02mom) * v02mom) / dd;
219+
float ss = -posdiff.Dot(v02mom - v01mom.Dot(v02mom) * v01mom) / dd;
220+
TVector3 radVec = v01pos + v02pos + tt * v01mom + ss * v02mom;
221+
radVec *= 0.5;
222+
return radVec.Mag();
223+
}
224+
bool isSelectedV0V0(TVector3 v01pos, TVector3 v01mom, TVector3 v02pos, TVector3 v02mom)
225+
{
226+
if (getV0V0DCA(v01pos, v01mom, v02pos, v02mom) > cfgMaxDCAV0V0)
227+
return false;
228+
if (getV0V0CPA(v01mom, v02mom) < cfgMinCPAV0V0)
229+
return false;
230+
if (getV0V0Distance(v01pos, v02pos) > cfgMaxDistanceV0V0)
231+
return false;
232+
if (getV0V0Radius(v01pos, v01mom, v02pos, v02mom) > cfgMaxRadiusV0V0)
233+
return false;
234+
235+
return true;
236+
}
180237

181238
void init(o2::framework::InitContext&)
182239
{
@@ -223,6 +280,7 @@ struct strangenessFilter {
223280
hProcessedEvents->GetXaxis()->SetBinLabel(14, aod::filtering::OmegaHighMult::columnLabel());
224281
hProcessedEvents->GetXaxis()->SetBinLabel(15, aod::filtering::DoubleOmega::columnLabel());
225282
hProcessedEvents->GetXaxis()->SetBinLabel(16, aod::filtering::OmegaXi::columnLabel());
283+
hProcessedEvents->GetXaxis()->SetBinLabel(17, "LL");
226284

227285
hCandidate->GetXaxis()->SetBinLabel(1, "All");
228286
hCandidate->GetXaxis()->SetBinLabel(2, "Has_V0");
@@ -447,14 +505,14 @@ struct strangenessFilter {
447505

448506
void fillTriggerTable(bool keepEvent[])
449507
{
450-
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]);
508+
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]);
451509
}
452510

453-
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&, aod::BCs const&, aod::FT0s const& /*ft0s*/)
511+
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*/)
454512
{
455513
// Is event good? [0] = Omega, [1] = high-pT hadron + Omega, [2] = 2Xi, [3] = 3Xi, [4] = 4Xi, [5] single-Xi, [6] Omega with high radius
456514
// [7] tracked Xi, [8] tracked Omega, [9] Omega + high mult event
457-
bool keepEvent[12]{}; // explicitly zero-initialised
515+
bool keepEvent[13]{}; // explicitly zero-initialised
458516
std::vector<std::array<int64_t, 2>> v0sFromOmegaID;
459517
std::vector<std::array<int64_t, 2>> v0sFromXiID;
460518

@@ -571,6 +629,70 @@ struct strangenessFilter {
571629
const auto primaryVertex = getPrimaryVertex(collision);
572630
o2::dataformats::DCA impactParameterTrk;
573631

632+
for (auto& v00 : v0Base) { // loop over v0
633+
hCandidate->Fill(0.5); // All candidates
634+
635+
const auto posTrack0 = v00.posTrack_as<TrackCandidates>();
636+
const auto negTrack0 = v00.negTrack_as<TrackCandidates>();
637+
638+
auto trackParPos0 = getTrackParCov(posTrack0);
639+
auto trackParNeg0 = getTrackParCov(negTrack0);
640+
641+
if (!mStraHelper.buildV0Candidate(v00.collisionId(), pvPos[0], pvPos[1], pvPos[2], posTrack0, negTrack0, trackParPos0, trackParNeg0)) {
642+
continue;
643+
}
644+
int Tag = 0;
645+
if (cfgPIDPi > std::fabs(negTrack0.tpcNSigmaPi()) && cfgPIDPr > std::fabs(posTrack0.tpcNSigmaPr())) {
646+
if (cfgLambdaMassWindow > std::fabs(mStraHelper.v0.massLambda - o2::constants::physics::MassLambda0) || cfgCompV0Rej < std::fabs(mStraHelper.v0.massK0Short - o2::constants::physics::MassLambda0)) {
647+
Tag++;
648+
}
649+
}
650+
if (cfgPIDPi > std::fabs(posTrack0.tpcNSigmaPi()) && cfgPIDPr > std::fabs(negTrack0.tpcNSigmaPr())) {
651+
if (cfgLambdaMassWindow > std::fabs(mStraHelper.v0.massAntiLambda - o2::constants::physics::MassLambda0) || cfgCompV0Rej < std::fabs(mStraHelper.v0.massK0Short - o2::constants::physics::MassLambda0)) {
652+
Tag++;
653+
}
654+
}
655+
if (Tag != 1) { // Select when only one option is satisfied
656+
continue;
657+
}
658+
TVector3 v00pos(mStraHelper.v0.position[0], mStraHelper.v0.position[1], mStraHelper.v0.position[2]);
659+
TVector3 v00mom(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1], mStraHelper.v0.momentum[2]);
660+
661+
for (auto& v01 : v0Base) {
662+
if (v00.globalIndex() <= v01.globalIndex()) {
663+
continue;
664+
}
665+
666+
const auto posTrack1 = v01.posTrack_as<TrackCandidates>();
667+
const auto negTrack1 = v01.negTrack_as<TrackCandidates>();
668+
669+
auto trackParPos1 = getTrackParCov(posTrack1);
670+
auto trackParNeg1 = getTrackParCov(negTrack1);
671+
672+
if (!mStraHelper.buildV0Candidate(v01.collisionId(), pvPos[0], pvPos[1], pvPos[2], posTrack1, negTrack1, trackParPos1, trackParNeg1)) {
673+
continue;
674+
}
675+
Tag = 0;
676+
if (cfgPIDPi > std::fabs(negTrack1.tpcNSigmaPi()) && cfgPIDPr > std::fabs(posTrack1.tpcNSigmaPr())) {
677+
if (cfgLambdaMassWindow > std::fabs(mStraHelper.v0.massLambda - o2::constants::physics::MassLambda0) || cfgCompV0Rej < std::fabs(mStraHelper.v0.massK0Short - o2::constants::physics::MassLambda0)) {
678+
Tag++;
679+
}
680+
}
681+
if (cfgPIDPi > std::fabs(posTrack1.tpcNSigmaPi()) && cfgPIDPr > std::fabs(negTrack1.tpcNSigmaPr())) {
682+
if (cfgLambdaMassWindow > std::fabs(mStraHelper.v0.massAntiLambda - o2::constants::physics::MassLambda0) || cfgCompV0Rej < std::fabs(mStraHelper.v0.massK0Short - o2::constants::physics::MassLambda0)) {
683+
Tag++;
684+
}
685+
}
686+
if (posTrack0.globalIndex() == posTrack1.globalIndex() || posTrack0.globalIndex() == negTrack1.globalIndex() || negTrack0.globalIndex() == posTrack1.globalIndex() || negTrack0.globalIndex() == negTrack1.globalIndex()) {
687+
continue;
688+
}
689+
TVector3 v01pos(mStraHelper.v0.position[0], mStraHelper.v0.position[1], mStraHelper.v0.position[2]);
690+
TVector3 v01mom(mStraHelper.v0.momentum[0], mStraHelper.v0.momentum[1], mStraHelper.v0.momentum[2]);
691+
692+
keepEvent[12] = true;
693+
}
694+
}
695+
574696
for (auto& casc : cascadesBase) { // loop over cascades
575697
hCandidate->Fill(0.5); // All candidates
576698

@@ -1121,7 +1243,9 @@ struct strangenessFilter {
11211243
if (keepEvent[11]) {
11221244
hProcessedEvents->Fill(14.5);
11231245
}
1124-
1246+
if (keepEvent[12]) {
1247+
hProcessedEvents->Fill(15.5);
1248+
}
11251249
// Filling the table
11261250
fillTriggerTable(keepEvent);
11271251
}

EventFiltering/filterTables.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ DECLARE_SOA_COLUMN(TrackedXi, hasTrackedXi, bool); //! at least 1
154154
DECLARE_SOA_COLUMN(TrackedOmega, hasTrackedOmega, bool); //! at least 1 tracked Omega
155155
DECLARE_SOA_COLUMN(Tracked3Body, hasTracked3Body, bool); //! at least 1 tracked 3Body
156156
DECLARE_SOA_COLUMN(OmegaHighMult, hasOmegaHighMult, bool); //! at least 1 Omega + high-mult event
157+
DECLARE_SOA_COLUMN(LambdaLambda, lambdaLambda, bool); //! at least 2 lambda satisfying selection
157158

158159
// F1-proton
159160
DECLARE_SOA_COLUMN(TriggerEventF1Proton, triggereventf1proton, bool); //! F1 - proton femto trigger event
@@ -295,7 +296,7 @@ using FullJetFilter = FullJetFilters::iterator;
295296

296297
// strangeness (lf)
297298
DECLARE_SOA_TABLE(StrangenessFilters, "AOD", "LFStrgFilters", //!
298-
filtering::Omega, filtering::hadronOmega, filtering::DoubleXi, filtering::TripleXi, filtering::QuadrupleXi, filtering::SingleXiYN, filtering::OmegaLargeRadius, filtering::TrackedXi, filtering::TrackedOmega, filtering::OmegaHighMult, filtering::DoubleOmega, filtering::OmegaXi);
299+
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);
299300

300301
using StrangenessFilter = StrangenessFilters::iterator;
301302

0 commit comments

Comments
 (0)