CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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) {}
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));
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 }
85  const CSCDetId& csc,
86  const CSCCorrelatedLCTDigi& digi) const {
87  const double hsPhiPitch = 2 * M_PI / nPhiBins;
88  //
89  // get offset for each chamber.
90  // FIXME: These parameters depends on processor and chamber only so may be precomputed and put in map
91  //
92 
93  int halfStrip = digi.getStrip(); // returns halfStrip 0..159
94 
95  const CSCChamber* chamber = _geocsc->chamber(csc);
96 
97  //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),
98  //and the digi.getStrip() is increased by 2*64 (i.e. number of half strips in the chamber roll)
99  if (csc.station() == 1 && csc.ring() == 1 && halfStrip > 128) {
100  CSCDetId cscME11 = CSCDetId(csc.endcap(), csc.station(), 4, csc.chamber()); //changing ring to 4
101  chamber = _geocsc->chamber(cscME11);
102  }
103 
104  const CSCChamberSpecs* cspec = chamber->specs();
105  const CSCLayer* layer = chamber->layer(3);
106  int order = (layer->centerOfStrip(2).phi() - layer->centerOfStrip(1).phi() > 0) ? 1 : -1;
107  double stripPhiPitch = cspec->stripPhiPitch();
108  double scale = fabs(stripPhiPitch / hsPhiPitch / 2.);
109  if (fabs(scale - 1.) < 0.0002)
110  scale = 1.;
111 
112  double phiHalfStrip0 = layer->centerOfStrip(1).phi() - order * stripPhiPitch / 4.;
113 
114  int offsetLoc = lround((phiHalfStrip0) / hsPhiPitch - phiZero);
115  offsetLoc = config->foldPhi(offsetLoc);
116 
117  if (csc.station() == 1 && csc.ring() == 1 && halfStrip > 128) { //ME1/1/
118  /* if(cspec->nStrips() != 64)
119  edm::LogImportant("l1tOmtfEventPrint") <<__FUNCTION__<<":"<<__LINE__<<" cspec->nStrips() != 64 in case of the ME1/1, phi of the muon stub will be not correct. chamber "
120  <<csc<<" cspec->nStrips() "<<cspec->nStrips()<<std::endl;
121  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*/
122  halfStrip -= 128;
123  }
124 
125  //FIXME: to be checked (only important for ME1/3) keep more bits for offset, truncate at the end
126 
127  int fixOff = offsetLoc;
128  // a quick fix for towards geometry changes due to global tag.
129  // in case of MC tag fixOff should be identical to offsetLoc
130 
132  fixOff = fixCscOffsetGeom(offsetLoc); //TODO does not work in when phiZero is always 0. Fix this
133 
134  int phi = fixOff + order * scale * halfStrip;
135  //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,
136  //where phi of the stub is calculated with use of the offset and scale provided by an register
137 
138  /*//debug
139  auto localPoint = layer->toLocal(layer->centerOfStrip(halfStrip));
140  LogTrace("l1tOmtfEventPrint") << __FUNCTION__ << ":" << 147 << " csc: " <<csc.rawId()<<" "<< csc<<" layer "<<layer->id()<<" "<<layer->id().rawId()
141  << " halfStrip "<<halfStrip<<" phiGlobal " << layer->centerOfStrip(halfStrip).phi()<<" local phi "<<localPoint.phi()<<" x "<<localPoint.x()<<" y "<<localPoint.y() <<std::endl;
142  */
143 
144  /*//debug
145  auto radToDeg = [](double rad) { return (180. / M_PI * rad); };
146  LogTrace("l1tOmtfEventPrint") <<__FUNCTION__<<":"<<__LINE__<<" "<<std::setw(16)<<csc<<" phiZero "<<phiZero<<" hs: "<<std::setw(3)<< halfStrip <<" phiHalfStrip0 "<<std::setw(10)<<radToDeg(phiHalfStrip0)<<" offset: " << offsetLoc
147  <<" oder*scale: "<<std::setw(10)<< order*scale
148  <<" phi: " <<phi<<" foldPhi(phi) "<<config->foldPhi(phi)<<" ("<<offsetLoc + order*scale*halfStrip<<")"<<" centerOfStrip "<<std::setw(10)<< radToDeg( layer->centerOfStrip(halfStrip/2 +1).phi() )
149  <<" centerOfStrip/hsPhiPitch "<< ( (layer->centerOfStrip(halfStrip/2 + 1).phi() )/hsPhiPitch)<<" hsPhiPitch "<<hsPhiPitch
150  //<<" phiSpan.f "<<layer->geometry()->phiSpan().first<<" phiSpan.s "<<layer->geometry()->phiSpan().second
151  <<" nStrips "<<cspec->nStrips()
152  //<<" strip 1 "<<radToDeg( layer->centerOfStrip(1).phi() )<<" strip last "<<radToDeg( layer->centerOfStrip(cspec->nStrips()).phi() )
153  << std::endl;*/
154 
155  return config->foldPhi(phi);
156 }
157 
161  int phiZero, l1t::tftype part, const RPCDetId& rollId, const unsigned int& digi1, const unsigned int& digi2) const {
162  const double hsPhiPitch = 2 * M_PI / nPhiBins;
163  const int dummy = nPhiBins;
164  const RPCRoll* roll = _georpc->roll(rollId);
165  if (!roll)
166  return dummy;
167 
168  double stripPhi1 = (roll->toGlobal(roll->centreOfStrip((int)digi1))).phi(); // note [-pi,pi]
169  double stripPhi2 = (roll->toGlobal(roll->centreOfStrip((int)digi2))).phi(); // note [-pi,pi]
170 
171  // the case when the two strips are on different sides of phi = pi
172  if (std::signbit(stripPhi1) != std::signbit(stripPhi2) && abs(stripPhi1) > M_PI / 2.) {
173  if (std::signbit(stripPhi1)) { //stripPhi1 is negative
174  stripPhi1 += 2 * M_PI;
175  } else //stripPhi2 is negative
176  stripPhi2 += 2 * M_PI;
177  }
178  int halfStrip = lround(((stripPhi1 + stripPhi2) / 2.) / hsPhiPitch);
179  halfStrip = config->foldPhi(halfStrip); //only for the case when the two strips are on different sides of phi = pi
180 
181  LogTrace("l1tOmtfEventPrint") << __FUNCTION__ << ":" << 185 << " roll " << rollId.rawId() << " " << rollId
182  << " cluster: firstStrip " << digi1 << " stripPhi1Global " << stripPhi1
183  << " stripPhi1LocalPhi " << roll->centreOfStrip((int)digi1).x() << " y "
184  << roll->centreOfStrip((int)digi1).y() << " lastStrip " << digi2 << " stripPhi2Global "
185  << stripPhi2 << " stripPhi2LocalPhi x " << roll->centreOfStrip((int)digi2).x() << " y "
186  << roll->centreOfStrip((int)digi2).y() << " halfStrip " << halfStrip << std::endl;
187 
188  return config->foldPhi(halfStrip - phiZero);
189 }
190 
191 int AngleConverterBase::getProcessorPhi(unsigned int iProcessor,
193  const RPCDetId& rollId,
194  const unsigned int& digi) const {
195  const double hsPhiPitch = 2 * M_PI / nPhiBins;
196  const int dummy = nPhiBins;
197  int processor = iProcessor + 1;
198  const RPCRoll* roll = _georpc->roll(rollId);
199  if (!roll)
200  return dummy;
201 
202  double phi15deg = M_PI / 3. * (processor - 1) + M_PI / 12.;
203  // "0" is 15degree moved cyclically to each processor, note [0,2pi]
204 
205  double stripPhi = (roll->toGlobal(roll->centreOfStrip((int)digi))).phi(); // note [-pi,pi]
206 
207  // adjust [0,2pi] and [-pi,pi] to get deltaPhi difference properly
208  switch (processor) {
209  case 1:
210  break;
211  case 6: {
212  phi15deg -= 2 * M_PI;
213  break;
214  }
215  default: {
216  if (stripPhi < 0)
217  stripPhi += 2 * M_PI;
218  break;
219  }
220  }
221 
222  // local angle in CSC halfStrip usnits
223  int halfStrip = lround((stripPhi - phi15deg) / hsPhiPitch);
224 
225  return halfStrip;
226 }
230  Local2DPoint chamberMiddleLP(0, 0);
231  GlobalPoint chamberMiddleGP = _geodt->chamber(detId)->toGlobal(chamberMiddleLP);
232 
233  const DTChamberId baseidNeigh(detId.wheel() + (detId.wheel() >= 0 ? -1 : +1), detId.station(), detId.sector());
234  GlobalPoint chambNeighMiddleGP = _geodt->chamber(baseidNeigh)->toGlobal(chamberMiddleLP);
235 
236  EtaValue etaValue = {
237  config->etaToHwEta(chamberMiddleGP.eta()),
238  config->etaToHwEta(abs(chamberMiddleGP.eta() - chambNeighMiddleGP.eta())) / 2,
239  0, //quality
240  0, //bx
241  0 //timin
242  };
243 
244  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rawid "<<detId.rawId()<<" baseid "<<detId<<" chamberMiddleGP.eta() "<<chamberMiddleGP.eta()<<" eta "<<etaValue.eta<<" etaSigma "<<etaValue.etaSigma<<std::endl;
245  return etaValue;
246 }
247 
250 void AngleConverterBase::getGlobalEta(const L1MuDTChambThDigi& thetaDigi, std::vector<EtaValue>& etaSegments) const {
251  const DTChamberId baseid(thetaDigi.whNum(), thetaDigi.stNum(), thetaDigi.scNum() + 1);
252  DTTrigGeom trig_geom(_geodt->chamber(baseid), false);
253 
254  // super layer 2 is the theta superlayer in a DT chamber
255  // station 4 does not have a theta super layer
256  // the BTI index from the theta trigger is an OR of some BTI outputs
257  // so, we choose the BTI that's in the middle of the group
258  // as the BTI that we get theta from
259  // TODO:::::>>> need to make sure this ordering doesn't flip under wheel sign
260  const int NBTI_theta = trig_geom.nCell(2);
261  for (unsigned int btiGroup = 0; btiGroup < 7; ++btiGroup) {
262  if (thetaDigi.position(btiGroup)) {
263  unsigned btiActual = btiGroup * NBTI_theta / 7 + NBTI_theta / 14 + 1;
264  DTBtiId thetaBTI = DTBtiId(baseid, 2, btiActual);
265  GlobalPoint theta_gp = trig_geom.CMSPosition(thetaBTI);
266 
267  EtaValue etaValue = {
268  config->etaToHwEta(theta_gp.eta()),
269  0,
270  thetaDigi.quality(btiGroup),
271  thetaDigi.bxNum(),
272  0 //TODO what about sub-bx timing???
273  };
274  etaSegments.emplace_back(etaValue);
275 
276  //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;
277  }
278  }
279 }
280 
281 std::vector<EtaValue> AngleConverterBase::getGlobalEta(const L1MuDTChambThContainer* dtThDigis,
282  int bxFrom,
283  int bxTo) const {
284  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" dtThDigis size "<<dtThDigis->getContainer()->size()<<std::endl;
285 
286  std::vector<EtaValue> etaSegments;
287 
288  for (auto& thetaDigi : (*(dtThDigis->getContainer()))) {
289  if (thetaDigi.bxNum() >= bxFrom && thetaDigi.bxNum() <= bxTo) {
290  getGlobalEta(thetaDigi, etaSegments);
291  }
292  }
293  return etaSegments;
294 }
295 
296 //just read from the drawing
298  if (detId.station() == 1) {
299  if (detId.ring() == 1)
300  return (2.5 - 1.6) / 2.;
302  if (detId.ring() == 2)
303  return (1.7 - 1.2) / 2.;
304  if (detId.ring() == 3)
305  return (1.12 - 0.9) / 2.;
306  if (detId.ring() == 4)
307  return (2.5 - 1.6) / 2.;
308  } else if (detId.station() == 2) {
309  if (detId.ring() == 1)
310  return (2.5 - 1.6) / 2.;
311  if (detId.ring() == 2)
312  return (1.6 - 1.0) / 2.;
313  } else if (detId.station() == 3) {
314  if (detId.ring() == 1)
315  return (2.5 - 1.7) / 2.;
316  if (detId.ring() == 2)
317  return (1.7 - 1.1) / 2.;
318  } else if (detId.station() == 4) {
319  if (detId.ring() == 1)
320  return (2.45 - 1.8) / 2.;
321  if (detId.ring() == 2)
322  return (1.8 - 1.2) / 2.;
323  }
324  return 0;
325 }
326 
331 
332  // alot of this is transcription and consolidation of the CSC
333  // global phi calculation code
334  // this works directly with the geometry
335  // rather than using the old phi luts
336 
337  auto chamb = _geocsc->chamber(detId);
338  auto layer_geom = chamb->layer(CSCConstants::KEY_ALCT_LAYER)->geometry();
339  auto layer = chamb->layer(CSCConstants::KEY_ALCT_LAYER);
340 
341  const uint16_t keyWG = aDigi.getKeyWG();
342 
343  const LocalPoint lpWg = layer_geom->localCenterOfWireGroup(keyWG);
344  const GlobalPoint gpWg = layer->surface().toGlobal(lpWg);
345 
346  EtaValue etaSegment = {
347  config->etaToHwEta(gpWg.eta()),
348  0, //config->etaToHwEta(cscChamberEtaSize(id) ),
349  0,
350  aDigi.getBX(),
351  0 //tming???
352  };
353 
354  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" csc "<<detId<<" eta "<<gpWg.eta()<<" etaHw "<<etaSegment.eta<<" etaSigma "<<etaSegment.etaSigma<<std::endl;
355  return etaSegment;
356 }
357 
358 //TODO the CSC ME1/1 has strips divided in two parts: a and b, so this function in principle can include that,
359 //then it should also receive the roll number as parameter, off course implementation should be different then
361  auto chamb = _geocsc->chamber(detId);
362 
363  Local2DPoint chamberMiddleLP(0, 0);
364  GlobalPoint chamberMiddleGP = chamb->toGlobal(chamberMiddleLP);
365 
366  EtaValue etaValue = {
367  config->etaToHwEta(chamberMiddleGP.eta()),
369  0,
370  0, //bx
371  0 //timnig
372  };
373 
374  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rawid "<<detId.rawId()<<" detId "<<detId<<" chamberMiddleGP.eta() "<<chamberMiddleGP.eta()<<" eta "<<etaValue.eta<<" etaSigma "<<etaValue.etaSigma<<std::endl;
375  return etaValue;
376 }
377 
380 EtaValue AngleConverterBase::getGlobalEta(unsigned int rawid, const unsigned int& strip) const {
381  const RPCDetId id(rawid);
382 
383  auto roll = _georpc->roll(id);
384  const LocalPoint lp = roll->centreOfStrip((int)strip);
385  const GlobalPoint gp = roll->toGlobal(lp);
386 
387  int neighbRoll = 1; //neighbor roll in eta
388  //roll->chamber()->nrolls() does not work
389  if (id.region() == 0) { //barel
390  if (id.station() == 2 &&
391  ((abs(id.ring()) == 2 && id.layer() == 2) || (abs(id.ring()) != 2 && id.layer() == 1))) { //three-roll chamber
392  if (id.roll() == 2)
393  neighbRoll = 1;
394  else {
395  neighbRoll = 2;
396  }
397  } else //two-roll chamber
398  neighbRoll = (id.roll() == 1 ? 3 : 1);
399  } else { //endcap
400  neighbRoll = id.roll() + (id.roll() == 1 ? +1 : -1);
401  }
402 
403  const RPCDetId idNeigh =
404  RPCDetId(id.region(), id.ring(), id.station(), id.sector(), id.layer(), id.subsector(), neighbRoll);
405  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rpc "<<id<<std::endl;
406  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rpc "<<idNeigh<<std::endl;
407 
408  auto rollNeigh = _georpc->roll(idNeigh);
409  const LocalPoint lpNeigh = rollNeigh->centreOfStrip((int)strip);
410  const GlobalPoint gpNeigh = rollNeigh->toGlobal(lpNeigh);
411 
412  EtaValue etaValue = {config->etaToHwEta(gp.eta()),
413  config->etaToHwEta(abs(gp.eta() - gpNeigh.eta())) /
414  2, //half of the size of the strip in eta - not precise, but OK
415  0};
416 
417  //LogTrace("l1tOmtfEventPrint")<<__FUNCTION__<<":"<<__LINE__<<" rpc "<<id<<" eta "<<gp.eta()<<" etaHw "<<etaValue.eta<<" etaSigma "<<etaValue.etaSigma<<std::endl;
418  return etaValue;
419 }
423  const int nStrips = layer->geometry()->numberOfStrips();
424  const double phi1 = layer->centerOfStrip(1).phi();
425  const double phiN = layer->centerOfStrip(nStrips).phi();
426  return ((std::abs(phi1 - phiN) < M_PI && phi1 >= phiN) || (std::abs(phi1 - phiN) >= M_PI && phi1 < phiN));
427 }
431  int bti_group = -1;
432 
433  const L1MuDTChambThDigi* theta_segm =
434  dtThDigis->chThetaSegm(aDigi.whNum(), aDigi.stNum(), aDigi.scNum(), aDigi.bxNum());
435  if (!theta_segm)
436  return bti_group;
437 
438  for (unsigned int i = 0; i < 7; ++i) {
439  if (theta_segm->position(i) && bti_group < 0)
440  bti_group = i;
444  else if (theta_segm->position(i) && bti_group > -1)
445  return -1;
446  }
447 
448  return bti_group;
449 }
int chamber() const
Definition: CSCDetId.h:62
The_Container const * getContainer() const
edm::ESHandle< DTGeometry > _geodt
LocalPoint centreOfStrip(int strip) const
Definition: RPCRoll.cc:26
uint16_t getBX() const
return BX
const ProcConfigurationBase * config
uint16_t *__restrict__ id
edm::ESGetToken< CSCGeometry, MuonGeometryRecord > cscGeometryEsToken
virtual int etaToHwEta(double eta) const =0
float sgn(float val)
Definition: FWPFMaths.cc:9
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:49
edm::ESHandle< RPCGeometry > _georpc
muonGeometryTokens({esConsumes< RPCGeometry, MuonGeometryRecord, edm::Transition::BeginRun >(), esConsumes< CSCGeometry, MuonGeometryRecord, edm::Transition::BeginRun >(), esConsumes< DTGeometry, MuonGeometryRecord, edm::Transition::BeginRun >()})
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
T y() const
Definition: PV3DBase.h:60
float cscChamberEtaSize(const CSCDetId &id) const
virtual unsigned int nPhiBins() const =0
int numberOfStrips() const
int quality(const int i) const
tuple nStrips
1.2 is to make the matching window safely the two nearest strips 0.35 is the size of an ME0 chamber i...
virtual void getGlobalEta(const L1MuDTChambThDigi &thetaDigi, std::vector< EtaValue > &etaSegments) const
#define LogTrace(id)
constexpr std::array< uint8_t, layerIndexSize > layer
edm::ESGetToken< RPCGeometry, MuonGeometryRecord > rpcGeometryEsToken
int position(const int i) const
int endcap() const
Definition: CSCDetId.h:85
float stripPhiPitch() const
virtual bool getFixCscGeometryOffset() const
uint16_t getKeyWG() const
return the key wire group. counts from 0.
const CSCChamberSpecs * specs() const
Definition: CSCChamber.h:39
virtual bool isCSCCounterClockwise(const CSCLayer *layer) const
Check orientation of strips in given CSC chamber.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const CSCLayer * layer(CSCDetId id) const
Return the layer corresponding to the given id.
Definition: CSCChamber.cc:30
unsigned int nPhiBins
Number of phi bins along 2Pi.
virtual const int findBTIgroup(const L1MuDTChambPhDigi &aDigi, const L1MuDTChambThContainer *dtThDigis)
Find BTI group.
#define M_PI
uint16_t getStrip(uint16_t n=2) const
return the key halfstrip from 0,159
int ring() const
Definition: CSCDetId.h:68
GlobalPoint centerOfStrip(int strip) const
Definition: CSCLayer.cc:4
virtual int getProcessorPhi(int phiZero, l1t::tftype part, int dtScNum, int dtPhi) const
edm::ESGetToken< DTGeometry, MuonGeometryRecord > dtGeometryEsToken
virtual EtaValue getGlobalEtaCsc(const CSCDetId &detId) const
returns the eta position of the CSC chamber
virtual void checkAndUpdateGeometry(const edm::EventSetup &, const ProcConfigurationBase *config, const MuonGeometryTokens &muonGeometryTokens)
Update the Geometry with current Event Setup.
part
Definition: HCALResponse.h:20
L1MuDTChambThDigi const * chThetaSegm(int wheel, int stat, int sect, int bx) const
edm::ESHandle< CSCGeometry > _geocsc
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
virtual int foldPhi(int phi) const
T eta() const
Definition: PV3DBase.h:73
tuple config
parse the configuration file
edm::ESWatcher< MuonGeometryRecord > muonGeometryRecordWatcher
__host__ __device__ constexpr RandomIt lower_bound(RandomIt first, RandomIt last, const T &value, Compare comp={})
int sector() const
Definition: DTChamberId.h:49
virtual EtaValue getGlobalEtaDt(const DTChamberId &detId) const
int station() const
Definition: CSCDetId.h:79
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:157
int station() const
Return the station number.
Definition: DTChamberId.h:42
int wheel() const
Return the wheel number.
Definition: DTChamberId.h:39
long double T
T x() const
Definition: PV3DBase.h:59
int nCell(int sl) const
Number of BTIs in a required superlayer (i.e. nCells in lay 1)
Definition: DTTrigGeom.h:88
const CSCLayerGeometry * geometry() const
Definition: CSCLayer.h:44
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29