CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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));
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);
84  if (ageingWithSlopeLY)
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
120  scheme = dynamic_cast<EcalNumberingScheme*>(new EcalPreshowerNumberingScheme());
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 (scheme)
131  setNumberingScheme(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);
173  EcalDumpGeometry geom(lvNames, depth1Name, depth2Name, type);
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  double edep = step.GetTotalEnergyDeposit();
231  const G4StepPoint* hitPoint = step.GetPreStepPoint();
232  const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
233 
234  if (useWeight && !any(noWeight, lv)) {
235  currentLocalPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
236  auto ite = xtalLMap.find(lv);
237  crystalLength = (ite == xtalLMap.end()) ? 230._mm : std::abs(ite->second);
238  crystalDepth = (ite == xtalLMap.end()) ? 0.0 : (std::abs(0.5 * (ite->second) + currentLocalPoint.z()));
239  edep *= curve_LY(lv) * getResponseWt(track);
240  }
241  return edep;
242 }
243 
244 int ECalSD::getTrackID(const G4Track* aTrack) {
245  int primaryID(0);
246  if (storeTrack && depth > 0) {
247  forceSave = true;
248  primaryID = aTrack->GetTrackID();
249  } else {
250  primaryID = CaloSD::getTrackID(aTrack);
251  }
252  return primaryID;
253 }
254 
255 uint16_t ECalSD::getDepth(const G4Step* aStep) {
256  // this method should be called first at a step
257  const G4StepPoint* hitPoint = aStep->GetPreStepPoint();
258  currentLocalPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
259  const G4LogicalVolume* lv = hitPoint->GetTouchable()->GetVolume(0)->GetLogicalVolume();
260 
261  auto ite = xtalLMap.find(lv);
262  crystalLength = (ite == xtalLMap.end()) ? 230._mm : std::abs(ite->second);
263  crystalDepth = (ite == xtalLMap.end()) ? 0.0 : (std::abs(0.5 * (ite->second) + currentLocalPoint.z()));
264  depth = any(useDepth1, lv) ? 1 : (any(useDepth2, lv) ? 2 : 0);
265  uint16_t depth1(0), depth2(0);
266  if (storeRL) {
267  depth1 = (ite == xtalLMap.end()) ? 0 : (((ite->second) >= 0) ? 0 : PCaloHit::kEcalDepthRefz);
268  depth2 = getRadiationLength(hitPoint, lv);
269  depth |= (((depth2 & PCaloHit::kEcalDepthMask) << PCaloHit::kEcalDepthOffset) | depth1);
270  } else if (storeLayerTimeSim) {
271  depth2 = getLayerIDForTimeSim();
273  }
274 #ifdef EDM_ML_DEBUG
275  if (isXtal(lv))
276  edm::LogVerbatim("EcalSimX") << "ECalSD::Volume " << lv->GetName() << " DetId " << std::hex << setDetUnitId(aStep)
277  << std::dec << " Global " << (hitPoint->GetPosition()).rho() << ":"
278  << (hitPoint->GetPosition()).z() << " Local Z " << currentLocalPoint.z() << " Depth "
279  << crystalDepth;
280  edm::LogVerbatim("EcalSim") << "ECalSD::Depth " << std::hex << depth1 << ":" << depth2 << ":" << depth << std::dec
281  << " L " << (ite == xtalLMap.end()) << ":" << ite->second << " local "
282  << currentLocalPoint << " Crystal length " << crystalLength << ":" << crystalDepth;
283 #endif
284  return depth;
285 }
286 
287 uint16_t ECalSD::getRadiationLength(const G4StepPoint* hitPoint, const G4LogicalVolume* lv) {
288  uint16_t thisX0 = 0;
289  if (useWeight) {
290  double radl = hitPoint->GetMaterial()->GetRadlen();
291  thisX0 = (uint16_t)floor(scaleRL * crystalDepth / radl);
292 #ifdef plotDebug
293  const std::string& lvname = dd4hep::dd::noNamespace(lv->GetName());
294  int k1 = (lvname.find("EFRY") != std::string::npos) ? 2 : 0;
295  int k2 = (lvname.find("refl") != std::string::npos) ? 1 : 0;
296  int kk = k1 + k2;
297  double rz = (k1 == 0) ? (hitPoint->GetPosition()).rho() : std::abs((hitPoint->GetPosition()).z());
298  edm::LogVerbatim("EcalSim") << lvname << " # " << k1 << ":" << k2 << ":" << kk << " rz " << rz << " D " << thisX0;
299  g2L_[kk]->Fill(rz, thisX0);
300 #endif
301 #ifdef EDM_ML_DEBUG
302  G4ThreeVector localPoint = setToLocal(hitPoint->GetPosition(), hitPoint->GetTouchable());
303  edm::LogVerbatim("EcalSim") << lv->GetName() << " " << dd4hep::dd::noNamespace(lv->GetName()) << " Global "
304  << hitPoint->GetPosition() << ":" << (hitPoint->GetPosition()).rho() << " Local "
305  << localPoint << " Crystal Length " << crystalLength << " Radl " << radl
306  << " crystalDepth " << crystalDepth << " Index " << thisX0 << " : "
308 #endif
309  }
310  return thisX0;
311 }
312 
314  const double invLayerSize = 0.1; //layer size in 1/mm
315  return (int)crystalDepth * invLayerSize;
316 }
317 
318 uint32_t ECalSD::setDetUnitId(const G4Step* aStep) {
319  if (numberingScheme_.get() == nullptr) {
320  return EBDetId(1, 1)();
321  } else {
322  getBaseNumber(aStep);
323  return numberingScheme_->getUnitID(theBaseNumber);
324  }
325 }
326 
328  if (scheme != nullptr) {
329  edm::LogVerbatim("EcalSim") << "EcalSD: updates numbering scheme for " << GetName();
330  numberingScheme_.reset(scheme);
331  }
332 }
333 
335  std::vector<const G4LogicalVolume*> lvused;
336  const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
337  std::map<const std::string, const G4LogicalVolume*> nameMap;
338  for (auto lvi = lvs->begin(), lve = lvs->end(); lvi != lve; ++lvi)
339  nameMap.emplace(dd4hep::dd::noNamespace((*lvi)->GetName()), *lvi);
340 
341  for (unsigned int it = 0; it < ecalSimParameters_->lvNames_.size(); ++it) {
342  const std::string& matname = ecalSimParameters_->matNames_[it];
343  const std::string& lvname = ecalSimParameters_->lvNames_[it];
344  const G4LogicalVolume* lv = nameMap[lvname];
345  int ibec = (lvname.find("EFRY") == std::string::npos) ? 0 : 1;
346  int iref = (lvname.find("refl") == std::string::npos) ? 0 : 1;
347  int type = (ibec + iref == 1) ? 1 : -1;
348  if (depth1Name != " ") {
349  if (strncmp(lvname.c_str(), depth1Name.c_str(), 4) == 0) {
350  if (!any(useDepth1, lv)) {
351  useDepth1.push_back(lv);
352 #ifdef EDM_ML_DEBUG
353  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " in Depth 1 volume list";
354 #endif
355  }
356  const G4LogicalVolume* lvr = nameMap[lvname + "_refl"];
357  if (lvr != nullptr && !any(useDepth1, lvr)) {
358  useDepth1.push_back(lvr);
359 #ifdef EDM_ML_DEBUG
360  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << "_refl"
361  << " in Depth 1 volume list";
362 #endif
363  }
364  }
365  }
366  if (depth2Name != " ") {
367  if (strncmp(lvname.c_str(), depth2Name.c_str(), 4) == 0) {
368  if (!any(useDepth2, lv)) {
369  useDepth2.push_back(lv);
370 #ifdef EDM_ML_DEBUG
371  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " in Depth 2 volume list";
372 #endif
373  }
374  const G4LogicalVolume* lvr = nameMap[lvname + "_refl"];
375  if (lvr != nullptr && !any(useDepth2, lvr)) {
376  useDepth2.push_back(lvr);
377 #ifdef EDM_ML_DEBUG
378  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << "_refl"
379  << " in Depth 2 volume list";
380 #endif
381  }
382  }
383  }
384  if (lv != nullptr) {
385  if (crystalMat.size() == matname.size() && !strcmp(crystalMat.c_str(), matname.c_str())) {
386  if (!any(lvused, lv)) {
387  lvused.push_back(lv);
388  double dz = ecalSimParameters_->dzs_[it];
389  xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, dz * type));
390  lv = nameMap[lvname + "_refl"];
391  if (lv != nullptr) {
392  xtalLMap.insert(std::pair<const G4LogicalVolume*, double>(lv, -dz * type));
393  }
394  }
395  } else {
396  if (!any(noWeight, lv)) {
397  noWeight.push_back(lv);
398 #ifdef EDM_ML_DEBUG
399  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " Material " << matname
400  << " in noWeight list";
401 #endif
402  }
403  lv = nameMap[lvname];
404  if (lv != nullptr && !any(noWeight, lv)) {
405  noWeight.push_back(lv);
406 #ifdef EDM_ML_DEBUG
407  edm::LogVerbatim("EcalSim") << "ECalSD::initMap Logical Volume " << lvname << " Material " << matname
408  << " in noWeight list";
409 #endif
410  }
411  }
412  }
413  }
414 #ifdef EDM_ML_DEBUG
415  edm::LogVerbatim("EcalSim") << "ECalSD: Length Table:";
416  int i = 0;
417  for (auto ite : xtalLMap) {
418  std::string name("Unknown");
419  if (ite.first != nullptr)
420  name = dd4hep::dd::noNamespace((ite.first)->GetName());
421  edm::LogVerbatim("EcalSim") << " " << i << " " << ite.first << " " << name << " L = " << ite.second;
422  ++i;
423  }
424 #endif
425 }
426 
427 double ECalSD::curve_LY(const G4LogicalVolume* lv) {
428  double weight = 1.;
429  if (ageingWithSlopeLY) {
430  //position along the crystal in mm from 0 to 230 (in EB)
431  if (crystalDepth >= -0.1 || crystalDepth <= crystalLength + 0.1)
433  } else {
434  double dapd = crystalLength - crystalDepth;
435  if (dapd >= -0.1 || dapd <= crystalLength + 0.1) {
436  if (dapd <= 100.)
437  weight = 1.0 + slopeLY - dapd * 0.01 * slopeLY;
438  } else {
439  edm::LogWarning("EcalSim") << "ECalSD: light coll curve : wrong distance "
440  << "to APD " << dapd << " crlength = " << crystalLength << ":" << crystalDepth
441  << " crystal name = " << lv->GetName() << " " << dd4hep::dd::noNamespace(lv->GetName())
442  << " z of localPoint = " << currentLocalPoint.z() << " take weight = " << weight;
443  }
444  }
445 #ifdef EDM_ML_DEBUG
446  edm::LogVerbatim("EcalSim") << "ECalSD: light coll curve : crlength = " << crystalLength << " Depth " << crystalDepth
447  << " crystal name = " << lv->GetName() << " " << dd4hep::dd::noNamespace(lv->GetName())
448  << " z of localPoint = " << currentLocalPoint.z() << " take weight = " << weight;
449 #endif
450  return weight;
451 }
452 
453 void ECalSD::getBaseNumber(const G4Step* aStep) {
455  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
456  int theSize = touch->GetHistoryDepth() + 1;
457  if (theBaseNumber.getCapacity() < theSize)
458  theBaseNumber.setSize(theSize);
459  //Get name and copy numbers
460  if (theSize > 1) {
461  for (int ii = 0; ii < theSize; ii++) {
462  std::string_view name = dd4hep::dd::noNamespace(touch->GetVolume(ii)->GetName());
463  theBaseNumber.addLevel(std::string(name), touch->GetReplicaNumber(ii));
464 #ifdef EDM_ML_DEBUG
465  edm::LogVerbatim("EcalSim") << "ECalSD::getBaseNumber(): Adding level " << ii << ": " << name << "["
466  << touch->GetReplicaNumber(ii) << "]";
467 #endif
468  }
469  }
470 }
471 
472 double ECalSD::getBirkL3(const G4Step* aStep) {
473  double weight = 1.;
474  const G4StepPoint* preStepPoint = aStep->GetPreStepPoint();
475  double charge = preStepPoint->GetCharge();
476 
477  if (charge != 0. && aStep->GetStepLength() > 0.) {
478  const G4Material* mat = preStepPoint->GetMaterial();
479  double density = mat->GetDensity();
480  double dedx = aStep->GetTotalEnergyDeposit() / aStep->GetStepLength();
481  double rkb = birk1 / density;
482  if (dedx > 0) {
483  weight = 1. - birkSlope * log(rkb * dedx);
484  if (weight < birkCut)
485  weight = birkCut;
486  else if (weight > 1.)
487  weight = 1.;
488  }
489 #ifdef EDM_ML_DEBUG
490  edm::LogVerbatim("EcalSim") << "ECalSD::getBirkL3 in " << dd4hep::dd::noNamespace(mat->GetName()) << " Charge "
491  << charge << " dE/dx " << dedx << " Birk Const " << rkb << " Weight = " << weight
492  << " dE " << aStep->GetTotalEnergyDeposit();
493 #endif
494  }
495  return weight;
496 }
497 
498 bool ECalSD::isXtal(const G4LogicalVolume* lv) { return (xtalLMap.find(lv) != xtalLMap.end()); }
Log< level::Info, true > LogVerbatim
T getUntrackedParameter(std::string const &, T const &) const
double crystalLength
Definition: ECalSD.h:74
bool isXtal(const G4LogicalVolume *)
Definition: ECalSD.cc:498
bool useBirkL3
Definition: ECalSD.h:62
static std::vector< std::string > checklist log
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:453
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
std::unique_ptr< EcalNumberingScheme > numberingScheme_
Definition: ECalSD.h:60
virtual int getTrackID(const G4Track *)
Definition: CaloSD.cc:796
double crystalDepth
Definition: ECalSD.h:75
Log< level::Error, false > LogError
const std::vector< std::string_view > logicalNames(const std::string &readoutName) const
int ii
Definition: cuy.py:589
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
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:472
void initMap()
Definition: ECalSD.cc:334
int getTrackID(const G4Track *) override
Definition: ECalSD.cc:244
const double MeV
std::vector< std::string > matNames_
bool forceSave
Definition: CaloSD.h:151
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
static const int kEcalDepthMask
Definition: PCaloHit.h:61
double scaleRL
Definition: ECalSD.h:64
bool isAvailable() const
Definition: Service.h:40
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
uint16_t getLayerIDForTimeSim()
Definition: ECalSD.cc:313
static const int kEcalDepthOffset
Definition: PCaloHit.h:62
T * make(const Args &...args) const
make new ROOT object
const EcalSimulationParameters * ecalSimParameters_
Definition: ECalSD.h:59
std::string depth2Name
Definition: ECalSD.h:65
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *) const
Definition: CaloSD.cc:394
G4ThreeVector currentLocalPoint
Definition: ECalSD.h:73
uint16_t getRadiationLength(const G4StepPoint *hitPoint, const G4LogicalVolume *lv)
Definition: ECalSD.cc:287
std::vector< const G4LogicalVolume * > useDepth1
Definition: ECalSD.h:67
bool ageingWithSlopeLY
Definition: ECalSD.h:70
bool useBirk
Definition: ECalSD.h:62
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
Definition: TFileService.h:69
CaloHitID currentID
Definition: CaloSD.h:142
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
int ke
bool isPrimary() const
double calcLightCollectionEfficiencyWeighted(DetId id, double z)
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3) const
Definition: CaloSD.cc:657
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:427
step
Definition: StallMonitor.cc:94
tuple tfile
Definition: compare.py:324
EnergyResolutionVsLumi ageing
Definition: ECalSD.h:69
Log< level::Warning, false > LogWarning
int weight
Definition: histoStyle.py:51
uint32_t unitID() const
Definition: CaloHitID.h:20
void setNumberingScheme(EcalNumberingScheme *)
Definition: ECalSD.cc:327
uint32_t setDetUnitId(const G4Step *) override
Definition: ECalSD.cc:318
double getResponseWt(const G4Track *)
Definition: CaloSD.cc:849
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
tuple dump
OutputFilePath = cms.string(&#39;/tmp/zhokin/&#39;), OutputFileExt = cms.string(&#39;&#39;),.
uint16_t getDepth(const G4Step *) override
Definition: ECalSD.cc:255