@@ -53,7 +53,8 @@ AxisSpec DeltaZAxis = {61, -6.1, 6.1};
5353AxisSpec ZAxis = {301 , -30.1 , 30.1 };
5454AxisSpec PhiAxis = {629 , 0 , o2::constants::math::TwoPI, " Rad" , " phi axis" };
5555// AxisSpec EtaAxis = {18, -4.6, -1.};
56- AxisSpec DCAxyAxis = {100 , -1 , 10 };
56+ AxisSpec DCAxyAxis = {5000 , -1 , 500 };
57+ AxisSpec DCAzAxis = {5000 , -251 , 250 };
5758AxisSpec CentAxis = {{0 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 100 }};
5859
5960static constexpr TrackSelectionFlags::flagtype trackSelectionITS =
@@ -93,6 +94,8 @@ struct PseudorapidityDensityMFT {
9394
9495 Configurable<bool > usePhiCut{" usePhiCut" , true , " use azimuthal angle cut" };
9596 Configurable<bool > useDCAxyCut{" useDCAxyCut" , false , " use DCAxy cut" };
97+ Configurable<bool > useDCAzCut{" useDCAzCut" , false , " use DCAz cut" };
98+
9699 Configurable<float > cfgPhiCut{" cfgPhiCut" , 0 .1f ,
97100 " Cut on azimuthal angle of MFT tracks" };
98101 Configurable<float > cfgPhiCut1{" cfgPhiCut1" , 0 .0f ,
@@ -111,6 +114,7 @@ struct PseudorapidityDensityMFT {
111114 " Cut on eta1" };
112115 Configurable<float > cfgChi2NDFMax{" cfgChi2NDFMax" , 2000 .0f , " Max allowed chi2/NDF for MFT tracks" };
113116 Configurable<float > maxDCAxy{" maxDCAxy" , 2 .0f , " Cut on dcaXY" };
117+ Configurable<float > maxDCAz{" maxDCAz" , 2 .0f , " Cut on dcaZ" };
114118
115119 HistogramRegistry registry{
116120 " registry" ,
@@ -143,11 +147,12 @@ struct PseudorapidityDensityMFT {
143147 {
144148 if (static_cast <int >(doprocessMult) +
145149 static_cast <int >(doprocessMultReassoc) +
150+ static_cast <int >(doprocessMultReassoc3d) +
146151 static_cast <int >(doprocessCountingCentrality) >
147152 1 ) {
148153 LOGP (fatal,
149154 " Exactly one process function between processMult, "
150- " processMultReassoc and processCountingCentrality should be "
155+ " processMultReassoc, processMultReassoc3d and processCountingCentrality should be "
151156 " enabled!" );
152157 }
153158 AxisSpec MultAxis = {multBinning, " N_{trk}" };
@@ -251,7 +256,7 @@ struct PseudorapidityDensityMFT {
251256 x->SetBinLabel (5 , " Selected INEL>0" );
252257 }
253258
254- if (doprocessMultReassoc) {
259+ if (doprocessMultReassoc || doprocessMultReassoc3d ) {
255260 registry.add ({" Tracks/Control/DeltaZ" ,
256261 " ; #it{z_{orig}}-#it{z_{reass}}" ,
257262 {HistType::kTH1F , {ZAxis}}});
@@ -321,6 +326,9 @@ struct PseudorapidityDensityMFT {
321326 registry.add ({" Tracks/Control/amb/EtaZvtxAmb_gt0" ,
322327 " ; #eta; #it{z}_{vtx} (cm); tracks" ,
323328 {HistType::kTH2F , {EtaAxis, ZAxis}}}); //
329+ registry.add ({" Tracks/Control/amb/DCAxy_amb" , " ; DCA_{xy} (cm) ambiguous" ,
330+ // {HistType::kTH1F,{{100000, 0.5, 100000.0}}}}); //
331+ {HistType::kTH1F , {DCAxyAxis}}}); //
324332
325333 registry.add ({" Tracks/Control/nonamb/nonAmbTracksEtaZvtx" ,
326334 " ; #eta; #it{z}_{vtx} (cm); tracks" ,
@@ -335,6 +343,9 @@ struct PseudorapidityDensityMFT {
335343 registry.add ({" Tracks/Control/nonamb/EtaZvtxNonAmb_gt0" ,
336344 " ; #eta; #it{z}_{vtx} (cm); tracks" ,
337345 {HistType::kTH2F , {EtaAxis, ZAxis}}}); //
346+ registry.add ({" Tracks/Control/nonamb/DCAxy_nonamb" , " ; DCA_{xy}(cm) non-ambiguous" ,
347+ // {HistType::kTH1F,{{100000, 0.5, 100000.0}}}}); //
348+ {HistType::kTH1F , {{DCAxyAxis}}}}); //
338349
339350 registry.add ({" Tracks/Control/woOrp/woOrpTracksEtaZvtx" ,
340351 " ; #eta; #it{z}_{vtx} (cm); tracks" ,
@@ -360,6 +371,26 @@ struct PseudorapidityDensityMFT {
360371 registry.add ({" Tracks/Control/woOrp/woOrpVertexCorr" ,
361372 " ; #it{z}_{vtx}^{orig} (cm); #it{z}_{vtx}^{re} (cm)" ,
362373 {HistType::kTH2F , {ZAxis, ZAxis}}}); //
374+ registry.add ({" Tracks/Control/woOrp/DCAxy_woOrp" , " ; DCA_{xy}(cm) w/o orphan" ,
375+ // {HistType::kTH1F,{{100000, 0.5, 100000.0}}}}); //
376+ {HistType::kTH1F , {{DCAxyAxis}}}}); //
377+
378+ if (doprocessMultReassoc3d) {
379+ // DCAz histograms analogous to DCAxy, only for 3D reassociation
380+ registry.add ({" Tracks/Control/DCAZ" ,
381+ " ; DCA_{Z} (cm)" ,
382+ {HistType::kTH1F , {DCAzAxis}}});
383+ registry.add ({" Tracks/Control/amb/DCAz_amb" ,
384+ " ; DCA_{z} (cm) ambiguous" ,
385+ {HistType::kTH1F , {DCAzAxis}}});
386+ registry.add ({" Tracks/Control/nonamb/DCAz_nonamb" ,
387+ " ; DCA_{z}(cm) non-ambiguous" ,
388+ {HistType::kTH1F , {DCAzAxis}}});
389+ registry.add ({" Tracks/Control/woOrp/DCAz_woOrp" ,
390+ " ; DCA_{z}(cm) w/o orphan" ,
391+ {HistType::kTH1F , {DCAzAxis}}});
392+ }
393+
363394 registry.add ({" collisionID" , " ; Collision ID" ,
364395 // {HistType::kTH1F,{{100000, 0.5, 100000.0}}}}); //
365396 {HistType::kTH1F , {{100000 , -50000.0 , 50000.0 }}}}); //
@@ -567,10 +598,12 @@ struct PseudorapidityDensityMFT {
567598
568599 PROCESS_SWITCH (PseudorapidityDensityMFT, processMult,
569600 " Process reco or data info" , true );
570- void processMultReassoc (CollwEv::iterator const & collision,
571- o2::aod::MFTTracks const &,
572- soa::SmallGroups<aod::BestCollisionsFwd> const & retracks,
573- FiCentralTracks const & midtracks, aod::Tracks const &)
601+ // Common implementation for both BestCollisionsFwd and BestCollisionsFwd3d
602+ template <typename RetracksT>
603+ void processMultReassocCommon (CollwEv::iterator const & collision,
604+ o2::aod::MFTTracks const &,
605+ RetracksT const & retracks,
606+ FiCentralTracks const & midtracks, aod::Tracks const &)
574607 {
575608 registry.fill (HIST (" EventSelection" ), 1 .);
576609 auto perCollisionSample = sampleCentral->sliceByCached (
@@ -596,6 +629,13 @@ struct PseudorapidityDensityMFT {
596629 if (dcaxy_cut > maxDCAxy)
597630 continue ;
598631 }
632+ if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
633+ float dcaz_cut = retrack.bestDCAZ ();
634+ if (useDCAzCut) {
635+ if (dcaz_cut > maxDCAz)
636+ continue ;
637+ }
638+ }
599639 if ((cfgnEta1 < track.eta ()) && (track.eta () < cfgnEta2) && track.nClusters () >= cfgnCluster && retrack.ambDegree () > 0 && chi2ndf < cfgChi2NDFMax && (phi > cfgPhiCut1 && phi < cfgPhiCut2)) {
600640 registry.fill (HIST (" Tracks/2Danalysis/EtaZvtx" ), track.eta (), z);
601641 }
@@ -641,6 +681,13 @@ struct PseudorapidityDensityMFT {
641681 if (dcaxy_cut > maxDCAxy)
642682 continue ;
643683 }
684+ if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
685+ float dcaz_cut = retrack.bestDCAZ ();
686+ if (useDCAzCut) {
687+ if (dcaz_cut > maxDCAz)
688+ continue ;
689+ }
690+ }
644691 if ((cfgnEta1 < track.eta ()) && (track.eta () < cfgnEta2) && track.nClusters () >= cfgnCluster && retrack.ambDegree () > 0 && chi2ndf < cfgChi2NDFMax && (phi > cfgPhiCut1 && phi < cfgPhiCut2)) {
645692 registry.fill (HIST (" Tracks/Control/Chi2NDF" ), chi2ndf);
646693 registry.fill (HIST (" Tracks/2Danalysis/EtaZvtx_sel8" ), track.eta (), z);
@@ -661,6 +708,7 @@ struct PseudorapidityDensityMFT {
661708 float phi = track.phi ();
662709 float dcaxy_cut = retrack.bestDCAXY ();
663710 o2::math_utils::bringTo02Pi (phi);
711+ // Declare dcaz_cut only if needed below.
664712 if ((cfgnEta1 < track.eta ()) && (track.eta () < cfgnEta2) && track.nClusters () >= cfgnCluster && chi2ndf < cfgChi2NDFMax && (phi > cfgPhiCut1 && phi < cfgPhiCut2)) {
665713 if (usePhiCut) {
666714 if ((phi <= 0.02 ) || ((phi >= 3.10 ) && (phi <= 3.23 )) || (phi >= 6.21 ))
@@ -670,6 +718,13 @@ struct PseudorapidityDensityMFT {
670718 if (dcaxy_cut > maxDCAxy)
671719 continue ;
672720 }
721+ if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
722+ float dcaz_cut = retrack.bestDCAZ ();
723+ if (useDCAzCut) {
724+ if (dcaz_cut > maxDCAz)
725+ continue ;
726+ }
727+ }
673728 registry.fill (HIST (" TracksEtaZvtx" ), track.eta (), z);
674729 if (midtracks.size () > 0 && retrack.ambDegree () > 0 ) {
675730 registry.fill (HIST (" Tracks/EtaZvtx_gt0" ), track.eta (), z);
@@ -701,10 +756,10 @@ struct PseudorapidityDensityMFT {
701756 registry.fill (HIST (" Tracks/Control/ReassignedTracksPhiEta" ), phi,
702757 track.eta ());
703758 registry.fill (HIST (" Tracks/Control/ReassignedVertexCorr" ),
704- track.collision_as <CollwEv>().posZ (), z);
759+ track.template collision_as <CollwEv>().posZ (), z);
705760
706761 registry.fill (HIST (" Tracks/Control/DeltaZ" ),
707- track.collision_as <CollwEv>().posZ () -
762+ track.template collision_as <CollwEv>().posZ () -
708763 collision.posZ ());
709764 registry.fill (HIST (" Tracks/Control/TrackCount" ), 1 );
710765 }
@@ -714,13 +769,16 @@ struct PseudorapidityDensityMFT {
714769 registry.fill (HIST (" Tracks/Control/notReassignedTracksPhiEta" ), phi,
715770 track.eta ());
716771 registry.fill (HIST (" Tracks/Control/notReassignedVertexCorr" ),
717- track.collision_as <CollwEv>().posZ (), z);
772+ track.template collision_as <CollwEv>().posZ (), z);
718773 registry.fill (HIST (" Tracks/Control/TrackCount" ), 2 );
719774 }
720775
721776 registry.fill (HIST (" Tracks/Control/TrackAmbDegree" ),
722777 retrack.ambDegree ());
723778 registry.fill (HIST (" Tracks/Control/DCAXY" ), retrack.bestDCAXY ());
779+ if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
780+ registry.fill (HIST (" Tracks/Control/DCAZ" ), retrack.bestDCAZ ());
781+ }
724782 int isAmbiguous = 0 ;
725783
726784 if (retrack.ambDegree () > 1 && retrack.ambDegree () != 0 ) {
@@ -734,7 +792,11 @@ struct PseudorapidityDensityMFT {
734792 registry.fill (HIST (" Tracks/Control/amb/AmbTracksPhiEta" ), phi,
735793 track.eta ());
736794 registry.fill (HIST (" Tracks/Control/amb/AmbVertexCorr" ),
737- track.collision_as <CollwEv>().posZ (), z);
795+ track.template collision_as <CollwEv>().posZ (), z);
796+ registry.fill (HIST (" Tracks/Control/amb/DCAxy_amb" ), retrack.bestDCAXY ());
797+ if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
798+ registry.fill (HIST (" Tracks/Control/amb/DCAz_amb" ), retrack.bestDCAZ ());
799+ }
738800 registry.fill (HIST (" Tracks/Control/TrackCount" ), 3 );
739801 if (track.collisionId () == retrack.bestCollisionId ()) {
740802 registry.fill (HIST (" Tracks/Control/TrackCount" ), 5 );
@@ -754,7 +816,11 @@ struct PseudorapidityDensityMFT {
754816 registry.fill (HIST (" Tracks/Control/nonamb/nonAmbTracksPhiEta" ), phi,
755817 track.eta ());
756818 registry.fill (HIST (" Tracks/Control/nonamb/nonAmbVertexCorr" ),
757- track.collision_as <CollwEv>().posZ (), z);
819+ track.template collision_as <CollwEv>().posZ (), z);
820+ registry.fill (HIST (" Tracks/Control/nonamb/DCAxy_nonamb" ), retrack.bestDCAXY ());
821+ if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
822+ registry.fill (HIST (" Tracks/Control/nonamb/DCAz_nonamb" ), retrack.bestDCAZ ());
823+ }
758824 registry.fill (HIST (" Tracks/Control/TrackCount" ), 4 );
759825 if (track.collisionId () == retrack.bestCollisionId ()) {
760826 registry.fill (HIST (" Tracks/Control/TrackCount" ), 6 );
@@ -772,8 +838,12 @@ struct PseudorapidityDensityMFT {
772838 registry.fill (HIST (" Tracks/Control/woOrp/woOrpTracksPhiEta" ), phi,
773839 track.eta ());
774840 registry.fill (HIST (" Tracks/Control/woOrp/woOrpVertexCorr" ),
775- track.collision_as <CollwEv>().posZ (), z);
841+ track.template collision_as <CollwEv>().posZ (), z);
776842 registry.fill (HIST (" Tracks/Control/TrackCount" ), 9 ); // without orphan
843+ registry.fill (HIST (" Tracks/Control/woOrp/DCAxy_woOrp" ), retrack.bestDCAXY ());
844+ if constexpr (std::is_same_v<RetracksT, soa::SmallGroups<aod::BestCollisionsFwd3d>>) {
845+ registry.fill (HIST (" Tracks/Control/woOrp/DCAz_woOrp" ), retrack.bestDCAZ ());
846+ }
777847 }
778848 }
779849 }
@@ -792,9 +862,28 @@ struct PseudorapidityDensityMFT {
792862 registry.fill (HIST (" EventSelection" ), 7 );
793863 }
794864 }
865+
866+ void processMultReassoc (CollwEv::iterator const & collision,
867+ o2::aod::MFTTracks const & mft,
868+ soa::SmallGroups<aod::BestCollisionsFwd> const & retracks,
869+ FiCentralTracks const & midtracks, aod::Tracks const & trk)
870+ {
871+ processMultReassocCommon (collision, mft, retracks, midtracks, trk);
872+ }
873+
874+ void processMultReassoc3d (CollwEv::iterator const & collision,
875+ o2::aod::MFTTracks const & mft,
876+ soa::SmallGroups<aod::BestCollisionsFwd3d> const & retracks,
877+ FiCentralTracks const & midtracks, aod::Tracks const & trk)
878+ {
879+ processMultReassocCommon (collision, mft, retracks, midtracks, trk);
880+ }
795881 PROCESS_SWITCH (PseudorapidityDensityMFT, processMultReassoc,
796882 " Process reco or data info" , false );
797883
884+ PROCESS_SWITCH (PseudorapidityDensityMFT, processMultReassoc3d,
885+ " Process reco or data info (3d)" , false );
886+
798887 using ExColsCent = soa::Join<aod::Collisions, aod::CentFT0Cs, aod::EvSels>;
799888
800889 void processCountingCentrality (ExColsCent::iterator const & collision,
0 commit comments