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
16 
20 
21 #include "DD4hep/Filter.h"
22 
23 #include "G4LogicalVolumeStore.hh"
24 #include "G4LogicalVolume.hh"
25 #include "G4Step.hh"
26 #include "G4Track.hh"
27 #include "G4VProcess.hh"
28 #include "G4SystemOfUnits.hh"
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 #ifdef EDM_ML_DEBUG
133  edm::LogVerbatim("EcalSim") << "Constructing a ECalSD with name " << GetName();
134 #endif
135  if (useWeight) {
136  edm::LogVerbatim("EcalSim") << "ECalSD:: Use of Birks law is set to " << useBirk
137  << " with three constants kB = " << birk1 / bunit << ", C1 = " << birk2
138  << ", C2 = " << birk3 << "\n Use of L3 parametrization " << useBirkL3
139  << " with slope " << birkSlope << " and cut off " << birkCut << "\n"
140  << " Slope for Light yield is set to " << slopeLY;
141  } else {
142  edm::LogVerbatim("EcalSim") << "ECalSD:: energy deposit is not corrected "
143  << " by Birk or light yield curve";
144  }
145 
146  edm::LogVerbatim("EcalSim") << "ECalSD:: Suppression Flag " << suppressHeavy << "\tprotons below "
147  << kmaxProton / CLHEP::MeV << " MeV,\tneutrons below " << kmaxNeutron / CLHEP::MeV
148  << " MeV,\tions below " << kmaxIon / CLHEP::MeV << " MeV \n\tDepth1 Name = " << depth1Name
149  << "\tDepth2 Name = " << depth2Name << "\n\tstoreRL " << storeRL << ":" << scaleRL
150  << "\tstoreLayerTimeSim " << storeLayerTimeSim << "\n\ttime Granularity "
151  << p.getParameter<edm::ParameterSet>("ECalSD").getParameter<double>("TimeSliceUnit")
152  << " ns";
153  if (useWeight)
154  initMap();
155 #ifdef plotDebug
157  if (tfile.isAvailable()) {
158  TFileDirectory ecDir = tfile->mkdir("ProfileFromECalSD");
159  static const std::string ctype[4] = {"EB", "EBref", "EE", "EERef"};
160  for (int k = 0; k < 4; ++k) {
161  std::string name = "ECLL_" + ctype[k];
162  std::string title = "Local vs Global for " + ctype[k];
163  double xmin = (k > 1) ? 3000.0 : 1000.0;
164  g2L_[k] = ecDir.make<TH2F>(name.c_str(), title.c_str(), 100, xmin, xmin + 1000., 100, 0.0, 3000.);
165  }
166  } else {
167  for (int k = 0; k < 4; ++k)
168  g2L_[k] = 0;
169  }
170 #endif
171  if (dump) {
172  const auto& lvNames = clg.logicalNames(name);
174  geom.update();
175  }
176 }
177 
179 
180 double ECalSD::getEnergyDeposit(const G4Step* aStep) {
181  const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
182  const G4Track* theTrack = aStep->GetTrack();
183  double edep = aStep->GetTotalEnergyDeposit();
184 
185  // take into account light collection curve for crystals
186  double weight = 1.;
187  if (suppressHeavy) {
188  TrackInformation* trkInfo = (TrackInformation*)(theTrack->GetUserInformation());
189  if (trkInfo) {
190  int pdg = theTrack->GetDefinition()->GetPDGEncoding();
191  if (!(trkInfo->isPrimary())) { // Only secondary particles
192  double ke = theTrack->GetKineticEnergy();
193  if (((pdg / 1000000000 == 1 && ((pdg / 10000) % 100) > 0 && ((pdg / 10) % 100) > 0)) && (ke < kmaxIon))
194  weight = 0;
195  if ((pdg == 2212) && (ke < kmaxProton))
196  weight = 0;
197  if ((pdg == 2112) && (ke < kmaxNeutron))
198  weight = 0;
199  }
200  }
201  }
202  const G4LogicalVolume* lv = preStepPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
203  double wt1 = 1.0;
204  if (useWeight && !any(noWeight, lv)) {
205  weight *= curve_LY(lv);
206  if (useBirk) {
207  if (useBirkL3)
208  weight *= getBirkL3(aStep);
209  else
210  weight *= getAttenuation(aStep, birk1, birk2, birk3);
211  }
212  wt1 = getResponseWt(theTrack);
213  }
214  edep *= weight * wt1;
215  // Russian Roulette
216  double wt2 = theTrack->GetWeight();
217  if (wt2 > 0.0) {
218  edep *= wt2;
219  }
220 #ifdef EDM_ML_DEBUG
221  edm::LogVerbatim("EcalSim") << lv->GetName() << " " << dd4hep::dd::noNamespace(lv->GetName())
222  << " Light Collection Efficiency " << weight << ":" << wt1 << " wt2= " << wt2
223  << " Weighted Energy Deposit " << edep / CLHEP::MeV << " MeV at "
224  << preStepPoint->GetPosition();
225 #endif
226  return edep;
227 }
228 
229 double ECalSD::EnergyCorrected(const G4Step& step, const G4Track* track) {
230  const G4StepPoint* hitPoint = step.GetPreStepPoint();
231  const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
232  if (lv->GetSensitiveDetector() != this)
233  return 0.0;
234 
235  double edep = step.GetTotalEnergyDeposit();
236  if (useWeight && !any(noWeight, lv)) {
237  currentLocalPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
238  auto ite = xtalLMap.find(lv);
239  crystalLength = (ite == xtalLMap.end()) ? 230._mm : std::abs(ite->second);
240  crystalDepth = (ite == xtalLMap.end()) ? 0.0 : (std::abs(0.5 * (ite->second) + currentLocalPoint.z()));
241  edep *= curve_LY(lv) * getResponseWt(track);
242  }
243  return edep;
244 }
245 
246 int ECalSD::getTrackID(const G4Track* aTrack) {
247  int primaryID(0);
248  if (storeTrack && depth > 0) {
249  forceSave = true;
250  primaryID = aTrack->GetTrackID();
251  } else {
252  primaryID = CaloSD::getTrackID(aTrack);
253  }
254  return primaryID;
255 }
256 
257 uint16_t ECalSD::getDepth(const G4Step* aStep) {
258  // this method should be called first at a step
259  const G4StepPoint* hitPoint = aStep->GetPreStepPoint();
260  currentLocalPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
261  const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
262 
263  auto ite = xtalLMap.find(lv);
264  crystalLength = (ite == xtalLMap.end()) ? 230._mm : std::abs(ite->second);
265  crystalDepth = (ite == xtalLMap.end()) ? 0.0 : (std::abs(0.5 * (ite->second) + currentLocalPoint.z()));
266  depth = any(useDepth1, lv) ? 1 : (any(useDepth2, lv) ? 2 : 0);
267  uint16_t depth1(0), depth2(0);
268  if (storeRL) {
269  depth1 = (ite == xtalLMap.end()) ? 0 : (((ite->second) >= 0) ? 0 : PCaloHit::kEcalDepthRefz);
270  depth2 = getRadiationLength(hitPoint, lv);
271  depth |= (((depth2 & PCaloHit::kEcalDepthMask) << PCaloHit::kEcalDepthOffset) | depth1);
272  } else if (storeLayerTimeSim) {
273  depth2 = getLayerIDForTimeSim();
275  }
276 #ifdef EDM_ML_DEBUG
277  if (isXtal(lv))
278  edm::LogVerbatim("EcalSimX") << "ECalSD::Volume " << lv->GetName() << " DetId " << std::hex << setDetUnitId(aStep)
279  << std::dec << " Global " << (hitPoint->GetPosition()).rho() << ":"
280  << (hitPoint->GetPosition()).z() << " Local Z " << currentLocalPoint.z() << " Depth "
281  << crystalDepth;
282  edm::LogVerbatim("EcalSim") << "ECalSD::Depth " << std::hex << depth1 << ":" << depth2 << ":" << depth << std::dec
283  << " L " << (ite == xtalLMap.end()) << ":" << ite->second << " local "
284  << currentLocalPoint << " Crystal length " << crystalLength << ":" << crystalDepth;
285 #endif
286  return depth;
287 }
288 
289 uint16_t ECalSD::getRadiationLength(const G4StepPoint* hitPoint, const G4LogicalVolume* lv) {
290  uint16_t thisX0 = 0;
291  if (useWeight) {
292  double radl = hitPoint->GetMaterial()->GetRadlen();
293  thisX0 = (uint16_t)floor(scaleRL * crystalDepth / radl);
294 #ifdef plotDebug
295  const std::string& lvname = dd4hep::dd::noNamespace(lv->GetName());
296  int k1 = (lvname.find("EFRY") != std::string::npos) ? 2 : 0;
297  int k2 = (lvname.find("refl") != std::string::npos) ? 1 : 0;
298  int kk = k1 + k2;
299  double rz = (k1 == 0) ? (hitPoint->GetPosition()).rho() : std::abs((hitPoint->GetPosition()).z());
300  edm::LogVerbatim("EcalSim") << lvname << " # " << k1 << ":" << k2 << ":" << kk << " rz " << rz << " D " << thisX0;
301  g2L_[kk]->Fill(rz, thisX0);
302 #endif
303 #ifdef EDM_ML_DEBUG
304  G4ThreeVector localPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
305  edm::LogVerbatim("EcalSim") << lv->GetName() << " " << dd4hep::dd::noNamespace(lv->GetName()) << " Global "
306  << hitPoint->GetPosition() << ":" << (hitPoint->GetPosition()).rho() << " Local "
307  << localPoint << " Crystal Length " << crystalLength << " Radl " << radl
308  << " crystalDepth " << crystalDepth << " Index " << thisX0 << " : "
310 #endif
311  }
312  return thisX0;
313 }
314 
316  const double invLayerSize = 0.1; //layer size in 1/mm
317  return (int)crystalDepth * invLayerSize;
318 }
319 
320 uint32_t ECalSD::setDetUnitId(const G4Step* aStep) {
321  if (numberingScheme_.get() == nullptr) {
322  return EBDetId(1, 1)();
323  } else {
324  getBaseNumber(aStep);
325  return numberingScheme_->getUnitID(theBaseNumber);
326  }
327 }
328 
330  if (scheme != nullptr) {
331  edm::LogVerbatim("EcalSim") << "EcalSD: updates numbering scheme for " << GetName();
332  numberingScheme_.reset(scheme);
333  }
334 }
335 
337  std::vector<const G4LogicalVolume*> lvused;
338  const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
339  std::map<const std::string, const G4LogicalVolume*> nameMap;
340  for (auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
341  nameMap.emplace(dd4hep::dd::noNamespace((*lvi)->GetName()), *lvi);
342 
343  for (unsigned int it = 0; it < ecalSimParameters_->lvNames_.size(); ++it) {
344  const std::string& matname = ecalSimParameters_->matNames_[it];
345  const std::string& lvname = ecalSimParameters_->lvNames_[it];
346  const G4LogicalVolume* lv = nameMap[lvname];
347  int ibec = (lvname.find("EFRY") == std::string::npos) ? 0 : 1;
348  int iref = (lvname.find("refl") == std::string::npos) ? 0 : 1;
349  int type = (ibec + iref == 1) ? 1 : -1;
350  if (depth1Name != " ") {
351  if (strncmp(lvname.c_str(), depth1Name.c_str(), 4) == 0) {
352  if (!any(useDepth1, lv)) {
353  useDepth1.push_back(lv);
354 #ifdef EDM_ML_DEBUG
355  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " in Depth 1 volume list";
356 #endif
357  }
358  const G4LogicalVolume* lvr = nameMap[lvname + "_refl"];
359  if (lvr != nullptr && !any(useDepth1, lvr)) {
360  useDepth1.push_back(lvr);
361 #ifdef EDM_ML_DEBUG
362  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << "_refl"
363  << " in Depth 1 volume list";
364 #endif
365  }
366  }
367  }
368  if (depth2Name != " ") {
369  if (strncmp(lvname.c_str(), depth2Name.c_str(), 4) == 0) {
370  if (!any(useDepth2, lv)) {
371  useDepth2.push_back(lv);
372 #ifdef EDM_ML_DEBUG
373  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " in Depth 2 volume list";
374 #endif
375  }
376  const G4LogicalVolume* lvr = nameMap[lvname + "_refl"];
377  if (lvr != nullptr && !any(useDepth2, lvr)) {
378  useDepth2.push_back(lvr);
379 #ifdef EDM_ML_DEBUG
380  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << "_refl"
381  << " in Depth 2 volume list";
382 #endif
383  }
384  }
385  }
386  if (lv != nullptr) {
387  if (crystalMat.size() == matname.size() && !strcmp(crystalMat.c_str(), matname.c_str())) {
388  if (!any(lvused, lv)) {
389  lvused.push_back(lv);
390  double dz = ecalSimParameters_->dzs_[it];
391  xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, dz * type));
392  lv = nameMap[lvname + "_refl"];
393  if (lv != nullptr) {
394  xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, -dz * type));
395  }
396  }
397  } else {
398  if (!any(noWeight, lv)) {
399  noWeight.push_back(lv);
400 #ifdef EDM_ML_DEBUG
401  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " Material " << matname
402  << " in noWeight list";
403 #endif
404  }
405  lv = nameMap[lvname];
406  if (lv != nullptr && !any(noWeight, lv)) {
407  noWeight.push_back(lv);
408 #ifdef EDM_ML_DEBUG
409  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " Material " << matname
410  << " in noWeight list";
411 #endif
412  }
413  }
414  }
415  }
416 #ifdef EDM_ML_DEBUG
417  edm::LogVerbatim("EcalSim") << "ECalSD: Length Table:";
418  int i = 0;
419  for (auto ite : xtalLMap) {
420  std::string name("Unknown");
421  if (ite.first != nullptr)
422  name = dd4hep::dd::noNamespace((ite.first)->GetName());
423  edm::LogVerbatim("EcalSim") << " " << i << " " << ite.first << " " << name << " L = " << ite.second;
424  ++i;
425  }
426 #endif
427 }
428 
429 double ECalSD::curve_LY(const G4LogicalVolume* lv) {
430  double weight = 1.;
431  if (ageingWithSlopeLY) {
432  //position along the crystal in mm from 0 to 230 (in EB)
433  if (crystalDepth >= -0.1 || crystalDepth <= crystalLength + 0.1)
435  } else {
436  double dapd = crystalLength - crystalDepth;
437  if (dapd >= -0.1 || dapd <= crystalLength + 0.1) {
438  if (dapd <= 100.)
439  weight = 1.0 + slopeLY - dapd * 0.01 * slopeLY;
440  } else {
441  edm::LogWarning("EcalSim") << "ECalSD: light coll curve : wrong distance "
442  << "to APD " << dapd << " crlength = " << crystalLength << ":" << crystalDepth
443  << " crystal name = " << lv->GetName() << " " << dd4hep::dd::noNamespace(lv->GetName())
444  << " z of localPoint = " << currentLocalPoint.z() << " take weight = " << weight;
445  }
446  }
447 #ifdef EDM_ML_DEBUG
448  edm::LogVerbatim("EcalSim") << "ECalSD: light coll curve : crlength = " << crystalLength << " Depth " << crystalDepth
449  << " crystal name = " << lv->GetName() << " " << dd4hep::dd::noNamespace(lv->GetName())
450  << " z of localPoint = " << currentLocalPoint.z() << " take weight = " << weight;
451 #endif
452  return weight;
453 }
454 
455 void ECalSD::getBaseNumber(const G4Step* aStep) {
457  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
458  int theSize = touch->GetHistoryDepth() + 1;
459  if (theBaseNumber.getCapacity() < theSize)
460  theBaseNumber.setSize(theSize);
461  //Get name and copy numbers
462  if (theSize > 1) {
463  for (int ii = 0; ii < theSize; ii++) {
464  std::string_view name = dd4hep::dd::noNamespace(touch->GetVolume(ii)->GetName());
465  theBaseNumber.addLevel(std::string(name), touch->GetReplicaNumber(ii));
466 #ifdef EDM_ML_DEBUG
467  edm::LogVerbatim("EcalSim") << "ECalSD::getBaseNumber(): Adding level " << ii << ": " << name << "["
468  << touch->GetReplicaNumber(ii) << "]";
469 #endif
470  }
471  }
472 }
473 
474 double ECalSD::getBirkL3(const G4Step* aStep) {
475  double weight = 1.;
476  const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
477  double charge = preStepPoint->GetCharge();
478 
479  if (charge != 0. && aStep->GetStepLength() > 0.) {
480  const G4Material* mat = preStepPoint->GetMaterial();
481  double density = mat->GetDensity();
482  double dedx = aStep->GetTotalEnergyDeposit() / aStep->GetStepLength();
483  double rkb = birk1 / density;
484  if (dedx > 0) {
485  weight = 1. - birkSlope * log(rkb * dedx);
486  if (weight < birkCut)
487  weight = birkCut;
488  else if (weight > 1.)
489  weight = 1.;
490  }
491 #ifdef EDM_ML_DEBUG
492  edm::LogVerbatim("EcalSim") << "ECalSD::getBirkL3 in " << dd4hep::dd::noNamespace(mat->GetName()) << " Charge "
493  << charge << " dE/dx " << dedx << " Birk Const " << rkb << " Weight = " << weight
494  << " dE " << aStep->GetTotalEnergyDeposit();
495 #endif
496  }
497  return weight;
498 }
499 
500 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:500
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
bool useBirkL3
Definition: ECalSD.h:62
double kmaxNeutron
Definition: CaloSD.h:149
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:455
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:180
bool useWeight
Definition: ECalSD.h:61
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *) const
Definition: CaloSD.cc:403
Definition: weight.py:1
std::unique_ptr< EcalNumberingScheme > numberingScheme_
Definition: ECalSD.h:60
virtual int getTrackID(const G4Track *)
Definition: CaloSD.cc:807
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:149
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:178
double getBirkL3(const G4Step *)
Definition: ECalSD.cc:474
void initMap()
Definition: ECalSD.cc:336
T getUntrackedParameter(std::string const &, T const &) const
int getTrackID(const G4Track *) override
Definition: ECalSD.cc:246
std::vector< std::string > matNames_
bool forceSave
Definition: CaloSD.h:151
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
EcalBaseNumber theBaseNumber
Definition: ECalSD.h:68
bool storeTrack
Definition: ECalSD.h:61
double kmaxIon
Definition: CaloSD.h:149
bool suppressHeavy
Definition: CaloSD.h:148
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:315
static const int kEcalDepthOffset
Definition: PCaloHit.h:62
uint32_t unitID() const
Definition: CaloHitID.h:20
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:289
std::vector< const G4LogicalVolume * > useDepth1
Definition: ECalSD.h:67
bool ageingWithSlopeLY
Definition: ECalSD.h:70
bool useBirk
Definition: ECalSD.h:62
CaloHitID currentID
Definition: CaloSD.h:142
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3) const
Definition: CaloSD.cc:665
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
double curve_LY(const G4LogicalVolume *)
Definition: ECalSD.cc:429
step
Definition: StallMonitor.cc:98
EnergyResolutionVsLumi ageing
Definition: ECalSD.h:69
Log< level::Warning, false > LogWarning
void setNumberingScheme(EcalNumberingScheme *)
Definition: ECalSD.cc:329
uint32_t setDetUnitId(const G4Step *) override
Definition: ECalSD.cc:320
double getResponseWt(const G4Track *)
Definition: CaloSD.cc:860
void setSize(const int &size)
long double T
double EnergyCorrected(const G4Step &, const G4Track *) override
Definition: ECalSD.cc:229
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:257