Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 120 additions & 8 deletions PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,11 @@ struct HadNucleiFemto {
Configurable<float> settingCutNsigmaTOFTPCHad{"settingCutNsigmaTOFTPCHad", 3.0f, "Value of the hsdron TOF TPC combNsigma cut"};
Configurable<float> settingCutNsigTPCPrMin{"settingCutNsigTPCPrMin", 3.0f, "Minimum TPC Pr Nsigma cut for rejection"};
Configurable<float> settingCutNsigTPCPiMin{"settingCutNsigTPCPiMin", 3.0f, "Minimum TPC Pi Nsigma cut for rejection"};
Configurable<float> settingCutNsigTPCKaMin{"settingCutNsigTPCKaMin", 3.0f, "Minimum TPC Ka Nsigma cut for rejection"};
Configurable<float> settingCutNsigTOFPrMin{"settingCutNsigTOFPrMin", 3.0f, "Minimum TOF Pr Nsigma cut for rejection"};
Configurable<float> settingCutNsigTOFPiMin{"settingCutNsigTOFPiMin", 3.0f, "Minimum TOF Pi Nsigma cut for rejection"};
Configurable<float> settingCutNsigTOFKaMin{"settingCutNsigTOFKaMin", 3.0f, "Minimum TOF Ka Nsigma cut for rejection"};
Configurable<bool> settingUsePionReferencePIDCuts{"settingUsePionReferencePIDCuts", false, "If true, use the reference pion track/PID cuts from the pi-p study"};
// Deuteron purity and PID cuts
Configurable<float> settingCutPinMinDe{"settingCutPinMinDe", 0.0f, "Minimum Pin for De"};
Configurable<float> settingCutClSizeItsDe{"settingCutClSizeItsDe", 4.0f, "Minimum ITS cluster size for De"};
Expand Down Expand Up @@ -297,18 +300,23 @@ struct HadNucleiFemto {
{"h2NsigmaHadTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
{"h2NsigmaHadTOF", "NsigmaHad TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{200, -5.0f, 5.0f}, {200, -5.0f, 5.0f}}}},
{"h2NsigmaHadTOF_preselection", "NsigmaHad TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
{"h2NsigmaHadComb_preselection", "NsigmaHad TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(had)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}},
{"h2NsigmaHadPrTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
{"h2NsigmaHadPiTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(pi)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
{"h2NsigmaHadKaTPC", "NsigmaHad TPC distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(K)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
{"h2NsigmaHadPrTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(p)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
{"h2NsigmaHadPiTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(pi)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},
{"h2NsigmaHadKaTOF", "NsigmaHad TOF distribution; #it{p}_{T}(GeV/#it{c}); n#sigma_{TPC}(K)", {HistType::kTH1F, {{200, -5.0f, 5.0f}}}},

// Purity
{"purity/h2NsigmaNuTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
{"purity/h2NsigmaNuTPC_preselecComp", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
{"purity/h2NSigmaNuITS_preselection", "NsigmaNu ITS distribution; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{ITS} Nu", {HistType::kTH2F, {{50, -5.0f, 5.0f}, {120, -3.0f, 3.0f}}}},
{"purity/h2NsigmaNuTOF_preselection", "NsigmaNu TOF distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
{"purity/h2NsigmaNuComb_preselection", "NsigmaNu TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}},
{"purity/h2NsigmaHadTPC_preselection", "NsigmaNu TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(Nu)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
{"purity/h2NsigmaHadTOF_preselection", "NsigmaHad TOF distribution; #iit{p}_{T} (GeV/#it{c}); n#sigma_{TOF}(p)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {400, -10.0f, 10.0f}}}},
{"purity/h2NsigmaHadComb_preselection", "NsigmaHad TPCTOF comb distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{comb}(had)", {HistType::kTH2F, {{100, -5.0f, 5.0f}, {100, 0.0f, 5.0f}}}},

// Hypertriton
{"hHe3TPCnsigma", "NsigmaHe3 TPC distribution; #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC}(He3)", {HistType::kTH2F, {{100, -2.0f, 2.0f}, {200, -5.0f, 5.0f}}}},
Expand Down Expand Up @@ -498,7 +506,7 @@ struct HadNucleiFemto {
return false;
}
const int minTPCNClsFound = 90;
const int minTPCNClsCrossedRows = 100;
const int minTPCNClsCrossedRows = 70;
const float crossedRowsToFindableRatio = 0.83f;
if (candidate.itsNCls() < settingCutNCls ||
candidate.tpcNClsFound() < minTPCNClsFound ||
Expand All @@ -513,6 +521,59 @@ struct HadNucleiFemto {
return true;
}

bool useReferencePionCuts() const
{
return settingUsePionReferencePIDCuts.value && settingHadPDGCode.value == static_cast<int>(PDG_t::kPiPlus);
}

template <typename Ttrack>
bool selectTrackPionReference(const Ttrack& candidate)
{
constexpr float pionRefPtMin = 0.14f;
constexpr float pionRefPtMax = 2.5f;
constexpr int pionRefITSInnerBarrelMin = 3;
constexpr int pionRefITSNClsMin = 7;
constexpr int pionRefTPCNClsFoundMin = 80;
constexpr int pionRefTPCCrossedRowsMin = 90;

if (std::abs(candidate.eta()) > settingCutEta) {
return false;
}

const float absPt = std::abs(candidate.pt());
if (absPt < pionRefPtMin || absPt > pionRefPtMax) {
return false;
}

if (candidate.itsNClsInnerBarrel() < pionRefITSInnerBarrelMin ||
candidate.itsNCls() < pionRefITSNClsMin ||
candidate.tpcNClsFound() < pionRefTPCNClsFoundMin ||
candidate.tpcNClsCrossedRows() < pionRefTPCCrossedRowsMin) {
return false;
}

if (absPt <= 0.f) {
return false;
}

const float pionDCAxyMax = 0.004f + 0.013f / absPt;
const float pionDCAzMax = 0.004f + 0.013f / absPt;
if (std::abs(candidate.dcaXY()) > pionDCAxyMax || std::abs(candidate.dcaZ()) > pionDCAzMax) {
return false;
}

return true;
}

template <typename Ttrack>
bool selectTrackHadron(const Ttrack& candidate)
{
if (useReferencePionCuts()) {
return selectTrackPionReference(candidate);
}
return selectTrack(candidate);
}

template <typename Ttrack>
bool selectTrackDe(const Ttrack& candidate)
{
Expand Down Expand Up @@ -595,20 +656,64 @@ struct HadNucleiFemto {
template <typename Ttrack>
bool selectionPIDPion(const Ttrack& candidate)
{
if (useReferencePionCuts()) {
constexpr float pionRefPCombMin = 0.5f;
constexpr float pionRefTPCNsigmaMax = 3.0f;
constexpr float pionRefCombNsigmaMax = 3.0f;

const float tpcNSigmaPi = candidate.tpcNSigmaPi();
const float absP = std::abs(candidate.p());
mQaRegistry.fill(HIST("h2NsigmaHadTPC_preselection"), candidate.sign() * candidate.tpcInnerParam(), tpcNSigmaPi);

if (absP <= pionRefPCombMin) {
if (std::abs(tpcNSigmaPi) > pionRefTPCNsigmaMax) {
return false;
}
mQaRegistry.fill(HIST("h2NsigmaHadTPC"), candidate.sign() * candidate.pt(), tpcNSigmaPi);
mQaRegistry.fill(HIST("h2dEdxHadcandidates"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal());
return true;
}

if (!candidate.hasTOF()) {
return false;
}

const float tofNSigmaPi = candidate.tofNSigmaPi();
const float combNsigma = std::sqrt(tofNSigmaPi * tofNSigmaPi + tpcNSigmaPi * tpcNSigmaPi);
mQaRegistry.fill(HIST("h2NsigmaHadTOF_preselection"), candidate.sign() * candidate.pt(), tofNSigmaPi);
mQaRegistry.fill(HIST("h2NsigmaHadComb_preselection"), candidate.sign() * candidate.pt(), combNsigma);
if (combNsigma > pionRefCombNsigmaMax) {
return false;
}
mQaRegistry.fill(HIST("h2NsigmaHadTPC"), candidate.sign() * candidate.pt(), tpcNSigmaPi);
mQaRegistry.fill(HIST("h2NsigmaHadTOF"), candidate.sign() * candidate.pt(), tofNSigmaPi);
mQaRegistry.fill(HIST("h2NsigmaHadComb"), candidate.sign() * candidate.pt(), combNsigma);
mQaRegistry.fill(HIST("h2dEdxHadcandidates"), candidate.sign() * candidate.tpcInnerParam(), candidate.tpcSignal());
return true;
}

if (std::abs(candidate.dcaXY()) > settingCutHadDCAxyMin || std::abs(candidate.dcaZ()) > settingCutHadDCAzMin)
return false;

auto tpcNSigmaPi = candidate.tpcNSigmaPi();
mQaRegistry.fill(HIST("h2NsigmaHadTPC_preselection"), candidate.sign() * candidate.tpcInnerParam(), tpcNSigmaPi);
if (std::abs(candidate.pt()) < settingCutHadptMin || std::abs(candidate.pt()) > settingCutHadptMax)
return false;
// reject protons
// reject protons and kaons
if (std::abs(candidate.tpcNSigmaPr()) < settingCutNsigTPCPrMin)
return false;
if (std::abs(candidate.tpcNSigmaKa()) < settingCutNsigTPCKaMin)
return false;
mQaRegistry.fill(HIST("h2NsigmaHadPrTPC"), candidate.tpcNSigmaPr());
mQaRegistry.fill(HIST("h2NsigmaHadKaTPC"), candidate.tpcNSigmaKa());
if (candidate.hasTOF() && std::abs(candidate.tofNSigmaPr()) < settingCutNsigTOFPrMin)
return false;
if (candidate.hasTOF() && std::abs(candidate.tofNSigmaKa()) < settingCutNsigTOFKaMin)
return false;
mQaRegistry.fill(HIST("h2NsigmaHadPrTOF"), candidate.tofNSigmaPr());
if (candidate.hasTOF()) {
mQaRegistry.fill(HIST("h2NsigmaHadKaTOF"), candidate.tofNSigmaKa());
}

if (candidate.hasTOF() && std::abs(candidate.pt()) > settingCutPinMinTOFHad) {
auto tofNSigmaPi = candidate.tofNSigmaPi();
Expand Down Expand Up @@ -967,7 +1072,7 @@ struct HadNucleiFemto {
}
}

if (!selectTrack(track1) || !selectionPIDHadron(track1)) {
if (!selectTrackHadron(track1) || !selectionPIDHadron(track1)) {
continue;
}

Expand All @@ -993,7 +1098,7 @@ struct HadNucleiFemto {

mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts);

if (!selectTrack(hadTrack)) {
if (!selectTrackHadron(hadTrack)) {
continue;
}
mQaRegistry.fill(HIST("hTrackSel"), Selections::kTrackCuts);
Expand Down Expand Up @@ -1022,7 +1127,7 @@ struct HadNucleiFemto {
continue;
}
for (const auto& hadCand : hadCands) {
if (!selectTrack(hadCand) || !selectionPIDHadron(hadCand)) {
if (!selectTrackHadron(hadCand) || !selectionPIDHadron(hadCand)) {
continue;
}

Expand All @@ -1045,7 +1150,7 @@ struct HadNucleiFemto {
continue;
}
for (const auto& hadCand : hadCands) {
if (!selectTrack(hadCand) || !selectionPIDHadron(hadCand)) {
if (!selectTrackHadron(hadCand) || !selectionPIDHadron(hadCand)) {
continue;
}

Expand Down Expand Up @@ -1396,7 +1501,8 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa
trackTableThisCollision.bindExternalIndices(&tracks);

for (const auto& track : trackTableThisCollision) {
const bool passTrackHad = selectTrack(track);
constexpr float pionRefPCombMin = 0.5f;
const bool passTrackHad = selectTrackHadron(track);
const bool passTrackDe = selectTrackDe(track);

mQaRegistry.fill(HIST("hTrackSel"), Selections::kNoCuts);
Expand All @@ -1412,16 +1518,20 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa
if (passTrackHad && settingHadPDGCode == PDG_t::kPiPlus) {
const float tpcNSigmaHad = track.tpcNSigmaPi();
mQaRegistry.fill(HIST("purity/h2NsigmaHadTPC_preselection"), track.sign() * track.pt(), tpcNSigmaHad);
if (track.hasTOF() && std::abs(track.pt()) > settingCutPinMinTOFHad) {
if (useReferencePionCuts() ? (track.hasTOF() && std::abs(track.p()) > pionRefPCombMin) : (track.hasTOF() && std::abs(track.pt()) > settingCutPinMinTOFHad)) {
const float tofNSigmaHad = track.tofNSigmaPi();
const float combNsigmaHad = std::sqrt(tofNSigmaHad * tofNSigmaHad + tpcNSigmaHad * tpcNSigmaHad);
mQaRegistry.fill(HIST("purity/h2NsigmaHadTOF_preselection"), track.sign() * track.pt(), tofNSigmaHad);
mQaRegistry.fill(HIST("purity/h2NsigmaHadComb_preselection"), track.sign() * track.pt(), combNsigmaHad);
}
} else if (passTrackHad && settingHadPDGCode == PDG_t::kKPlus) {
const float tpcNSigmaHad = track.tpcNSigmaKa();
mQaRegistry.fill(HIST("purity/h2NsigmaHadTPC_preselection"), track.sign() * track.pt(), tpcNSigmaHad);
if (track.hasTOF() && track.tpcInnerParam() >= settingCutPinMinTOFHad) {
const float tofNSigmaHad = track.tofNSigmaKa();
const float combNsigmaHad = std::sqrt(tofNSigmaHad * tofNSigmaHad + tpcNSigmaHad * tpcNSigmaHad);
mQaRegistry.fill(HIST("purity/h2NsigmaHadTOF_preselection"), track.sign() * track.pt(), tofNSigmaHad);
mQaRegistry.fill(HIST("purity/h2NsigmaHadComb_preselection"), track.sign() * track.pt(), combNsigmaHad);
}
}

Expand All @@ -1431,7 +1541,9 @@ PROCESS_SWITCH(HadNucleiFemto, processMixedEventHyper, "Process Mixed event", fa
mQaRegistry.fill(HIST("purity/h2NsigmaNuTPC_preselecComp"), track.sign() * track.pt(), track.tpcNSigmaDe());
if (track.hasTOF() && track.tpcInnerParam() > settingCutPinMinTOFITSDe) {
const float tofNSigmaDe = track.tofNSigmaDe();
const float combNsigmaDe = std::sqrt(tofNSigmaDe * tofNSigmaDe + tpcNSigmaDe * tpcNSigmaDe);
mQaRegistry.fill(HIST("purity/h2NsigmaNuTOF_preselection"), track.sign() * track.pt(), tofNSigmaDe);
mQaRegistry.fill(HIST("purity/h2NsigmaNuComb_preselection"), track.sign() * track.pt(), combNsigmaDe);
} else if (track.tpcInnerParam() <= settingCutPinMinTOFITSDe) {
const float itsNSigmaDe = itsResponse.nSigmaITS<o2::track::PID::Deuteron>(track.itsClusterSizes(), track.p(), track.eta());
mQaRegistry.fill(HIST("purity/h2NSigmaNuITS_preselection"), track.sign() * track.pt(), itsNSigmaDe);
Expand Down
Loading