5656#include < algorithm>
5757#include < array>
5858#include < chrono>
59+ #include < cmath>
5960#include < complex>
6061#include < cstdint>
6162#include < cstdlib>
@@ -506,16 +507,18 @@ struct FlowGfwV02 {
506507 registry.get <TH1 >(HIST (" eventQA/eventSel" ))->GetXaxis ()->SetBinLabel (kMultCuts , " after Mult cuts" );
507508 registry.get <TH1 >(HIST (" eventQA/eventSel" ))->GetXaxis ()->SetBinLabel (kTrackCent , " has track + within cent" );
508509
509- if (gfwMemberCache.regions .GetSize () < 0 )
510+ if (gfwMemberCache.regions .GetSize () < 0 ) {
510511 LOGF (error, " Configuration contains vectors of different size - check the GFWRegions configurable" );
512+ }
511513 for (auto i (0 ); i < gfwMemberCache.regions .GetSize (); ++i) {
512514 fGFW ->AddRegion (gfwMemberCache.regions .GetNames ()[i], gfwMemberCache.regions .GetEtaMin ()[i], gfwMemberCache.regions .GetEtaMax ()[i], (gfwMemberCache.regions .GetpTDifs ()[i] != 0 ) ? ptbins + 1 : 1 , gfwMemberCache.regions .GetBitmasks ()[i]);
513515 }
514516 for (auto i = 0 ; i < gfwMemberCache.configs .GetSize (); ++i) {
515517 corrconfigs.push_back (fGFW ->GetCorrelatorConfig (gfwMemberCache.configs .GetCorrs ()[i], gfwMemberCache.configs .GetHeads ()[i], gfwMemberCache.configs .GetpTDifs ()[i] != 0 ));
516518 }
517- if (corrconfigs.empty ())
519+ if (corrconfigs.empty ()) {
518520 LOGF (error, " Configuration contains vectors of different size - check the GFWCorrConfig configurable" );
521+ }
519522 fGFW ->CreateRegions ();
520523 auto * oba = new TObjArray ();
521524 oba->SetOwner (kTRUE );
@@ -642,8 +645,9 @@ struct FlowGfwV02 {
642645 void loadCorrections (aod::BCsWithTimestamps::iterator const & bc)
643646 {
644647 uint64_t timestamp = bc.timestamp ();
645- if (cfg.correctionsLoaded )
648+ if (cfg.correctionsLoaded ) {
646649 return ;
650+ }
647651 if (!cfgAcceptance.value .empty ()) {
648652 cfg.mAcceptance = ccdb->getForTimeStamp <GFWWeights>(cfgAcceptance.value , timestamp);
649653 }
@@ -670,8 +674,9 @@ struct FlowGfwV02 {
670674
671675 void loadCorrections (int runnumber)
672676 {
673- if (cfg.correctionsLoaded )
677+ if (cfg.correctionsLoaded ) {
674678 return ;
679+ }
675680 if (!cfgAcceptance.value .empty ()) {
676681 cfg.mAcceptance = ccdb->getForRun <GFWWeights>(cfgAcceptance.value , runnumber);
677682 }
@@ -685,37 +690,42 @@ struct FlowGfwV02 {
685690 double getJTrackAcceptance (TTrack const & track)
686691 {
687692 double wacc = 1 ;
688- if constexpr (requires { track.weightNUA (); })
693+ if constexpr (requires { track.weightNUA (); }) {
689694 wacc = 1 . / track.weightNUA ();
695+ }
690696 return wacc;
691697 }
692698
693699 template <typename TTrack>
694700 double getJTrackEfficiency (TTrack const & track)
695701 {
696702 double eff = 1 .;
697- if constexpr (requires { track.weightEff (); })
703+ if constexpr (requires { track.weightEff (); }) {
698704 eff = track.weightEff ();
705+ }
699706 return eff;
700707 }
701708
702709 template <typename TTrack>
703710 double getAcceptance (TTrack const & track, const double & vtxz)
704711 {
705712 double wacc = 1 ;
706- if (cfg.mAcceptance )
713+ if (cfg.mAcceptance ) {
707714 wacc = cfg.mAcceptance ->getNUA (track.phi (), track.eta (), vtxz);
715+ }
708716 return wacc;
709717 }
710718
711719 template <typename TTrack>
712720 double getEfficiency (TTrack const & track, const int & pid = PidCharged)
713721 {
714722 double eff = 1 .;
715- if (cfg.mEfficiency [pid])
723+ if (cfg.mEfficiency [pid]) {
716724 eff = cfg.mEfficiency [pid]->GetBinContent (cfg.mEfficiency [pid]->FindBin (track.pt ()));
717- if (eff == 0 )
725+ }
726+ if (eff == 0 ) {
718727 return -1 .;
728+ }
719729 return 1 . / eff;
720730 }
721731
@@ -805,25 +815,32 @@ struct FlowGfwV02 {
805815 float zRes = std::sqrt (collision.covZZ ());
806816 float minZRes = 0.25 ;
807817 int minNContrib = 20 ;
808- if (zRes > minZRes && collision.numContrib () < minNContrib)
818+ if (zRes > minZRes && collision.numContrib () < minNContrib) {
809819 vtxz = -999 ;
820+ }
810821 }
811822 auto multNTracksPV = collision.multNTracksPV ();
812823
813- if (vtxz > gfwMemberCache.vtxZup || vtxz < gfwMemberCache.vtxZlow )
824+ if (vtxz > gfwMemberCache.vtxZup || vtxz < gfwMemberCache.vtxZlow ) {
814825 return 0 ;
826+ }
815827
816828 if (cfgMultCut) {
817- if (multNTracksPV < fMultPVCutLow ->Eval (centrality))
829+ if (multNTracksPV < fMultPVCutLow ->Eval (centrality)) {
818830 return 0 ;
819- if (multNTracksPV > fMultPVCutHigh ->Eval (centrality))
831+ }
832+ if (multNTracksPV > fMultPVCutHigh ->Eval (centrality)) {
820833 return 0 ;
821- if (multTrk < fMultCutLow ->Eval (centrality))
834+ }
835+ if (multTrk < fMultCutLow ->Eval (centrality)) {
822836 return 0 ;
823- if (multTrk > fMultCutHigh ->Eval (centrality))
837+ }
838+ if (multTrk > fMultCutHigh ->Eval (centrality)) {
824839 return 0 ;
825- if (multTrk > fMultPVGlobalCutHigh ->Eval (collision.multNTracksPV ()))
840+ }
841+ if (multTrk > fMultPVGlobalCutHigh ->Eval (collision.multNTracksPV ())) {
826842 return 0 ;
843+ }
827844 registry.fill (HIST (" eventQA/eventSel" ), kMultCuts );
828845 }
829846 return 1 ;
@@ -837,19 +854,23 @@ struct FlowGfwV02 {
837854
838855 int getPIDIndex (const std::string& corrconfig)
839856 {
840- if (!boost::ifind_first (corrconfig, " pi" ).empty ())
857+ if (!boost::ifind_first (corrconfig, " pi" ).empty ()) {
841858 return PidPions;
842- if (!boost::ifind_first (corrconfig, " ka" ).empty ())
859+ }
860+ if (!boost::ifind_first (corrconfig, " ka" ).empty ()) {
843861 return PidKaons;
844- if (!boost::ifind_first (corrconfig, " pr" ).empty ())
862+ }
863+ if (!boost::ifind_first (corrconfig, " pr" ).empty ()) {
845864 return PidProtons;
865+ }
846866 return PidCharged;
847867 }
848868
849869 template <DataType dt>
850870 void fillOutputContainers (const float & centmult)
851871 {
852- double threshold = 1.01 ;
872+ constexpr double threshold = 1.01 ;
873+ constexpr double minDnxAB = 1e-8 ; // skip events with vanishing V22 weight
853874
854875 int bootstrap = fRndm ->Integer (gfwMemberCache.nBootstrap );
855876 // Calculate V02
@@ -859,7 +880,7 @@ struct FlowGfwV02 {
859880 double ptFractionMid = 0 .;
860881 double dnxAB = fGFW ->Calculate (corrconfigs.at (0 ), 0 , kTRUE ).real (); // V22 weight for AB
861882 auto valAB = fGFW ->Calculate (corrconfigs.at (0 ), 0 , kFALSE ).real () / dnxAB;
862- if (std::abs (valAB) > threshold || std::isnan (valAB) || std::isinf (valAB) || dnxAB < 1e-8 ) {
883+ if (std::abs (valAB) > threshold || std::isnan (valAB) || std::isinf (valAB) || dnxAB < minDnxAB ) {
863884 return ;
864885 }
865886 double v22pt = valAB * ptMeanMid;
@@ -1030,12 +1051,15 @@ struct FlowGfwV02 {
10301051 void processCollision (TCollision const & collision, TTracks const & tracks, const XAxis& xaxis)
10311052 {
10321053 float vtxz = collision.posZ ();
1033- if (tracks.size () < 1 )
1054+ if (tracks.size () < 1 ) {
10341055 return ;
1035- if (xaxis.centrality >= 0 && (xaxis.centrality < gfwMemberCache.centbinning .front () || xaxis.centrality > gfwMemberCache.centbinning .back ()))
1056+ }
1057+ if (xaxis.centrality >= 0 && (xaxis.centrality < gfwMemberCache.centbinning .front () || xaxis.centrality > gfwMemberCache.centbinning .back ())) {
10361058 return ;
1037- if (xaxis.multiplicity < cfgFixedMultMin || xaxis.multiplicity > cfgFixedMultMax)
1059+ }
1060+ if (xaxis.multiplicity < cfgFixedMultMin || xaxis.multiplicity > cfgFixedMultMax) {
10381061 return ;
1062+ }
10391063 fGFW ->Clear ();
10401064 pidStates.hPtMid [PidCharged]->Reset ();
10411065 pidStates.hPtMid [PidPions]->Reset ();
@@ -1054,67 +1078,86 @@ struct FlowGfwV02 {
10541078 AcceptedTracks acceptedTracks{.nPos = 0 , .nNeg = 0 , .nFull = 0 , .nMid = 0 };
10551079 for (const auto & track : tracks) {
10561080 processTrack (track, vtxz, xaxis.multiplicity , acceptedTracks);
1057- if (track.eta () > cfgSubeventCuts.cfgEtaSubCMin && track.eta () < cfgSubeventCuts.cfgEtaSubCMax )
1081+ if (track.eta () > cfgSubeventCuts.cfgEtaSubCMin && track.eta () < cfgSubeventCuts.cfgEtaSubCMax ) {
10581082 pidStates.hPtMid [PidCharged]->Fill (track.pt (), getEfficiency (track, PidCharged));
1059- if (track.eta () > cfgSubeventCuts.cfgEtaSubAMin && track.eta () < cfgSubeventCuts.cfgEtaSubAMax ) // add mean pT
1083+ }
1084+ if (track.eta () > cfgSubeventCuts.cfgEtaSubAMin && track.eta () < cfgSubeventCuts.cfgEtaSubAMax ) { // add mean pT
10601085 pidStates.hPtBackward [PidCharged]->Fill (track.pt (), getEfficiency (track, PidCharged));
1061- if (track.eta () > cfgSubeventCuts.cfgEtaSubBMin && track.eta () < cfgSubeventCuts.cfgEtaSubBMax ) // add mean pT
1086+ }
1087+ if (track.eta () > cfgSubeventCuts.cfgEtaSubBMin && track.eta () < cfgSubeventCuts.cfgEtaSubBMax ) { // add mean pT
10621088 pidStates.hPtForward [PidCharged]->Fill (track.pt (), getEfficiency (track, PidCharged));
1089+ }
10631090 // If PID is identified, fill pt spectrum for the corresponding particle
10641091 int pidInd = getNsigmaPID (track);
10651092 if (pidInd != -1 && track.eta () > cfgSubeventCuts.cfgEtaSubCMin && track.eta () < cfgSubeventCuts.cfgEtaSubCMax ) {
1066- if (cfgPIDEfficiency)
1093+ if (cfgPIDEfficiency) {
10671094 pidStates.hPtMid [pidInd]->Fill (track.pt (), getEfficiency (track, pidInd));
1068- else
1095+ } else {
10691096 pidStates.hPtMid [pidInd]->Fill (track.pt (), getEfficiency (track, PidCharged)); // Default to charged particles if PID efficiency is not used
1097+ }
10701098 }
10711099 if (pidInd != -1 && track.eta () > cfgSubeventCuts.cfgEtaSubAMin && track.eta () < cfgSubeventCuts.cfgEtaSubAMax ) {
1072- if (cfgPIDEfficiency)
1100+ if (cfgPIDEfficiency) {
10731101 pidStates.hPtBackward [pidInd]->Fill (track.pt (), getEfficiency (track, pidInd));
1074- else
1102+ } else {
10751103 pidStates.hPtBackward [pidInd]->Fill (track.pt (), getEfficiency (track, PidCharged)); // Default to charged particles if PID efficiency is not used
1104+ }
10761105 }
10771106 if (pidInd != -1 && track.eta () > cfgSubeventCuts.cfgEtaSubBMin && track.eta () < cfgSubeventCuts.cfgEtaSubBMax ) {
1078- if (cfgPIDEfficiency)
1107+ if (cfgPIDEfficiency) {
10791108 pidStates.hPtForward [pidInd]->Fill (track.pt (), getEfficiency (track, pidInd));
1080- else
1109+ } else {
10811110 pidStates.hPtForward [pidInd]->Fill (track.pt (), getEfficiency (track, PidCharged)); // Default to charged particles if PID efficiency is not used
1111+ }
10821112 }
10831113 }
1084- if (cfgConsistentEventFlag & 1 )
1085- if (!acceptedTracks.nPos || !acceptedTracks.nNeg )
1114+ if (cfgConsistentEventFlag & 1 ) {
1115+ if (!acceptedTracks.nPos || !acceptedTracks.nNeg ) {
10861116 return ;
1087- if (cfgConsistentEventFlag & 2 )
1088- if (acceptedTracks.nFull < 4 ) // o2-linter: disable=magic-number (at least four tracks in full acceptance)
1117+ }
1118+ }
1119+ if (cfgConsistentEventFlag & 2 ) {
1120+ if (acceptedTracks.nFull < 4 ) { // o2-linter: disable=magic-number (at least four tracks in full acceptance)
10891121 return ;
1090- if (cfgConsistentEventFlag & 4 )
1091- if (acceptedTracks.nPos < 2 || acceptedTracks.nNeg < 2 ) // o2-linter: disable=magic-number (at least two tracks in each subevent)
1122+ }
1123+ }
1124+ if (cfgConsistentEventFlag & 4 ) {
1125+ if (acceptedTracks.nPos < 2 || acceptedTracks.nNeg < 2 ) { // o2-linter: disable=magic-number (at least two tracks in each subevent)
10921126 return ;
1093- if (cfgConsistentEventFlag & 8 )
1094- if (acceptedTracks.nPos < 2 || acceptedTracks.nMid < 2 || acceptedTracks.nNeg < 2 ) // o2-linter: disable=magic-number (at least two tracks in all three subevents)
1127+ }
1128+ }
1129+ if (cfgConsistentEventFlag & 8 ) {
1130+ if (acceptedTracks.nPos < 2 || acceptedTracks.nMid < 2 || acceptedTracks.nNeg < 2 ) { // o2-linter: disable=magic-number (at least two tracks in all three subevents)
10951131 return ;
1132+ }
1133+ }
10961134 // Fill output containers
10971135 fillOutputContainers<dt>(xaxis.centrality );
10981136 }
10991137
11001138 template <typename TTrack>
11011139 void fillAcceptedTracks (TTrack const & track, AcceptedTracks& acceptedTracks)
11021140 {
1103- if (posRegionIndex >= 0 && track.eta () > gfwMemberCache.regions .GetEtaMin ()[posRegionIndex] && track.eta () < gfwMemberCache.regions .GetEtaMax ()[posRegionIndex])
1141+ if (posRegionIndex >= 0 && track.eta () > gfwMemberCache.regions .GetEtaMin ()[posRegionIndex] && track.eta () < gfwMemberCache.regions .GetEtaMax ()[posRegionIndex]) {
11041142 ++acceptedTracks.nPos ;
1105- if (negRegionIndex >= 0 && track.eta () > gfwMemberCache.regions .GetEtaMin ()[negRegionIndex] && track.eta () < gfwMemberCache.regions .GetEtaMax ()[negRegionIndex])
1143+ }
1144+ if (negRegionIndex >= 0 && track.eta () > gfwMemberCache.regions .GetEtaMin ()[negRegionIndex] && track.eta () < gfwMemberCache.regions .GetEtaMax ()[negRegionIndex]) {
11061145 ++acceptedTracks.nNeg ;
1107- if (fullRegionIndex >= 0 && track.eta () > gfwMemberCache.regions .GetEtaMin ()[fullRegionIndex] && track.eta () < gfwMemberCache.regions .GetEtaMax ()[fullRegionIndex])
1146+ }
1147+ if (fullRegionIndex >= 0 && track.eta () > gfwMemberCache.regions .GetEtaMin ()[fullRegionIndex] && track.eta () < gfwMemberCache.regions .GetEtaMax ()[fullRegionIndex]) {
11081148 ++acceptedTracks.nFull ;
1109- if (midRegionIndex >= 0 && track.eta () > gfwMemberCache.regions .GetEtaMin ()[midRegionIndex] && track.eta () < gfwMemberCache.regions .GetEtaMax ()[midRegionIndex])
1149+ }
1150+ if (midRegionIndex >= 0 && track.eta () > gfwMemberCache.regions .GetEtaMin ()[midRegionIndex] && track.eta () < gfwMemberCache.regions .GetEtaMax ()[midRegionIndex]) {
11101151 ++acceptedTracks.nMid ;
1152+ }
11111153 }
11121154
11131155 template <typename TTrack>
11141156 bool trackSelected (TTrack const & track)
11151157 {
1116- if (cfgTrackCuts.cfgDCAxyNSigma && (std::fabs (track.dcaXY ()) > fPtDepDCAxy ->Eval (track.pt ())))
1158+ if (cfgTrackCuts.cfgDCAxyNSigma && (std::fabs (track.dcaXY ()) > fPtDepDCAxy ->Eval (track.pt ()))) {
11171159 return false ;
1160+ }
11181161 return ((track.tpcNClsCrossedRows () >= cfgTrackCuts.cfgNTPCXrows ) && (track.tpcNClsFound () >= cfgTrackCuts.cfgNTPCCls ) && (track.itsNCls () >= cfgTrackCuts.cfgMinNITSCls ));
11191162 }
11201163
@@ -1150,11 +1193,13 @@ struct FlowGfwV02 {
11501193 registry.fill (HIST (" trackQA/before/nch_pt" ), multiplicity, track.pt ());
11511194 }
11521195
1153- if (cfgGetNsigmaQA)
1196+ if (cfgGetNsigmaQA) {
11541197 fillPidQA<kBefore >(track, getNsigmaPID (track));
1198+ }
11551199
1156- if (!trackSelected (track))
1200+ if (!trackSelected (track)) {
11571201 return ;
1202+ }
11581203
11591204 fillGFW<kReco >(track, vtxz); // Fill GFW
11601205 fillAcceptedTracks (track, acceptedTracks); // Fill accepted tracks
@@ -1163,8 +1208,9 @@ struct FlowGfwV02 {
11631208 registry.fill (HIST (" trackQA/after/nch_pt" ), multiplicity, track.pt ());
11641209 }
11651210
1166- if (cfgGetNsigmaQA)
1211+ if (cfgGetNsigmaQA) {
11671212 fillPidQA<kAfter >(track, getNsigmaPID (track));
1213+ }
11681214 }
11691215
11701216 template <DataType dt, typename TTrack>
@@ -1175,24 +1221,30 @@ struct FlowGfwV02 {
11751221 bool withinPtRef = (track.pt () > gfwMemberCache.ptreflow && track.pt () < gfwMemberCache.ptrefup );
11761222 bool withinPtPOI = (track.pt () > gfwMemberCache.ptpoilow && track.pt () < gfwMemberCache.ptpoiup );
11771223
1178- if (!withinPtPOI && !withinPtRef)
1224+ if (!withinPtPOI && !withinPtRef) {
11791225 return ;
1226+ }
11801227 double weff = getEfficiency (track, PidCharged);
1181- if (weff < 0 )
1228+ if (weff < 0 ) {
11821229 return ;
1230+ }
11831231
11841232 double wacc = getAcceptance (track, vtxz);
11851233
11861234 // Fill cumulants for different particles
11871235 // ***Need to add proper weights for each particle!***
1188- if (withinPtRef)
1236+ if (withinPtRef) {
11891237 fGFW ->Fill (track.eta (), fSecondAxis ->FindBin (track.pt ()) - 1 , track.phi (), weff * wacc, 1 );
1190- if (withinPtPOI && pidInd == PidPions)
1238+ }
1239+ if (withinPtPOI && pidInd == PidPions) {
11911240 fGFW ->Fill (track.eta (), fSecondAxis ->FindBin (track.pt ()) - 1 , track.phi (), weff * wacc, PidPions + 1 );
1192- if (withinPtPOI && pidInd == PidKaons)
1241+ }
1242+ if (withinPtPOI && pidInd == PidKaons) {
11931243 fGFW ->Fill (track.eta (), fSecondAxis ->FindBin (track.pt ()) - 1 , track.phi (), weff * wacc, PidKaons + 1 );
1194- if (withinPtPOI && pidInd == PidProtons)
1244+ }
1245+ if (withinPtPOI && pidInd == PidProtons) {
11951246 fGFW ->Fill (track.eta (), fSecondAxis ->FindBin (track.pt ()) - 1 , track.phi (), weff * wacc, PidProtons + 1 );
1247+ }
11961248 }
11971249
11981250 template <QAFillTime ft, typename TTrack>
@@ -1310,8 +1362,9 @@ struct FlowGfwV02 {
13101362 loadCorrections (bc);
13111363
13121364 registry.fill (HIST (" eventQA/eventSel" ), kFilteredEvent );
1313- if (!collision.sel8 ())
1365+ if (!collision.sel8 ()) {
13141366 return ;
1367+ }
13151368 registry.fill (HIST (" eventQA/eventSel" ), kSel8 );
13161369 registry.fill (HIST (" eventQA/eventSel" ), kOccupancy ); // Add occupancy selection later
13171370
@@ -1321,10 +1374,12 @@ struct FlowGfwV02 {
13211374 registry.fill (HIST (" eventQA/before/centrality" ), xaxis.centrality );
13221375 registry.fill (HIST (" eventQA/before/multiplicity" ), xaxis.multiplicity );
13231376 }
1324- if (cfgUseAdditionalEventCut && !eventSelected (collision, xaxis.multiplicity , xaxis.centrality ))
1377+ if (cfgUseAdditionalEventCut && !eventSelected (collision, xaxis.multiplicity , xaxis.centrality )) {
13251378 return ;
1326- if (cfgFillQA)
1379+ }
1380+ if (cfgFillQA) {
13271381 fillEventQA<kAfter >(collision, xaxis);
1382+ }
13281383
13291384 registry.fill (HIST (" eventQA/after/centrality" ), xaxis.centrality );
13301385 registry.fill (HIST (" eventQA/after/multiplicity" ), xaxis.multiplicity );
0 commit comments