CMS 3D CMS Logo

AngleConverterBase.cc
Go to the documentation of this file.
3 
6 
17 
18 #include <cmath>
19 
20 namespace {
21  template <typename T>
22  int sgn(T val) {
23  return (T(0) < val) - (val < T(0));
24  }
25 
26  int fixCscOffsetGeom(int offsetLoc) {
27  // fix for CSC geo dependence from GlobalTag
28 
29  // dump of CSC offsets for MC global tag
30  const std::vector<int> offCSC = {-154, -133, -17, -4, 4, 17, 133, 146, 154, 167, 283, 296, 304, 317,
31  433, 446, 454, 467, 583, 596, 604, 617, 733, 746, 754, 767, 883, 904};
32  auto gep = std::lower_bound(offCSC.begin(), offCSC.end(), offsetLoc);
33  int fixOff = (gep != offCSC.end()) ? *gep : *(gep - 1);
34  if (gep != offCSC.begin() && std::abs(*(gep - 1) - offsetLoc) < std::abs(fixOff - offsetLoc))
35  fixOff = *(gep - 1);
36  return fixOff;
37  }
38 
39 } // namespace
40 
41 AngleConverterBase::AngleConverterBase() : _geom_cache_id(0ULL) {}
49  const MuonGeometryTokens& muonGeometryTokens) {
51  _georpc = es.getHandle(muonGeometryTokens.rpcGeometryEsToken);
52  _geocsc = es.getHandle(muonGeometryTokens.cscGeometryEsToken);
53  _geodt = es.getHandle(muonGeometryTokens.dtGeometryEsToken);
54  }
55  this->config = config;
56  nPhiBins = config->nPhiBins();
57 }
60 int AngleConverterBase::getProcessorPhi(int phiZero, l1t::tftype part, int dtScNum, int dtPhi) const {
61  int dtPhiBins = 4096;
62 
63  double hsPhiPitch = 2 * M_PI / nPhiBins; // width of phi Pitch, related to halfStrip at CSC station 2
64 
65  int sector = dtScNum + 1; //NOTE: there is a inconsistency in DT sector numb. Thus +1 needed to get detector numb.
66 
67  double scale = 1. / dtPhiBins / hsPhiPitch;
68  int scale_coeff = lround(scale * pow(2, 11)); // 216.2688
69 
70  int ichamber = sector - 1;
71  if (ichamber > 6)
72  ichamber = ichamber - 12;
73 
74  int offsetGlobal = (int)nPhiBins * ichamber / 12;
75 
76  int phiConverted = floor(dtPhi * scale_coeff / pow(2, 11)) + offsetGlobal - phiZero;
77 
78  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" phiZero "<<phiZero<<" phiDT "<<phiDT<<" sector "<<sector<<" ichamber "<<ichamber<<" offsetGlobal "<<offsetGlobal<<" phi "<<phi<<" foldPhi(phi) "<<omtfConfig->foldPhi(phi)<<std::endl;
79  return config->foldPhi(phiConverted);
80 }
84  int phiZero, l1t::tftype part, const CSCDetId& csc, const CSCCorrelatedLCTDigi& digi, unsigned int iInput) const {
85  const double hsPhiPitch = 2 * M_PI / nPhiBins;
86  //
87  // get offset for each chamber.
88  // FIXME: These parameters depends on processor and chamber only so may be precomputed and put in map
89  //
90 
91  int halfStrip = digi.getStrip(); // returns halfStrip 0..159
92 
94 
95  //in the PhaseIITDRSpring19DR dataset (generated with CMSSW_10_6_1_patch2?), in case of the ME1/1 ring 4 (higher eta) the detId in the CSCCorrelatedLCTDigiCollection is ME1/1 ring 1 (instead ME1/1/4 as it was before),
96  //and the digi.getStrip() is increased by 2*64 (i.e. number of half strips in the chamber roll)
97  if (csc.station() == 1 && csc.ring() == 1 && halfStrip > 128) {
98  CSCDetId cscME11 = CSCDetId(csc.endcap(), csc.station(), 4, csc.chamber()); //changing ring to 4
99  chamber = _geocsc->chamber(cscME11);
100  }
101 
102  const CSCChamberSpecs* cspec = chamber->specs();
103  const CSCLayer* layer = chamber->layer(3);
104  int order = (layer->centerOfStrip(2).phi() - layer->centerOfStrip(1).phi() > 0) ? 1 : -1;
105  double stripPhiPitch = cspec->stripPhiPitch();
106  double scale = std::abs(stripPhiPitch / hsPhiPitch / 2.);
107  if (std::abs(scale - 1.) < 0.0002)
108  scale = 1.;
109 
110  double phiHalfStrip0 = layer->centerOfStrip(1).phi() - order * stripPhiPitch / 4.;
111 
112  int offsetLoc = lround((phiHalfStrip0) / hsPhiPitch - phiZero);
113  offsetLoc = config->foldPhi(offsetLoc);
114 
115  if (csc.station() == 1 && csc.ring() == 1 && halfStrip > 128) { //ME1/1/
116  /* if(cspec->nStrips() != 64)
117  edm::LogImportant("l1tOmtfEventPrint") <<__FUNCTION__<<":"<<__LINE__<<" cspec->nStrips() != 64 in case of the ME1/1, phi of the muon stub will be not correct. chamber "
118  <<csc<<" cspec->nStrips() "<<cspec->nStrips()<<std::endl;
119  this checks has no sense - the ME1/1/ ring 4 has cspec->nStrips() = 48. but the offset of 128 half strips in the digi.getStrip() looks to be good*/
120  halfStrip -= 128;
121  }
122 
123  //FIXME: to be checked (only important for ME1/3) keep more bits for offset, truncate at the end
124 
125  int fixOff = offsetLoc;
126  // a quick fix for towards geometry changes due to global tag.
127  // in case of MC tag fixOff should be identical to offsetLoc
128 
129  if (config->getFixCscGeometryOffset()) {
130  if (config->nProcessors() == 6) //phase1
131  fixOff = fixCscOffsetGeom(offsetLoc); //TODO does not work in when phiZero is always 0. Fix this
132  else if (config->nProcessors() == 3) { //phase2
133  //TODO fix this bricolage!!!!!!!!!!!!!!
134  if (iInput >= 14)
135  fixOff = fixCscOffsetGeom(offsetLoc - 900) + 900;
136  else
137  fixOff = fixCscOffsetGeom(offsetLoc);
138  }
139  }
140  int phi = fixOff + order * scale * halfStrip;
141  //the phi conversion is done like above - and not simply converting the layer->centerOfStrip(halfStrip/2 +1).phi() - to mimic this what is done by the firmware,
142  //where phi of the stub is calculated with use of the offset and scale provided by an register
143 
144  /*//debug
145  auto localPoint = layer->toLocal(layer->centerOfStrip(halfStrip));
146  LogTrace("l1tOmtfEventPrint") << __FUNCTION__ << ":" << 147 << " csc: " <<csc.rawId()<<" "<< csc<<" layer "<<layer->id()<<" "<<layer->id().rawId()
147  << " halfStrip "<<halfStrip<<" phiGlobal " << layer->centerOfStrip(halfStrip).phi()<<" local phi "<<localPoint.phi()<<" x "<<localPoint.x()<<" y "<<localPoint.y() <<std::endl;
148  */
149 
150  /*//debug
151  auto radToDeg = [](double rad) { return (180. / M_PI * rad); };
152  LogTrace("l1tOmtfEventPrint") <<__FUNCTION__<<":"<<__LINE__<<" "<<std::setw(16)<<csc<<" phiZero "<<phiZero<<" hs: "<<std::setw(3)<< halfStrip <<" phiHalfStrip0 "<<std::setw(10)<<radToDeg(phiHalfStrip0)<<" offset: " << offsetLoc
153  <<" oder*scale: "<<std::setw(10)<< order*scale
154  <<" phi: " <<phi<<" foldPhi(phi) "<<config->foldPhi(phi)<<" ("<<offsetLoc + order*scale*halfStrip<<")"<<" centerOfStrip "<<std::setw(10)<< radToDeg( layer->centerOfStrip(halfStrip/2 +1).phi() )
155  <<" centerOfStrip/hsPhiPitch "<< ( (layer->centerOfStrip(halfStrip/2 + 1).phi() )/hsPhiPitch)<<" hsPhiPitch "<<hsPhiPitch
156  //<<" phiSpan.f "<<layer->geometry()->phiSpan().first<<" phiSpan.s "<<layer->geometry()->phiSpan().second
157  <<" nStrips "<<cspec->nStrips()
158  //<<" strip 1 "<<radToDeg( layer->centerOfStrip(1).phi() )<<" strip last "<<radToDeg( layer->centerOfStrip(cspec->nStrips()).phi() )
159  << std::endl;*/
160 
161  return config->foldPhi(phi);
162 }
163 
167  int phiZero, l1t::tftype part, const RPCDetId& rollId, const unsigned int& digi1, const unsigned int& digi2) const {
168  const double hsPhiPitch = 2 * M_PI / nPhiBins;
169  const int dummy = nPhiBins;
170  const RPCRoll* roll = _georpc->roll(rollId);
171  if (!roll)
172  return dummy;
173 
174  double stripPhi1 = (roll->toGlobal(roll->centreOfStrip((int)digi1))).phi(); // note [-pi,pi]
175  double stripPhi2 = (roll->toGlobal(roll->centreOfStrip((int)digi2))).phi(); // note [-pi,pi]
176 
177  // the case when the two strips are on different sides of phi = pi
178  if (std::signbit(stripPhi1) != std::signbit(stripPhi2) && std::abs(stripPhi1) > M_PI / 2.) {
179  if (std::signbit(stripPhi1)) { //stripPhi1 is negative
180  stripPhi1 += 2 * M_PI;
181  } else //stripPhi2 is negative
182  stripPhi2 += 2 * M_PI;
183  }
184  int halfStrip = lround(((stripPhi1 + stripPhi2) / 2.) / hsPhiPitch);
185  halfStrip = config->foldPhi(halfStrip); //only for the case when the two strips are on different sides of phi = pi
186 
187  LogTrace("l1tOmtfEventPrint") << __FUNCTION__ << ":" << 185 << " roll " << rollId.rawId() << " " << rollId
188  << " cluster: firstStrip " << digi1 << " stripPhi1Global " << stripPhi1
189  << " stripPhi1LocalPhi " << roll->centreOfStrip((int)digi1).x() << " y "
190  << roll->centreOfStrip((int)digi1).y() << " lastStrip " << digi2 << " stripPhi2Global "
191  << stripPhi2 << " stripPhi2LocalPhi x " << roll->centreOfStrip((int)digi2).x() << " y "
192  << roll->centreOfStrip((int)digi2).y() << " halfStrip " << halfStrip << std::endl;
193 
194  return config->foldPhi(halfStrip - phiZero);
195 }
196 
197 int AngleConverterBase::getProcessorPhi(unsigned int iProcessor,
199  const RPCDetId& rollId,
200  const unsigned int& digi) const {
201  const double hsPhiPitch = 2 * M_PI / nPhiBins;
202  const int dummy = nPhiBins;
203  int processor = iProcessor + 1;
204  const RPCRoll* roll = _georpc->roll(rollId);
205  if (!roll)
206  return dummy;
207 
208  double phi15deg = M_PI / 3. * (processor - 1) + M_PI / 12.;
209  // "0" is 15degree moved cyclically to each processor, note [0,2pi]
210 
211  double stripPhi = (roll->toGlobal(roll->centreOfStrip((int)digi))).phi(); // note [-pi,pi]
212 
213  // adjust [0,2pi] and [-pi,pi] to get deltaPhi difference properly
214  switch (processor) {
215  case 1:
216  break;
217  case 6: {
218  phi15deg -= 2 * M_PI;
219  break;
220  }
221  default: {
222  if (stripPhi < 0)
223  stripPhi += 2 * M_PI;
224  break;
225  }
226  }
227 
228  // local angle in CSC halfStrip usnits
229  int halfStrip = lround((stripPhi - phi15deg) / hsPhiPitch);
230 
231  return halfStrip;
232 }
236  Local2DPoint chamberMiddleLP(0, 0);
237  GlobalPoint chamberMiddleGP = _geodt->chamber(detId)->toGlobal(chamberMiddleLP);
238 
239  const DTChamberId baseidNeigh(detId.wheel() + (detId.wheel() >= 0 ? -1 : +1), detId.station(), detId.sector());
240  GlobalPoint chambNeighMiddleGP = _geodt->chamber(baseidNeigh)->toGlobal(chamberMiddleLP);
241 
242  EtaValue etaValue = {
243  config->etaToHwEta(chamberMiddleGP.eta()),
244  config->etaToHwEta(std::abs(chamberMiddleGP.eta() - chambNeighMiddleGP.eta())) / 2,
245  0, //quality
246  0, //bx
247  0 //timin
248  };
249 
250  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rawid "<<detId.rawId()<<" baseid "<<detId<<" chamberMiddleGP.eta() "<<chamberMiddleGP.eta()<<" eta "<<etaValue.eta<<" etaSigma "<<etaValue.etaSigma<<std::endl;
251  return etaValue;
252 }
253 
256 void AngleConverterBase::getGlobalEta(const L1MuDTChambThDigi& thetaDigi, std::vector<EtaValue>& etaSegments) const {
257  const DTChamberId baseid(thetaDigi.whNum(), thetaDigi.stNum(), thetaDigi.scNum() + 1);
258  DTTrigGeom trig_geom(_geodt->chamber(baseid), false);
259 
260  // super layer 2 is the theta superlayer in a DT chamber
261  // station 4 does not have a theta super layer
262  // the BTI index from the theta trigger is an OR of some BTI outputs
263  // so, we choose the BTI that's in the middle of the group
264  // as the BTI that we get theta from
265  // TODO:::::>>> need to make sure this ordering doesn't flip under wheel sign
266  const int NBTI_theta = trig_geom.nCell(2);
267  for (unsigned int btiGroup = 0; btiGroup < 7; ++btiGroup) {
268  if (thetaDigi.position(btiGroup)) {
269  unsigned btiActual = btiGroup * NBTI_theta / 7 + NBTI_theta / 14 + 1;
270  DTBtiId thetaBTI = DTBtiId(baseid, 2, btiActual);
271  GlobalPoint theta_gp = trig_geom.CMSPosition(thetaBTI);
272 
273  EtaValue etaValue = {
274  config->etaToHwEta(theta_gp.eta()),
275  0,
276  thetaDigi.quality(btiGroup),
277  thetaDigi.bxNum(),
278  0 //TODO what about sub-bx timing???
279  };
280  etaSegments.emplace_back(etaValue);
281 
282  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" bx "<<thetaDigi.bxNum()<<" baseid "<<baseid<<" btiGroup "<<btiGroup<<" quality "<<thetaDigi.quality(btiGroup)<<" theta_gp.eta() "<<theta_gp.eta()<<" eta "<<etaValue.eta<<" etaSigma "<<etaValue.etaSigma<<std::endl;
283  }
284  }
285 }
286 
287 std::vector<EtaValue> AngleConverterBase::getGlobalEta(const L1MuDTChambThContainer* dtThDigis,
288  int bxFrom,
289  int bxTo) const {
290  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" dtThDigis size "<<dtThDigis->getContainer()->size()<<std::endl;
291 
292  std::vector<EtaValue> etaSegments;
293 
294  for (auto& thetaDigi : (*(dtThDigis->getContainer()))) {
295  if (thetaDigi.bxNum() >= bxFrom && thetaDigi.bxNum() <= bxTo) {
296  getGlobalEta(thetaDigi, etaSegments);
297  }
298  }
299  return etaSegments;
300 }
301 
302 //just read from the drawing
304  if (detId.station() == 1) {
305  if (detId.ring() == 1)
306  return (2.5 - 1.6) / 2.;
308  if (detId.ring() == 2)
309  return (1.7 - 1.2) / 2.;
310  if (detId.ring() == 3)
311  return (1.12 - 0.9) / 2.;
312  if (detId.ring() == 4)
313  return (2.5 - 1.6) / 2.;
314  } else if (detId.station() == 2) {
315  if (detId.ring() == 1)
316  return (2.5 - 1.6) / 2.;
317  if (detId.ring() == 2)
318  return (1.6 - 1.0) / 2.;
319  } else if (detId.station() == 3) {
320  if (detId.ring() == 1)
321  return (2.5 - 1.7) / 2.;
322  if (detId.ring() == 2)
323  return (1.7 - 1.1) / 2.;
324  } else if (detId.station() == 4) {
325  if (detId.ring() == 1)
326  return (2.45 - 1.8) / 2.;
327  if (detId.ring() == 2)
328  return (1.8 - 1.2) / 2.;
329  }
330  return 0;
331 }
332 
337 
338  // alot of this is transcription and consolidation of the CSC
339  // global phi calculation code
340  // this works directly with the geometry
341  // rather than using the old phi luts
342 
343  auto chamb = _geocsc->chamber(detId);
344  auto layer_geom = chamb->layer(CSCConstants::KEY_ALCT_LAYER)->geometry();
345  auto layer = chamb->layer(CSCConstants::KEY_ALCT_LAYER);
346 
347  const uint16_t keyWG = aDigi.getKeyWG();
348 
349  const LocalPoint lpWg = layer_geom->localCenterOfWireGroup(keyWG);
350  const GlobalPoint gpWg = layer->surface().toGlobal(lpWg);
351 
352  EtaValue etaSegment = {
353  config->etaToHwEta(gpWg.eta()),
354  0, //config->etaToHwEta(cscChamberEtaSize(id) ),
355  0,
356  aDigi.getBX(),
357  0 //tming???
358  };
359 
360  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" csc "<<detId<<" eta "<<gpWg.eta()<<" etaHw "<<etaSegment.eta<<" etaSigma "<<etaSegment.etaSigma<<std::endl;
361  return etaSegment;
362 }
363 
364 //TODO the CSC ME1/1 has strips divided in two parts: a and b, so this function in principle can include that,
365 //then it should also receive the roll number as parameter, off course implementation should be different then
367  auto chamb = _geocsc->chamber(detId);
368 
369  Local2DPoint chamberMiddleLP(0, 0);
370  GlobalPoint chamberMiddleGP = chamb->toGlobal(chamberMiddleLP);
371 
372  EtaValue etaValue = {
373  config->etaToHwEta(chamberMiddleGP.eta()),
374  config->etaToHwEta(cscChamberEtaSize(detId)),
375  0,
376  0, //bx
377  0 //timnig
378  };
379 
380  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rawid "<<detId.rawId()<<" detId "<<detId<<" chamberMiddleGP.eta() "<<chamberMiddleGP.eta()<<" eta "<<etaValue.eta<<" etaSigma "<<etaValue.etaSigma<<std::endl;
381  return etaValue;
382 }
383 
386 EtaValue AngleConverterBase::getGlobalEta(unsigned int rawid, const unsigned int& strip) const {
387  const RPCDetId id(rawid);
388 
389  auto roll = _georpc->roll(id);
390  const LocalPoint lp = roll->centreOfStrip((int)strip);
391  const GlobalPoint gp = roll->toGlobal(lp);
392 
393  int neighbRoll = 1; //neighbor roll in eta
394  //roll->chamber()->nrolls() does not work
395  if (id.region() == 0) { //barel
396  if (id.station() == 2 && ((std::abs(id.ring()) == 2 && id.layer() == 2) ||
397  (std::abs(id.ring()) != 2 && id.layer() == 1))) { //three-roll chamber
398  if (id.roll() == 2)
399  neighbRoll = 1;
400  else {
401  neighbRoll = 2;
402  }
403  } else //two-roll chamber
404  neighbRoll = (id.roll() == 1 ? 3 : 1);
405  } else { //endcap
406  neighbRoll = id.roll() + (id.roll() == 1 ? +1 : -1);
407  }
408 
409  const RPCDetId idNeigh =
410  RPCDetId(id.region(), id.ring(), id.station(), id.sector(), id.layer(), id.subsector(), neighbRoll);
411  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rpc "<<id<<std::endl;
412  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rpc "<<idNeigh<<std::endl;
413 
414  auto rollNeigh = _georpc->roll(idNeigh);
415  const LocalPoint lpNeigh = rollNeigh->centreOfStrip((int)strip);
416  const GlobalPoint gpNeigh = rollNeigh->toGlobal(lpNeigh);
417 
418  EtaValue etaValue = {config->etaToHwEta(gp.eta()),
419  config->etaToHwEta(std::abs(gp.eta() - gpNeigh.eta())) /
420  2, //half of the size of the strip in eta - not precise, but OK
421  0};
422 
423  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rpc "<<id<<" eta "<<gp.eta()<<" etaHw "<<etaValue.eta<<" etaSigma "<<etaValue.etaSigma<<std::endl;
424  return etaValue;
425 }
429  const int nStrips = layer->geometry()->numberOfStrips();
430  const double phi1 = layer->centerOfStrip(1).phi();
431  const double phiN = layer->centerOfStrip(nStrips).phi();
432  return ((std::abs(phi1 - phiN) < M_PI && phi1 >= phiN) || (std::abs(phi1 - phiN) >= M_PI && phi1 < phiN));
433 }
437  int bti_group = -1;
438 
439  const L1MuDTChambThDigi* theta_segm =
440  dtThDigis->chThetaSegm(aDigi.whNum(), aDigi.stNum(), aDigi.scNum(), aDigi.bxNum());
441  if (!theta_segm)
442  return bti_group;
443 
444  for (unsigned int i = 0; i < 7; ++i) {
445  if (theta_segm->position(i) && bti_group < 0)
446  bti_group = i;
450  else if (theta_segm->position(i) && bti_group > -1)
451  return -1;
452  }
453 
454  return bti_group;
455 }
edm::ESHandle< DTGeometry > _geodt
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to the given id.
Definition: CSCChamber.cc:30
L1MuDTChambThDigi const * chThetaSegm(int wheel, int stat, int sect, int bx) const
const ProcConfigurationBase * config
const CSCChamber * chamber(CSCDetId id) const
Return the chamber corresponding to given DetId.
Definition: CSCGeometry.cc:100
edm::ESGetToken< CSCGeometry, MuonGeometryRecord > cscGeometryEsToken
float sgn(float val)
Definition: FWPFMaths.cc:9
edm::ESHandle< RPCGeometry > _georpc
T eta() const
Definition: PV3DBase.h:73
int position(const int i) const
virtual EtaValue getGlobalEtaDt(const DTChamberId &detId) const
Definition: config.py:1
const RPCRoll * roll(RPCDetId id) const
Return a roll given its id.
Definition: RPCGeometry.cc:50
nStrips
1.2 is to make the matching window safely the two nearest strips 0.35 is the size of an ME0 chamber i...
#define LogTrace(id)
const CSCLayerGeometry * geometry() const
Definition: CSCLayer.h:44
edm::ESGetToken< RPCGeometry, MuonGeometryRecord > rpcGeometryEsToken
The_Container const * getContainer() const
uint16_t getBX() const
return BX
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
unsigned int nPhiBins
Number of phi bins along 2Pi.
Definition: L1Track.h:19
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
virtual const int findBTIgroup(const L1MuDTChambPhDigi &aDigi, const L1MuDTChambThContainer *dtThDigis)
Find BTI group.
float cscChamberEtaSize(const CSCDetId &id) const
#define M_PI
virtual int getProcessorPhi(int phiZero, l1t::tftype part, int dtScNum, int dtPhi) const
float stripPhiPitch() const
uint16_t getStrip(uint16_t n=2) const
return the key halfstrip from 0,159
edm::ESGetToken< DTGeometry, MuonGeometryRecord > dtGeometryEsToken
virtual void getGlobalEta(const L1MuDTChambThDigi &thetaDigi, std::vector< EtaValue > &etaSegments) const
virtual void checkAndUpdateGeometry(const edm::EventSetup &, const ProcConfigurationBase *config, const MuonGeometryTokens &muonGeometryTokens)
Update the Geometry with current Event Setup.
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
part
Definition: HCALResponse.h:20
edm::ESHandle< CSCGeometry > _geocsc
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
uint16_t getKeyWG() const
return the key wire group. counts from 0.
edm::ESWatcher< MuonGeometryRecord > muonGeometryRecordWatcher
int quality(const int i) const
virtual bool isCSCCounterClockwise(const CSCLayer *layer) const
Check orientation of strips in given CSC chamber.
long double T
const DTChamber * chamber(const DTChamberId &id) const
Return a DTChamber given its id.
Definition: DTGeometry.cc:90
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
virtual EtaValue getGlobalEtaCsc(const CSCDetId &detId) const
returns the eta position of the CSC chamber
int nCell(int sl) const
Number of BTIs in a required superlayer (i.e. nCells in lay 1)
Definition: DTTrigGeom.h:88