CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CosmicMuonSeedGenerator.cc
Go to the documentation of this file.
13 
15 
19 
25 
28 
32 
34 
35 #include <vector>
36 
39 
40 using namespace edm;
41 using namespace std;
42 
43 // Constructor
45  produces<TrajectorySeedCollection>();
46 
47  // enable the DT chamber
48  theEnableDTFlag = pset.getParameter<bool>("EnableDTMeasurement");
49  // enable the CSC chamber
50  theEnableCSCFlag = pset.getParameter<bool>("EnableCSCMeasurement");
51 
52  theDTRecSegmentLabel = pset.getParameter<InputTag>("DTRecSegmentLabel");
53 
54  theCSCRecSegmentLabel = pset.getParameter<InputTag>("CSCRecSegmentLabel");
55 
56  // the maximum number of TrajectorySeed
57  theMaxSeeds = pset.getParameter<int>("MaxSeeds");
58 
59  theMaxDTChi2 = pset.getParameter<double>("MaxDTChi2");
60  theMaxCSCChi2 = pset.getParameter<double>("MaxCSCChi2");
61 
62  theForcePointDownFlag = pset.existsAs<bool>("ForcePointDown") ? pset.getParameter<bool>("ForcePointDown") : true;
63 
64  // pre-determined parameters for seed pt calculation ( pt * dphi )
65  theParameters["topmb41"] = 0.87;
66  theParameters["bottommb41"] = 1.2;
67  theParameters["topmb42"] = 0.67;
68  theParameters["bottommb42"] = 0.98;
69  theParameters["topmb43"] = 0.34;
70  theParameters["bottommb43"] = 0.58;
71  theParameters["topmb31"] = 0.54;
72  theParameters["bottommb31"] = 0.77;
73  theParameters["topmb32"] = 0.35;
74  theParameters["bottommb32"] = 0.55;
75  theParameters["topmb21"] = 0.21;
76  theParameters["bottommb21"] = 0.31;
77 
78 
79  edm::ConsumesCollector iC = consumesCollector();
80  muonMeasurements = new MuonDetLayerMeasurements(theDTRecSegmentLabel,theCSCRecSegmentLabel,
81  InputTag(),iC,
82  theEnableDTFlag,theEnableCSCFlag,false);
83 
84 
85 
86 }
87 
88 // Destructor
90  if (muonMeasurements)
91  delete muonMeasurements;
92 }
93 
94 
95 // reconstruct muon's seeds
97 
98  eSetup.get<IdealMagneticFieldRecord>().get(theField);
99 
100  auto_ptr<TrajectorySeedCollection> output(new TrajectorySeedCollection());
101 
103 
104  std::string category = "Muon|RecoMuon|CosmicMuonSeedGenerator";
105 
106  // Muon Geometry - DT, CSC and RPC
107  eSetup.get<MuonRecoGeometryRecord>().get(theMuonLayers);
108 
109  // get the DT layers
110  vector<const DetLayer*> dtLayers = theMuonLayers->allDTLayers();
111 
112  // get the CSC layers
113  vector<const DetLayer*> cscForwardLayers = theMuonLayers->forwardCSCLayers();
114  vector<const DetLayer*> cscBackwardLayers = theMuonLayers->backwardCSCLayers();
115 
116 
117 
118  muonMeasurements->setEvent(event);
119 
120  MuonRecHitContainer allHits;
121 
122  vector<MuonRecHitContainer> RHMBs;
123  vector<MuonRecHitContainer> RHMEFs;
124  vector<MuonRecHitContainer> RHMEBs;
125 
126  stable_sort(allHits.begin(),allHits.end(),DecreasingGlobalY());
127 
128  for (vector<const DetLayer*>::reverse_iterator icsclayer = cscForwardLayers.rbegin();
129  icsclayer != cscForwardLayers.rend() - 1; ++icsclayer) {
130 
131  MuonRecHitContainer RHMF = muonMeasurements->recHits(*icsclayer);
132  allHits.insert(allHits.end(),RHMF.begin(),RHMF.end());
133 
134  }
135 
136  for (vector<const DetLayer*>::reverse_iterator icsclayer = cscBackwardLayers.rbegin();
137  icsclayer != cscBackwardLayers.rend() - 1; ++icsclayer) {
138 
139  MuonRecHitContainer RHMF = muonMeasurements->recHits(*icsclayer);
140  allHits.insert(allHits.end(),RHMF.begin(),RHMF.end());
141 
142  }
143 
144  for (vector<const DetLayer*>::reverse_iterator idtlayer = dtLayers.rbegin();
145  idtlayer != dtLayers.rend(); ++idtlayer) {
146 
147  MuonRecHitContainer RHMB = muonMeasurements->recHits(*idtlayer);
148  RHMBs.push_back(RHMB);
149 
150  if ( idtlayer != dtLayers.rbegin() ) allHits.insert(allHits.end(),RHMB.begin(),RHMB.end());
151 
152  }
153 
154 // stable_sort(allHits.begin(),allHits.end(),DecreasingGlobalY());
155 
156  LogTrace(category)<<"all RecHits: "<<allHits.size();
157 
158 // CosmicMuonSeedGenerator::MuonRecHitPairVector mb41 = makeSegPairs(RHMBs[0], RHMBs[3], "mb41");
159 // createSeeds(seeds, mb41, eSetup);
160 
161 // CosmicMuonSeedGenerator::MuonRecHitPairVector mb43 = makeSegPairs(RHMBs[0],RHMBs[1], "mb43");
162 // createSeeds(seeds, mb43, eSetup);
163 
164  CosmicMuonSeedGenerator::MuonRecHitPairVector mb42 = makeSegPairs(RHMBs[0],RHMBs[2], "mb42");
165  createSeeds(seeds, mb42, eSetup);
166 
167 // CosmicMuonSeedGenerator::MuonRecHitPairVector mb32 = makeSegPairs(RHMBs[1], RHMBs[2], "mb32");
168 // createSeeds(seeds, mb32, eSetup);
169 
170  CosmicMuonSeedGenerator::MuonRecHitPairVector mb31 = makeSegPairs(RHMBs[1], RHMBs[3], "mb31");
171  createSeeds(seeds, mb31, eSetup);
172 
173 // CosmicMuonSeedGenerator::MuonRecHitPairVector mb21 = makeSegPairs(RHMBs[2], RHMBs[3], "mb21");
174 // createSeeds(seeds, mb21, eSetup);
175 
176  if ( !allHits.empty() ) {
177 
178  MuonRecHitContainer goodhits = selectSegments(allHits);
179  LogTrace(category)<<"good RecHits: "<<goodhits.size();
180 
181  if ( goodhits.empty() ) {
182  LogTrace(category)<<"No qualified Segments in Event! ";
183  LogTrace(category)<<"Use 2D RecHit";
184 
185  createSeeds(seeds,allHits,eSetup);
186 
187  }
188  else {
189  createSeeds(seeds,goodhits,eSetup);
190  }
191  }
192 
193  LogTrace(category)<<"Seeds built: "<<seeds.size();
194 
195  for(std::vector<TrajectorySeed>::iterator seed = seeds.begin();
196  seed != seeds.end(); ++seed) {
197  output->push_back(*seed);
198  }
199 
200  event.put(output);
201  seeds.clear();
202 
203 }
204 
205 
207 
208  const std::string category = "Muon|RecoMuon|CosmicMuonSeedGenerator";
209 
210  // only use 4D segments
211  if ( !hit->isValid() ) return false;
212 
213  if (hit->dimension() < 4) {
214  LogTrace(category)<<"dim < 4";
215  return false;
216  }
217 
218  if (hit->isDT() && ( hit->chi2()> theMaxDTChi2 )) {
219  LogTrace(category)<<"DT chi2 too large";
220  return false;
221  }
222  else if (hit->isCSC() &&( hit->chi2()> theMaxCSCChi2 ) ) {
223  LogTrace(category)<<"CSC chi2 too large";
224  return false;
225  }
226  return true;
227 
228 }
229 
231 
233  const std::string category = "Muon|RecoMuon|CosmicMuonSeedGenerator";
234 
235  //Only select good quality Segments
236  for (MuonRecHitContainer::const_iterator hit = hits.begin(); hit != hits.end(); hit++) {
237  if ( checkQuality(*hit) ) result.push_back(*hit);
238  }
239 
240  if ( result.size() < 2 ) return result;
241 
242  MuonRecHitContainer result2;
243 
244  //avoid selecting Segments with similar direction
245  for (MuonRecHitContainer::iterator hit = result.begin(); hit != result.end(); hit++) {
246  if (*hit == 0) continue;
247  if ( !(*hit)->isValid() ) continue;
248  bool good = true;
249  //UNUSED: GlobalVector dir1 = (*hit)->globalDirection();
250  //UNUSED: GlobalPoint pos1 = (*hit)->globalPosition();
251  for (MuonRecHitContainer::iterator hit2 = hit + 1; hit2 != result.end(); hit2++) {
252  if (*hit2 == 0) continue;
253  if ( !(*hit2)->isValid() ) continue;
254 
255  //compare direction and position
256  //UNUSED: GlobalVector dir2 = (*hit2)->globalDirection();
257  //UNUSED: GlobalPoint pos2 = (*hit2)->globalPosition();
258  if ( !areCorrelated((*hit),(*hit2)) ) continue;
259 
260  if ( !leftIsBetter((*hit),(*hit2)) ) {
261  good = false;
262  } else (*hit2) = 0;
263  }
264 
265  if ( good ) result2.push_back(*hit);
266  }
267 
268  result.clear();
269 
270  return result2;
271 
272 }
273 
275  const MuonRecHitContainer& hits,
276  const edm::EventSetup& eSetup) const {
277 
278  const std::string category = "Muon|RecoMuon|CosmicMuonSeedGenerator";
279 
280  if (hits.size() == 0 || results.size() >= theMaxSeeds ) return;
281  for (MuonRecHitContainer::const_iterator ihit = hits.begin(); ihit != hits.end(); ihit++) {
282  const std::vector<TrajectorySeed>& sds = createSeed((*ihit),eSetup);
283  LogTrace(category)<<"created seeds from rechit "<<sds.size();
284  results.insert(results.end(),sds.begin(),sds.end());
285  if ( results.size() >= theMaxSeeds ) break;
286  }
287  return;
288 }
289 
292  const edm::EventSetup& eSetup) const {
293 
294  const std::string category = "Muon|RecoMuon|CosmicMuonSeedGenerator";
295 
296  if (hitpairs.size() == 0 || results.size() >= theMaxSeeds ) return;
297  for (CosmicMuonSeedGenerator::MuonRecHitPairVector::const_iterator ihitpair = hitpairs.begin(); ihitpair != hitpairs.end(); ihitpair++) {
298  const std::vector<TrajectorySeed>& sds = createSeed((*ihitpair),eSetup);
299  LogTrace(category)<<"created seeds from rechit "<<sds.size();
300  results.insert(results.end(),sds.begin(),sds.end());
301  if ( results.size() >= theMaxSeeds ) break;
302  }
303  return;
304 }
305 
306 
307 std::vector<TrajectorySeed> CosmicMuonSeedGenerator::createSeed(const MuonRecHitPointer& hit, const edm::EventSetup& eSetup) const {
308 
309  std::vector<TrajectorySeed> result;
310 
311  const std::string category = "Muon|RecoMuon|CosmicMuonSeedGenerator";
312 
313  MuonPatternRecoDumper dumper;
314 
315  // set the pt by hand
316  double pt = 10.0;
317 
318  // AlgebraicVector4 t;
319  AlgebraicSymMatrix mat(5,0);
320 
321  // Fill the LocalTrajectoryParameters
322  LocalPoint segPos=hit->localPosition();
323 
325  hit->globalDirection().phi(),
326  1.));
327  // Force all track downward for cosmic, not beam-halo
328  if(theForcePointDownFlag){
329  if (hit->geographicalId().subdetId() == MuonSubdetId::DT && fabs(hit->globalDirection().eta()) < 4.0 && hit->globalDirection().phi() > 0 )
330  polar = - polar;
331 
332  if (hit->geographicalId().subdetId() == MuonSubdetId::CSC && fabs(hit->globalDirection().eta()) > 2.3 )
333  polar = - polar;
334  }
335 
336  polar *=fabs(pt)/polar.perp();
337 
338  LocalVector segDir =hit->det()->toLocal(polar);
339 
340  int charge= 1;
341  LocalTrajectoryParameters param(segPos,segDir, charge);
342 
343  charge= -1;
344  LocalTrajectoryParameters param2(segPos,segDir, charge);
345 
346  mat = hit->parametersError().similarityT( hit->projectionMatrix() );
347 
348  float p_err = 0.2;
349  mat[0][0]= p_err;
350 
351  LocalTrajectoryError error(asSMatrix<5>(mat));
352 
353  // Create the TrajectoryStateOnSurface
354  TrajectoryStateOnSurface tsos(param, error, hit->det()->surface(), &*theField);
355  TrajectoryStateOnSurface tsos2(param2, error, hit->det()->surface(), &*theField);
356 
357  LogTrace(category)<<"Trajectory State on Surface of Seed";
358  LogTrace(category)<<"mom: "<<tsos.globalMomentum()<<" phi: "<<tsos.globalMomentum().phi();
359  LogTrace(category)<<"pos: " << tsos.globalPosition();
360  LogTrace(category) << "The RecSegment relies on: ";
361  LogTrace(category) << dumper.dumpMuonId(hit->geographicalId());
362 
364  container.push_back(hit->hit()->clone());
365 
366  result.push_back( tsosToSeed(tsos, hit->geographicalId().rawId(), container) );
367  result.push_back( tsosToSeed(tsos2, hit->geographicalId().rawId(), container) );
368 
369  return result;
370 }
371 
373  bool result = false;
374 
375  GlobalVector dir1 = lhs->globalDirection();
376  GlobalPoint pos1 = lhs->globalPosition();
378  GlobalPoint pos2 = rhs->globalPosition();
379 
380  GlobalVector dis = pos2 - pos1;
381 
382  if ( (deltaR<double>(dir1.eta(), dir1.phi(), dir2.eta(), dir2.phi()) < 0.1 || deltaR<double>(dir1.eta(), dir1.phi(), -dir2.eta(), -dir2.phi()) < 0.1 )
383  && dis.mag() < 5.0 )
384  result = true;
385 
386  if ( (deltaR<double>(dir1.eta(), dir1.phi(), dir2.eta(), dir2.phi()) < 0.1 || deltaR<double>(dir1.eta(), dir1.phi(), -dir2.eta(), -dir2.phi()) < 0.1 ) &&
387  (deltaR<double>(dir1.eta(), dir1.phi(), dis.eta(), dis.phi()) < 0.1 || deltaR<double>(dir2.eta(), dir2.phi(), dis.eta(), dis.phi()) < 0.1 ) )
388  result = true;
389 
390  if ( fabs(dir1.eta()) > 4.0 || fabs(dir2.eta()) > 4.0 ) {
391  if ( (fabs(dir1.theta() - dir2.theta()) < 0.07 ||
392  fabs(dir1.theta() + dir2.theta()) > 3.07 ) &&
393  (fabs(dir1.theta() - dis.theta()) < 0.07 ||
394  fabs(dir1.theta() - dis.theta()) < 0.07 ||
395  fabs(dir1.theta() + dis.theta()) > 3.07 ||
396  fabs(dir1.theta() + dis.theta()) > 3.07 ) )
397 
398  result = true;
399  }
400 
401  return result;
402 }
403 
406 
407  if ( (lhs->degreesOfFreedom() > rhs->degreesOfFreedom() ) ||
408  ( (lhs->degreesOfFreedom() == rhs->degreesOfFreedom() ) &&
409  (lhs)->chi2() < (rhs)->chi2() ) ) return true;
410  else return false;
411 
412 }
413 
414 
417 
419  const std::string category = "Muon|RecoMuon|CosmicMuonSeedGenerator";
420 
421  if (hits1.empty() || hits2.empty() ) return result;
422 
423  for (MuonRecHitContainer::const_iterator ihit1 = hits1.begin(); ihit1 != hits1.end(); ihit1++) {
424  if ( !checkQuality(*ihit1) ) continue;
425 
426  for (MuonRecHitContainer::const_iterator ihit2 = hits2.begin(); ihit2 != hits2.end(); ihit2++) {
427  if ( !checkQuality(*ihit2) ) continue;
428 
429  float dphi = deltaPhi((*ihit1)->globalPosition().phi(), (*ihit2)->globalPosition().phi());
430  if ( dphi < 0.5 ) {
431  if ((*ihit1)->globalPosition().y() > 0.0 && ( (*ihit1)->globalPosition().y() > (*ihit2)->globalPosition().y() ) ) {
432  std::string tag2 = "top"+tag;
433 
434  result.push_back(MuonRecHitPair(*ihit1, *ihit2, tag2));
435  } else if ((*ihit1)->globalPosition().y() < 0.0 && ( (*ihit1)->globalPosition().y() < (*ihit2)->globalPosition().y() ) ) {
436  std::string tag2 = "bottom"+tag;
437  result.push_back(MuonRecHitPair(*ihit2, *ihit1, tag2));
438 
439  }
440  }
441  }
442  }
443 
444  return result;
445 }
446 
448  const edm::EventSetup& eSetup) const {
449  std::vector<TrajectorySeed> result;
450 
451  const std::string category = "Muon|RecoMuon|CosmicMuonSeedGenerator";
452 
453  MuonPatternRecoDumper dumper;
454 
455  float dphi = deltaPhi((hitpair.first)->globalDirection().phi(), (hitpair.second)->globalDirection().phi());
456 
457  LogTrace(category)<<"hitpair.type "<<hitpair.type;
458 
459  map<string, float>::const_iterator iterPar = theParameters.find(hitpair.type);
460  if ( iterPar == theParameters.end() ) {
461  return result;
462  }
463 
464  // set the pt and charge by dphi
465  int charge = (dphi > 0) ? -1 : 1;
466 
467  double pt = 999.0;
468  float paraC = (iterPar->second);
469 
470  if (fabs(dphi) > 1e-5) {
471  pt = paraC/fabs(dphi);
472  }
473 
474  if (pt < 10.0 ) { return result; } //still use the old strategy for low pt
475 
476  AlgebraicVector t(4);
477  AlgebraicSymMatrix mat(5,0) ;
478 
480  if ( hit->dimension() < (hitpair.second)->dimension() ) hit = hitpair.second;
481 
482  // Fill the LocalTrajectoryParameters
483  LocalPoint segPos=hit->localPosition();
484 
486  hit->globalDirection().phi(),
487  1.));
488  // Force all track downward for cosmic, not beam-halo
489  if(theForcePointDownFlag){
490  if (hit->geographicalId().subdetId() == MuonSubdetId::DT && fabs(hit->globalDirection().eta()) < 4.0 && hit->globalDirection().phi() > 0 )
491  polar = - polar;
492 
493  if (hit->geographicalId().subdetId() == MuonSubdetId::CSC && fabs(hit->globalDirection().eta()) > 2.3 )
494  polar = - polar;
495  }
496 
497  polar *=fabs(pt)/polar.perp();
498 
499  LocalVector segDir =hit->det()->toLocal(polar);
500 
501  LocalTrajectoryParameters param(segPos,segDir, charge);
502 
503  mat = hit->parametersError().similarityT( hit->projectionMatrix() );
504 
505  float p_err = 0.004/paraC;
506  if (pt < 10.01) p_err = 0.1;
507  mat[0][0]= p_err;
508 
509  LocalTrajectoryError error(asSMatrix<5>(mat));
510 
511  // Create the TrajectoryStateOnSurface
512  TrajectoryStateOnSurface tsos(param, error, hit->det()->surface(), &*theField);
513 
514  LogTrace(category)<<"Trajectory State on Surface of Seed";
515  LogTrace(category)<<"mom: "<<tsos.globalMomentum()<<" phi: "<<tsos.globalMomentum().phi();
516  LogTrace(category)<<"pos: " << tsos.globalPosition();
517  LogTrace(category) << "The RecSegment relies on: ";
518  LogTrace(category) << dumper.dumpMuonId(hit->geographicalId());
519 
521  container.push_back(hitpair.first->hit()->clone());
522  container.push_back(hitpair.second->hit()->clone());
523 
524  result.push_back( tsosToSeed(tsos, hit->geographicalId().rawId(), container) );
525 
526  return result;
527 }
528 
530 
532  return tsosToSeed(tsos, id, container);
533 }
534 
536 
538  TrajectorySeed seed(seedTSOS,container,alongMomentum);
539  return seed;
540 }
virtual int degreesOfFreedom() const
Degrees of freedom for segments, else 0.
T getParameter(std::string const &) const
tuple t
Definition: tree.py:139
bool isCSC() const
if this rec hit is a CSC rec hit
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:186
T perp() const
Definition: PV3DBase.h:72
MuonTransientTrackingRecHit::MuonRecHitContainer selectSegments(const MuonTransientTrackingRecHit::MuonRecHitContainer &) const
select seed candidates from Segments in Event
MuonTransientTrackingRecHit::MuonRecHitPointer MuonRecHitPointer
virtual double chi2() const
Chi square of the fit for segments, else 0.
virtual const TrackingRecHit * hit() const
virtual GlobalVector globalDirection() const
Direction in 3D for segments, otherwise (0,0,0)
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
PTrajectoryStateOnDet persistentState(const TrajectoryStateOnSurface &ts, unsigned int detid)
virtual LocalPoint localPosition() const override
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
Definition: GeomDet.h:67
virtual AlgebraicMatrix projectionMatrix() const
MuonTransientTrackingRecHit::MuonRecHitPointer first
bool isDT() const
if this rec hit is a DT rec hit
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:40
std::string dumpMuonId(const DetId &id) const
Geom::Theta< T > theta() const
Definition: PV3DBase.h:75
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
void push_back(D *&d)
Definition: OwnVector.h:280
bool areCorrelated(const MuonTransientTrackingRecHit::MuonRecHitPointer &, const MuonTransientTrackingRecHit::MuonRecHitPointer &) const
check if two rechits are correlated
static const int CSC
Definition: MuonSubdetId.h:13
T mag() const
Definition: PV3DBase.h:67
std::vector< TrajectorySeed > TrajectorySeedCollection
const GeomDet * det() const
tuple result
Definition: query.py:137
bool leftIsBetter(const MuonTransientTrackingRecHit::MuonRecHitPointer &, const MuonTransientTrackingRecHit::MuonRecHitPointer &) const
compare quality of two rechits
std::vector< TrajectorySeed > createSeed(const MuonTransientTrackingRecHit::MuonRecHitPointer &, const edm::EventSetup &) const
create TrajectorySeed from MuonTransientTrackingRecHit
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
#define LogTrace(id)
virtual TrackingRecHit * clone() const =0
std::vector< MuonRecHitPair > MuonRecHitPairVector
CLHEP::HepVector AlgebraicVector
bool checkQuality(const MuonTransientTrackingRecHit::MuonRecHitPointer &) const
determine if a MuonTransientTrackingRecHit is qualified to build seed
const T & get() const
Definition: EventSetup.h:55
bool isValid() const
MuonTransientTrackingRecHit::MuonRecHitPointer second
T eta() const
Definition: PV3DBase.h:76
virtual AlgebraicSymMatrix parametersError() const override
CLHEP::HepSymMatrix AlgebraicSymMatrix
MuonTransientTrackingRecHit::MuonRecHitContainer MuonRecHitContainer
static const int DT
Definition: MuonSubdetId.h:12
virtual void produce(edm::Event &, const edm::EventSetup &) override
reconstruct muon&#39;s seeds
DetId geographicalId() const
std::vector< MuonRecHitPair > makeSegPairs(const MuonTransientTrackingRecHit::MuonRecHitContainer &, const MuonTransientTrackingRecHit::MuonRecHitContainer &, std::string) const
TrajectorySeed tsosToSeed(const TrajectoryStateOnSurface &, uint32_t) const
uint32_t dimension(pat::CandKinResolution::Parametrization parametrization)
Returns the number of free parameters in a parametrization (3 or 4)
void createSeeds(TrajectorySeedCollection &results, const MuonTransientTrackingRecHit::MuonRecHitContainer &hits, const edm::EventSetup &eSetup) const
generate TrajectorySeeds and put them into results
std::vector< MuonRecHitPointer > MuonRecHitContainer
CosmicMuonSeedGenerator(const edm::ParameterSet &)
Constructor.
virtual GlobalPoint globalPosition() const
virtual ~CosmicMuonSeedGenerator()
Destructor.