CMS 3D CMS Logo

DreamSD.cc
Go to the documentation of this file.
1 
2 #include <memory>
3 
14 
15 #include "G4LogicalVolume.hh"
16 #include "G4LogicalVolumeStore.hh"
17 #include "G4Poisson.hh"
18 #include "G4Step.hh"
19 #include "G4Track.hh"
20 #include "G4VProcess.hh"
21 
23 
24 // Histogramming
26 
27 // Cherenkov
30 
31 #include "G4PhysicalConstants.hh"
32 #include "G4SystemOfUnits.hh"
33 
34 #define EDM_ML_DEBUG
35 
36 //________________________________________________________________________________________
38  const edm::EventSetup &es,
39  const SensitiveDetectorCatalog &clg,
40  edm::ParameterSet const &p,
41  const SimTrackManager *manager)
42  : CaloSD(name, es, clg, p, manager) {
43  edm::ParameterSet m_EC = p.getParameter<edm::ParameterSet>("ECalSD");
44  useBirk_ = m_EC.getParameter<bool>("UseBirkLaw");
45  doCherenkov_ = m_EC.getParameter<bool>("doCherenkov");
46  birk1_ = m_EC.getParameter<double>("BirkC1") * (g / (MeV * cm2));
47  birk2_ = m_EC.getParameter<double>("BirkC2");
48  birk3_ = m_EC.getParameter<double>("BirkC3");
49  slopeLY_ = m_EC.getParameter<double>("SlopeLightYield");
50  readBothSide_ = m_EC.getUntrackedParameter<bool>("ReadBothSide", false);
51  dd4hep_ = m_EC.getUntrackedParameter<bool>("DD4Hep", false);
52 
53  chAngleIntegrals_.reset(nullptr);
54 
55  edm::LogVerbatim("EcalSim") << "Constructing a DreamSD with name " << GetName()
56  << "\nDreamSD:: Use of Birks law is set to " << useBirk_
57  << " with three constants kB = " << birk1_ << ", C1 = " << birk2_ << ", C2 = " << birk3_
58  << "\n Slope for Light yield is set to " << slopeLY_
59  << "\n Parameterization of Cherenkov is set to " << doCherenkov_
60  << ", readout both sides is " << readBothSide_ << " and dd4hep flag " << dd4hep_;
61 
62  initMap(name, es);
63 }
64 
65 //________________________________________________________________________________________
66 double DreamSD::getEnergyDeposit(const G4Step *aStep) {
67  // take into account light collection curve for crystals
68  double weight = curve_LY(aStep, side_);
69  if (useBirk_)
71  double edep = aStep->GetTotalEnergyDeposit() * weight;
72 
73  // Get Cerenkov contribution
74  if (doCherenkov_) {
75  edep += cherenkovDeposit_(aStep);
76  }
77 #ifdef EDM_ML_DEBUG
78  edm::LogVerbatim("EcalSim") << "DreamSD:: " << aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName() << " Side "
79  << side_ << " Light Collection Efficiency " << weight << " Weighted Energy Deposit "
80  << edep / CLHEP::MeV << " MeV";
81 #endif
82  return edep;
83 }
84 
85 //________________________________________________________________________________________
87  // Get the material and set properties if needed
88  DimensionMap::const_iterator ite = xtalLMap_.begin();
89  const G4LogicalVolume *lv = (ite->first);
90  G4Material *material = lv->GetMaterial();
91  edm::LogVerbatim("EcalSim") << "DreamSD::initRun: Initializes for material " << material->GetName() << " in "
92  << lv->GetName();
93  materialPropertiesTable_ = material->GetMaterialPropertiesTable();
95  if (!setPbWO2MaterialProperties_(material)) {
96  edm::LogWarning("EcalSim") << "Couldn't retrieve material properties table\n Material = " << material->GetName();
97  }
98  materialPropertiesTable_ = material->GetMaterialPropertiesTable();
99  }
100 }
101 
102 //________________________________________________________________________________________
103 uint32_t DreamSD::setDetUnitId(const G4Step *aStep) {
104  const G4VTouchable *touch = aStep->GetPreStepPoint()->GetTouchable();
105  uint32_t id = (touch->GetReplicaNumber(1)) * 10 + (touch->GetReplicaNumber(0));
106  side_ = readBothSide_ ? -1 : 1;
107  if (side_ < 0) {
108  ++id;
109  }
110 #ifdef EDM_ML_DEBUG
111  edm::LogVerbatim("EcalSim") << "DreamSD:: ID " << id;
112 #endif
113  return id;
114 }
115 
116 //________________________________________________________________________________________
118  if (dd4hep_) {
120  es.get<IdealGeometryRecord>().get(cpv);
121  const cms::DDFilter filter("ReadOutName", sd);
122  cms::DDFilteredView fv((*cpv), filter);
123  while (fv.firstChild()) {
124  std::string name = static_cast<std::string>(dd4hep::dd::noNamespace(fv.name()));
125  std::vector<double> paras(fv.parameters());
126 #ifdef EDM_ML_DEBUG
127  edm::LogVerbatim("EcalSim") << "DreamSD::initMap (for " << sd << "): Solid " << name << " Shape "
128  << cms::dd::name(cms::DDSolidShapeMap, fv.shape()) << " Parameter 0 = " << paras[0];
129 #endif
130  // Set length to be the largest size, width the smallest
131  std::sort(paras.begin(), paras.end());
132  double length = 2.0 * k_ScaleFromDD4HepToG4 * paras.back();
133  double width = 2.0 * k_ScaleFromDD4HepToG4 * paras.front();
134  fillMap(name, length, width);
135  }
136  } else {
138  es.get<IdealGeometryRecord>().get(cpv);
139  DDSpecificsMatchesValueFilter filter{DDValue("ReadOutName", sd, 0)};
140  DDFilteredView fv((*cpv), filter);
141 
142  bool dodet = fv.firstChild();
143  while (dodet) {
144  const DDSolid &sol = fv.logicalPart().solid();
145  std::vector<double> paras(sol.parameters());
146  std::string name = sol.name().name();
147 #ifdef EDM_ML_DEBUG
148  edm::LogVerbatim("EcalSim") << "DreamSD::initMap (for " << sd << "): Solid " << name << " Shape " << sol.shape()
149  << " Parameter 0 = " << paras[0];
150 #endif
151  // Set length to be the largest size, width the smallest
152  std::sort(paras.begin(), paras.end());
153  double length = 2.0 * k_ScaleFromDDDToG4 * paras.back();
154  double width = 2.0 * k_ScaleFromDDDToG4 * paras.front();
155  fillMap(name, length, width);
156  dodet = fv.next();
157  }
158  }
159 #ifdef EDM_ML_DEBUG
160  edm::LogVerbatim("EcalSim") << "DreamSD: Length Table for ReadOutName = " << sd << ":";
161 #endif
162  DimensionMap::const_iterator ite = xtalLMap_.begin();
163  int i = 0;
164  for (; ite != xtalLMap_.end(); ite++, i++) {
165  G4String name = "Unknown";
166  if (ite->first != nullptr)
167  name = (ite->first)->GetName();
168 #ifdef EDM_ML_DEBUG
169  edm::LogVerbatim("EcalSim") << " " << i << " " << ite->first << " " << name << " L = " << ite->second.first
170  << " W = " << ite->second.second;
171 #endif
172  }
173 }
174 
175 //________________________________________________________________________________________
176 void DreamSD::fillMap(const std::string &name, double length, double width) {
177  const G4LogicalVolumeStore *lvs = G4LogicalVolumeStore::GetInstance();
178  std::vector<G4LogicalVolume *>::const_iterator lvcite;
179  G4LogicalVolume *lv = nullptr;
180  for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++) {
181  if ((*lvcite)->GetName() == static_cast<G4String>(name)) {
182  lv = (*lvcite);
183  break;
184  }
185  }
186 #ifdef EDM_ML_DEBUG
187  edm::LogVerbatim("EcalSim") << "DreamSD::fillMap (for " << name << " Logical Volume " << lv << " Length " << length
188  << " Width " << width;
189 #endif
190  xtalLMap_.insert(std::pair<G4LogicalVolume *, Doubles>(lv, Doubles(length, width)));
191 }
192 
193 //________________________________________________________________________________________
194 double DreamSD::curve_LY(const G4Step *aStep, int flag) {
195  auto const stepPoint = aStep->GetPreStepPoint();
196  auto const lv = stepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
197  G4String nameVolume = lv->GetName();
198 
199  double weight = 1.;
200  G4ThreeVector localPoint = setToLocal(stepPoint->GetPosition(), stepPoint->GetTouchable());
201  double crlength = crystalLength(lv);
202  double localz = localPoint.x();
203  double dapd = 0.5 * crlength - flag * localz; // Distance from closest APD
204  if (dapd >= -0.1 || dapd <= crlength + 0.1) {
205  if (dapd <= 100.)
206  weight = 1.0 + slopeLY_ - dapd * 0.01 * slopeLY_;
207  } else {
208  edm::LogWarning("EcalSim") << "DreamSD: light coll curve : wrong distance "
209  << "to APD " << dapd << " crlength = " << crlength << " crystal name = " << nameVolume
210  << " z of localPoint = " << localz << " take weight = " << weight;
211  }
212 #ifdef EDM_ML_DEBUG
213  edm::LogVerbatim("EcalSim") << "DreamSD, light coll curve : " << dapd << " crlength = " << crlength
214  << " crystal name = " << nameVolume << " z of localPoint = " << localz
215  << " take weight = " << weight;
216 #endif
217  return weight;
218 }
219 
220 //________________________________________________________________________________________
221 double DreamSD::crystalLength(G4LogicalVolume *lv) const {
222  double length = -1.;
223  DimensionMap::const_iterator ite = xtalLMap_.find(lv);
224  if (ite != xtalLMap_.end())
225  length = ite->second.first;
226  return length;
227 }
228 
229 //________________________________________________________________________________________
230 double DreamSD::crystalWidth(G4LogicalVolume *lv) const {
231  double width = -1.;
232  DimensionMap::const_iterator ite = xtalLMap_.find(lv);
233  if (ite != xtalLMap_.end())
234  width = ite->second.second;
235  return width;
236 }
237 
238 //________________________________________________________________________________________
239 // Calculate total cherenkov deposit
240 // Inspired by Geant4's Cherenkov implementation
241 double DreamSD::cherenkovDeposit_(const G4Step *aStep) {
242  double cherenkovEnergy = 0;
244  return cherenkovEnergy;
245  G4Material *material = aStep->GetTrack()->GetMaterial();
246 
247  // Retrieve refractive index
248  G4MaterialPropertyVector *Rindex = materialPropertiesTable_->GetProperty("RINDEX");
249  if (Rindex == nullptr) {
250  edm::LogWarning("EcalSim") << "Couldn't retrieve refractive index";
251  return cherenkovEnergy;
252  }
253 
254  // V.Ivanchenko - temporary close log output for 9.5
255  // Material refraction properties
256  int Rlength = Rindex->GetVectorLength() - 1;
257  double Pmin = Rindex->Energy(0);
258  double Pmax = Rindex->Energy(Rlength);
259 #ifdef EDM_ML_DEBUG
260  edm::LogVerbatim("EcalSim") << "Material properties: \n Pmin = " << Pmin << " Pmax = " << Pmax;
261 #endif
262  // Get particle properties
263  const G4StepPoint *pPreStepPoint = aStep->GetPreStepPoint();
264  const G4StepPoint *pPostStepPoint = aStep->GetPostStepPoint();
265  const G4ThreeVector &x0 = pPreStepPoint->GetPosition();
266  G4ThreeVector p0 = aStep->GetDeltaPosition().unit();
267  const G4DynamicParticle *aParticle = aStep->GetTrack()->GetDynamicParticle();
268  const double charge = aParticle->GetDefinition()->GetPDGCharge();
269  // beta is averaged over step
270  double beta = 0.5 * (pPreStepPoint->GetBeta() + pPostStepPoint->GetBeta());
271  double BetaInverse = 1.0 / beta;
272 
273 #ifdef EDM_ML_DEBUG
274  edm::LogVerbatim("EcalSim") << "Particle properties: \n charge = " << charge << " beta = " << beta;
275 #endif
276 
277  // Now get number of photons generated in this step
278  double meanNumberOfPhotons = getAverageNumberOfPhotons_(charge, beta, material, Rindex);
279  if (meanNumberOfPhotons <= 0.0) { // Don't do anything
280 #ifdef EDM_ML_DEBUG
281  edm::LogVerbatim("EcalSim") << "Mean number of photons is zero: " << meanNumberOfPhotons << ", stopping here";
282 #endif
283  return cherenkovEnergy;
284  }
285 
286  // number of photons is in unit of Geant4...
287  meanNumberOfPhotons *= aStep->GetStepLength();
288 
289  // Now get a poisson distribution
290  int numPhotons = static_cast<int>(G4Poisson(meanNumberOfPhotons));
291  // edm::LogVerbatim("EcalSim") << "Number of photons = " << numPhotons;
292  if (numPhotons <= 0) {
293 #ifdef EDM_ML_DEBUG
294  edm::LogVerbatim("EcalSim") << "Poission number of photons is zero: " << numPhotons << ", stopping here";
295 #endif
296  return cherenkovEnergy;
297  }
298 
299  // Material refraction properties
300  double dp = Pmax - Pmin;
301  double maxCos = BetaInverse / (*Rindex)[Rlength];
302  double maxSin2 = (1.0 - maxCos) * (1.0 + maxCos);
303 
304  // Finally: get contribution of each photon
305  for (int iPhoton = 0; iPhoton < numPhotons; ++iPhoton) {
306  // Determine photon momentum
307  double randomNumber;
308  double sampledMomentum, sampledRI;
309  double cosTheta, sin2Theta;
310 
311  // sample a momentum (not sure why this is needed!)
312  do {
313  randomNumber = G4UniformRand();
314  sampledMomentum = Pmin + randomNumber * dp;
315  sampledRI = Rindex->Value(sampledMomentum);
316  cosTheta = BetaInverse / sampledRI;
317 
318  sin2Theta = (1.0 - cosTheta) * (1.0 + cosTheta);
319  randomNumber = G4UniformRand();
320 
321  } while (randomNumber * maxSin2 > sin2Theta);
322 
323  // Generate random position of photon on cone surface
324  // defined by Theta
325  randomNumber = G4UniformRand();
326 
327  double phi = twopi * randomNumber;
328  double sinPhi = sin(phi);
329  double cosPhi = cos(phi);
330 
331  // Create photon momentum direction vector
332  // The momentum direction is still w.r.t. the coordinate system where the
333  // primary particle direction is aligned with the z axis
334  double sinTheta = sqrt(sin2Theta);
335  double px = sinTheta * cosPhi;
336  double py = sinTheta * sinPhi;
337  double pz = cosTheta;
338  G4ThreeVector photonDirection(px, py, pz);
339 
340  // Rotate momentum direction back to global (crystal) reference system
341  photonDirection.rotateUz(p0);
342 
343  // Create photon position and momentum
344  randomNumber = G4UniformRand();
345  G4ThreeVector photonPosition = x0 + randomNumber * aStep->GetDeltaPosition();
346  G4ThreeVector photonMomentum = sampledMomentum * photonDirection;
347 
348  // Collect energy on APD
349  cherenkovEnergy += getPhotonEnergyDeposit_(photonMomentum, photonPosition, aStep);
350  }
351  return cherenkovEnergy;
352 }
353 
354 //________________________________________________________________________________________
355 // Returns number of photons produced per GEANT-unit (millimeter) in the current
356 // medium. From G4Cerenkov.cc
358  const double beta,
359  const G4Material *aMaterial,
360  const G4MaterialPropertyVector *Rindex) {
361  const double rFact = 369.81 / (eV * cm);
362 
363  if (beta <= 0.0)
364  return 0.0;
365 
366  double BetaInverse = 1. / beta;
367 
368  // Vectors used in computation of Cerenkov Angle Integral:
369  // - Refraction Indices for the current material
370  // - new G4PhysicsOrderedFreeVector allocated to hold CAI's
371 
372  // Min and Max photon momenta
373  int Rlength = Rindex->GetVectorLength() - 1;
374  double Pmin = Rindex->Energy(0);
375  double Pmax = Rindex->Energy(Rlength);
376 
377  // Min and Max Refraction Indices
378  double nMin = (*Rindex)[0];
379  double nMax = (*Rindex)[Rlength];
380 
381  // Max Cerenkov Angle Integral
382  double CAImax = chAngleIntegrals_.get()->GetMaxValue();
383 
384  double dp = 0., ge = 0., CAImin = 0.;
385 
386  // If n(Pmax) < 1/Beta -- no photons generated
387  if (nMax < BetaInverse) {
388  }
389 
390  // otherwise if n(Pmin) >= 1/Beta -- photons generated
391  else if (nMin > BetaInverse) {
392  dp = Pmax - Pmin;
393  ge = CAImax;
394  }
395  // If n(Pmin) < 1/Beta, and n(Pmax) >= 1/Beta, then
396  // we need to find a P such that the value of n(P) == 1/Beta.
397  // Interpolation is performed by the GetPhotonEnergy() and
398  // GetProperty() methods of the G4MaterialPropertiesTable and
399  // the GetValue() method of G4PhysicsVector.
400  else {
401  Pmin = Rindex->Value(BetaInverse);
402  dp = Pmax - Pmin;
403  // need boolean for current implementation of G4PhysicsVector
404  // ==> being phased out
405  double CAImin = chAngleIntegrals_->Value(Pmin);
406  ge = CAImax - CAImin;
407  }
408 
409  // Calculate number of photons
410  double numPhotons = rFact * charge / eplus * charge / eplus * (dp - ge * BetaInverse * BetaInverse);
411 
412 #ifdef EDM_ML_DEBUG
413  edm::LogVerbatim("EcalSim") << "@SUB=getAverageNumberOfPhotons\nCAImin = " << CAImin << "\nCAImax = " << CAImax
414  << "\ndp = " << dp << ", ge = " << ge << "\nnumPhotons = " << numPhotons;
415 #endif
416  return numPhotons;
417 }
418 
419 //________________________________________________________________________________________
420 // Set lead tungstate material properties on the fly.
421 // Values from Ts42 detector construction
422 bool DreamSD::setPbWO2MaterialProperties_(G4Material *aMaterial) {
423  std::string pbWO2Name("E_PbWO4");
424  if (pbWO2Name != aMaterial->GetName()) { // Wrong material!
425  edm::LogWarning("EcalSim") << "This is not the right material: "
426  << "expecting " << pbWO2Name << ", got " << aMaterial->GetName();
427  return false;
428  }
429 
430  G4MaterialPropertiesTable *table = new G4MaterialPropertiesTable();
431 
432  // Refractive index as a function of photon momentum
433  // FIXME: Should somehow put that in the configuration
434  const int nEntries = 14;
435  double PhotonEnergy[nEntries] = {1.7712 * eV,
436  1.8368 * eV,
437  1.90745 * eV,
438  1.98375 * eV,
439  2.0664 * eV,
440  2.15625 * eV,
441  2.25426 * eV,
442  2.3616 * eV,
443  2.47968 * eV,
444  2.61019 * eV,
445  2.75521 * eV,
446  2.91728 * eV,
447  3.09961 * eV,
448  3.30625 * eV};
449  double RefractiveIndex[nEntries] = {2.17728,
450  2.18025,
451  2.18357,
452  2.18753,
453  2.19285,
454  2.19813,
455  2.20441,
456  2.21337,
457  2.22328,
458  2.23619,
459  2.25203,
460  2.27381,
461  2.30282,
462  2.34666};
463 
464  table->AddProperty("RINDEX", PhotonEnergy, RefractiveIndex, nEntries);
465  aMaterial->SetMaterialPropertiesTable(table); // FIXME: could this leak? What does G4 do?
466 
467  // Calculate Cherenkov angle integrals:
468  // This is an ad-hoc solution (we hold it in the class, not in the material)
469  chAngleIntegrals_ = std::make_unique<G4PhysicsOrderedFreeVector>();
470 
471  int index = 0;
472  double currentRI = RefractiveIndex[index];
473  double currentPM = PhotonEnergy[index];
474  double currentCAI = 0.0;
475  chAngleIntegrals_.get()->InsertValues(currentPM, currentCAI);
476  double prevPM = currentPM;
477  double prevCAI = currentCAI;
478  double prevRI = currentRI;
479  while (++index < nEntries) {
480  currentRI = RefractiveIndex[index];
481  currentPM = PhotonEnergy[index];
482  currentCAI = 0.5 * (1.0 / (prevRI * prevRI) + 1.0 / (currentRI * currentRI));
483  currentCAI = prevCAI + (currentPM - prevPM) * currentCAI;
484 
485  chAngleIntegrals_.get()->InsertValues(currentPM, currentCAI);
486 
487  prevPM = currentPM;
488  prevCAI = currentCAI;
489  prevRI = currentRI;
490  }
491 
492 #ifdef EDM_ML_DEBUG
493  edm::LogVerbatim("EcalSim") << "Material properties set for " << aMaterial->GetName();
494 #endif
495  return true;
496 }
497 
498 //________________________________________________________________________________________
499 // Calculate energy deposit of a photon on APD
500 // - simple tracing to APD position (straight line);
501 // - configurable reflection probability if not straight to APD;
502 // - APD response function
503 double DreamSD::getPhotonEnergyDeposit_(const G4ThreeVector &p, const G4ThreeVector &x, const G4Step *aStep) {
504  double energy = 0;
505 
506  // Crystal dimensions
507 
508  // edm::LogVerbatim("EcalSim") << p << x;
509 
510  // 1. Check if this photon goes straight to the APD:
511  // - assume that APD is at x=xtalLength/2.0
512  // - extrapolate from x=x0 to x=xtalLength/2.0 using momentum in x-y
513 
514  G4StepPoint *stepPoint = aStep->GetPreStepPoint();
515  G4LogicalVolume *lv = stepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
516  G4String nameVolume = lv->GetName();
517 
518  double crlength = crystalLength(lv);
519  double crwidth = crystalWidth(lv);
520  double dapd = 0.5 * crlength - x.x(); // Distance from closest APD
521  double y = p.y() / p.x() * dapd;
522 
523 #ifdef EDM_ML_DEBUG
524  edm::LogVerbatim("EcalSim") << "Distance to APD: " << dapd << " - y at APD: " << y;
525 #endif
526  // Not straight: compute probability
527  if (std::abs(y) > crwidth * 0.5) {
528  }
529 
530  // 2. Retrieve efficiency for this wavelength (in nm, from MeV)
531  double waveLength = p.mag() * 1.239e8;
532 
533  energy = p.mag() * PMTResponse::getEfficiency(waveLength);
534 #ifdef EDM_ML_DEBUG
535  edm::LogVerbatim("EcalSim") << "Wavelength: " << waveLength << " - Energy: " << energy;
536 #endif
537  return energy;
538 }
DreamSD::chAngleIntegrals_
std::unique_ptr< G4PhysicsOrderedFreeVector > chAngleIntegrals_
Table of Cherenkov angle integrals vs photon momentum.
Definition: DreamSD.h:63
DreamSD::readBothSide_
bool readBothSide_
Definition: DreamSD.h:55
DDAxes::y
ApeEstimator_cff.width
width
Definition: ApeEstimator_cff.py:24
SimTrackManager
Definition: SimTrackManager.h:35
DreamSD::Doubles
std::pair< double, double > Doubles
Definition: DreamSD.h:31
mps_fire.i
i
Definition: mps_fire.py:428
cms::DDFilteredView::parameters
const std::vector< double > parameters() const
extract shape parameters
Definition: DDFilteredView.cc:536
ESTransientHandle.h
metDiagnosticParameterSet_cfi.nMin
nMin
Definition: metDiagnosticParameterSet_cfi.py:10
DreamSD::fillMap
void fillMap(const std::string &, double, double)
Definition: DreamSD.cc:176
multPhiCorr_741_25nsDY_cfi.py
py
Definition: multPhiCorr_741_25nsDY_cfi.py:12
zMuMuMuonUserData.beta
beta
Definition: zMuMuMuonUserData.py:10
mps_merge.weight
weight
Definition: mps_merge.py:88
DreamSD::k_ScaleFromDDDToG4
static constexpr double k_ScaleFromDDDToG4
Definition: DreamSD.h:52
AlCaHLTBitMon_ParallelJobs.p
p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
DDFilteredView::logicalPart
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the filtered-view.
Definition: DDFilteredView.cc:16
DDSplit.h
DreamSD::initRun
void initRun() override
Definition: DreamSD.cc:86
DreamSD::cherenkovDeposit_
double cherenkovDeposit_(const G4Step *aStep)
Returns the total energy due to Cherenkov radiation.
Definition: DreamSD.cc:241
PMTResponse.h
DreamSD::dd4hep_
bool dd4hep_
Definition: DreamSD.h:55
CaloSD::getAttenuation
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3) const
Definition: CaloSD.cc:517
DreamSD::getPhotonEnergyDeposit_
double getPhotonEnergyDeposit_(const G4ParticleMomentum &p, const G4ThreeVector &x, const G4Step *aStep)
Returns energy deposit for a given photon.
Definition: DreamSD.cc:503
MeV
const double MeV
edm::ParameterSet::getUntrackedParameter
T getUntrackedParameter(std::string const &, T const &) const
DDAxes::x
DreamSD::crystalWidth
double crystalWidth(G4LogicalVolume *) const
Definition: DreamSD.cc:230
DreamSD::doCherenkov_
bool doCherenkov_
Definition: DreamSD.h:55
cms::DDFilteredView
Definition: DDFilteredView.h:70
DreamSD::materialPropertiesTable_
G4MaterialPropertiesTable * materialPropertiesTable_
Definition: DreamSD.h:64
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
DDCompactView.h
cms::DDFilteredView::name
std::string_view name() const
Definition: DDFilteredView.cc:853
funct::sin
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
DreamSD::setDetUnitId
uint32_t setDetUnitId(const G4Step *) override
Definition: DreamSD.cc:103
DDSolid::shape
DDSolidShape shape(void) const
The type of the solid.
Definition: DDSolid.cc:119
funct::cos
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
DDFilteredView::firstChild
bool firstChild()
set the current node to the first child ...
Definition: DDFilteredView.cc:86
edm::EventSetup::get
T get() const
Definition: EventSetup.h:80
DDFilteredView.h
cms::DDFilter
Definition: DDFilteredView.h:59
DreamSD::initMap
void initMap(const std::string &, const edm::EventSetup &)
Definition: DreamSD.cc:117
cms::dd::name
std::string name(Mapping a, V value)
Definition: DDSolidShapes.h:31
CaloSD::setToLocal
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *) const
Definition: CaloSD.cc:373
Calorimetry_cff.dp
dp
Definition: Calorimetry_cff.py:157
DreamSD::useBirk_
bool useBirk_
Definition: DreamSD.h:55
Service.h
DreamSD::getAverageNumberOfPhotons_
double getAverageNumberOfPhotons_(const double charge, const double beta, const G4Material *aMaterial, const G4MaterialPropertyVector *rIndex)
Returns average number of photons created by track.
Definition: DreamSD.cc:357
DDFilteredView::next
bool next()
set current node to the next node in the filtered tree
Definition: DDFilteredView.cc:67
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
DDBase::name
const N & name() const
Definition: DDBase.h:59
cms::DDFilteredView::firstChild
bool firstChild()
set the current node to the first child
Definition: DDFilteredView.cc:268
DreamSD::xtalLMap_
DimensionMap xtalLMap_
Definition: DreamSD.h:58
DDSolid.h
cms::DDFilteredView::shape
const cms::DDSolidShape shape() const
Definition: DDFilteredView.cc:553
SensitiveDetectorCatalog
Definition: SensitiveDetectorCatalog.h:10
DDFilteredView.h
HCALHighEnergyHPDFilter_cfi.energy
energy
Definition: HCALHighEnergyHPDFilter_cfi.py:5
DDCompactView.h
ALCARECOTkAlBeamHalo_cff.filter
filter
Definition: ALCARECOTkAlBeamHalo_cff.py:27
DDValue.h
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
DreamSD::setPbWO2MaterialProperties_
bool setPbWO2MaterialProperties_(G4Material *aMaterial)
Sets material properties at run-time...
Definition: DreamSD.cc:422
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
DreamSD::birk1_
double birk1_
Definition: DreamSD.h:56
edm::ParameterSet
Definition: ParameterSet.h:47
cms::DDSolidShapeMap
const std::array< const cms::dd::NameValuePair< DDSolidShape >, 19 > DDSolidShapeMap
Definition: DDSolidShapes.h:97
PMTResponse::getEfficiency
static double getEfficiency(const double &waveLengthNm)
Return efficiency for given photon wavelength (in nm)
Definition: PMTResponse.cc:6
DreamSD.h
DDFilter.h
DDName::name
const std::string & name() const
Returns the name.
Definition: DDName.cc:41
IdealGeometryRecord.h
edm::EventSetup
Definition: EventSetup.h:57
TrackInformation.h
get
#define get
DreamSD::birk2_
double birk2_
Definition: DreamSD.h:56
edm::ESTransientHandle
Definition: ESTransientHandle.h:41
DreamSD::k_ScaleFromDD4HepToG4
static constexpr double k_ScaleFromDD4HepToG4
Definition: DreamSD.h:53
DDAxes::phi
multPhiCorr_741_25nsDY_cfi.px
px
Definition: multPhiCorr_741_25nsDY_cfi.py:10
DreamSD::crystalLength
double crystalLength(G4LogicalVolume *) const
Definition: DreamSD.cc:221
dataAnalyzerFineBiningParameters_cff.Pmax
Pmax
Definition: dataAnalyzerFineBiningParameters_cff.py:10
DDValue
Definition: DDValue.h:21
edm::LogVerbatim
Log< level::Info, true > LogVerbatim
Definition: MessageLogger.h:128
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:31
genVertex_cff.x
x
Definition: genVertex_cff.py:12
DreamSD::getEnergyDeposit
double getEnergyDeposit(const G4Step *) override
Definition: DreamSD.cc:66
DDSolid::parameters
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
Definition: DDSolid.cc:121
Skims_PA_cff.name
name
Definition: Skims_PA_cff.py:17
DDSolid
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
DDSpecificsMatchesValueFilter
Definition: DDFilter.h:70
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
DreamSD::curve_LY
double curve_LY(const G4Step *, int)
Definition: DreamSD.cc:194
DreamSD::side_
int side_
Definition: DreamSD.h:60
sd
double sd
Definition: CascadeWrapper.h:113
DreamSD::DreamSD
DreamSD(const std::string &, const edm::EventSetup &, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *)
Definition: DreamSD.cc:37
DDFilteredView
Definition: DDFilteredView.h:20
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
DreamSD::slopeLY_
double slopeLY_
Definition: DreamSD.h:57
TableParser.table
table
Definition: TableParser.py:111
DDLogicalPart::solid
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
Definition: DDLogicalPart.cc:120
metDiagnosticParameterSet_cfi.nMax
nMax
Definition: metDiagnosticParameterSet_cfi.py:11
weight
Definition: weight.py:1
IdealGeometryRecord
Definition: IdealGeometryRecord.h:25
CaloSD
Definition: CaloSD.h:38
g
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
RemoveAddSevLevel.flag
flag
Definition: RemoveAddSevLevel.py:116
DreamSD::birk3_
double birk3_
Definition: DreamSD.h:56