CMS 3D CMS Logo

ECalSD.cc
Go to the documentation of this file.
1 // File: ECalSD.cc
3 // Description: Sensitive Detector class for electromagnetic calorimeters
17 
21 
22 #include "G4LogicalVolumeStore.hh"
23 #include "G4LogicalVolume.hh"
24 #include "G4Step.hh"
25 #include "G4Track.hh"
26 #include "G4VProcess.hh"
27 
28 #include <CLHEP/Units/SystemOfUnits.h>
29 
30 #include <algorithm>
31 
32 //#define EDM_ML_DEBUG
33 
34 using namespace geant_units::operators;
35 
36 template <class T>
37 bool any(const std::vector<T>& v, const T& what) {
38  return std::find(v.begin(), v.end(), what) != v.end();
39 }
40 
42  const EcalSimulationParameters* ecpar,
43  const SensitiveDetectorCatalog& clg,
44  edm::ParameterSet const& p,
45  const SimTrackManager* manager)
46  : CaloSD(name,
47  clg,
48  p,
49  manager,
50  (float)(p.getParameter<edm::ParameterSet>("ECalSD").getParameter<double>("TimeSliceUnit")),
51  p.getParameter<edm::ParameterSet>("ECalSD").getParameter<bool>("IgnoreTrackID")),
52  ecalSimParameters_(ecpar) {
53  numberingScheme_.reset(nullptr);
54  // static SimpleConfigurable<bool> on1(false, "ECalSD:UseBirkLaw");
55  // static SimpleConfigurable<double> bk1(0.00463,"ECalSD:BirkC1");
56  // static SimpleConfigurable<double> bk2(-0.03, "ECalSD:BirkC2");
57  // static SimpleConfigurable<double> bk3(1.0, "ECalSD:BirkC3");
58  // Values from NIM A484 (2002) 239-244: as implemented in Geant3
59  // useBirk = on1.value();
60  // birk1 = bk1.value()*(g/(MeV*cm2));
61  // birk2 = bk2.value()*(g/(MeV*cm2))*(g/(MeV*cm2));
62  edm::ParameterSet m_EC = p.getParameter<edm::ParameterSet>("ECalSD");
63  useBirk = m_EC.getParameter<bool>("UseBirkLaw");
64  useBirkL3 = m_EC.getParameter<bool>("BirkL3Parametrization");
65  double bunit = (CLHEP::g / (CLHEP::MeV * CLHEP::cm2));
66  birk1 = m_EC.getParameter<double>("BirkC1") * bunit;
67  birk2 = m_EC.getParameter<double>("BirkC2");
68  birk3 = m_EC.getParameter<double>("BirkC3");
69  birkSlope = m_EC.getParameter<double>("BirkSlope");
70  birkCut = m_EC.getParameter<double>("BirkCut");
71  slopeLY = m_EC.getParameter<double>("SlopeLightYield");
72  storeTrack = m_EC.getParameter<bool>("StoreSecondary");
73  crystalMat = m_EC.getUntrackedParameter<std::string>("XtalMat", "E_PbWO4");
74  bool isItTB = m_EC.getUntrackedParameter<bool>("TestBeam", false);
75  bool nullNS = m_EC.getUntrackedParameter<bool>("NullNumbering", false);
76  storeRL = m_EC.getUntrackedParameter<bool>("StoreRadLength", false);
77  scaleRL = m_EC.getUntrackedParameter<double>("ScaleRadLength", 1.0);
78  int dumpGeom = m_EC.getUntrackedParameter<int>("DumpGeometry", 0);
79 
80  //Changes for improved timing simulation
81  storeLayerTimeSim = m_EC.getUntrackedParameter<bool>("StoreLayerTimeSim", false);
82 
83  ageingWithSlopeLY = m_EC.getUntrackedParameter<bool>("AgeingWithSlopeLY", false);
85  ageing.setLumies(p.getParameter<edm::ParameterSet>("ECalSD").getParameter<double>("DelivLuminosity"),
86  p.getParameter<edm::ParameterSet>("ECalSD").getParameter<double>("InstLuminosity"));
87 
88  if (ecalSimParameters_ == nullptr) {
89  edm::LogError("EcalSim") << "ECalSD : Cannot find EcalSimulationParameters for " << name;
90  throw cms::Exception("Unknown", "ECalSD") << "Cannot find EcalSimulationParameters for " << name << "\n";
91  }
92 
93  // Use of Weight
95 #ifdef EDM_ML_DEBUG
96  edm::LogVerbatim("EcalSim") << "ECalSD:: useWeight " << useWeight;
97 #endif
100 #ifdef EDM_ML_DEBUG
101  edm::LogVerbatim("EcalSim") << "Names (Depth 1):" << depth1Name << " (Depth 2):" << depth2Name << std::endl;
102 #endif
103  int type(-1);
104  bool dump(false);
105  EcalNumberingScheme* scheme = nullptr;
106  if (nullNS) {
107  scheme = nullptr;
108  } else if (name == "EcalHitsEB") {
109  scheme = dynamic_cast<EcalNumberingScheme*>(new EcalBarrelNumberingScheme());
110  type = 0;
111  dump = ((dumpGeom % 10) > 0);
112  } else if (name == "EcalHitsEE") {
113  scheme = dynamic_cast<EcalNumberingScheme*>(new EcalEndcapNumberingScheme());
114  type = 1;
115  dump = (((dumpGeom / 10) % 10) > 0);
116  } else if (name == "EcalHitsES") {
117  if (isItTB)
118  scheme = dynamic_cast<EcalNumberingScheme*>(new ESTBNumberingScheme());
119  else
121  useWeight = false;
122  type = 2;
123  dump = (((dumpGeom / 100) % 10) > 0);
124  } else {
125  edm::LogWarning("EcalSim") << "ECalSD: ReadoutName not supported";
126  }
127  int type0 = dumpGeom / 1000;
128  type += (10 * type0);
129 
130  if (nullptr != scheme) {
132  }
133 #ifdef EDM_ML_DEBUG
134  edm::LogVerbatim("EcalSim") << "Constructing a ECalSD with name " << GetName();
135 #endif
136  if (useWeight) {
137  edm::LogVerbatim("EcalSim") << "ECalSD:: Use of Birks law is set to " << useBirk
138  << " with three constants kB = " << birk1 / bunit << ", C1 = " << birk2
139  << ", C2 = " << birk3 << "\n Use of L3 parametrization " << useBirkL3
140  << " with slope " << birkSlope << " and cut off " << birkCut << "\n"
141  << " Slope for Light yield is set to " << slopeLY;
142  } else {
143  edm::LogVerbatim("EcalSim") << "ECalSD:: energy deposit is not corrected "
144  << " by Birk or light yield curve";
145  }
146 
147  edm::LogVerbatim("EcalSim") << "ECalSD:: Suppression Flag " << suppressHeavy << "\tprotons below "
148  << kmaxProton / CLHEP::MeV << " MeV,\tneutrons below " << kmaxNeutron / CLHEP::MeV
149  << " MeV,\tions below " << kmaxIon / CLHEP::MeV << " MeV \n\tDepth1 Name = " << depth1Name
150  << "\tDepth2 Name = " << depth2Name << "\n\tstoreRL " << storeRL << ":" << scaleRL
151  << "\tstoreLayerTimeSim " << storeLayerTimeSim << "\n\ttime Granularity "
152  << p.getParameter<edm::ParameterSet>("ECalSD").getParameter<double>("TimeSliceUnit")
153  << " ns";
154  if (useWeight)
155  initMap();
156 #ifdef plotDebug
158  if (tfile.isAvailable()) {
159  TFileDirectory ecDir = tfile->mkdir("ProfileFromECalSD");
160  static const std::string ctype[4] = {"EB", "EBref", "EE", "EERef"};
161  for (int k = 0; k < 4; ++k) {
162  std::string name = "ECLL_" + ctype[k];
163  std::string title = "Local vs Global for " + ctype[k];
164  double xmin = (k > 1) ? 3000.0 : 1000.0;
165  g2L_[k] = ecDir.make<TH2F>(name.c_str(), title.c_str(), 100, xmin, xmin + 1000., 100, 0.0, 3000.);
166  }
167  } else {
168  for (int k = 0; k < 4; ++k)
169  g2L_[k] = 0;
170  }
171 #endif
172  if (dump) {
173  const auto& lvNames = clg.logicalNames(name);
175  geom.update();
176  }
177 }
178 
180 
181 double ECalSD::getEnergyDeposit(const G4Step* aStep) {
182  const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
183  const G4Track* theTrack = aStep->GetTrack();
184  double edep = aStep->GetTotalEnergyDeposit();
185 
186  // take into account light collection curve for crystals
187  double weight = 1.;
188  if (suppressHeavy) {
189  TrackInformation* trkInfo = (TrackInformation*)(theTrack->GetUserInformation());
190  if (trkInfo) {
191  int pdg = theTrack->GetDefinition()->GetPDGEncoding();
192  if (!(trkInfo->isPrimary())) { // Only secondary particles
193  double ke = theTrack->GetKineticEnergy();
194  if (((pdg / 1000000000 == 1 && ((pdg / 10000) % 100) > 0 && ((pdg / 10) % 100) > 0)) && (ke < kmaxIon))
195  weight = 0;
196  if ((pdg == 2212) && (ke < kmaxProton))
197  weight = 0;
198  if ((pdg == 2112) && (ke < kmaxNeutron))
199  weight = 0;
200  }
201  }
202  }
203  const G4LogicalVolume* lv = preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
204  double wt1 = 1.0;
205  if (useWeight && !any(noWeight, lv)) {
206  weight *= curve_LY(lv);
207  if (useBirk) {
208  if (useBirkL3)
209  weight *= getBirkL3(aStep);
210  else
211  weight *= getAttenuation(aStep, birk1, birk2, birk3);
212  }
213  wt1 = getResponseWt(theTrack);
214  }
215  edep *= weight * wt1;
216  // Russian Roulette
217  double wt2 = theTrack->GetWeight();
218  if (wt2 > 0.0) {
219  edep *= wt2;
220  }
221 #ifdef EDM_ML_DEBUG
222  edm::LogVerbatim("EcalSim") << lv->GetName() << " "
223  << DD4hep2DDDName::noNameSpace(static_cast<std::string>(lv->GetName()))
224  << " Light Collection Efficiency " << weight << ":" << wt1 << " wt2= " << wt2
225  << " Weighted Energy Deposit " << edep / CLHEP::MeV << " MeV at "
226  << preStepPoint->GetPosition();
227 #endif
228  return edep;
229 }
230 
231 double ECalSD::EnergyCorrected(const G4Step& step, const G4Track* track) {
232  const G4StepPoint* hitPoint = step.GetPreStepPoint();
233  const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
234  if (lv->GetSensitiveDetector() != this)
235  return 0.0;
236 
237  double edep = step.GetTotalEnergyDeposit();
238  if (useWeight && !any(noWeight, lv)) {
239  currentLocalPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
240  auto ite = xtalLMap.find(lv);
241  crystalLength = (ite == xtalLMap.end()) ? 230._mm : std::abs(ite->second);
242  crystalDepth = (ite == xtalLMap.end()) ? 0.0 : (std::abs(0.5 * (ite->second) + currentLocalPoint.z()));
243  edep *= curve_LY(lv) * getResponseWt(track);
244  }
245  return edep;
246 }
247 
248 int ECalSD::getTrackID(const G4Track* aTrack) {
249  int primaryID(0);
250  if (storeTrack && depth > 0) {
251  forceSave = true;
252  primaryID = aTrack->GetTrackID();
253  } else {
254  primaryID = CaloSD::getTrackID(aTrack);
255  }
256  return primaryID;
257 }
258 
259 uint16_t ECalSD::getDepth(const G4Step* aStep) {
260  // this method should be called first at a step
261  const G4StepPoint* hitPoint = aStep->GetPreStepPoint();
262  currentLocalPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
263  const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
264 
265  auto ite = xtalLMap.find(lv);
266  crystalLength = (ite == xtalLMap.end()) ? 230._mm : std::abs(ite->second);
267  crystalDepth = (ite == xtalLMap.end()) ? 0.0 : (std::abs(0.5 * (ite->second) + currentLocalPoint.z()));
268  depth = any(useDepth1, lv) ? 1 : (any(useDepth2, lv) ? 2 : 0);
269  uint16_t depth1(0), depth2(0);
270  if (storeRL) {
271  depth1 = (ite == xtalLMap.end()) ? 0 : (((ite->second) >= 0) ? 0 : PCaloHit::kEcalDepthRefz);
272  depth2 = getRadiationLength(hitPoint, lv);
273  depth |= (((depth2 & PCaloHit::kEcalDepthMask) << PCaloHit::kEcalDepthOffset) | depth1);
274  } else if (storeLayerTimeSim) {
275  depth2 = getLayerIDForTimeSim();
277  }
278 #ifdef EDM_ML_DEBUG
279  if (isXtal(lv))
280  edm::LogVerbatim("EcalSimX") << "ECalSD::Volume " << lv->GetName() << " DetId " << std::hex << setDetUnitId(aStep)
281  << std::dec << " Global " << (hitPoint->GetPosition()).rho() << ":"
282  << (hitPoint->GetPosition()).z() << " Local Z " << currentLocalPoint.z() << " Depth "
283  << crystalDepth;
284  edm::LogVerbatim("EcalSim") << "ECalSD::Depth " << std::hex << depth1 << ":" << depth2 << ":" << depth << std::dec
285  << " L " << (ite == xtalLMap.end()) << ":" << ite->second << " local "
286  << currentLocalPoint << " Crystal length " << crystalLength << ":" << crystalDepth;
287 #endif
288  return depth;
289 }
290 
291 uint16_t ECalSD::getRadiationLength(const G4StepPoint* hitPoint, const G4LogicalVolume* lv) {
292  uint16_t thisX0 = 0;
293  if (useWeight) {
294  double radl = hitPoint->GetMaterial()->GetRadlen();
295  thisX0 = (uint16_t)floor(scaleRL * crystalDepth / radl);
296 #ifdef plotDebug
297  const std::string lvname = DD4hep2DDDName::noNameSpace(static_cast<std::string>(lv->GetName()));
298  int k1 = (lvname.find("EFRY") != std::string::npos) ? 2 : 0;
299  int k2 = (lvname.find("refl") != std::string::npos) ? 1 : 0;
300  int kk = k1 + k2;
301  double rz = (k1 == 0) ? (hitPoint->GetPosition()).rho() : std::abs((hitPoint->GetPosition()).z());
302  edm::LogVerbatim("EcalSim") << lvname << " # " << k1 << ":" << k2 << ":" << kk << " rz " << rz << " D " << thisX0;
303  g2L_[kk]->Fill(rz, thisX0);
304 #endif
305 #ifdef EDM_ML_DEBUG
306  G4ThreeVector localPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
307  edm::LogVerbatim("EcalSim") << lv->GetName() << " "
308  << DD4hep2DDDName::noNameSpace(static_cast<std::string>(lv->GetName())) << " Global "
309  << hitPoint->GetPosition() << ":" << (hitPoint->GetPosition()).rho() << " Local "
310  << localPoint << " Crystal Length " << crystalLength << " Radl " << radl
311  << " crystalDepth " << crystalDepth << " Index " << thisX0 << " : "
313 #endif
314  }
315  return thisX0;
316 }
317 
319  const double invLayerSize = 0.1; //layer size in 1/mm
320  return (int)crystalDepth * invLayerSize;
321 }
322 
323 uint32_t ECalSD::setDetUnitId(const G4Step* aStep) {
324  if (numberingScheme_.get() == nullptr) {
325  return EBDetId(1, 1)();
326  } else {
327  getBaseNumber(aStep);
328  return numberingScheme_->getUnitID(theBaseNumber);
329  }
330 }
331 
333  if (scheme != nullptr) {
334  edm::LogVerbatim("EcalSim") << "EcalSD: updates numbering scheme for " << GetName();
335  numberingScheme_.reset(scheme);
336  }
337 }
338 
340  std::vector<const G4LogicalVolume*> lvused;
341  const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
342  std::map<const std::string, const G4LogicalVolume*> nameMap;
343  for (auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
344  nameMap.emplace(DD4hep2DDDName::noNameSpace(static_cast<std::string>((*lvi)->GetName())), *lvi);
345 
346  for (unsigned int it = 0; it < ecalSimParameters_->lvNames_.size(); ++it) {
347  const std::string& matname = ecalSimParameters_->matNames_[it];
348  const std::string& lvname = ecalSimParameters_->lvNames_[it];
349  const G4LogicalVolume* lv = nameMap[lvname];
350  int ibec = (lvname.find("EFRY") == std::string::npos) ? 0 : 1;
351  int iref = (lvname.find("refl") == std::string::npos) ? 0 : 1;
352  int type = (ibec + iref == 1) ? 1 : -1;
353  if (depth1Name != " ") {
354  if (strncmp(lvname.c_str(), depth1Name.c_str(), 4) == 0) {
355  if (!any(useDepth1, lv)) {
356  useDepth1.push_back(lv);
357 #ifdef EDM_ML_DEBUG
358  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " in Depth 1 volume list";
359 #endif
360  }
361  const G4LogicalVolume* lvr = nameMap[lvname + "_refl"];
362  if (lvr != nullptr && !any(useDepth1, lvr)) {
363  useDepth1.push_back(lvr);
364 #ifdef EDM_ML_DEBUG
365  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << "_refl"
366  << " in Depth 1 volume list";
367 #endif
368  }
369  }
370  }
371  if (depth2Name != " ") {
372  if (strncmp(lvname.c_str(), depth2Name.c_str(), 4) == 0) {
373  if (!any(useDepth2, lv)) {
374  useDepth2.push_back(lv);
375 #ifdef EDM_ML_DEBUG
376  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " in Depth 2 volume list";
377 #endif
378  }
379  const G4LogicalVolume* lvr = nameMap[lvname + "_refl"];
380  if (lvr != nullptr && !any(useDepth2, lvr)) {
381  useDepth2.push_back(lvr);
382 #ifdef EDM_ML_DEBUG
383  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << "_refl"
384  << " in Depth 2 volume list";
385 #endif
386  }
387  }
388  }
389  if (lv != nullptr) {
390  if (crystalMat.size() == matname.size() && !strcmp(crystalMat.c_str(), matname.c_str())) {
391  if (!any(lvused, lv)) {
392  lvused.push_back(lv);
393  double dz = ecalSimParameters_->dzs_[it];
394  xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, dz * type));
395  lv = nameMap[lvname + "_refl"];
396  if (lv != nullptr) {
397  xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, -dz * type));
398  }
399  }
400  } else {
401  if (!any(noWeight, lv)) {
402  noWeight.push_back(lv);
403 #ifdef EDM_ML_DEBUG
404  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " Material " << matname
405  << " in noWeight list";
406 #endif
407  }
408  lv = nameMap[lvname];
409  if (lv != nullptr && !any(noWeight, lv)) {
410  noWeight.push_back(lv);
411 #ifdef EDM_ML_DEBUG
412  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " Material " << matname
413  << " in noWeight list";
414 #endif
415  }
416  }
417  }
418  }
419 #ifdef EDM_ML_DEBUG
420  edm::LogVerbatim("EcalSim") << "ECalSD: Length Table:";
421  int i = 0;
422  for (auto ite : xtalLMap) {
423  std::string name("Unknown");
424  if (ite.first != nullptr)
425  name = DD4hep2DDDName::noNameSpace(static_cast<std::string>((ite.first)->GetName()));
426  edm::LogVerbatim("EcalSim") << " " << i << " " << ite.first << " " << name << " L = " << ite.second;
427  ++i;
428  }
429 #endif
430 }
431 
432 double ECalSD::curve_LY(const G4LogicalVolume* lv) {
433  double weight = 1.;
434  if (ageingWithSlopeLY) {
435  //position along the crystal in mm from 0 to 230 (in EB)
436  if (crystalDepth >= -0.1 || crystalDepth <= crystalLength + 0.1)
438  } else {
439  double dapd = crystalLength - crystalDepth;
440  if (dapd >= -0.1 || dapd <= crystalLength + 0.1) {
441  if (dapd <= 100.)
442  weight = 1.0 + slopeLY - dapd * 0.01 * slopeLY;
443  } else {
444  edm::LogWarning("EcalSim") << "ECalSD: light coll curve : wrong distance "
445  << "to APD " << dapd << " crlength = " << crystalLength << ":" << crystalDepth
446  << " crystal name = " << lv->GetName() << " "
447  << DD4hep2DDDName::noNameSpace(static_cast<std::string>(lv->GetName()))
448  << " z of localPoint = " << currentLocalPoint.z() << " take weight = " << weight;
449  }
450  }
451 #ifdef EDM_ML_DEBUG
452  edm::LogVerbatim("EcalSim") << "ECalSD: light coll curve : crlength = " << crystalLength << " Depth " << crystalDepth
453  << " crystal name = " << lv->GetName() << " "
454  << DD4hep2DDDName::noNameSpace(static_cast<std::string>(lv->GetName()))
455  << " z of localPoint = " << currentLocalPoint.z() << " take weight = " << weight;
456 #endif
457  return weight;
458 }
459 
460 void ECalSD::getBaseNumber(const G4Step* aStep) {
462  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
463  int theSize = touch->GetHistoryDepth() + 1;
464  if (theBaseNumber.getCapacity() < theSize)
465  theBaseNumber.setSize(theSize);
466  //Get name and copy numbers
467  if (theSize > 1) {
468  for (int ii = 0; ii < theSize; ii++) {
469  std::string name = DD4hep2DDDName::noNameSpace(static_cast<std::string>(touch->GetVolume(ii)->GetName()));
470  theBaseNumber.addLevel(name, touch->GetReplicaNumber(ii));
471 #ifdef EDM_ML_DEBUG
472  edm::LogVerbatim("EcalSim") << "ECalSD::getBaseNumber(): Adding level " << ii << ": " << name << "["
473  << touch->GetReplicaNumber(ii) << "]";
474 #endif
475  }
476  }
477 }
478 
479 double ECalSD::getBirkL3(const G4Step* aStep) {
480  double weight = 1.;
481  const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
482  double charge = preStepPoint->GetCharge();
483 
484  if (charge != 0. && aStep->GetStepLength() > 0.) {
485  const G4Material* mat = preStepPoint->GetMaterial();
486  double density = mat->GetDensity();
487  double dedx = aStep->GetTotalEnergyDeposit() / aStep->GetStepLength();
488  double rkb = birk1 / density;
489  if (dedx > 0) {
490  weight = 1. - birkSlope * log(rkb * dedx);
491  if (weight < birkCut)
492  weight = birkCut;
493  else if (weight > 1.)
494  weight = 1.;
495  }
496 #ifdef EDM_ML_DEBUG
497  edm::LogVerbatim("EcalSim") << "ECalSD::getBirkL3 in "
498  << DD4hep2DDDName::noNameSpace(static_cast<std::string>(mat->GetName())) << " Charge "
499  << charge << " dE/dx " << dedx << " Birk Const " << rkb << " Weight = " << weight
500  << " dE " << aStep->GetTotalEnergyDeposit();
501 #endif
502  }
503  return weight;
504 }
505 
506 bool ECalSD::isXtal(const G4LogicalVolume* lv) { return (xtalLMap.find(lv) != xtalLMap.end()); }
Log< level::Info, true > LogVerbatim
double crystalLength
Definition: ECalSD.h:74
bool isPrimary() const
bool isXtal(const G4LogicalVolume *)
Definition: ECalSD.cc:506
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
bool useBirkL3
Definition: ECalSD.h:62
double kmaxNeutron
Definition: CaloSD.h:155
std::vector< std::string > lvNames_
double birkSlope
Definition: ECalSD.h:63
double slopeLY
Definition: ECalSD.h:64
void setLumies(double x, double y)
Definition: CaloSD.h:40
std::vector< const G4LogicalVolume * > useDepth2
Definition: ECalSD.h:67
void getBaseNumber(const G4Step *)
Definition: ECalSD.cc:460
static const int kEcalDepthRefz
Definition: PCaloHit.h:63
std::vector< const G4LogicalVolume * > noWeight
Definition: ECalSD.h:67
bool any(const std::vector< T > &v, const T &what)
Definition: ECalSD.cc:37
double birk1
Definition: ECalSD.h:63
double getEnergyDeposit(const G4Step *) override
Definition: ECalSD.cc:181
bool useWeight
Definition: ECalSD.h:61
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *) const
Definition: CaloSD.cc:455
Definition: weight.py:1
std::unique_ptr< EcalNumberingScheme > numberingScheme_
Definition: ECalSD.h:60
virtual int getTrackID(const G4Track *)
Definition: CaloSD.cc:874
double crystalDepth
Definition: ECalSD.h:75
Log< level::Error, false > LogError
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
double kmaxProton
Definition: CaloSD.h:155
const std::vector< std::string_view > logicalNames(const std::string &readoutName) const
bool storeLayerTimeSim
Definition: ECalSD.h:61
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
bool storeRL
Definition: ECalSD.h:61
~ECalSD() override
Definition: ECalSD.cc:179
double getBirkL3(const G4Step *)
Definition: ECalSD.cc:479
void initMap()
Definition: ECalSD.cc:339
T getUntrackedParameter(std::string const &, T const &) const
int getTrackID(const G4Track *) override
Definition: ECalSD.cc:248
std::vector< std::string > matNames_
bool forceSave
Definition: CaloSD.h:157
T * make(const Args &...args) const
make new ROOT object
std::string depth1Name
Definition: ECalSD.h:65
void addLevel(const std::string &name, const int &copyNumber)
std::map< const G4LogicalVolume *, double > xtalLMap
Definition: ECalSD.h:66
double getResponseWt(const G4Track *, int k=0)
Definition: CaloSD.cc:929
EcalBaseNumber theBaseNumber
Definition: ECalSD.h:68
bool storeTrack
Definition: ECalSD.h:61
double kmaxIon
Definition: CaloSD.h:155
bool suppressHeavy
Definition: CaloSD.h:154
Definition: tfile.py:1
static const int kEcalDepthMask
Definition: PCaloHit.h:61
double scaleRL
Definition: ECalSD.h:64
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
uint16_t getLayerIDForTimeSim()
Definition: ECalSD.cc:318
static const int kEcalDepthOffset
Definition: PCaloHit.h:62
const EcalSimulationParameters * ecalSimParameters_
Definition: ECalSD.h:59
ii
Definition: cuy.py:589
std::string depth2Name
Definition: ECalSD.h:65
G4ThreeVector currentLocalPoint
Definition: ECalSD.h:73
uint16_t getRadiationLength(const G4StepPoint *hitPoint, const G4LogicalVolume *lv)
Definition: ECalSD.cc:291
std::vector< const G4LogicalVolume * > useDepth1
Definition: ECalSD.h:67
bool ageingWithSlopeLY
Definition: ECalSD.h:70
bool useBirk
Definition: ECalSD.h:62
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3) const
Definition: CaloSD.cc:728
double calcLightCollectionEfficiencyWeighted(DetId id, double z)
HLT enums.
ECalSD(const std::string &, const EcalSimulationParameters *, const SensitiveDetectorCatalog &, edm::ParameterSet const &p, const SimTrackManager *)
Definition: ECalSD.cc:41
double birk2
Definition: ECalSD.h:63
uint16_t depth
Definition: ECalSD.h:76
CaloHitID currentID[2]
Definition: CaloSD.h:146
std::string noNameSpace(const std::string &name)
double curve_LY(const G4LogicalVolume *)
Definition: ECalSD.cc:432
step
Definition: StallMonitor.cc:83
EnergyResolutionVsLumi ageing
Definition: ECalSD.h:69
Log< level::Warning, false > LogWarning
void setNumberingScheme(EcalNumberingScheme *)
Definition: ECalSD.cc:332
uint32_t setDetUnitId(const G4Step *) override
Definition: ECalSD.cc:323
void setSize(const int &size)
long double T
double EnergyCorrected(const G4Step &, const G4Track *) override
Definition: ECalSD.cc:231
double birkCut
Definition: ECalSD.h:63
std::string crystalMat
Definition: ECalSD.h:65
double birk3
Definition: ECalSD.h:63
uint16_t getDepth(const G4Step *) override
Definition: ECalSD.cc:259