CMS 3D CMS Logo

ME0ReDigiProducer.cc
Go to the documentation of this file.
8 
14 #include "CLHEP/Random/RandGaussQ.h"
15 #include "CLHEP/Random/RandFlat.h"
16 #include "CLHEP/Units/PhysicalConstants.h"
17 #include <sstream>
18 #include <string>
19 #include <map>
20 #include <vector>
21 
22 
23 
25  //First test geometry to make sure that it is compatible with our assumptions
26  const auto& chambers = geometry->chambers();
27  if(chambers.empty())
28  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - No ME0Chambers in geometry.";
29  const auto* mainChamber = chambers.front();
30  const unsigned int nLayers = chambers.front()->nLayers();
31  if(!nLayers)
32  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - ME0Chamber has no layers.";
33  const auto* mainLayer = mainChamber->layers()[0];
34  if(!mainLayer->nEtaPartitions())
35  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - ME0Layer has no partitions.";
36  if(mainLayer->nEtaPartitions() != 1)
37  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - This module is only compatitble with geometries that contain only one partition per ME0Layer.";
38 
39  const auto* mainPartition = mainLayer->etaPartitions()[0];
40  const TrapezoidalStripTopology * mainTopo = dynamic_cast<const TrapezoidalStripTopology*>(&mainPartition->topology());
41  if(!mainTopo)
42  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - ME0 strip topology must be of type TrapezoidalStripTopology. This module cannot be used";
43 
44  for(const auto& chamber : geometry->chambers() ){
45  if(chamber->nLayers() != int(nLayers))
46  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - Not all ME0Chambers have the same number of layers. This module cannot be used.";
47  for(unsigned int iL = 0; iL < nLayers; ++iL){
48  if(chamber->layers()[iL]->nEtaPartitions() != mainLayer->nEtaPartitions())
49  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - Not all ME0Layers have the same number of partitions. This module cannot be used.";
50  if(chamber->layers()[iL]->etaPartitions()[0]->specs()->parameters() != mainPartition->specs()->parameters())
51  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - Not all ME0 ETA partitions have the same properties. This module cannot be used.";
52  if(std::fabs(chamber->layers()[iL]->etaPartitions()[0]->position().z()) != std::fabs(mainChamber->layers()[iL]->etaPartitions()[0]->position().z()))
53  throw cms::Exception("Setup") << "ME0ReDigiProducer::TemporaryGeometry::TemporaryGeometry() - Not all ME0 ETA partitions in a single layer have the same Z position. This module cannot be used.";
54  }
55  }
56 
57  //Calculate radius to center of partition
58  middleDistanceFromBeam = mainTopo->radius();
59 
60  //calculate the top of each eta partition, assuming equal distance in eta between partitions
61  const auto localTop = LocalPoint(0,mainTopo->stripLength()/2);
62  const auto localBottom = LocalPoint(0,-1*mainTopo->stripLength()/2);
63  const auto globalTop = mainPartition->toGlobal(localTop);
64  const auto globalBottom = mainPartition->toGlobal(localBottom);
65  const double etaTop = globalTop.eta();
66  const double etaBottom = globalBottom.eta();
67  const double zBottom = globalBottom.z();
68 
69  //Build topologies
70  partitionTops.reserve(numberOfPartitions);
71  stripTopos.reserve(numberOfPartitions);
72  const auto& mainPars = mainPartition->specs()->parameters();
73  for(unsigned int iP = 0; iP < numberOfPartitions; ++iP){
74  const double eta = (etaTop -etaBottom)*double(iP + 1)/double(numberOfPartitions) + etaBottom;
75  const double distFromBeam = std::fabs(zBottom /std::sinh(eta));
76  partitionTops.push_back(distFromBeam - middleDistanceFromBeam);
77  LogDebug("ME0ReDigiProducer::TemporaryGeometry") << "Top of new partition: " <<partitionTops.back() << std::endl;
78 
79  std::vector<float> params(4,0);
80 
81  //half width of trapezoid at local coordinate Y
82  auto getWidth = [&] ( float locY ) -> float { return (mainPars[2]*(mainPars[1]+mainPars[0]) +locY*(mainPars[1] - mainPars[0]) )/(2*mainPars[2]);};
83 
84  params[0] = iP == 0 ? mainPars[0] : getWidth(partitionTops[iP -1]); // Half width of bottom of chamber
85  params[1] = iP +1 == numberOfPartitions ? mainPars[1] : getWidth(partitionTops[iP]); // Half width of top of chamber
86  params[2] = ((iP + 1 == numberOfPartitions ? localTop.y() : partitionTops[iP] ) - (iP == 0 ? localBottom.y() : partitionTops[iP-1] ) )/2; // Half width of height of chamber
87  params[3] = numberOfStrips;
88 
89  stripTopos.push_back(buildTopo(params));
90  }
91 
92  //Get TOF at center of each partition
93  tofs.resize(nLayers);
94  LogDebug("ME0ReDigiProducer::TemporaryGeometry") << "TOF numbers [layer][partition]: " ;
95  for(unsigned int iL = 0; iL < nLayers; ++iL){
96  tofs[iL].resize(numberOfPartitions);
97  for(unsigned int iP = 0; iP < numberOfPartitions; ++iP){
98  const LocalPoint partCenter(0., getPartCenter(iP), 0.);
99  const GlobalPoint centralGP(mainChamber->layers()[iL]->etaPartitions()[0]->toGlobal(partCenter));
100  tofs[iL][iP] = (centralGP.mag() / (CLHEP::c_light/CLHEP::cm)); //speed of light [cm/ns]
101  LogDebug("ME0ReDigiProducer::TemporaryGeometry") << "["<<iL<<"]["<<iP<<"]="<< tofs[iL][iP] <<" "<<std::endl;
102  }
103  }
104 }
105 
107  unsigned int etaPart = stripTopos.size() -1;
108  for(unsigned int iP = 0; iP < stripTopos.size(); ++iP ){
109  if(locY < partitionTops[iP]) {etaPart = iP; break;}
110  }
111  return etaPart;
112 }
113 
115 
117  for(auto * p : stripTopos) { delete p;}
118 }
119 
121  float b = _p[0];
122  float B = _p[1];
123  float h = _p[2];
124  float r0 = h*(B + b)/(B - b);
125  float striplength = h*2;
126  float strips = _p[3];
127  float pitch = (b + B)/strips;
128  int nstrip =static_cast<int>(strips);
129 
130  LogDebug("ME0ReDigiProducer::TemporaryGeometry") << "New partition parameters: " <<
131  "bottom width("<< 2*b <<") top width("<<2*B<<") height("<< 2*h <<") radius to center("<< r0 <<") nStrips("<< strips <<") pitch(" << pitch<<")"<< std::endl;
132 
133  return new TrapezoidalStripTopology(nstrip, pitch, striplength, r0);
134 }
135 
137  bxWidth (25.0),
138  useCusGeoFor1PartGeo(ps.getParameter<bool>("useCusGeoFor1PartGeo")),
139  numberOfStrips (ps.getParameter<unsigned int>("numberOfStrips")),
140  numberOfPartitions (ps.getParameter<unsigned int>("numberOfPartitions")),
141  neutronAcceptance (ps.getParameter<double>("neutronAcceptance")),
142  timeResolution (ps.getParameter<double>("timeResolution")),
143  minBXReadout (ps.getParameter<int>("minBXReadout")),
144  maxBXReadout (ps.getParameter<int>("maxBXReadout")),
145  layerReadout (ps.getParameter<std::vector<int>>("layerReadout")),
146  mergeDigis (ps.getParameter<bool>("mergeDigis")),
147  token(consumes<ME0DigiPreRecoCollection>(edm::InputTag(ps.getParameter<std::string>("inputCollection"))))
148 {
149  produces<ME0DigiPreRecoCollection>();
150  produces<ME0DigiPreRecoMap>();
151 
153  if (!rng.isAvailable()){
154  throw cms::Exception("Configuration")
155  << "ME0ReDigiProducer::ME0PreRecoDigiProducer() - RandomNumberGeneratorService is not present in configuration file.\n"
156  << "Add the service in the configuration file or remove the modules that require it.";
157  }
158  geometry = 0;
159  tempGeo = 0;
160  useBuiltinGeo = true;
161 
163  if(numberOfStrips == 0)
164  throw cms::Exception("Setup") << "ME0ReDigiProducer::ME0PreRecoDigiProducer() - Must have at least one strip if using custom geometry.";
165  if(numberOfPartitions == 0)
166  throw cms::Exception("Setup") << "ME0ReDigiProducer::ME0PreRecoDigiProducer() - Must have at least one partition if using custom geometry.";
167  }
168 
169  if(neutronAcceptance < 0 )
170  throw cms::Exception("Setup") << "ME0ReDigiProducer::ME0PreRecoDigiProducer() - neutronAcceptance must be >= 0.";
171 }
172 
173 
175 {
176  if(tempGeo) delete tempGeo;
177 }
178 
179 
180 void ME0ReDigiProducer::beginRun(const edm::Run&, const edm::EventSetup& eventSetup)
181 {
182  // set geometry
184  eventSetup.get<MuonGeometryRecord>().get(hGeom);
185  geometry= &*hGeom;
186 
187  const auto& chambers = geometry->chambers();
188  if(chambers.empty())
189  throw cms::Exception("Setup") << "ME0ReDigiProducer::beginRun() - No ME0Chambers in geometry.";
190 
191  const unsigned int nLayers = chambers.front()->nLayers();
192  if(!nLayers) throw cms::Exception("Setup") << "ME0ReDigiProducer::beginRun() - No layers in ME0 geometry.";
193 
194  const unsigned int nPartitions = chambers.front()->layers()[0]->nEtaPartitions();
195 
196  if(useCusGeoFor1PartGeo && nPartitions == 1){
197  useBuiltinGeo = false;
198  }
199 
200  if(useBuiltinGeo){
201  if(nLayers != layerReadout.size() )
202  throw cms::Exception("Configuration") << "ME0ReDigiProducer::beginRun() - The geometry has "<<nLayers
203  << " layers, but the readout of "<<layerReadout.size() << " were specified with the layerReadout parameter." ;
204  fillCentralTOFs();
205  } else {
206  LogDebug("ME0ReDigiProducer")
207  << "Building temporary geometry:" << std::endl;
209  LogDebug("ME0ReDigiProducer")
210  << "Done building temporary geometry!" << std::endl;
211 
212  if(tempGeo->numLayers() != layerReadout.size() )
213  throw cms::Exception("Configuration") << "ME0ReDigiProducer::beginRun() - The geometry has "<<tempGeo->numLayers()
214  << " layers, but the readout of "<<layerReadout.size() << " were specified with the layerReadout parameter." ;
215  }
216 }
217 
218 
220 {
222  CLHEP::HepRandomEngine* engine = &rng->getEngine(e.streamID());
223 
225  e.getByToken(token, input_digis);
226 
227  std::unique_ptr<ME0DigiPreRecoCollection> output_digis(new ME0DigiPreRecoCollection());
228  std::unique_ptr<ME0DigiPreRecoMap> output_digimap(new ME0DigiPreRecoMap());
229 
230  // build the digis
231  buildDigis(*(input_digis.product()),
232  *output_digis,
233  *output_digimap,
234  engine);
235 
236  // store them in the event
237  e.put(std::move(output_digis));
238  e.put(std::move(output_digimap));
239 }
240 
241 
243  ME0DigiPreRecoCollection & output_digis,
244  ME0DigiPreRecoMap & output_digimap,
245  CLHEP::HepRandomEngine* engine)
246 {
247 
248  /*
249  Starting form the incoming pseudo-digi, which has perfect time and position resolution:
250  1A. Smear time using sigma_t by some value
251  1B. Correct the smeared time with the central arrival time for partition
252  1C. Apply discretization: if the smeared time is outside the BX window (-12.5ns;+12.5ns),
253  the hit should be assigned to the next (or previous) BX
254 
255  2A. Find strip that the digi belongs to
256  2B. Get the center of this strip and the error on the position assuming the geometry
257 
258  3A. Filter event if a digi at this partition/strip/BX already exists
259  3B. Add to collection
260  */
261 
262  LogDebug("ME0ReDigiProducer::buildDigis") << "Begin building digis."<<std::endl;
264  for (me0dgIt = input_digis.begin(); me0dgIt != input_digis.end();
265  ++me0dgIt){
266 
267  const auto& me0Id = (*me0dgIt).first;
268  LogTrace("ME0ReDigiProducer::buildDigis") << "Starting with roll: "<< me0Id<<std::endl;
269 
270  //setup map for this chamber/eta partition
271  ChamberDigiMap chDigiMap;
272 
273  int newDigiIdx = 0;
274  const ME0DigiPreRecoCollection::Range& range = (*me0dgIt).second;
275  for (ME0DigiPreRecoCollection::const_iterator digi = range.first;
276  digi != range.second;digi++) {
277  LogTrace("ME0ReDigiProducer::buildDigis") << std::endl<< "(" <<digi->x() <<","<< digi->y()<<","<<digi->tof()<<","<<digi->pdgid()<<","<<digi->prompt()<<")-> ";
278 
279  //If we don't readout this layer skip
280  if(!layerReadout[me0Id.layer() -1 ]) {
281  output_digimap.insertDigi(me0Id, -1);
282  continue;
283  }
284 
285  //if neutron and we are filtering skip
286  if(!digi->prompt() && neutronAcceptance < 1.0 )
287  if (CLHEP::RandFlat::shoot(engine) > neutronAcceptance){
288  output_digimap.insertDigi(me0Id, -1);
289  continue;
290  }
291 
292  //smear TOF if necessary
293  float tof = digi->tof() + (timeResolution < 0 ? 0.0 : CLHEP::RandGaussQ::shoot(engine, 0, timeResolution));
294 
295  //Values used to fill objet
296  int mapPartIDX = me0Id.roll() -1;
297  int strip = 0;
298  LocalPoint digiLocalPoint;
299  LocalError digiLocalError;
300  if(useBuiltinGeo){
301  getStripProperties(geometry->etaPartition(me0Id),&*digi,tof,strip,digiLocalPoint,digiLocalError);
302  } else {
303  mapPartIDX = getCustomStripProperties(me0Id,&*digi,tof,strip,digiLocalPoint,digiLocalError);
304 
305  }
306 
307  //filter if outside of readout window
308  const int bxIdx = std::round(tof/bxWidth);
309  LogTrace("ME0ReDigiProducer::buildDigis") << tof <<"("<<bxIdx<<") ";
310  if(bxIdx < minBXReadout) {output_digimap.insertDigi(me0Id, -1); continue; }
311  if(bxIdx > maxBXReadout) {output_digimap.insertDigi(me0Id, -1); continue; }
312  tof = bxIdx*bxWidth;
313 
314 
315  //If we are merging check to see if it already exists
316  LogTrace("ME0ReDigiProducer::buildDigis") << "("<<bxIdx<<","<<mapPartIDX<<","<<strip<<") ";
317  if(mergeDigis){
318  int matchIDX = fillDigiMap(chDigiMap, bxIdx,mapPartIDX,strip,newDigiIdx);
319  if(matchIDX >= 0){
320  output_digimap.insertDigi(me0Id, matchIDX);
321  continue;
322  }
323  }
324 
325  //Digis store sigmaX,sigmaY, correlationCoef
326  const float sigmaX = std::sqrt(digiLocalError.xx());
327  const float sigmaY = std::sqrt(digiLocalError.yy());
328  const float corrCoef = digiLocalError.xy() /(sigmaX*sigmaY);
329 
330  //Fill in the new collection
331  ME0DigiPreReco out_digi(digiLocalPoint.x(), digiLocalPoint.y(),
332  sigmaX, sigmaY, corrCoef, tof, digi->pdgid(), digi->prompt());
333  output_digis.insertDigi(me0Id, out_digi);
334 
335  // store index of previous detid and digi
336  output_digimap.insertDigi(me0Id, newDigiIdx);
337  newDigiIdx++;
338 
339  LogTrace("ME0ReDigiProducer::buildDigis") << "("<<digiLocalPoint.x()<<","<<digiLocalPoint.y()<<","<<sigmaX<<","<<sigmaY<<","<< tof<<") ";
340  }
341 
342  chDigiMap.clear();
343 
344 
345  }
346 
347 }
348 
350  const auto* mainChamber = geometry->chambers().front();
351  const unsigned int nLayers = mainChamber->nLayers();
352  //Get TOF at center of each partition
353  tofs.clear();
354  tofs.resize(nLayers);
355  LogDebug("ME0ReDigiProducer::fillCentralTOFs()") << "TOF numbers [layer][partition]: " ;
356  for(unsigned int iL = 0; iL < nLayers; ++iL){
357  const auto* layer = mainChamber->layers()[iL];
358  const unsigned int mapLayIDX = layer->id().layer() -1;
359  const unsigned int nPartitions = layer->nEtaPartitions();
360  if(!nPartitions)
361  throw cms::Exception("Setup") << "ME0ReDigiProducer::fillCentralTOFs() - ME0Layer has no partitions.";
362  tofs[mapLayIDX].resize(nPartitions);
363  for(unsigned int iP = 0; iP < nPartitions; ++iP){
364  const unsigned int mapPartIDX = layer->etaPartitions()[iP]->id().roll() -1;
365  const GlobalPoint centralGP(layer->etaPartitions()[iP]->position());
366  tofs[mapLayIDX][mapPartIDX] = (centralGP.mag() / (CLHEP::c_light/CLHEP::cm)); //speed of light [cm/ns]
367  LogDebug("ME0ReDigiProducer::fillCentralTOFs()") << "["<<mapLayIDX<<"]["<<mapPartIDX<<"]="<< tofs[mapLayIDX][mapPartIDX] <<" "<<std::endl;
368  }
369  }
370 }
371 int ME0ReDigiProducer::getCustomStripProperties(const ME0DetId& detId,const ME0DigiPreReco* inDigi, float& tof,int& strip, LocalPoint& digiLocalPoint, LocalError& digiLocalError ) const {
372  const unsigned int partIdx = tempGeo->findEtaPartition(inDigi->y());
373  LogTrace("ME0ReDigiProducer::buildDigis") << partIdx <<" ";
374  const float partMeanTof = tempGeo->getCentralTOF(detId,partIdx);
375 
376  //convert to relative to partition
377  tof -= partMeanTof;
378 
379  //get coordinates and errors
380  const float partCenter = tempGeo->getPartCenter(partIdx);
381  const auto* topo = tempGeo->getTopo(partIdx);
382 
383  //find channel
384  const LocalPoint partLocalPoint(inDigi->x(), inDigi->y() - partCenter ,0.);
385  strip = topo->channel(partLocalPoint);
386  const float stripF = float(strip)+0.5;
387 
388  //get digitized location
389  LocalPoint digiPartLocalPoint = topo->localPosition(stripF);
390  digiLocalError = topo->localError(stripF, 1./sqrt(12.)); //std dev. flat distribution with length L is L/sqrt(12). The strip topology expects the error in units of strips.
391  digiLocalPoint = LocalPoint(digiPartLocalPoint.x(),digiPartLocalPoint.y() + partCenter,0.0);
392  return partIdx;
393 
394 
395 }
396 void ME0ReDigiProducer::getStripProperties(const ME0EtaPartition* etaPart, const ME0DigiPreReco* inDigi, float& tof,int& strip, LocalPoint& digiLocalPoint, LocalError& digiLocalError) const {
397  //convert to relative to partition
398  tof -= tofs[etaPart->id().layer()-1][etaPart->id().roll() -1];
399 
400  //find channel
401  const LocalPoint partLocalPoint(inDigi->x(), inDigi->y(),0.);
402  strip = etaPart->specificTopology().channel(partLocalPoint);
403  const float stripF = float(strip)+0.5;
404 
405  //get digitized location
406  digiLocalPoint = etaPart->specificTopology().localPosition(stripF);
407  digiLocalError = etaPart->specificTopology().localError(stripF, 1./sqrt(12.));
408 }
409 
410 unsigned int ME0ReDigiProducer::fillDigiMap(ChamberDigiMap& chDigiMap, unsigned int bx, unsigned int part, unsigned int strip, unsigned int currentIDX) const {
411  DigiIndicies newIDX(bx,part,strip);
412  auto it1 = chDigiMap.find(newIDX);
413  if (it1 == chDigiMap.end()){
414  chDigiMap[newIDX] = currentIDX;
415  return -1;
416  }
417  return it1->second;
418 }
419 
#define LogDebug(id)
std::vector< std::vector< double > > tofs
float xx() const
Definition: LocalError.h:24
const StripTopology & specificTopology() const
static unsigned int partIdx(const InputGenJetsParticleSelector::ParticleVector &p, const reco::Candidate *particle)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
float y() const
Point3DBase< Scalar, LocalTag > LocalPoint
Definition: Definitions.h:32
int getCustomStripProperties(const ME0DetId &detId, const ME0DigiPreReco *inDigi, float &tof, int &strip, LocalPoint &digiLocalPoint, LocalError &digiLocalError) const
float getCentralTOF(const ME0DetId &me0Id, unsigned int partIdx) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
double_binary B
Definition: DDStreamer.cc:248
edm::EDGetTokenT< ME0DigiPreRecoCollection > token
void buildDigis(const ME0DigiPreRecoCollection &, ME0DigiPreRecoCollection &, ME0DigiPreRecoMap &, CLHEP::HepRandomEngine *engine)
virtual LocalError localError(float strip, float stripErr2) const =0
std::vector< int > layerReadout
T y() const
Definition: PV3DBase.h:63
void insertDigi(const IndexType &index, const DigiType &digi)
insert a digi for a given DetUnit
unsigned int fillDigiMap(ChamberDigiMap &chDigiMap, unsigned int bx, unsigned int part, unsigned int strip, unsigned int currentIDX) const
std::tuple< unsigned int, unsigned int, unsigned int > DigiIndicies
TemporaryGeometry(const ME0Geometry *geometry, const unsigned int numberOfStrips, const unsigned int numberOfPartitions)
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
TrapezoidalStripTopology * buildTopo(const std::vector< float > &_p) const
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
MuonDigiCollection< ME0DetId, int > ME0DigiPreRecoMap
float xy() const
Definition: LocalError.h:25
float yy() const
Definition: LocalError.h:26
MuonDigiCollection< ME0DetId, ME0DigiPreReco > ME0DigiPreRecoCollection
virtual LocalPoint localPosition(float strip) const =0
T sqrt(T t)
Definition: SSEVec.h:18
ME0DetId id() const
std::vector< TrapezoidalStripTopology * > stripTopos
const std::vector< const ME0Chamber * > & chambers() const
Return a vector of all ME0 chambers.
Definition: ME0Geometry.cc:49
std::map< DigiIndicies, unsigned int > ChamberDigiMap
virtual int channel(const LocalPoint &p) const =0
#define LogTrace(id)
unsigned int findEtaPartition(float locY) const
float getPartCenter(const unsigned int partIdx) const
TemporaryGeometry * tempGeo
float x() const
T const * product() const
Definition: Handle.h:81
part
Definition: HCALResponse.h:20
unsigned int numberOfPartitions
const T & get() const
Definition: EventSetup.h:56
unsigned int numberOfStrips
double b
Definition: hdecay.h:120
std::vector< ME0DigiPreReco >::const_iterator const_iterator
int roll() const
Definition: ME0DetId.h:62
T eta() const
Definition: PV3DBase.h:76
ME0ReDigiProducer(const edm::ParameterSet &ps)
HLT enums.
StreamID streamID() const
Definition: Event.h:81
std::vector< std::vector< double > > tofs
std::pair< const_iterator, const_iterator > Range
int layer() const
Layer id: each chamber has six layers of chambers: layer 1 is the inner layer and layer 6 is the oute...
Definition: ME0DetId.h:56
static char chambers[264][20]
Definition: ReadPGInfo.cc:243
T x() const
Definition: PV3DBase.h:62
virtual void produce(edm::Event &, const edm::EventSetup &) override
virtual float stripLength() const
det heigth (strip length in the middle)
def move(src, dest)
Definition: eostools.py:510
const TrapezoidalStripTopology * getTopo(const unsigned int partIdx) const
Definition: Run.h:42
void getStripProperties(const ME0EtaPartition *etaPart, const ME0DigiPreReco *inDigi, float &tof, int &strip, LocalPoint &digiLocalPoint, LocalError &digiLocalError) const
virtual void beginRun(const edm::Run &, const edm::EventSetup &) override