@@ -272,6 +272,7 @@ struct MftReassociationValidation {
272272 Configurable<bool > fillGeneralHistograms{" fillGeneralHistograms" , true , " Fill general reassociation efficiencyhistograms" };
273273 Configurable<bool > fillSpecificHistograms{" fillSpecificHistograms" , true , " Fill specific histograms (DCA, DeltaPos)" };
274274 Configurable<bool > fillParametersHistograms{" fillParametersHistograms" , true , " Fill parameters histograms" };
275+ Configurable<bool > fillDcaTemplateFit{" fillDcaTemplateFit" , true , " Fill DCA template histograms for primary/secondary fraction fit" };
275276 Configurable<bool > keepOnlyPhysicalPrimary{" keepOnlyPhysicalPrimary" , true , " Keep only physical primary particles" };
276277 Configurable<bool > keepOnlySecondaries{" keepOnlySecondaries" , false , " Keep only secondary particles" };
277278 Configurable<std::string> grpmagPath{" grpmagPath" , " GLO/Config/GRPMagField" , " CCDB path of the GRPMagField object" };
@@ -309,8 +310,6 @@ struct MftReassociationValidation {
309310 Configurable<bool > cutOrphanTracksExplicitly{" cutOrphanTracksExplicitly" , false , " if true, cut orphan tracks explicitly" };
310311 Configurable<bool > cutOnDcaXY{" cutOnDcaXY" , false , " if true, cut on DCA XY" };
311312 Configurable<bool > cutOnDcaZ{" cutOnDcaZ" , false , " if true, cut on DCA Z" };
312- Configurable<float > dcaXYMax{" dcaXYMax" , 2 .0f , " Maximum value for DCA XY" };
313- Configurable<float > dcaZMax{" dcaZMax" , 10 .0f , " Maximum value for DCA Z" };
314313 Configurable<float > etaMftTrackMax{" etaMftTrackMax" , -2 .4f , " Maximum value for the eta of MFT tracks when used in cut function" };
315314 Configurable<float > etaMftTrackMin{" etaMftTrackMin" , -3 .36f , " Minimum value for the eta of MFT tracks when used in cut function" };
316315 Configurable<float > etaMftTrackMaxFilter{" etaMftTrackMaxFilter" , -2 .0f , " Maximum value for the eta of MFT tracks when used in filter" };
@@ -406,6 +405,8 @@ struct MftReassociationValidation {
406405 ConfigurableAxis axisDcaX{" axisDcaX" , {500 , -0.1 , 2.1 }, " DCAx binning (cm)" };
407406 ConfigurableAxis axisDcaY{" axisDcaY" , {500 , -0.1 , 2.1 }, " DCAy binning (cm)" };
408407 ConfigurableAxis axisDcaZ{" axisDcaZ" , {500 , -1 ., 1 .}, " DCAz binning (cm)" };
408+ ConfigurableAxis axisDcaXYfit{" axisDcaXYfit" , {500 , 0 ., 2 .}, " DCAxy binning (cm) for the template fit" };
409+ ConfigurableAxis axisDcaZfit{" axisDcaZfit" , {500 , -1 ., 1 .}, " DCAz binning (cm) for the template fit" };
409410 ConfigurableAxis axisMultiplicity{" axisMultiplicity" , {VARIABLE_WIDTH , 0 , 5 , 10 , 20 , 30 , 40 , 50 , 100.1 }, " multiplicity axis for histograms" };
410411 ConfigurableAxis axisPhi{" axisPhi" , {72 , 0 , TwoPI}, " phi axis for histograms" };
411412 ConfigurableAxis axisPt{" axisPt" , {72 , 0 , 36 }, " pt axis for histograms" };
@@ -578,6 +579,11 @@ struct MftReassociationValidation {
578579 registry.get <TH1 >(HIST (" MC/2D/hIsTrueCollisionAmongCompatibleCollisionsDcaNotReassociated" ))->GetXaxis ()->SetBinLabel (iBin + 1 , labelsMftIsTrueCollisionAmongCompatibleCollisionsStep[iBin].data ());
579580 }
580581 }
582+
583+ if (configTask.fillDcaTemplateFit ) {
584+ registry.add (" MC/2D/DcaFit/hPtVsDcaXY_prim" , " Primary DCA_{xy} (2D);p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
585+ registry.add (" MC/2D/DcaFit/hPtVsDcaXY_sec" , " Secondary DCA_{xy} (2D);p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
586+ }
581587 }
582588
583589 void addMftMonteCarloHistograms3D ()
@@ -689,6 +695,20 @@ struct MftReassociationValidation {
689695 registry.get <TH1 >(HIST (" MC/3D/hIsTrueCollisionAmongCompatibleCollisionsDcaNotReassociated" ))->GetXaxis ()->SetBinLabel (iBin + 1 , labelsMftIsTrueCollisionAmongCompatibleCollisionsStep[iBin].data ());
690696 }
691697 }
698+
699+ if (configTask.fillDcaTemplateFit ) {
700+ // 3D reassociated
701+ registry.add (" MC/3D/DcaFit/hPtVsDcaXY_prim" , " Primary DCA_{xy} (3D);p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
702+ registry.add (" MC/3D/DcaFit/hPtVsDcaXY_sec" , " Secondary DCA_{xy} (3D);p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
703+ registry.add (" MC/3D/DcaFit/hPtVsDcaZ_prim" , " Primary DCA_{z} (3D);p_{T} (GeV/c);DCA_{z} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaZfit });
704+ registry.add (" MC/3D/DcaFit/hPtVsDcaZ_sec" , " Secondary DCA_{z} (3D);p_{T} (GeV/c);DCA_{z} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaZfit });
705+
706+ // Non-ambiguous
707+ registry.add (" MC/3D/DcaFit/NonAmb/hPtVsDcaXY_prim" , " NonAmb Primary DCA_{xy};p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
708+ registry.add (" MC/3D/DcaFit/NonAmb/hPtVsDcaXY_sec" , " NonAmb Secondary DCA_{xy};p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
709+ registry.add (" MC/3D/DcaFit/NonAmb/hPtVsDcaZ_prim" , " NonAmb Primary DCA_{z};p_{T} (GeV/c);DCA_{z} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaZfit });
710+ registry.add (" MC/3D/DcaFit/NonAmb/hPtVsDcaZ_sec" , " NonAmb Secondary DCA_{z};p_{T} (GeV/c);DCA_{z} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaZfit });
711+ }
692712 }
693713
694714 template <ReassociationMethod ReassociationMethod, McStatus McStatus>
@@ -833,6 +853,10 @@ struct MftReassociationValidation {
833853
834854 if (doprocessData) {
835855 addMftHistograms<Data, TwoDimensional>();
856+
857+ if (configTask.fillDcaTemplateFit ) {
858+ registry.add (" Data/2D/DcaFit/hPtVsDcaXY" , " Data DCA_{xy} (2D);p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
859+ }
836860 }
837861
838862 if (doprocessMcReassociated2d) {
@@ -857,6 +881,18 @@ struct MftReassociationValidation {
857881 addMftMonteCarloHistograms3D ();
858882 }
859883
884+ if (doprocessData3d) {
885+ addMftHistograms<Data, ThreeDimensional>();
886+
887+ if (configTask.fillDcaTemplateFit ) {
888+ registry.add (" Data/3D/DcaFit/hPtVsDcaXY" , " Data DCA_{xy} (3D);p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
889+ registry.add (" Data/3D/DcaFit/hPtVsDcaZ" , " Data DCA_{z} (3D);p_{T} (GeV/c);DCA_{z} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaZfit });
890+
891+ registry.add (" Data/3D/DcaFit/NonAmb/hPtVsDcaXY" , " NonAmb Data DCA_{xy};p_{T} (GeV/c);DCA_{xy} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaXYfit });
892+ registry.add (" Data/3D/DcaFit/NonAmb/hPtVsDcaZ" , " NonAmb Data DCA_{z};p_{T} (GeV/c);DCA_{z} (cm)" , kTH2F , {configAxis.axisPt , configAxis.axisDcaZfit });
893+ }
894+ }
895+
860896 } // End of init() function
861897
862898 // =========================
@@ -1108,11 +1144,11 @@ struct MftReassociationValidation {
11081144 }
11091145 }
11101146
1111- if (configMft.cutOnDcaXY && std::abs (dcaXY) > configMft.dcaXYMax ) {
1147+ if (configMft.cutOnDcaXY && std::abs (dcaXY) > configMft.mftMaxDCAxy ) {
11121148 return false ;
11131149 }
11141150 registry.fill (HIST (" MC/" ) + HIST (WhatReassociationMethod[ReassociationMethod]) + HIST (" hPreciseTrackSelectionCounter" ), SpecificTrackSelectionStep::AfterDcaXYCut);
1115- if (configMft.cutOnDcaZ && std::abs (dcaZ) > configMft.dcaZMax ) {
1151+ if (configMft.cutOnDcaZ && std::abs (dcaZ) > configMft.mftMaxDCAz ) {
11161152 return false ;
11171153 }
11181154 registry.fill (HIST (" MC/" ) + HIST (WhatReassociationMethod[ReassociationMethod]) + HIST (" hPreciseTrackSelectionCounter" ), SpecificTrackSelectionStep::AfterDcaZCut);
@@ -1199,31 +1235,77 @@ struct MftReassociationValidation {
11991235
12001236 for (const auto & reassociated2dMftTrack : reassociated2dMftTracks) {
12011237
1202- registry.fill (HIST (" Data/hAmbiguityOfMftTracks" ), MftTrackAmbiguityStep::AllMftTracks);
12031238 auto templatedMftTrack = reassociated2dMftTrack.template mfttrack_as <FilteredMftTracks>();
12041239
12051240 o2::track::TrackParCovFwd trackPar = o2::aod::fwdtrackutils::getTrackParCovFwdShift (templatedMftTrack, mZShift );
12061241 std::array<double , 3 > dcaInfOrig;
12071242 trackPar.propagateToDCAhelix (bZ, {collision.posX (), collision.posY (), collision.posZ ()}, dcaInfOrig);
1208- auto dcaXYoriginal = 999 .f ;
1209- dcaXYoriginal = std::sqrt (dcaInfOrig[0 ] * dcaInfOrig[0 ] + dcaInfOrig[1 ] * dcaInfOrig[1 ]);
1243+ // auto dcaXYoriginal = 999.f;
1244+ // dcaXYoriginal = std::sqrt(dcaInfOrig[0] * dcaInfOrig[0] + dcaInfOrig[1] * dcaInfOrig[1]);
12101245
1211- if (!isAcceptedMftTrack<TwoDimensional>(templatedMftTrack, false , true , dcaXYoriginal , dcaInfOrig[2 ])) {
1246+ if (!isAcceptedMftTrack<TwoDimensional>(templatedMftTrack, false , true , reassociated2dMftTrack. bestDCAXY () , dcaInfOrig[2 ])) {
12121247 continue ;
12131248 }
12141249
1215- registry.fill (HIST (" Data/hAmbiguityOfMftTracks" ), MftTrackAmbiguityStep::AfterTrackSelection);
1216-
1217- if (isAmbiguousMftTrack<Data, TwoDimensional>(reassociated2dMftTrack, true )) {
1218- registry.fill (HIST (" Data/hReassociation2dMftTracks" ), Reassociation2dMftTracks::NotReassociated2dMftTracks);
1250+ if (configTask.fillDcaTemplateFit ) {
1251+ registry.fill (HIST (" Data/2D/DcaFit/hPtVsDcaXY" ), templatedMftTrack.pt (), reassociated2dMftTrack.bestDCAXY ());
12191252 }
12201253
12211254 } // end of loop over reassociated MFT tracks
1222-
1223- // TO-DO the same for reassociated3d (change the histograms)
12241255 }
12251256 PROCESS_SWITCH (MftReassociationValidation, processData, " Process MFT reassociation validation for DATA" , false );
12261257
1258+ void processData3d (FilteredCollisionsWSelMult::iterator const & collision,
1259+ FilteredMftTracks const & /* mftTracks*/ ,
1260+ soa::SmallGroups<aod::BestCollisionsFwd3d> const & reassociated3dMftTracks,
1261+ aod::BCsWithTimestamps const &)
1262+ {
1263+ auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
1264+ if (areCorrectionsLoaded == false ) {
1265+ loadZVertexShiftCorrection (bc);
1266+ areCorrectionsLoaded = true ;
1267+ }
1268+
1269+ if (!isAcceptedCollision<ThreeDimensional>(collision, false )) {
1270+ return ;
1271+ }
1272+
1273+ for (const auto & reassociated3dMftTrack : reassociated3dMftTracks) {
1274+ auto templatedMftTrack = reassociated3dMftTrack.template mfttrack_as <FilteredMftTracks>();
1275+
1276+ // // Compute DCA at original collision for isAcceptedMftTrack
1277+ // o2::track::TrackParCovFwd trackPar =
1278+ // o2::aod::fwdtrackutils::getTrackParCovFwdShift(templatedMftTrack, mZShift);
1279+ // std::array<double, 3> dcaInfOrig;
1280+ // trackPar.propagateToDCAhelix(
1281+ // bZ,
1282+ // {collision.posX(), collision.posY(), collision.posZ()},
1283+ // dcaInfOrig);
1284+ // const float dcaXYoriginal =
1285+ // std::sqrt(dcaInfOrig[0] * dcaInfOrig[0] +
1286+ // dcaInfOrig[1] * dcaInfOrig[1]);
1287+
1288+ // Use existing track selection function (unchanged)
1289+ if (!isAcceptedMftTrack<ThreeDimensional>(templatedMftTrack, false , true , reassociated3dMftTrack.bestDCAXY (), reassociated3dMftTrack.bestDCAZ ())) {
1290+ continue ;
1291+ }
1292+
1293+ if (configTask.fillDcaTemplateFit ) {
1294+ registry.fill (HIST (" Data/3D/DcaFit/hPtVsDcaXY" ), templatedMftTrack.pt (), reassociated3dMftTrack.bestDCAXY ());
1295+ registry.fill (HIST (" Data/3D/DcaFit/hPtVsDcaZ" ), templatedMftTrack.pt (), reassociated3dMftTrack.bestDCAZ ());
1296+ }
1297+
1298+ // The same for nonambi only
1299+ if (reassociated3dMftTrack.ambDegree () == 1 ) {
1300+ if (configTask.fillDcaTemplateFit ) {
1301+ registry.fill (HIST (" Data/3D/DcaFit/NonAmb/hPtVsDcaXY" ), templatedMftTrack.pt (), reassociated3dMftTrack.bestDCAXY ());
1302+ registry.fill (HIST (" Data/3D/DcaFit/NonAmb/hPtVsDcaZ" ), templatedMftTrack.pt (), reassociated3dMftTrack.bestDCAZ ());
1303+ }
1304+ }
1305+ }
1306+ }
1307+ PROCESS_SWITCH (MftReassociationValidation, processData3d, " Process DCA fit histograms for DATA 3D reassociation" , false );
1308+
12271309 void processCreateLookupTable (FilteredCollisionsWSelMultMcLabels const & collisions, soa::Join<aod::McCollisions, aod::McCollsExtra> const & mcCollisions)
12281310 {
12291311 recoVtxX.clear ();
@@ -1347,6 +1429,15 @@ struct MftReassociationValidation {
13471429 registry.fill (HIST (" MC/2D/hPreciseTrackSelectionCounter" ), SpecificTrackSelectionStep::HasMcParticle);
13481430
13491431 auto particle = templatedTrack.template mcParticle_as <aod::McParticles>();
1432+
1433+ if (configTask.fillDcaTemplateFit ) {
1434+ if (particle.isPhysicalPrimary ()) {
1435+ registry.fill (HIST (" MC/2D/DcaFit/hPtVsDcaXY_prim" ), templatedTrack.pt (), reassociated2dMftTrack.bestDCAXY ());
1436+ } else {
1437+ registry.fill (HIST (" MC/2D/DcaFit/hPtVsDcaXY_sec" ), templatedTrack.pt (), reassociated2dMftTrack.bestDCAXY ());
1438+ }
1439+ }
1440+
13501441 float deltaX = -999 .f ;
13511442 float deltaY = -999 .f ;
13521443 float deltaZ = -999 .f ;
@@ -1734,6 +1825,25 @@ struct MftReassociationValidation {
17341825 registry.fill (HIST (" MC/3D/hPreciseTrackSelectionCounter" ), SpecificTrackSelectionStep::HasMcParticle);
17351826
17361827 auto particle = templatedTrack.template mcParticle_as <aod::McParticles>();
1828+
1829+ if (configTask.fillDcaTemplateFit ) {
1830+ if (particle.isPhysicalPrimary ()) {
1831+ registry.fill (HIST (" MC/3D/DcaFit/hPtVsDcaXY_prim" ), templatedTrack.pt (), reassociated3dMftTrack.bestDCAXY ());
1832+ registry.fill (HIST (" MC/3D/DcaFit/hPtVsDcaZ_prim" ), templatedTrack.pt (), reassociated3dMftTrack.bestDCAZ ());
1833+ if (reassociated3dMftTrack.ambDegree () == 1 ) {
1834+ registry.fill (HIST (" MC/3D/DcaFit/NonAmb/hPtVsDcaXY_prim" ), templatedTrack.pt (), reassociated3dMftTrack.bestDCAXY ());
1835+ registry.fill (HIST (" MC/3D/DcaFit/NonAmb/hPtVsDcaZ_prim" ), templatedTrack.pt (), reassociated3dMftTrack.bestDCAZ ());
1836+ }
1837+ } else {
1838+ registry.fill (HIST (" MC/3D/DcaFit/hPtVsDcaXY_sec" ), templatedTrack.pt (), reassociated3dMftTrack.bestDCAXY ());
1839+ registry.fill (HIST (" MC/3D/DcaFit/hPtVsDcaZ_sec" ), templatedTrack.pt (), reassociated3dMftTrack.bestDCAZ ());
1840+ if (reassociated3dMftTrack.ambDegree () == 1 ) {
1841+ registry.fill (HIST (" MC/3D/DcaFit/NonAmb/hPtVsDcaXY_sec" ), templatedTrack.pt (), reassociated3dMftTrack.bestDCAXY ());
1842+ registry.fill (HIST (" MC/3D/DcaFit/NonAmb/hPtVsDcaZ_sec" ), templatedTrack.pt (), reassociated3dMftTrack.bestDCAZ ());
1843+ }
1844+ }
1845+ }
1846+
17371847 float deltaX = -999 .f ;
17381848 float deltaY = -999 .f ;
17391849 float deltaZ = -999 .f ;
0 commit comments