Skip to content

Commit 0374ef4

Browse files
authored
[PWGLF] add kstar function (#13015)
1 parent 077210d commit 0374ef4

File tree

1 file changed

+95
-2
lines changed

1 file changed

+95
-2
lines changed

PWGLF/TableProducer/Nuspex/he3HadronFemto.cxx

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
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

186189
struct 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

Comments
 (0)