Skip to content

Commit 6797aa8

Browse files
authored
[PWGCF] Add configurable for use strict pid (#12529)
1 parent 278e6f3 commit 6797aa8

File tree

1 file changed

+55
-36
lines changed

1 file changed

+55
-36
lines changed

PWGCF/Flow/Tasks/flowPidCme.cxx

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,44 +9,45 @@
99
// granted to it by virtue of its status as an Intergovernmental Organization
1010
// or submit itself to any jurisdiction.
1111

12-
/// \author ZhengqingWang(zhengqing.wang@cern.ch)
12+
/// \author ZhengqingWang(zhengqing.wang@cern.ch), KegangXiong(kxiong@cern.ch)
1313
/// \file flowPidCme.cxx
1414
/// \brief task to calculate the pikp cme signal and bacground.
1515
// C++/ROOT includes.
1616
#include <CCDB/BasicCCDBManager.h>
17-
#include <chrono>
18-
#include <string>
19-
#include <vector>
20-
#include <utility>
21-
#include <memory>
22-
#include <TF1.h>
17+
2318
#include <TComplex.h>
19+
#include <TF1.h>
2420
#include <TH1F.h>
2521
#include <TH2D.h>
2622
#include <TMath.h>
2723
#include <TVector2.h>
2824

29-
// o2Physics includes.
30-
#include "Framework/ASoA.h"
31-
#include "Framework/AnalysisDataModel.h"
32-
#include "Framework/AnalysisTask.h"
33-
#include "Framework/ASoAHelpers.h"
34-
#include "Framework/HistogramRegistry.h"
35-
#include "Framework/runDataProcessing.h"
36-
#include "Framework/RunningWorkflowInfo.h"
37-
#include "Framework/StaticFor.h"
25+
#include <chrono>
26+
#include <memory>
27+
#include <string>
28+
#include <utility>
29+
#include <vector>
3830

39-
#include "Common/DataModel/Qvectors.h"
40-
#include "Common/DataModel/EventSelection.h"
41-
#include "Common/DataModel/TrackSelectionTables.h"
42-
#include "Common/DataModel/Centrality.h"
43-
#include "Common/DataModel/Multiplicity.h"
31+
// o2Physics includes.
4432
#include "Common/Core/EventPlaneHelper.h"
4533
#include "Common/Core/TrackSelection.h"
34+
#include "Common/DataModel/Centrality.h"
35+
#include "Common/DataModel/EventSelection.h"
36+
#include "Common/DataModel/Multiplicity.h"
4637
#include "Common/DataModel/PIDResponse.h"
4738
#include "Common/DataModel/PIDResponseITS.h"
39+
#include "Common/DataModel/Qvectors.h"
40+
#include "Common/DataModel/TrackSelectionTables.h"
4841

4942
#include "CommonConstants/PhysicsConstants.h"
43+
#include "Framework/ASoA.h"
44+
#include "Framework/ASoAHelpers.h"
45+
#include "Framework/AnalysisDataModel.h"
46+
#include "Framework/AnalysisTask.h"
47+
#include "Framework/HistogramRegistry.h"
48+
#include "Framework/RunningWorkflowInfo.h"
49+
#include "Framework/StaticFor.h"
50+
#include "Framework/runDataProcessing.h"
5051

5152
// o2 includes.
5253

@@ -158,6 +159,7 @@ struct FillPIDcolums {
158159
Configurable<bool> cfgOpenITSCut{"cfgOpenITSCut", true, "open ITSnsigma cut"};
159160
Configurable<bool> cfgOpenITSCutQAPlots{"cfgOpenITSCutQAPlots", true, "open QA plots after ITS nsigma cut"};
160161
Configurable<bool> cfgOpenDetailPlotsTPCITSContaimination{"cfgOpenDetailPlotsTPCITSContaimination", false, "open detail TH3D plots for nSigmaTPC-ITS Pt-eta-Phi nSigmaITS-clustersize"};
162+
Configurable<bool> cfgUseStrictPID{"cfgUseStrictPID", true, "More strict pid strategy"};
161163
Configurable<bool> cfgOpenAllowCrossTrack{"cfgOpenAllowCrossTrack", false, "Allow one track to be identified as different kind of PID particles"};
162164
Configurable<bool> cfgOpenCrossTrackQAPlots{"cfgOpenCrossTrackQAPlots", true, "open cross pid track QA plots"};
163165
Configurable<bool> cfgOpenTOFOnlyPID{"cfgOpenTOFOnlyPID", true, "only accept tracks who has TOF infomation and use TOFnsigma for PID(priority greater than TPConly and combined"};
@@ -311,9 +313,17 @@ struct FillPIDcolums {
311313
pidVectorUpper = pidVectorTPCPtUpper;
312314
pidVectorLower = pidVectorTPCPtLower;
313315
} else {
314-
nSigmaToUse = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? nSigmaCombined : nSigmaTPC;
315-
pidVectorUpper = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMSUpper.value : cfgnSigmaCutTPCUpper.value;
316-
pidVectorLower = (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) ? cfgnSigmaCutRMSLower.value : cfgnSigmaCutTPCLower.value;
316+
if (candidate.pt() > cfgPtMaxforTPCOnlyPID && candidate.hasTOF()) {
317+
nSigmaToUse = nSigmaCombined;
318+
pidVectorUpper = cfgnSigmaCutRMSUpper.value;
319+
pidVectorLower = cfgnSigmaCutRMSLower.value;
320+
} else if (candidate.pt() > cfgPtMaxforTPCOnlyPID && !candidate.hasTOF() && cfgUseStrictPID) {
321+
return 0;
322+
} else {
323+
nSigmaToUse = nSigmaTPC;
324+
pidVectorUpper = cfgnSigmaCutTPCUpper.value;
325+
pidVectorLower = cfgnSigmaCutTPCLower.value;
326+
}
317327
}
318328
float nsigma = 9999.99;
319329
const int nPOI = 3;
@@ -448,20 +458,27 @@ struct FillPIDcolums {
448458
}
449459
}
450460
}
451-
if (cfgOpenAllowCrossTrack) {
452-
// one track can be recognized as different PID particles
461+
if (cfgUseStrictPID) {
462+
// Only use the track which was recognized as an unique PID particle
453463
int index = (kIsPr << 2) | (kIsKa << 1) | kIsPi;
454-
const int map[] = {0, 1, 2, 7, 3, 8, 9, 10};
464+
const int map[] = {0, 1, 2, 0, 3, 0, 0, 0};
455465
return map[index];
456466
} else {
457-
// Select particle with the lowest nsigma (If not allow cross track)
458-
for (int i = 0; i < nPOI; ++i) {
459-
if (std::abs(nSigmaToUse[i]) < nsigma && (nSigmaToUse[i] > pidVectorLower[i] && nSigmaToUse[i] < pidVectorUpper[i])) {
460-
pid = i;
461-
nsigma = std::abs(nSigmaToUse[i]);
467+
if (cfgOpenAllowCrossTrack) {
468+
// one track can be recognized as different PID particles
469+
int index = (kIsPr << 2) | (kIsKa << 1) | kIsPi;
470+
const int map[] = {0, 1, 2, 7, 3, 8, 9, 10};
471+
return map[index];
472+
} else {
473+
// Select particle with the lowest nsigma (If not allow cross track)
474+
for (int i = 0; i < nPOI; ++i) {
475+
if (std::abs(nSigmaToUse[i]) < nsigma && (nSigmaToUse[i] > pidVectorLower[i] && nSigmaToUse[i] < pidVectorUpper[i])) {
476+
pid = i;
477+
nsigma = std::abs(nSigmaToUse[i]);
478+
}
462479
}
480+
return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton
463481
}
464-
return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton
465482
}
466483
// Clear the vectors
467484
std::vector<float>().swap(pidVectorLower);
@@ -2682,8 +2699,9 @@ struct FlowPidCme {
26822699
int detInd = detId * 4 + cfgnTotalSystem * 4 * (nmode - 2);
26832700
int refAInd = refAId * 4 + cfgnTotalSystem * 4 * (nmode - 2);
26842701
int refBInd = refBId * 4 + cfgnTotalSystem * 4 * (nmode - 2);
2702+
double nonzero = 1e-8;
26852703
if (nmode == fourier_mode::kMode2) {
2686-
if (collision.qvecAmp()[detId] > 1e-8) {
2704+
if (collision.qvecAmp()[detId] > nonzero) {
26872705
histosQA.fill(HIST("QA/histQvec_CorrL0_V2"), collision.qvecRe()[detInd], collision.qvecIm()[detInd], collision.centFT0C());
26882706
histosQA.fill(HIST("QA/histQvec_CorrL1_V2"), collision.qvecRe()[detInd + 1], collision.qvecIm()[detInd + 1], collision.centFT0C());
26892707
histosQA.fill(HIST("QA/histQvec_CorrL2_V2"), collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], collision.centFT0C());
@@ -2693,7 +2711,7 @@ struct FlowPidCme {
26932711
histosQA.fill(HIST("QA/histEvtPl_CorrL2_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 2], collision.qvecIm()[detInd + 2], nmode), collision.centFT0C());
26942712
histosQA.fill(HIST("QA/histEvtPl_CorrL3_V2"), helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), collision.centFT0C());
26952713
}
2696-
if (collision.qvecAmp()[detId] > 1e-8 && collision.qvecAmp()[refAId] > 1e-8 && collision.qvecAmp()[refBId] > 1e-8) {
2714+
if (collision.qvecAmp()[detId] > nonzero && collision.qvecAmp()[refAId] > nonzero && collision.qvecAmp()[refBId] > nonzero) {
26972715
histosQA.fill(HIST("QA/histQvecRes_SigRefAV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), nmode), collision.centFT0C());
26982716
histosQA.fill(HIST("QA/histQvecRes_SigRefBV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[detInd + 3], collision.qvecIm()[detInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.centFT0C());
26992717
histosQA.fill(HIST("QA/histQvecRes_RefARefBV2"), helperEP.GetResolution(helperEP.GetEventPlane(collision.qvecRe()[refAInd + 3], collision.qvecIm()[refAInd + 3], nmode), helperEP.GetEventPlane(collision.qvecRe()[refBInd + 3], collision.qvecIm()[refBInd + 3], nmode), nmode), collision.centFT0C());
@@ -2704,7 +2722,8 @@ struct FlowPidCme {
27042722
template <typename CollType, typename TrackType>
27052723
void fillHistosFlowGammaDelta(const CollType& collision, const TrackType& track1, const TrackType& track2, const TrackType& track3, int nmode)
27062724
{
2707-
if (collision.qvecAmp()[detId] < 1e-8) {
2725+
double nonzero2 = 1e-8;
2726+
if (collision.qvecAmp()[detId] < nonzero2) {
27082727
return;
27092728
}
27102729
auto cent = collision.centFT0C();

0 commit comments

Comments
 (0)