1515// / \author Your Name (your.email@cern.ch)
1616// / \since April 2025
1717
18+ #include " PWGCF/FemtoWorld/Core/FemtoWorldMath.h"
1819#include " PWGLF/DataModel/EPCalibrationTables.h"
1920#include " PWGLF/DataModel/LFhe3HadronTables.h"
2021#include " PWGLF/Utils/svPoolCreator.h"
@@ -181,6 +182,8 @@ struct He3HadCandidate {
181182
182183 // collision information
183184 int32_t collisionID = 0 ;
185+
186+ float kstarfem = 1 .f;
184187};
185188
186189struct he3HadronFemto {
@@ -195,10 +198,12 @@ struct he3HadronFemto {
195198 Configurable<float > settingCutRigidityMinHe3{" settingCutRigidityMinHe3" , 0 .8f , " Minimum rigidity for He3" };
196199 Configurable<float > settingCutEta{" settingCutEta" , 0 .9f , " Eta cut on daughter track" };
197200 Configurable<float > settingCutDCAxy{" settingCutDCAxy" , 2 .0f , " DCAxy range for tracks" };
198- Configurable<float > settingCutDCAz{" settingCutDCAz" , 2 .0f , " DCAz range for tracks" };
201+ Configurable<float > settingCutDCAz{" settingCutDCAz" , 3 .0f , " DCAz range for tracks" };
199202 Configurable<float > settingCutChi2tpcLow{" settingCutChi2tpcLow" , 0 .5f , " Low cut on TPC chi2" };
200203 Configurable<float > settingCutInvMass{" settingCutInvMass" , 0 .0f , " Invariant mass upper limit" };
201204 Configurable<float > settingCutPtMinhe3Had{" settingCutPtMinhe3Had" , 0 .0f , " Minimum PT cut on he3Had4" };
205+ Configurable<float > settingCutPtMinHad{" settingCutPtMinHad" , 0 .0f , " Minimum PT cut on Hadron" };
206+ Configurable<float > settingCutPtMaxHad{" settingCutPtMaxHad" , 0 .0f , " Maximum PT cut on Hadron" };
202207 Configurable<float > settingCutClSizeItsHe3{" settingCutClSizeItsHe3" , 4 .0f , " Minimum ITS cluster size for He3" };
203208 Configurable<float > settingCutNCls{" settingCutNCls" , 5 .0f , " Minimum ITS Ncluster for tracks" };
204209 Configurable<float > settingCutChi2NClITS{" settingCutChi2NClITS" , 36 .f , " Maximum ITS Chi2 for tracks" };
@@ -287,6 +292,14 @@ struct he3HadronFemto {
287292 {" h2NsigmaHadronTPC_preselection" , " NsigmaHe3 TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(had)" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {400 , -10 .0f , 10 .0f }}}},
288293 {" h2NsigmaHadronTOF" , " NsigmaHadron TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(had)" , {HistType::kTH2F , {{20 , -5 .0f , 5 .0f }, {200 , -5 .0f , 5 .0f }}}},
289294 {" h2NsigmaHadronTOF_preselection" , " NsigmaHadron TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(had)" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {400 , -10 .0f , 10 .0f }}}},
295+ {" hKstarLSmatter" , " ;kStar (GeV/c)" , {HistType::kTH1F , {{300 , 0 .0f , 3 .0f }}}},
296+ {" hKstarLSantimatter" , " ;kStar (GeV/c)" , {HistType::kTH1F , {{300 , 0 .0f , 3 .0f }}}},
297+ {" hKstarUSmatter" , " ;kStar (GeV/c)" , {HistType::kTH1F , {{300 , 0 .0f , 3 .0f }}}},
298+ {" hKstarUSantimatter" , " ;kStar (GeV/c)" , {HistType::kTH1F , {{300 , 0 .0f , 3 .0f }}}},
299+ {" hKstarLSmatter_femto" , " ;kStar (GeV/c)" , {HistType::kTH1F , {{300 , 0 .0f , 3 .0f }}}},
300+ {" hKstarLSantimatter_femto" , " ;kStar (GeV/c)" , {HistType::kTH1F , {{300 , 0 .0f , 3 .0f }}}},
301+ {" hKstarUSmatter_femto" , " ;kStar (GeV/c)" , {HistType::kTH1F , {{300 , 0 .0f , 3 .0f }}}},
302+ {" hKstarUSantimatter_femto" , " ;kStar (GeV/c)" , {HistType::kTH1F , {{300 , 0 .0f , 3 .0f }}}},
290303 },
291304 OutputObjHandlingPolicy::AnalysisObject,
292305 false ,
@@ -427,7 +440,8 @@ struct he3HadronFemto {
427440 candidate.tpcNClsCrossedRows () < crossedRowsToFindableRatio * candidate.tpcNClsFindable () ||
428441 candidate.tpcChi2NCl () > maxChi2NCl ||
429442 candidate.tpcChi2NCl () < settingCutChi2tpcLow ||
430- candidate.itsChi2NCl () > settingCutChi2NClITS) {
443+ candidate.itsChi2NCl () > settingCutChi2NClITS || candidate.dcaXY () > settingCutDCAxy ||
444+ candidate.dcaZ () > settingCutDCAz) {
431445 return false ;
432446 }
433447
@@ -608,6 +622,9 @@ struct he3HadronFemto {
608622 return false ;
609623 }
610624
625+ if (he3Hadcand.recoPtHad () < settingCutPtMinHad || he3Hadcand.recoPtHad () > settingCutPtMaxHad)
626+ return false ;
627+
611628 he3Hadcand.signHe3 = trackHe3.sign ();
612629 he3Hadcand.signHad = trackHad.sign ();
613630 if (!settingEnableDCAfitter) {
@@ -676,6 +693,7 @@ struct he3HadronFemto {
676693 beta = std::min (1 .f - 1 .e -6f , std::max (1 .e -4f , beta)); // / sometimes beta > 1 or < 0, to be checked
677694 he3Hadcand.massTOFHad = trackHad.tpcInnerParam () * std::sqrt (1 .f / (beta * beta) - 1 .f );
678695 }
696+ he3Hadcand.kstarfem = o2::analysis::femtoWorld::FemtoWorldMath::getkstar (trackHad, o2::constants::physics::MassPiPlus, trackHe3, o2::constants::physics::MassHelium3);
679697
680698 return true ;
681699 }
@@ -839,6 +857,80 @@ struct he3HadronFemto {
839857 }
840858
841859 // ==================================================================================================================
860+ double computePrTPCnsig (double InnerParamTPCHad, double SignalTPCHad)
861+ {
862+ double m_BBparamsProton[6 ] = {-54.42066571222577 , 0.2857381250239097 , 1.247140602468868 , 0.6297483918147729 , 2.985438833884555 , 0.09 };
863+
864+ float TPCinnerParam = InnerParamTPCHad;
865+ float expTPCSignal = o2::tpc::BetheBlochAleph ((TPCinnerParam / 0.9382721 ), m_BBparamsProton[0 ], m_BBparamsProton[1 ], m_BBparamsProton[2 ], m_BBparamsProton[3 ], m_BBparamsProton[4 ]);
866+ double resoTPC{expTPCSignal * m_BBparamsProton[5 ]};
867+ return ((SignalTPCHad - expTPCSignal) / resoTPC);
868+ }
869+
870+ double tofNSigmaCalculation (double MassTOFHad, double ptHad)
871+ {
872+ double fExpTOFMassHad = 0.9487 ; // Proton mass in TOF
873+ const float kp0 = 1.22204e-02 ;
874+ const float kp1 = 7.48467e-01 ;
875+
876+ double fSigmaTOFMassHad = (kp0 * TMath::Exp (kp1 * TMath::Abs (ptHad))) * fExpTOFMassHad ;
877+ double fNSigmaTOFHad = (MassTOFHad - fExpTOFMassHad ) / fSigmaTOFMassHad ;
878+ return fNSigmaTOFHad ;
879+ }
880+
881+ static float computeKstar (const He3HadCandidate& he3Hadcand)
882+ {
883+ const float massHe = o2::constants::physics::MassHelium3;
884+ const float massHad = o2::constants::physics::MassPiPlus;
885+
886+ const ROOT::Math::PtEtaPhiMVector He (std::abs (he3Hadcand.recoPtHe3 ()), he3Hadcand.recoEtaHe3 (), he3Hadcand.recoPhiHe3 (), massHe);
887+ const ROOT::Math::PtEtaPhiMVector Had (std::abs (he3Hadcand.recoPtHad ()), he3Hadcand.recoEtaHad (), he3Hadcand.recoPhiHad (), massHad);
888+ const ROOT::Math::PtEtaPhiMVector trackSum = He + Had;
889+
890+ const float beta = trackSum.Beta ();
891+ const float betax = beta * std::cos (trackSum.Phi ()) * std::sin (trackSum.Theta ());
892+ const float betay = beta * std::sin (trackSum.Phi ()) * std::sin (trackSum.Theta ());
893+ const float betaz = beta * std::cos (trackSum.Theta ());
894+
895+ ROOT::Math::PxPyPzMVector HeCMS (He);
896+ ROOT::Math::PxPyPzMVector HadCMS (Had);
897+
898+ const ROOT::Math::Boost boostPRF = ROOT::Math::Boost (-betax, -betay, -betaz);
899+ HeCMS = boostPRF (HeCMS);
900+ HadCMS = boostPRF (HadCMS);
901+
902+ const ROOT::Math::PxPyPzMVector RelKstar = HeCMS - HadCMS;
903+ return 0.5 * RelKstar.P ();
904+ }
905+
906+ void fillKstar (const He3HadCandidate& he3Hadcand)
907+ {
908+ double PrTPCnsigma = computePrTPCnsig (he3Hadcand.momHadTPC , he3Hadcand.tpcSignalHad );
909+ double PrTOFnsigma = tofNSigmaCalculation (he3Hadcand.massTOFHad , he3Hadcand.recoPtHad ());
910+ if (abs (PrTPCnsigma) < 3 )
911+ return ;
912+ if (abs (PrTOFnsigma) < 3 )
913+ return ;
914+
915+ float kstar = computeKstar (he3Hadcand);
916+ if (he3Hadcand.isBkgUS == 0 ) {
917+ if (he3Hadcand.recoPtHe3 () > 0 ) {
918+ mQaRegistry .fill (HIST (" hKstarLSmatter" ), kstar);
919+ mQaRegistry .fill (HIST (" hKstarLSmatter_femto" ), he3Hadcand.kstarfem );
920+ } else {
921+ mQaRegistry .fill (HIST (" hKstarLSantimatter" ), kstar);
922+ mQaRegistry .fill (HIST (" hKstarLSantimatter_femto" ), he3Hadcand.kstarfem );
923+ }
924+ } else {
925+ if (he3Hadcand.recoPtHe3 () > 0 ) {
926+ mQaRegistry .fill (HIST (" hKstarUSmatter" ), kstar);
927+ mQaRegistry .fill (HIST (" hKstarUSmatter_femto" ), he3Hadcand.kstarfem );
928+ } else {
929+ mQaRegistry .fill (HIST (" hKstarUSantimatter" ), kstar);
930+ mQaRegistry .fill (HIST (" hKstarUSantimatter_femto" ), he3Hadcand.kstarfem );
931+ }
932+ }
933+ }
842934
843935 template <typename Tcollisions, typename Ttracks>
844936 void fillPairs (const Tcollisions& collisions, const Ttracks& tracks, const bool isMixedEvent)
@@ -853,6 +945,7 @@ struct he3HadronFemto {
853945 if (!fillCandidateInfo (heTrack, hadTrack, collBracket, collisions, he3Hadcand, tracks, isMixedEvent)) {
854946 continue ;
855947 }
948+ fillKstar (he3Hadcand);
856949 fillHistograms (he3Hadcand);
857950 auto collision = collisions.rawIteratorAt (he3Hadcand.collisionID );
858951 fillTable (he3Hadcand, collision, /* isMC*/ false );
0 commit comments