1818#include < utility>
1919#include < set>
2020#include < vector>
21+ #include < array>
2122
2223#include " Framework/runDataProcessing.h"
2324#include " Framework/AnalysisTask.h"
2829#include " Framework/HistogramRegistry.h"
2930#include " Common/DataModel/TrackSelectionTables.h"
3031#include " Common/DataModel/EventSelection.h"
32+ #include " Common/DataModel/Centrality.h"
3133
3234#include " CCDB/BasicCCDBManager.h"
3335#include " DataFormatsParameters/GRPMagField.h"
@@ -49,6 +51,9 @@ using namespace o2::soa;
4951using MyCollisions = Join<aod::Collisions, aod::EvSels, aod::McCollisionLabels>;
5052using MyCollision = MyCollisions::iterator;
5153
54+ using MyCollisionsCent = soa::Join<MyCollisions, aod::CentFT0Ms, aod::CentFT0As, aod::CentFT0Cs>;
55+ using MyCollisionCent = MyCollisionsCent::iterator;
56+
5257using MyMCTracks = soa::Join<aod::Tracks, aod::TracksExtra, aod::TracksDCA, aod::TracksCov, aod::McTrackLabels>;
5358using MyMCTrack = MyMCTracks::iterator;
5459
@@ -70,8 +75,10 @@ struct CreateResolutionMap {
7075 Configurable<std::string> grpmagPath{" grpmagPath" , " GLO/Config/GRPMagField" , " CCDB path of the GRPMagField object" };
7176 Configurable<std::string> geoPath{" geoPath" , " GLO/Config/GeometryAligned" , " Path of the geometry file" };
7277 Configurable<int > cfgEventGeneratorType{" cfgEventGeneratorType" , -1 , " if positive, select event generator type. i.e. gap or signal" };
78+ Configurable<int > cfgCentEstimator{" cfgCentEstimator" , 2 , " FT0M:0, FT0A:1, FT0C:2" };
7379
7480 ConfigurableAxis ConfPtGenBins{"ConfPtGenBins", {VARIABLE_WIDTH, 0.00, 0.01, 0.02, 0.03, 0.04, 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"};
81+ ConfigurableAxis ConfCentBins{" ConfCentBins" , {VARIABLE_WIDTH, 0 , 10 , 30 , 50 , 110 }, " centrality (%) bins for output histograms" };
7582
7683 ConfigurableAxis ConfEtaCBGenBins{" ConfEtaCBGenBins" , {30 , -1.5 , +1.5 }, " gen. eta bins at midrapidity for output histograms" };
7784 ConfigurableAxis ConfEtaFWDGenBins{" ConfEtaFWDGenBins" , {40 , -5.5 , -1.5 }, " gen. eta bins at forward rapidity for output histograms" };
@@ -88,6 +95,7 @@ struct CreateResolutionMap {
8895 Configurable<float > cfg_max_eta_track{" cfg_max_eta_track" , +1.5 , " max eta for single track" };
8996 Configurable<int > cfg_min_ncluster_tpc{" cfg_min_ncluster_tpc" , 0 , " min ncluster tpc" };
9097 Configurable<int > cfg_min_ncluster_its{" cfg_min_ncluster_its" , 4 , " min ncluster its" };
98+ Configurable<int > cfg_min_ncluster_itsib{" cfg_min_ncluster_itsib" , 1 , " min ncluster itsib" };
9199 Configurable<int > cfg_min_ncrossedrows{" cfg_min_ncrossedrows" , 80 , " min ncrossed rows" };
92100 Configurable<float > cfg_max_chi2tpc{" cfg_max_chi2tpc" , 4.0 , " max chi2/NclsTPC" };
93101 Configurable<float > cfg_max_chi2its{" cfg_max_chi2its" , 5.0 , " max chi2/NclsITS" };
@@ -129,6 +137,7 @@ struct CreateResolutionMap {
129137 ccdb->setFatalWhenNull (false );
130138 ccdbApi.init (ccdburl);
131139
140+ const AxisSpec axis_cent{ConfCentBins, " centrality (%)" };
132141 const AxisSpec axis_pt_gen{ConfPtGenBins, " p_{T,l}^{gen} (GeV/c)" };
133142 const AxisSpec axis_eta_cb_gen{ConfEtaCBGenBins, " #eta_{l}^{gen}" };
134143 const AxisSpec axis_eta_fwd_gen{ConfEtaFWDGenBins, " #eta_{l}^{gen}" };
@@ -145,9 +154,9 @@ struct CreateResolutionMap {
145154 registry.addClone (" Electron/" , " StandaloneMuon/" );
146155 registry.addClone (" Electron/" , " GlobalMuon/" );
147156
148- registry.add (" Electron/hs_reso" , " 7D resolution positive" , kTHnSparseF , {axis_pt_gen, axis_eta_cb_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true );
149- registry.add (" StandaloneMuon/hs_reso" , " 7D resolution positive" , kTHnSparseF , {axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true );
150- registry.add (" GlobalMuon/hs_reso" , " 7D resolution positive" , kTHnSparseF , {axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true );
157+ registry.add (" Electron/hs_reso" , " 8D resolution positive" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_cb_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true );
158+ registry.add (" StandaloneMuon/hs_reso" , " 8D resolution positive" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true );
159+ registry.add (" GlobalMuon/hs_reso" , " 8D resolution positive" , kTHnSparseF , {axis_cent, axis_pt_gen, axis_eta_fwd_gen, axis_phi_gen, axis_charge_gen, axis_dpt, axis_deta, axis_dphi}, true );
151160 }
152161
153162 void initCCDB (aod::BCsWithTimestamps::iterator const & bc)
@@ -185,6 +194,9 @@ struct CreateResolutionMap {
185194 if (track.itsNCls () < electroncuts.cfg_min_ncluster_its ) {
186195 return false ;
187196 }
197+ if (track.itsNClsInnerBarrel () < electroncuts.cfg_min_ncluster_itsib ) {
198+ return false ;
199+ }
188200
189201 auto hits = std::count_if (itsRequirement_ibany.second .begin (), itsRequirement_ibany.second .end (), [&](auto && requiredLayer) { return track.itsClusterMap () & (1 << requiredLayer); });
190202 if (hits < itsRequirement_ibany.first ) {
@@ -268,7 +280,7 @@ struct CreateResolutionMap {
268280 }
269281
270282 template <typename TMuon, typename TCollision>
271- bool checkFwdTrack (TMuon const & muon, TCollision const & collision)
283+ bool checkFwdTrack (TMuon const & muon, TCollision const & collision, const float centrality )
272284 {
273285 o2::dataformats::GlobalFwdTrack propmuonAtPV = PropagateMuon (muon, collision, CreateResolutionMap::MuonExtrapolation::kToVertex );
274286 float pt = propmuonAtPV.getPt ();
@@ -316,7 +328,7 @@ struct CreateResolutionMap {
316328
317329 auto mctrack = muon.template mcParticle_as <aod::McParticles>();
318330 if (muon.trackType () == static_cast <uint8_t >(o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack)) {
319- registry.fill (HIST (" StandaloneMuon/hs_reso" ), mctrack.pt (), mctrack.eta (), mctrack.phi (), -mctrack.pdgCode () / 13 , (mctrack.pt () - pt) / mctrack.pt (), mctrack.eta () - eta, mctrack.phi () - phi);
331+ registry.fill (HIST (" StandaloneMuon/hs_reso" ), centrality, mctrack.pt (), mctrack.eta (), mctrack.phi (), -mctrack.pdgCode () / 13 , (mctrack.pt () - pt) / mctrack.pt (), mctrack.eta () - eta, mctrack.phi () - phi);
320332 registry.fill (HIST (" StandaloneMuon/Ptgen_RelDeltaPt" ), mctrack.pt (), (mctrack.pt () - pt) / mctrack.pt ());
321333 registry.fill (HIST (" StandaloneMuon/Ptgen_DeltaEta" ), mctrack.pt (), mctrack.eta () - eta);
322334 if (mctrack.pdgCode () == -13 ) { // positive muon
@@ -325,7 +337,7 @@ struct CreateResolutionMap {
325337 registry.fill (HIST (" StandaloneMuon/Ptgen_DeltaPhi_Neg" ), mctrack.pt (), mctrack.phi () - phi);
326338 }
327339 } else if (muon.trackType () == static_cast <uint8_t >(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) {
328- registry.fill (HIST (" GlobalMuon/hs_reso" ), mctrack.pt (), mctrack.eta (), mctrack.phi (), -mctrack.pdgCode () / 13 , (mctrack.pt () - pt) / mctrack.pt (), mctrack.eta () - eta, mctrack.phi () - phi);
340+ registry.fill (HIST (" GlobalMuon/hs_reso" ), centrality, mctrack.pt (), mctrack.eta (), mctrack.phi (), -mctrack.pdgCode () / 13 , (mctrack.pt () - pt) / mctrack.pt (), mctrack.eta () - eta, mctrack.phi () - phi);
329341 registry.fill (HIST (" GlobalMuon/Ptgen_RelDeltaPt" ), mctrack.pt (), (mctrack.pt () - pt) / mctrack.pt ());
330342 registry.fill (HIST (" GlobalMuon/Ptgen_DeltaEta" ), mctrack.pt (), mctrack.eta () - eta);
331343 if (mctrack.pdgCode () == -13 ) { // positive muon
@@ -343,14 +355,16 @@ struct CreateResolutionMap {
343355
344356 Filter collisionFilter = o2::aod::evsel::sel8 == true && nabs(o2::aod::collision::posZ) < 10 .f;
345357 using MyFilteredCollisions = soa::Filtered<MyCollisions>;
358+ using MyFilteredCollisionsCent = soa::Filtered<MyCollisionsCent>;
346359
347360 Filter trackFilter_mid = o2::aod::track::pt > electroncuts.cfg_min_pt_track&& electroncuts.cfg_min_eta_track < o2::aod::track::eta&& o2::aod::track::eta < electroncuts.cfg_max_eta_track&& o2::aod::track::tpcChi2NCl < electroncuts.cfg_max_chi2tpc&& o2::aod::track::itsChi2NCl < electroncuts.cfg_max_chi2its&& ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::ITS) == true && ncheckbit(aod::track::v001::detectorMap, (uint8_t )o2::aod::track::TPC) == true && nabs(o2::aod::track::dcaXY) < electroncuts.cfg_max_dcaxy&& nabs(o2::aod::track::dcaZ) < electroncuts.cfg_max_dcaz;
348361 using MyFilteredMCTracks = soa::Filtered<MyMCTracks>;
349362
350363 Partition<MyMCFwdTracks> sa_muons = o2::aod::fwdtrack::trackType == uint8_t (o2::aod::fwdtrack::ForwardTrackTypeEnum::MuonStandaloneTrack); // MCH-MID
351364 Partition<MyMCFwdTracks> global_muons = o2::aod::fwdtrack::trackType == uint8_t (o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack); // MFT-MCH-MID
352365
353- void process (MyFilteredCollisions const & collisions, aod::BCsWithTimestamps const &, MyFilteredMCTracks const & tracks, MyMCFwdTracks const &, aod::McCollisions const &, aod::McParticles const &)
366+ template <typename TCollisions>
367+ void process (TCollisions const & collisions, aod::BCsWithTimestamps const &, MyFilteredMCTracks const & tracks, MyMCFwdTracks const &, aod::McCollisions const &, aod::McParticles const &)
354368 {
355369 for (auto & collision : collisions) {
356370 auto bc = collision.template foundBC_as <aod::BCsWithTimestamps>();
@@ -365,6 +379,11 @@ struct CreateResolutionMap {
365379 continue ;
366380 }
367381
382+ float centrality = 105 .f ;
383+ if constexpr (std::is_same_v<std::decay_t <TCollisions>, MyFilteredCollisionsCent>) {
384+ centrality = std::array{collision.centFT0M (), collision.centFT0A (), collision.centFT0C ()}[cfgCentEstimator];
385+ }
386+
368387 auto tracks_per_coll = tracks.sliceBy (perCollision_mid, collision.globalIndex ());
369388 for (auto & track : tracks_per_coll) {
370389 if (!track.has_mcParticle ()) {
@@ -381,7 +400,7 @@ struct CreateResolutionMap {
381400 continue ;
382401 }
383402
384- registry.fill (HIST (" Electron/hs_reso" ), mctrack.pt (), mctrack.eta (), mctrack.phi (), -mctrack.pdgCode () / 11 , (mctrack.pt () - track.pt ()) / mctrack.pt (), mctrack.eta () - track.eta (), mctrack.phi () - track.phi ());
403+ registry.fill (HIST (" Electron/hs_reso" ), centrality, mctrack.pt (), mctrack.eta (), mctrack.phi (), -mctrack.pdgCode () / 11 , (mctrack.pt () - track.pt ()) / mctrack.pt (), mctrack.eta () - track.eta (), mctrack.phi () - track.phi ());
385404 registry.fill (HIST (" Electron/Ptgen_RelDeltaPt" ), mctrack.pt (), (mctrack.pt () - track.pt ()) / mctrack.pt ());
386405 registry.fill (HIST (" Electron/Ptgen_DeltaEta" ), mctrack.pt (), mctrack.eta () - track.eta ());
387406 if (mctrack.pdgCode () == -11 ) { // positron
@@ -406,7 +425,7 @@ struct CreateResolutionMap {
406425 if (abs (mctrack.pdgCode ()) != 13 || !(mctrack.isPhysicalPrimary () || mctrack.producedByGenerator ())) {
407426 continue ;
408427 }
409- if (!checkFwdTrack (muon, collision)) {
428+ if (!checkFwdTrack (muon, collision, centrality )) {
410429 continue ;
411430 }
412431 } // end of standalone muon loop
@@ -422,14 +441,16 @@ struct CreateResolutionMap {
422441 if (abs (mctrack.pdgCode ()) != 13 || !(mctrack.isPhysicalPrimary () || mctrack.producedByGenerator ())) {
423442 continue ;
424443 }
425- if (!checkFwdTrack (muon, collision)) {
444+ if (!checkFwdTrack (muon, collision, centrality )) {
426445 continue ;
427446 }
428447
429448 } // end of global muon loop
430449
431450 } // end of collision loop
432451 }
452+ PROCESS_SWITCH_FULL (CreateResolutionMap, process<MyFilteredCollisionsCent>, processWithCent, " create resolution map wit centrality" , true );
453+ PROCESS_SWITCH_FULL (CreateResolutionMap, process<MyFilteredCollisions>, processWithoutCent, " create resolution map without centrality" , false );
433454};
434455WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
435456{
0 commit comments