CMS 3D CMS Logo

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