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