@@ -103,6 +103,23 @@ float CalculateDCAStraightToPV(float X, float Y, float Z, float Px, float Py, fl
103103{
104104 return std::sqrt ((std::pow ((pvY - Y) * Pz - (pvZ - Z) * Py, 2 ) + std::pow ((pvX - X) * Pz - (pvZ - Z) * Px, 2 ) + std::pow ((pvX - X) * Py - (pvY - Y) * Px, 2 )) / (Px * Px + Py * Py + Pz * Pz));
105105}
106+ float kineFactor (std::array<float , 3 > const & momA, std::array<float , 3 > const & momB, std::array<float , 3 > const & momC, float const & massB, float const & massC, bool const & reso)
107+ {
108+ float invMass = invMass2Body (momA, momC, momB, massC, massB);
109+ float ptC = std::hypot (momC[0 ], momC[1 ]);
110+ float ptB = std::hypot (momB[0 ], momB[1 ]);
111+ float p2C = momC[0 ] * momC[0 ] + momC[1 ] * momC[1 ] + momC[2 ] * momC[2 ];
112+ float p2B = momB[0 ] * momB[0 ] + momB[1 ] * momB[1 ] + momB[2 ] * momB[2 ];
113+ float eC = RecoDecay::sqrtSumOfSquares (momC[0 ], momC[1 ], momC[2 ], massC);
114+ float eB = RecoDecay::sqrtSumOfSquares (momB[0 ], momB[1 ], momB[2 ], massB);
115+ float pCpB = momC[0 ] * momB[0 ] + momC[1 ] * momB[1 ] + momC[2 ] * momB[2 ];
116+ float kineC = (eB * p2C / eC / ptC) - pCpB / ptC;
117+ float kineB = (eC * p2B / eB / ptB) - pCpB / ptB;
118+ if (reso) {
119+ return std::hypot (kineC, kineB) / invMass;
120+ }
121+ return (kineC + kineB) / invMass;
122+ }
106123} // namespace
107124
108125struct CandidateV0 {
@@ -162,10 +179,13 @@ struct LFStrangeTreeCreator {
162179
163180 ConfigurableAxis centAxis{" centAxis" , {106 , 0 , 106 }, " binning for the centrality" };
164181 ConfigurableAxis zVtxAxis{" zVtxBins" , {100 , -20 .f , 20 .f }, " Binning for the vertex z in cm" };
182+ ConfigurableAxis etaAxis{" etaAxis" , {8 , -0 .8f , 0 .8f }, " binning for pseudorapidity" };
183+ ConfigurableAxis massKineAxis{" kineAxis" , {3000 , -3 .f , 3 .f }, " binning for the kinematic-transofrmed mass shift distributions" };
165184
166185 // binning of (anti)lambda mass QA histograms
167186 ConfigurableAxis massLambdaAxis{" massLambdaAxis" , {400 , o2::constants::physics::MassLambda0 - 0 .03f , o2::constants::physics::MassLambda0 + 0 .03f }, " binning for the lambda invariant-mass" };
168187 ConfigurableAxis massXiAxis{" massXiAxis" , {400 , o2::constants::physics::MassXiMinus - 0 .05f , o2::constants::physics::MassXiMinus + 0 .05f }, " binning for the Xi invariant-mass" };
188+ ConfigurableAxis massK0sAxis{" massK0sAxis" , {400 , o2::constants::physics::MassK0 - 0 .1f , o2::constants::physics::MassK0 + 0 .1f }, " binning for the K0s invariant-mass" };
169189
170190 Configurable<float > zVtxMax{" zVtxMax" , 10 .0f , " maximum z position of the primary vertex" };
171191 Configurable<float > etaMax{" etaMax" , 0 .8f , " maximum eta" };
@@ -184,6 +204,8 @@ struct LFStrangeTreeCreator {
184204 Configurable<float > v0trackNsharedClusTpc{" v0trackNsharedClusTpc" , 5 , " Maximum number of shared TPC clusters for V0 daughter" };
185205 Configurable<float > vetoMassK0Short{" vetoMassK0Short" , 0 .01f , " veto for V0 compatible with K0s mass" };
186206 Configurable<float > v0radiusMax{" v0radiusMax" , 100 .f , " maximum V0 radius eccepted" };
207+ Configurable<float > v0alphaMax{" v0alphaMax" , 10 .f , " maximum Armenteros alpha (longitdinal momentum asymmetry)" };
208+ Configurable<float > v0qtMin{" v0qtMin" , 0 .f , " minimum Armenteros qt (transverse momentum)" };
187209
188210 Configurable<float > v0setting_dcav0dau{" v0setting_dcav0dau" , 0 .5f , " DCA V0 Daughters" };
189211 Configurable<float > v0setting_dcav0pv{" v0setting_dcav0pv" , 1 .f , " DCA V0 to Pv" };
@@ -282,6 +304,11 @@ struct LFStrangeTreeCreator {
282304 // v0 QA
283305 histos.add <TH3>(" QA/massLambda" , " ;Centrality (%);#it{p}_{T} (GeV/#it{c});#it{M}(p + #pi^{-}) (GeV/#it{c}^{2});Entries" , HistType::kTH3F , {centAxis, momAxis, massLambdaAxis});
284306 histos.add <TH3>(" QA/massXi" , " ;Centrality (%);#it{p}_{T} (GeV/#it{c});#it{M}(#Lambda + #pi^{-}) (GeV/#it{c}^{2});Entries" , HistType::kTH3F , {centAxis, momAxis, massXiAxis});
307+ histos.add <TH2>(" QA/massK0s" , " ;#it{p}_{T} (GeV/#it{c});#it{M}(#pi^{+} + #pi^{-}) (GeV/#it{c}^{2});Entries" , HistType::kTH2F , {momAxis, massK0sAxis});
308+
309+ // histograms for momentum shift/resolution extraction
310+ histos.add <TH3>(" massKineBias" , " ;#eta;#it{p}_{T} (GeV/#it{c});#delta#it{M}/#Sigma_{i}#partial#it{M}/#partial#it{p}^{i}_{T}" , HistType::kTH3F , {etaAxis, momAxis, massKineAxis});
311+ histos.add <TH3>(" massKineReso" , " ;#eta;#it{p}_{T} (GeV/#it{c});#delta#it{M}/#Sigma_{i}(#partial#it{M}/#partial#it{p}^{i}_{T})^{2}" , HistType::kTH3F , {etaAxis, momAxis, massKineAxis});
285312 }
286313
287314 template <class C , class T >
@@ -335,12 +362,21 @@ struct LFStrangeTreeCreator {
335362 }
336363
337364 auto alpha = alphaAP (momV0, momPos, momNeg);
365+ if (std::abs (alpha) > v0alphaMax) {
366+ continue ;
367+ }
368+
338369 bool matter = alpha > 0 ;
339370 auto massPos = matter ? o2::constants::physics::MassProton : o2::constants::physics::MassPionCharged;
340371 auto massNeg = matter ? o2::constants::physics::MassPionCharged : o2::constants::physics::MassProton;
341372 auto mLambda = invMass2Body (momV0, momPos, momNeg, massPos, massNeg);
342373 auto mK0Short = invMass2Body (momV0, momPos, momNeg, o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged);
343374
375+ auto qt = qtAP (momV0, momPos);
376+ if (std::abs (qt) < v0qtMin) {
377+ continue ;
378+ }
379+
344380 // pid selections
345381 auto nSigmaTPCPos = matter ? posTrack.tpcNSigmaPr () : posTrack.tpcNSigmaPi ();
346382 auto nSigmaTPCNeg = matter ? negTrack.tpcNSigmaPi () : negTrack.tpcNSigmaPr ();
@@ -416,7 +452,16 @@ struct LFStrangeTreeCreator {
416452 if (std::abs (mLambda - o2::constants::physics::MassLambda0) > lambdaMassCut) { // for QA histograms
417453 continue ;
418454 }
455+
456+ float ptPos = std::hypot (momPos[0 ], momPos[1 ]);
457+ float deltaMass = mK0Short - o2::constants::physics::MassK0;
458+ float massKineBias = deltaMass / kineFactor (momV0, momPos, momNeg, o2::constants::physics::MassPiMinus, o2::constants::physics::MassPiMinus, false );
459+ float massKineReso = deltaMass / kineFactor (momV0, momPos, momNeg, o2::constants::physics::MassPiMinus, o2::constants::physics::MassPiMinus, true );
460+
419461 histos.fill (HIST (" QA/massLambda" ), centrality, ptV0, mLambda );
462+ histos.fill (HIST (" QA/massK0s" ), ptV0, mK0Short );
463+ histos.fill (HIST (" massKineBias" ), ptPos, massKineBias);
464+ histos.fill (HIST (" massKineReso" ), ptPos, massKineReso);
420465
421466 CandidateV0 candV0;
422467 candV0.pt = matter > 0 . ? ptV0 : -ptV0;
@@ -427,7 +472,7 @@ struct LFStrangeTreeCreator {
427472 candV0.radius = radiusV0;
428473 candV0.cpa = cosPA;
429474 candV0.alphaAP = alpha;
430- candV0.qtAP = qtAP (momV0, momPos) ;
475+ candV0.qtAP = qt ;
431476 candV0.trackv0 = fitter.createParentTrackParCov ();
432477 candV0.mompos = std::array{momPos[0 ], momPos[1 ], momPos[2 ]};
433478 candV0.momneg = std::array{momNeg[0 ], momNeg[1 ], momNeg[2 ]};
0 commit comments