1717#include " Common/DataModel/Centrality.h"
1818#include " Common/DataModel/EventSelection.h"
1919#include " Common/DataModel/Multiplicity.h"
20+ #include " Common/DataModel/PIDResponseITS.h"
2021#include " Common/DataModel/PIDResponseTOF.h"
2122#include " Common/DataModel/PIDResponseTPC.h"
2223#include " Common/DataModel/Qvectors.h"
3839#include < Framework/OutputObjHeader.h>
3940#include < Framework/SliceCache.h>
4041#include < Framework/runDataProcessing.h>
42+ #include < ReconstructionDataFormats/PID.h>
4143
4244#include < Math/Vector4D.h> // IWYU pragma: keep (do not replace with Math/Vector4Dfwd.h)
4345#include < Math/Vector4Dfwd.h>
@@ -68,8 +70,9 @@ struct F0980pbpbanalysis {
6870 {},
6971 OutputObjHandlingPolicy::AnalysisObject};
7072
71- Service<o2::ccdb::BasicCCDBManager> ccdb;
73+ Service<o2::ccdb::BasicCCDBManager> ccdb{} ;
7274 o2::ccdb::CcdbApi ccdbApi;
75+ o2::aod::ITSResponse itsResponse;
7376
7477 Configurable<std::string> cfgURL{" cfgURL" , " http://alice-ccdb.cern.ch" , " Address of the CCDB to browse" };
7578 Configurable<int64_t > ccdbNoLaterThan{" ccdbNoLaterThan" , std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now ().time_since_epoch ()).count (), " Latest acceptable timestamp of creation for the object" };
@@ -130,6 +133,8 @@ struct F0980pbpbanalysis {
130133 Configurable<double > cfgPIDMaxTPCnSigmaPion{" cfgPIDMaxTPCnSigmaPion" , 5.0 , " TPC nSigma cut for Pion" }; // TPC
131134 Configurable<double > cfgPIDMaxTPCnSigmaPionS{" cfgPIDMaxTPCnSigmaPionS" , 3.0 , " TPC nSigma cut for Pion as a standalone" };
132135 Configurable<double > cfgPIDMaxTiednSigmaPion{" cfgPIDMaxTiednSigmaPion" , 3.0 , " Combined nSigma cut for Pion" };
136+ Configurable<bool > cfgPIDITSFlag{" cfgPIDITSFlag" , true , " PID ITS flag" };
137+ Configurable<double > cfgPIDMaxITSnSigmaPion{" cfgPIDMaxITSnSigmaPion" , 3.0 , " ITS nSigma selection" };
133138 } PIDConfig;
134139
135140 // Flow Configurables
@@ -198,27 +203,27 @@ struct F0980pbpbanalysis {
198203 int nmode = FlowConfig.cfgQvecNMods;
199204 static constexpr double QvecAmpMin = 1e-4 ;
200205
201- int detId;
202- int refAId;
203- int refBId;
206+ int detId = 0 ;
207+ int refAId = 4 ;
208+ int refBId = 5 ;
204209
205- int qVecDetInd;
206- int qVecRefAInd;
207- int qVecRefBInd;
210+ int qVecDetInd = 0 ;
211+ int qVecRefAInd = 0 ;
212+ int qVecRefBInd = 0 ;
208213
209- double eventPlaneDet;
210- double eventPlaneRefA;
211- double eventPlaneRefB;
214+ double eventPlaneDet = 0 . ;
215+ double eventPlaneRefA = 0 . ;
216+ double eventPlaneRefB = 0 . ;
212217
213- float centrality;
218+ float centrality = 1 . ;
214219
215- double angle;
216- double relPhi;
217- double relPhiRot;
218- double relPhiMix;
220+ double angle = - 1 . ;
221+ double relPhi = - 1 . ;
222+ double relPhiRot = - 1 . ;
223+ double relPhiMix = - 1 . ;
219224
220225 // double massPi = o2::constants::physics::MassPionCharged;
221- double massPtl;
226+ double massPtl = 0 . ;
222227
223228 int nTotalEvents = 0 ;
224229
@@ -231,6 +236,7 @@ struct F0980pbpbanalysis {
231236 PIDRun3 = 0 ,
232237 PIDRun2 = 1 ,
233238 PIDTest = 2 ,
239+ PIDAddITS = 3 ,
234240 };
235241
236242 enum PtlList {
@@ -262,19 +268,23 @@ struct F0980pbpbanalysis {
262268 {
263269 if (name.value == " FT0C" ) {
264270 return 0 ;
265- } else if (name.value == " FT0A" ) {
271+ }
272+ if (name.value == " FT0A" ) {
266273 return 1 ;
267- } else if (name.value == " FT0M" ) {
274+ }
275+ if (name.value == " FT0M" ) {
268276 return 2 ;
269- } else if (name.value == " FV0A" ) {
277+ }
278+ if (name.value == " FV0A" ) {
270279 return 3 ;
271- } else if (name.value == " TPCpos" ) {
280+ }
281+ if (name.value == " TPCpos" ) {
272282 return 4 ;
273- } else if (name.value == " TPCneg" ) {
283+ }
284+ if (name.value == " TPCneg" ) {
274285 return 5 ;
275- } else {
276- return 0 ;
277286 }
287+ return 0 ;
278288 }
279289
280290 template <typename objType>
@@ -372,45 +382,45 @@ struct F0980pbpbanalysis {
372382 if (std::abs (collision.posZ ()) > EventConfig.cfgEventCutVertex ) {
373383 return 0 ;
374384 }
375- if (QAConfig.cfgQAEventFlowCut && QA )
385+ if (QAConfig.cfgQAEventFlowCut && QA ) {
376386 histos.fill (HIST (" EventQA/hnEvents" ), 1 ); // Vertex cut
377-
387+ }
378388 if (!collision.sel8 ()) {
379389 return 0 ;
380390 }
381- if (QAConfig.cfgQAEventFlowCut && QA )
391+ if (QAConfig.cfgQAEventFlowCut && QA ) {
382392 histos.fill (HIST (" EventQA/hnEvents" ), 2 ); // sel8 cut
383-
393+ }
384394 if (EventConfig.cfgEventGoodZvtxSel && !collision.selection_bit (aod::evsel::kIsGoodZvtxFT0vsPV )) {
385395 return 0 ;
386396 }
387- if (QAConfig.cfgQAEventFlowCut && QA )
397+ if (QAConfig.cfgQAEventFlowCut && QA ) {
388398 histos.fill (HIST (" EventQA/hnEvents" ), 3 ); // Good Zvtx cut
389-
399+ }
390400 if (EventConfig.cfgEventNSamePileupSel && !collision.selection_bit (aod::evsel::kNoSameBunchPileup )) {
391401 return 0 ;
392402 }
393- if (QAConfig.cfgQAEventFlowCut && QA )
403+ if (QAConfig.cfgQAEventFlowCut && QA ) {
394404 histos.fill (HIST (" EventQA/hnEvents" ), 4 ); // Same bunch pileup cut
395-
405+ }
396406 if (EventConfig.cfgEventNCollinTRSel && !collision.selection_bit (o2::aod::evsel::kNoCollInTimeRangeStandard )) {
397407 return 0 ;
398408 }
399- if (QAConfig.cfgQAEventFlowCut && QA )
409+ if (QAConfig.cfgQAEventFlowCut && QA ) {
400410 histos.fill (HIST (" EventQA/hnEvents" ), 5 ); // Collision time range standard cut
401-
411+ }
402412 if (EventConfig.cfgEventQvecSel && (collision.qvecAmp ()[detId] < QvecAmpMin || collision.qvecAmp ()[refAId] < QvecAmpMin || collision.qvecAmp ()[refBId] < QvecAmpMin)) {
403413 return 0 ;
404414 }
405- if (QAConfig.cfgQAEventFlowCut && QA )
415+ if (QAConfig.cfgQAEventFlowCut && QA ) {
406416 histos.fill (HIST (" EventQA/hnEvents" ), 6 ); // Qvector cut
407-
417+ }
408418 if (EventConfig.cfgEventOccupancySel && (collision.trackOccupancyInTimeRange () > EventConfig.cfgEventOccupancyMax || collision.trackOccupancyInTimeRange () < EventConfig.cfgEventOccupancyMin )) {
409419 return 0 ;
410420 }
411- if (QAConfig.cfgQAEventFlowCut && QA )
421+ if (QAConfig.cfgQAEventFlowCut && QA ) {
412422 histos.fill (HIST (" EventQA/hnEvents" ), 7 ); // Occupancy cut
413-
423+ }
414424 if (EventConfig.cfgEventCentMax < centrality) {
415425 return 0 ;
416426 }
@@ -423,9 +433,9 @@ struct F0980pbpbanalysis {
423433 return 0;
424434 }
425435 */
426- if (QAConfig.cfgQAEventFlowCut && QA )
436+ if (QAConfig.cfgQAEventFlowCut && QA ) {
427437 histos.fill (HIST (" EventQA/hnEvents" ), 8 ); // Centrality cut
428-
438+ }
429439 if (EventConfig.cfgEventPVSel && std::abs (collision.posZ ()) > EventConfig.cfgEventPV ) {
430440 return 0 ;
431441 }
@@ -440,27 +450,31 @@ struct F0980pbpbanalysis {
440450 template <typename TrackType>
441451 bool trackSelected (const TrackType& track, const bool QA )
442452 {
443- if (QAConfig.cfgQATrackCut && QA )
453+ if (QAConfig.cfgQATrackCut && QA ) {
444454 fillQA (false , track, 3 );
445- if (QAConfig.cfgQATrackFlowCut && QA )
455+ }
456+ if (QAConfig.cfgQATrackFlowCut && QA ) {
446457 histos.fill (HIST (" TrackQA/hnTracks" ), 0 ); // All passed
447458 //
448459 // Kinematic
460+ }
449461 if (std::abs (track.pt ()) < TrackConfig.cfgTrackPtMin ) {
450462 return 0 ;
451463 }
452464 if (std::abs (track.eta ()) > TrackConfig.cfgTrackEtaMax ) {
453465 return 0 ;
454466 }
455- if (QAConfig.cfgQATrackFlowCut && QA )
467+ if (QAConfig.cfgQATrackFlowCut && QA ) {
456468 histos.fill (HIST (" TrackQA/hnTracks" ), 1 ); // Kinematic
457469 // Primary Vertex(PV) Contributing to the PV fit
470+ }
458471 if (TrackConfig.cfgTrackIsPVContributor && !track.isPVContributor ()) {
459472 return 0 ;
460473 }
461- if (QAConfig.cfgQATrackFlowCut && QA )
474+ if (QAConfig.cfgQATrackFlowCut && QA ) {
462475 histos.fill (HIST (" TrackQA/hnTracks" ), 2 ); // PV Contributor
463476 // Global Track without DCA
477+ }
464478 if (TrackConfig.cfgTrackIsGlobalWoDCATrack && !track.isGlobalTrackWoDCA ()) {
465479 return 0 ;
466480 }
@@ -476,9 +490,10 @@ struct F0980pbpbanalysis {
476490 if (TrackConfig.cfgTrackITSChi2 > 0 && track.itsChi2NCl () > TrackConfig.cfgTrackITSChi2 ) {
477491 return 0 ;
478492 }
479- if (QAConfig.cfgQATrackFlowCut && QA )
493+ if (QAConfig.cfgQATrackFlowCut && QA ) {
480494 histos.fill (HIST (" TrackQA/hnTracks" ), 4 ); // GlobalWoDCATrack
481495 // DCA cuts
496+ }
482497 if (TrackConfig.cfgTrackDCArDepPTSel ) {
483498 if (std::abs (track.dcaXY ()) > (TrackConfig.cfgTrackDCArDepPTP0 + (TrackConfig.cfgTrackDCArDepPTExp / track.pt ()))) {
484499 return 0 ;
@@ -571,6 +586,16 @@ struct F0980pbpbanalysis {
571586 return 0 ;
572587 }
573588 }
589+ } else if (cfgListPID == PIDList::PIDAddITS) {
590+ if (!track.hasTOF ()) {
591+ return 0 ;
592+ }
593+ if ((getTpcNSigma (track) * getTpcNSigma (track) + getTofNSigma (track) * getTofNSigma (track)) > (PIDConfig.cfgPIDMaxTiednSigmaPion * PIDConfig.cfgPIDMaxTiednSigmaPion )) {
594+ return 0 ;
595+ }
596+ if (!PIDConfig.cfgPIDITSFlag || std::abs (itsResponse.nSigmaITS <o2::track::PID ::Pion>(track)) > PIDConfig.cfgPIDMaxITSnSigmaPion ) {
597+ return 0 ;
598+ }
574599 }
575600 if (QAConfig.cfgQATrackFlowCut && QA ) {
576601 histos.fill (HIST (" TrackQA/hnTracks" ), 8 ); // PID
@@ -582,15 +607,22 @@ struct F0980pbpbanalysis {
582607 template <typename TrackType1, typename TrackType2>
583608 bool pairAngleSelection (const TrackType1& track1, const TrackType2& track2)
584609 {
585- double pt1, pt2, pz1, pz2, p1, p2, angle;
610+ double pt1 = 0 .;
611+ double pt2 = 0 .;
612+ double pz1 = 0 .;
613+ double pz2 = 0 .;
614+ double p1 = 0 .;
615+ double p2 = 0 .;
616+ double angle12 = 0 .;
617+
586618 pt1 = track1.pt ();
587619 pt2 = track2.pt ();
588620 pz1 = track1.pz ();
589621 pz2 = track2.pz ();
590622 p1 = track1.p ();
591623 p2 = track2.p ();
592- angle = std::acos ((pt1 * pt2 + pz1 * pz2) / (p1 * p2));
593- if (PhiTestConfig.cfgPhiDeepAngleSel && angle < PhiTestConfig.cfgPhiDeepAngle ) {
624+ angle12 = std::acos ((pt1 * pt2 + pz1 * pz2) / (p1 * p2));
625+ if (PhiTestConfig.cfgPhiDeepAngleSel && angle12 < PhiTestConfig.cfgPhiDeepAngle ) {
594626 return 0 ;
595627 }
596628 return 1 ;
@@ -601,19 +633,17 @@ struct F0980pbpbanalysis {
601633 {
602634 if (cfgListPtl == PtlList::PtlPion) {
603635 return track.tpcNSigmaPi ();
604- } else {
605- return track.tpcNSigmaKa ();
606636 }
637+ return track.tpcNSigmaKa ();
607638 }
608639
609640 template <typename TrackType>
610641 float getTofNSigma (const TrackType& track)
611642 {
612643 if (cfgListPtl == PtlList::PtlPion) {
613644 return track.tofNSigmaPi ();
614- } else {
615- return track.tofNSigmaKa ();
616645 }
646+ return track.tofNSigmaKa ();
617647 }
618648
619649 template <bool IsMC, typename CollisionType, typename TracksType>
@@ -634,9 +664,9 @@ struct F0980pbpbanalysis {
634664 if (!trackSelected (trk1, true )) {
635665 continue ;
636666 }
637- if (QAConfig.cfgQATrackCut )
667+ if (QAConfig.cfgQATrackCut ) {
638668 fillQA (true , trk1, 3 );
639-
669+ }
640670 if (!selectionPID (trk1, true )) {
641671 continue ;
642672 }
@@ -721,7 +751,7 @@ struct F0980pbpbanalysis {
721751 if (c1.bcId () == c2.bcId ()) {
722752 continue ;
723753 }
724- double eventPlaneDet = std::atan2 (c1.qvecIm ()[qVecDetInd], c1.qvecRe ()[qVecDetInd]) / static_cast <float >(nmode);
754+ eventPlaneDet = std::atan2 (c1.qvecIm ()[qVecDetInd], c1.qvecRe ()[qVecDetInd]) / static_cast <float >(nmode);
725755
726756 for (const auto & trk1 : t1) {
727757 if (!trackSelected (trk1, false )) {
0 commit comments