Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:58

0001 /**  \class L3MuonProducer
0002  *
0003  *   L3 muon reconstructor:
0004  *   reconstructs muons using DT, CSC, RPC and tracker
0005  *   information,<BR>
0006  *   starting from a L2 reonstructed muon.
0007  *
0008  *   \author  A. Everett - Purdue University
0009  */
0010 
0011 // Framework
0012 #include "FWCore/Framework/interface/ConsumesCollector.h"
0013 #include "FWCore/Framework/interface/Event.h"
0014 #include "FWCore/Framework/interface/EventSetup.h"
0015 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0016 #include "DataFormats/Common/interface/Handle.h"
0017 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0018 
0019 #include "RecoMuon/L3MuonProducer/src/L3MuonProducer.h"
0020 
0021 // TrackFinder and specific GLB Trajectory Builder
0022 #include "RecoMuon/L3TrackFinder/interface/L3MuonTrajectoryBuilder.h"
0023 #include "RecoMuon/TrackingTools/interface/MuonTrackFinder.h"
0024 #include "RecoMuon/TrackingTools/interface/MuonTrackLoader.h"
0025 #include "RecoMuon/TrackingTools/interface/MuonServiceProxy.h"
0026 #include "RecoMuon/GlobalTrackingTools/interface/MuonTrackingRegionBuilder.h"
0027 
0028 using namespace edm;
0029 using namespace std;
0030 
0031 //
0032 // constructor with config
0033 //
0034 L3MuonProducer::L3MuonProducer(const ParameterSet& parameterSet) {
0035   LogTrace("L3MuonProducer") << "constructor called" << endl;
0036 
0037   // Parameter set for the Builder
0038   ParameterSet trajectoryBuilderParameters = parameterSet.getParameter<ParameterSet>("L3TrajBuilderParameters");
0039 
0040   // L2 Muon Collection Label
0041   theL2CollectionLabel = parameterSet.getParameter<InputTag>("MuonCollectionLabel");
0042   l2MuonToken_ = consumes<reco::TrackCollection>(theL2CollectionLabel);
0043   l2MuonTrajToken_ = consumes<std::vector<Trajectory>>(theL2CollectionLabel.label());
0044   l2AssoMapToken_ = consumes<TrajTrackAssociationCollection>(theL2CollectionLabel.label());
0045   updatedL2AssoMapToken_ = consumes<reco::TrackToTrackMap>(theL2CollectionLabel.label());
0046 
0047   // service parameters
0048   ParameterSet serviceParameters = parameterSet.getParameter<ParameterSet>("ServiceParameters");
0049 
0050   // TrackLoader parameters
0051   ParameterSet trackLoaderParameters = parameterSet.getParameter<ParameterSet>("TrackLoaderParameters");
0052 
0053   // the services
0054   theService = std::make_unique<MuonServiceProxy>(serviceParameters, consumesCollector());
0055   ConsumesCollector iC = consumesCollector();
0056 
0057   // instantiate the concrete trajectory builder in the Track Finder
0058   auto mtl = std::make_unique<MuonTrackLoader>(trackLoaderParameters, iC, theService.get());
0059   auto l3mtb = std::make_unique<L3MuonTrajectoryBuilder>(trajectoryBuilderParameters, theService.get(), iC);
0060   theTrackFinder = std::make_unique<MuonTrackFinder>(std::move(l3mtb), std::move(mtl), iC);
0061 
0062   theL2SeededTkLabel =
0063       trackLoaderParameters.getUntrackedParameter<std::string>("MuonSeededTracksInstance", std::string());
0064 
0065   produces<TrackingRecHitCollection>(theL2SeededTkLabel);
0066   produces<reco::TrackExtraCollection>(theL2SeededTkLabel);
0067   // TrackCollection refers to TrackingRechit and TrackExtra
0068   // collections, need to declare its production after them to work
0069   // around a rare race condition in framework scheduling
0070   produces<reco::TrackCollection>(theL2SeededTkLabel);
0071   produces<vector<Trajectory>>(theL2SeededTkLabel);
0072   produces<TrajTrackAssociationCollection>(theL2SeededTkLabel);
0073 
0074   produces<TrackingRecHitCollection>();
0075   produces<reco::TrackExtraCollection>();
0076   // TrackCollection refers to TrackingRechit and TrackExtra
0077   // collections, need to declare its production after them to work
0078   // around a rare race condition in framework scheduling
0079   produces<reco::TrackCollection>();
0080   produces<vector<Trajectory>>();
0081   produces<TrajTrackAssociationCollection>();
0082 
0083   produces<reco::MuonTrackLinksCollection>();
0084 }
0085 
0086 //
0087 // destructor
0088 //
0089 L3MuonProducer::~L3MuonProducer() { LogTrace("L3MuonProducer") << "destructor called" << endl; }
0090 
0091 //
0092 // reconstruct muons
0093 //
0094 void L3MuonProducer::produce(Event& event, const EventSetup& eventSetup) {
0095   const string metname = "Muon|RecoMuon|L3MuonProducer";
0096   LogTrace(metname) << endl << endl << endl;
0097   LogTrace(metname) << "L3 Muon Reconstruction started" << endl;
0098 
0099   typedef vector<Trajectory> TrajColl;
0100 
0101   // Update the services
0102   theService->update(eventSetup);
0103 
0104   // Take the L2 muon container(s)
0105   LogTrace(metname) << "Taking the L2 Muons " << theL2CollectionLabel << endl;
0106 
0107   Handle<reco::TrackCollection> L2Muons;
0108   event.getByToken(l2MuonToken_, L2Muons);
0109 
0110   Handle<vector<Trajectory>> L2MuonsTraj;
0111   vector<MuonTrajectoryBuilder::TrackCand> L2TrackCands;
0112 
0113   event.getByToken(l2MuonTrajToken_, L2MuonsTraj);
0114 
0115   edm::Handle<TrajTrackAssociationCollection> L2AssoMap;
0116   event.getByToken(l2AssoMapToken_, L2AssoMap);
0117 
0118   edm::Handle<reco::TrackToTrackMap> updatedL2AssoMap;
0119   event.getByToken(updatedL2AssoMapToken_, updatedL2AssoMap);
0120 
0121   for (TrajTrackAssociationCollection::const_iterator it = L2AssoMap->begin(); it != L2AssoMap->end(); ++it) {
0122     const Ref<vector<Trajectory>> traj = it->key;
0123     const reco::TrackRef tkRegular = it->val;
0124     reco::TrackRef tkUpdated;
0125     reco::TrackToTrackMap::const_iterator iEnd;
0126     reco::TrackToTrackMap::const_iterator iii;
0127     if (theL2CollectionLabel.instance() == "UpdatedAtVtx") {
0128       iEnd = updatedL2AssoMap->end();
0129       iii = updatedL2AssoMap->find(it->val);
0130       if (iii != iEnd)
0131         tkUpdated = (*updatedL2AssoMap)[it->val];
0132     }
0133 
0134     const reco::TrackRef tk = (tkUpdated.isNonnull()) ? tkUpdated : tkRegular;
0135 
0136     MuonTrajectoryBuilder::TrackCand L2Cand = MuonTrajectoryBuilder::TrackCand((Trajectory*)nullptr, tk);
0137     if (traj->isValid())
0138       L2Cand.first = &*traj;
0139     L2TrackCands.push_back(L2Cand);
0140   }
0141 
0142   theTrackFinder->reconstruct(L2TrackCands, event, eventSetup);
0143 
0144   LogTrace(metname) << "Event loaded"
0145                     << "================================" << endl
0146                     << endl;
0147 }
0148 
0149 void L3MuonProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0150   edm::ParameterSetDescription desc;
0151   {
0152     edm::ParameterSetDescription psd0;
0153     psd0.addUntracked<std::vector<std::string>>("Propagators",
0154                                                 {
0155                                                     "hltESPSmartPropagatorAny",
0156                                                     "SteppingHelixPropagatorAny",
0157                                                     "hltESPSmartPropagator",
0158                                                     "hltESPSteppingHelixPropagatorOpposite",
0159                                                 });
0160     psd0.add<bool>("RPCLayers", true);
0161     psd0.addUntracked<bool>("UseMuonNavigation", true);
0162     desc.add<edm::ParameterSetDescription>("ServiceParameters", psd0);
0163   }
0164   desc.add<edm::InputTag>("MuonCollectionLabel", edm::InputTag("hltL2Muons", "UpdatedAtVtx"));
0165   {
0166     edm::ParameterSetDescription psd0;
0167     psd0.addUntracked<bool>("PutTkTrackIntoEvent", false);
0168     psd0.add<std::string>("TTRHBuilder", "hltESPTTRHBWithTrackAngle");
0169     psd0.add<edm::InputTag>("beamSpot", edm::InputTag("hltOnlineBeamSpot"));
0170     psd0.addUntracked<bool>("SmoothTkTrack", false);
0171     psd0.addUntracked<std::string>("MuonSeededTracksInstance", "L2Seeded");
0172     psd0.add<std::string>("Smoother", "hltESPKFTrajectorySmootherForMuonTrackLoader");
0173     {
0174       edm::ParameterSetDescription psd1;
0175       psd1.add<double>("MaxChi2", 1000000.0);
0176       psd1.add<std::string>("Propagator", "hltESPSteppingHelixPropagatorOpposite");
0177       psd1.add<std::vector<double>>("BeamSpotPositionErrors",
0178                                     {
0179                                         0.1,
0180                                         0.1,
0181                                         5.3,
0182                                     });
0183       psd0.add<edm::ParameterSetDescription>("MuonUpdatorAtVertexParameters", psd1);
0184     }
0185     psd0.add<bool>("VertexConstraint", false);
0186     psd0.add<bool>("DoSmoothing", false);
0187     desc.add<edm::ParameterSetDescription>("TrackLoaderParameters", psd0);
0188   }
0189   {
0190     edm::ParameterSetDescription psd0;
0191     psd0.add<double>("ScaleTECyFactor", -1.0);
0192     psd0.add<edm::InputTag>("tkTrajVertex", edm::InputTag("hltPixelVertices"));
0193     psd0.add<bool>("tkTrajUseVertex", false);
0194     {
0195       edm::ParameterSetDescription psd1;
0196       psd1.add<int>("TrackerSkipSection", -1);
0197       psd1.add<bool>("DoPredictionsOnly", false);
0198       psd1.add<bool>("PropDirForCosmics", false);
0199       psd1.add<int>("HitThreshold", 1);
0200       psd1.add<int>("MuonHitsOption", 1);
0201       psd1.add<bool>("RefitFlag", true);
0202       psd1.add<std::string>("Fitter", "hltESPL3MuKFTrajectoryFitter");
0203       psd1.add<int>("SkipStation", -1);
0204       psd1.add<std::string>("TrackerRecHitBuilder", "hltESPTTRHBWithTrackAngle");
0205       psd1.add<double>("Chi2CutRPC", 1.0);
0206       psd1.add<std::string>("MuonRecHitBuilder", "hltESPMuonTransientTrackingRecHitBuilder");
0207       psd1.add<std::string>("RefitDirection", "insideOut");
0208       psd1.add<edm::InputTag>("CSCRecSegmentLabel", edm::InputTag("hltCscSegments"));
0209       psd1.add<edm::InputTag>("GEMRecHitLabel", edm::InputTag("gemRecHits"));
0210       psd1.add<edm::InputTag>("ME0RecHitLabel", edm::InputTag("me0Segments"));
0211       psd1.add<std::vector<int>>("DYTthrs",
0212                                  {
0213                                      30,
0214                                      15,
0215                                  });
0216       psd1.add<int>("DYTselector", 1);
0217       psd1.add<bool>("DYTupdator", false);
0218       psd1.add<bool>("DYTuseAPE", false);
0219       psd1.add<bool>("DYTuseThrsParametrization", true);
0220       {
0221         edm::ParameterSetDescription psd2;
0222         psd2.add<std::vector<double>>("eta0p8", {1, -0.919853, 0.990742});
0223         psd2.add<std::vector<double>>("eta1p2", {1, -0.897354, 0.987738});
0224         psd2.add<std::vector<double>>("eta2p0", {1, -0.986855, 0.998516});
0225         psd2.add<std::vector<double>>("eta2p2", {1, -0.940342, 0.992955});
0226         psd2.add<std::vector<double>>("eta2p4", {1, -0.947633, 0.993762});
0227         psd1.add<edm::ParameterSetDescription>("DYTthrsParameters", psd2);
0228       }
0229       psd1.add<double>("Chi2CutCSC", 150.0);
0230       psd1.add<double>("Chi2CutDT", 10.0);
0231       psd1.add<double>("Chi2CutGEM", 1.0);
0232       psd1.add<double>("Chi2CutME0", 1.0);
0233       psd1.add<bool>("RefitRPCHits", true);
0234       psd1.add<edm::InputTag>("DTRecSegmentLabel", edm::InputTag("hltDt4DSegments"));
0235       psd1.add<std::string>("Propagator", "hltESPSmartPropagatorAny");
0236       psd1.add<int>("TrackerSkipSystem", -1);
0237       psd0.add<edm::ParameterSetDescription>("GlbRefitterParameters", psd1);
0238     }
0239     psd0.add<double>("tkTrajMaxChi2", 9999.0);
0240     psd0.add<double>("ScaleTECxFactor", -1.0);
0241     psd0.add<std::string>("TrackerRecHitBuilder", "hltESPTTRHBWithTrackAngle");
0242     psd0.add<edm::InputTag>("tkTrajBeamSpot", edm::InputTag("hltOnlineBeamSpot"));
0243     psd0.add<std::string>("MuonRecHitBuilder", "hltESPMuonTransientTrackingRecHitBuilder");
0244     psd0.add<double>("tkTrajMaxDXYBeamSpot", 9999.0);
0245     psd0.add<std::string>("TrackerPropagator", "SteppingHelixPropagatorAny");
0246     {
0247       edm::ParameterSetDescription psd1;
0248       psd1.add<bool>("precise", true);
0249       psd1.add<bool>("Eta_fixed", true);
0250       psd1.add<double>("Eta_min", 0.1);
0251       psd1.add<bool>("Z_fixed", false);
0252       psd1.add<edm::InputTag>("MeasurementTrackerName", edm::InputTag("hltESPMeasurementTracker"));
0253       psd1.add<int>("maxRegions", 2);
0254       psd1.add<double>("Pt_min", 3.0);
0255       psd1.add<double>("Rescale_Dz", 4.0);
0256       psd1.add<double>("PhiR_UpperLimit_Par1", 0.6);
0257       psd1.add<double>("PhiR_UpperLimit_Par2", 0.2);
0258       psd1.add<edm::InputTag>("vertexCollection", edm::InputTag("pixelVertices"));
0259       psd1.add<bool>("Phi_fixed", true);
0260       psd1.add<edm::InputTag>("input", edm::InputTag("hltL2Muons", "UpdatedAtVtx"));
0261       psd1.add<double>("DeltaR", 0.025);
0262       psd1.add<int>("OnDemand", -1);
0263       psd1.add<double>("DeltaZ", 24.2);
0264       psd1.add<double>("Rescale_phi", 3.0);
0265       psd1.add<double>("Rescale_eta", 3.0);
0266       psd1.add<double>("DeltaEta", 0.04);
0267       psd1.add<double>("DeltaPhi", 0.15);
0268       psd1.add<double>("Phi_min", 0.1);
0269       psd1.add<bool>("UseVertex", false);
0270       psd1.add<double>("EtaR_UpperLimit_Par1", 0.25);
0271       psd1.add<double>("EtaR_UpperLimit_Par2", 0.15);
0272       psd1.add<edm::InputTag>("beamSpot", edm::InputTag("hltOnlineBeamSpot"));
0273       psd1.add<bool>("Pt_fixed", false);
0274       psd0.add<edm::ParameterSetDescription>("MuonTrackingRegionBuilder", psd1);
0275     }
0276     psd0.add<bool>("RefitRPCHits", true);
0277     psd0.add<double>("PCut", 2.5);
0278     {
0279       edm::ParameterSetDescription psd1;
0280       TrackTransformer::fillPSetDescription(psd1,
0281                                             false,                                           // do predictions only
0282                                             "hltESPL3MuKFTrajectoryFitter",                  // fitter
0283                                             "hltESPKFTrajectorySmootherForMuonTrackLoader",  // smoother
0284                                             "hltESPSmartPropagatorAny",                      // propagator
0285                                             "insideOut",                                     // refit direction
0286                                             true,                                            // refit rpc hits
0287                                             "hltESPTTRHBWithTrackAngle",                     // tracker rechit builder
0288                                             "hltESPMuonTransientTrackingRecHitBuilder"       // muon rechit builder
0289       );
0290       psd0.add<edm::ParameterSetDescription>("TrackTransformer", psd1);
0291     }
0292     {
0293       edm::ParameterSetDescription psd1;
0294       psd1.add<double>("Quality_3", 7.0);
0295       psd1.add<double>("DeltaRCut_1", 0.1);
0296       psd1.add<double>("MinP", 2.5);
0297       psd1.add<double>("MinPt", 1.0);
0298       psd1.add<double>("Quality_2", 15.0);
0299       psd1.add<double>("Pt_threshold2", 999999999.0);
0300       psd1.add<double>("LocChi2Cut", 0.001);
0301       psd1.add<double>("Eta_threshold", 1.2);
0302       psd1.add<double>("Pt_threshold1", 0.0);
0303       psd1.add<double>("Chi2Cut_1", 50.0);
0304       psd1.add<double>("Quality_1", 20.0);
0305       psd1.add<double>("Chi2Cut_3", 200.0);
0306       psd1.add<double>("DeltaRCut_3", 1.0);
0307       psd1.add<double>("DeltaRCut_2", 0.2);
0308       psd1.add<double>("DeltaDCut_1", 40.0);
0309       psd1.add<double>("DeltaDCut_2", 10.0);
0310       psd1.add<double>("DeltaDCut_3", 15.0);
0311       psd1.add<double>("Chi2Cut_2", 50.0);
0312       psd1.add<std::string>("Propagator", "hltESPSmartPropagator");
0313       psd0.add<edm::ParameterSetDescription>("GlobalMuonTrackMatcher", psd1);
0314     }
0315     psd0.add<double>("PtCut", 1.0);
0316     psd0.add<bool>("matchToSeeds", true);
0317     psd0.add<edm::InputTag>("tkTrajLabel", edm::InputTag("hltBRSMuonSeededTracksOutIn"));
0318     desc.add<edm::ParameterSetDescription>("L3TrajBuilderParameters", psd0);
0319   }
0320   descriptions.add("L3MuonProducer", desc);
0321 }