CMS 3D CMS Logo

TrackerToMuonPropagator.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: TrackerToMuonPropagator
4 // Class: TrackerToMuonPropagator
5 //
13 //
14 // Original Author: Jim Pivarski
15 // Created: Wed Dec 12 13:31:55 CST 2007
16 // $Id: TrackerToMuonPropagator.cc,v 1.4 2010/01/04 15:36:54 mussgill Exp $
17 //
18 //
19 
20 // system include files
21 #include <memory>
22 
23 // user include files
30 
31 // products
34 
35 // references
57 
58 //
59 // class decleration
60 //
61 
63 public:
65  ~TrackerToMuonPropagator() override;
66 
67 private:
68  void produce(edm::Event&, const edm::EventSetup&) override;
69 
70  // ----------member data ---------------------------
71 
72  // es tokens
79 
81 
84 };
85 
86 //
87 // constants, enums and typedefs
88 //
89 
90 //
91 // static data member definitions
92 //
93 
94 //
95 // constructors and destructor
96 //
98  : m_esTokenProp(esConsumes(edm::ESInputTag("", iConfig.getParameter<std::string>("propagator")))),
99  m_esTokenTk(esConsumes()),
100  m_esTokenDT(esConsumes()),
101  m_esTokenCSC(esConsumes()),
102  m_esTokenMF(esConsumes()),
103  m_esTokenGTGeo(esConsumes()) {
104  m_globalMuons = iConfig.getParameter<edm::InputTag>("globalMuons");
105  m_globalMuonTracks = iConfig.getParameter<edm::InputTag>("globalMuonTracks");
106  m_refitTracker = iConfig.getParameter<bool>("refitTrackerTrack");
107  if (m_refitTracker) {
108  m_trackTransformer = new TrackTransformer(iConfig.getParameter<edm::ParameterSet>("trackerTrackTransformer"));
109  } else
110  m_trackTransformer = nullptr;
111 
112  produces<std::vector<Trajectory>>();
113  produces<TrajTrackAssociationCollection>();
114 }
115 
117  // do anything here that needs to be done at desctruction time
118  // (e.g. close files, deallocate resources etc.)
119 }
120 
121 //
122 // member functions
123 //
124 
125 // ------------ method called to produce the data ------------
127  if (m_trackTransformer)
129 
131  iEvent.getByLabel(m_globalMuons, globalMuons);
132 
133  edm::Handle<reco::TrackCollection> globalMuonTracks;
134  iEvent.getByLabel(m_globalMuonTracks, globalMuonTracks);
135 
136  const Propagator* propagator = &iSetup.getData(m_esTokenProp);
137  const TrackerGeometry* trackerGeometry = &iSetup.getData(m_esTokenTk);
138  const DTGeometry* dtGeometry = &iSetup.getData(m_esTokenDT);
139  const CSCGeometry* cscGeometry = &iSetup.getData(m_esTokenCSC);
141  const GlobalTrackingGeometry* globalGeometry = &iSetup.getData(m_esTokenGTGeo);
142 
143  // Create these factories once per event
144 
145  MuonTransientTrackingRecHitBuilder muonTransBuilder;
146 
147  // Create a collection of Trajectories, to put in the Event
148  auto trajectoryCollection = std::make_unique<std::vector<Trajectory>>();
149 
150  // Remember which trajectory is associated with which track
151  std::map<edm::Ref<std::vector<Trajectory>>::key_type, edm::Ref<reco::TrackCollection>::key_type> reference_map;
152  edm::Ref<std::vector<Trajectory>>::key_type trajCounter = 0;
153 
154  for (reco::MuonCollection::const_iterator globalMuon = globalMuons->begin(); globalMuon != globalMuons->end();
155  ++globalMuon) {
156  // get the counter for this global muon (that's why we needed to extract the collection explicitly
158  reco::TrackCollection::const_iterator globalMuonTrack = globalMuonTracks->begin();
159  for (; globalMuonTrack != globalMuonTracks->end(); ++globalMuonTrack) {
160  trackCounter++;
161  if (fabs(globalMuon->combinedMuon()->phi() - globalMuonTrack->phi()) < 1e-10 &&
162  fabs(globalMuon->combinedMuon()->eta() - globalMuonTrack->eta()) < 1e-10)
163  break;
164  }
165  if (globalMuonTrack == globalMuonTracks->end()) {
166  throw cms::Exception("BadConfig") << "The tracks label doesn't correspond to the same objects as the muons label"
167  << std::endl;
168  }
169 
170  TrajectoryStateOnSurface tracker_tsos;
171  DetId outerDetId;
172  if (m_refitTracker) {
173  std::vector<Trajectory> trackerTrajectories = m_trackTransformer->transform(*globalMuon->track());
174  if (trackerTrajectories.size() == 1) {
175  const Trajectory trackerTrajectory = *(trackerTrajectories.begin());
176 
177  // surprisingly, firstMeasurement() corresponds to the outermost state of the tracker
178  tracker_tsos = trackerTrajectory.firstMeasurement().forwardPredictedState();
179  outerDetId = trackerTrajectory.firstMeasurement().recHit()->geographicalId();
180  } else
181  continue;
182  } else {
183  // get information about the outermost tracker hit
184  GlobalPoint outerPosition(globalMuon->track()->outerPosition().x(),
185  globalMuon->track()->outerPosition().y(),
186  globalMuon->track()->outerPosition().z());
187  GlobalVector outerMomentum(globalMuon->track()->outerMomentum().x(),
188  globalMuon->track()->outerMomentum().y(),
189  globalMuon->track()->outerMomentum().z());
190  int charge = globalMuon->track()->charge();
191  const reco::Track::CovarianceMatrix outerStateCovariance = globalMuon->track()->outerStateCovariance();
192  outerDetId = DetId(globalMuon->track()->outerDetId());
193 
194  // construct the information necessary to make a TrajectoryStateOnSurface
195  GlobalTrajectoryParameters globalTrajParams(outerPosition, outerMomentum, charge, magneticField);
196  CurvilinearTrajectoryError curviError(outerStateCovariance);
197  FreeTrajectoryState tracker_state(globalTrajParams, curviError);
198 
199  // starting point for propagation into the muon system
200  tracker_tsos =
201  TrajectoryStateOnSurface(globalTrajParams, curviError, trackerGeometry->idToDet(outerDetId)->surface());
202  }
203 
204  TrajectoryStateOnSurface last_tsos = tracker_tsos;
205 
206  // loop over the muon hits, keeping track of the successful extrapolations
208  std::vector<TrajectoryStateOnSurface> TSOSes;
209  for (auto const& hit : globalMuon->combinedMuon()->recHits()) {
210  DetId id = hit->geographicalId();
211 
212  TrajectoryStateOnSurface extrapolation;
213  bool extrapolated = false;
214  if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::DT) {
215  extrapolation = propagator->propagate(last_tsos, dtGeometry->idToDet(id)->surface());
216  extrapolated = true;
217  } else if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::CSC) {
218  extrapolation = propagator->propagate(last_tsos, cscGeometry->idToDet(id)->surface());
219  extrapolated = true;
220  }
221 
222  if (extrapolated && extrapolation.isValid()) {
223  muonHits.push_back(hit->clone());
224  TSOSes.push_back(extrapolation);
225  }
226  } // end loop over standAloneMuon hits
227 
228  // if it has any successful extrapolations, make them into a Trajectory
229  if (!muonHits.empty()) {
230  PTrajectoryStateOnDet const& PTraj = trajectoryStateTransform::persistentState(tracker_tsos, outerDetId.rawId());
231  TrajectorySeed trajectorySeed(PTraj, muonHits, alongMomentum);
232  Trajectory trajectory(trajectorySeed, alongMomentum);
233 
234  for (unsigned int i = 0; i < muonHits.size(); i++) {
235  TrajectoryMeasurement::ConstRecHitPointer hitPtr(muonTransBuilder.build(&(muonHits[i]), globalGeometry));
236  TrajectoryStateOnSurface TSOS = TSOSes[i];
237  trajectory.push(TrajectoryMeasurement(TSOS, TSOS, TSOS, hitPtr));
238  } // end filling Trajectory
239 
240  trajectoryCollection->push_back(trajectory);
241 
242  // Remember which Trajectory is associated with which Track
243  trajCounter++;
244  reference_map[trajCounter] = trackCounter;
245 
246  } // end if we have some good extrapolations
247 
248  } // end loop over globalMuons
249 
250  unsigned int numTrajectories = trajectoryCollection->size();
251 
252  // insert the trajectories into the Event
253  edm::OrphanHandle<std::vector<Trajectory>> ohTrajs = iEvent.put(std::move(trajectoryCollection));
254 
255  // create the trajectory <-> track association map
256  auto trajTrackMap = std::make_unique<TrajTrackAssociationCollection>();
257 
258  for (trajCounter = 0; trajCounter < numTrajectories; trajCounter++) {
259  edm::Ref<reco::TrackCollection>::key_type trackCounter = reference_map[trajCounter];
260 
261  trajTrackMap->insert(edm::Ref<std::vector<Trajectory>>(ohTrajs, trajCounter),
262  edm::Ref<reco::TrackCollection>(globalMuonTracks, trackCounter));
263  }
264  // and put it in the Event, also
265  iEvent.put(std::move(trajTrackMap));
266 }
267 
268 //define this as a plug-in
Vector3DBase
Definition: Vector3DBase.h:8
TrackerGeometry::idToDet
const TrackerGeomDet * idToDet(DetId) const override
Definition: TrackerGeometry.cc:193
DTGeometry
Definition: DTGeometry.h:28
Propagator.h
TrackerToMuonPropagator::~TrackerToMuonPropagator
~TrackerToMuonPropagator() override
Definition: TrackerToMuonPropagator.cc:116
TrackerToMuonPropagator::m_esTokenDT
const edm::ESGetToken< DTGeometry, MuonGeometryRecord > m_esTokenDT
Definition: TrackerToMuonPropagator.cc:75
TrackerToMuonPropagator
Definition: TrackerToMuonPropagator.cc:62
MuonSubdetId::CSC
static constexpr int CSC
Definition: MuonSubdetId.h:12
mps_fire.i
i
Definition: mps_fire.py:428
Muon.h
TrackerGeometry.h
TrackerToMuonPropagator::m_esTokenProp
const edm::ESGetToken< Propagator, TrackingComponentsRecord > m_esTokenProp
Definition: TrackerToMuonPropagator.cc:73
ESInputTag
TrackerToMuonPropagator::m_trackTransformer
TrackTransformer * m_trackTransformer
Definition: TrackerToMuonPropagator.cc:83
TrackTransformer::setServices
void setServices(const edm::EventSetup &) override
set the services needed by the TrackTransformer
Definition: TrackTransformer.cc:79
edm
HLT enums.
Definition: AlignableModifier.h:19
trajectoryStateTransform::persistentState
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
Definition: TrajectoryStateTransform.cc:14
CSCGeometry::idToDet
const GeomDet * idToDet(DetId) const override
Definition: CSCGeometry.cc:91
TrackerToMuonPropagator::m_esTokenTk
const edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > m_esTokenTk
Definition: TrackerToMuonPropagator.cc:74
TrackTransformer::transform
std::vector< Trajectory > transform(const reco::Track &) const override
Convert a reco::Track into Trajectory.
Definition: TrackTransformer.cc:182
EDProducer.h
TrackingRecHitFwd.h
HLT_FULL_cff.magneticField
magneticField
Definition: HLT_FULL_cff.py:348
edm::Handle< reco::MuonCollection >
edm::Ref
Definition: AssociativeIterator.h:58
CSCGeometry
Definition: CSCGeometry.h:24
TrackerToMuonPropagator::m_globalMuonTracks
edm::InputTag m_globalMuonTracks
Definition: TrackerToMuonPropagator.cc:80
Propagator
Definition: Propagator.h:44
DetId
Definition: DetId.h:17
edm::OwnVector::empty
bool empty() const
Definition: OwnVector.h:305
GeomDet::surface
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
TrackerToMuonPropagator::m_refitTracker
bool m_refitTracker
Definition: TrackerToMuonPropagator.cc:82
TrajectoryStateOnSurface
Definition: TrajectoryStateOnSurface.h:16
MakerMacros.h
TrackingRecHit.h
Track.h
TrackFwd.h
CurvilinearTrajectoryError
Definition: CurvilinearTrajectoryError.h:27
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
TrackCandidateProducer_cfi.propagator
propagator
Definition: TrackCandidateProducer_cfi.py:17
GlobalTrackingGeometry
Definition: GlobalTrackingGeometry.h:20
TrajectoryMeasurement::forwardPredictedState
TrajectoryStateOnSurface const & forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
Definition: TrajectoryMeasurement.h:177
MuonFwd.h
TrackerToMuonPropagator::m_globalMuons
edm::InputTag m_globalMuons
Definition: TrackerToMuonPropagator.cc:80
IdealMagneticFieldRecord.h
GlobalTrajectoryParameters
Definition: GlobalTrajectoryParameters.h:15
MuonSubdetId::DT
static constexpr int DT
Definition: MuonSubdetId.h:11
Point3DBase< float, GlobalTag >
TrajTrackAssociation.h
GlobalTrackingGeometryRecord.h
HLT_FULL_cff.TrackTransformer
TrackTransformer
Definition: HLT_FULL_cff.py:9725
DTGeometry.h
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
TrackerDigiGeometryRecord.h
edm::ParameterSet
Definition: ParameterSet.h:47
Event.h
TrackerToMuonPropagator::m_esTokenGTGeo
const edm::ESGetToken< GlobalTrackingGeometry, GlobalTrackingGeometryRecord > m_esTokenGTGeo
Definition: TrackerToMuonPropagator.cc:78
iEvent
int iEvent
Definition: GenABIO.cc:224
TrackerToMuonPropagator::m_esTokenCSC
const edm::ESGetToken< CSCGeometry, MuonGeometryRecord > m_esTokenCSC
Definition: TrackerToMuonPropagator.cc:76
MuonTransientTrackingRecHitBuilder::build
RecHitPointer build(const TrackingRecHit *p, edm::ESHandle< GlobalTrackingGeometry > trackingGeometry) const
Call the MuonTransientTrackingRecHit::specificBuild.
Definition: MuonTransientTrackingRecHitBuilder.cc:20
edm::stream::EDProducer
Definition: EDProducer.h:36
MagneticField.h
TrackTransformer.h
TrackerToMuonPropagator::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: TrackerToMuonPropagator.cc:126
edm::EventSetup
Definition: EventSetup.h:58
Trajectory::push
void push(const TrajectoryMeasurement &tm)
Definition: Trajectory.cc:50
MuonSubdetId.h
AlCaHLTBitMon_QueryRunRegistry.string
string string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
edm::ESGetToken< Propagator, TrackingComponentsRecord >
edm::Ref::key_type
std::remove_cv< typename std::remove_reference< argument_type >::type >::type key_type
Definition: Ref.h:164
TrackerToMuonPropagator::TrackerToMuonPropagator
TrackerToMuonPropagator(const edm::ParameterSet &)
Definition: TrackerToMuonPropagator.cc:97
edm::EventSetup::getData
bool getData(T &iHolder) const
Definition: EventSetup.h:127
TrajectoryMeasurement::recHit
ConstRecHitPointer const & recHit() const
Definition: TrajectoryMeasurement.h:190
Trajectory.h
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
edm::OrphanHandle
Definition: EDProductfwd.h:39
Trajectory::firstMeasurement
TrajectoryMeasurement const & firstMeasurement() const
Definition: Trajectory.h:166
FreeTrajectoryState
Definition: FreeTrajectoryState.h:27
TrajectoryMeasurement::ConstRecHitPointer
TrackingRecHit::ConstRecHitPointer ConstRecHitPointer
Definition: TrajectoryMeasurement.h:28
Trajectory
Definition: Trajectory.h:38
Frameworkfwd.h
MuonTransientTrackingRecHitBuilder.h
TrackingComponentsRecord.h
Exception
Definition: hltDiff.cc:245
TrajectorySeed
Definition: TrajectorySeed.h:18
EventSetup.h
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
TrajectoryStateTransform.h
edm::OwnVector::push_back
void push_back(D *&d)
Definition: OwnVector.h:326
DetId::Muon
Definition: DetId.h:26
PTrajectoryStateOnDet
Definition: PTrajectoryStateOnDet.h:10
ParameterSet.h
MuonGeometryRecord.h
DeDxTools::esConsumes
ESGetTokenH3DDVariant esConsumes(std::string const &Reccord, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
GlobalTrackingGeometry.h
reco::TrackBase::CovarianceMatrix
math::Error< dimension >::type CovarianceMatrix
5 parameter covariance matrix
Definition: TrackBase.h:74
edm::Event
Definition: Event.h:73
globalMuons_cfi.globalMuons
globalMuons
Definition: globalMuons_cfi.py:6
MagneticField
Definition: MagneticField.h:19
MuonTransientTrackingRecHitBuilder
Definition: MuonTransientTrackingRecHitBuilder.h:12
TrajectoryMeasurement
Definition: TrajectoryMeasurement.h:25
DTGeometry::idToDet
const GeomDet * idToDet(DetId) const override
Definition: DTGeometry.cc:77
edm::OwnVector::size
size_type size() const
Definition: OwnVector.h:300
TrackerToMuonPropagator::m_esTokenMF
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > m_esTokenMF
Definition: TrackerToMuonPropagator.cc:77
edm::InputTag
Definition: InputTag.h:15
alongMomentum
Definition: PropagationDirection.h:4
TrajectoryStateOnSurface::isValid
bool isValid() const
Definition: TrajectoryStateOnSurface.h:54
hit
Definition: SiStripHitEffFromCalibTree.cc:88
edm::OwnVector< TrackingRecHit >
CSCGeometry.h
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
TrackerGeometry
Definition: TrackerGeometry.h:14
susybsm::HSCParticleType::globalMuon
Definition: HSCParticle.h:20
TrackTransformer
Definition: TrackTransformer.h:46