CMS 3D CMS Logo

HCalSD.cc
Go to the documentation of this file.
1 // File: HCalSD.cc
3 // Description: Sensitive Detector class for calorimeters
5 
13 
18 
19 #include "G4LogicalVolumeStore.hh"
20 #include "G4LogicalVolume.hh"
21 #include "G4Step.hh"
22 #include "G4Track.hh"
23 
24 #include "G4SystemOfUnits.hh"
25 #include "G4PhysicalConstants.hh"
26 #include "Randomize.hh"
27 
28 #include "DD4hep/Filter.h"
29 
30 #include <iostream>
31 #include <fstream>
32 #include <iomanip>
33 #include <sstream>
34 
35 //#define EDM_ML_DEBUG
36 //#define plotDebug
37 //#define printDebug
38 
39 #ifdef plotDebug
40 #include <TH1F.h>
41 #endif
42 
44  const HcalDDDSimConstants* hcns,
45  const HcalDDDRecConstants* hcnr,
46  const HcalSimulationConstants* hscs,
47  const HBHEDarkening* hbd,
48  const HBHEDarkening* hed,
49  const SensitiveDetectorCatalog& clg,
50  edm::ParameterSet const& p,
51  const SimTrackManager* manager)
52  : CaloSD(name,
53  clg,
54  p,
55  manager,
56  (float)(p.getParameter<edm::ParameterSet>("HCalSD").getParameter<double>("TimeSliceUnit")),
57  p.getParameter<edm::ParameterSet>("HCalSD").getParameter<bool>("IgnoreTrackID")),
58  hcalConstants_(hcns),
59  hcalSimConstants_(hscs),
60  m_HBDarkening(hbd),
61  m_HEDarkening(hed),
62  isHF(false),
63  weight_(1.0),
64  depth_(1) {
65  numberingFromDDD.reset(nullptr);
66  numberingScheme.reset(nullptr);
67  showerLibrary.reset(nullptr);
68  hfshower.reset(nullptr);
69  showerParam.reset(nullptr);
70  showerPMT.reset(nullptr);
71  showerBundle.reset(nullptr);
72  m_HFDarkening.reset(nullptr);
73  m_HcalTestNS.reset(nullptr);
74 
75  //static SimpleConfigurable<double> bk1(0.013, "HCalSD:BirkC1");
76  //static SimpleConfigurable<double> bk2(0.0568,"HCalSD:BirkC2");
77  //static SimpleConfigurable<double> bk3(1.75, "HCalSD:BirkC3");
78  // Values from NIM 80 (1970) 239-244: as implemented in Geant3
79 
80  bool dd4hep = p.getParameter<bool>("g4GeometryDD4hepSource");
81  edm::ParameterSet m_HC = p.getParameter<edm::ParameterSet>("HCalSD");
82  useBirk = m_HC.getParameter<bool>("UseBirkLaw");
83  double bunit = (CLHEP::g / (CLHEP::MeV * CLHEP::cm2));
84  birk1 = m_HC.getParameter<double>("BirkC1") * bunit;
85  birk2 = m_HC.getParameter<double>("BirkC2");
86  birk3 = m_HC.getParameter<double>("BirkC3");
87  useShowerLibrary = m_HC.getParameter<bool>("UseShowerLibrary");
88  useParam = m_HC.getParameter<bool>("UseParametrize");
89  testNumber = m_HC.getParameter<bool>("TestNumberingScheme");
90  neutralDensity = m_HC.getParameter<bool>("doNeutralDensityFilter");
91  usePMTHit = m_HC.getParameter<bool>("UsePMTHits");
92  betaThr = m_HC.getParameter<double>("BetaThreshold");
93  eminHitHB = m_HC.getParameter<double>("EminHitHB") * MeV;
94  eminHitHE = m_HC.getParameter<double>("EminHitHE") * MeV;
95  eminHitHO = m_HC.getParameter<double>("EminHitHO") * MeV;
96  eminHitHF = m_HC.getParameter<double>("EminHitHF") * MeV;
97  useFibreBundle = m_HC.getParameter<bool>("UseFibreBundleHits");
98  deliveredLumi = m_HC.getParameter<double>("DelivLuminosity");
99  agingFlagHB = m_HC.getParameter<bool>("HBDarkening");
100  agingFlagHE = m_HC.getParameter<bool>("HEDarkening");
101  bool agingFlagHF = m_HC.getParameter<bool>("HFDarkening");
102  useHF = m_HC.getUntrackedParameter<bool>("UseHF", true);
103  bool forTBHC = m_HC.getUntrackedParameter<bool>("ForTBHCAL", false);
104  bool forTBH2 = m_HC.getUntrackedParameter<bool>("ForTBH2", false);
105  useLayerWt = m_HC.getUntrackedParameter<bool>("UseLayerWt", false);
106  std::string file = m_HC.getUntrackedParameter<std::string>("WtFile", "None");
107  testNS_ = m_HC.getUntrackedParameter<bool>("TestNS", false);
108  edm::ParameterSet m_HF = p.getParameter<edm::ParameterSet>("HFShower");
109  applyFidCut = m_HF.getParameter<bool>("ApplyFiducialCut");
110  bool dumpGeom = m_HC.getUntrackedParameter<bool>("DumpGeometry", false);
111 
112 #ifdef EDM_ML_DEBUG
113  edm::LogVerbatim("HcalSim") << "***************************************************"
114  << "\n"
115  << "* Constructing a HCalSD with name " << name << "\n"
116  << "\n"
117  << "***************************************************";
118 #endif
119  edm::LogVerbatim("HcalSim") << "HCalSD:: Use of HF code is set to " << useHF
120  << "\n Use of shower parametrization set to " << useParam
121  << "\n Use of shower library is set to " << useShowerLibrary
122  << "\n Use PMT Hit is set to " << usePMTHit << " with beta Threshold " << betaThr
123  << "\n USe of FibreBundle Hit set to " << useFibreBundle
124  << "\n Use of Birks law is set to " << useBirk
125  << " with three constants kB = " << birk1 / bunit << ", C1 = " << birk2
126  << ", C2 = " << birk3;
127  edm::LogVerbatim("HcalSim") << "HCalSD:: Suppression Flag " << suppressHeavy << " protons below " << kmaxProton
128  << " MeV,"
129  << " neutrons below " << kmaxNeutron << " MeV and"
130  << " ions below " << kmaxIon << " MeV\n"
131  << " Threshold for storing hits in HB: " << eminHitHB << " HE: " << eminHitHE
132  << " HO: " << eminHitHO << " HF: " << eminHitHF << "\n"
133  << "Delivered luminosity for Darkening " << deliveredLumi << " Flag (HE) " << agingFlagHE
134  << " Flag (HB) " << agingFlagHB << " Flag (HF) " << agingFlagHF << "\n"
135  << "Application of Fiducial Cut " << applyFidCut
136  << "Flag for test number|neutral density filter " << testNumber << " " << neutralDensity;
137 
138  if (forTBHC) {
139  useHF = false;
140  matNames.emplace_back("Scintillator");
141  } else {
143  }
144 
146  if (testNumber || forTBH2) {
147  scheme = dynamic_cast<HcalNumberingScheme*>(new HcalTestNumberingScheme(forTBH2));
148  } else {
149  scheme = new HcalNumberingScheme();
150  }
152 
153  // always call getFromLibrary() method to identify HF region
154  setParameterized(true);
155 
156  const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
157  // std::vector<G4LogicalVolume *>::const_iterator lvcite;
158  const G4LogicalVolume* lv;
159  std::string attribute, value;
160 
161  if (useHF) {
162  if (useParam) {
163  showerParam = std::make_unique<HFShowerParam>(name, hcalConstants_, hcalSimConstants_->hcalsimpar(), p);
164  } else {
165  if (useShowerLibrary) {
166  showerLibrary = std::make_unique<HFShowerLibrary>(name, hcalConstants_, hcalSimConstants_->hcalsimpar(), p);
167  }
168  hfshower = std::make_unique<HFShower>(name, hcalConstants_, hcalSimConstants_->hcalsimpar(), p, 0);
169  }
170 
171  // HF volume names
173  const std::vector<int>& temp = hcalSimConstants_->hcalsimpar()->hfLevels_;
174 #ifdef EDM_ML_DEBUG
175  std::stringstream ss0;
176  ss0 << "HCalSD: Names to be tested for Volume = HF has " << hfNames.size() << " elements";
177 #endif
178  int addlevel = dd4hep ? 1 : 0;
179  for (unsigned int i = 0; i < hfNames.size(); ++i) {
180  G4String namv(static_cast<std::string>(dd4hep::dd::noNamespace(hfNames[i])));
181  lv = nullptr;
182  for (auto lvol : *lvs) {
183  if (dd4hep::dd::noNamespace(lvol->GetName()) == namv) {
184  lv = lvol;
185  break;
186  }
187  }
188  hfLV.emplace_back(lv);
189  hfLevels.emplace_back(temp[i] + addlevel);
190 #ifdef EDM_ML_DEBUG
191  ss0 << "\n HF[" << i << "] = " << namv << " LV " << lv << " at level " << (temp[i] + addlevel);
192 #endif
193  }
194 #ifdef EDM_ML_DEBUG
195  edm::LogVerbatim("HcalSim") << ss0.str();
196 #endif
197  // HF Fibre volume names
200  const std::vector<std::string>& pmtNames = hcalSimConstants_->hcalsimpar()->hfPMTNames_;
201  fillLogVolumeVector("HFPMT", pmtNames, pmtLV);
202  const std::vector<std::string>& straightNames = hcalSimConstants_->hcalsimpar()->hfFibreStraightNames_;
203  fillLogVolumeVector("HFFibreBundleStraight", straightNames, fibre1LV);
204  const std::vector<std::string>& conicalNames = hcalSimConstants_->hcalsimpar()->hfFibreConicalNames_;
205  fillLogVolumeVector("HFFibreBundleConical", conicalNames, fibre2LV);
206  }
207 
208  //Material list for HB/HE/HO sensitive detectors
209  const G4MaterialTable* matTab = G4Material::GetMaterialTable();
210  std::vector<G4Material*>::const_iterator matite;
211  for (auto const& namx : matNames) {
212  const G4Material* mat = nullptr;
213  for (matite = matTab->begin(); matite != matTab->end(); ++matite) {
214  if (static_cast<std::string>(dd4hep::dd::noNamespace((*matite)->GetName())) == namx) {
215  mat = (*matite);
216  break;
217  }
218  }
219  materials.emplace_back(mat);
220  }
221 #ifdef EDM_ML_DEBUG
222  std::stringstream ss1;
223  for (unsigned int i = 0; i < matNames.size(); ++i) {
224  if (i / 10 * 10 == i) {
225  ss1 << "\n";
226  }
227  ss1 << " " << matNames[i];
228  }
229  edm::LogVerbatim("HcalSim") << "HCalSD: Material names for HCAL: " << ss1.str();
230 #endif
231  if (useLayerWt) {
233  }
234  numberingFromDDD = std::make_unique<HcalNumberingFromDDD>(hcalConstants_);
235 
236  //Special Geometry parameters
238 #ifdef EDM_ML_DEBUG
239  std::stringstream ss2;
240  for (unsigned int ig = 0; ig < gpar.size(); ig++) {
241  ss2 << "\n gpar[" << ig << "] = " << gpar[ig] / cm << " cm";
242  }
243  edm::LogVerbatim("HcalSim") << "Maximum depth for HF " << hcalConstants_->getMaxDepth(2) << gpar.size()
244  << " gpar (cm)" << ss2.str();
245 #endif
246 
247  //Test Hcal Numbering Scheme
248  if (testNS_)
249  m_HcalTestNS = std::make_unique<HcalTestNS>(hcnr);
250 
251  for (int i = 0; i < 9; ++i) {
252  hit_[i] = time_[i] = dist_[i] = nullptr;
253  }
254  hzvem = hzvhad = nullptr;
255 
256  if (agingFlagHF) {
257  m_HFDarkening = std::make_unique<HFDarkening>(m_HC.getParameter<edm::ParameterSet>("HFDarkeningParameterBlock"));
258  }
259 #ifdef plotDebug
261 
262  if (tfile.isAvailable()) {
263  static const char* const labels[] = {"HB",
264  "HE",
265  "HO",
266  "HF Absorber",
267  "HF PMT",
268  "HF Absorber Long",
269  "HF Absorber Short",
270  "HF PMT Long",
271  "HF PMT Short"};
272  TFileDirectory hcDir = tfile->mkdir("ProfileFromHCalSD");
273  char name[20], title[60];
274  for (int i = 0; i < 9; ++i) {
275  sprintf(title, "Hit energy in %s", labels[i]);
276  sprintf(name, "HCalSDHit%d", i);
277  hit_[i] = hcDir.make<TH1F>(name, title, 2000, 0., 2000.);
278  sprintf(title, "Energy (MeV)");
279  hit_[i]->GetXaxis()->SetTitle(title);
280  hit_[i]->GetYaxis()->SetTitle("Hits");
281  sprintf(title, "Time of the hit in %s", labels[i]);
282  sprintf(name, "HCalSDTime%d", i);
283  time_[i] = hcDir.make<TH1F>(name, title, 2000, 0., 2000.);
284  sprintf(title, "Time (ns)");
285  time_[i]->GetXaxis()->SetTitle(title);
286  time_[i]->GetYaxis()->SetTitle("Hits");
287  sprintf(title, "Longitudinal profile in %s", labels[i]);
288  sprintf(name, "HCalSDDist%d", i);
289  dist_[i] = hcDir.make<TH1F>(name, title, 2000, 0., 2000.);
290  sprintf(title, "Distance (mm)");
291  dist_[i]->GetXaxis()->SetTitle(title);
292  dist_[i]->GetYaxis()->SetTitle("Hits");
293  }
294  if (useHF && (!useParam)) {
295  hzvem = hcDir.make<TH1F>("hzvem", "Longitudinal Profile (EM Part)", 330, 0.0, 1650.0);
296  hzvem->GetXaxis()->SetTitle("Longitudinal Profile (EM Part)");
297  hzvhad = hcDir.make<TH1F>("hzvhad", "Longitudinal Profile (Had Part)", 330, 0.0, 1650.0);
298  hzvhad->GetXaxis()->SetTitle("Longitudinal Profile (Hadronic Part)");
299  }
300  }
301 #endif
302  if (dumpGeom) {
303  std::unique_ptr<HcalNumberingFromDDD> hcn = std::make_unique<HcalNumberingFromDDD>(hcalConstants_);
304  const auto& lvNames = clg.logicalNames(name);
305  HcalDumpGeometry geom(lvNames, hcn.get(), testNumber, false);
306  geom.update();
307  }
308 }
309 
311  const std::vector<std::string>& lvnames,
312  std::vector<const G4LogicalVolume*>& lvvec) {
313  const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
314  const G4LogicalVolume* lv;
315  std::stringstream ss3;
316  ss3 << "HCalSD: " << lvnames.size() << " names to be tested for Volume <" << value << ">:";
317  for (unsigned int i = 0; i < lvnames.size(); ++i) {
318  G4String namv(static_cast<std::string>(dd4hep::dd::noNamespace(lvnames[i])));
319  lv = nullptr;
320  for (auto lvol : *lvs) {
321  if (dd4hep::dd::noNamespace(lvol->GetName()) == namv) {
322  lv = lvol;
323  break;
324  }
325  }
326  lvvec.emplace_back(lv);
327  if (i / 10 * 10 == i) {
328  ss3 << "\n";
329  }
330  ss3 << " " << namv;
331  }
332  edm::LogVerbatim("HcalSim") << ss3.str();
333 }
334 
335 bool HCalSD::getFromLibrary(const G4Step* aStep) {
336  auto const track = aStep->GetTrack();
337  depth_ = (aStep->GetPreStepPoint()->GetTouchable()->GetReplicaNumber(0)) % 10;
338  weight_ = 1.0;
339  bool kill(false);
340  isHF = isItHF(aStep);
341 #ifdef EDM_ML_DEBUG
342  edm::LogVerbatim("HcalSim") << "GetFromLibrary: isHF " << isHF << " darken " << (m_HFDarkening != nullptr)
343  << " useParam " << useParam << " useShowerLibrary " << useShowerLibrary << " Muon? "
344  << G4TrackToParticleID::isMuon(track) << " electron? "
345  << G4TrackToParticleID::isGammaElectronPositron(track) << " Stable Hadron? "
347 #endif
348  if (isHF) {
349  if (m_HFDarkening) {
350  G4ThreeVector hitPoint = aStep->GetPreStepPoint()->GetPosition();
351  const double invcm = 1. / CLHEP::cm;
352  double r = hitPoint.perp() * invcm;
353  double z = std::abs(hitPoint.z()) * invcm;
354  double dose_acquired = 0.;
356  unsigned int hfZLayer = (unsigned int)((z - HFDarkening::lowZLimit) / 5);
357  if (hfZLayer >= HFDarkening::upperZLimit)
358  hfZLayer = (HFDarkening::upperZLimit - 1);
359  float normalized_lumi = m_HFDarkening->int_lumi(deliveredLumi);
360  for (int i = hfZLayer; i != HFDarkening::numberOfZLayers; ++i) {
361  dose_acquired = m_HFDarkening->dose(i, r);
362  weight_ *= m_HFDarkening->degradation(normalized_lumi * dose_acquired);
363  }
364  }
365 #ifdef EDM_ML_DEBUG
366  edm::LogVerbatim("HcalSim") << "HCalSD::getFromLibrary: HFLumiDarkening at "
367  << "r= " << r << ", z= " << z << " Dose= " << dose_acquired << " weight= " << weight_;
368 #endif
369  }
370 
371  if (useParam) {
372  getFromParam(aStep, kill);
373 #ifdef EDM_ML_DEBUG
374  G4String nameVolume = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetLogicalVolume()->GetName();
375  edm::LogVerbatim("HcalSim") << "HCalSD: " << getNumberOfHits() << " hits from parametrization in " << nameVolume
376  << " for Track " << track->GetTrackID() << " ("
377  << track->GetDefinition()->GetParticleName() << ")";
378 #endif
381 #ifdef EDM_ML_DEBUG
382  auto nameVolume = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetLogicalVolume()->GetName();
383  edm::LogVerbatim("HcalSim") << "HCalSD: Starts shower library from " << nameVolume << " for Track "
384  << track->GetTrackID() << " (" << track->GetDefinition()->GetParticleName() << ")";
385 
386 #endif
387  getFromHFLibrary(aStep, kill);
388  }
389  }
390  }
391 #ifdef EDM_ML_DEBUG
392  edm::LogVerbatim("HcalSim") << "HCalSD::getFromLibrary ID= " << track->GetTrackID() << " ("
393  << track->GetDefinition()->GetParticleName() << ") kill= " << kill
394  << " weight= " << weight_ << " depth= " << depth_ << " isHF: " << isHF;
395 #endif
396  return kill;
397 }
398 
399 double HCalSD::getEnergyDeposit(const G4Step* aStep) {
400  double destep(0.0);
401  auto const lv = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetLogicalVolume();
402  auto const theTrack = aStep->GetTrack();
403 
404  if (isHF) {
405  if (useShowerLibrary && G4TrackToParticleID::isMuon(theTrack) && isItFibre(lv)) {
406 #ifdef EDM_ML_DEBUG
407  edm::LogVerbatim("HcalSim") << "HCalSD: Hit at Fibre in LV " << lv->GetName() << " for track "
408  << aStep->GetTrack()->GetTrackID() << " ("
409  << aStep->GetTrack()->GetDefinition()->GetParticleName() << ")";
410 #endif
411  hitForFibre(aStep);
412  }
413  return destep;
414  }
415 
416  if (isItPMT(lv)) {
417  if (usePMTHit && showerPMT) {
418  getHitPMT(aStep);
419  }
420 #ifdef EDM_ML_DEBUG
421  edm::LogVerbatim("HcalSim") << "HCalSD: Hit from PMT parametrization in LV " << lv->GetName() << " for Track "
422  << aStep->GetTrack()->GetTrackID() << " ("
423  << aStep->GetTrack()->GetDefinition()->GetParticleName() << ")";
424 #endif
425  return destep;
426 
427  } else if (isItStraightBundle(lv)) {
428  if (useFibreBundle && showerBundle) {
429  getHitFibreBundle(aStep, false);
430  }
431 #ifdef EDM_ML_DEBUG
432  edm::LogVerbatim("HcalSim") << "HCalSD: Hit from straight FibreBundle in LV: " << lv->GetName() << " for track "
433  << aStep->GetTrack()->GetTrackID() << " ("
434  << aStep->GetTrack()->GetDefinition()->GetParticleName() << ")";
435 #endif
436  return destep;
437 
438  } else if (isItConicalBundle(lv)) {
439  if (useFibreBundle && showerBundle) {
440  getHitFibreBundle(aStep, true);
441  }
442 #ifdef EDM_ML_DEBUG
443  edm::LogVerbatim("HcalSim") << "HCalSD: Hit from conical FibreBundle PV: " << lv->GetName() << " for track "
444  << aStep->GetTrack()->GetTrackID() << " ("
445  << aStep->GetTrack()->GetDefinition()->GetParticleName() << ")";
446 #endif
447  return destep;
448  }
449 
450  // normal hit
451  destep = aStep->GetTotalEnergyDeposit();
452 
453  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
454  uint32_t detid = setDetUnitId(aStep);
455  int det(0), ieta(0), phi(0), z(0), lay, depth(-1);
456  if (testNumber) {
457  HcalTestNumbering::unpackHcalIndex(detid, det, z, depth, ieta, phi, lay);
458  if (z == 0) {
459  z = -1;
460  }
461  } else {
462  HcalDetId hcid(detid);
463  det = hcid.subdetId();
464  ieta = hcid.ietaAbs();
465  phi = hcid.iphi();
466  z = hcid.zside();
467  }
468  lay = (touch->GetReplicaNumber(0) / 10) % 100 + 1;
469 #ifdef EDM_ML_DEBUG
470  edm::LogVerbatim("HcalSim") << "HCalSD: det: " << det << " ieta: " << ieta << " iphi: " << phi << " zside " << z
471  << " lay: " << lay - 2;
472 #endif
473  if (depth_ == 0 && (det == 1 || det == 2) && ((!testNumber) || neutralDensity))
475  if (useLayerWt) {
476  G4ThreeVector hitPoint = aStep->GetPreStepPoint()->GetPosition();
477  weight_ = layerWeight(det + 2, hitPoint, depth_, lay);
478  }
479 
480  if (agingFlagHB && m_HBDarkening && det == 1) {
481  double dweight = m_HBDarkening->degradation(deliveredLumi, ieta, lay);
482  weight_ *= dweight;
483 #ifdef EDM_ML_DEBUG
484  edm::LogVerbatim("HcalSim") << "HCalSD: HB Lumi: " << deliveredLumi << " coefficient = " << dweight
485  << " Weight= " << weight_;
486 #endif
487  }
488 
489  if (agingFlagHE && m_HEDarkening && det == 2) {
490  double dweight = m_HEDarkening->degradation(deliveredLumi, ieta, lay);
491  weight_ *= dweight;
492 #ifdef EDM_ML_DEBUG
493  edm::LogVerbatim("HcalSim") << "HCalSD: HB Lumi: " << deliveredLumi << " coefficient = " << dweight
494  << " Weight= " << weight_;
495 #endif
496  }
497 
498  if (suppressHeavy) {
499  TrackInformation* trkInfo = (TrackInformation*)(theTrack->GetUserInformation());
500  if (trkInfo) {
501  int pdg = theTrack->GetDefinition()->GetPDGEncoding();
502  if (!(trkInfo->isPrimary())) { // Only secondary particles
503  double ke = theTrack->GetKineticEnergy();
504  if (pdg / 1000000000 == 1 && (pdg / 10000) % 100 > 0 && (pdg / 10) % 100 > 0 && ke < kmaxIon)
505  weight_ = 0;
506  if ((pdg == 2212) && (ke < kmaxProton))
507  weight_ = 0;
508  if ((pdg == 2112) && (ke < kmaxNeutron))
509  weight_ = 0;
510  }
511  }
512  }
513  double wt0(1.0);
514  if (useBirk) {
515  const G4Material* mat = aStep->GetPreStepPoint()->GetMaterial();
516  if (isItScintillator(mat))
517  wt0 = getAttenuation(aStep, birk1, birk2, birk3);
518  }
519  weight_ *= wt0;
520  double wt1 = getResponseWt(theTrack);
521  double wt2 = theTrack->GetWeight();
522  double edep = weight_ * wt1 * destep;
523  if (wt2 > 0.0) {
524  edep *= wt2;
525  }
526 #ifdef EDM_ML_DEBUG
527  edm::LogVerbatim("HcalSim") << "HCalSD: edep= " << edep << " Det: " << det + 2 << " depth= " << depth_
528  << " weight= " << weight_ << " wt0= " << wt0 << " wt1= " << wt1 << " wt2= " << wt2;
529 #endif
530  return edep;
531 }
532 
533 uint32_t HCalSD::setDetUnitId(const G4Step* aStep) {
534  auto const prePoint = aStep->GetPreStepPoint();
535  auto const touch = prePoint->GetTouchable();
536  const G4ThreeVector& hitPoint = prePoint->GetPosition();
537 
538  int depth = (touch->GetReplicaNumber(0)) % 10 + 1;
539  int lay = (touch->GetReplicaNumber(0) / 10) % 100 + 1;
540  int det = (touch->GetReplicaNumber(1)) / 1000;
541 
542  return setDetUnitId(det, hitPoint, depth, lay);
543 }
544 
546  if (scheme != nullptr) {
547  edm::LogVerbatim("HcalSim") << "HCalSD: updates numbering scheme for " << GetName();
548  numberingScheme.reset(scheme);
549  }
550 }
551 
552 void HCalSD::update(const BeginOfJob* job) {}
553 
555 
556 bool HCalSD::filterHit(CaloG4Hit* aHit, double time) {
557  double threshold = 0;
558  DetId theId(aHit->getUnitID());
559  switch (theId.subdetId()) {
560  case HcalBarrel:
562  break;
563  case HcalEndcap:
565  break;
566  case HcalOuter:
568  break;
569  case HcalForward:
571  break;
572  default:
573  break;
574  }
575  return ((time <= tmaxHit) && (aHit->getEnergyDeposit() > threshold));
576 }
577 
578 uint32_t HCalSD::setDetUnitId(int det, const G4ThreeVector& pos, int depth, int lay = 1) {
579  uint32_t id = 0;
580  if (det == 0) {
581  if (std::abs(pos.z()) > maxZ_) {
582  det = 5;
583 #ifdef printDebug
584  double eta = std::abs(pos.eta());
585  if (eta < 2.868)
586  ++detNull_[2];
587 #endif
588  } else if (!(hcalConstants_->isHE())) {
589  det = 3;
590 #ifdef printDebug
591  ++detNull_[0];
592 #endif
593  } else {
594  double minR = minRoff_ + slopeHE_ * std::abs(pos.z());
595  double maxR = maxRoff_ + slopeHE_ * std::abs(pos.z());
596  det = ((pos.perp() > minR) && (pos.perp() < maxR)) ? 4 : 3;
597 #ifdef printDebug
598  ++detNull_[det - 3];
599 #endif
600  }
601 #ifdef EDM_ML_DEBUG
602  edm::LogVerbatim("HcalSim") << "Position " << pos.perp() << ":" << std::abs(pos.z()) << " Limits "
603  << !(hcalConstants_->isHE()) << ":" << maxZ_ << " det " << det;
604 #endif
605 #ifdef printDebug
606  } else {
607  ++detNull_[3];
608 #endif
609  }
610 
611  if (numberingFromDDD.get()) {
612  //get the ID's as eta, phi, depth, ... indices
614  numberingFromDDD->unitID(det, math::XYZVectorD(pos.x(), pos.y(), pos.z()), depth, lay);
615  id = setDetUnitId(tmp);
616  }
617  return id;
618 }
619 
621  modifyDepth(tmp);
622  uint32_t id = (numberingScheme.get()) ? numberingScheme->getUnitID(tmp) : 0;
623  if ((!testNumber) && m_HcalTestNS.get()) {
624  bool ok = m_HcalTestNS->compare(tmp, id);
625  if (!ok)
626  edm::LogWarning("HcalSim") << "Det ID from HCalSD " << HcalDetId(id) << " " << std::hex << id << std::dec
627  << " does not match one from relabller for " << tmp.subdet << ":" << tmp.etaR << ":"
628  << tmp.phi << ":" << tmp.phis << ":" << tmp.depth << ":" << tmp.lay << std::endl;
629  }
630  return id;
631 }
632 
633 bool HCalSD::isItHF(const G4Step* aStep) {
634  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
635  int levels = (touch->GetHistoryDepth()) + 1;
636  for (unsigned int it = 0; it < hfNames.size(); ++it) {
637  if (levels >= hfLevels[it]) {
638  const G4LogicalVolume* lv = touch->GetVolume(levels - hfLevels[it])->GetLogicalVolume();
639  if (lv == hfLV[it])
640  return true;
641  }
642  }
643  return false;
644 }
645 
646 bool HCalSD::isItHF(const G4String& name) {
647  for (const auto& nam : hfNames)
648  if (name == static_cast<G4String>(nam)) {
649  return true;
650  }
651  return false;
652 }
653 
654 bool HCalSD::isItFibre(const G4LogicalVolume* lv) {
655  for (auto lvol : fibreLV)
656  if (lv == lvol) {
657  return true;
658  }
659  return false;
660 }
661 
662 bool HCalSD::isItFibre(const G4String& name) {
663  for (const auto& nam : fibreNames)
664  if (name == static_cast<G4String>(nam)) {
665  return true;
666  }
667  return false;
668 }
669 
670 bool HCalSD::isItPMT(const G4LogicalVolume* lv) {
671  for (auto lvol : pmtLV)
672  if (lv == lvol) {
673  return true;
674  }
675  return false;
676 }
677 
678 bool HCalSD::isItStraightBundle(const G4LogicalVolume* lv) {
679  for (auto lvol : fibre1LV)
680  if (lv == lvol) {
681  return true;
682  }
683  return false;
684 }
685 
686 bool HCalSD::isItConicalBundle(const G4LogicalVolume* lv) {
687  for (auto lvol : fibre2LV)
688  if (lv == lvol) {
689  return true;
690  }
691  return false;
692 }
693 
694 bool HCalSD::isItScintillator(const G4Material* mat) {
695  for (auto amat : materials)
696  if (amat == mat) {
697  return true;
698  }
699  return false;
700 }
701 
702 bool HCalSD::isItinFidVolume(const G4ThreeVector& hitPoint) {
703  bool flag = true;
704  if (applyFidCut) {
705  int npmt = HFFibreFiducial::PMTNumber(hitPoint);
706 #ifdef EDM_ML_DEBUG
707  edm::LogVerbatim("HcalSim") << "HCalSD::isItinFidVolume:#PMT= " << npmt << " for hit point " << hitPoint;
708 #endif
709  if (npmt <= 0)
710  flag = false;
711  }
712 #ifdef EDM_ML_DEBUG
713  edm::LogVerbatim("HcalSim") << "HCalSD::isItinFidVolume: point " << hitPoint << " return flag " << flag;
714 #endif
715  return flag;
716 }
717 
718 void HCalSD::getFromHFLibrary(const G4Step* aStep, bool& isKilled) {
719  std::vector<HFShowerLibrary::Hit> hits = showerLibrary->getHits(aStep, isKilled, weight_, false);
720  if (!isKilled || hits.empty()) {
721  return;
722  }
723 
724  int primaryID = setTrackID(aStep);
725 
726  // Reset entry point for new primary
727  resetForNewPrimary(aStep);
728 
729  auto const theTrack = aStep->GetTrack();
730  int det = 5;
731 
733  edepositEM = 1. * GeV;
734  edepositHAD = 0.;
735  } else {
736  edepositEM = 0.;
737  edepositHAD = 1. * GeV;
738  }
739 #ifdef EDM_ML_DEBUG
740  edm::LogVerbatim("HcalSim") << "HCalSD::getFromLibrary " << hits.size() << " hits for " << GetName() << " of "
741  << primaryID << " with " << theTrack->GetDefinition()->GetParticleName() << " of "
742  << aStep->GetPreStepPoint()->GetKineticEnergy() / GeV << " GeV";
743 #endif
744  for (unsigned int i = 0; i < hits.size(); ++i) {
745  G4ThreeVector hitPoint = hits[i].position;
746  if (isItinFidVolume(hitPoint)) {
747  int depth = hits[i].depth;
748  double time = hits[i].time;
749  unsigned int unitID = setDetUnitId(det, hitPoint, depth);
750  currentID.setID(unitID, time, primaryID, 0);
751 #ifdef plotDebug
752  plotProfile(aStep, hitPoint, 1.0 * GeV, time, depth);
753  bool emType = G4TrackToParticleID::isGammaElectronPositron(theTrack->GetDefinition()->GetPDGEncoding());
754  plotHF(hitPoint, emType);
755 #endif
756  processHit(aStep);
757  }
758  }
759 }
760 
761 void HCalSD::hitForFibre(const G4Step* aStep) { // if not ParamShower
762 
763  std::vector<HFShower::Hit> hits = hfshower->getHits(aStep, weight_);
764  if (hits.empty()) {
765  return;
766  }
767 
768  auto const theTrack = aStep->GetTrack();
769  int primaryID = setTrackID(aStep);
770  int det = 5;
771 
773  edepositEM = 1. * GeV;
774  edepositHAD = 0.;
775  } else {
776  edepositEM = 0.;
777  edepositHAD = 1. * GeV;
778  }
779 
780 #ifdef EDM_ML_DEBUG
781  edm::LogVerbatim("HcalSim") << "HCalSD::hitForFibre " << hits.size() << " hits for " << GetName() << " of "
782  << primaryID << " with " << theTrack->GetDefinition()->GetParticleName() << " of "
783  << aStep->GetPreStepPoint()->GetKineticEnergy() / GeV << " GeV in detector type " << det;
784 #endif
785 
786  for (unsigned int i = 0; i < hits.size(); ++i) {
787  G4ThreeVector hitPoint = hits[i].position;
788  if (isItinFidVolume(hitPoint)) {
789  int depth = hits[i].depth;
790  double time = hits[i].time;
791  unsigned int unitID = setDetUnitId(det, hitPoint, depth);
792  currentID.setID(unitID, time, primaryID, 0);
793 #ifdef plotDebug
794  plotProfile(aStep, hitPoint, edepositEM, time, depth);
795  bool emType = (edepositEM > 0.) ? true : false;
796  plotHF(hitPoint, emType);
797 #endif
798  processHit(aStep);
799  }
800  }
801 }
802 
803 void HCalSD::getFromParam(const G4Step* aStep, bool& isKilled) {
804  std::vector<HFShowerParam::Hit> hits = showerParam->getHits(aStep, weight_, isKilled);
805  if (!isKilled || hits.empty()) {
806  return;
807  }
808 
809  int primaryID = setTrackID(aStep);
810  int det = 5;
811 
812 #ifdef EDM_ML_DEBUG
813  edm::LogVerbatim("HcalSim") << "HCalSD::getFromParam " << hits.size() << " hits for " << GetName() << " of "
814  << primaryID << " with " << aStep->GetTrack()->GetDefinition()->GetParticleName()
815  << " of " << aStep->GetPreStepPoint()->GetKineticEnergy() / GeV
816  << " GeV in detector type " << det;
817 #endif
818  for (unsigned int i = 0; i < hits.size(); ++i) {
819  G4ThreeVector hitPoint = hits[i].position;
820  int depth = hits[i].depth;
821  double time = hits[i].time;
822  unsigned int unitID = setDetUnitId(det, hitPoint, depth);
823  currentID.setID(unitID, time, primaryID, 0);
824  edepositEM = hits[i].edep * GeV;
825  edepositHAD = 0.;
826 #ifdef plotDebug
827  plotProfile(aStep, hitPoint, edepositEM, time, depth);
828 #endif
829  processHit(aStep);
830  }
831 }
832 
833 void HCalSD::getHitPMT(const G4Step* aStep) {
834  auto const preStepPoint = aStep->GetPreStepPoint();
835  auto const theTrack = aStep->GetTrack();
836  double edep = showerPMT->getHits(aStep);
837 
838  if (edep >= 0.) {
839  edep *= GeV;
840  double etrack = preStepPoint->GetKineticEnergy();
841  int primaryID = 0;
842  if (etrack >= energyCut) {
843  primaryID = theTrack->GetTrackID();
844  } else {
845  primaryID = theTrack->GetParentID();
846  if (primaryID == 0)
847  primaryID = theTrack->GetTrackID();
848  }
849  // Reset entry point for new primary
850  resetForNewPrimary(aStep);
851  //
852  int det = static_cast<int>(HcalForward);
853  const G4ThreeVector& hitPoint = preStepPoint->GetPosition();
854  double rr = (hitPoint.x() * hitPoint.x() + hitPoint.y() * hitPoint.y());
855  double phi = (rr == 0. ? 0. : atan2(hitPoint.y(), hitPoint.x()));
856  double etaR = showerPMT->getRadius();
857  int depth = 1;
858  if (etaR < 0) {
859  depth = 2;
860  etaR = -etaR;
861  }
862  if (hitPoint.z() < 0)
863  etaR = -etaR;
864 #ifdef EDM_ML_DEBUG
865  edm::LogVerbatim("HcalSim") << "HCalSD::Hit for Detector " << det << " etaR " << etaR << " phi " << phi / deg
866  << " depth " << depth;
867 #endif
868  double time = (aStep->GetPostStepPoint()->GetGlobalTime());
869  uint32_t unitID = 0;
870  if (numberingFromDDD) {
871  HcalNumberingFromDDD::HcalID tmp = numberingFromDDD->unitID(det, etaR, phi, depth, 1);
872  unitID = setDetUnitId(tmp);
873  }
874  currentID.setID(unitID, time, primaryID, 1);
875 
876  edepositHAD = aStep->GetTotalEnergyDeposit();
877  edepositEM = -edepositHAD + edep;
878 #ifdef plotDebug
879  plotProfile(aStep, hitPoint, edep, time, depth);
880 #endif
881 #ifdef EDM_ML_DEBUG
882  double beta = preStepPoint->GetBeta();
883  edm::LogVerbatim("HcalSim") << "HCalSD::getHitPMT 1 hit for " << GetName() << " of " << primaryID << " with "
884  << theTrack->GetDefinition()->GetParticleName() << " of "
885  << preStepPoint->GetKineticEnergy() / GeV << " GeV with velocity " << beta << " UnitID "
886  << std::hex << unitID << std::dec;
887 #endif
888  processHit(aStep);
889  }
890 }
891 
892 void HCalSD::getHitFibreBundle(const G4Step* aStep, bool type) {
893  auto const preStepPoint = aStep->GetPreStepPoint();
894  auto const theTrack = aStep->GetTrack();
895  double edep = showerBundle->getHits(aStep, type);
896 
897  if (edep >= 0.0) {
898  edep *= GeV;
899  double etrack = preStepPoint->GetKineticEnergy();
900  int primaryID = 0;
901  if (etrack >= energyCut) {
902  primaryID = theTrack->GetTrackID();
903  } else {
904  primaryID = theTrack->GetParentID();
905  if (primaryID == 0)
906  primaryID = theTrack->GetTrackID();
907  }
908  // Reset entry point for new primary
909  resetForNewPrimary(aStep);
910  //
911  int det = static_cast<int>(HcalForward);
912  const G4ThreeVector& hitPoint = preStepPoint->GetPosition();
913  double rr = hitPoint.x() * hitPoint.x() + hitPoint.y() * hitPoint.y();
914  double phi = rr == 0. ? 0. : atan2(hitPoint.y(), hitPoint.x());
915  double etaR = showerBundle->getRadius();
916  int depth = 1;
917  if (etaR < 0.) {
918  depth = 2;
919  etaR = -etaR;
920  }
921  if (hitPoint.z() < 0.)
922  etaR = -etaR;
923 #ifdef EDM_ML_DEBUG
924  edm::LogVerbatim("HcalSim") << "HCalSD::Hit for Detector " << det << " etaR " << etaR << " phi " << phi / deg
925  << " depth " << depth;
926 #endif
927  double time = (aStep->GetPostStepPoint()->GetGlobalTime());
928  uint32_t unitID = 0;
929  if (numberingFromDDD) {
930  HcalNumberingFromDDD::HcalID tmp = numberingFromDDD->unitID(det, etaR, phi, depth, 1);
931  unitID = setDetUnitId(tmp);
932  }
933  if (type)
934  currentID.setID(unitID, time, primaryID, 3);
935  else
936  currentID.setID(unitID, time, primaryID, 2);
937 
938  edepositHAD = aStep->GetTotalEnergyDeposit();
939  edepositEM = -edepositHAD + edep;
940 #ifdef plotDebug
941  plotProfile(aStep, hitPoint, edep, time, depth);
942 #endif
943 #ifdef EDM_ML_DEBUG
944  double beta = preStepPoint->GetBeta();
945  edm::LogVerbatim("HcalSim") << "HCalSD::getHitFibreBundle 1 hit for " << GetName() << " of " << primaryID
946  << " with " << theTrack->GetDefinition()->GetParticleName() << " of "
947  << preStepPoint->GetKineticEnergy() / GeV << " GeV with velocity " << beta << " UnitID "
948  << std::hex << unitID << std::dec;
949 #endif
950  processHit(aStep);
951  } // non-zero energy deposit
952 }
953 
955  std::ifstream infile;
956  int entry = 0;
957  infile.open(fName.c_str(), std::ios::in);
958  if (infile) {
959  int det, zside, etaR, phi, lay;
960  double wt;
961  while (infile >> det >> zside >> etaR >> phi >> lay >> wt) {
962  uint32_t id = HcalTestNumbering::packHcalIndex(det, zside, 1, etaR, phi, lay);
963  layerWeights.insert(std::pair<uint32_t, double>(id, wt));
964  ++entry;
965 #ifdef EDM_ML_DEBUG
966  edm::LogVerbatim("HcalSim") << "HCalSD::readWeightFromFile:Entry " << entry << " ID " << std::hex << id
967  << std::dec << " (" << det << "/" << zside << "/1/" << etaR << "/" << phi << "/"
968  << lay << ") Weight " << wt;
969 #endif
970  }
971  infile.close();
972  }
973  edm::LogVerbatim("HcalSim") << "HCalSD::readWeightFromFile: reads " << entry << " weights from " << fName;
974  if (entry <= 0)
975  useLayerWt = false;
976 }
977 
978 double HCalSD::layerWeight(int det, const G4ThreeVector& pos, int depth, int lay) {
979  double wt = 1.;
980  if (numberingFromDDD) {
981  //get the ID's as eta, phi, depth, ... indices
983  numberingFromDDD->unitID(det, math::XYZVectorD(pos.x(), pos.y(), pos.z()), depth, lay);
984  modifyDepth(tmp);
985  uint32_t id = HcalTestNumbering::packHcalIndex(tmp.subdet, tmp.zside, 1, tmp.etaR, tmp.phis, tmp.lay);
986  std::map<uint32_t, double>::const_iterator ite = layerWeights.find(id);
987  if (ite != layerWeights.end())
988  wt = ite->second;
989 #ifdef EDM_ML_DEBUG
990  edm::LogVerbatim("HcalSim") << "HCalSD::layerWeight: ID " << std::hex << id << std::dec << " (" << tmp.subdet << "/"
991  << tmp.zside << "/1/" << tmp.etaR << "/" << tmp.phis << "/" << tmp.lay << ") Weight "
992  << wt;
993 #endif
994  }
995  return wt;
996 }
997 
998 void HCalSD::plotProfile(const G4Step* aStep, const G4ThreeVector& global, double edep, double time, int id) {
999  const G4VTouchable* touch = aStep->GetPreStepPoint()->GetTouchable();
1000  static const unsigned int names = 10;
1001  static const G4String modName[names] = {
1002  "HEModule", "HVQF", "HBModule", "MBAT", "MBBT", "MBBTC", "MBBT_R1P", "MBBT_R1M", "MBBT_R1PX", "MBBT_R1MX"};
1003  G4ThreeVector local;
1004  bool found = false;
1005  double depth = -2000;
1006  int idx = 4;
1007  for (int n = 0; n < touch->GetHistoryDepth(); ++n) {
1008  G4String name(static_cast<std::string>(dd4hep::dd::noNamespace(touch->GetVolume(n)->GetName())));
1009 #ifdef EDM_ML_DEBUG
1010  edm::LogVerbatim("HcalSim") << "plotProfile Depth " << n << " Name " << name;
1011 #endif
1012  for (unsigned int ii = 0; ii < names; ++ii) {
1013  if (name == modName[ii]) {
1014  found = true;
1015  int dn = touch->GetHistoryDepth() - n;
1016  local = touch->GetHistory()->GetTransform(dn).TransformPoint(global);
1017  if (ii == 0) {
1018  depth = local.z() - 4006.5;
1019  idx = 1;
1020  } else if (ii == 1) {
1021  depth = local.z() + 825.0;
1022  idx = 3;
1023  } else if (ii == 2) {
1024  depth = local.x() - 1775.;
1025  idx = 0;
1026  } else {
1027  depth = local.y() + 15.;
1028  idx = 2;
1029  }
1030  break;
1031  }
1032  }
1033  if (found)
1034  break;
1035  }
1036  if (!found)
1037  depth = std::abs(global.z()) - 11500;
1038 #ifdef EDM_ML_DEBUG
1039  edm::LogVerbatim("HcalSim") << "plotProfile Found " << found << " Global " << global << " Local " << local
1040  << " depth " << depth << " ID " << id << " EDEP " << edep << " Time " << time;
1041 #endif
1042  if (hit_[idx] != nullptr)
1043  hit_[idx]->Fill(edep);
1044  if (time_[idx] != nullptr)
1045  time_[idx]->Fill(time, edep);
1046  if (dist_[idx] != nullptr)
1047  dist_[idx]->Fill(depth, edep);
1048  int jd = 2 * idx + id - 7;
1049  if (jd >= 0 && jd < 4) {
1050  jd += 5;
1051  if (hit_[jd] != nullptr)
1052  hit_[jd]->Fill(edep);
1053  if (time_[jd] != nullptr)
1054  time_[jd]->Fill(time, edep);
1055  if (dist_[jd] != nullptr)
1056  dist_[jd]->Fill(depth, edep);
1057  }
1058 }
1059 
1060 void HCalSD::plotHF(const G4ThreeVector& hitPoint, bool emType) {
1061  double zv = std::abs(hitPoint.z()) - gpar[4];
1062  if (emType) {
1063  if (hzvem != nullptr)
1064  hzvem->Fill(zv);
1065  } else {
1066  if (hzvhad != nullptr)
1067  hzvhad->Fill(zv);
1068  }
1069 }
1070 
1072  if (id.subdet == 4) {
1073  int ieta = (id.zside == 0) ? -id.etaR : id.etaR;
1074  if (hcalConstants_->maxHFDepth(ieta, id.phis) > 2) {
1075  if (id.depth <= 2) {
1076  if (G4UniformRand() > 0.5)
1077  id.depth += 2;
1078  }
1079  }
1080  } else if ((id.subdet == 1 || id.subdet == 2) && testNumber) {
1081  id.depth = (depth_ == 0) ? 1 : 2;
1082  }
1083 }
1084 
1086 #ifdef printDebug
1087  detNull_ = {0, 0, 0, 0};
1088 #endif
1089 }
1090 
1092 #ifdef printDebug
1093  int sum = detNull_[0] + detNull_[1] + detNull_[2];
1094  if (sum > 0)
1095  edm::LogVerbatim("HcalSim") << "NullDets " << detNull_[0] << " " << detNull_[1] << " " << detNull_[2] << " "
1096  << detNull_[3] << " " << (static_cast<float>(sum) / (sum + detNull_[3]));
1097 #endif
1098 }
float edepositEM
Definition: CaloSD.h:140
double energyCut
Definition: CaloSD.h:144
Log< level::Info, true > LogVerbatim
std::vector< std::string > matNames
Definition: HCalSD.h:120
void readWeightFromFile(const std::string &)
Definition: HCalSD.cc:954
bool isPrimary() const
std::vector< const G4LogicalVolume * > hfLV
Definition: HCalSD.h:122
bool useParam
Definition: HCalSD.h:111
double eminHitHE
Definition: HCalSD.h:112
TH1F * time_[9]
Definition: HCalSD.h:124
double kmaxNeutron
Definition: CaloSD.h:149
void hitForFibre(const G4Step *step)
Definition: HCalSD.cc:761
void initEvent(const BeginOfEvent *) override
Definition: HCalSD.cc:1085
static bool isMuon(int pdgCode)
constexpr int zside() const
get the z-side of the cell (1/-1)
Definition: HcalDetId.h:141
bool useLayerWt
Definition: HCalSD.h:108
Definition: CaloSD.h:40
std::vector< std::string > fibreNames
Definition: HCalSD.h:119
static constexpr double slopeHE_
Definition: HCalSD.h:105
std::unique_ptr< HFShowerParam > showerParam
Definition: HCalSD.h:91
double weight_
Definition: HCalSD.h:114
std::vector< double > gpar
Definition: HCalSD.h:116
bool useFibreBundle
Definition: HCalSD.h:108
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
const HcalDDDSimConstants * hcalConstants_
Definition: HCalSD.h:95
double betaThr
Definition: HCalSD.h:110
std::vector< std::string > hfNames_
double deliveredLumi
Definition: HCalSD.h:113
int maxHFDepth(const int &ieta, const int &iphi) const
float degradation(float intlumi, int ieta, int lay) const
float *__restrict__ zv
std::vector< std::string > hfFibreNames_
void endEvent() override
Definition: HCalSD.cc:1091
double eminHitHB
Definition: HCalSD.h:112
bool useShowerLibrary
Definition: HCalSD.h:111
std::vector< std::string > hfNames
Definition: HCalSD.h:118
void plotProfile(const G4Step *step, const G4ThreeVector &pos, double edep, double time, int id)
Definition: HCalSD.cc:998
double birk2
Definition: HCalSD.h:110
bool usePMTHit
Definition: HCalSD.h:108
double getLayer0Wt(const int &det, const int &phi, const int &zside) const
std::vector< const G4LogicalVolume * > fibre2LV
Definition: HCalSD.h:122
int zside(DetId const &)
static const unsigned int numberOfZLayers
Definition: HFDarkening.h:24
void modifyDepth(HcalNumberingFromDDD::HcalID &id)
Definition: HCalSD.cc:1071
void update(const BeginOfJob *) override
This routine will be called when the appropriate signal arrives.
Definition: HCalSD.cc:552
void setNumberingScheme(HcalNumberingScheme *)
Definition: HCalSD.cc:545
void processHit(const G4Step *step)
Definition: CaloSD.h:113
bool agingFlagHE
Definition: HCalSD.h:107
double birk1
Definition: HCalSD.h:110
double kmaxProton
Definition: CaloSD.h:149
const std::vector< std::string_view > logicalNames(const std::string &readoutName) const
std::unique_ptr< HFShowerPMT > showerPMT
Definition: HCalSD.h:92
const std::vector< double > & getGparHF() const
const std::string names[nVars_]
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
TH1F * hzvhad
Definition: HCalSD.h:124
bool isItConicalBundle(const G4LogicalVolume *)
Definition: HCalSD.cc:686
HCalSD(const std::string &, const HcalDDDSimConstants *, const HcalDDDRecConstants *, const HcalSimulationConstants *, const HBHEDarkening *, const HBHEDarkening *, const SensitiveDetectorCatalog &, edm::ParameterSet const &, const SimTrackManager *)
Definition: HCalSD.cc:43
double eminHitHF
Definition: HCalSD.h:112
const HcalSimulationParameters * hcalsimpar() const
T * make(const Args &...args) const
make new ROOT object
static constexpr double minRoff_
Definition: HCalSD.h:103
static uint32_t packHcalIndex(int det, int z, int depth, int eta, int phi, int lay)
std::unique_ptr< HcalNumberingFromDDD > numberingFromDDD
Definition: HCalSD.h:87
TH1F * hit_[9]
Definition: HCalSD.h:124
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > XYZVectorD
spatial vector with cartesian internal representation
Definition: Vector3D.h:8
#define EDM_ML_DEBUG
Definition: MPUnpacker.cc:1
bool agingFlagHB
Definition: HCalSD.h:107
bool testNumber
Definition: HCalSD.h:109
double kmaxIon
Definition: CaloSD.h:149
bool suppressHeavy
Definition: CaloSD.h:148
std::vector< std::string > hfFibreConicalNames_
bool useBirk
Definition: HCalSD.h:108
float edepositHAD
Definition: CaloSD.h:140
std::unique_ptr< HFDarkening > m_HFDarkening
Definition: HCalSD.h:99
double birk3
Definition: HCalSD.h:110
void resetForNewPrimary(const G4Step *)
Definition: CaloSD.cc:653
Definition: tfile.py:1
const HBHEDarkening * m_HEDarkening
Definition: HCalSD.h:98
bool applyFidCut
Definition: HCalSD.h:111
TH1F * dist_[9]
Definition: HCalSD.h:124
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void plotHF(const G4ThreeVector &pos, bool emType)
Definition: HCalSD.cc:1060
std::unique_ptr< HcalTestNS > m_HcalTestNS
Definition: HCalSD.h:100
static void unpackHcalIndex(const uint32_t &idx, int &det, int &z, int &depth, int &eta, int &phi, int &lay)
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
int getNumberOfHits()
Definition: CaloSD.cc:461
Definition: value.py:1
std::vector< int > hfLevels
Definition: HCalSD.h:117
void getFromParam(const G4Step *step, bool &isKilled)
Definition: HCalSD.cc:803
void getFromHFLibrary(const G4Step *step, bool &isKilled)
Definition: HCalSD.cc:718
uint32_t setDetUnitId(const G4Step *step) override
Definition: HCalSD.cc:533
bool isItStraightBundle(const G4LogicalVolume *)
Definition: HCalSD.cc:678
bool testNS_
Definition: HCalSD.h:109
ii
Definition: cuy.py:589
bool getFromLibrary(const G4Step *) override
Definition: HCalSD.cc:335
double eminHitHO
Definition: HCalSD.h:112
double tmaxHit
Definition: CaloSD.h:144
static bool isStableHadronIon(const G4Track *)
void setID(uint32_t unitID, double timeSlice, int trackID, uint16_t depth=0)
Definition: CaloHitID.cc:41
TH1F * hzvem
Definition: HCalSD.h:124
std::vector< const G4LogicalVolume * > pmtLV
Definition: HCalSD.h:122
int PMTNumber(const G4ThreeVector &pe_effect)
Definition: DetId.h:17
static const unsigned int lowZLimit
Definition: HFDarkening.h:27
bool filterHit(CaloG4Hit *, double) override
Definition: HCalSD.cc:556
CaloHitID currentID
Definition: CaloSD.h:142
static const unsigned int upperZLimit
Definition: HFDarkening.h:28
bool neutralDensity
Definition: HCalSD.h:109
bool isHF
Definition: HCalSD.h:106
void fillLogVolumeVector(const std::string &, const std::vector< std::string > &, std::vector< const G4LogicalVolume *> &)
Definition: HCalSD.cc:310
static constexpr double maxZ_
Definition: HCalSD.h:102
void getHitFibreBundle(const G4Step *step, bool type)
Definition: HCalSD.cc:892
std::vector< std::string > hcalMaterialNames_
double getEnergyDeposit(const G4Step *) override
Definition: HCalSD.cc:399
double getAttenuation(const G4Step *aStep, double birk1, double birk2, double birk3) const
Definition: CaloSD.cc:666
double getEnergyDeposit() const
Definition: CaloG4Hit.h:79
std::unique_ptr< HFShowerFibreBundle > showerBundle
Definition: HCalSD.h:93
std::vector< std::string > hfPMTNames_
bool isItPMT(const G4LogicalVolume *)
Definition: HCalSD.cc:670
bool isItinFidVolume(const G4ThreeVector &)
Definition: HCalSD.cc:702
uint32_t getUnitID() const
Definition: CaloG4Hit.h:66
bool isHF(int etabin, int depth)
void getHitPMT(const G4Step *step)
Definition: HCalSD.cc:833
std::vector< int > detNull_
Definition: HCalSD.h:125
std::unique_ptr< HFShowerLibrary > showerLibrary
Definition: HCalSD.h:89
double layerWeight(int, const G4ThreeVector &, int, int)
Definition: HCalSD.cc:978
const HcalSimulationConstants * hcalSimConstants_
Definition: HCalSD.h:96
int depth_
Definition: HCalSD.h:115
HLT enums.
virtual int setTrackID(const G4Step *)
Definition: CaloSD.cc:823
std::map< uint32_t, double > layerWeights
Definition: HCalSD.h:123
bool isItHF(const G4Step *)
Definition: HCalSD.cc:633
static bool isGammaElectronPositron(int pdgCode)
bool isItScintillator(const G4Material *)
Definition: HCalSD.cc:694
std::vector< std::string > hfFibreStraightNames_
std::unique_ptr< HcalNumberingScheme > numberingScheme
Definition: HCalSD.h:88
std::unique_ptr< HFShower > hfshower
Definition: HCalSD.h:90
std::vector< const G4LogicalVolume * > fibreLV
Definition: HCalSD.h:122
Log< level::Warning, false > LogWarning
double getResponseWt(const G4Track *)
Definition: CaloSD.cc:858
std::vector< const G4LogicalVolume * > fibre1LV
Definition: HCalSD.h:122
tmp
align.sh
Definition: createJobs.py:716
std::vector< const G4Material * > materials
Definition: HCalSD.h:121
int getMaxDepth(const int &type) const
void initRun() override
Definition: HCalSD.cc:554
const HBHEDarkening * m_HBDarkening
Definition: HCalSD.h:97
constexpr int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
static constexpr double maxRoff_
Definition: HCalSD.h:104
bool useHF
Definition: HCalSD.h:111
bool isItFibre(const G4LogicalVolume *)
Definition: HCalSD.cc:654
void setParameterized(bool val)
Definition: CaloSD.h:110