|
15 | 15 | /// \since June 1, 2021 |
16 | 16 |
|
17 | 17 | #include <cmath> |
| 18 | +#include "TVector3.h" |
18 | 19 | #include "CCDB/BasicCCDBManager.h" |
19 | 20 | #include "DataFormatsParameters/GRPMagField.h" |
20 | 21 | #include "DataFormatsParameters/GRPObject.h" |
|
25 | 26 | #include "Framework/AnalysisDataModel.h" |
26 | 27 | #include "Framework/ASoAHelpers.h" |
27 | 28 | #include "ReconstructionDataFormats/Track.h" |
| 29 | +#include "ReconstructionDataFormats/TrackParametrization.h" |
28 | 30 | #include "Common/Core/RecoDecay.h" |
29 | 31 | #include "Common/Core/trackUtilities.h" |
30 | 32 | #include "PWGLF/DataModel/LFStrangenessTables.h" |
@@ -73,10 +75,21 @@ struct strangenessFilter { |
73 | 75 | HistogramRegistry QAHistosTriggerParticles{"QAHistosTriggerParticles", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; |
74 | 76 | HistogramRegistry QAHistosStrangenessTracking{"QAHistosStrangenessTracking", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; |
75 | 77 | 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.)}; |
77 | 79 | OutputObj<TH1F> hCandidate{TH1F("hCandidate", "; Candidate pass selection; Number of events", 30, 0., 30.)}; |
78 | 80 | 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.)}; |
79 | 81 |
|
| 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 | + |
80 | 93 | // Selection criteria for cascades |
81 | 94 | Configurable<bool> useCascadeMomentumAtPrimVtx{"useCascadeMomentumAtPrimVtx", false, "use cascade momentum at PV"}; |
82 | 95 | Configurable<bool> doextraQA{"doextraQA", 1, "do extra QA"}; |
@@ -177,6 +190,50 @@ struct strangenessFilter { |
177 | 190 | { |
178 | 191 | 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; |
179 | 192 | } |
| 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 | + } |
180 | 237 |
|
181 | 238 | void init(o2::framework::InitContext&) |
182 | 239 | { |
@@ -223,6 +280,7 @@ struct strangenessFilter { |
223 | 280 | hProcessedEvents->GetXaxis()->SetBinLabel(14, aod::filtering::OmegaHighMult::columnLabel()); |
224 | 281 | hProcessedEvents->GetXaxis()->SetBinLabel(15, aod::filtering::DoubleOmega::columnLabel()); |
225 | 282 | hProcessedEvents->GetXaxis()->SetBinLabel(16, aod::filtering::OmegaXi::columnLabel()); |
| 283 | + hProcessedEvents->GetXaxis()->SetBinLabel(17, "LL"); |
226 | 284 |
|
227 | 285 | hCandidate->GetXaxis()->SetBinLabel(1, "All"); |
228 | 286 | hCandidate->GetXaxis()->SetBinLabel(2, "Has_V0"); |
@@ -447,14 +505,14 @@ struct strangenessFilter { |
447 | 505 |
|
448 | 506 | void fillTriggerTable(bool keepEvent[]) |
449 | 507 | { |
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]); |
451 | 509 | } |
452 | 510 |
|
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*/) |
454 | 512 | { |
455 | 513 | // Is event good? [0] = Omega, [1] = high-pT hadron + Omega, [2] = 2Xi, [3] = 3Xi, [4] = 4Xi, [5] single-Xi, [6] Omega with high radius |
456 | 514 | // [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 |
458 | 516 | std::vector<std::array<int64_t, 2>> v0sFromOmegaID; |
459 | 517 | std::vector<std::array<int64_t, 2>> v0sFromXiID; |
460 | 518 |
|
@@ -571,6 +629,70 @@ struct strangenessFilter { |
571 | 629 | const auto primaryVertex = getPrimaryVertex(collision); |
572 | 630 | o2::dataformats::DCA impactParameterTrk; |
573 | 631 |
|
| 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 | + |
574 | 696 | for (auto& casc : cascadesBase) { // loop over cascades |
575 | 697 | hCandidate->Fill(0.5); // All candidates |
576 | 698 |
|
@@ -1121,7 +1243,9 @@ struct strangenessFilter { |
1121 | 1243 | if (keepEvent[11]) { |
1122 | 1244 | hProcessedEvents->Fill(14.5); |
1123 | 1245 | } |
1124 | | - |
| 1246 | + if (keepEvent[12]) { |
| 1247 | + hProcessedEvents->Fill(15.5); |
| 1248 | + } |
1125 | 1249 | // Filling the table |
1126 | 1250 | fillTriggerTable(keepEvent); |
1127 | 1251 | } |
|
0 commit comments