CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HFShowerLibrary.cc
Go to the documentation of this file.
1 // File: HFShowerLibrary.cc
3 // Description: Shower library for Very forward hadron calorimeter
5 
9 
11 
12 #include "G4VPhysicalVolume.hh"
13 #include "G4NavigationHistory.hh"
14 #include "G4Step.hh"
15 #include "G4Track.hh"
16 #include "G4ParticleTable.hh"
17 #include "Randomize.hh"
18 #include "CLHEP/Units/SystemOfUnits.h"
19 #include "CLHEP/Units/PhysicalConstants.h"
20 
21 //#define EDM_ML_DEBUG
22 
24  const HcalDDDSimConstants* hcons,
25  const HcalSimulationParameters* hps,
26  edm::ParameterSet const& p)
27  : hcalConstant_(hcons), hf(nullptr), emBranch(nullptr), hadBranch(nullptr), npe(0) {
28  edm::ParameterSet m_HF =
29  (p.getParameter<edm::ParameterSet>("HFShower")).getParameter<edm::ParameterSet>("HFShowerBlock");
30  probMax = m_HF.getParameter<double>("ProbMax");
31  equalizeTimeShift_ = m_HF.getParameter<bool>("EqualizeTimeShift");
32 
33  edm::ParameterSet m_HS =
34  (p.getParameter<edm::ParameterSet>("HFShowerLibrary")).getParameter<edm::ParameterSet>("HFLibraryFileBlock");
35  edm::FileInPath fp = m_HS.getParameter<edm::FileInPath>("FileName");
36  std::string pTreeName = fp.fullPath();
37  backProb = m_HS.getParameter<double>("BackProbability");
38  std::string emName = m_HS.getParameter<std::string>("TreeEMID");
39  std::string hadName = m_HS.getParameter<std::string>("TreeHadID");
40  std::string branchEvInfo = m_HS.getUntrackedParameter<std::string>(
41  "BranchEvt", "HFShowerLibraryEventInfos_hfshowerlib_HFShowerLibraryEventInfo");
42  std::string branchPre = m_HS.getUntrackedParameter<std::string>("BranchPre", "HFShowerPhotons_hfshowerlib_");
43  std::string branchPost = m_HS.getUntrackedParameter<std::string>("BranchPost", "_R.obj");
44  verbose = m_HS.getUntrackedParameter<bool>("Verbosity", false);
45  applyFidCut = m_HS.getParameter<bool>("ApplyFiducialCut");
46  fileVersion_ = m_HS.getParameter<int>("FileVersion");
47 
48  if (pTreeName.find('.') == 0)
49  pTreeName.erase(0, 2);
50  const char* nTree = pTreeName.c_str();
51  hf = TFile::Open(nTree);
52 
53  if (!hf->IsOpen()) {
54  edm::LogError("HFShower") << "HFShowerLibrary: opening " << nTree << " failed";
55  throw cms::Exception("Unknown", "HFShowerLibrary") << "Opening of " << pTreeName << " fails\n";
56  } else {
57  edm::LogVerbatim("HFShower") << "HFShowerLibrary: opening " << nTree << " successfully";
58  }
59 
60  newForm = (branchEvInfo.empty());
61  TTree* event(nullptr);
62  if (newForm)
63  event = (TTree*)hf->Get("HFSimHits");
64  else
65  event = (TTree*)hf->Get("Events");
66  if (event) {
67  TBranch* evtInfo(nullptr);
68  if (!newForm) {
69  std::string info = branchEvInfo + branchPost;
70  evtInfo = event->GetBranch(info.c_str());
71  }
72  if (evtInfo || newForm) {
73  loadEventInfo(evtInfo);
74  } else {
75  edm::LogError("HFShower") << "HFShowerLibrary: HFShowerLibrayEventInfo"
76  << " Branch does not exist in Event";
77  throw cms::Exception("Unknown", "HFShowerLibrary") << "Event information absent\n";
78  }
79  } else {
80  edm::LogError("HFShower") << "HFShowerLibrary: Events Tree does not "
81  << "exist";
82  throw cms::Exception("Unknown", "HFShowerLibrary") << "Events tree absent\n";
83  }
84 
85  std::stringstream ss;
86  ss << "HFShowerLibrary: Library " << libVers << " ListVersion " << listVersion << " File version " << fileVersion_
87  << " Events Total " << totEvents << " and " << evtPerBin << " per bin\n";
88  ss << "HFShowerLibrary: Energies (GeV) with " << nMomBin << " bins\n";
89  for (int i = 0; i < nMomBin; ++i) {
90  if (i / 10 * 10 == i && i > 0) {
91  ss << "\n";
92  }
93  ss << " " << pmom[i] / CLHEP::GeV;
94  }
95  edm::LogVerbatim("HFShower") << ss.str();
96 
97  std::string nameBr = branchPre + emName + branchPost;
98  emBranch = event->GetBranch(nameBr.c_str());
99  if (verbose)
100  emBranch->Print();
101  nameBr = branchPre + hadName + branchPost;
102  hadBranch = event->GetBranch(nameBr.c_str());
103  if (verbose)
104  hadBranch->Print();
105 
106  v3version = false;
107  if (emBranch->GetClassName() == std::string("vector<float>")) {
108  v3version = true;
109  }
110 
111  edm::LogVerbatim("HFShower") << " HFShowerLibrary:Branch " << emName << " has " << emBranch->GetEntries()
112  << " entries and Branch " << hadName << " has " << hadBranch->GetEntries()
113  << " entries\n HFShowerLibrary::No packing information - Assume x, y, z are not in "
114  "packed form\n Maximum probability cut off "
115  << probMax << " Back propagation of light probability " << backProb
116  << " Flag for equalizing Time Shift for different eta " << equalizeTimeShift_;
117 
118  fibre_ = std::make_unique<HFFibre>(name, hcalConstant_, hps, p);
119  photo = std::make_unique<HFShowerPhotonCollection>();
120 
121  //Radius (minimum and maximum)
122  std::vector<double> rTable = hcalConstant_->getRTableHF();
123  rMin = rTable[0];
124  rMax = rTable[rTable.size() - 1];
125 
126  //Delta phi
127  std::vector<double> phibin = hcalConstant_->getPhiTableHF();
128  dphi = phibin[0];
129 
130  edm::LogVerbatim("HFShower") << "HFShowerLibrary: rMIN " << rMin / CLHEP::cm << " cm and rMax " << rMax / CLHEP::cm
131  << " (Half) Phi Width of wedge " << dphi / CLHEP::deg;
132 
133  //Special Geometry parameters
134  gpar = hcalConstant_->getGparHF();
135 }
136 
138  if (hf)
139  hf->Close();
140 }
141 
142 std::vector<HFShowerLibrary::Hit> HFShowerLibrary::getHits(const G4Step* aStep,
143  bool& isKilled,
144  double weight,
145  bool onlyLong) {
146  auto const preStepPoint = aStep->GetPreStepPoint();
147  auto const postStepPoint = aStep->GetPostStepPoint();
148  auto const track = aStep->GetTrack();
149  // Get Z-direction
150  auto const aParticle = track->GetDynamicParticle();
151  const G4ThreeVector& momDir = aParticle->GetMomentumDirection();
152  const G4ThreeVector& hitPoint = preStepPoint->GetPosition();
153  int parCode = track->GetDefinition()->GetPDGEncoding();
154 
155  // VI: for ions use internally pdg code of alpha in order to keep
156  // consistency with previous simulation
157  if (track->GetDefinition()->IsGeneralIon()) {
158  parCode = 1000020040;
159  }
160 
161 #ifdef EDM_ML_DEBUG
162  G4String partType = track->GetDefinition()->GetParticleName();
163  const G4ThreeVector localPos = preStepPoint->GetTouchable()->GetHistory()->GetTopTransform().TransformPoint(hitPoint);
164  double zoff = localPos.z() + 0.5 * gpar[1];
165 
166  edm::LogVerbatim("HFShower") << "HFShowerLibrary::getHits " << partType << " of energy "
167  << track->GetKineticEnergy() / CLHEP::GeV << " GeV weight= " << weight
168  << " onlyLong: " << onlyLong << " dir.orts " << momDir.x() << ", " << momDir.y() << ", "
169  << momDir.z() << " Pos x,y,z = " << hitPoint.x() << "," << hitPoint.y() << ","
170  << hitPoint.z() << " (" << zoff << ") sphi,cphi,stheta,ctheta = " << sin(momDir.phi())
171  << "," << cos(momDir.phi()) << ", " << sin(momDir.theta()) << "," << cos(momDir.theta());
172 #endif
173 
174  double tSlice = (postStepPoint->GetGlobalTime()) / CLHEP::nanosecond;
175 
176  // use kinetic energy for protons and ions
177  double pin = (track->GetDefinition()->GetBaryonNumber() > 0) ? preStepPoint->GetKineticEnergy()
178  : preStepPoint->GetTotalEnergy();
179 
180  return fillHits(hitPoint, momDir, parCode, pin, isKilled, weight, tSlice, onlyLong);
181 }
182 
183 std::vector<HFShowerLibrary::Hit> HFShowerLibrary::fillHits(const G4ThreeVector& hitPoint,
184  const G4ThreeVector& momDir,
185  int parCode,
186  double pin,
187  bool& ok,
188  double weight,
189  double tSlice,
190  bool onlyLong) {
191  std::vector<HFShowerLibrary::Hit> hit;
192  ok = false;
194  // shower is built only for gamma, e+- and stable hadrons
195  if (!isEM && !G4TrackToParticleID::isStableHadron(parCode)) {
196  return hit;
197  }
198  ok = true;
199 
200  // remove low-energy component
201  const double threshold = 50 * MeV;
202  if (pin < threshold) {
203  return hit;
204  }
205 
206  double pz = momDir.z();
207  double zint = hitPoint.z();
208 
209  // if particle moves from interaction point or "backwards (halo)
210  bool backward = (pz * zint < 0.) ? true : false;
211 
212  double sphi = sin(momDir.phi());
213  double cphi = cos(momDir.phi());
214  double ctheta = cos(momDir.theta());
215  double stheta = sin(momDir.theta());
216 
217  if (isEM) {
218  if (pin < pmom[nMomBin - 1]) {
219  interpolate(0, pin);
220  } else {
221  extrapolate(0, pin);
222  }
223  } else {
224  if (pin < pmom[nMomBin - 1]) {
225  interpolate(1, pin);
226  } else {
227  extrapolate(1, pin);
228  }
229  }
230 
231  int nHit = 0;
232  HFShowerLibrary::Hit oneHit;
233  for (int i = 0; i < npe; ++i) {
234  double zv = std::abs(pe[i].z()); // abs local z
235 #ifdef EDM_ML_DEBUG
236  edm::LogVerbatim("HFShower") << "HFShowerLibrary: Hit " << i << " " << pe[i] << " zv " << zv;
237 #endif
238  if (zv <= gpar[1] && pe[i].lambda() > 0 && (pe[i].z() >= 0 || (zv > gpar[0] && (!onlyLong)))) {
239  int depth = 1;
240  if (onlyLong) {
241  } else if (!backward) { // fully valid only for "front" particles
242  if (pe[i].z() < 0)
243  depth = 2; // with "front"-simulated shower lib.
244  } else { // for "backward" particles - almost equal
245  double r = G4UniformRand(); // share between L and S fibers
246  if (r > 0.5)
247  depth = 2;
248  }
249 
250  // Updated coordinate transformation from local
251  // back to global using two Euler angles: phi and theta
252  double pex = pe[i].x();
253  double pey = pe[i].y();
254 
255  double xx = pex * ctheta * cphi - pey * sphi + zv * stheta * cphi;
256  double yy = pex * ctheta * sphi + pey * cphi + zv * stheta * sphi;
257  double zz = -pex * stheta + zv * ctheta;
258 
259  G4ThreeVector pos = hitPoint + G4ThreeVector(xx, yy, zz);
260  zv = std::abs(pos.z()) - gpar[4] - 0.5 * gpar[1];
261  G4ThreeVector lpos = G4ThreeVector(pos.x(), pos.y(), zv);
262 
263  zv = fibre_->zShift(lpos, depth, 0); // distance to PMT !
264 
265  double r = pos.perp();
266  double p = fibre_->attLength(pe[i].lambda());
267  double fi = pos.phi();
268  if (fi < 0)
269  fi += CLHEP::twopi;
270  int isect = int(fi / dphi) + 1;
271  isect = (isect + 1) / 2;
272  double dfi = ((isect * 2 - 1) * dphi - fi);
273  if (dfi < 0)
274  dfi = -dfi;
275  double dfir = r * sin(dfi);
276 #ifdef EDM_ML_DEBUG
277  edm::LogVerbatim("HFShower") << "HFShowerLibrary: Position shift " << xx << ", " << yy << ", " << zz << ": "
278  << pos << " R " << r << " Phi " << fi << " Section " << isect << " R*Dfi " << dfir
279  << " Dist " << zv;
280 #endif
281  zz = std::abs(pos.z());
282  double r1 = G4UniformRand();
283  double r2 = G4UniformRand();
284  double r3 = backward ? G4UniformRand() : -9999.;
285  if (!applyFidCut)
286  dfir += gpar[5];
287 
288 #ifdef EDM_ML_DEBUG
289  edm::LogVerbatim("HFShower") << "HFShowerLibrary: rLimits " << rInside(r) << " attenuation " << r1 << ":"
290  << exp(-p * zv) << " r2 " << r2 << " r3 " << r3 << " rDfi " << gpar[5] << " zz "
291  << zz << " zLim " << gpar[4] << ":" << gpar[4] + gpar[1] << "\n"
292  << " rInside(r) :" << rInside(r) << " r1 <= exp(-p*zv) :" << (r1 <= exp(-p * zv))
293  << " r2 <= probMax :" << (r2 <= probMax * weight)
294  << " r3 <= backProb :" << (r3 <= backProb)
295  << " dfir > gpar[5] :" << (dfir > gpar[5]) << " zz >= gpar[4] :" << (zz >= gpar[4])
296  << " zz <= gpar[4]+gpar[1] :" << (zz <= gpar[4] + gpar[1]);
297 #endif
298  if (rInside(r) && r1 <= exp(-p * zv) && r2 <= probMax * weight && dfir > gpar[5] && zz >= gpar[4] &&
299  zz <= gpar[4] + gpar[1] && r3 <= backProb && (depth != 2 || zz >= gpar[4] + gpar[0])) {
300  double tdiff = (equalizeTimeShift_) ? (fibre_->tShift(lpos, depth, -1)) : (fibre_->tShift(lpos, depth, 1));
301  oneHit.position = pos;
302  oneHit.depth = depth;
303  oneHit.time = (tSlice + (pe[i].t()) + tdiff);
304  hit.push_back(oneHit);
305 
306 #ifdef EDM_ML_DEBUG
307  edm::LogVerbatim("HFShower") << "HFShowerLibrary: Final Hit " << nHit << " position " << (hit[nHit].position)
308  << " Depth " << (hit[nHit].depth) << " Time " << tSlice << ":" << pe[i].t() << ":"
309  << tdiff << ":" << (hit[nHit].time);
310 #endif
311  ++nHit;
312  }
313 #ifdef EDM_ML_DEBUG
314  else
315  edm::LogVerbatim("HFShower") << "HFShowerLibrary: REJECTED !!!";
316 #endif
317  if (onlyLong && zz >= gpar[4] + gpar[0] && zz <= gpar[4] + gpar[1]) {
318  r1 = G4UniformRand();
319  r2 = G4UniformRand();
320  if (rInside(r) && r1 <= exp(-p * zv) && r2 <= probMax && dfir > gpar[5]) {
321  double tdiff = (equalizeTimeShift_) ? (fibre_->tShift(lpos, 2, -1)) : (fibre_->tShift(lpos, 2, 1));
322  oneHit.position = pos;
323  oneHit.depth = 2;
324  oneHit.time = (tSlice + (pe[i].t()) + tdiff);
325  hit.push_back(oneHit);
326 #ifdef EDM_ML_DEBUG
327  edm::LogVerbatim("HFShower") << "HFShowerLibrary: Final Hit " << nHit << " position " << (hit[nHit].position)
328  << " Depth " << (hit[nHit].depth) << " Time " << tSlice << ":" << pe[i].t()
329  << ":" << tdiff << ":" << (hit[nHit].time);
330 #endif
331  ++nHit;
332  }
333  }
334  }
335  }
336 
337 #ifdef EDM_ML_DEBUG
338  edm::LogVerbatim("HFShower") << "HFShowerLibrary: Total Hits " << nHit << " out of " << npe << " PE";
339 #endif
340  if (nHit > npe && !onlyLong) {
341  edm::LogWarning("HFShower") << "HFShowerLibrary: Hit buffer " << npe << " smaller than " << nHit << " Hits";
342  }
343  return hit;
344 }
345 
346 bool HFShowerLibrary::rInside(double r) { return (r >= rMin && r <= rMax); }
347 
349  int nrc = record - 1;
350  photon.clear();
351  photo->clear();
352  if (type > 0) {
353  if (newForm) {
354  if (!v3version) {
355  hadBranch->SetAddress(&photo);
356  int position = (fileVersion_ >= 2) ? nrc : (nrc + totEvents);
357  hadBranch->GetEntry(position);
358  } else {
359  std::vector<float> t;
360  std::vector<float>* tp = &t;
361  hadBranch->SetAddress(&tp);
362  hadBranch->GetEntry(nrc + totEvents);
363  unsigned int tSize = t.size() / 5;
364  photo->reserve(tSize);
365  for (unsigned int i = 0; i < tSize; i++) {
366  photo->push_back(
367  HFShowerPhoton(t[i], t[1 * tSize + i], t[2 * tSize + i], t[3 * tSize + i], t[4 * tSize + i]));
368  }
369  }
370  } else {
371  hadBranch->SetAddress(&photon);
372  hadBranch->GetEntry(nrc);
373  }
374  } else {
375  if (newForm) {
376  if (!v3version) {
377  emBranch->SetAddress(&photo);
378  emBranch->GetEntry(nrc);
379  } else {
380  std::vector<float> t;
381  std::vector<float>* tp = &t;
382  emBranch->SetAddress(&tp);
383  emBranch->GetEntry(nrc);
384  unsigned int tSize = t.size() / 5;
385  photo->reserve(tSize);
386  for (unsigned int i = 0; i < tSize; i++) {
387  photo->push_back(
388  HFShowerPhoton(t[i], t[1 * tSize + i], t[2 * tSize + i], t[3 * tSize + i], t[4 * tSize + i]));
389  }
390  }
391  } else {
392  emBranch->SetAddress(&photon);
393  emBranch->GetEntry(nrc);
394  }
395  }
396 #ifdef EDM_ML_DEBUG
397  int nPhoton = (newForm) ? photo->size() : photon.size();
398  edm::LogVerbatim("HFShower") << "HFShowerLibrary::getRecord: Record " << record << " of type " << type << " with "
399  << nPhoton << " photons";
400  for (int j = 0; j < nPhoton; j++)
401  if (newForm)
402  edm::LogVerbatim("HFShower") << "Photon " << j << " " << photo->at(j);
403  else
404  edm::LogVerbatim("HFShower") << "Photon " << j << " " << photon[j];
405 #endif
406 }
407 
408 void HFShowerLibrary::loadEventInfo(TBranch* branch) {
409  if (branch) {
410  std::vector<HFShowerLibraryEventInfo> eventInfoCollection;
411  branch->SetAddress(&eventInfoCollection);
412  branch->GetEntry(0);
413  edm::LogVerbatim("HFShower") << "HFShowerLibrary::loadEventInfo loads EventInfo Collection of size "
414  << eventInfoCollection.size() << " records";
415 
416  totEvents = eventInfoCollection[0].totalEvents();
417  nMomBin = eventInfoCollection[0].numberOfBins();
418  evtPerBin = eventInfoCollection[0].eventsPerBin();
419  libVers = eventInfoCollection[0].showerLibraryVersion();
420  listVersion = eventInfoCollection[0].physListVersion();
421  pmom = eventInfoCollection[0].energyBins();
422  } else {
423  edm::LogVerbatim("HFShower") << "HFShowerLibrary::loadEventInfo loads EventInfo from hardwired"
424  << " numbers";
425 
426  nMomBin = 16;
427  evtPerBin = (fileVersion_ == 0) ? 5000 : 10000;
429  libVers = (fileVersion_ == 0) ? 1.1 : 1.2;
430  listVersion = 3.6;
431  pmom = {2, 3, 5, 7, 10, 15, 20, 30, 50, 75, 100, 150, 250, 350, 500, 1000};
432  }
433  for (int i = 0; i < nMomBin; i++)
434  pmom[i] *= CLHEP::GeV;
435 }
436 
437 void HFShowerLibrary::interpolate(int type, double pin) {
438 #ifdef EDM_ML_DEBUG
439  edm::LogVerbatim("HFShower") << "HFShowerLibrary:: Interpolate for Energy " << pin / CLHEP::GeV << " GeV with "
440  << nMomBin << " momentum bins and " << evtPerBin << " entries/bin -- total "
441  << totEvents;
442 #endif
443  int irc[2] = {0, 0};
444  double w = 0.;
445  double r = G4UniformRand();
446 
447  if (pin < pmom[0]) {
448  w = pin / pmom[0];
449  irc[1] = int(evtPerBin * r) + 1;
450  irc[0] = 0;
451  } else {
452  for (int j = 0; j < nMomBin - 1; j++) {
453  if (pin >= pmom[j] && pin < pmom[j + 1]) {
454  w = (pin - pmom[j]) / (pmom[j + 1] - pmom[j]);
455  if (j == nMomBin - 2) {
456  irc[1] = int(evtPerBin * 0.5 * r);
457  } else {
458  irc[1] = int(evtPerBin * r);
459  }
460  irc[1] += (j + 1) * evtPerBin + 1;
461  r = G4UniformRand();
462  irc[0] = int(evtPerBin * r) + 1 + j * evtPerBin;
463  if (irc[0] < 0) {
464  edm::LogWarning("HFShower") << "HFShowerLibrary:: Illegal irc[0] = " << irc[0] << " now set to 0";
465  irc[0] = 0;
466  } else if (irc[0] > totEvents) {
467  edm::LogWarning("HFShower") << "HFShowerLibrary:: Illegal irc[0] = " << irc[0] << " now set to " << totEvents;
468  irc[0] = totEvents;
469  }
470  }
471  }
472  }
473  if (irc[1] < 1) {
474  edm::LogWarning("HFShower") << "HFShowerLibrary:: Illegal irc[1] = " << irc[1] << " now set to 1";
475  irc[1] = 1;
476  } else if (irc[1] > totEvents) {
477  edm::LogWarning("HFShower") << "HFShowerLibrary:: Illegal irc[1] = " << irc[1] << " now set to " << totEvents;
478  irc[1] = totEvents;
479  }
480 
481 #ifdef EDM_ML_DEBUG
482  edm::LogVerbatim("HFShower") << "HFShowerLibrary:: Select records " << irc[0] << " and " << irc[1] << " with weights "
483  << 1 - w << " and " << w;
484 #endif
485  pe.clear();
486  npe = 0;
487  int npold = 0;
488  for (int ir = 0; ir < 2; ir++) {
489  if (irc[ir] > 0) {
490  getRecord(type, irc[ir]);
491  int nPhoton = (newForm) ? photo->size() : photon.size();
492  npold += nPhoton;
493  for (int j = 0; j < nPhoton; j++) {
494  r = G4UniformRand();
495  if ((ir == 0 && r > w) || (ir > 0 && r < w)) {
496  storePhoton(j);
497  }
498  }
499  }
500  }
501 
502  if ((npe > npold || (npold == 0 && irc[0] > 0)) && !(npe == 0 && npold == 0))
503  edm::LogWarning("HFShower") << "HFShowerLibrary: Interpolation Warning =="
504  << " records " << irc[0] << " and " << irc[1] << " gives a buffer of " << npold
505  << " photons and fills " << npe << " *****";
506 #ifdef EDM_ML_DEBUG
507  else
508  edm::LogVerbatim("HFShower") << "HFShowerLibrary: Interpolation == records " << irc[0] << " and " << irc[1]
509  << " gives a buffer of " << npold << " photons and fills " << npe << " PE";
510  for (int j = 0; j < npe; j++)
511  edm::LogVerbatim("HFShower") << "Photon " << j << " " << pe[j];
512 #endif
513 }
514 
515 void HFShowerLibrary::extrapolate(int type, double pin) {
516  int nrec = int(pin / pmom[nMomBin - 1]);
517  double w = (pin - pmom[nMomBin - 1] * nrec) / pmom[nMomBin - 1];
518  nrec++;
519 #ifdef EDM_ML_DEBUG
520  edm::LogVerbatim("HFShower") << "HFShowerLibrary:: Extrapolate for Energy " << pin / CLHEP::GeV << " GeV with "
521  << nMomBin << " momentum bins and " << evtPerBin << " entries/bin -- "
522  << "total " << totEvents << " using " << nrec << " records";
523 #endif
524  std::vector<int> irc(nrec);
525 
526  for (int ir = 0; ir < nrec; ir++) {
527  double r = G4UniformRand();
528  irc[ir] = int(evtPerBin * 0.5 * r) + (nMomBin - 1) * evtPerBin + 1;
529  if (irc[ir] < 1) {
530  edm::LogWarning("HFShower") << "HFShowerLibrary:: Illegal irc[" << ir << "] = " << irc[ir] << " now set to 1";
531  irc[ir] = 1;
532  } else if (irc[ir] > totEvents) {
533  edm::LogWarning("HFShower") << "HFShowerLibrary:: Illegal irc[" << ir << "] = " << irc[ir] << " now set to "
534  << totEvents;
535  irc[ir] = totEvents;
536 #ifdef EDM_ML_DEBUG
537  } else {
538  edm::LogVerbatim("HFShower") << "HFShowerLibrary::Extrapolation use irc[" << ir << "] = " << irc[ir];
539 #endif
540  }
541  }
542 
543  pe.clear();
544  npe = 0;
545  int npold = 0;
546  for (int ir = 0; ir < nrec; ir++) {
547  if (irc[ir] > 0) {
548  getRecord(type, irc[ir]);
549  int nPhoton = (newForm) ? photo->size() : photon.size();
550  npold += nPhoton;
551  for (int j = 0; j < nPhoton; j++) {
552  double r = G4UniformRand();
553  if (ir != nrec - 1 || r < w) {
554  storePhoton(j);
555  }
556  }
557 #ifdef EDM_ML_DEBUG
558  edm::LogVerbatim("HFShower") << "HFShowerLibrary: Record [" << ir << "] = " << irc[ir] << " npold = " << npold;
559 #endif
560  }
561  }
562 #ifdef EDM_ML_DEBUG
563  edm::LogVerbatim("HFShower") << "HFShowerLibrary:: uses " << npold << " photons";
564 #endif
565 
566  if (npe > npold || npold == 0)
567  edm::LogWarning("HFShower") << "HFShowerLibrary: Extrapolation Warning == " << nrec << " records " << irc[0] << ", "
568  << irc[1] << ", ... gives a buffer of " << npold << " photons and fills " << npe
569  << " *****";
570 #ifdef EDM_ML_DEBUG
571  else
572  edm::LogVerbatim("HFShower") << "HFShowerLibrary: Extrapolation == " << nrec << " records " << irc[0] << ", "
573  << irc[1] << ", ... gives a buffer of " << npold << " photons and fills " << npe
574  << " PE";
575  for (int j = 0; j < npe; j++)
576  edm::LogVerbatim("HFShower") << "Photon " << j << " " << pe[j];
577 #endif
578 }
579 
581  if (newForm)
582  pe.push_back(photo->at(j));
583  else
584  pe.push_back(photon[j]);
585  npe++;
586 #ifdef EDM_ML_DEBUG
587  edm::LogVerbatim("HFShower") << "HFShowerLibrary: storePhoton " << j << " npe " << npe << " " << pe[npe - 1];
588 #endif
589 }
Log< level::Info, true > LogVerbatim
std::vector< Hit > getHits(const G4Step *aStep, bool &ok, double weight, bool onlyLong=false)
static const TGPicture * info(bool iBackgroundIsBlack)
const double GeV
Definition: MathUtil.h:16
void getRecord(int, int)
const double w
Definition: UKUtility.cc:23
const HcalDDDSimConstants * hcalConstant_
std::unique_ptr< HFFibre > fibre_
float *__restrict__ zv
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
HFShowerPhotonCollection pe
Exp< T >::type exp(const T &t)
Definition: Exp.h:22
Log< level::Error, false > LogError
static bool isStableHadron(int pdgCode)
const double MeV
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
void loadEventInfo(TBranch *)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< double > gpar
TBranch * emBranch
std::vector< double > pmom
G4ThreeVector position
HFShowerLibrary(const std::string &name, const HcalDDDSimConstants *hcons, const HcalSimulationParameters *hps, edm::ParameterSet const &p)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void extrapolate(int, double)
std::unique_ptr< HFShowerPhotonCollection > photo
static int position[264][3]
Definition: ReadPGInfo.cc:289
void storePhoton(int j)
static bool isGammaElectronPositron(int pdgCode)
std::vector< Hit > fillHits(const G4ThreeVector &p, const G4ThreeVector &v, int parCode, double parEnergy, bool &ok, double weight, double time, bool onlyLong=false)
Log< level::Warning, false > LogWarning
int weight
Definition: histoStyle.py:51
HFShowerPhotonCollection photon
bool rInside(double r)
void interpolate(int, double)
TBranch * hadBranch