CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DynamicTruncation.cc
Go to the documentation of this file.
1 
28 
29 #define MAX_THR 1e7
30 
31 using namespace edm;
32 using namespace std;
33 using namespace reco;
34 
35 
36 
38  propagator = theService.propagator("SmartPropagatorAny");
39  propagatorPF = theService.propagator("SmartPropagatorAny");
40  propagatorCompatibleDet = theService.propagator("SmartPropagatorAny");
41  theG = theService.trackingGeometry();
42  theService.eventSetup().get<TransientRecHitRecord>().get("MuonRecHitBuilder",theMuonRecHitBuilder);
43  theService.eventSetup().get<TrackingComponentsRecord>().get("KFUpdator",updatorHandle);
44  theService.eventSetup().get<MuonGeometryRecord>().get(cscGeom);
45  theService.eventSetup().get<MuonRecoGeometryRecord>().get(navMuon);
46  theService.eventSetup().get<IdealMagneticFieldRecord>().get(magfield);
47  navigation = new DirectMuonNavigation(theService.detLayerGeometry());
48  getSegs = new ChamberSegmentUtility();
49  thrManager = new ThrParameters(&theService.eventSetup());
50  useDBforThr = thrManager->isValidThdDB();
51  if (useDBforThr) dytThresholds = thrManager->getInitialThresholds();
52  doUpdateOfKFStates = true;
53 }
54 
56  delete navigation;
57  delete thrManager;
58  delete getSegs;
59 }
60 
62  TrajectoryStateOnSurface temp = updatorHandle->update(tsos, *rechit);
63  if (temp.isValid()) tsos = updatorHandle->update(tsos, *rechit);
64 }
65 
67  ConstRecHitContainer tmprecHits;
68  vector<const TrackingRecHit*> DTrh = bestDTSeg.recHits();
69  for (vector<const TrackingRecHit*>::iterator it = DTrh.begin(); it != DTrh.end(); it++) {
70  tmprecHits.push_back(theMuonRecHitBuilder->build(*it));
71  }
72  sort(tmprecHits);
73  for (ConstRecHitContainer::const_iterator it = tmprecHits.begin(); it != tmprecHits.end(); ++it) {
74  DTLayerId layid((*it)->det()->geographicalId());
75  TrajectoryStateOnSurface temp = propagator->propagate(tsos, theG->idToDet(layid)->surface());
76  if (temp.isValid()) tsos = updatorHandle->update(temp, **it);
77  }
78 }
79 
81  ConstRecHitContainer tmprecHits;
82  vector<CSCRecHit2D> CSCrh = bestCSCSeg.specificRecHits();
83  for (vector<CSCRecHit2D>::iterator it = CSCrh.begin(); it != CSCrh.end(); ++it) {
84  tmprecHits.push_back(theMuonRecHitBuilder->build(&*it));
85  }
86  sort(tmprecHits);
87  for (ConstRecHitContainer::const_iterator it = tmprecHits.begin(); it != tmprecHits.end(); ++it) {
88  const CSCLayer* cscLayer = cscGeom->layer((*it)->det()->geographicalId());
89  TrajectoryStateOnSurface temp = propagator->propagate(tsos, cscLayer->surface());
90  if (temp.isValid()) tsos = updatorHandle->update(temp, **it);
91  }
92 }
93 
94 
98 void DynamicTruncation::setSelector(int selector) {
99  if (selector < 0 || selector > 2) throw cms::Exception("NotAvailable") << "DYT selector: wrong option!" << endl;
100  //if (selector == 0) cout << "[DYT disabled]\n";
101  //if (selector == 1) cout << "[use all compatible stations]\n";
102  //if (selector == 2) cout << "[stop at second consecutive incompatible station]\n";
103  DYTselector = selector;
104 
105 }
106 
107 void DynamicTruncation::setUseAPE(bool useAPE_) {
108  useAPE = useAPE_;
109 }
110 
112  doUpdateOfKFStates = upState;
113 }
114 
115 void DynamicTruncation::setThr(const vector<int>& thr) {
116  if (thr.size() == 2) {
117  for (unsigned int i = 0; i < thr.size(); i++)
118  if (thr[i] >= 0) Thrs.push_back(thr[i]);
119  else Thrs.push_back(MAX_THR);
120  return;
121  }
122  throw cms::Exception("NotAvailable") << "WARNING: wrong size for the threshold vector!\nExpected size: 2\n Found size: " << thr.size();
123 }
127 
128 
129 
130 //===> filter
132  result.clear();
133  prelFitMeas.clear();
134 
135  // Get APE maps
136  dtApeMap = thrManager->GetDTApeMap();
137  cscApeMap = thrManager->GetCSCApeMap();
138 
139  // Get Last tracker TSOS (updated)
140  vector<TrajectoryMeasurement> muonMeasurements = traj.measurements();
141  TrajectoryMeasurement lastTKm = muonMeasurements.front();
142  for (vector<TrajectoryMeasurement>::const_iterator imT = muonMeasurements.begin(); imT != muonMeasurements.end(); imT++ ) {
143  if ( !(*imT).recHit()->isValid() ) continue;
144  const TransientTrackingRecHit* hit = &(*(*imT).recHit());
145  if (hit->geographicalId().det() == DetId::Tracker) {
146  result.push_back((*imT).recHit());
147  if (!(*imT).forwardPredictedState().isValid()) continue;
148  if ((*imT).forwardPredictedState().globalPosition().mag() >
149  lastTKm.forwardPredictedState().globalPosition().mag()) lastTKm = *imT;
150  }
151  }
152  currentState = lastTKm.forwardPredictedState();
153  update(currentState, lastTKm.recHit());
154 
155  prelFitState = lastTKm.forwardPredictedState();
156  update(prelFitState, lastTKm.recHit());
157  prelFitMeas = result;
158 
159  // Run the DYT
160  filteringAlgo();
161 
162  return result;
163 }
164 
165 
166 //===> filteringAlgo
168  map<int, vector<DetId> > compatibleIds;
169  map<int, vector<DTRecSegment4D> > dtSegMap;
170  map<int, vector<CSCSegment> > cscSegMap;
171  int incompConLay = 0;
172  nStationsUsed = 0;
173 
174  // Get list of compatible layers
175  compatibleDets(currentState, compatibleIds);
176 
177  // Fill segment maps
178  fillSegmentMaps(compatibleIds, dtSegMap, cscSegMap);
179 
180  // Do a preliminary fit
181  if (useDBforThr) preliminaryFit(compatibleIds, dtSegMap, cscSegMap);
182 
183  // Loop on compatible layers
184  for (map<int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
185  int stLayer = stationfromDet(it->second.front());
186  DTRecSegment4D bestDTSeg;
187  CSCSegment bestCSCSeg;
188  double bestDTEstimator = MAX_THR;
189  double bestCSCEstimator = MAX_THR;
190  vector<DTRecSegment4D> dtSegs = dtSegMap[it->first];
191  vector<CSCSegment> cscSegs = cscSegMap[it->first];
192 
193  // DT case: find the most compatible segment
194  TrajectoryStateOnSurface tsosDTlayer;
195  testDTstation(currentState, dtSegs, bestDTEstimator, bestDTSeg, tsosDTlayer);
196 
197  // CSC case: find the most compatible segment
198  TrajectoryStateOnSurface tsosCSClayer;
199  testCSCstation(currentState, cscSegs, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
200 
201  // Decide whether to keep the layer or not
202  bool chosenLayer = chooseLayers(incompConLay, bestDTEstimator, bestDTSeg, tsosDTlayer, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
203  fillDYTInfos(stLayer, chosenLayer, incompConLay, bestDTEstimator, bestCSCEstimator, bestDTSeg, bestCSCSeg);
204  }
205  //cout << "Number of used stations = " << nStationsUsed << endl;
206 }
207 
208 
209 //===> stationfromDet
211  if (det.subdetId() == MuonSubdetId::CSC) {
212  CSCDetId ch(det);
213  return ch.station();
214  }
215  if (det.subdetId() == MuonSubdetId::DT) {
216  DTChamberId ch(det);
217  return ch.station();
218  }
219  return 0;
220 }
221 
222 
223 //===> fillDYTInfos
224 void DynamicTruncation::fillDYTInfos(int const &st, bool const &chosenLayer, int &incompConLay,
225  double const &bestDTEstimator, double const &bestCSCEstimator,
226  DTRecSegment4D const &bestDTSeg, CSCSegment const &bestCSCSeg) {
227  if (chosenLayer) {
228  nStationsUsed++;
229  incompConLay = 0;
230  if (bestDTEstimator <= bestCSCEstimator) {
231  estimatorMap[st] = bestDTEstimator;
232  DetId id(bestDTSeg.chamberId());
233  idChamberMap[st] = id;
234  } else {
235  DetId id(bestCSCSeg.cscDetId());
236  idChamberMap[st] = id;
237  estimatorMap[st] = bestCSCEstimator;
238  }
239  usedStationMap[st] = true;
240  } else {
241  incompConLay++;
242  estimatorMap[st] = -1;
243  usedStationMap[st] = false;
244  }
245 }
246 
247 
248 //===> compatibleDets
249 void DynamicTruncation::compatibleDets(TrajectoryStateOnSurface &tsos, map<int, vector<DetId> > &detMap) {
250  MuonPatternRecoDumper dumper;
251  MeasurementEstimator *theEstimator = new Chi2MeasurementEstimator(1000, 1000);
252  vector<const DetLayer *> navLayers;
253  navLayers = navigation->compatibleLayers(*(currentState.freeState()), alongMomentum);
254  unsigned int ilayerCorrected = 0;
255  for ( unsigned int ilayer=0; ilayer<navLayers.size(); ilayer++ ) {
256  // Skip RPC layers
257  if (navLayers[ilayer]->subDetector() != GeomDetEnumerators::DT &&
258  navLayers[ilayer]->subDetector() != GeomDetEnumerators::CSC) continue;
259  ilayerCorrected++;
260  vector<DetLayer::DetWithState> comps = navLayers[ilayer]->compatibleDets(currentState, *propagatorCompatibleDet, *theEstimator);
261  //cout << comps.size() << " compatible Dets with " << navLayers[ilayer]->subDetector() << " Layer " << ilayer << " "
262  //<< dumper.dumpLayer(navLayers[ilayer]);
263  if (comps.size() > 0) {
264  for ( unsigned int icomp=0; icomp<comps.size(); icomp++ ) {
265  DetId id(comps[icomp].first->geographicalId().rawId());
266  detMap[ilayerCorrected].push_back(id);
267  }
268  }
269  }
270  if (theEstimator) delete theEstimator;
271 }
272 
273 
274 //===> fillSegmentMaps
275 void DynamicTruncation::fillSegmentMaps( map<int, vector<DetId> > &compatibleIds,
276  map<int, vector<DTRecSegment4D> > &dtSegMap,
277  map<int, vector<CSCSegment> > &cscSegMap) {
278  for (map<int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
279  vector<DetId> ids = compatibleIds[it->first];
280  for (unsigned j = 0; j < ids.size(); j++) {
281  if (ids[j].subdetId() == MuonSubdetId::CSC) {
282  CSCDetId ch(ids[j]);
283  vector<CSCSegment> tmp = getSegs->getCSCSegmentsInChamber(ch);
284  for (unsigned int k = 0; k < tmp.size(); k++) cscSegMap[it->first].push_back(tmp[k]);
285  }
286  if (ids[j].subdetId() == MuonSubdetId::DT) {
287  DTChamberId ch(ids[j]);
288  vector<DTRecSegment4D> tmp = getSegs->getDTSegmentsInChamber(ch);
289  for (unsigned int k = 0; k < tmp.size(); k++) dtSegMap[it->first].push_back(tmp[k]);
290  }
291  }
292  }
293 }
294 
295 
296 //===> testDTstation
297 void DynamicTruncation::testDTstation(TrajectoryStateOnSurface &startingState, vector<DTRecSegment4D> const &segments,
298  double &bestEstimator, DTRecSegment4D &bestSeg, TrajectoryStateOnSurface &tsosdt) {
299  if (segments.size() == 0) return;
300  for (unsigned int iSeg = 0; iSeg < segments.size(); iSeg++) {
301  DTChamberId chamber(segments[iSeg].chamberId());
302  if (!propagator->propagate(startingState, theG->idToDet(chamber)->surface()).isValid()) continue;
303  tsosdt = propagator->propagate(startingState, theG->idToDet(chamber)->surface());
304  //if (!tsosdt.isValid()) continue;
305  LocalError apeLoc;
306  if (useAPE) apeLoc = ErrorFrameTransformer().transform(dtApeMap.find(chamber)->second, theG->idToDet(chamber)->surface());
307  StateSegmentMatcher estim(tsosdt, segments[iSeg], apeLoc);
308  double estimator = estim.value();
309  //cout << "estimator DT = " << estimator << endl;
310  if (estimator >= bestEstimator) continue;
311  bestEstimator = estimator;
312  bestSeg = segments[iSeg];
313  }
314 }
315 
316 
317 //===> testCSCstation
318 void DynamicTruncation::testCSCstation(TrajectoryStateOnSurface &startingState, vector<CSCSegment> const &segments,
319  double &bestEstimator, CSCSegment &bestSeg, TrajectoryStateOnSurface &tsoscsc) {
320  if (segments.size() == 0) return;
321  for (unsigned int iSeg = 0; iSeg < segments.size(); iSeg++) {
322  CSCDetId chamber(segments[iSeg].cscDetId());
323  if (!propagator->propagate(startingState, theG->idToDet(chamber)->surface()).isValid()) continue;
324  tsoscsc = propagator->propagate(startingState, theG->idToDet(chamber)->surface());
325  //if (!tsoscsc.isValid()) continue;
326  LocalError apeLoc;
327  if (useAPE) apeLoc = ErrorFrameTransformer().transform(cscApeMap.find(chamber)->second, theG->idToDet(chamber)->surface());
328  StateSegmentMatcher estim(tsoscsc, segments[iSeg], apeLoc);
329  double estimator = estim.value();
330  //cout << "estimator CSC = " << estimator << endl;
331  if (estimator >= bestEstimator) continue;
332  bestEstimator = estimator;
333  bestSeg = segments[iSeg];
334  }
335 }
336 
337 
338 //===> useSegment
340  result.push_back(theMuonRecHitBuilder->build(&bestDTSeg));
341  if (doUpdateOfKFStates) updateWithDThits(currentState, bestDTSeg);
342  else currentState = tsosDT;
343 }
344 
345 
346 //===> useSegment
347 void DynamicTruncation::useSegment(CSCSegment const &bestCSCSeg, TrajectoryStateOnSurface const &tsosCSC) {
348  result.push_back(theMuonRecHitBuilder->build(&bestCSCSeg));
349  if (doUpdateOfKFStates) updateWithCSChits(currentState, bestCSCSeg);
350  else currentState = tsosCSC;
351 }
352 
353 
354 //===> preliminaryFit
355 void DynamicTruncation::preliminaryFit(map<int, vector<DetId> > compatibleIds, map<int, vector<DTRecSegment4D> > dtSegMap,
356  map<int, vector<CSCSegment> > cscSegMap) {
357  for (map<int, vector<DetId> >::iterator it=compatibleIds.begin(); it!=compatibleIds.end(); ++it) {
358  DTRecSegment4D bestDTSeg;
359  CSCSegment bestCSCSeg;
360  double bestDTEstimator = MAX_THR;
361  double bestCSCEstimator = MAX_THR;
362  double initThr = MAX_THR;
363  vector<DTRecSegment4D> dtSegs = dtSegMap[it->first];
364  vector<CSCSegment> cscSegs = cscSegMap[it->first];
365 
366  // DT case: find the most compatible segment
367  TrajectoryStateOnSurface tsosDTlayer;
368  testDTstation(prelFitState, dtSegs, bestDTEstimator, bestDTSeg, tsosDTlayer);
369 
370  // CSC case: find the most compatible segment
371  TrajectoryStateOnSurface tsosCSClayer;
372  testCSCstation(prelFitState, cscSegs, bestCSCEstimator, bestCSCSeg, tsosCSClayer);
373 
374  // Decide whether to keep the layer or not
375  if (bestDTEstimator == MAX_THR && bestCSCEstimator == MAX_THR) continue;
376  if (bestDTEstimator <= bestCSCEstimator) {
377  getThresholdFromCFG(initThr, DetId(bestDTSeg.chamberId()));
378  if (bestDTEstimator >= initThr) continue;
379  prelFitMeas.push_back(theMuonRecHitBuilder->build(&bestDTSeg));
380  prelFitState = updatorHandle->update(tsosDTlayer, *theMuonRecHitBuilder->build(&bestDTSeg));
381  } else {
382  getThresholdFromCFG(initThr, DetId(bestCSCSeg.cscDetId()));
383  if (bestCSCEstimator >= initThr) continue;
384  prelFitMeas.push_back(theMuonRecHitBuilder->build(&bestCSCSeg));
385  prelFitState = updatorHandle->update(tsosCSClayer, *theMuonRecHitBuilder->build(&bestCSCSeg));
386  }
387  }
388  prelFitMeas.pop_back();
389  for (ConstRecHitContainer::const_iterator imrh = prelFitMeas.end(); imrh != prelFitMeas.begin(); imrh-- ) {
390  DetId id = (*imrh)->geographicalId();
391  TrajectoryStateOnSurface tmp = propagatorPF->propagate(prelFitState, theG->idToDet(id)->surface());
392  if (tmp.isValid()) prelFitState = tmp;
393  }
394  muonPTest = prelFitState.globalMomentum().perp();
395  muonETAest = prelFitState.globalMomentum().eta();
396 }
397 
398 
399 //===> chooseLayers
400 bool DynamicTruncation::chooseLayers(int &incompLayers, double const &bestDTEstimator, DTRecSegment4D const &bestDTSeg, TrajectoryStateOnSurface const &tsosDT,
401  double const &bestCSCEstimator, CSCSegment const &bestCSCSeg, TrajectoryStateOnSurface const &tsosCSC) {
402  double initThr = MAX_THR;
403  if (bestDTEstimator == MAX_THR && bestCSCEstimator == MAX_THR) return false;
404  if (bestDTEstimator <= bestCSCEstimator) {
405  // Get threshold for the chamber
406  if (useDBforThr) getThresholdFromDB(initThr, DetId(bestDTSeg.chamberId()));
407  else getThresholdFromCFG(initThr, DetId(bestDTSeg.chamberId()));
408  if (DYTselector == 0 || (DYTselector == 1 && bestDTEstimator < initThr) ||
409  (DYTselector == 2 && incompLayers < 2 && bestDTEstimator < initThr)) {
410  useSegment(bestDTSeg, tsosDT);
411  return true;
412  }
413  } else {
414  // Get threshold for the chamber
415  if (useDBforThr) getThresholdFromDB(initThr, DetId(bestCSCSeg.cscDetId()));
416  else getThresholdFromCFG(initThr, DetId(bestCSCSeg.cscDetId()));
417  if (DYTselector == 0 || (DYTselector == 1 && bestCSCEstimator < initThr) ||
418  (DYTselector == 2 && incompLayers < 2 && bestCSCEstimator < initThr)) {
419  useSegment(bestCSCSeg, tsosCSC);
420  return true;
421  }
422  }
423  return false;
424 }
425 
426 
427 //===> getThresholdFromDB
428 void DynamicTruncation::getThresholdFromDB(double& thr, DetId const& id) {
429  vector<DYTThrObject::DytThrStruct> thrvector = dytThresholds->thrsVec;
430  for (vector<DYTThrObject::DytThrStruct>::const_iterator it = thrvector.begin(); it != thrvector.end(); it++) {
432  if (obj.id == id) {
433  thr = obj.thr;
434  break;
435  }
436  }
437  correctThrByPtAndEta(thr);
438 }
439 
440 
441 //===> correctThrByPtAndEta
443 
445  // This section will be implemented //
446  // after the release of APEs //
448 
449 }
450 
451 
452 //===> getThresholdFromCFG
453 void DynamicTruncation::getThresholdFromCFG(double& thr, DetId const& id) {
454  if (id.subdetId() == MuonSubdetId::DT) {
455  thr = Thrs[0];
456  }
457  if (id.subdetId() == MuonSubdetId::CSC) {
458  thr = Thrs[1];
459  }
460 }
461 
462 
463 //===> sort
465  unsigned int i=0;
466  unsigned int j=0;
467  ConstRecHitContainer::size_type n = recHits.size();
468  for(i=1; i<n; ++i)
469  for(j=n-1; j>=i; --j)
470  if(recHits[j-1]->globalPosition().mag() > recHits[j]->globalPosition().mag()) swap (recHits[j-1],recHits[j]);
471 }
static GlobalError transform(const LocalError &le, const Surface &surf)
int i
Definition: DBlmapReader.cc:9
virtual std::vector< const TrackingRecHit * > recHits() const
Access to component RecHits (if any)
void compatibleDets(TrajectoryStateOnSurface &, std::map< int, std::vector< DetId > > &)
T perp() const
Definition: PV3DBase.h:72
ConstRecHitPointer const & recHit() const
void sort(ConstRecHitContainer &)
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
tuple magfield
Definition: HLT_ES_cff.py:2311
void fillSegmentMaps(std::map< int, std::vector< DetId > > &, std::map< int, std::vector< DTRecSegment4D > > &, std::map< int, std::vector< CSCSegment > > &)
void useSegment(DTRecSegment4D const &, TrajectoryStateOnSurface const &)
GlobalPoint globalPosition() const
void getThresholdFromDB(double &, DetId const &)
virtual DTChamberId chamberId() const
The (specific) DetId of the chamber on which the segment resides.
void updateWithCSChits(TrajectoryStateOnSurface &, CSCSegment const &)
void testDTstation(TrajectoryStateOnSurface &, std::vector< DTRecSegment4D > const &, double &, DTRecSegment4D &, TrajectoryStateOnSurface &)
uint16_t size_type
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:35
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:116
DataContainer const & measurements() const
Definition: Trajectory.h:203
void correctThrByPtAndEta(double &)
static const int CSC
Definition: MuonSubdetId.h:13
const SurfaceType & surface() const
T mag() const
Definition: PV3DBase.h:67
TransientTrackingRecHit::ConstRecHitContainer ConstRecHitContainer
void update(const LocalTrajectoryParameters &p, const SurfaceType &aSurface, const MagneticField *field, SurfaceSide side=SurfaceSideDefinition::atCenterOfSurface)
tuple result
Definition: query.py:137
int j
Definition: DBlmapReader.cc:9
void testCSCstation(TrajectoryStateOnSurface &, std::vector< CSCSegment > const &, double &, CSCSegment &, TrajectoryStateOnSurface &)
const bool isValidThdDB()
Definition: ThrParameters.h:25
TransientTrackingRecHit::ConstRecHitContainer filter(const Trajectory &)
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 MAX_THR
TrajectoryStateOnSurface const & forwardPredictedState() const
Access to forward predicted state (from fitter or builder)
std::vector< ConstRecHitPointer > ConstRecHitContainer
int k[5][pyjets_maxn]
void preliminaryFit(std::map< int, std::vector< DetId > >, std::map< int, std::vector< DTRecSegment4D > >, std::map< int, std::vector< CSCSegment > >)
Definition: DetId.h:18
DynamicTruncation(const edm::Event &, const MuonServiceProxy &)
void update(TrajectoryStateOnSurface &, ConstRecHitPointer)
void fillDYTInfos(int const &, bool const &, int &, double const &, double const &, DTRecSegment4D const &, CSCSegment const &)
TransientTrackingRecHit::ConstRecHitPointer ConstRecHitPointer
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
GlobalVector globalMomentum() const
#define update(a, b)
int station() const
Definition: CSCDetId.h:99
static const int DT
Definition: MuonSubdetId.h:12
bool chooseLayers(int &, double const &, DTRecSegment4D const &, TrajectoryStateOnSurface const &, double const &, CSCSegment const &, TrajectoryStateOnSurface const &)
int stationfromDet(DetId const &)
DetId geographicalId() const
int station() const
Return the station number.
Definition: DTChamberId.h:51
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
T first(std::pair< T, U > const &p)
void updateWithDThits(TrajectoryStateOnSurface &, DTRecSegment4D const &)
void setThr(const std::vector< int > &)
void getThresholdFromCFG(double &, DetId const &)