Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-06-05 22:16:10

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<int8_t> propagated_region;
0119   std::vector<int8_t> propagated_layer;
0120   std::vector<int8_t> propagated_chamber;
0121   std::vector<int8_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<int8_t> propagated_nME1hits;
0152   std::vector<int8_t> propagated_nME2hits;
0153   std::vector<int8_t> propagated_nME3hits;
0154   std::vector<int8_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 =
0217             is_insideout ? transient_track.outermostMeasurementState() : transient_track.innermostMeasurementState();
0218         auto& propagator = is_incoming ? propagator_along : propagator_opposite;
0219 
0220         auto recHitMu = outerTrackRef->recHitsBegin();
0221         auto recHitMuEnd = outerTrackRef->recHitsEnd();
0222 
0223         //loop on recHits which form the outerTrack
0224         for (; recHitMu != recHitMuEnd; ++recHitMu) {
0225           DetId detId{(*recHitMu)->geographicalId()};
0226 
0227           if (detId.det() == DetId::Muon && detId.subdetId() == MuonSubdetId::CSC) {
0228             is_csc = true;
0229 
0230             const CSCDetId csc_id{detId};
0231             // ME11 chambers consist of 2 subchambers: ME11a, ME11b.
0232             // In CMSSW they are referred as Stat. 1 Ring 1, Stat. 1 Ring. 4 respectively
0233             if (csc_id.station() == 1 && ((csc_id.ring() == 1) || (csc_id.ring() == 4)))
0234               is_me11 = true;
0235           }
0236         }  //loop on recHits
0237 
0238         //if at least one CSC hit is found, perform propagation
0239         if (is_csc) {
0240           // CSC Hits
0241           int8_t nME1_hits = 0;
0242           int8_t nME2_hits = 0;
0243           int8_t nME3_hits = 0;
0244           int8_t nME4_hits = 0;
0245 
0246           int nHits{htp.numberOfAllHits(htp.TRACK_HITS)};
0247 
0248           for (int i = 0; i != nHits; ++i) {
0249             uint32_t hit = htp.getHitPattern(htp.TRACK_HITS, i);
0250             int substructure = htp.getSubStructure(hit);
0251             int hittype = htp.getHitType(hit);
0252 
0253             if (substructure == 2 && hittype == 0) {  // CSC Hits
0254               int CSC_station = htp.getMuonStation(hit);
0255 
0256               switch (CSC_station) {
0257                 case 1:
0258                   ++nME1_hits;
0259                   break;
0260                 case 2:
0261                   ++nME2_hits;
0262                   break;
0263                 case 3:
0264                   ++nME3_hits;
0265                   break;
0266                 case 4:
0267                   ++nME4_hits;
0268                   break;
0269                 default:
0270                   // do nothing
0271                   break;
0272               }
0273             }
0274           }
0275           //loop on GEM etaPartitions
0276           for (const auto& eta_partition : m_gemGeometry->etaPartitions()) {
0277             if (eta_partition->id().station() != 1) {
0278               continue;  //Only takes GE1/1
0279             }
0280             const GEMDetId&& gem_id = eta_partition->id();
0281 
0282             bool is_opposite_region = muon.eta() * gem_id.region() < 0;
0283             if (is_incoming xor is_opposite_region) {
0284               continue;  //Check on muon direction
0285             }
0286             const BoundPlane& bound_plane = eta_partition->surface();
0287 
0288             const auto& dest_state = propagator->propagate(start_state, bound_plane);
0289             if (!dest_state.isValid()) {
0290               // std::cout << "failed to propagate" << std::endl;
0291               continue;
0292             }
0293             const GlobalPoint&& dest_global_pos = dest_state.globalPosition();
0294             const LocalPoint&& local_point = eta_partition->toLocal(dest_global_pos);
0295             const LocalPoint local_point_2d{local_point.x(), local_point.y(), 0.0f};
0296 
0297             if (eta_partition->surface().bounds().inside(local_point_2d)) {
0298               //// PROPAGATED HIT ERROR EVALUATION
0299               // X,Y
0300               double xx = dest_state.curvilinearError().matrix()(3, 3);
0301               double yy = dest_state.curvilinearError().matrix()(4, 4);
0302               double xy = dest_state.curvilinearError().matrix()(4, 3);
0303               double dest_glob_error_x = sqrt(0.5 * (xx + yy - sqrt((xx - yy) * (xx - yy) + 4 * xy * xy)));
0304               double dest_glob_error_y = sqrt(0.5 * (xx + yy + sqrt((xx - yy) * (xx - yy) + 4 * xy * xy)));
0305 
0306               // R,Phi
0307               const LocalPoint&& dest_local_pos = eta_partition->toLocal(dest_global_pos);
0308               const LocalError&& dest_local_err = dest_state.localError().positionError();
0309               const GlobalError& dest_global_err =
0310                   ErrorFrameTransformer().transform(dest_local_err, eta_partition->surface());
0311               const double dest_global_r_err = std::sqrt(dest_global_err.rerr(dest_global_pos));
0312               const double dest_global_phi_err = std::sqrt(dest_global_err.phierr(dest_global_pos));
0313 
0314               ++nProp;
0315 
0316               propagated_muIdx.push_back(nMuons - 1);
0317 
0318               propagated_nME1hits.push_back(nME1_hits);
0319               propagated_nME2hits.push_back(nME2_hits);
0320               propagated_nME3hits.push_back(nME3_hits);
0321               propagated_nME4hits.push_back(nME4_hits);
0322 
0323               const auto& eta_partition_pos{eta_partition->position()};
0324               const auto& eta_partition_surf{eta_partition->surface()};
0325               propagated_EtaPartition_centerX.push_back(eta_partition_pos.x());
0326               propagated_EtaPartition_centerY.push_back(eta_partition_pos.y());
0327               propagated_EtaPartition_rMin.push_back(eta_partition_surf.rSpan().first);
0328               propagated_EtaPartition_rMax.push_back(eta_partition_surf.rSpan().second);
0329               propagated_EtaPartition_phiMin.push_back(eta_partition_surf.phiSpan().first);
0330               propagated_EtaPartition_phiMax.push_back(eta_partition_surf.phiSpan().second);
0331 
0332               propagatedGlb_x.push_back(dest_global_pos.x());
0333               propagatedGlb_y.push_back(dest_global_pos.y());
0334               propagatedGlb_z.push_back(dest_global_pos.z());
0335               propagatedGlb_r.push_back(dest_global_pos.perp());
0336               propagatedGlb_phi.push_back(dest_global_pos.phi());
0337 
0338               const auto dest_local_dir{dest_state.localDirection()};
0339               propagatedLoc_x.push_back(dest_local_pos.x());
0340               propagatedLoc_y.push_back(dest_local_pos.y());
0341               propagatedLoc_z.push_back(dest_local_pos.z());
0342               propagatedLoc_r.push_back(dest_local_pos.perp());
0343               propagatedLoc_phi.push_back(dest_local_pos.phi());
0344               propagatedLoc_dirX.push_back(dest_local_dir.x());
0345               propagatedLoc_dirY.push_back(dest_local_dir.y());
0346               propagatedLoc_dirZ.push_back(dest_local_dir.z());
0347 
0348               propagatedLoc_errX.push_back(dest_local_err.xx());
0349               propagatedLoc_errY.push_back(dest_local_err.yy());
0350 
0351               propagatedGlb_errX.push_back(dest_glob_error_x);
0352               propagatedGlb_errY.push_back(dest_glob_error_y);
0353               propagatedGlb_rerr.push_back(dest_global_r_err);
0354               propagatedGlb_phierr.push_back(dest_global_phi_err);
0355 
0356               propagated_region.push_back(gem_id.region());
0357               propagated_layer.push_back(gem_id.layer());
0358               propagated_chamber.push_back(gem_id.chamber());
0359               propagated_etaP.push_back(gem_id.roll());
0360 
0361               propagated_isinsideout.push_back(is_insideout);
0362               propagated_isincoming.push_back(is_incoming);
0363 
0364             }   //propagation is inside boundaries
0365           }     //loop on EtaPartitions
0366         }       //is_csc therefore perform propagation
0367       } else {  //!muon.outerTrack().isNull()
0368         innermost_x.push_back(DEFAULT_DOUBLE_VAL);
0369         innermost_y.push_back(DEFAULT_DOUBLE_VAL);
0370         innermost_z.push_back(DEFAULT_DOUBLE_VAL);
0371         outermost_x.push_back(DEFAULT_DOUBLE_VAL);
0372         outermost_y.push_back(DEFAULT_DOUBLE_VAL);
0373         outermost_z.push_back(DEFAULT_DOUBLE_VAL);
0374       }
0375       isCSC.push_back(is_csc);
0376       isME11.push_back(is_me11);
0377 
0378     }  //loop on reco muons
0379   }
0380 
0381   auto table = std::make_unique<nanoaod::FlatTable>(nMuons, m_name, false, true);
0382 
0383   //table->setDoc("RECO muon information");
0384 
0385   addColumn(table, "innermost_x", innermost_x, "");
0386   addColumn(table, "innermost_y", innermost_y, "");
0387   addColumn(table, "innermost_z", innermost_z, "");
0388 
0389   addColumn(table, "outermost_x", outermost_x, "");
0390   addColumn(table, "outermost_y", outermost_y, "");
0391   addColumn(table, "outermost_z", outermost_z, "");
0392   ev.put(std::move(table));
0393 
0394   if (m_fillPropagated) {
0395     auto tabProp = std::make_unique<nanoaod::FlatTable>(nProp, m_name + "_propagated", false, false);
0396 
0397     addColumn(tabProp, "propagated_muIdx", propagated_muIdx, "");
0398 
0399     addColumn(tabProp,
0400               "propagated_nME1hits",
0401               propagated_nME1hits,
0402               "number of hits in the CSC ME1 station"
0403               "in the STA muon track extrapolated to GE11");
0404     addColumn(tabProp,
0405               "propagated_nME2hits",
0406               propagated_nME2hits,
0407               "number of hits in the CSC ME2 station"
0408               "in the STA muon track extrapolated to GE11");
0409     addColumn(tabProp,
0410               "propagated_nME3hits",
0411               propagated_nME3hits,
0412               "number of hits in the CSC ME3 station"
0413               "in the STA muon track extrapolated to GE11");
0414     addColumn(tabProp,
0415               "propagated_nME4hits",
0416               propagated_nME4hits,
0417               "number of hits in the CSC ME4 station"
0418               "in the STA muon track extrapolated to GE11");
0419 
0420     addColumn(
0421         tabProp, "propagated_isincoming", propagated_isincoming, "bool, condition on the muon STA track direction");
0422     addColumn(
0423         tabProp, "propagated_isinsideout", propagated_isinsideout, "bool, condition on the muon STA track direction");
0424     addColumn(tabProp,
0425               "propagated_region",
0426               propagated_region,
0427               "GE11 region where the extrapolated muon track falls"
0428               "<br />(int, positive endcap: +1, negative endcap: -1");
0429     addColumn(tabProp,
0430               "propagated_layer",
0431               propagated_layer,
0432               "GE11 layer where the extrapolated muon track falls"
0433               "<br />(int, layer1: 1, layer2: 2");
0434     addColumn(tabProp,
0435               "propagated_chamber",
0436               propagated_chamber,
0437               "GE11 superchamber where the extrapolated muon track falls"
0438               "<br />(int, chambers numbered from 0 to 35");
0439     addColumn(tabProp,
0440               "propagated_etaP",
0441               propagated_etaP,
0442               "GE11 eta partition where the extrapolated muon track falls"
0443               "<br />(int, partitions numbered from 1 to 8");
0444 
0445     addColumn(tabProp,
0446               "propagatedLoc_x",
0447               propagatedLoc_x,
0448               "expected position of muon track extrapolated to GE11 surface"
0449               "<br />(float, local layer x coordinates, cm)");
0450     addColumn(tabProp,
0451               "propagatedLoc_y",
0452               propagatedLoc_y,
0453               "expected position of muon track extrapolated to GE11 surface"
0454               "<br />(float, local layer y coordinates, cm)");
0455     addColumn(tabProp,
0456               "propagatedLoc_z",
0457               propagatedLoc_z,
0458               "expected position of muon track extrapolated to GE11 surface"
0459               "<br />(float, local layer z coordinates, cm)");
0460     addColumn(tabProp,
0461               "propagatedLoc_r",
0462               propagatedLoc_r,
0463               "expected position of muon track extrapolated to GE11 surface"
0464               "<br />(float, local layer radial coordinate, cm)");
0465     addColumn(tabProp,
0466               "propagatedLoc_phi",
0467               propagatedLoc_phi,
0468               "expected position of muon track extrapolated to GE11 surface"
0469               "<br />(float, local layer phi coordinates, rad)");
0470 
0471     addColumn(tabProp,
0472               "propagatedLoc_dirX",
0473               propagatedLoc_dirX,
0474               "direction cosine of angle between local x axis and GE11 plane"
0475               "<br />(float, dir. cosine)");
0476     addColumn(tabProp,
0477               "propagatedLoc_dirY",
0478               propagatedLoc_dirY,
0479               "direction cosine of angle between local y axis and GE11 plane"
0480               "<br />(float, dir. cosine)");
0481     addColumn(tabProp,
0482               "propagatedLoc_dirZ",
0483               propagatedLoc_dirZ,
0484               "direction cosine of angle between local z axis and GE11 plane"
0485               "<br />(float, dir. cosine)");
0486 
0487     addColumn(tabProp,
0488               "propagatedLoc_errX",
0489               propagatedLoc_errX,
0490               "uncertainty on expected position of muon track extrapolated to GE11 surface"
0491               "<br />(float, local layer x coordinates, cm)");
0492     addColumn(tabProp,
0493               "propagatedLoc_errY",
0494               propagatedLoc_errY,
0495               "uncertainty on expected position of muon track extrapolated to GE11 surface"
0496               "<br />(float, local layer y coordinates, cm)");
0497 
0498     addColumn(tabProp,
0499               "propagatedGlb_x",
0500               propagatedGlb_x,
0501               "expected position of muon track extrapolated to GE11 surface"
0502               "<br />(float, global x coordinates, cm)");
0503     addColumn(tabProp,
0504               "propagatedGlb_y",
0505               propagatedGlb_y,
0506               "expected position of muon track extrapolated to GE11 surface"
0507               "<br />(float, global y coordinates, cm)");
0508     addColumn(tabProp,
0509               "propagatedGlb_z",
0510               propagatedGlb_z,
0511               "expected position of muon track extrapolated to GE11 surface"
0512               "<br />(float, global z coordinates, cm)");
0513     addColumn(tabProp,
0514               "propagatedGlb_r",
0515               propagatedGlb_r,
0516               "expected position of muon track extrapolated to GE11 surface"
0517               "<br />(float, global radial (r) coordinates, cm)");
0518     addColumn(tabProp,
0519               "propagatedGlb_phi",
0520               propagatedGlb_phi,
0521               "expected position of muon track extrapolated to GE11 surface"
0522               "<br />(float, global phi coordinates, rad)");
0523     addColumn(tabProp,
0524               "propagatedGlb_errX",
0525               propagatedGlb_errX,
0526               "uncertainty on position of muon track extrapolated to GE11 surface"
0527               "<br />(float, global x coordinates, cm)");
0528     addColumn(tabProp,
0529               "propagatedGlb_errY",
0530               propagatedGlb_errY,
0531               "uncertainty on position of muon track extrapolated to GE11 surface"
0532               "<br />(float, global y coordinates, cm)");
0533     addColumn(tabProp,
0534               "propagatedGlb_rerr",
0535               propagatedGlb_rerr,
0536               "uncertainty on position of muon track extrapolated to GE11 surface"
0537               "<br />(float, global radial (r) coordinates, cm)");
0538     addColumn(tabProp,
0539               "propagatedGlb_phierr",
0540               propagatedGlb_phierr,
0541               "uncertainty on position of muon track extrapolated to GE11 surface"
0542               "<br />(float, global phi coordinates, rad)");
0543 
0544     addColumn(tabProp,
0545               "propagated_EtaPartition_centerX",
0546               propagated_EtaPartition_centerX,
0547               "global X coordinate of the center of the etaPartition"
0548               "<br />where the extrapolated muon track position falls"
0549               "<br />(float, global x coordinates, cm)");
0550     addColumn(tabProp,
0551               "propagated_EtaPartition_centerY",
0552               propagated_EtaPartition_centerY,
0553               "global Y coordinate of the center of the etaPartition"
0554               "<br />where the extrapolated muon track position falls"
0555               "<br />(float, global x coordinates, cm)");
0556     addColumn(tabProp,
0557               "propagated_EtaPartition_phiMax",
0558               propagated_EtaPartition_phiMax,
0559               "upper edge in phi global coordinates of the etaPartition"
0560               "<br />where the extrapolated muon track position falls"
0561               "<br />(float, global phi coordinates, rad)");
0562     addColumn(tabProp,
0563               "propagated_EtaPartition_phiMin",
0564               propagated_EtaPartition_phiMin,
0565               "lower edge in phi global coordinates of the etaPartition"
0566               "<br />where the extrapolated muon track position falls"
0567               "<br />(float, global phi coordinates, rad)");
0568     addColumn(tabProp,
0569               "propagated_EtaPartition_rMax",
0570               propagated_EtaPartition_rMax,
0571               "upper edge in r global coordinates of the etaPartition"
0572               "<br />where the extrapolated muon track position falls"
0573               "<br />(float, global radial (r) coordinates, cm)");
0574     addColumn(tabProp,
0575               "propagated_EtaPartition_rMin",
0576               propagated_EtaPartition_rMin,
0577               "lower edge in r global coordinates of the etaPartition"
0578               "<br />where the extrapolated muon track position falls"
0579               "<br />(float, global radial (r) coordinates, cm)");
0580 
0581     ev.put(std::move(tabProp), "propagated");
0582   }
0583 }
0584 
0585 #include "FWCore/PluginManager/interface/ModuleDef.h"
0586 #include "FWCore/Framework/interface/MakerMacros.h"
0587 
0588 DEFINE_FWK_MODULE(MuGEMMuonExtTableProducer);