CMS 3D CMS Logo

DTDigitizer.cc
Go to the documentation of this file.
1 
6 // system include files
7 #include <memory>
8 
9 // C++ headers
10 #include <cmath>
11 
12 // Random generator
15 #include <CLHEP/Random/RandFlat.h>
16 #include <CLHEP/Random/RandGaussQ.h>
17 
18 // Framework
27 
28 // Geometry
33 
35 
36 // Magnetic Field
39 
40 // Digis
44 
45 // DTDigitizer
48 
51 
52 // namespaces
53 using namespace edm;
54 using namespace std;
55 
56 // Constructor
58  : // Sync Algo
59  theSync{DTDigiSyncFactory::get()->create(conf_.getParameter<string>("SyncName"),
60  conf_.getParameter<ParameterSet>("pset"))} {
61  // Set verbose output
62  debug = conf_.getUntrackedParameter<bool>("debug");
63 
64  if (debug)
65  LogPrint("DTDigitizer") << "Creating a DTDigitizer" << endl;
66 
67  // register the Producer with a label
68  // produces<DTDigiCollection>("MuonDTDigis"); // FIXME: Do I pass it by
69  // ParameterSet?
70  produces<DTDigiCollection>(); // FIXME: Do I pass it by ParameterSet?
71  // produces<DTDigiSimLinkCollection>("MuonDTDigiSimLinks");
72  produces<DTDigiSimLinkCollection>();
73 
74  // Parameters:
75 
76  // build digis only for mu hits (for debug purposes)
77  onlyMuHits = conf_.getParameter<bool>("onlyMuHits");
78 
79  // interpolate parametrization function
80  interpolate = conf_.getParameter<bool>("interpolate");
81 
82  // Velocity of signal propagation along the wire (cm/ns)
83  // For the default value
84  // cfr. CMS-IN 2000-021: (2.56+-0.17)x1e8 m/s
85  // CMS NOTE 2003-17: (0.244) m/ns
86  vPropWire = conf_.getParameter<double>("vPropWire"); // 24.4
87 
88  // Dead time for signals on the same wire (number from M. Pegoraro)
89  deadTime = conf_.getParameter<double>("deadTime"); // 150
90 
91  // further configurable smearing
92  smearing = conf_.getParameter<double>("Smearing"); // 3.
93 
94  // Debug flag to switch to the Ideal model
95  // it uses a constant drift velocity and doesn't set any external delay
96  IdealModel = conf_.getParameter<bool>("IdealModel");
97 
98  // Flag to specify that we want digis in phase-2 units (25./30. ns)
99  // instead that the old units (25./32.)
100  if (conf_.getParameter<bool>("phase2Digis"))
101  base = 30;
102  else
103  base = 32;
104 
105  // Constant drift velocity needed by the above flag
106  if (IdealModel)
107  theConstVDrift = conf_.getParameter<double>("IdealModelConstantDriftVelocity"); // 55 um/ns
108  else
109  theConstVDrift = 55.;
110 
111  // get random engine
113  if (!rng.isAvailable()) {
114  throw cms::Exception("Configuration") << "RandomNumberGeneratorService for DTDigitizer missing in cfg file";
115  }
116 
117  // MultipleLinks=false ==> one-to-one correspondence between digis and SimHits
118  MultipleLinks = conf_.getParameter<bool>("MultipleLinks");
119  // MultipleLinks=true ==> association of SimHits within a time window
120  // LinksTimeWindow (of the order of the resolution)
121  LinksTimeWindow = conf_.getParameter<double>("LinksTimeWindow"); // (10 ns)
122 
123  // Name of Collection used for create the XF
124  mix_ = conf_.getParameter<std::string>("mixLabel");
125  collection_for_XF = conf_.getParameter<std::string>("InputCollection");
126  cf_token = consumes<CrossingFrame<PSimHit>>(edm::InputTag(mix_, collection_for_XF));
127 
128  // String to choice between ideal (the deafult) and (mis)aligned geometry for
129  // the digitization step
130  geometryType = conf_.getParameter<std::string>("GeometryType");
131 }
132 
133 // method called to produce the data
136  CLHEP::HepRandomEngine *engine = &rng->getEngine(iEvent.streamID());
137 
138  if (debug)
139  LogPrint("DTDigitizer") << "--- Run: " << iEvent.id().run() << " Event: " << iEvent.id().event() << endl;
140 
141  //************ 1 ***************
142  // create the container for the SimHits
143  // Handle<PSimHitContainer> simHits;
144  // iEvent.getByLabel("g4SimHits","MuonDTHits",simHits);
145 
146  // use MixCollection instead of the previous
148  iEvent.getByToken(cf_token, xFrame);
149 
150  unique_ptr<MixCollection<PSimHit>> simHits(new MixCollection<PSimHit>(xFrame.product()));
151 
152  // create the pointer to the Digi container
153  unique_ptr<DTDigiCollection> output(new DTDigiCollection());
154  // pointer to the DigiSimLink container
155  unique_ptr<DTDigiSimLinkCollection> outputLinks(new DTDigiSimLinkCollection());
156 
157  // Muon Geometry
158  ESHandle<DTGeometry> muonGeom;
159  iSetup.get<MuonGeometryRecord>().get(geometryType, muonGeom);
160 
161  // Magnetic Field
162  ESHandle<MagneticField> magnField;
163  iSetup.get<IdealMagneticFieldRecord>().get(magnField);
164 
165  //************ 2 ***************
166 
167  // These are sorted by DetId, i.e. by layer and then by wire #
168  // map<DTDetId, vector<const PSimHit*> > wireMap;
169  DTWireIdMap wireMap;
170 
171  for (MixCollection<PSimHit>::MixItr simHit = simHits->begin(); simHit != simHits->end(); simHit++) {
172  // Create the id of the wire, the simHits in the DT known also the wireId
173 
174  DTWireId wireId((*simHit).detUnitId());
175  // Fill the map
176  wireMap[wireId].push_back(&(*simHit));
177  }
178 
179  pair<float, bool> time(0., false);
180 
181  //************ 3 ***************
182  // Loop over the wires
183  for (DTWireIdMapConstIter wire = wireMap.begin(); wire != wireMap.end(); wire++) {
184  // SimHit Container associated to the wire
185  const vector<const PSimHit *> &vhit = (*wire).second;
186  if (!vhit.empty()) {
187  TDContainer tdCont; // It is a vector<pair<const PSimHit*,float> >;
188 
189  //************ 4 ***************
190  DTWireId wireId = (*wire).first;
191 
192  // const DTLayer* layer = dynamic_cast< const DTLayer* >
193  // (muonGeom->idToDet(wireId.layerId()));
194  const DTLayer *layer = muonGeom->layer(wireId.layerId());
195 
196  // Loop on the hits of this wire
197  for (vector<const PSimHit *>::const_iterator hit = vhit.begin(); hit != vhit.end(); hit++) {
198  //************ 5 ***************
199  LocalPoint locPos = (*hit)->localPosition();
200 
201  const LocalVector BLoc = layer->surface().toLocal(magnField->inTesla(layer->surface().toGlobal(locPos)));
202 
203  time = computeTime(layer, wireId, *hit, BLoc, engine);
204 
205  //************ 6 ***************
206  if (time.second) {
207  tdCont.push_back(make_pair((*hit), time.first));
208  } else {
209  if (debug)
210  LogPrint("DTDigitizer") << "hit discarded" << endl;
211  }
212  }
213 
214  //************ 7 ***************
215 
216  // the loading must be done by layer but
217  // the digitization must be done by wire (in order to take into account
218  // the dead time)
219 
220  storeDigis(wireId, tdCont, *output, *outputLinks);
221  }
222  }
223 
224  //************ 8 ***************
225  // Load the Digi Container in the Event
226  // iEvent.put(std::move(output),"MuonDTDigis");
227  iEvent.put(std::move(output));
228  iEvent.put(std::move(outputLinks));
229 }
230 
231 pair<float, bool> DTDigitizer::computeTime(const DTLayer *layer,
232  const DTWireId &wireId,
233  const PSimHit *hit,
234  const LocalVector &BLoc,
235  CLHEP::HepRandomEngine *engine) {
236  LocalPoint entryP = hit->entryPoint();
237  LocalPoint exitP = hit->exitPoint();
238  int partType = hit->particleType();
239 
240  const DTTopology &topo = layer->specificTopology();
241 
242  // Pay attention: in CMSSW the rf of the SimHit is in the layer's rf
243 
244  if (debug)
245  LogPrint("DTDigitizer") << "Hit local entry point: " << entryP << endl << "Hit local exit point: " << exitP << endl;
246 
247  float xwire = topo.wirePosition(wireId.wire());
248  float xEntry = entryP.x() - xwire;
249  float xExit = exitP.x() - xwire;
250 
251  if (debug)
252  LogPrint("DTDigitizer") << "wire position: " << xwire << " x entry in cell rf: " << xEntry
253  << " x exit in cell rf: " << xExit << endl;
254 
255  DTTopology::Side entrySide = topo.onWhichBorder(xEntry, entryP.y(), entryP.z());
256  DTTopology::Side exitSide = topo.onWhichBorder(xExit, exitP.y(), exitP.z());
257 
258  if (debug)
259  dumpHit(hit, xEntry, xExit, topo);
260 
261  // The bolean is used to flag the drift time computation
262  pair<float, bool> driftTime(0., false);
263 
264  // if delta in gas->ignore, since it is included in the parametrisation.
265  // FIXME: should check that it is actually a delta ray produced by a nearby
266  // muon hit.
267 
268  if (partType == 11 && entrySide == DTTopology::none) {
269  if (debug)
270  LogPrint("DTDigitizer") << " e- hit in gas; discarding " << endl;
271  return driftTime;
272  }
273 
274  float By = BLoc.y();
275  float Bz = BLoc.z();
276 
277  // Radius and sagitta according to direction of momentum
278  // (just for printing)
279  // NOTE: in cmsim, d is always taken // pHat!
280  LocalVector d = (exitP - entryP);
281  LocalVector pHat = hit->localDirection().unit();
282  LocalVector hHat = (d.cross(pHat.cross(d))).unit();
283  float cosAlpha = hHat.dot(pHat);
284  float sinAlpha = sqrt(1. - cosAlpha * cosAlpha);
285  float radius_P = (d.mag()) / (2. * cosAlpha);
286  float sagitta_P = radius_P * (1. - sinAlpha);
287 
288  // Radius, sagitta according to field bending
289  // (just for printing)
290  float halfd = d.mag() / 2.;
291  float BMag = BLoc.mag();
292  LocalVector pT = (pHat - (BLoc.unit() * pHat.dot(BLoc.unit()))) * (hit->pabs());
293  float radius_B = (pT.mag() / (0.3 * BMag)) * 100.;
294  float sagitta_B;
295  if (radius_B > halfd) {
296  sagitta_B = radius_B - sqrt(radius_B * radius_B - halfd * halfd);
297  } else {
298  sagitta_B = radius_B;
299  }
300 
301  // cos(delta), delta= angle between direction at entry and hit segment
302  // (just for printing)
303  float delta = pHat.dot(d.unit());
304  if (debug)
305  LogPrint("DTDigitizer") << " delta = " << delta << endl
306  << " cosAlpha = " << cosAlpha << endl
307  << " sinAlpha = " << sinAlpha << endl
308  << " pMag = " << pT.mag() << endl
309  << " bMag = " << BMag << endl
310  << " pT = " << pT << endl
311  << " halfd = " << halfd << endl
312  << " radius_P (cm) = " << radius_P << endl
313  << " sagitta_P (um) = " << sagitta_P * 10000. << endl
314  << " radius_B (cm) = " << radius_B << endl
315  << " sagitta_B (um) = " << sagitta_B * 10000. << endl;
316 
317  // Select cases where parametrization can not be used.
318  bool noParametrisation = ((entrySide == DTTopology::none || exitSide == DTTopology::none) // case # 2,3,8,9 or 11
319  || (entrySide == exitSide) // case # 4 or 10
320  || ((entrySide == DTTopology::xMin && exitSide == DTTopology::xMax) ||
321  (entrySide == DTTopology::xMax && exitSide == DTTopology::xMin)) // Hit is case # 7
322  );
323 
324  // FIXME: now, debug warning only; consider treating those
325  // with TM algo.
326  if (delta < 0.99996 // Track is not straight. FIXME: use sagitta?
327  && (noParametrisation == false)) {
328  if (debug)
329  LogPrint("DTDigitizer") << "*** WARNING: hit is not straight, type = " << partType << endl;
330  }
331 
332  //************ 5A ***************
333 
334  if (!noParametrisation) {
335  LocalVector dir = hit->momentumAtEntry(); // ex Measurement3DVector dir =
336  // hit->measurementDirection(); //FIXME?
337  float theta = atan(dir.x() / -dir.z()) * 180 / M_PI;
338 
339  // FIXME: use dir if M.S. is included as GARFIELD option...
340  // otherwise use hit segment dirction.
341  // LocalVector dir0 = (exitP-entryP).unit();
342  // float theta = atan(dir0.x()/-dir0.z())*180/M_PI;
343  float x;
344 
345  Local3DPoint pt = hit->localPosition(); // ex Measurement3DPoint pt =
346  // hit->measurementPosition(); // FIXME?
347 
348  if (fabs(pt.z()) < 0.002) {
349  // hit center within 20 um from z=0, no need to extrapolate.
350  x = pt.x() - xwire;
351  } else {
352  x = xEntry - (entryP.z() * (xExit - xEntry)) / (exitP.z() - entryP.z());
353  }
354 
355  if (IdealModel)
356  return make_pair(fabs(x) / theConstVDrift, true);
357  else
358  driftTime = driftTimeFromParametrization(x, theta, By, Bz, engine);
359  }
360 
361  if ((driftTime.second) == false) {
362  // Parametrisation not applicable, or failed. Use time map.
363  driftTime = driftTimeFromTimeMap();
364  }
365 
366  //************ 5B ***************
367 
368  // Signal propagation, TOF etc.
369  if (driftTime.second) {
370  driftTime.first += externalDelays(layer, wireId, hit);
371  }
372  return driftTime;
373 }
374 
375 //************ 5A ***************
376 
378  float x, float theta, float By, float Bz, CLHEP::HepRandomEngine *engine) const {
379  // Convert from CMSSW frame/units r.f. to parametrization ones.
380  x *= 10.; // cm -> mm
381 
382  // FIXME: Current parametrisation can extrapolate above 21 mm,
383  // however a detailed study is needed before using this.
384  if (fabs(x) > 21.) {
385  if (debug)
386  LogPrint("DTDigitizer") << "*** WARNING: parametrisation: x out of range = " << x << ", skipping" << endl;
387  return pair<float, bool>(0.f, false);
388  }
389 
390  // Different r.f. of the parametrization:
391  // X_par = X_ORCA; Y_par=Z_ORCA; Z_par = -Y_ORCA
392 
393  float By_par = Bz; // Bnorm
394  float Bz_par = -By; // Bwire
395  float theta_par = theta;
396 
397  // Parametrisation uses interpolation up to |theta|=45 deg,
398  // |Bwire|=0.4, |Bnorm|=0.75; extrapolation above.
399  if (fabs(theta_par) > 45.) {
400  if (debug)
401  LogPrint("DTDigitizer") << "*** WARNING: extrapolating theta > 45: " << theta << endl;
402  // theta_par = min(fabs(theta_par),45.f)*((theta_par<0.)?-1.:1.);
403  }
404  if (fabs(By_par) > 0.75) {
405  if (debug)
406  LogPrint("DTDigitizer") << "*** WARNING: extrapolating Bnorm > 0.75: " << By_par << endl;
407  // By_par = min(fabs(By_par),0.75f)*((By_par<0.)?-1.:1.);
408  }
409  if (fabs(Bz_par) > 0.4) {
410  if (debug)
411  LogPrint("DTDigitizer") << "*** WARNING: extrapolating Bwire >0.4: " << Bz_par << endl;
412  // Bz_par = min(fabs(Bz_par),0.4)*((Bz_par<0.)?-1.:1.);
413  }
414 
416  static const DTDriftTimeParametrization par;
417  unsigned short flag = par.MB_DT_drift_time(x, theta_par, By_par, Bz_par, 0, &DT, interpolate);
418 
419  if (debug) {
420  LogPrint("DTDigitizer") << " Parametrisation: x, theta, Bnorm, Bwire = " << x << " " << theta_par << " "
421  << By_par << " " << Bz_par << endl
422  << " time=" << DT.t_drift << " sigma_m=" << DT.t_width_m << " sigma_p=" << DT.t_width_p
423  << endl;
424  if (flag != 1) {
425  LogPrint("DTDigitizer") << "*** WARNING: call to parametrisation failed" << endl;
426  return pair<float, bool>(0.f, false);
427  }
428  }
429 
430  // Double half-gaussian smearing
431  float time = asymGausSmear(DT.t_drift, DT.t_width_m, DT.t_width_p, engine);
432 
433  // Do not allow the smearing to lead to negative values
434  time = max(time, 0.f);
435 
436  // Apply a Gaussian smearing to account for electronic effects (cf. 2004 TB
437  // analysis) The width of the Gaussian can be configured with the "Smearing"
438  // parameter
439 
440  double u = CLHEP::RandGaussQ::shoot(engine, 0., smearing);
441  time += u;
442 
443  if (debug)
444  LogPrint("DTDigitizer") << " drift time = " << time << endl;
445 
446  return pair<float, bool>(time, true);
447 }
448 
450  double sigmaLeft,
451  double sigmaRight,
452  CLHEP::HepRandomEngine *engine) const {
453  double f = sigmaLeft / (sigmaLeft + sigmaRight);
454  double t;
455 
456  if (CLHEP::RandFlat::shoot(engine) <= f) {
457  t = CLHEP::RandGaussQ::shoot(engine, mean, sigmaLeft);
458  t = mean - fabs(t - mean);
459  } else {
460  t = CLHEP::RandGaussQ::shoot(engine, mean, sigmaRight);
461  t = mean + fabs(t - mean);
462  }
463  return static_cast<float>(t);
464 }
465 
466 pair<float, bool> DTDigitizer::driftTimeFromTimeMap() const {
467  // FIXME: not yet implemented.
468  if (debug)
469  LogPrint("DTDigitizer") << " TimeMap " << endl;
470  return pair<float, bool>(0., false);
471 }
472 
473 //************ 5B ***************
474 
475 float DTDigitizer::externalDelays(const DTLayer *layer, const DTWireId &wireId, const PSimHit *hit) const {
476  // Time of signal propagation along wire.
477 
478  float wireCoord = hit->localPosition().y();
479  float halfL = (layer->specificTopology().cellLenght()) / 2.;
480  float propgL = halfL - wireCoord; // the FE is always located at the pos coord.
481 
482  float propDelay = propgL / vPropWire;
483 
484  // Real TOF.
485  float tof = hit->tof();
486 
487  // Delays and t0 according to theSync
488 
489  double sync = theSync->digitizerOffset(&wireId, layer);
490 
491  if (debug) {
492  LogPrint("DTDigitizer") << " propDelay =" << propDelay << "; TOF=" << tof << "; sync= " << sync << endl;
493  }
494 
495  return propDelay + tof + sync;
496 }
497 
498 // accumulate digis by layer
499 
501  TDContainer &hits,
503  DTDigiSimLinkCollection &outputLinks) {
504  //************ 7A ***************
505 
506  // sort signal times
507  sort(hits.begin(), hits.end(), hitLessT());
508 
509  //************ 7B ***************
510 
511  float wakeTime = -999999.0;
512  float resolTime = -999999.0;
513  int digiN = -1; // Digi identifier within the cell (for multiple digis)
514  DTDigi digi;
515 
516  // loop over signal times and drop signals inside dead time
517  for (TDContainer::const_iterator hit = hits.begin(); hit != hits.end(); hit++) {
518  if (onlyMuHits && abs((*hit).first->particleType()) != 13)
519  continue;
520 
521  //************ 7C ***************
522 
523  float time = (*hit).second;
524  if (time > wakeTime) {
525  // Note that digi is constructed with a float value (in ns)
526  int wireN = wireId.wire();
527  digiN++;
528  digi = DTDigi(wireN, time, digiN, base);
529 
530  // Add association between THIS digi and the corresponding SimTrack
531  unsigned int SimTrackId = (*hit).first->trackId();
532  EncodedEventId evId = (*hit).first->eventId();
533  DTDigiSimLink digisimLink(wireN, digiN, time, SimTrackId, evId, base);
534 
535  if (debug) {
536  LogPrint("DTDigitizer") << endl << "---- DTDigitizer ----" << endl;
537  LogPrint("DTDigitizer") << "wireId: " << wireId << endl;
538  LogPrint("DTDigitizer") << "sim. time = " << time << endl;
539  LogPrint("DTDigitizer") << "digi number = " << digi.number() << ", digi time = " << digi.time()
540  << ", linked to SimTrack Id = " << SimTrackId << endl;
541  }
542 
543  //************ 7D ***************
544  DTLayerId layerID = wireId.layerId(); // taking the layer of the wire
545  output.insertDigi(layerID, digi); // ordering Digis by layer
546  outputLinks.insertDigi(layerID, digisimLink);
547  wakeTime = time + deadTime;
548  resolTime = time + LinksTimeWindow;
549  } else if (MultipleLinks && time < resolTime) {
550  int wireN = wireId.wire();
551  unsigned int SimTrackId = (*hit).first->trackId();
552  EncodedEventId evId = (*hit).first->eventId();
553  DTDigiSimLink digisimLink(wireN, digiN, time, SimTrackId, evId, base);
554  DTLayerId layerID = wireId.layerId();
555  outputLinks.insertDigi(layerID, digisimLink);
556 
557  if (debug) {
558  LogPrint("DTDigitizer") << "\nAdded multiple link: \n"
559  << "digi number = " << digi.number() << ", digi time = " << digi.time()
560  << " (sim. time = " << time << ")"
561  << ", linked to SimTrack Id = " << SimTrackId << endl;
562  }
563  }
564  }
565 }
566 
567 void DTDigitizer::dumpHit(const PSimHit *hit, float xEntry, float xExit, const DTTopology &topo) {
568  LocalPoint entryP = hit->entryPoint();
569  LocalPoint exitP = hit->exitPoint();
570 
571  DTTopology::Side entrySide = topo.onWhichBorder(xEntry, entryP.y(), entryP.z());
572  DTTopology::Side exitSide = topo.onWhichBorder(xExit, exitP.y(), exitP.z());
573  // ProcessTypeEnumerator pTypes;
574 
575  LogPrint("DTDigitizer") << endl
576  << "------- SimHit: " << endl
577  << " Particle type = " << hit->particleType() << endl
578  << " process type = " << hit->processType() << endl
579  << " process type = " << hit->processType()
580  << endl
581  // << " packedTrackId = " << hit->packedTrackId() << endl
582  << " trackId = " << hit->trackId()
583  << endl // new,is the same as the
584  // previous?? FIXME-Check
585  << " |p| = " << hit->pabs() << endl
586  << " Energy loss = " << hit->energyLoss()
587  << endl
588  // << " timeOffset = " << hit->timeOffset() << endl
589  // << " measurementPosition = " << hit->measurementPosition() << endl
590  // << " measurementDirection = " << hit->measurementDirection() << endl
591  // //FIXME
592  << " localDirection = " << hit->momentumAtEntry().unit()
593  << endl // FIXME is it a versor?
594  << " Entry point = " << entryP << " cell x = " << xEntry << endl
595  << " Exit point = " << exitP << " cell x = " << xExit << endl
596  << " DR = = " << (exitP - entryP).mag() << endl
597  << " Dx = = " << (exitP - entryP).x() << endl
598  << " Cell w,h,l = (" << topo.cellWidth() << " , " << topo.cellHeight() << " , "
599  << topo.cellLenght() << ") cm" << endl
600  << " DY entry from edge = " << topo.cellLenght() / 2. - fabs(entryP.y())
601  << " DY exit from edge = " << topo.cellLenght() / 2. - fabs(exitP.y())
602  << " entrySide = " << (int)entrySide << " ; exitSide = " << (int)exitSide << endl;
603 }
Vector3DBase< float, LocalTag >
DTDriftTimeParametrization::MB_DT_drift_time
unsigned short MB_DT_drift_time(double x, double alpha, double by, double bz, short ifl, drift_time *DT, short interpolate) const
Calculate drift time and spread.
Definition: DTDriftTimeParametrization.cc:32
DTDigitizer::MultipleLinks
bool MultipleLinks
Definition: DTDigitizer.h:123
DTDigitizer::theConstVDrift
float theConstVDrift
Definition: DTDigitizer.h:120
edm::RandomNumberGenerator::getEngine
virtual CLHEP::HepRandomEngine & getEngine(StreamID const &)=0
Use this engine in event methods.
Handle.h
DTWireId::wire
int wire() const
Return the wire number.
Definition: DTWireId.h:42
MagneticField::inTesla
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
muonDTDigis_cfi.MultipleLinks
MultipleLinks
Definition: muonDTDigis_cfi.py:14
DTTopology::xMax
Definition: DTTopology.h:89
DTDigitizer::DTWireIdMap
std::map< DTWireId, std::vector< const PSimHit * > > DTWireIdMap
Definition: DTDigitizer.h:56
MessageLogger.h
SiStripPI::mean
Definition: SiStripPayloadInspectorHelper.h:169
edm::Handle::product
T const * product() const
Definition: Handle.h:70
hfClusterShapes_cfi.hits
hits
Definition: hfClusterShapes_cfi.py:5
hit::y
double y
Definition: SiStripHitEffFromCalibTree.cc:90
ESHandle.h
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
DiDispStaMuonMonitor_cfi.pt
pt
Definition: DiDispStaMuonMonitor_cfi.py:39
convertSQLitetoXML_cfg.output
output
Definition: convertSQLitetoXML_cfg.py:32
DTLayerId.h
edm
HLT enums.
Definition: AlignableModifier.h:19
RandomNumberGenerator.h
DTDigi::number
int number() const
Identifies different digis within the same cell.
Definition: DTDigi.cc:43
MuonDigiCollection
A container for a generic type of digis indexed by some index, implemented with a map<IndexType,...
Definition: MuonDigiCollection.h:87
DTDigitizer::dumpHit
void dumpHit(const PSimHit *hit, float xEntry, float xExit, const DTTopology &topo)
Definition: DTDigitizer.cc:567
DTDigitizer::driftTimeFromParametrization
std::pair< float, bool > driftTimeFromParametrization(float x, float alpha, float By, float Bz, CLHEP::HepRandomEngine *) const
Definition: DTDigitizer.cc:377
FastTrackerRecHitCombiner_cfi.simHits
simHits
Definition: FastTrackerRecHitCombiner_cfi.py:5
DTDigiCollection
MuonDigiCollection< DTLayerId, DTDigi > DTDigiCollection
Definition: DTDigiCollection.h:15
DTDriftTimeParametrization
Definition: DTDriftTimeParametrization.h:25
DTTopology::Side
Side
Sides of the cell.
Definition: DTTopology.h:89
DDAxes::x
edm::Handle
Definition: AssociativeIterator.h:50
DTDigi::time
double time() const
Get time in ns.
Definition: DTDigi.cc:37
edm::Service::isAvailable
bool isAvailable() const
Definition: Service.h:40
MixCollection::MixItr
Definition: MixCollection.h:62
DTDigitizer::LinksTimeWindow
float LinksTimeWindow
Definition: DTDigitizer.h:124
DTTopology::cellWidth
float cellWidth() const
Returns the cell width.
Definition: DTTopology.h:69
DTTopology
Definition: DTTopology.h:28
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
EncodedEventId
Definition: EncodedEventId.h:11
IdealMagneticFieldRecord
Definition: IdealMagneticFieldRecord.h:11
GeomDet::surface
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
DTTopology::wirePosition
float wirePosition(int wireNumber) const
Returns the x position in the layer of a given wire number.
Definition: DTTopology.cc:59
hgcalDigitizer_cfi.geometryType
geometryType
Definition: hgcalDigitizer_cfi.py:78
debug
#define debug
Definition: HDRShower.cc:19
Vector3DBase::unit
Vector3DBase unit() const
Definition: Vector3DBase.h:54
edm::EventSetup::get
T get() const
Definition: EventSetup.h:73
DTWireId
Definition: DTWireId.h:12
MixCollection
Definition: MixCollection.h:11
DTDriftTimeParametrization::drift_time
Structure used to return output values.
Definition: DTDriftTimeParametrization.h:34
Service.h
rpcPointValidation_cfi.simHit
simHit
Definition: rpcPointValidation_cfi.py:24
PVValHelper::pT
Definition: PVValidationHelpers.h:70
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
vertices_cff.x
x
Definition: vertices_cff.py:29
DTDigitizer::IdealModel
bool IdealModel
Definition: DTDigitizer.h:119
Surface::toGlobal
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:79
IdealMagneticFieldRecord.h
edm::ESHandle< DTGeometry >
muonDTDigis_cfi.LinksTimeWindow
LinksTimeWindow
Definition: muonDTDigis_cfi.py:34
theta
Geom::Theta< T > theta() const
Definition: Basic3DVectorLD.h:150
DigiDM_cff.onlyMuHits
onlyMuHits
Definition: DigiDM_cff.py:37
Point3DBase< float, LocalTag >
DTDigitizer::base
int base
Definition: DTDigitizer.h:111
OrderedSet.t
t
Definition: OrderedSet.py:90
DTDigitizer::cf_token
edm::EDGetTokenT< CrossingFrame< PSimHit > > cf_token
Definition: DTDigitizer.h:130
DTTopology::onWhichBorder
Side onWhichBorder(float x, float y, float z) const
Definition: DTTopology.cc:78
DTLayerId
Definition: DTLayerId.h:12
DTLayer.h
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
DTGeometry.h
DTTopology::cellLenght
float cellLenght() const
Definition: DTTopology.h:74
DTDigiSyncFactory.h
DTDigitizer::interpolate
bool interpolate
Definition: DTDigitizer.h:109
GeomDetEnumerators::DT
Definition: GeomDetEnumerators.h:18
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
DTGeometry::layer
const DTLayer * layer(const DTLayerId &id) const
Return a layer given its id.
Definition: DTGeometry.cc:96
Event.h
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
DTDigitizer::storeDigis
void storeDigis(DTWireId &wireId, TDContainer &hits, DTDigiCollection &output, DTDigiSimLinkCollection &outputLinks)
Definition: DTDigitizer.cc:500
DTDigitizer::DTDigitizer
DTDigitizer(const edm::ParameterSet &)
Definition: DTDigitizer.cc:57
DTDigiCollection
dumpMFGeometry_cfg.delta
delta
Definition: dumpMFGeometry_cfg.py:25
DTDigitizer::debug
bool debug
Definition: DTDigitizer.h:108
DTDigitizer::smearing
float smearing
Definition: DTDigitizer.h:107
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
DTDigitizer::asymGausSmear
float asymGausSmear(double mean, double sigmaLeft, double sigmaRight, CLHEP::HepRandomEngine *) const
Definition: DTDigitizer.cc:449
edm::Service< edm::RandomNumberGenerator >
createfilelist.int
int
Definition: createfilelist.py:10
iEvent
int iEvent
Definition: GenABIO.cc:224
DTDriftTimeParametrization.h
DTDigitizer::DTWireIdMapConstIter
DTWireIdMap::const_iterator DTWireIdMapConstIter
Definition: DTDigitizer.h:58
M_PI
#define M_PI
Definition: BXVectorInputProducer.cc:50
Vector3DBase::cross
Vector3DBase< typename PreciseFloatType< T, U >::Type, FrameTag > cross(const Vector3DBase< U, FrameTag > &v) const
Definition: Vector3DBase.h:110
edm::LogPrint
Definition: MessageLogger.h:342
DTDigitizer::vPropWire
double vPropWire
Definition: DTDigitizer.h:105
HiCaloJetParameters_cff.interpolate
interpolate
Definition: HiCaloJetParameters_cff.py:34
MagneticField.h
edm::EventSetup
Definition: EventSetup.h:57
muonDTDigis_cfi.IdealModel
IdealModel
Definition: muonDTDigis_cfi.py:33
DTDigiSyncBase.h
get
#define get
DTTopology::none
Definition: DTTopology.h:89
DTDigitizer::theSync
std::unique_ptr< DTDigiSyncBase > theSync
Definition: DTDigitizer.h:114
Vector3DBase::dot
PreciseFloatType< T, U >::Type dot(const Vector3DBase< U, FrameTag > &v) const
Definition: Vector3DBase.h:99
DTLayer
Definition: DTLayer.h:25
DTTopology::cellHeight
float cellHeight() const
Returns the cell height.
Definition: DTTopology.h:71
PV3DBase::mag
T mag() const
Definition: PV3DBase.h:64
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
DTDigitizer::deadTime
float deadTime
Definition: DTDigitizer.h:106
DTDigitizer::hitLessT
Definition: DTDigitizer.h:61
mag
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
Definition: Basic3DVectorLD.h:127
DTDigitizer.h
muonDTDigis_cfi.deadTime
deadTime
Definition: muonDTDigis_cfi.py:21
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
DTDigiSimLinkCollection
MuonDigiCollection< DTLayerId, DTDigiSimLink > DTDigiSimLinkCollection
Definition: DTDigiSimLinkCollection.h:8
dtTriggerSynchTask_cfi.vPropWire
vPropWire
Definition: dtTriggerSynchTask_cfi.py:17
DTWireId.h
Frameworkfwd.h
LocalPoint.h
GloballyPositioned::toLocal
LocalPoint toLocal(const GlobalPoint &gp) const
Definition: GloballyPositioned.h:98
Exception
Definition: hltDiff.cc:246
DTDigitizer::TDContainer
std::vector< hitAndT > TDContainer
Definition: DTDigitizer.h:54
DTDigitizer::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: DTDigitizer.cc:134
MuonDigiCollection::insertDigi
void insertDigi(const IndexType &index, const DigiType &digi)
insert a digi for a given DetUnit
Definition: MuonDigiCollection.h:98
DTDigi
Definition: DTDigi.h:17
EventSetup.h
Exception.h
DTDigitizer::driftTimeFromTimeMap
std::pair< float, bool > driftTimeFromTimeMap() const
Definition: DTDigitizer.cc:466
DTLayer::specificTopology
const DTTopology & specificTopology() const
Definition: DTLayer.cc:37
DTDigitizer::computeTime
std::pair< float, bool > computeTime(const DTLayer *layer, const DTWireId &wireId, const PSimHit *hit, const LocalVector &BLoc, CLHEP::HepRandomEngine *)
Definition: DTDigitizer.cc:231
DTDigitizer::geometryType
std::string geometryType
Definition: DTDigitizer.h:116
DTWireId::layerId
DTLayerId layerId() const
Return the corresponding LayerId.
Definition: DTWireId.h:45
ztail.d
d
Definition: ztail.py:151
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
DTDigiCollection.h
ParameterSet.h
DTDigitizer::onlyMuHits
bool onlyMuHits
Definition: DTDigitizer.h:110
PSimHit
Definition: PSimHit.h:15
MuonGeometryRecord.h
ntuplemaker.time
time
Definition: ntuplemaker.py:310
edm::Event
Definition: Event.h:73
DTTopology.h
newFWLiteAna.base
base
Definition: newFWLiteAna.py:92
DTTopology::xMin
Definition: DTTopology.h:89
MuonGeometryRecord
Definition: MuonGeometryRecord.h:34
hit
Definition: SiStripHitEffFromCalibTree.cc:88
RemoveAddSevLevel.flag
flag
Definition: RemoveAddSevLevel.py:116
DeadROC_duringRun.dir
dir
Definition: DeadROC_duringRun.py:23
DTDigitizer::externalDelays
float externalDelays(const DTLayer *layer, const DTWireId &wireId, const PSimHit *hit) const
Definition: DTDigitizer.cc:475