CMS 3D CMS Logo

List of all members | Public Member Functions | Private Types | Private Member Functions | Private Attributes
EMShower Class Reference

#include <EMShower.h>

Public Member Functions

void compute ()
 Compute the shower longitudinal and lateral development. More...
 
 EMShower (RandomEngineAndDistribution const *engine, GammaFunctionGenerator *gamma, EMECALShowerParametrization *const myParam, std::vector< const RawParticle *> *const myPart, EcalHitMaker *const myGrid=nullptr, PreshowerHitMaker *const myPreshower=nullptr, bool bFixedLength=false)
 
double getMaximumOfShower () const
 get the depth of the centre of gravity of the shower(s) More...
 
void prepareSteps ()
 Computes the steps before the real compute. More...
 
void setGrid (EcalHitMaker *const myGrid)
 set the grid address More...
 
void setHcal (HcalHitMaker *const myHcal)
 set the HCAL address More...
 
void setPreshower (PreshowerHitMaker *const myPresh)
 set the preshower address More...
 
virtual ~EMShower ()
 

Private Types

typedef std::pair< XYZPoint, double > Spot
 
typedef std::pair< unsigned int, double > Step
 
typedef Steps::const_iterator step_iterator
 
typedef std::vector< StepSteps
 
typedef math::XYZVector XYZPoint
 

Private Member Functions

double deposit (double t, double a, double b, double dt)
 
double deposit (double a, double b, double t)
 
double gam (double x, double a) const
 
void setIntervals (unsigned icomp, RadialInterval &rad)
 

Private Attributes

std::vector< double > a
 
std::vector< double > aSpot
 
std::vector< double > b
 
bool bFixedLength_
 
std::vector< double > bSpot
 
std::vector< std::vector< double > > depositedEnergy
 
std::vector< double > E
 
std::vector< double > Etot
 
double globalMaximum
 
bool hasPreshower
 
double innerDepth
 
std::vector< double > maximumOfShower
 
std::vector< double > meanDepth
 
GammaFunctionGeneratormyGammaGenerator
 
Genfun::IncompleteGamma myIncompleteGamma
 
unsigned int nPart
 
unsigned nSteps
 
double outerDepth
 
std::vector< double > photos
 
const RandomEngineAndDistributionrandom
 
Steps steps
 
bool stepsCalculated
 
std::vector< double > T
 
const ECALPropertiestheECAL
 
EcalHitMakertheGrid
 
const HCALPropertiestheHCAL
 
HcalHitMakertheHcalHitMaker
 
const PreshowerLayer1PropertiestheLayer1
 
const PreshowerLayer2PropertiestheLayer2
 
std::vector< double > theNumberOfSpots
 
EMECALShowerParametrization *const theParam
 
std::vector< const RawParticle * > *const thePart
 
PreshowerHitMakerthePreshower
 
std::vector< double > Ti
 
double totalEnergy
 
std::vector< double > TSpot
 

Detailed Description

Definition at line 26 of file EMShower.h.

Member Typedef Documentation

◆ Spot

typedef std::pair<XYZPoint, double> EMShower::Spot
private

Definition at line 29 of file EMShower.h.

◆ Step

typedef std::pair<unsigned int, double> EMShower::Step
private

Definition at line 30 of file EMShower.h.

◆ step_iterator

typedef Steps::const_iterator EMShower::step_iterator
private

Definition at line 32 of file EMShower.h.

◆ Steps

typedef std::vector<Step> EMShower::Steps
private

Definition at line 31 of file EMShower.h.

◆ XYZPoint

Definition at line 27 of file EMShower.h.

Constructor & Destructor Documentation

◆ EMShower()

EMShower::EMShower ( RandomEngineAndDistribution const *  engine,
GammaFunctionGenerator gamma,
EMECALShowerParametrization *const  myParam,
std::vector< const RawParticle *> *const  myPart,
EcalHitMaker *const  myGrid = nullptr,
PreshowerHitMaker *const  myPreshower = nullptr,
bool  bFixedLength = false 
)

Definition at line 16 of file EMShower.cc.

References a, aSpot, b, bSpot, EMECALShowerParametrization::correlationAlphaT(), ECALProperties::criticalEnergy(), MillePedeFileConverter_cfg::e, E, EMECALShowerParametrization::ecalProperties(), Etot, JetChargeProducer_cfi::exp, RandomEngineAndDistribution::gaussShoot(), globalMaximum, hasPreshower, EMECALShowerParametrization::hcalProperties(), mps_fire::i, EMECALShowerParametrization::layer1Properties(), EMECALShowerParametrization::layer2Properties(), ECALProperties::lightCollectionEfficiency(), dqm-mbProfile::log, maximumOfShower, EMECALShowerParametrization::meanAlpha(), EMECALShowerParametrization::meanAlphaSpot(), meanDepth, EMECALShowerParametrization::meanLnAlpha(), EMECALShowerParametrization::meanLnT(), EMECALShowerParametrization::meanT(), EMECALShowerParametrization::meanTSpot(), nPart, EMECALShowerParametrization::nSpots(), photos, ECALProperties::photoStatistics(), random, jetAnalyzer_cfi::rhom, EMECALShowerParametrization::sigmaLnAlpha(), EMECALShowerParametrization::sigmaLnT(), mathSSE::sqrt(), stepsCalculated, theECAL, theHCAL, theLayer1, theLayer2, theNumberOfSpots, theParam, thePart, Ti, totalEnergy, TSpot, and testProducerWithPsetDescEmpty_cfi::z2.

24  : theParam(myParam),
25  thePart(myPart),
26  theGrid(myGrid),
27  thePreshower(myPresh),
28  random(engine),
31  // Get the Famos Histos pointer
32  // myHistos = Histos::instance();
33  // myGammaGenerator = GammaFunctionGenerator::instance();
34  stepsCalculated = false;
35  hasPreshower = myPresh != nullptr;
36  theECAL = myParam->ecalProperties();
37  theHCAL = myParam->hcalProperties();
38  theLayer1 = myParam->layer1Properties();
39  theLayer2 = myParam->layer2Properties();
40 
42 
43  nPart = thePart->size();
44  totalEnergy = 0.;
45  globalMaximum = 0.;
46  double meanDepth = 0.;
47  // Initialize the shower parameters for each particle
48 
49  for (unsigned int i = 0; i < nPart; ++i) {
50  // std::cout << " AAA " << *(*thePart)[i] << std::endl;
51  // The particle and the shower energy
52  Etot.push_back(0.);
53  E.push_back(((*thePart)[i])->e());
54  totalEnergy += E[i];
55 
56  double lny = std::log(E[i] / theECAL->criticalEnergy());
57 
58  // Average and Sigma for T and alpha
59  double theMeanT = myParam->meanT(lny);
60  double theMeanAlpha = myParam->meanAlpha(lny);
61  double theMeanLnT = myParam->meanLnT(lny);
62  double theMeanLnAlpha = myParam->meanLnAlpha(lny);
63  double theSigmaLnT = myParam->sigmaLnT(lny);
64  double theSigmaLnAlpha = myParam->sigmaLnAlpha(lny);
65 
66  // The correlation matrix
67  double theCorrelation = myParam->correlationAlphaT(lny);
68  double rhop = std::sqrt((1. + theCorrelation) / 2.);
69  double rhom = std::sqrt((1. - theCorrelation) / 2.);
70 
71  // The number of spots in ECAL / HCAL
72  theNumberOfSpots.push_back(myParam->nSpots(E[i]));
73  // theNumberOfSpots.push_back(myParam->nSpots(E[i])*spotFraction);
74  //theNumberOfSpots = random->poissonShoot(myParam->nSpots(myPart->e()));
75 
76  // Photo-statistics
77  photos.push_back(E[i] * fotos);
78 
79  // The longitudinal shower development parameters
80  // Fluctuations of alpha, T and beta
81  double z1 = 0.;
82  double z2 = 0.;
83  double aa = 0.;
84 
85  // Protect against too large fluctuations (a < 1) for small energies
86  while (aa <= 1.) {
87  z1 = random->gaussShoot(0., 1.);
88  z2 = random->gaussShoot(0., 1.);
89  aa = std::exp(theMeanLnAlpha + theSigmaLnAlpha * (z1 * rhop - z2 * rhom));
90  }
91 
92  a.push_back(aa);
93  T.push_back(std::exp(theMeanLnT + theSigmaLnT * (z1 * rhop + z2 * rhom)));
94  b.push_back((a[i] - 1.) / T[i]);
95  maximumOfShower.push_back((a[i] - 1.) / b[i]);
97  meanDepth += a[i] / b[i] * E[i];
98  // std::cout << " Adding max " << maximumOfShower[i] << " " << E[i] << " " <<maximumOfShower[i]*E[i] << std::endl;
99  // std::cout << std::setw(8) << std::setprecision(5) << " a /b " << a[i] << " " << b[i] << std::endl;
100  Ti.push_back(a[i] / b[i] * (std::exp(theMeanLnAlpha) - 1.) / std::exp(theMeanLnAlpha));
101 
102  // The parameters for the number of energy spots
103  TSpot.push_back(theParam->meanTSpot(theMeanT));
104  aSpot.push_back(theParam->meanAlphaSpot(theMeanAlpha));
105  bSpot.push_back((aSpot[i] - 1.) / TSpot[i]);
106  // myHistos->fill("h7000",a[i]);
107  // myHistos->fill("h7002",E[i],a[i]);
108  }
109  // std::cout << " PS1 : " << myGrid->ps1TotalX0()
110  // << " PS2 : " << myGrid->ps2TotalX0()
111  // << " ECAL : " << myGrid->ecalTotalX0()
112  // << " HCAL : " << myGrid->hcalTotalX0()
113  // << " Offset : " << myGrid->x0DepthOffset()
114  // << std::endl;
115 
118  // std::cout << " Total Energy " << totalEnergy << " Global max " << globalMaximum << std::endl;
119 }
std::vector< const RawParticle * > *const thePart
Definition: EMShower.h:89
std::vector< double > theNumberOfSpots
Definition: EMShower.h:93
double meanLnAlpha(double lny) const
std::vector< double > maximumOfShower
Definition: EMShower.h:108
double criticalEnergy() const override
Critical energy in GeV (2.66E-3*(x0*Z/A)^1.1): 8.74E-3 for Standard ECAL.
std::vector< double > aSpot
Definition: EMShower.h:102
const HCALProperties * hcalProperties() const
const RandomEngineAndDistribution * random
Definition: EMShower.h:139
const HCALProperties * theHCAL
Definition: EMShower.h:84
const PreshowerLayer2Properties * layer2Properties() const
const ECALProperties * theECAL
Definition: EMShower.h:83
std::vector< double > Etot
Definition: EMShower.h:94
bool stepsCalculated
Definition: EMShower.h:120
PreshowerHitMaker * thePreshower
Definition: EMShower.h:126
T sqrt(T t)
Definition: SSEVec.h:19
unsigned int nPart
Definition: EMShower.h:90
const PreshowerLayer1Properties * layer1Properties() const
std::vector< double > meanDepth
Definition: EMShower.h:110
double sigmaLnAlpha(double lny) const
bool bFixedLength_
Definition: EMShower.h:144
std::vector< double > photos
Definition: EMShower.h:96
double gaussShoot(double mean=0.0, double sigma=1.0) const
const ECALProperties * ecalProperties() const
bool hasPreshower
Definition: EMShower.h:132
double globalMaximum
Definition: EMShower.h:113
double meanAlphaSpot(double alpha) const
const PreshowerLayer2Properties * theLayer2
Definition: EMShower.h:86
virtual double lightCollectionEfficiency() const =0
Light Collection efficiency.
const PreshowerLayer1Properties * theLayer1
Definition: EMShower.h:85
std::vector< double > a
Definition: EMShower.h:98
EMECALShowerParametrization *const theParam
Definition: EMShower.h:80
EcalHitMaker * theGrid
Definition: EMShower.h:123
GammaFunctionGenerator * myGammaGenerator
Definition: EMShower.h:142
std::vector< double > Ti
Definition: EMShower.h:100
double correlationAlphaT(double lny) const
std::vector< double > TSpot
Definition: EMShower.h:101
std::vector< double > b
Definition: EMShower.h:99
double totalEnergy
Definition: EMShower.h:115
std::vector< double > E
Definition: EMShower.h:95
long double T
virtual double photoStatistics() const =0
Photostatistics (photons/GeV) in the homegeneous material.
std::vector< double > bSpot
Definition: EMShower.h:103

◆ ~EMShower()

virtual EMShower::~EMShower ( )
inlinevirtual

Definition at line 43 of file EMShower.h.

43 { ; }

Member Function Documentation

◆ compute()

void EMShower::compute ( )

Compute the shower longitudinal and lateral development.

Definition at line 263 of file EMShower.cc.

References a, PreshowerHitMaker::addHit(), HcalHitMaker::addHit(), EcalHitMaker::addHit(), EcalHitMaker::addHitDepth(), RadialInterval::addInterval(), aSpot, b, bSpot, RadialInterval::compute(), deposit(), depositedEnergy, LEDCalibrationChannels::depth, hgcalTestNeighbor_cfi::detector, dt, E, Etot, RandomEngineAndDistribution::flatShoot(), gam(), HLT_2022v12_cff::gap, RandomEngineAndDistribution::gaussShoot(), RadialInterval::getNumberOfSpots(), EcalHitMaker::getPads(), RadialInterval::getSpotEnergy(), RadialInterval::getUmax(), RadialInterval::getUmin(), EcalHitMaker::getX0back(), hasPreshower, hltEgammaHLTExtra_cfi::hcal, HCALProperties::hOverPi(), mps_fire::i, createfilelist::int, ECALProperties::isHom(), ECALProperties::lightCollectionUniformity(), M_PI, SiStripPI::mean, meanDepth, PreshowerLayer1Properties::mipsPerGeV(), PreshowerLayer2Properties::mipsPerGeV(), myGammaGenerator, RadialInterval::nIntervals(), nPart, nSteps, EMECALShowerParametrization::p(), phi, photos, RandomEngineAndDistribution::poissonShoot(), prepareSteps(), random, EMECALShowerParametrization::rC(), ECALProperties::resE(), EMECALShowerParametrization::rT(), HcalHitMaker::setDepth(), setIntervals(), GammaFunctionGenerator::setParameters(), HcalHitMaker::setSpotEnergy(), PreshowerHitMaker::setSpotEnergy(), EcalHitMaker::setSpotEnergy(), GammaFunctionGenerator::shoot(), HCALProperties::spotFraction(), mathSSE::sqrt(), mps_update::status, steps, stepsCalculated, submitPVValidationJobs::t, theECAL, theGrid, theHCAL, theHcalHitMaker, theLayer1, theLayer2, theNumberOfSpots, theParam, thePreshower, Ti, groupFilesInBlocks::tt, and HLTMuonOfflineAnalyzer_cfi::z0.

Referenced by CalorimetryManager::EMShowerSimulation().

263  {
264  double t = 0.;
265  double dt = 0.;
266  if (!stepsCalculated)
267  prepareSteps();
268 
269  // Prepare the grids in EcalHitMaker
270  // theGrid->setInnerAndOuterDepth(innerDepth,outerDepth);
271  float pstot = 0.;
272  float ps2tot = 0.;
273  float ps1tot = 0.;
274  bool status = false;
275  // double E1 = 0.; // Energy layer 1
276  // double E2 = 0.; // Energy layer 2
277  // double n1 = 0.; // #mips layer 1
278  // double n2 = 0.; // #mips layer 2
279  // double E9 = 0.; // Energy ECAL
280 
281  // Loop over all segments for the longitudinal development
282  double totECalc = 0;
283 
284  for (unsigned iStep = 0; iStep < nSteps; ++iStep) {
285  // The length of the shower in this segment
286  dt = steps[iStep].second;
287 
288  // std::cout << " Detector " << steps[iStep].first << " t " << t << " " << dt << std::endl;
289 
290  // The elapsed length
291  t += dt;
292 
293  // In what detector are we ?
294  unsigned detector = steps[iStep].first;
295 
296  bool presh1 = detector == 0;
297  bool presh2 = detector == 1;
298  bool ecal = detector == 2;
299  bool hcal = detector == 3;
300  bool vfcal = detector == 4;
301  bool gap = detector == 5;
302 
303  // Temporary. Will be removed
304  if (theHCAL == nullptr)
305  hcal = false;
306 
307  // Keep only ECAL for now
308  if (vfcal)
309  continue;
310 
311  // Nothing to do in the gap
312  if (gap)
313  continue;
314 
315  // cout << " t = " << t << endl;
316  // Build the grid of crystals at this ECAL depth
317  // Actually, it might be useful to check if this grid is empty or not.
318  // If it is empty (because no crystal at this depth), it is of no use
319  // (and time consuming) to generate the spots
320 
321  // middle of the step
322  double tt = t - 0.5 * dt;
323 
324  double realTotalEnergy = 0.;
325  for (unsigned int i = 0; i < nPart; ++i) {
326  realTotalEnergy += depositedEnergy[iStep][i] * E[i];
327  }
328 
329  // std::cout << " Step " << tt << std::endl;
330  // std::cout << "ecal " << ecal << " hcal " << hcal <<std::endl;
331 
332  // If the amount of energy is greater than 1 MeV, make a new grid
333  // otherwise put in the previous one.
334  bool usePreviousGrid = (realTotalEnergy < 0.001);
335 
336  // If the amount of energy is greater than 1 MeV, make a new grid
337  // otherwise put in the previous one.
338 
339  // If less than 1 kEV. Just skip
340  if (iStep > 2 && realTotalEnergy < 0.000001)
341  continue;
342 
343  if (ecal && !usePreviousGrid) {
344  status = theGrid->getPads(meanDepth[iStep]);
345  }
346  if (hcal) {
348  }
349  if ((ecal || hcal) && !status)
350  continue;
351 
352  bool detailedShowerTail = false;
353  // check if a detailed treatment of the rear leakage should be applied
354  if (ecal && !usePreviousGrid) {
355  detailedShowerTail = (t - dt > theGrid->getX0back());
356  }
357 
358  // The particles of the shower are processed in parallel
359  for (unsigned int i = 0; i < nPart; ++i) {
360  // double Edepo=deposit(t,a[i],b[i],dt);
361 
362  // integration of the shower profile between t-dt and t
363  double dE = (!hcal) ? depositedEnergy[iStep][i] : 1. - deposit(a[i], b[i], t - dt);
364 
365  // no need to do the full machinery if there is ~nothing to distribute)
366  if (dE * E[i] < 0.000001)
367  continue;
368 
369  if (ecal && !theECAL->isHom()) {
370  double mean = dE * E[i];
371  double sigma = theECAL->resE() * sqrt(mean);
372 
373  /*
374  double meanLn = log(mean);
375  double kLn = sigma/mean+1;
376  double sigmaLn = log(kLn);
377  */
378 
379  double dE0 = dE;
380 
381  // std::cout << "dE before shoot = " << dE << std::endl;
382  dE = random->gaussShoot(mean, sigma) / E[i];
383 
384  // myGammaGenerator->setParameters(aSam,bSam,0);
385  // dE = myGammaGenerator->shoot()/E[i];
386  // std::cout << "dE shooted = " << dE << " E[i] = " << E[i] << std::endl;
387  if (dE * E[i] < 0.000001)
388  continue;
389  photos[i] = photos[i] * dE / dE0;
390  }
391 
392  /*
393  if (ecal && !theParam->ecalProperties()->isHom()){
394 
395  double cSquare = TMath::Power(theParam->ecalProperties()->resE(),2);
396  double aSam = dE/cSquare;
397  double bSam = 1./cSquare;
398 
399  // dE = dE*gam(bSam*dE, aSam)/tgamma(aSam);
400  }
401  */
402 
403  totECalc += dE;
404 
405  // The number of energy spots (or mips)
406  double nS = 0;
407 
408  // ECAL case : Account for photostatistics and long'al non-uniformity
409  if (ecal) {
410  // double aSam = E[i]*dE*one_over_resoSquare;
411  // double bSam = one_over_resoSquare;
412 
413  dE = random->poissonShoot(dE * photos[i]) / photos[i];
414  double z0 = random->gaussShoot(0., 1.);
415  dE *= 1. + z0 * theECAL->lightCollectionUniformity();
416 
417  // Expected spot number
418  nS = (theNumberOfSpots[i] * gam(bSpot[i] * tt, aSpot[i]) * bSpot[i] * dt / tgamma(aSpot[i]));
419 
420  // Preshower : Expected number of mips + fluctuation
421  } else if (hcal) {
422  nS = (theNumberOfSpots[i] * gam(bSpot[i] * tt, aSpot[i]) * bSpot[i] * dt / tgamma(aSpot[i])) *
424  double nSo = nS;
425  nS = random->poissonShoot(nS);
426  // 'Quick and dirty' fix (but this line should be better removed):
427  if (nSo > 0. && nS / nSo < 10.)
428  dE *= nS / nSo;
429 
430  // if(true)
431  // {
432  // std::cout << " theHCAL->spotFraction = " <<theHCAL->spotFraction() <<std::endl;
433  // std::cout << " nSpot Ecal : " << nSo/theHCAL->spotFraction() << " Final " << nS << std::endl;
434  // }
435  } else if (presh1) {
436  nS = random->poissonShoot(dE * E[i] * theLayer1->mipsPerGeV());
437  // std::cout << " dE *E[i] (1)" << dE*E[i] << " " << dE*E[i]*theLayer1->mipsPerGeV() << " "<< nS << std::endl;
438  pstot += dE * E[i];
439  ps1tot += dE * E[i];
440  dE = nS / (E[i] * theLayer1->mipsPerGeV());
441 
442  // E1 += dE*E[i];
443  // n1 += nS;
444  // if (presh2) { E2 += SpotEnergy; ++n2; }
445 
446  } else if (presh2) {
447  nS = random->poissonShoot(dE * E[i] * theLayer2->mipsPerGeV());
448  // std::cout << " dE *E[i] (2) " << dE*E[i] << " " << dE*E[i]*theLayer2->mipsPerGeV() << " "<< nS << std::endl;
449  pstot += dE * E[i];
450  ps2tot += dE * E[i];
451  dE = nS / (E[i] * theLayer2->mipsPerGeV());
452 
453  // E2 += dE*E[i];
454  // n2 += nS;
455  }
456 
457  if (detailedShowerTail)
458  myGammaGenerator->setParameters(floor(a[i] + 0.5), b[i], t - dt);
459 
460  // myHistos->fill("h100",t,dE);
461 
462  // The lateral development parameters
463 
464  // Energy of the spots
465  double eSpot = (nS > 0.) ? dE / nS : 0.;
466  double SpotEnergy = eSpot * E[i];
467 
468  if (hasPreshower && (presh1 || presh2))
469  thePreshower->setSpotEnergy(0.00009);
470  if (hcal) {
471  SpotEnergy *= theHCAL->hOverPi();
472  theHcalHitMaker->setSpotEnergy(SpotEnergy);
473  }
474  // Poissonian fluctuations for the number of spots
475  // int nSpot = random->poissonShoot(nS);
476  int nSpot = (int)(nS + 0.5);
477 
478  // Fig. 11 (right) *** Does not match.
479  // myHistos->fill("h101",t,(double)nSpot/theNumberOfSpots);
480 
481  //double taui = t/T;
482  double taui = tt / Ti[i];
483  double proba = theParam->p(taui, E[i]);
484  double theRC = theParam->rC(taui, E[i]);
485  double theRT = theParam->rT(taui, E[i]);
486 
487  // Fig. 10
488  // myHistos->fill("h300",taui,theRC);
489  // myHistos->fill("h301",taui,theRT);
490  // myHistos->fill("h302",taui,proba);
491 
492  double dSpotsCore = random->gaussShoot(proba * nSpot, std::sqrt(proba * (1. - proba) * nSpot));
493 
494  if (dSpotsCore < 0)
495  dSpotsCore = 0;
496 
497  unsigned nSpots_core = (unsigned)(dSpotsCore + 0.5);
498  unsigned nSpots_tail = ((unsigned)nSpot > nSpots_core) ? nSpot - nSpots_core : 0;
499 
500  for (unsigned icomp = 0; icomp < 2; ++icomp) {
501  double theR = (icomp == 0) ? theRC : theRT;
502  unsigned ncompspots = (icomp == 0) ? nSpots_core : nSpots_tail;
503 
504  RadialInterval radInterval(theR, ncompspots, SpotEnergy, random);
505  if (ecal) {
506  if (icomp == 0) {
507  setIntervals(icomp, radInterval);
508  } else {
509  setIntervals(icomp, radInterval);
510  }
511  } else {
512  radInterval.addInterval(100., 1.); // 100% of the spots
513  }
514 
515  radInterval.compute();
516  // irad = 0 : central circle; irad=1 : outside
517 
518  unsigned nrad = radInterval.nIntervals();
519 
520  for (unsigned irad = 0; irad < nrad; ++irad) {
521  double spote = radInterval.getSpotEnergy(irad);
522  if (ecal)
523  theGrid->setSpotEnergy(spote);
524  if (hcal)
526  unsigned nradspots = radInterval.getNumberOfSpots(irad);
527  double umin = radInterval.getUmin(irad);
528  double umax = radInterval.getUmax(irad);
529  // Go for the lateral development
530  // std::cout << "Couche " << iStep << " irad = " << irad << " Ene = " << E[i] << " eSpot = " << eSpot << " spote = " << spote << " nSpot = " << nS << std::endl;
531 
532  for (unsigned ispot = 0; ispot < nradspots; ++ispot) {
533  double z3 = random->flatShoot(umin, umax);
534  double ri = theR * std::sqrt(z3 / (1. - z3));
535 
536  // Generate phi
537  double phi = 2. * M_PI * random->flatShoot();
538 
539  // Add the hit in the crystal
540  // if( ecal ) theGrid->addHit(ri*theECAL->moliereRadius(),phi);
541  // Now the *moliereRadius is done in EcalHitMaker
542  if (ecal) {
543  if (detailedShowerTail) {
544  // std::cout << "About to call addHitDepth " << std::endl;
545  double depth;
546  do {
548  } while (depth > t);
549  theGrid->addHitDepth(ri, phi, depth);
550  // std::cout << " Done " << std::endl;
551  } else
552  theGrid->addHit(ri, phi);
553  } else if (hasPreshower && presh1)
554  thePreshower->addHit(ri, phi, 1);
555  else if (hasPreshower && presh2)
556  thePreshower->addHit(ri, phi, 2);
557  else if (hcal) {
558  // std::cout << " About to add a spot in the HCAL" << status << std::endl;
559  theHcalHitMaker->addHit(ri, phi);
560  // std::cout << " Added a spot in the HCAL" << status << std::endl;
561  }
562  // if (ecal) E9 += SpotEnergy;
563  // if (presh1) { E1 += SpotEnergy; ++n1; }
564  // if (presh2) { E2 += SpotEnergy; ++n2; }
565 
566  Etot[i] += spote;
567  }
568  }
569  }
570  // std::cout << " Done with the step " << std::endl;
571  // The shower!
572  //myHistos->fill("h500",theSpot.z(),theSpot.perp());
573  }
574  // std::cout << " nPart " << nPart << std::endl;
575  }
576  // std::cout << " Finshed the step loop " << std::endl;
577  // myHistos->fill("h500",E1+0.7*E2,E9);
578  // myHistos->fill("h501",n1+0.7*n2,E9);
579  // myHistos->fill("h400",n1);
580  // myHistos->fill("h401",n2);
581  // myHistos->fill("h402",E9+E1+0.7*E2);
582  // if(!standalone)theGrid->printGrid();
583  double Etotal = 0.;
584  for (unsigned i = 0; i < nPart; ++i) {
585  // myHistos->fill("h10",Etot[i]);
586  Etotal += Etot[i];
587  }
588 
589  // std::cout << "Etotal = " << Etotal << " nPart = "<< nPart << std::endl;
590  // std::cout << "totECalc = " << totECalc << std::endl;
591 
592  // myHistos->fill("h20",Etotal);
593  // if(thePreshower)
594  // std::cout << " PS " << thePreshower->layer1Calibrated() << " " << thePreshower->layer2Calibrated() << " " << thePreshower->totalCalibrated() << " " << ps1tot << " " <<ps2tot << " " << pstot << std::endl;
595 }
float dt
Definition: AMPTWrapper.h:136
bool addHit(double r, double phi, unsigned layer=0) override
std::vector< double > theNumberOfSpots
Definition: EMShower.h:93
bool isHom() const
a rough estimate of ECAL resolution sigma/E = resE/sqrt(E)
void prepareSteps()
Computes the steps before the real compute.
Definition: EMShower.cc:121
std::vector< double > aSpot
Definition: EMShower.h:102
double deposit(double t, double a, double b, double dt)
Definition: EMShower.cc:632
const RandomEngineAndDistribution * random
Definition: EMShower.h:139
const HCALProperties * theHCAL
Definition: EMShower.h:84
double rC(double tau, double E) const
const ECALProperties * theECAL
Definition: EMShower.h:83
void setIntervals(unsigned icomp, RadialInterval &rad)
Definition: EMShower.cc:643
std::vector< double > Etot
Definition: EMShower.h:94
double hOverPi() const
double mipsPerGeV() const override
Number of Mips/GeV [Default : 41.7 Mips/GeV or 24 MeV/Mips].
bool stepsCalculated
Definition: EMShower.h:120
bool addHit(double r, double phi, unsigned layer=0) override
add the hit in the HCAL in local coordinates
Definition: HcalHitMaker.cc:30
PreshowerHitMaker * thePreshower
Definition: EMShower.h:126
std::vector< std::vector< double > > depositedEnergy
Definition: EMShower.h:109
Steps steps
Definition: EMShower.h:118
bool addHitDepth(double r, double phi, double depth=-1)
T sqrt(T t)
Definition: SSEVec.h:19
bool addHit(double r, double phi, unsigned layer=0) override
double p(double tau, double E) const
HcalHitMaker * theHcalHitMaker
Definition: EMShower.h:129
double getX0back() const
Definition: EcalHitMaker.h:104
double gam(double x, double a) const
Definition: EMShower.cc:597
unsigned int nPart
Definition: EMShower.h:90
std::vector< double > meanDepth
Definition: EMShower.h:110
void setSpotEnergy(double e) override
Set the spot energy.
Definition: HcalHitMaker.h:26
double spotFraction() const
Spot fraction wrt ECAL.
double rT(double tau, double E) const
void setParameters(double a, double b, double xm)
The parameters must be set before shooting.
std::vector< double > photos
Definition: EMShower.h:96
double gaussShoot(double mean=0.0, double sigma=1.0) const
#define M_PI
bool hasPreshower
Definition: EMShower.h:132
double mipsPerGeV() const override
Number of Mips/GeV [Default : 59.5 Mips/GeV or 0.7*24 MeV/Mips].
double resE() const
a rough estimate of ECAL resolution sigma/E = resE/sqrt(E)
const PreshowerLayer2Properties * theLayer2
Definition: EMShower.h:86
bool getPads(double depth, bool inCm=false)
unsigned int poissonShoot(double mean) const
const PreshowerLayer1Properties * theLayer1
Definition: EMShower.h:85
std::vector< double > a
Definition: EMShower.h:98
double shoot(RandomEngineAndDistribution const *) const
virtual double lightCollectionUniformity() const =0
Light Collection uniformity.
EMECALShowerParametrization *const theParam
Definition: EMShower.h:80
EcalHitMaker * theGrid
Definition: EMShower.h:123
GammaFunctionGenerator * myGammaGenerator
Definition: EMShower.h:142
std::vector< double > Ti
Definition: EMShower.h:100
double flatShoot(double xmin=0.0, double xmax=1.0) const
unsigned nSteps
Definition: EMShower.h:119
std::vector< double > b
Definition: EMShower.h:99
std::vector< double > E
Definition: EMShower.h:95
bool setDepth(double, bool inCm=false)
set the depth in X0 or Lambda0 units depending on showerType
void setSpotEnergy(double e) override
Definition: EcalHitMaker.h:112
void setSpotEnergy(double e) override
std::vector< double > bSpot
Definition: EMShower.h:103

◆ deposit() [1/2]

double EMShower::deposit ( double  t,
double  a,
double  b,
double  dt 
)
private

Definition at line 632 of file EMShower.cc.

References a, b, b1, b2, dt, myIncompleteGamma, mps_fire::result, and submitPVValidationJobs::t.

Referenced by compute(), and prepareSteps().

632  {
633  myIncompleteGamma.a().setValue(a);
634  double b1 = b * (t - dt);
635  double b2 = b * t;
636  double result = 0.;
637  double rb1 = (b1 != 0.) ? myIncompleteGamma(b1) : 0.;
638  double rb2 = (b2 != 0.) ? myIncompleteGamma(b2) : 0.;
639  result = (rb2 - rb1);
640  return result;
641 }
float dt
Definition: AMPTWrapper.h:136
std::vector< double > a
Definition: EMShower.h:98
static constexpr float b2
Genfun::IncompleteGamma myIncompleteGamma
Definition: EMShower.h:136
std::vector< double > b
Definition: EMShower.h:99
static constexpr float b1

◆ deposit() [2/2]

double EMShower::deposit ( double  a,
double  b,
double  t 
)
private

Definition at line 663 of file EMShower.cc.

References a, b, b2, MillePedeFileConverter_cfg::e, myIncompleteGamma, mps_fire::result, and submitPVValidationJobs::t.

663  {
664  // std::cout << " Deposit " << std::endl;
665  myIncompleteGamma.a().setValue(a);
666  double b2 = b * t;
667  double result = 0.;
668  if (fabs(b2) < 1.e-9)
669  b2 = 1.e-9;
671  // std::cout << " deposit t = " << t << " " << result <<std::endl;
672  return result;
673 }
std::vector< double > a
Definition: EMShower.h:98
static constexpr float b2
Genfun::IncompleteGamma myIncompleteGamma
Definition: EMShower.h:136
std::vector< double > b
Definition: EMShower.h:99

◆ gam()

double EMShower::gam ( double  x,
double  a 
) const
private

Definition at line 597 of file EMShower.cc.

References a, JetChargeProducer_cfi::exp, funct::pow(), and x.

Referenced by compute().

597  {
598  // A stupid gamma function
599  return std::pow(x, a - 1.) * std::exp(-x);
600 }
std::vector< double > a
Definition: EMShower.h:98
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29

◆ getMaximumOfShower()

double EMShower::getMaximumOfShower ( ) const
inline

get the depth of the centre of gravity of the shower(s)

get the depth of the maximum of the shower

Definition at line 55 of file EMShower.h.

References globalMaximum.

Referenced by CalorimetryManager::EMShowerSimulation().

55 { return globalMaximum; }
double globalMaximum
Definition: EMShower.h:113

◆ prepareSteps()

void EMShower::prepareSteps ( )

Computes the steps before the real compute.

Definition at line 121 of file EMShower.cc.

References a, b, bFixedLength_, deposit(), depositedEnergy, dt, E, EcalHitMaker::ecalTotalX0(), EcalHitMaker::hcalTotalX0(), mps_fire::i, innerDepth, createfilelist::int, meanDepth, nPart, nSteps, hltrates_dqm_sourceclient-live_cfg::offset, outerDepth, EcalHitMaker::ps1TotalX0(), EcalHitMaker::ps2eeTotalX0(), EcalHitMaker::ps2TotalX0(), steps, stepsCalculated, submitPVValidationJobs::t, theGrid, EcalHitMaker::totalX0(), and EcalHitMaker::x0DepthOffset().

Referenced by compute().

121  {
122  // TimeMe theT("EMShower::compute");
123 
124  // Determine the longitudinal intervals
125  // std::cout << " EMShower compute" << std::endl;
126  double dt;
127  double radlen;
128  int stps;
129  int first_Ecal_step = 0;
130  int last_Ecal_step = 0;
131 
132  // The maximum is in principe 8 (with 5X0 steps in the ECAL)
133  steps.reserve(24);
134 
135  /*
136  std::cout << " PS1 : " << theGrid->ps1TotalX0()
137  << " PS2 : " << theGrid->ps2TotalX0()
138  << " PS2 and ECAL : " << theGrid->ps2eeTotalX0()
139  << " ECAL : " << theGrid->ecalTotalX0()
140  << " HCAL : " << theGrid->hcalTotalX0()
141  << " Offset : " << theGrid->x0DepthOffset()
142  << std::endl;
143  */
144 
145  radlen = -theGrid->x0DepthOffset();
146 
147  // Preshower Layer 1
148  radlen += theGrid->ps1TotalX0();
149  if (radlen > 0.) {
150  steps.push_back(Step(0, radlen));
151  radlen = 0.;
152  }
153 
154  // Preshower Layer 2
155  radlen += theGrid->ps2TotalX0();
156  if (radlen > 0.) {
157  steps.push_back(Step(1, radlen));
158  radlen = 0.;
159  }
160 
161  // add a step between preshower and ee
162  radlen += theGrid->ps2eeTotalX0();
163  if (radlen > 0.) {
164  steps.push_back(Step(5, radlen));
165  radlen = 0.;
166  }
167 
168  // ECAL
169  radlen += theGrid->ecalTotalX0();
170 
171  // std::cout << "theGrid->ecalTotalX0() = " << theGrid->ecalTotalX0() << std::endl;
172 
173  if (radlen > 0.) {
174  if (!bFixedLength_) {
175  stps = (int)((radlen + 2.5) / 5.);
176  // stps=(int)((radlen+.5)/1.);
177  if (stps == 0)
178  stps = 1;
179  dt = radlen / (double)stps;
180  Step step(2, dt);
181  first_Ecal_step = steps.size();
182  for (int ist = 0; ist < stps; ++ist)
183  steps.push_back(step);
184  last_Ecal_step = steps.size() - 1;
185  radlen = 0.;
186  } else {
187  dt = 1.0;
188  stps = static_cast<int>(radlen);
189  if (stps == 0)
190  stps = 1;
191  Step step(2, dt);
192  first_Ecal_step = steps.size();
193  for (int ist = 0; ist < stps; ++ist)
194  steps.push_back(step);
195  dt = radlen - stps;
196  if (dt > 0) {
197  Step stepLast(2, dt);
198  steps.push_back(stepLast);
199  }
200  last_Ecal_step = steps.size() - 1;
201  // std::cout << "radlen = " << radlen << " stps = " << stps << " dt = " << dt << std::endl;
202  radlen = 0.;
203  }
204  }
205 
206  // I should had a gap here !
207 
208  // HCAL
209  radlen += theGrid->hcalTotalX0();
210  if (radlen > 0.) {
211  double dtFrontHcal = theGrid->totalX0() - theGrid->hcalTotalX0();
212  // One single step for the full HCAL
213  if (dtFrontHcal < 30.) {
214  dt = 30. - dtFrontHcal;
215  Step step(3, dt);
216  steps.push_back(step);
217  }
218  }
219 
220  nSteps = steps.size();
221  if (nSteps == 0)
222  return;
223  double ESliceTot = 0.;
224  double MeanDepth = 0.;
225  depositedEnergy.resize(nSteps);
226  meanDepth.resize(nSteps);
227  double t = 0.;
228 
229  int offset = 0;
230  for (unsigned iStep = 0; iStep < nSteps; ++iStep) {
231  ESliceTot = 0.;
232  MeanDepth = 0.;
233  double realTotalEnergy = 0;
234  dt = steps[iStep].second;
235  t += dt;
236  for (unsigned int i = 0; i < nPart; ++i) {
237  depositedEnergy[iStep].push_back(deposit(t, a[i], b[i], dt));
238  ESliceTot += depositedEnergy[iStep][i];
239  MeanDepth += deposit(t, a[i] + 1., b[i], dt) / b[i] * a[i];
240  realTotalEnergy += depositedEnergy[iStep][i] * E[i];
241  }
242 
243  if (ESliceTot > 0.) // can happen for the shower tails; this depth will be skipped anyway
244  MeanDepth /= ESliceTot;
245  else
246  MeanDepth = t - dt;
247 
248  meanDepth[iStep] = MeanDepth;
249  if (realTotalEnergy < 0.001) {
250  offset -= 1;
251  }
252  }
253 
254  innerDepth = meanDepth[first_Ecal_step];
255  if (last_Ecal_step + offset >= 0)
256  outerDepth = meanDepth[last_Ecal_step + offset];
257  else
259 
260  stepsCalculated = true;
261 }
float dt
Definition: AMPTWrapper.h:136
double totalX0() const
Definition: EcalHitMaker.h:49
double deposit(double t, double a, double b, double dt)
Definition: EMShower.cc:632
double ps1TotalX0() const
Definition: EcalHitMaker.h:58
double x0DepthOffset() const
get the offset (e.g the number of X0 after which the shower starts)
Definition: EcalHitMaker.h:55
double hcalTotalX0() const
in the HCAL
Definition: EcalHitMaker.h:73
bool stepsCalculated
Definition: EMShower.h:120
std::vector< std::vector< double > > depositedEnergy
Definition: EMShower.h:109
Steps steps
Definition: EMShower.h:118
double ecalTotalX0() const
in the ECAL
Definition: EcalHitMaker.h:67
double innerDepth
Definition: EMShower.h:111
unsigned int nPart
Definition: EMShower.h:90
std::vector< double > meanDepth
Definition: EMShower.h:110
bool bFixedLength_
Definition: EMShower.h:144
double ps2eeTotalX0() const
Definition: EcalHitMaker.h:64
std::vector< double > a
Definition: EMShower.h:98
double ps2TotalX0() const
total number of X0 in the PS (Layer2).
Definition: EcalHitMaker.h:61
double outerDepth
Definition: EMShower.h:111
EcalHitMaker * theGrid
Definition: EMShower.h:123
step
Definition: StallMonitor.cc:98
unsigned nSteps
Definition: EMShower.h:119
std::vector< double > b
Definition: EMShower.h:99
std::vector< double > E
Definition: EMShower.h:95
std::pair< unsigned int, double > Step
Definition: EMShower.h:30

◆ setGrid()

void EMShower::setGrid ( EcalHitMaker *const  myGrid)
inline

set the grid address

Definition at line 58 of file EMShower.h.

References theGrid.

Referenced by CalorimetryManager::EMShowerSimulation().

58 { theGrid = myGrid; }
EcalHitMaker * theGrid
Definition: EMShower.h:123

◆ setHcal()

void EMShower::setHcal ( HcalHitMaker *const  myHcal)

set the HCAL address

Definition at line 661 of file EMShower.cc.

References theHcalHitMaker.

Referenced by CalorimetryManager::EMShowerSimulation().

661 { theHcalHitMaker = myHcal; }
HcalHitMaker * theHcalHitMaker
Definition: EMShower.h:129

◆ setIntervals()

void EMShower::setIntervals ( unsigned  icomp,
RadialInterval rad 
)
private

Definition at line 643 of file EMShower.cc.

References RadialInterval::addInterval(), EMECALShowerParametrization::getCoreIntervals(), EMECALShowerParametrization::getTailIntervals(), gpuVertexFinder::iv, and theParam.

Referenced by compute().

643  {
644  // std::cout << " Got the pointer " << std::endl;
645  const std::vector<double>& myValues((icomp) ? theParam->getTailIntervals() : theParam->getCoreIntervals());
646  // std::cout << " Got the vector " << myValues.size () << std::endl;
647  unsigned nvals = myValues.size() / 2;
648  for (unsigned iv = 0; iv < nvals; ++iv) {
649  // std::cout << myValues[2*iv] << " " << myValues[2*iv+1] <<std::endl;
650  rad.addInterval(myValues[2 * iv], myValues[2 * iv + 1]);
651  }
652 }
int32_t *__restrict__ iv
const std::vector< double > & getCoreIntervals() const
const std::vector< double > & getTailIntervals() const
EMECALShowerParametrization *const theParam
Definition: EMShower.h:80
void addInterval(double, double)

◆ setPreshower()

void EMShower::setPreshower ( PreshowerHitMaker *const  myPresh)

set the preshower address

Definition at line 654 of file EMShower.cc.

References hasPreshower, and thePreshower.

Referenced by CalorimetryManager::EMShowerSimulation().

654  {
655  if (myPresh != nullptr) {
656  thePreshower = myPresh;
657  hasPreshower = true;
658  }
659 }
PreshowerHitMaker * thePreshower
Definition: EMShower.h:126
bool hasPreshower
Definition: EMShower.h:132

Member Data Documentation

◆ a

std::vector<double> EMShower::a
private

Definition at line 98 of file EMShower.h.

Referenced by compute(), deposit(), EMShower(), gam(), and prepareSteps().

◆ aSpot

std::vector<double> EMShower::aSpot
private

Definition at line 102 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ b

std::vector<double> EMShower::b
private

Definition at line 99 of file EMShower.h.

Referenced by compute(), deposit(), EMShower(), and prepareSteps().

◆ bFixedLength_

bool EMShower::bFixedLength_
private

Definition at line 144 of file EMShower.h.

Referenced by prepareSteps().

◆ bSpot

std::vector<double> EMShower::bSpot
private

Definition at line 103 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ depositedEnergy

std::vector<std::vector<double> > EMShower::depositedEnergy
private

Definition at line 109 of file EMShower.h.

Referenced by compute(), and prepareSteps().

◆ E

std::vector<double> EMShower::E
private

Definition at line 95 of file EMShower.h.

Referenced by compute(), EMShower(), and prepareSteps().

◆ Etot

std::vector<double> EMShower::Etot
private

Definition at line 94 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ globalMaximum

double EMShower::globalMaximum
private

Definition at line 113 of file EMShower.h.

Referenced by EMShower(), and getMaximumOfShower().

◆ hasPreshower

bool EMShower::hasPreshower
private

Definition at line 132 of file EMShower.h.

Referenced by compute(), EMShower(), and setPreshower().

◆ innerDepth

double EMShower::innerDepth
private

Definition at line 111 of file EMShower.h.

Referenced by prepareSteps().

◆ maximumOfShower

std::vector<double> EMShower::maximumOfShower
private

Definition at line 108 of file EMShower.h.

Referenced by EMShower().

◆ meanDepth

std::vector<double> EMShower::meanDepth
private

Definition at line 110 of file EMShower.h.

Referenced by compute(), EMShower(), and prepareSteps().

◆ myGammaGenerator

GammaFunctionGenerator* EMShower::myGammaGenerator
private

Definition at line 142 of file EMShower.h.

Referenced by compute().

◆ myIncompleteGamma

Genfun::IncompleteGamma EMShower::myIncompleteGamma
private

Definition at line 136 of file EMShower.h.

Referenced by deposit().

◆ nPart

unsigned int EMShower::nPart
private

Definition at line 90 of file EMShower.h.

Referenced by compute(), EMShower(), and prepareSteps().

◆ nSteps

unsigned EMShower::nSteps
private

Definition at line 119 of file EMShower.h.

Referenced by compute(), and prepareSteps().

◆ outerDepth

double EMShower::outerDepth
private

Definition at line 111 of file EMShower.h.

Referenced by prepareSteps().

◆ photos

std::vector<double> EMShower::photos
private

Definition at line 96 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ random

const RandomEngineAndDistribution* EMShower::random
private

Definition at line 139 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ steps

Steps EMShower::steps
private

Definition at line 118 of file EMShower.h.

Referenced by compute(), and prepareSteps().

◆ stepsCalculated

bool EMShower::stepsCalculated
private

Definition at line 120 of file EMShower.h.

Referenced by compute(), EMShower(), and prepareSteps().

◆ T

std::vector<double> EMShower::T
private

Definition at line 97 of file EMShower.h.

◆ theECAL

const ECALProperties* EMShower::theECAL
private

Definition at line 83 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ theGrid

EcalHitMaker* EMShower::theGrid
private

Definition at line 123 of file EMShower.h.

Referenced by compute(), prepareSteps(), and setGrid().

◆ theHCAL

const HCALProperties* EMShower::theHCAL
private

Definition at line 84 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ theHcalHitMaker

HcalHitMaker* EMShower::theHcalHitMaker
private

Definition at line 129 of file EMShower.h.

Referenced by compute(), and setHcal().

◆ theLayer1

const PreshowerLayer1Properties* EMShower::theLayer1
private

Definition at line 85 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ theLayer2

const PreshowerLayer2Properties* EMShower::theLayer2
private

Definition at line 86 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ theNumberOfSpots

std::vector<double> EMShower::theNumberOfSpots
private

Definition at line 93 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ theParam

EMECALShowerParametrization* const EMShower::theParam
private

Definition at line 80 of file EMShower.h.

Referenced by compute(), EMShower(), and setIntervals().

◆ thePart

std::vector<const RawParticle*>* const EMShower::thePart
private

Definition at line 89 of file EMShower.h.

Referenced by EMShower().

◆ thePreshower

PreshowerHitMaker* EMShower::thePreshower
private

Definition at line 126 of file EMShower.h.

Referenced by compute(), and setPreshower().

◆ Ti

std::vector<double> EMShower::Ti
private

Definition at line 100 of file EMShower.h.

Referenced by compute(), and EMShower().

◆ totalEnergy

double EMShower::totalEnergy
private

Definition at line 115 of file EMShower.h.

Referenced by EMShower().

◆ TSpot

std::vector<double> EMShower::TSpot
private

Definition at line 101 of file EMShower.h.

Referenced by EMShower().