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  usePads(ps.getParameter<bool>("usePads")),
140  numberOfStrips (ps.getParameter<unsigned int>("numberOfStrips")),
141  numberOfPartitions (ps.getParameter<unsigned int>("numberOfPartitions")),
142  neutronAcceptance (ps.getParameter<double>("neutronAcceptance")),
143  timeResolution (ps.getParameter<double>("timeResolution")),
144  minBXReadout (ps.getParameter<int>("minBXReadout")),
145  maxBXReadout (ps.getParameter<int>("maxBXReadout")),
146  layerReadout (ps.getParameter<std::vector<int>>("layerReadout")),
147  mergeDigis (ps.getParameter<bool>("mergeDigis")),
148  token(consumes<ME0DigiPreRecoCollection>(edm::InputTag(ps.getParameter<std::string>("inputCollection"))))
149 {
150  produces<ME0DigiPreRecoCollection>();
151  produces<ME0DigiPreRecoMap>();
152 
154  if (!rng.isAvailable()){
155  throw cms::Exception("Configuration")
156  << "ME0ReDigiProducer::ME0PreRecoDigiProducer() - RandomNumberGeneratorService is not present in configuration file.\n"
157  << "Add the service in the configuration file or remove the modules that require it.";
158  }
159  geometry = 0;
160  tempGeo = 0;
161  useBuiltinGeo = true;
162 
164  if (usePads)
166  if(numberOfStrips == 0)
167  throw cms::Exception("Setup") << "ME0ReDigiProducer::ME0PreRecoDigiProducer() - Must have at least one strip if using custom geometry.";
168  if(numberOfPartitions == 0)
169  throw cms::Exception("Setup") << "ME0ReDigiProducer::ME0PreRecoDigiProducer() - Must have at least one partition if using custom geometry.";
170  }
171 
172  if(neutronAcceptance < 0 )
173  throw cms::Exception("Setup") << "ME0ReDigiProducer::ME0PreRecoDigiProducer() - neutronAcceptance must be >= 0.";
174 }
175 
176 
178 {
179  if(tempGeo) delete tempGeo;
180 }
181 
182 
183 void ME0ReDigiProducer::beginRun(const edm::Run&, const edm::EventSetup& eventSetup)
184 {
185  // set geometry
187  eventSetup.get<MuonGeometryRecord>().get(hGeom);
188  geometry= &*hGeom;
189 
190  const auto& chambers = geometry->chambers();
191  if(chambers.empty())
192  throw cms::Exception("Setup") << "ME0ReDigiProducer::beginRun() - No ME0Chambers in geometry.";
193 
194  const unsigned int nLayers = chambers.front()->nLayers();
195  if(!nLayers) throw cms::Exception("Setup") << "ME0ReDigiProducer::beginRun() - No layers in ME0 geometry.";
196 
197  const unsigned int nPartitions = chambers.front()->layers()[0]->nEtaPartitions();
198 
199  if(useCusGeoFor1PartGeo && nPartitions == 1){
200  useBuiltinGeo = false;
201  }
202 
203  if(useBuiltinGeo){
204  if(nLayers != layerReadout.size() )
205  throw cms::Exception("Configuration") << "ME0ReDigiProducer::beginRun() - The geometry has "<<nLayers
206  << " layers, but the readout of "<<layerReadout.size() << " were specified with the layerReadout parameter." ;
207  fillCentralTOFs();
208  } else {
209  LogDebug("ME0ReDigiProducer")
210  << "Building temporary geometry:" << std::endl;
212  LogDebug("ME0ReDigiProducer")
213  << "Done building temporary geometry!" << std::endl;
214 
215  if(tempGeo->numLayers() != layerReadout.size() )
216  throw cms::Exception("Configuration") << "ME0ReDigiProducer::beginRun() - The geometry has "<<tempGeo->numLayers()
217  << " layers, but the readout of "<<layerReadout.size() << " were specified with the layerReadout parameter." ;
218  }
219 }
220 
221 
223 {
225  CLHEP::HepRandomEngine* engine = &rng->getEngine(e.streamID());
226 
228  e.getByToken(token, input_digis);
229 
230  std::unique_ptr<ME0DigiPreRecoCollection> output_digis(new ME0DigiPreRecoCollection());
231  std::unique_ptr<ME0DigiPreRecoMap> output_digimap(new ME0DigiPreRecoMap());
232 
233  // build the digis
234  buildDigis(*(input_digis.product()),
235  *output_digis,
236  *output_digimap,
237  engine);
238 
239  // store them in the event
240  e.put(std::move(output_digis));
241  e.put(std::move(output_digimap));
242 }
243 
244 
246  ME0DigiPreRecoCollection & output_digis,
247  ME0DigiPreRecoMap & output_digimap,
248  CLHEP::HepRandomEngine* engine)
249 {
250 
251  /*
252  Starting form the incoming pseudo-digi, which has perfect time and position resolution:
253  1A. Smear time using sigma_t by some value
254  1B. Correct the smeared time with the central arrival time for partition
255  1C. Apply discretization: if the smeared time is outside the BX window (-12.5ns;+12.5ns),
256  the hit should be assigned to the next (or previous) BX
257 
258  2A. Find strip that the digi belongs to
259  2B. Get the center of this strip and the error on the position assuming the geometry
260 
261  3A. Filter event if a digi at this partition/strip/BX already exists
262  3B. Add to collection
263  */
264 
265  LogDebug("ME0ReDigiProducer::buildDigis") << "Begin building digis."<<std::endl;
267  for (me0dgIt = input_digis.begin(); me0dgIt != input_digis.end();
268  ++me0dgIt){
269 
270  const auto& me0Id = (*me0dgIt).first;
271  LogTrace("ME0ReDigiProducer::buildDigis") << "Starting with roll: "<< me0Id<<std::endl;
272 
273  //setup map for this chamber/eta partition
274  ChamberDigiMap chDigiMap;
275 
276  int newDigiIdx = 0;
277  const ME0DigiPreRecoCollection::Range& range = (*me0dgIt).second;
278  for (ME0DigiPreRecoCollection::const_iterator digi = range.first;
279  digi != range.second;digi++) {
280  LogTrace("ME0ReDigiProducer::buildDigis") << std::endl<< "(" <<digi->x() <<","<< digi->y()<<","<<digi->tof()<<","<<digi->pdgid()<<","<<digi->prompt()<<")-> ";
281 
282  //If we don't readout this layer skip
283  if(!layerReadout[me0Id.layer() -1 ]) {
284  output_digimap.insertDigi(me0Id, -1);
285  continue;
286  }
287 
288  //if neutron and we are filtering skip
289  if(!digi->prompt() && neutronAcceptance < 1.0 )
290  if (CLHEP::RandFlat::shoot(engine) > neutronAcceptance){
291  output_digimap.insertDigi(me0Id, -1);
292  continue;
293  }
294 
295  //smear TOF if necessary
296  float tof = digi->tof() + (timeResolution < 0 ? 0.0 : CLHEP::RandGaussQ::shoot(engine, 0, timeResolution));
297 
298  //Values used to fill objet
299  int mapPartIDX = me0Id.roll() -1;
300  int strip = 0;
301  LocalPoint digiLocalPoint;
302  LocalError digiLocalError;
303  if(useBuiltinGeo){
304  getStripProperties(geometry->etaPartition(me0Id),&*digi,tof,strip,digiLocalPoint,digiLocalError);
305  } else {
306  mapPartIDX = getCustomStripProperties(me0Id,&*digi,tof,strip,digiLocalPoint,digiLocalError);
307 
308  }
309 
310  //filter if outside of readout window
311  const int bxIdx = std::round(tof/bxWidth);
312  LogTrace("ME0ReDigiProducer::buildDigis") << tof <<"("<<bxIdx<<") ";
313  if(bxIdx < minBXReadout) {output_digimap.insertDigi(me0Id, -1); continue; }
314  if(bxIdx > maxBXReadout) {output_digimap.insertDigi(me0Id, -1); continue; }
315  tof = bxIdx*bxWidth;
316 
317 
318  //If we are merging check to see if it already exists
319  LogTrace("ME0ReDigiProducer::buildDigis") << "("<<bxIdx<<","<<mapPartIDX<<","<<strip<<") ";
320  if(mergeDigis){
321  int matchIDX = fillDigiMap(chDigiMap, bxIdx,mapPartIDX,strip,newDigiIdx);
322  if(matchIDX >= 0){
323  output_digimap.insertDigi(me0Id, matchIDX);
324  continue;
325  }
326  }
327 
328  //Digis store sigmaX,sigmaY, correlationCoef
329  const float sigmaX = std::sqrt(digiLocalError.xx());
330  const float sigmaY = std::sqrt(digiLocalError.yy());
331  const float corrCoef = digiLocalError.xy() /(sigmaX*sigmaY);
332 
333  //Fill in the new collection
334  ME0DigiPreReco out_digi(digiLocalPoint.x(), digiLocalPoint.y(),
335  sigmaX, sigmaY, corrCoef, tof, digi->pdgid(), digi->prompt());
336  output_digis.insertDigi(me0Id, out_digi);
337 
338  // store index of previous detid and digi
339  output_digimap.insertDigi(me0Id, newDigiIdx);
340  newDigiIdx++;
341 
342  LogTrace("ME0ReDigiProducer::buildDigis") << "("<<digiLocalPoint.x()<<","<<digiLocalPoint.y()<<","<<sigmaX<<","<<sigmaY<<","<< tof<<") ";
343  }
344 
345  chDigiMap.clear();
346 
347 
348  }
349 
350 }
351 
353  const auto* mainChamber = geometry->chambers().front();
354  const unsigned int nLayers = mainChamber->nLayers();
355  //Get TOF at center of each partition
356  tofs.clear();
357  tofs.resize(nLayers);
358  LogDebug("ME0ReDigiProducer::fillCentralTOFs()") << "TOF numbers [layer][partition]: " ;
359  for(unsigned int iL = 0; iL < nLayers; ++iL){
360  const auto* layer = mainChamber->layers()[iL];
361  const unsigned int mapLayIDX = layer->id().layer() -1;
362  const unsigned int nPartitions = layer->nEtaPartitions();
363  if(!nPartitions)
364  throw cms::Exception("Setup") << "ME0ReDigiProducer::fillCentralTOFs() - ME0Layer has no partitions.";
365  tofs[mapLayIDX].resize(nPartitions);
366  for(unsigned int iP = 0; iP < nPartitions; ++iP){
367  const unsigned int mapPartIDX = layer->etaPartitions()[iP]->id().roll() -1;
368  const GlobalPoint centralGP(layer->etaPartitions()[iP]->position());
369  tofs[mapLayIDX][mapPartIDX] = (centralGP.mag() / (CLHEP::c_light/CLHEP::cm)); //speed of light [cm/ns]
370  LogDebug("ME0ReDigiProducer::fillCentralTOFs()") << "["<<mapLayIDX<<"]["<<mapPartIDX<<"]="<< tofs[mapLayIDX][mapPartIDX] <<" "<<std::endl;
371  }
372  }
373 }
374 int ME0ReDigiProducer::getCustomStripProperties(const ME0DetId& detId,const ME0DigiPreReco* inDigi, float& tof,int& strip, LocalPoint& digiLocalPoint, LocalError& digiLocalError ) const {
375  const unsigned int partIdx = tempGeo->findEtaPartition(inDigi->y());
376  LogTrace("ME0ReDigiProducer::buildDigis") << partIdx <<" ";
377  const float partMeanTof = tempGeo->getCentralTOF(detId,partIdx);
378 
379  //convert to relative to partition
380  tof -= partMeanTof;
381 
382  //get coordinates and errors
383  const float partCenter = tempGeo->getPartCenter(partIdx);
384  const auto* topo = tempGeo->getTopo(partIdx);
385 
386  //find channel
387  const LocalPoint partLocalPoint(inDigi->x(), inDigi->y() - partCenter ,0.);
388  strip = topo->channel(partLocalPoint);
389  const float stripF = float(strip)+0.5;
390 
391  //get digitized location
392  LocalPoint digiPartLocalPoint = topo->localPosition(stripF);
393  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.
394  digiLocalPoint = LocalPoint(digiPartLocalPoint.x(),digiPartLocalPoint.y() + partCenter,0.0);
395  return partIdx;
396 
397 
398 }
399 void ME0ReDigiProducer::getStripProperties(const ME0EtaPartition* etaPart, const ME0DigiPreReco* inDigi, float& tof,int& strip, LocalPoint& digiLocalPoint, LocalError& digiLocalError) const {
400  //convert to relative to partition
401  tof -= tofs[etaPart->id().layer()-1][etaPart->id().roll() -1];
402 
403  const TrapezoidalStripTopology * origTopo = (const TrapezoidalStripTopology*)(&etaPart->specificTopology());
404  TrapezoidalStripTopology padTopo(origTopo->nstrips()/2,origTopo->pitch()*2,origTopo->stripLength(),origTopo->radius());
405  const auto & topo = usePads ? padTopo : etaPart->specificTopology();
406 
407  //find channel
408  const LocalPoint partLocalPoint(inDigi->x(), inDigi->y(),0.);
409  strip = topo.channel(partLocalPoint);
410  const float stripF = float(strip)+0.5;
411 
412  //get digitized location
413  digiLocalPoint = topo.localPosition(stripF);
414  digiLocalError = topo.localError(stripF, 1./sqrt(12.));
415 }
416 
417 unsigned int ME0ReDigiProducer::fillDigiMap(ChamberDigiMap& chDigiMap, unsigned int bx, unsigned int part, unsigned int strip, unsigned int currentIDX) const {
418  DigiIndicies newIDX(bx,part,strip);
419  auto it1 = chDigiMap.find(newIDX);
420  if (it1 == chDigiMap.end()){
421  chDigiMap[newIDX] = currentIDX;
422  return -1;
423  }
424  return it1->second;
425 }
426 
#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:460
edm::EDGetTokenT< ME0DigiPreRecoCollection > token
void buildDigis(const ME0DigiPreRecoCollection &, ME0DigiPreRecoCollection &, ME0DigiPreRecoMap &, CLHEP::HepRandomEngine *engine)
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
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
float stripLength() const override
det heigth (strip length in the middle)
static const std::string B
#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:55
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
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