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
0030 MuGEMMuonExtTableProducer(const edm::ParameterSet&);
0031
0032
0033 static void fillDescriptions(edm::ConfigurationDescriptions&);
0034
0035 protected:
0036
0037 void fillTable(edm::Event&) final;
0038
0039
0040 void getFromES(const edm::Run&, const edm::EventSetup&) final;
0041
0042
0043 void getFromES(const edm::EventSetup&) final;
0044
0045 private:
0046
0047 nano_mu::EDTokenHandle<edm::View<reco::Muon>> m_token;
0048
0049
0050 bool m_fillPropagated;
0051
0052
0053 nano_mu::ESTokenHandle<GEMGeometry, MuonGeometryRecord, edm::Transition::BeginRun> m_gemGeometry;
0054
0055
0056 nano_mu::ESTokenHandle<TransientTrackBuilder, TransientTrackRecord> m_transientTrackBuilder;
0057
0058
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
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
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
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
0231
0232 if (csc_id.station() == 1 && ((csc_id.ring() == 1) || (csc_id.ring() == 4)))
0233 is_me11 = true;
0234 }
0235 }
0236
0237
0238 if (is_csc) {
0239
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) {
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
0270 break;
0271 }
0272 }
0273 }
0274
0275 for (const auto& eta_partition : m_gemGeometry->etaPartitions()) {
0276 if (eta_partition->id().station() != 1) {
0277 continue;
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;
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
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
0298
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
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 }
0364 }
0365 }
0366 } else {
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 }
0378 }
0379
0380 auto table = std::make_unique<nanoaod::FlatTable>(nMuons, m_name, false, true);
0381
0382
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);