4646#include < THn.h>
4747#include < TString.h>
4848
49+ #include < algorithm>
4950#include < array>
5051#include < chrono>
5152#include < cmath>
@@ -118,6 +119,7 @@ enum SpecificTrackSelectionStep {
118119 AfterPtCut,
119120 AfterDcaXYCut,
120121 AfterDcaZCut,
122+ AfterChi2OverNdfCut,
121123 IsCATrack,
122124 IsLTFTrack,
123125 HasMcParticle,
@@ -313,6 +315,7 @@ struct MftReassociationValidation {
313315 Configurable<float > etaMftTrackMin{" etaMftTrackMin" , -3 .36f , " Minimum value for the eta of MFT tracks when used in cut function" };
314316 Configurable<float > etaMftTrackMaxFilter{" etaMftTrackMaxFilter" , -2 .0f , " Maximum value for the eta of MFT tracks when used in filter" };
315317 Configurable<float > etaMftTrackMinFilter{" etaMftTrackMinFilter" , -3 .9f , " Minimum value for the eta of MFT tracks when used in filter" };
318+ Configurable<float > maxChi2OverNdf{" maxChi2OverNdf" , 1000 .f , " maximum chi2/ndf for MFT tracks" };
316319 Configurable<float > mftMaxDCAxy{" mftMaxDCAxy" , 2 .0f , " Cut on dcaXY for MFT tracks" };
317320 Configurable<float > mftMaxDCAz{" mftMaxDCAz" , 2 .0f , " Cut on dcaZ for MFT tracks" };
318321 Configurable<int > nClustersMftTrack{" nClustersMftTrack" , 5 , " Minimum number of clusters for the reconstruction of MFT tracks" };
@@ -321,6 +324,7 @@ struct MftReassociationValidation {
321324 Configurable<bool > useMftPtCut{" useMftPtCut" , false , " if true, use the Mft pt function cut" };
322325 Configurable<bool > useOnlyCATracks{" useOnlyCATracks" , false , " if true, use strictly MFT tracks reconstructed with CA algo." };
323326 Configurable<bool > useOnlyLTFTracks{" useOnlyLTFTracks" , false , " if true, use strictly MFT tracks reconstructed with LTF algo." };
327+ Configurable<bool > useMftChi2OverNdfCut{" useMftChi2OverNdfCut" , false , " use mft track chi2/ndf cut" };
324328 } configMft;
325329
326330 float mZShift = 0 ; // z-vertex shift
@@ -331,8 +335,8 @@ struct MftReassociationValidation {
331335 Service<o2::ccdb::BasicCCDBManager> ccdb;
332336 o2::ccdb::CcdbApi ccdbApi;
333337 o2::parameters::GRPMagField* grpmag = nullptr ;
334- RCTFlagsChecker rctChecker;
335- RCTFlagsChecker correlationAnalysisRctChecker{kFT0Bad , kITSBad , kTPCBadTracking , kTPCBadPID , kMFTBad };
338+ RCTFlagsChecker rctChecker{ kFT0Bad , kITSBad , kTPCBadTracking , kTPCBadPID , kMFTBad } ;
339+ RCTFlagsChecker correlationAnalysisRctChecker{kFT0Bad , kITSBad , kTPCBadTracking , kTPCBadPID , kMFTBad , kITSLimAccMCRepr , kMFTLimAccMCRepr , kTPCLimAccMCRepr };
336340 std::array<std::shared_ptr<THnSparse>, MatchedToTrueCollisionStep::NMatchedToTrueCollisionSteps> hZVtxDiffAmbiguousTracks2D;
337341 std::array<std::shared_ptr<THnSparse>, MatchedToTrueCollisionStep::NMatchedToTrueCollisionSteps> hZVtxDiffNonAmbiguousTracks2D;
338342 std::array<std::shared_ptr<THnSparse>, MatchedToTrueCollisionStep::NMatchedToTrueCollisionSteps> hZVtxDiffNotMatchedTracks2D;
@@ -705,7 +709,7 @@ struct MftReassociationValidation {
705709
706710 registry.add (Form (" MC/%s%shCollPosX" , WhatReassociationMethod[ReassociationMethod].data (), WhatMcStatus[McStatus].data ()), " " , {HistType::kTH1D , {configAxis.axisPosX }});
707711 registry.add (Form (" MC/%s%shCollPosY" , WhatReassociationMethod[ReassociationMethod].data (), WhatMcStatus[McStatus].data ()), " " , {HistType::kTH1D , {configAxis.axisPosX }});
708- registry.add (Form (" MC/%s%shCollPosZ" , WhatReassociationMethod[ReassociationMethod].data (), WhatMcStatus[McStatus].data ()), " " , {HistType::kTH1D , {configAxis.axisVertex }});
712+ registry.add (Form (" MC/%s%shCollPosZ" , WhatReassociationMethod[ReassociationMethod].data (), WhatMcStatus[McStatus].data ()), " " , {HistType::kTH1D , {configAxis.axisPosZ }});
709713 registry.add (Form (" MC/%s%shCollMultiplicity" , WhatReassociationMethod[ReassociationMethod].data (), WhatMcStatus[McStatus].data ()), " " , {HistType::kTH1D , {configAxis.axisMultiplicity }});
710714 registry.add (Form (" MC/%s%shCollNumContrib" , WhatReassociationMethod[ReassociationMethod].data (), WhatMcStatus[McStatus].data ()), " " , {HistType::kTH1D , {configAxis.axisMultiplicity }});
711715 }
@@ -720,8 +724,8 @@ struct MftReassociationValidation {
720724 ccdb->setCaching (true );
721725 ccdb->setLocalObjectValidityChecking ();
722726 ccdb->setCreatedNotAfter (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now ().time_since_epoch ()).count ());
723- rctChecker.init (configCollision. setRCTFlagCheckerLabel , configCollision. requireZDCCheck , configCollision. requireRCTFlagCheckerLimitAcceptanceAsBad , true );
724- correlationAnalysisRctChecker.init ({kFT0Bad , kITSBad , kTPCBadTracking , kTPCBadPID , kMFTBad });
727+ rctChecker.init ({ kFT0Bad , kITSBad , kTPCBadTracking , kTPCBadPID , kMFTBad } );
728+ correlationAnalysisRctChecker.init ({kFT0Bad , kITSBad , kTPCBadTracking , kTPCBadPID , kMFTBad , kITSLimAccMCRepr , kMFTLimAccMCRepr , kTPCLimAccMCRepr });
725729
726730 // =========================
727731 // Event histograms
@@ -767,6 +771,7 @@ struct MftReassociationValidation {
767771 labelsTrackSelection[SpecificTrackSelectionStep::AfterPtCut] = " after pt cut" ;
768772 labelsTrackSelection[SpecificTrackSelectionStep::AfterDcaXYCut] = " after DCA XY cut" ;
769773 labelsTrackSelection[SpecificTrackSelectionStep::AfterDcaZCut] = " after DCA Z cut" ;
774+ labelsTrackSelection[SpecificTrackSelectionStep::AfterChi2OverNdfCut] = " after chi2/ndf cut" ;
770775 labelsTrackSelection[SpecificTrackSelectionStep::IsCATrack] = " is CA track" ;
771776 labelsTrackSelection[SpecificTrackSelectionStep::IsLTFTrack] = " is LTF track" ;
772777 labelsTrackSelection[SpecificTrackSelectionStep::HasMcParticle] = " has MC particle" ;
@@ -1110,6 +1115,16 @@ struct MftReassociationValidation {
11101115 return false ;
11111116 }
11121117 registry.fill (HIST (" MC/" ) + HIST (WhatReassociationMethod[ReassociationMethod]) + HIST (" hPreciseTrackSelectionCounter" ), SpecificTrackSelectionStep::AfterDcaZCut);
1118+
1119+ if (configMft.useMftChi2OverNdfCut ) {
1120+ float ndfMftTrack = std::max (2 .0f * mftTrack.nClusters () - 5 .0f , 1 .0f );
1121+ float mftChi2OverNdf = mftTrack.chi2 () / ndfMftTrack;
1122+ if (mftChi2OverNdf > configMft.maxChi2OverNdf ) {
1123+ return false ;
1124+ }
1125+ }
1126+ registry.fill (HIST (" MC/" ) + HIST (WhatReassociationMethod[ReassociationMethod]) + HIST (" hPreciseTrackSelectionCounter" ), SpecificTrackSelectionStep::AfterChi2OverNdfCut);
1127+
11131128 // cut on the track algorithm of MFT tracks
11141129 if (mftTrack.isCA ()) {
11151130 if (fillHistograms) {
@@ -1181,7 +1196,11 @@ struct MftReassociationValidation {
11811196 aod::BCsWithTimestamps const &)
11821197 {
11831198 auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
1184- loadZVertexShiftCorrection (bc);
1199+ auto loopCounter = 0 ;
1200+ if (loopCounter == 0 ) {
1201+ loadZVertexShiftCorrection (bc);
1202+ loopCounter++;
1203+ }
11851204
11861205 if (!(isAcceptedCollision<TwoDimensional>(collision, true ))) {
11871206 return ;
@@ -1257,7 +1276,11 @@ struct MftReassociationValidation {
12571276 aod::BCsWithTimestamps const & /* bcs*/ )
12581277 {
12591278 auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
1260- loadZVertexShiftCorrection (bc);
1279+ auto loopCounter = 0 ;
1280+ if (loopCounter == 0 ) {
1281+ loadZVertexShiftCorrection (bc);
1282+ loopCounter++;
1283+ }
12611284
12621285 registry.fill (HIST (" MC/2D/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::AllMonteCarloEvents);
12631286 registry.fill (HIST (" MC/2D/hPreciseEventCounter" ), SpecificEventSelectionStep::AllEventsPrecise);
@@ -1640,7 +1663,11 @@ struct MftReassociationValidation {
16401663 aod::BCsWithTimestamps const & /* bcs*/ )
16411664 {
16421665 auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
1643- loadZVertexShiftCorrection (bc);
1666+ auto loopCounter = 0 ;
1667+ if (loopCounter == 0 ) {
1668+ loadZVertexShiftCorrection (bc);
1669+ loopCounter++;
1670+ }
16441671
16451672 registry.fill (HIST (" MC/3D/hMonteCarloEventCounter" ), MonteCarloEventSelectionStep::AllMonteCarloEvents);
16461673 registry.fill (HIST (" MC/3D/hPreciseEventCounter" ), SpecificEventSelectionStep::AllEventsPrecise);
0 commit comments