Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-09-07 04:36:00

0001 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
0002 #include "DataFormats/MuonDetId/interface/GEMDetId.h"
0003 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
0004 
0005 #include "DataFormats/GeometryCommonDetAlgo/interface/ErrorFrameTransformer.h"
0006 #include "TrackPropagation/SteppingHelixPropagator/interface/SteppingHelixStateInfo.h"
0007 
0008 #include <vector>
0009 
0010 #include "DPGAnalysis/MuonTools/interface/MuBaseFlatTableProducer.h"
0011 
0012 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0014 
0015 #include "DataFormats/Common/interface/View.h"
0016 #include "DataFormats/MuonReco/interface/Muon.h"
0017 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0018 
0019 #include "Geometry/GEMGeometry/interface/GEMGeometry.h"
0020 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0021 
0022 #include "RecoMuon/TrackingTools/interface/MuonServiceProxy.h"
0023 
0024 #include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
0025 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
0026 
0027 class MuGEMMuonExtTableProducer : public MuBaseFlatTableProducer {
0028 public:
0029   /// Constructor
0030   MuGEMMuonExtTableProducer(const edm::ParameterSet&);
0031 
0032   /// Fill descriptors
0033   static void fillDescriptions(edm::ConfigurationDescriptions&);
0034 
0035 protected:
0036   /// Fill tree branches for a given event
0037   void fillTable(edm::Event&) final;
0038 
0039   /// Get info from the ES by run
0040   void getFromES(const edm::Run&, const edm::EventSetup&) final;
0041 
0042   /// Get info from the ES for a given event
0043   void getFromES(const edm::EventSetup&) final;
0044 
0045 private:
0046   /// The RECO mu token
0047   nano_mu::EDTokenHandle<edm::View<reco::Muon>> m_token;
0048 
0049   /// Fill matches table
0050   bool m_fillPropagated;
0051 
0052   /// GEM Geometry
0053   nano_mu::ESTokenHandle<GEMGeometry, MuonGeometryRecord, edm::Transition::BeginRun> m_gemGeometry;
0054 
0055   /// Transient Track Builder
0056   nano_mu::ESTokenHandle<TransientTrackBuilder, TransientTrackRecord> m_transientTrackBuilder;
0057 
0058   /// Muon service proxy
0059   std::unique_ptr<MuonServiceProxy> m_muonSP;
0060 };
0061 
0062 MuGEMMuonExtTableProducer::MuGEMMuonExtTableProducer(const edm::ParameterSet& config)
0063     : MuBaseFlatTableProducer{config},
0064       m_token{config, consumesCollector(), "src"},
0065       m_fillPropagated{config.getParameter<bool>("fillPropagated")},
0066       m_gemGeometry{consumesCollector()},
0067       m_transientTrackBuilder{consumesCollector(), "TransientTrackBuilder"},
0068       m_muonSP{std::make_unique<MuonServiceProxy>(config.getParameter<edm::ParameterSet>("ServiceParameters"),
0069                                                   consumesCollector())} {
0070   produces<nanoaod::FlatTable>();
0071 
0072   if (m_fillPropagated) {
0073     produces<nanoaod::FlatTable>("propagated");
0074   }
0075 }
0076 
0077 void MuGEMMuonExtTableProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0078   edm::ParameterSetDescription desc;
0079 
0080   desc.add<std::string>("name", "muon");
0081   desc.add<edm::InputTag>("src", edm::InputTag{"patMuons"});
0082 
0083   desc.add<bool>("fillPropagated", true);
0084   desc.setAllowAnything();
0085 
0086   descriptions.addWithDefaultLabel(desc);
0087 }
0088 
0089 void MuGEMMuonExtTableProducer::getFromES(const edm::Run& run, const edm::EventSetup& environment) {
0090   m_gemGeometry.getFromES(environment);
0091 }
0092 
0093 void MuGEMMuonExtTableProducer::getFromES(const edm::EventSetup& environment) {
0094   m_transientTrackBuilder.getFromES(environment);
0095   m_muonSP->update(environment);
0096 }
0097 
0098 void MuGEMMuonExtTableProducer::fillTable(edm::Event& ev) {
0099   unsigned int nMuons{0};
0100 
0101   std::vector<bool> isCSC;
0102   std::vector<bool> isME11;
0103 
0104   std::vector<float> innermost_x;
0105   std::vector<float> innermost_y;
0106   std::vector<float> innermost_z;
0107 
0108   std::vector<float> outermost_x;
0109   std::vector<float> outermost_y;
0110   std::vector<float> outermost_z;
0111 
0112   unsigned int nProp{0};
0113 
0114   std::vector<uint32_t> propagated_muIdx;
0115 
0116   std::vector<bool> propagated_isincoming;
0117   std::vector<bool> propagated_isinsideout;
0118   std::vector<int16_t> propagated_region;
0119   std::vector<int16_t> propagated_layer;
0120   std::vector<int16_t> propagated_chamber;
0121   std::vector<int16_t> propagated_etaP;
0122 
0123   std::vector<float> propagatedLoc_x;
0124   std::vector<float> propagatedLoc_y;
0125   std::vector<float> propagatedLoc_z;
0126   std::vector<float> propagatedLoc_r;
0127   std::vector<float> propagatedLoc_phi;
0128   std::vector<float> propagatedLoc_dirX;
0129   std::vector<float> propagatedLoc_dirY;
0130   std::vector<float> propagatedLoc_dirZ;
0131   std::vector<float> propagatedLoc_errX;
0132   std::vector<float> propagatedLoc_errY;
0133 
0134   std::vector<float> propagatedGlb_x;
0135   std::vector<float> propagatedGlb_y;
0136   std::vector<float> propagatedGlb_z;
0137   std::vector<float> propagatedGlb_r;
0138   std::vector<float> propagatedGlb_phi;
0139   std::vector<float> propagatedGlb_errX;
0140   std::vector<float> propagatedGlb_errY;
0141   std::vector<float> propagatedGlb_phierr;
0142   std::vector<float> propagatedGlb_rerr;
0143 
0144   std::vector<float> propagated_EtaPartition_centerX;
0145   std::vector<float> propagated_EtaPartition_centerY;
0146   std::vector<float> propagated_EtaPartition_phiMax;
0147   std::vector<float> propagated_EtaPartition_phiMin;
0148   std::vector<float> propagated_EtaPartition_rMax;
0149   std::vector<float> propagated_EtaPartition_rMin;
0150 
0151   std::vector<int16_t> propagated_nME1hits;
0152   std::vector<int16_t> propagated_nME2hits;
0153   std::vector<int16_t> propagated_nME3hits;
0154   std::vector<int16_t> propagated_nME4hits;
0155 
0156   auto muons = m_token.conditionalGet(ev);
0157 
0158   // edm::ESHandle<Propagator>
0159   auto&& propagator_any = m_muonSP->propagator("SteppingHelixPropagatorAny");
0160   auto&& propagator_along = m_muonSP->propagator("SteppingHelixPropagatorAlong");
0161   auto&& propagator_opposite = m_muonSP->propagator("SteppingHelixPropagatorOpposite");
0162 
0163   if (!propagator_any.isValid() || !propagator_along.isValid() || !propagator_opposite.isValid()) {
0164     return;
0165   }
0166 
0167   if (muons.isValid() && m_transientTrackBuilder.isValid()) {
0168     //loop on recoMuons
0169     for (const auto& muon : (*muons)) {
0170       ++nMuons;
0171 
0172       bool is_csc = false;
0173       bool is_me11 = false;
0174 
0175       if (!muon.outerTrack().isNull()) {
0176         const auto track = muon.outerTrack().get();
0177         const auto outerTrackRef = muon.outerTrack();
0178 
0179         float p2_in = track->innerMomentum().mag2();
0180         float p2_out = track->outerMomentum().mag2();
0181         float pos_out = track->outerPosition().mag2();
0182         float pos_in = track->innerPosition().mag2();
0183 
0184         bool is_insideout = pos_in > pos_out;
0185 
0186         if (is_insideout) {
0187           std::swap(pos_in, pos_out);
0188           std::swap(p2_in, p2_out);
0189         }
0190 
0191         bool is_incoming = p2_out > p2_in;
0192 
0193         const auto&& transient_track = m_transientTrackBuilder->build(track);
0194         const auto& htp = transient_track.hitPattern();
0195 
0196         if (transient_track.isValid()) {
0197           const auto innerPosGlb{transient_track.innermostMeasurementState().globalPosition()};
0198           const auto outerPosGlb{transient_track.outermostMeasurementState().globalPosition()};
0199 
0200           innermost_x.push_back(innerPosGlb.x());
0201           innermost_y.push_back(innerPosGlb.y());
0202           innermost_z.push_back(innerPosGlb.z());
0203           outermost_x.push_back(outerPosGlb.x());
0204           outermost_y.push_back(outerPosGlb.y());
0205           outermost_z.push_back(outerPosGlb.z());
0206         } else {
0207           innermost_x.push_back(DEFAULT_DOUBLE_VAL);
0208           innermost_y.push_back(DEFAULT_DOUBLE_VAL);
0209           innermost_z.push_back(DEFAULT_DOUBLE_VAL);
0210           outermost_x.push_back(DEFAULT_DOUBLE_VAL);
0211           outermost_y.push_back(DEFAULT_DOUBLE_VAL);
0212           outermost_z.push_back(DEFAULT_DOUBLE_VAL);
0213           continue;
0214         }
0215 
0216         const auto&& start_state = transient_track.innermostMeasurementState();
0217         auto& propagator = propagator_any;
0218 
0219         auto recHitMu = outerTrackRef->recHitsBegin();
0220         auto recHitMuEnd = outerTrackRef->recHitsEnd();
0221 
0222         //loop on recHits which form the outerTrack
0223         for (; recHitMu != recHitMuEnd; ++recHitMu) {
0224           DetId detId{(*recHitMu)->geographicalId()};
0225 
0226           if (detId.det() == DetId::Muon && detId.subdetId() == MuonSubdetId::CSC) {
0227             is_csc = true;
0228 
0229             const CSCDetId csc_id{detId};
0230             // ME11 chambers consist of 2 subchambers: ME11a, ME11b.
0231             // In CMSSW they are referred as Stat. 1 Ring 1, Stat. 1 Ring. 4 respectively
0232             if (csc_id.station() == 1 && ((csc_id.ring() == 1) || (csc_id.ring() == 4)))
0233               is_me11 = true;
0234           }
0235         }  //loop on recHits
0236 
0237         //if at least one CSC hit is found, perform propagation
0238         if (is_csc) {
0239           // CSC Hits
0240           int16_t nME1_hits = 0;
0241           int16_t nME2_hits = 0;
0242           int16_t nME3_hits = 0;
0243           int16_t nME4_hits = 0;
0244 
0245           int nHits{htp.numberOfAllHits(htp.TRACK_HITS)};
0246 
0247           for (int i = 0; i != nHits; ++i) {
0248             uint32_t hit = htp.getHitPattern(htp.TRACK_HITS, i);
0249             int substructure = htp.getSubStructure(hit);
0250             int hittype = htp.getHitType(hit);
0251 
0252             if (substructure == 2 && hittype == 0) {  // CSC Hits
0253               int CSC_station = htp.getMuonStation(hit);
0254 
0255               switch (CSC_station) {
0256                 case 1:
0257                   ++nME1_hits;
0258                   break;
0259                 case 2:
0260                   ++nME2_hits;
0261                   break;
0262                 case 3:
0263                   ++nME3_hits;
0264                   break;
0265                 case 4:
0266                   ++nME4_hits;
0267                   break;
0268                 default:
0269                   // do nothing
0270                   break;
0271               }
0272             }
0273           }
0274           //loop on GEM etaPartitions
0275           for (const auto& eta_partition : m_gemGeometry->etaPartitions()) {
0276             if (eta_partition->id().station() != 1) {
0277               continue;  //Only takes GE1/1
0278             }
0279             const GEMDetId&& gem_id = eta_partition->id();
0280 
0281             bool is_opposite_region = muon.eta() * gem_id.region() < 0;
0282             if (is_incoming xor is_opposite_region) {
0283               continue;  //Check on muon direction
0284             }
0285             const BoundPlane& bound_plane = eta_partition->surface();
0286 
0287             const auto& dest_state = propagator->propagate(start_state, bound_plane);
0288             if (!dest_state.isValid()) {
0289               // std::cout << "failed to propagate" << std::endl;
0290               continue;
0291             }
0292             const GlobalPoint&& dest_global_pos = dest_state.globalPosition();
0293             const LocalPoint&& local_point = eta_partition->toLocal(dest_global_pos);
0294             const LocalPoint local_point_2d{local_point.x(), local_point.y(), 0.0f};
0295 
0296             if (eta_partition->surface().bounds().inside(local_point_2d)) {
0297               //// PROPAGATED HIT ERROR EVALUATION
0298               // X,Y
0299               double xx = dest_state.curvilinearError().matrix()(3, 3);
0300               double yy = dest_state.curvilinearError().matrix()(4, 4);
0301               double xy = dest_state.curvilinearError().matrix()(4, 3);
0302               double dest_glob_error_x = sqrt(0.5 * (xx + yy - sqrt((xx - yy) * (xx - yy) + 4 * xy * xy)));
0303               double dest_glob_error_y = sqrt(0.5 * (xx + yy + sqrt((xx - yy) * (xx - yy) + 4 * xy * xy)));
0304 
0305               // R,Phi
0306               const LocalPoint&& dest_local_pos = eta_partition->toLocal(dest_global_pos);
0307               const LocalError&& dest_local_err = dest_state.localError().positionError();
0308               const GlobalError& dest_global_err =
0309                   ErrorFrameTransformer().transform(dest_local_err, eta_partition->surface());
0310               const double dest_global_r_err = std::sqrt(dest_global_err.rerr(dest_global_pos));
0311               const double dest_global_phi_err = std::sqrt(dest_global_err.phierr(dest_global_pos));
0312 
0313               ++nProp;
0314 
0315               propagated_muIdx.push_back(nMuons - 1);
0316 
0317               propagated_nME1hits.push_back(nME1_hits);
0318               propagated_nME2hits.push_back(nME2_hits);
0319               propagated_nME3hits.push_back(nME3_hits);
0320               propagated_nME4hits.push_back(nME4_hits);
0321 
0322               const auto& eta_partition_pos{eta_partition->position()};
0323               const auto& eta_partition_surf{eta_partition->surface()};
0324               propagated_EtaPartition_centerX.push_back(eta_partition_pos.x());
0325               propagated_EtaPartition_centerY.push_back(eta_partition_pos.y());
0326               propagated_EtaPartition_rMin.push_back(eta_partition_surf.rSpan().first);
0327               propagated_EtaPartition_rMax.push_back(eta_partition_surf.rSpan().second);
0328               propagated_EtaPartition_phiMin.push_back(eta_partition_surf.phiSpan().first);
0329               propagated_EtaPartition_phiMax.push_back(eta_partition_surf.phiSpan().second);
0330 
0331               propagatedGlb_x.push_back(dest_global_pos.x());
0332               propagatedGlb_y.push_back(dest_global_pos.y());
0333               propagatedGlb_z.push_back(dest_global_pos.z());
0334               propagatedGlb_r.push_back(dest_global_pos.perp());
0335               propagatedGlb_phi.push_back(dest_global_pos.phi());
0336 
0337               const auto dest_local_dir{dest_state.localDirection()};
0338               propagatedLoc_x.push_back(dest_local_pos.x());
0339               propagatedLoc_y.push_back(dest_local_pos.y());
0340               propagatedLoc_z.push_back(dest_local_pos.z());
0341               propagatedLoc_r.push_back(dest_local_pos.perp());
0342               propagatedLoc_phi.push_back(dest_local_pos.phi());
0343               propagatedLoc_dirX.push_back(dest_local_dir.x());
0344               propagatedLoc_dirY.push_back(dest_local_dir.y());
0345               propagatedLoc_dirZ.push_back(dest_local_dir.z());
0346 
0347               propagatedLoc_errX.push_back(dest_local_err.xx());
0348               propagatedLoc_errY.push_back(dest_local_err.yy());
0349 
0350               propagatedGlb_errX.push_back(dest_glob_error_x);
0351               propagatedGlb_errY.push_back(dest_glob_error_y);
0352               propagatedGlb_rerr.push_back(dest_global_r_err);
0353               propagatedGlb_phierr.push_back(dest_global_phi_err);
0354 
0355               propagated_region.push_back(gem_id.region());
0356               propagated_layer.push_back(gem_id.layer());
0357               propagated_chamber.push_back(gem_id.chamber());
0358               propagated_etaP.push_back(gem_id.roll());
0359 
0360               propagated_isinsideout.push_back(is_insideout);
0361               propagated_isincoming.push_back(is_incoming);
0362 
0363             }  //propagation is inside boundaries
0364           }  //loop on EtaPartitions
0365         }  //is_csc therefore perform propagation
0366       } else {  //!muon.outerTrack().isNull()
0367         innermost_x.push_back(DEFAULT_DOUBLE_VAL);
0368         innermost_y.push_back(DEFAULT_DOUBLE_VAL);
0369         innermost_z.push_back(DEFAULT_DOUBLE_VAL);
0370         outermost_x.push_back(DEFAULT_DOUBLE_VAL);
0371         outermost_y.push_back(DEFAULT_DOUBLE_VAL);
0372         outermost_z.push_back(DEFAULT_DOUBLE_VAL);
0373       }
0374       isCSC.push_back(is_csc);
0375       isME11.push_back(is_me11);
0376 
0377     }  //loop on reco muons
0378   }
0379 
0380   auto table = std::make_unique<nanoaod::FlatTable>(nMuons, m_name, false, true);
0381 
0382   //table->setDoc("RECO muon information");
0383 
0384   addColumn(table, "innermost_x", innermost_x, "");
0385   addColumn(table, "innermost_y", innermost_y, "");
0386   addColumn(table, "innermost_z", innermost_z, "");
0387 
0388   addColumn(table, "outermost_x", outermost_x, "");
0389   addColumn(table, "outermost_y", outermost_y, "");
0390   addColumn(table, "outermost_z", outermost_z, "");
0391   ev.put(std::move(table));
0392 
0393   if (m_fillPropagated) {
0394     auto tabProp = std::make_unique<nanoaod::FlatTable>(nProp, m_name + "_propagated", false, false);
0395 
0396     addColumn(tabProp, "propagated_muIdx", propagated_muIdx, "");
0397 
0398     addColumn(tabProp,
0399               "propagated_nME1hits",
0400               propagated_nME1hits,
0401               "number of hits in the CSC ME1 station"
0402               "in the STA muon track extrapolated to GE11");
0403     addColumn(tabProp,
0404               "propagated_nME2hits",
0405               propagated_nME2hits,
0406               "number of hits in the CSC ME2 station"
0407               "in the STA muon track extrapolated to GE11");
0408     addColumn(tabProp,
0409               "propagated_nME3hits",
0410               propagated_nME3hits,
0411               "number of hits in the CSC ME3 station"
0412               "in the STA muon track extrapolated to GE11");
0413     addColumn(tabProp,
0414               "propagated_nME4hits",
0415               propagated_nME4hits,
0416               "number of hits in the CSC ME4 station"
0417               "in the STA muon track extrapolated to GE11");
0418 
0419     addColumn(
0420         tabProp, "propagated_isincoming", propagated_isincoming, "bool, condition on the muon STA track direction");
0421     addColumn(
0422         tabProp, "propagated_isinsideout", propagated_isinsideout, "bool, condition on the muon STA track direction");
0423     addColumn(tabProp,
0424               "propagated_region",
0425               propagated_region,
0426               "GE11 region where the extrapolated muon track falls"
0427               "<br />(int, positive endcap: +1, negative endcap: -1");
0428     addColumn(tabProp,
0429               "propagated_layer",
0430               propagated_layer,
0431               "GE11 layer where the extrapolated muon track falls"
0432               "<br />(int, layer1: 1, layer2: 2");
0433     addColumn(tabProp,
0434               "propagated_chamber",
0435               propagated_chamber,
0436               "GE11 superchamber where the extrapolated muon track falls"
0437               "<br />(int, chambers numbered from 0 to 35");
0438     addColumn(tabProp,
0439               "propagated_etaP",
0440               propagated_etaP,
0441               "GE11 eta partition where the extrapolated muon track falls"
0442               "<br />(int, partitions numbered from 1 to 8");
0443 
0444     addColumn(tabProp,
0445               "propagatedLoc_x",
0446               propagatedLoc_x,
0447               "expected position of muon track extrapolated to GE11 surface"
0448               "<br />(float, local layer x coordinates, cm)");
0449     addColumn(tabProp,
0450               "propagatedLoc_y",
0451               propagatedLoc_y,
0452               "expected position of muon track extrapolated to GE11 surface"
0453               "<br />(float, local layer y coordinates, cm)");
0454     addColumn(tabProp,
0455               "propagatedLoc_z",
0456               propagatedLoc_z,
0457               "expected position of muon track extrapolated to GE11 surface"
0458               "<br />(float, local layer z coordinates, cm)");
0459     addColumn(tabProp,
0460               "propagatedLoc_r",
0461               propagatedLoc_r,
0462               "expected position of muon track extrapolated to GE11 surface"
0463               "<br />(float, local layer radial coordinate, cm)");
0464     addColumn(tabProp,
0465               "propagatedLoc_phi",
0466               propagatedLoc_phi,
0467               "expected position of muon track extrapolated to GE11 surface"
0468               "<br />(float, local layer phi coordinates, rad)");
0469 
0470     addColumn(tabProp,
0471               "propagatedLoc_dirX",
0472               propagatedLoc_dirX,
0473               "direction cosine of angle between local x axis and GE11 plane"
0474               "<br />(float, dir. cosine)");
0475     addColumn(tabProp,
0476               "propagatedLoc_dirY",
0477               propagatedLoc_dirY,
0478               "direction cosine of angle between local y axis and GE11 plane"
0479               "<br />(float, dir. cosine)");
0480     addColumn(tabProp,
0481               "propagatedLoc_dirZ",
0482               propagatedLoc_dirZ,
0483               "direction cosine of angle between local z axis and GE11 plane"
0484               "<br />(float, dir. cosine)");
0485 
0486     addColumn(tabProp,
0487               "propagatedLoc_errX",
0488               propagatedLoc_errX,
0489               "uncertainty on expected position of muon track extrapolated to GE11 surface"
0490               "<br />(float, local layer x coordinates, cm)");
0491     addColumn(tabProp,
0492               "propagatedLoc_errY",
0493               propagatedLoc_errY,
0494               "uncertainty on expected position of muon track extrapolated to GE11 surface"
0495               "<br />(float, local layer y coordinates, cm)");
0496 
0497     addColumn(tabProp,
0498               "propagatedGlb_x",
0499               propagatedGlb_x,
0500               "expected position of muon track extrapolated to GE11 surface"
0501               "<br />(float, global x coordinates, cm)");
0502     addColumn(tabProp,
0503               "propagatedGlb_y",
0504               propagatedGlb_y,
0505               "expected position of muon track extrapolated to GE11 surface"
0506               "<br />(float, global y coordinates, cm)");
0507     addColumn(tabProp,
0508               "propagatedGlb_z",
0509               propagatedGlb_z,
0510               "expected position of muon track extrapolated to GE11 surface"
0511               "<br />(float, global z coordinates, cm)");
0512     addColumn(tabProp,
0513               "propagatedGlb_r",
0514               propagatedGlb_r,
0515               "expected position of muon track extrapolated to GE11 surface"
0516               "<br />(float, global radial (r) coordinates, cm)");
0517     addColumn(tabProp,
0518               "propagatedGlb_phi",
0519               propagatedGlb_phi,
0520               "expected position of muon track extrapolated to GE11 surface"
0521               "<br />(float, global phi coordinates, rad)");
0522     addColumn(tabProp,
0523               "propagatedGlb_errX",
0524               propagatedGlb_errX,
0525               "uncertainty on position of muon track extrapolated to GE11 surface"
0526               "<br />(float, global x coordinates, cm)");
0527     addColumn(tabProp,
0528               "propagatedGlb_errY",
0529               propagatedGlb_errY,
0530               "uncertainty on position of muon track extrapolated to GE11 surface"
0531               "<br />(float, global y coordinates, cm)");
0532     addColumn(tabProp,
0533               "propagatedGlb_rerr",
0534               propagatedGlb_rerr,
0535               "uncertainty on position of muon track extrapolated to GE11 surface"
0536               "<br />(float, global radial (r) coordinates, cm)");
0537     addColumn(tabProp,
0538               "propagatedGlb_phierr",
0539               propagatedGlb_phierr,
0540               "uncertainty on position of muon track extrapolated to GE11 surface"
0541               "<br />(float, global phi coordinates, rad)");
0542 
0543     addColumn(tabProp,
0544               "propagated_EtaPartition_centerX",
0545               propagated_EtaPartition_centerX,
0546               "global X coordinate of the center of the etaPartition"
0547               "<br />where the extrapolated muon track position falls"
0548               "<br />(float, global x coordinates, cm)");
0549     addColumn(tabProp,
0550               "propagated_EtaPartition_centerY",
0551               propagated_EtaPartition_centerY,
0552               "global Y coordinate of the center of the etaPartition"
0553               "<br />where the extrapolated muon track position falls"
0554               "<br />(float, global x coordinates, cm)");
0555     addColumn(tabProp,
0556               "propagated_EtaPartition_phiMax",
0557               propagated_EtaPartition_phiMax,
0558               "upper edge in phi global coordinates of the etaPartition"
0559               "<br />where the extrapolated muon track position falls"
0560               "<br />(float, global phi coordinates, rad)");
0561     addColumn(tabProp,
0562               "propagated_EtaPartition_phiMin",
0563               propagated_EtaPartition_phiMin,
0564               "lower edge in phi global coordinates of the etaPartition"
0565               "<br />where the extrapolated muon track position falls"
0566               "<br />(float, global phi coordinates, rad)");
0567     addColumn(tabProp,
0568               "propagated_EtaPartition_rMax",
0569               propagated_EtaPartition_rMax,
0570               "upper edge in r global coordinates of the etaPartition"
0571               "<br />where the extrapolated muon track position falls"
0572               "<br />(float, global radial (r) coordinates, cm)");
0573     addColumn(tabProp,
0574               "propagated_EtaPartition_rMin",
0575               propagated_EtaPartition_rMin,
0576               "lower edge in r global coordinates of the etaPartition"
0577               "<br />where the extrapolated muon track position falls"
0578               "<br />(float, global radial (r) coordinates, cm)");
0579 
0580     ev.put(std::move(tabProp), "propagated");
0581   }
0582 }
0583 
0584 #include "FWCore/PluginManager/interface/ModuleDef.h"
0585 #include "FWCore/Framework/interface/MakerMacros.h"
0586 
0587 DEFINE_FWK_MODULE(MuGEMMuonExtTableProducer);