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));
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 
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 
131  if (config->getFixCscGeometryOffset())
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(fabs(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()),
368  config->etaToHwEta(cscChamberEtaSize(detId)),
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 }
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
constexpr int pow(int x)
Definition: conifer.h:24
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
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