CMS 3D CMS Logo

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