@@ -71,15 +71,17 @@ struct CreateResolutionMap {
7171 Configurable<int > cfgCentEstimator{" cfgCentEstimator" , 2 , " FT0M:0, FT0A:1, FT0C:2" };
7272 Configurable<bool > cfg_require_true_mc_collision_association{" cfg_require_true_mc_collision_association" , false , " flag to require true mc collision association" };
7373 Configurable<bool > cfg_reject_fake_match_its_tpc{" cfg_reject_fake_match_its_tpc" , false , " flag to reject fake match between ITS-TPC" };
74- // Configurable<bool> cfg_reject_fake_match_its_tpc_tof{"cfg_reject_fake_match_its_tpc_tof", false, "flag to reject fake match between ITS-TPC-TOF"};
7574 Configurable<bool > cfg_reject_fake_match_mft_mch{" cfg_reject_fake_match_mft_mch" , false , " flag to reject fake match between MFT-MCH" };
7675
7776 ConfigurableAxis ConfPtGenBins{"ConfPtGenBins", {VARIABLE_WIDTH, 0.00, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.62, 0.63, 0.64, 0.65, 0.66, 0.67, 0.68, 0.69, 0.70, 0.71, 0.72, 0.73, 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.80, 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87, 0.88, 0.89, 0.90, 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.10, 4.20, 4.30, 4.40, 4.50, 4.60, 4.70, 4.80, 4.90, 5.00, 5.50, 6.00, 6.50, 7.00, 7.50, 8.00, 8.50, 9.00, 9.50, 10.00, 11.00, 12.00, 13.00, 14.00, 15.00, 16.00, 17.00, 18.00, 19.00, 20.00}, "gen. pT bins for output histograms"};
7877 ConfigurableAxis ConfCentBins{" ConfCentBins" , {VARIABLE_WIDTH, 0 , 10 , 30 , 50 , 110 }, " centrality (%) bins for output histograms" };
7978
8079 ConfigurableAxis ConfEtaCBGenBins{" ConfEtaCBGenBins" , {30 , -1.5 , +1.5 }, " gen. eta bins at midrapidity for output histograms" };
8180 ConfigurableAxis ConfEtaFWDGenBins{" ConfEtaFWDGenBins" , {40 , -5.5 , -1.5 }, " gen. eta bins at forward rapidity for output histograms" };
82- ConfigurableAxis ConfPhiGenBins{" ConfPhiGenBins" , {72 , 0 , 2 .f * M_PI}, " gen. eta bins at forward rapidity for output histograms" };
81+ ConfigurableAxis ConfPhiGenBins{" ConfPhiGenBins" , {72 , 0 , 2 .f * M_PI}, " gen. phi bins at forward rapidity for output histograms" };
82+ ConfigurableAxis ConfPhiPositionCBGenBins{" ConfPhiPositionCBGenBins" , {VARIABLE_WIDTH, 2.3 - M_PI, 0.85 , 2.3 , 0.85 + M_PI, 2.3 + M_PI}, " gen. phi psotion bins at forward rapidity for output histograms" }; // default is adjusted at R = 0.50 m
83+ ConfigurableAxis ConfPhiPositionFWDGenBins{" ConfPhiPositionFWDGenBins" , {1 , 0 , 2 * M_PI}, " gen. phi psotion bins at forward rapidity for output histograms" };
84+ Configurable<float > cfgRefR{" cfgRefR" , 0.50 , " ref. radius (m) for calculating phi position" }; // 0.50 +/- 0.06 can be syst. unc.
8385
8486 ConfigurableAxis ConfRelDeltaPtBins{" ConfRelDeltaPtBins" , {200 , -1 .f , +1 .f }, " rel. dpt for output histograms" };
8587 ConfigurableAxis ConfDeltaEtaCBBins{" ConfDeltaEtaCBBins" , {200 , -0 .5f , +0 .5f }, " deta bins for output histograms" };
@@ -184,6 +186,13 @@ struct CreateResolutionMap {
184186 o2::dataformats::VertexBase mVtx ;
185187 const o2::dataformats::MeanVertexObject* mMeanVtx = nullptr ;
186188 o2::base::MatLayerCylSet* lut = nullptr ;
189+ std::vector<float > phiPosition_bin_edges;
190+
191+ ~CreateResolutionMap ()
192+ {
193+ phiPosition_bin_edges.clear ();
194+ phiPosition_bin_edges.shrink_to_fit ();
195+ }
187196
188197 void init (o2::framework::InitContext&)
189198 {
@@ -207,6 +216,23 @@ struct CreateResolutionMap {
207216 mRunNumber = 0 ;
208217 d_bz = 0 ;
209218
219+ if (ConfPhiPositionCBGenBins.value [0 ] == VARIABLE_WIDTH) {
220+ phiPosition_bin_edges = std::vector<float >(ConfPhiPositionCBGenBins.value .begin (), ConfPhiPositionCBGenBins.value .end ());
221+ phiPosition_bin_edges.erase (phiPosition_bin_edges.begin ());
222+ // for (const auto& edge : phiPosition_bin_edges) {
223+ // LOGF(info, "VARIABLE_WIDTH: phiPosition_bin_edges = %f", edge);
224+ // }
225+ } else { // FIXED bin width
226+ int nbins = static_cast <int >(ConfPhiPositionCBGenBins.value [0 ]);
227+ float xmin = static_cast <float >(ConfPhiPositionCBGenBins.value [1 ]);
228+ float xmax = static_cast <float >(ConfPhiPositionCBGenBins.value [2 ]);
229+ phiPosition_bin_edges.resize (nbins + 1 );
230+ for (int i = 0 ; i < nbins + 1 ; i++) {
231+ phiPosition_bin_edges[i] = (xmax - xmin) / (nbins)*i + xmin;
232+ // LOGF(info, "FIXED_WIDTH: phiPosition_bin_edges[%d] = %f", i, phiPosition_bin_edges[i]);
233+ }
234+ }
235+
210236 const AxisSpec axis_cent{ConfCentBins, " centrality (%)" };
211237 const AxisSpec axis_pt_gen{ConfPtGenBins, " p_{T,l}^{gen} (GeV/c)" };
212238 const AxisSpec axis_eta_cb_gen{ConfEtaCBGenBins, " #eta_{l}^{gen}" };
@@ -217,6 +243,8 @@ struct CreateResolutionMap {
217243 const AxisSpec axis_deta_fwd{ConfDeltaEtaFWDBins, " #eta_{l}^{gen} - #eta_{l}^{rec}" };
218244 const AxisSpec axis_dphi{ConfDeltaPhiBins, " #varphi_{l}^{gen} - #varphi_{l}^{rec} (rad.)" };
219245 const AxisSpec axis_charge_gen{3 , -1.5 , +1.5 , " true sign" };
246+ const AxisSpec axis_phiPositionCB_gen{ConfPhiPositionCBGenBins, Form (" #varphi^{*, gen} (rad.) at r_{xy} = %3.2f m" , cfgRefR.value )};
247+ const AxisSpec axis_phiPositionFWD_gen{ConfPhiPositionFWDGenBins, " #varphi^{*, gen} (rad.)" };
220248
221249 // registry.add("Event/Electron/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true);
222250 // registry.add("Event/Electron/hImpPar_Centrality", "true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)", kTH2F, {{200, 0, 20}, {110, 0, 110}}, true);
@@ -241,9 +269,9 @@ struct CreateResolutionMap {
241269 }
242270
243271 if (cfgFillTHnSparse) {
244- registry.add (" Electron/hs_reso" , " 8D resolution" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_cb_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta_cb, axis_dphi}, true );
245- registry.add (" StandaloneMuon/hs_reso" , " 8D resolution" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta_fwd, axis_dphi}, true );
246- registry.add (" GlobalMuon/hs_reso" , " 8D resolution" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta_fwd, axis_dphi}, true );
272+ registry.add (" Electron/hs_reso" , " 9D resolution" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_cb_gen, axis_phi_gen, axis_phiPositionCB_gen , axis_charge_gen, axis_dpt, axis_deta_cb, axis_dphi}, true );
273+ registry.add (" StandaloneMuon/hs_reso" , " 9D resolution" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_phiPositionFWD_gen , axis_charge_gen, axis_dpt, axis_deta_fwd, axis_dphi}, true );
274+ registry.add (" GlobalMuon/hs_reso" , " 9D resolution" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_phiPositionFWD_gen , axis_charge_gen, axis_dpt, axis_deta_fwd, axis_dphi}, true );
247275 }
248276 }
249277
@@ -474,19 +502,17 @@ struct CreateResolutionMap {
474502 return false ;
475503 }
476504
477- if (track.hasITS () && !track.hasTPC () && !track.hasTOF () && !track.hasTRD ()) { // only for ITSsa
478- int total_cluster_size = 0 , nl = 0 ;
479- for (unsigned int layer = 0 ; layer < 7 ; layer++) {
480- int cluster_size_per_layer = track.itsClsSizeInLayer (layer);
481- if (cluster_size_per_layer > 0 ) {
482- nl++;
483- }
484- total_cluster_size += cluster_size_per_layer;
505+ int total_cluster_size = 0 , nl = 0 ;
506+ for (unsigned int layer = 0 ; layer < 7 ; layer++) {
507+ int cluster_size_per_layer = track.itsClsSizeInLayer (layer);
508+ if (cluster_size_per_layer > 0 ) {
509+ nl++;
485510 }
511+ total_cluster_size += cluster_size_per_layer;
512+ }
486513
487- if (electroncuts.maxMeanITSClusterSize < static_cast <float >(total_cluster_size) / static_cast <float >(nl) * std::cos (std::atan (tgl))) {
488- return false ;
489- }
514+ if (electroncuts.maxMeanITSClusterSize < static_cast <float >(total_cluster_size) / static_cast <float >(nl) * std::cos (std::atan (tgl))) {
515+ return false ;
490516 }
491517
492518 return true ;
@@ -609,7 +635,7 @@ struct CreateResolutionMap {
609635 return ;
610636 }
611637 if (cfgFillTHnSparse) {
612- registry.fill (HIST (" StandaloneMuon/hs_reso" ), centrality, mcparticle.pt (), mcparticle.eta (), mcparticle.phi (), -mcparticle.pdgCode () / 13 , (mcparticle.pt () - pt) / mcparticle.pt (), mcparticle.eta () - eta, mcparticle.phi () - phi);
638+ registry.fill (HIST (" StandaloneMuon/hs_reso" ), centrality, mcparticle.pt (), mcparticle.eta (), mcparticle.phi (), 1 . f , -mcparticle.pdgCode () / 13 , (mcparticle.pt () - pt) / mcparticle.pt (), mcparticle.eta () - eta, mcparticle.phi () - phi);
613639 }
614640
615641 if (cfgFillTH2) {
@@ -628,7 +654,7 @@ struct CreateResolutionMap {
628654 return ;
629655 }
630656 if (cfgFillTHnSparse) {
631- registry.fill (HIST (" GlobalMuon/hs_reso" ), centrality, mcparticle.pt (), mcparticle.eta (), mcparticle.phi (), -mcparticle.pdgCode () / 13 , (mcparticle.pt () - pt) / mcparticle.pt (), mcparticle.eta () - eta, mcparticle.phi () - phi);
657+ registry.fill (HIST (" GlobalMuon/hs_reso" ), centrality, mcparticle.pt (), mcparticle.eta (), mcparticle.phi (), 1 . f , -mcparticle.pdgCode () / 13 , (mcparticle.pt () - pt) / mcparticle.pt (), mcparticle.eta () - eta, mcparticle.phi () - phi);
632658 }
633659 if (cfgFillTH2) {
634660 registry.fill (HIST (" GlobalMuon/hPt" ), pt);
@@ -699,7 +725,7 @@ struct CreateResolutionMap {
699725 }
700726
701727 SliceCache cache;
702- Preslice<aod::Tracks > perCollision_mid = o2::aod::track::collisionId;
728+ Preslice<aod::TracksIU > perCollision_mid = o2::aod::track::collisionId;
703729 Preslice<aod::FwdTracks> perCollision_fwd = o2::aod::fwdtrack::collisionId;
704730
705731 using MyCollisions = Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>;
@@ -720,7 +746,7 @@ struct CreateResolutionMap {
720746 if (cfgRequireGoodRCT && !rctCheckerCB.checkTable (collision)) {
721747 return ;
722748 }
723- auto mcparticle = track.template mcParticle_as <aod::McParticles>();
749+ const auto & mcparticle = track.template mcParticle_as <aod::McParticles>();
724750
725751 if (std::abs (mcparticle.pdgCode ()) != 11 || !(mcparticle.isPhysicalPrimary () || mcparticle.producedByGenerator ())) {
726752 return ;
@@ -751,12 +777,15 @@ struct CreateResolutionMap {
751777 float phi = trackParCov.getPhi ();
752778 o2::math_utils::bringTo02Pi (phi);
753779
780+ float phiPosition = mcparticle.phi () + std::asin (-0.30282 * (-mcparticle.pdgCode () / 11 ) * (d_bz * 0.1 ) * cfgRefR / (2 .f * mcparticle.pt ()));
781+ phiPosition = RecoDecay::constrainAngle (phiPosition, phiPosition_bin_edges[0 ], 1U );
782+
754783 if (!isSelectedTrackWithKine (track, pt, eta, trackParCov.getTgl (), dcaXY, dcaZ)) {
755784 return ;
756785 }
757786
758787 if (cfgFillTHnSparse) {
759- registry.fill (HIST (" Electron/hs_reso" ), centrality, mcparticle.pt (), mcparticle.eta (), mcparticle.phi (), -mcparticle.pdgCode () / 11 , (mcparticle.pt () - pt) / mcparticle.pt (), mcparticle.eta () - eta, mcparticle.phi () - phi);
788+ registry.fill (HIST (" Electron/hs_reso" ), centrality, mcparticle.pt (), mcparticle.eta (), mcparticle.phi (), phiPosition, -mcparticle.pdgCode () / 11 , (mcparticle.pt () - pt) / mcparticle.pt (), mcparticle.eta () - eta, mcparticle.phi () - phi);
760789 }
761790 if (cfgFillTH2) {
762791 registry.fill (HIST (" Electron/hPt" ), pt);
@@ -843,10 +872,10 @@ struct CreateResolutionMap {
843872 }
844873 PROCESS_SWITCH (CreateResolutionMap, processElectronTTCA, " create resolution map for electron at midrapidity" , false );
845874
846- Partition<MyFwdTracks> sa_muons = o2::aod::fwdtrack::trackType == uint8_t (o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack); // MCH-MID
847- Partition<MyFwdTracks> global_muons = o2::aod::fwdtrack::trackType == uint8_t (o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack); // MFT-MCH-MID
875+ // Partition<MyFwdTracks> sa_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack); // MCH-MID
876+ // Partition<MyFwdTracks> global_muons = o2::aod::fwdtrack::trackType == uint8_t(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack); // MFT-MCH-MID
848877
849- void processMuonSA (MyCollisions const & collisions, aod::BCsWithTimestamps const &, MyFwdTracks const &, MyMFTTracks const &, aod::McCollisions const &, aod::McParticles const &)
878+ void processMuonSA (MyCollisions const & collisions, aod::BCsWithTimestamps const &, MyFwdTracks const & fwdtracks , MyMFTTracks const &, aod::McCollisions const &, aod::McParticles const &)
850879 {
851880 for (const auto & collision : collisions) {
852881 auto bc = collision.template foundBC_as <aod::BCsWithTimestamps>();
@@ -864,10 +893,8 @@ struct CreateResolutionMap {
864893 // auto mccollision = collision.template mcCollision_as<aod::McCollisions>();
865894 // registry.fill(HIST("Event/Muon/hImpPar_Centrality"), mccollision.impactParameter(), centrality);
866895
867- auto sa_muons_per_coll = sa_muons->sliceByCached (o2::aod::fwdtrack::collisionId, collision.globalIndex (), cache);
868- auto global_muons_per_coll = global_muons->sliceByCached (o2::aod::fwdtrack::collisionId, collision.globalIndex (), cache);
869-
870- for (const auto & muon : sa_muons_per_coll) {
896+ const auto & fwdtracks_per_coll = fwdtracks.sliceBy (perCollision_fwd, collision.globalIndex ());
897+ for (const auto & muon : fwdtracks_per_coll) {
871898 if (!muon.has_mcParticle ()) {
872899 continue ;
873900 }
@@ -880,18 +907,6 @@ struct CreateResolutionMap {
880907 fillMuon (collision, muon, centrality);
881908 } // end of standalone muon loop
882909
883- for (const auto & muon : global_muons_per_coll) {
884- if (!muon.has_mcParticle ()) {
885- continue ;
886- }
887- auto mctrack = muon.template mcParticle_as <aod::McParticles>();
888- auto mccollision_from_mctrack = mctrack.template mcCollision_as <aod::McCollisions>();
889- if (cfgEventGeneratorType >= 0 && mccollision_from_mctrack.getSubGeneratorId () != cfgEventGeneratorType) {
890- continue ;
891- }
892- fillMuon (collision, muon, centrality);
893- } // end of global muon loop
894-
895910 } // end of collision loop
896911 }
897912 PROCESS_SWITCH (CreateResolutionMap, processMuonSA, " create resolution map for muon at forward rapidity" , true );
0 commit comments