@@ -84,6 +84,9 @@ struct CreateResolutionMap {
8484 ConfigurableAxis ConfDeltaEtaBins{" ConfDeltaEtaBins" , {200 , -0 .5f , +0 .5f }, " deta bins for output histograms" };
8585 ConfigurableAxis ConfDeltaPhiBins{" ConfDeltaPhiBins" , {200 , -0 .5f , +0 .5f }, " dphi bins for output histograms" };
8686
87+ Configurable<bool > cfgFillTHnSparse{" cfgFillTHnSparse" , true , " fill THnSparse for output" };
88+ Configurable<bool > cfgFillTH2{" cfgFillTH2" , false , " fill TH2 for output" };
89+
8790 Configurable<bool > cfgRequireGoodRCT{" cfgRequireGoodRCT" , false , " require good detector flag in run condtion table" };
8891 Configurable<std::string> cfgRCTLabelCB{" cfgRCTLabelCB" , " CBT_hadronPID" , " select 1 [CBT, CBT_hadron] see O2Physics/Common/CCDB/RCTSelectionFlags.h" };
8992 Configurable<std::string> cfgRCTLabelFWDSA{" cfgRCTLabelFWDSA" , " CBT_muon" , " select 1 [CBT_muon] see O2Physics/Common/CCDB/RCTSelectionFlags.h" };
@@ -212,18 +215,22 @@ struct CreateResolutionMap {
212215 registry.add (" Event/Electron/hImpPar_Centrality" , " true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)" , kTH2F , {{200 , 0 , 20 }, {110 , 0 , 110 }}, true );
213216 registry.add (" Event/Muon/hImpPar_Centrality" , " true imapact parameter vs. estimated centrality;impact parameter (fm);centrality (%)" , kTH2F , {{200 , 0 , 20 }, {110 , 0 , 110 }}, true );
214217
215- registry.add (" Electron/hPt" , " rec. p_{T,l};p_{T,l} (GeV/c)" , kTH1F , {{1000 , 0 , 10 }}, false );
216- registry.add (" Electron/hEtaPhi" , " rec. #eta vs. #varphi;#varphi_{l} (rad.);#eta_{l}" , kTH2F , {{90 , 0 , 2 * M_PI}, {100 , -5 , +5 }}, false );
217- registry.add (" Electron/Ptgen_RelDeltaPt" , " resolution" , kTH2F , {{axis_pt_gen}, {axis_dpt}}, true );
218- registry.add (" Electron/Ptgen_DeltaEta" , " resolution" , kTH2F , {{axis_pt_gen}, {axis_deta}}, true );
219- registry.add (" Electron/Ptgen_DeltaPhi_Pos" , " resolution" , kTH2F , {{axis_pt_gen}, {axis_dphi}}, true );
220- registry.add (" Electron/Ptgen_DeltaPhi_Neg" , " resolution" , kTH2F , {{axis_pt_gen}, {axis_dphi}}, true );
221- registry.addClone (" Electron/" , " StandaloneMuon/" );
222- registry.addClone (" Electron/" , " GlobalMuon/" );
223-
224- 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 );
225- 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 );
226- 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 );
218+ if (cfgFillTH2) {
219+ registry.add (" Electron/hPt" , " rec. p_{T,l};p_{T,l} (GeV/c)" , kTH1F , {{1000 , 0 , 10 }}, false );
220+ registry.add (" Electron/hEtaPhi" , " rec. #eta vs. #varphi;#varphi_{l} (rad.);#eta_{l}" , kTH2F , {{90 , 0 , 2 * M_PI}, {100 , -5 , +5 }}, false );
221+ registry.add (" Electron/Ptgen_RelDeltaPt" , " resolution" , kTH2F , {{axis_pt_gen}, {axis_dpt}}, true );
222+ registry.add (" Electron/Ptgen_DeltaEta" , " resolution" , kTH2F , {{axis_pt_gen}, {axis_deta}}, true );
223+ registry.add (" Electron/Ptgen_DeltaPhi_Pos" , " resolution" , kTH2F , {{axis_pt_gen}, {axis_dphi}}, true );
224+ registry.add (" Electron/Ptgen_DeltaPhi_Neg" , " resolution" , kTH2F , {{axis_pt_gen}, {axis_dphi}}, true );
225+ registry.addClone (" Electron/" , " StandaloneMuon/" );
226+ registry.addClone (" Electron/" , " GlobalMuon/" );
227+ }
228+
229+ if (cfgFillTHnSparse) {
230+ 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 );
231+ 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 );
232+ 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 );
233+ }
227234 }
228235
229236 void initCCDB (aod::BCsWithTimestamps::iterator const & bc)
@@ -376,8 +383,8 @@ struct CreateResolutionMap {
376383 std::pair<int8_t , std::set<uint8_t >> itsRequirement_ibany = {1 , {0 , 1 , 2 }}; // any hits on 3 ITS ib layers.
377384 std::pair<int8_t , std::set<uint8_t >> itsRequirement_ib1st = {1 , {0 }}; // first hit on ITS ib layers.
378385
379- template <typename TCollision, typename TTrack>
380- bool isSelectedTrack (TCollision const & collision, TTrack const & track)
386+ template <typename TTrack>
387+ bool isSelectedTrack (TTrack const & track)
381388 {
382389 if (!track.hasITS () || !track.hasTPC ()) {
383390 return false ;
@@ -425,23 +432,63 @@ struct CreateResolutionMap {
425432 return false ;
426433 }
427434
428- o2::dataformats::DCA mDcaInfoCov ;
429- mDcaInfoCov .set (999 , 999 , 999 , 999 , 999 );
430- auto track_par_cov_recalc = getTrackParCov (track);
431- track_par_cov_recalc.setPID (o2::track::PID::Electron);
432- mVtx .setPos ({collision.posX (), collision.posY (), collision.posZ ()});
433- mVtx .setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
434- o2::base::Propagator::Instance ()->propagateToDCABxByBz (mVtx , track_par_cov_recalc, 2 .f , matCorr, &mDcaInfoCov );
435- float dcaXY = mDcaInfoCov .getY ();
436- float dcaZ = mDcaInfoCov .getZ ();
435+ return true ;
436+ }
437+
438+ template <typename TTrack>
439+ bool isSelectedTrackKine (TTrack const & track, const float pt, const float eta, const float dcaXY, const float dcaZ)
440+ {
441+ if (!track.hasITS () || !track.hasTPC ()) {
442+ return false ;
443+ }
444+
445+ if (track.tpcChi2NCl () > electroncuts.cfg_max_chi2tpc ) {
446+ return false ;
447+ }
448+
449+ if (track.itsChi2NCl () > electroncuts.cfg_max_chi2its ) {
450+ return false ;
451+ }
452+
453+ if (track.itsNCls () < electroncuts.cfg_min_ncluster_its ) {
454+ return false ;
455+ }
456+ if (track.itsNClsInnerBarrel () < electroncuts.cfg_min_ncluster_itsib ) {
457+ return false ;
458+ }
459+
460+ auto hits = std::count_if (itsRequirement_ibany.second .begin (), itsRequirement_ibany.second .end (), [&](auto && requiredLayer) { return track.itsClusterMap () & (1 << requiredLayer); });
461+ if (hits < itsRequirement_ibany.first ) {
462+ return false ;
463+ }
464+ if (electroncuts.cfg_require_itsib_1st ) {
465+ auto hit_ib1st = std::count_if (itsRequirement_ib1st.second .begin (), itsRequirement_ib1st.second .end (), [&](auto && requiredLayer) { return track.itsClusterMap () & (1 << requiredLayer); });
466+ if (hit_ib1st < itsRequirement_ib1st.first ) {
467+ return false ;
468+ }
469+ }
437470
438- // LOGF(info, "collision.globalIndex() = %d, track.collisionId() = %d, track.pt() = %.16f, track_par_cov_recalc.getPt() = %.16f", collision.globalIndex(), track.collisionId(), track.pt(), track_par_cov_recalc.getPt());
471+ if (track.tpcNClsFound () < electroncuts.cfg_min_ncluster_tpc ) {
472+ return false ;
473+ }
474+
475+ if (track.tpcNClsCrossedRows () < electroncuts.cfg_min_ncrossedrows ) {
476+ return false ;
477+ }
478+
479+ if (track.tpcCrossedRowsOverFindableCls () < electroncuts.cfg_min_tpc_cr_findable_ratio ) {
480+ return false ;
481+ }
482+
483+ if (track.tpcFractionSharedCls () > electroncuts.cfg_max_frac_shared_clusters_tpc ) {
484+ return false ;
485+ }
439486
440487 if (std::fabs (dcaXY) > electroncuts.cfg_max_dcaxy || std::fabs (dcaZ) > electroncuts.cfg_max_dcaz ) {
441488 return false ;
442489 }
443490
444- if (track_par_cov_recalc. getPt () < electroncuts.cfg_min_pt_track || std::fabs (track_par_cov_recalc. getEta () ) > electroncuts.cfg_max_eta_track ) {
491+ if (pt < electroncuts.cfg_min_pt_track || std::fabs (eta ) > electroncuts.cfg_max_eta_track ) {
445492 return false ;
446493 }
447494
@@ -555,29 +602,38 @@ struct CreateResolutionMap {
555602 if (cfgRequireGoodRCT && !rctCheckerFWDSA.checkTable (collision)) {
556603 return ;
557604 }
558- registry.fill (HIST (" StandaloneMuon/hPt" ), pt);
559- registry.fill (HIST (" StandaloneMuon/hEtaPhi" ), phi, eta);
560- 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);
561- registry.fill (HIST (" StandaloneMuon/Ptgen_RelDeltaPt" ), mcparticle.pt (), (mcparticle.pt () - pt) / mcparticle.pt ());
562- registry.fill (HIST (" StandaloneMuon/Ptgen_DeltaEta" ), mcparticle.pt (), mcparticle.eta () - eta);
563- if (mcparticle.pdgCode () == -13 ) { // positive muon
564- registry.fill (HIST (" StandaloneMuon/Ptgen_DeltaPhi_Pos" ), mcparticle.pt (), mcparticle.phi () - phi);
565- } else if (mcparticle.pdgCode () == 13 ) { // negative muon
566- registry.fill (HIST (" StandaloneMuon/Ptgen_DeltaPhi_Neg" ), mcparticle.pt (), mcparticle.phi () - phi);
605+ if (cfgFillTHnSparse) {
606+ 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);
607+ }
608+
609+ if (cfgFillTH2) {
610+ registry.fill (HIST (" StandaloneMuon/hPt" ), pt);
611+ registry.fill (HIST (" StandaloneMuon/hEtaPhi" ), phi, eta);
612+ registry.fill (HIST (" StandaloneMuon/Ptgen_RelDeltaPt" ), mcparticle.pt (), (mcparticle.pt () - pt) / mcparticle.pt ());
613+ registry.fill (HIST (" StandaloneMuon/Ptgen_DeltaEta" ), mcparticle.pt (), mcparticle.eta () - eta);
614+ if (mcparticle.pdgCode () == -13 ) { // positive muon
615+ registry.fill (HIST (" StandaloneMuon/Ptgen_DeltaPhi_Pos" ), mcparticle.pt (), mcparticle.phi () - phi);
616+ } else if (mcparticle.pdgCode () == 13 ) { // negative muon
617+ registry.fill (HIST (" StandaloneMuon/Ptgen_DeltaPhi_Neg" ), mcparticle.pt (), mcparticle.phi () - phi);
618+ }
567619 }
568620 } else if (muon.trackType () == static_cast <uint8_t >(o2::aod::fwdtrack::ForwardTrackTypeEnum::GlobalMuonTrack)) {
569621 if (cfgRequireGoodRCT && !rctCheckerFWDGL.checkTable (collision)) {
570622 return ;
571623 }
572- registry.fill (HIST (" GlobalMuon/hPt" ), pt);
573- registry.fill (HIST (" GlobalMuon/hEtaPhi" ), phi, eta);
574- 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);
575- registry.fill (HIST (" GlobalMuon/Ptgen_RelDeltaPt" ), mcparticle.pt (), (mcparticle.pt () - pt) / mcparticle.pt ());
576- registry.fill (HIST (" GlobalMuon/Ptgen_DeltaEta" ), mcparticle.pt (), mcparticle.eta () - eta);
577- if (mcparticle.pdgCode () == -13 ) { // positive muon
578- registry.fill (HIST (" GlobalMuon/Ptgen_DeltaPhi_Pos" ), mcparticle.pt (), mcparticle.phi () - phi);
579- } else if (mcparticle.pdgCode () == 13 ) { // negative muon
580- registry.fill (HIST (" GlobalMuon/Ptgen_DeltaPhi_Neg" ), mcparticle.pt (), mcparticle.phi () - phi);
624+ if (cfgFillTHnSparse) {
625+ 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);
626+ }
627+ if (cfgFillTH2) {
628+ registry.fill (HIST (" GlobalMuon/hPt" ), pt);
629+ registry.fill (HIST (" GlobalMuon/hEtaPhi" ), phi, eta);
630+ registry.fill (HIST (" GlobalMuon/Ptgen_RelDeltaPt" ), mcparticle.pt (), (mcparticle.pt () - pt) / mcparticle.pt ());
631+ registry.fill (HIST (" GlobalMuon/Ptgen_DeltaEta" ), mcparticle.pt (), mcparticle.eta () - eta);
632+ if (mcparticle.pdgCode () == -13 ) { // positive muon
633+ registry.fill (HIST (" GlobalMuon/Ptgen_DeltaPhi_Pos" ), mcparticle.pt (), mcparticle.phi () - phi);
634+ } else if (mcparticle.pdgCode () == 13 ) { // negative muon
635+ registry.fill (HIST (" GlobalMuon/Ptgen_DeltaPhi_Neg" ), mcparticle.pt (), mcparticle.phi () - phi);
636+ }
581637 }
582638 }
583639 return ;
@@ -655,7 +711,8 @@ struct CreateResolutionMap {
655711 if (cfg_require_true_mc_collision_association && mcparticle.mcCollisionId () != collision.mcCollisionId ()) {
656712 return ;
657713 }
658- if (!isSelectedTrack (collision, track)) {
714+
715+ if (!isSelectedTrack (track)) {
659716 return ;
660717 }
661718
@@ -666,23 +723,31 @@ struct CreateResolutionMap {
666723 mVtx .setPos ({collision.posX (), collision.posY (), collision.posZ ()});
667724 mVtx .setCov (collision.covXX (), collision.covXY (), collision.covYY (), collision.covXZ (), collision.covYZ (), collision.covZZ ());
668725 o2::base::Propagator::Instance ()->propagateToDCABxByBz (mVtx , track_par_cov_recalc, 2 .f , matCorr, &mDcaInfoCov );
669- // float dcaXY = mDcaInfoCov.getY();
670- // float dcaZ = mDcaInfoCov.getZ();
726+ float dcaXY = mDcaInfoCov .getY ();
727+ float dcaZ = mDcaInfoCov .getZ ();
671728
672729 float pt = track_par_cov_recalc.getPt ();
673730 float eta = track_par_cov_recalc.getEta ();
674731 float phi = track_par_cov_recalc.getPhi ();
675732 o2::math_utils::bringTo02Pi (phi);
676733
677- registry.fill (HIST (" Electron/hPt" ), pt);
678- registry.fill (HIST (" Electron/hEtaPhi" ), phi, eta);
679- 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);
680- registry.fill (HIST (" Electron/Ptgen_RelDeltaPt" ), mcparticle.pt (), (mcparticle.pt () - pt) / mcparticle.pt ());
681- registry.fill (HIST (" Electron/Ptgen_DeltaEta" ), mcparticle.pt (), mcparticle.eta () - eta);
682- if (mcparticle.pdgCode () == -11 ) { // positron
683- registry.fill (HIST (" Electron/Ptgen_DeltaPhi_Pos" ), mcparticle.pt (), mcparticle.phi () - phi);
684- } else if (mcparticle.pdgCode () == 11 ) { // electron
685- registry.fill (HIST (" Electron/Ptgen_DeltaPhi_Neg" ), mcparticle.pt (), mcparticle.phi () - phi);
734+ if (!isSelectedTrackKine (track, pt, eta, dcaXY, dcaZ)) {
735+ return ;
736+ }
737+
738+ if (cfgFillTHnSparse) {
739+ 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);
740+ }
741+ if (cfgFillTH2) {
742+ registry.fill (HIST (" Electron/hPt" ), pt);
743+ registry.fill (HIST (" Electron/hEtaPhi" ), phi, eta);
744+ registry.fill (HIST (" Electron/Ptgen_RelDeltaPt" ), mcparticle.pt (), (mcparticle.pt () - pt) / mcparticle.pt ());
745+ registry.fill (HIST (" Electron/Ptgen_DeltaEta" ), mcparticle.pt (), mcparticle.eta () - eta);
746+ if (mcparticle.pdgCode () == -11 ) { // positron
747+ registry.fill (HIST (" Electron/Ptgen_DeltaPhi_Pos" ), mcparticle.pt (), mcparticle.phi () - phi);
748+ } else if (mcparticle.pdgCode () == 11 ) { // electron
749+ registry.fill (HIST (" Electron/Ptgen_DeltaPhi_Neg" ), mcparticle.pt (), mcparticle.phi () - phi);
750+ }
686751 }
687752 }
688753
0 commit comments