CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
GflashHadronShowerProfile.cc
Go to the documentation of this file.
2 
6 
7 #include <CLHEP/GenericFunctions/IncompleteGamma.hh>
8 #include <CLHEP/GenericFunctions/LogGamma.hh>
9 #include <CLHEP/Units/PhysicalConstants.h>
10 #include <CLHEP/Units/SystemOfUnits.h>
11 #include <CLHEP/Random/Randomize.h>
12 #include <CLHEP/Random/RandGaussQ.h>
13 #include <CLHEP/Random/RandPoissonQ.h>
14 
15 #include <math.h>
16 
18 {
19  theBField = parSet.getParameter<double>("bField");
20  theGflashHcalOuter = parSet.getParameter<bool>("GflashHcalOuter");
21 
22  theShowino = new GflashShowino();
24 }
25 
27 {
28  if(theShowino) delete theShowino;
29 }
30 
31 void GflashHadronShowerProfile::initialize(int showerType, double energy, double globalTime,double charge,
32  Gflash3Vector &position,Gflash3Vector &momentum) {
33 
34  //initialize GflashShowino for this track
35  theShowino->initialize(showerType, energy, globalTime, charge,
36  position, momentum, theBField);
37 
38 }
39 
41 {
42  // The skeleton of this method is based on the fortran code gfshow.F originally written
43  // by S. Peters and G. Grindhammer (also see NIM A290 (1990) 469-488), but longitudinal
44  // parameterizations of hadron showers are significantly modified for the CMS calorimeter
45 
46  // unit convention: energy in [GeV] and length in [cm]
47  // intrinsic properties of hadronic showers (lateral shower profile)
48 
49  // The step size of showino along the helix trajectory in cm unit
50  double showerDepthR50 = 0.0;
51  bool firstHcalHit = true;
52 
53  //initial valuses that will be changed as the shower developes
54  double stepLengthLeft = theShowino->getStepLengthToOut();
55 
56  double deltaStep = 0.0;
57  double showerDepth = 0.0;
59 
60  theGflashHitList.clear();
61  GflashHit aHit;
62 
63  while(stepLengthLeft > 0.0) {
64 
65  // update shower depth and stepLengthLeft
66  if ( stepLengthLeft < Gflash::divisionStep ) {
67  deltaStep = stepLengthLeft;
68  stepLengthLeft = 0.0;
69  }
70  else {
71  deltaStep = Gflash::divisionStep;
72  stepLengthLeft -= deltaStep;
73  }
74 
75  showerDepth += deltaStep;
76  showerDepthR50 += deltaStep;
77 
78  //update GflashShowino
79  theShowino->updateShowino(deltaStep);
80 
81  //evaluate energy in this deltaStep along the longitudinal shower profile
82  double heightProfile = 0.;
83  double deltaEnergy = 0.;
84 
86 
87  //skip if Showino is outside envelopes
88  if(whichCalor == Gflash::kNULL ) continue;
89 
90  heightProfile = longitudinalProfile();
91 
92  //skip if the delta energy for this step will be very small
93  if(heightProfile < 1.00e-08 ) continue;
94 
95  //get energy deposition for this step
96  deltaEnergy = heightProfile*Gflash::divisionStep*energyScale[whichCalor];
97  theShowino->addEnergyDeposited(deltaEnergy);
98 
99  //apply sampling fluctuation if showino is inside the sampling calorimeter
100  double hadronicFraction = 1.0;
101  double fluctuatedEnergy = deltaEnergy;
102 
103  int nSpotsInStep = std::max(1,static_cast<int>(getNumberOfSpots(whichCalor)*(deltaEnergy/energyScale[whichCalor]) ));
104  double sampleSpotEnergy = hadronicFraction*fluctuatedEnergy/nSpotsInStep;
105 
106  // Lateral shape and fluctuations
107 
108  if((whichCalor==Gflash::kHB || whichCalor==Gflash::kHE) && firstHcalHit) {
109  firstHcalHit = false;
110  //reset the showerDepth used in the lateral parameterization inside Hcal
111  showerDepthR50 = Gflash::divisionStep;
112  }
113 
114  //evaluate the fluctuated median of the lateral distribution, R50
115  double R50 = medianLateralArm(showerDepthR50,whichCalor);
116 
117  double hitEnergy = sampleSpotEnergy*CLHEP::GeV;
118  double hitTime = theShowino->getGlobalTime()*CLHEP::nanosecond;
119 
121 
122  for (int ispot = 0 ; ispot < nSpotsInStep ; ispot++) {
123 
124  // Compute global position of generated spots with taking into account magnetic field
125  // Divide deltaStep into nSpotsInStep and give a spot a global position
126  double incrementPath = theShowino->getPathLength()
127  + (deltaStep/nSpotsInStep)*(ispot+0.5 - 0.5*nSpotsInStep);
128 
129  // trajectoryPoint give a spot an imaginary point along the shower development
130  GflashTrajectoryPoint trajectoryPoint;
131  theShowino->getHelix()->getGflashTrajectoryPoint(trajectoryPoint,incrementPath);
132 
133  Gflash3Vector hitPosition = locateHitPosition(trajectoryPoint,R50);
134 
135  hitCalor = Gflash::getCalorimeterNumber(hitPosition);
136  if( hitCalor == Gflash::kNULL) continue;
137 
138  hitPosition *= CLHEP::cm;
139 
140  aHit.setTime(hitTime);
141  aHit.setEnergy(hitEnergy);
142  aHit.setPosition(hitPosition);
143  theGflashHitList.push_back(aHit);
144 
145  } // end of for spot iteration
146  } // end of while for longitudinal integration
147 
148  //HO parameterization
149 
151  fabs(theShowino->getPositionAtShower().pseudoRapidity()) < Gflash::EtaMax[Gflash::kHO] &&
153 
154  //non zero ho fraction to simulate based on geant4
155  double nonzeroProb = 0.7*fTanh(theShowino->getEnergy(),Gflash::ho_nonzero);
156  double r0 = CLHEP::HepUniformRand();
157  double leftoverE = theShowino->getEnergy() - theShowino->getEnergyDeposited();
158 
159  //@@@ nonzeroProb is not random - need further correlation for non-zero HO energy
160 
161  if( r0 < nonzeroProb && leftoverE > 0.0) {
162 
163  //starting path Length and stepLengthLeft
165  stepLengthLeft = theShowino->getHelix()->getPathLengthAtRhoEquals(Gflash::Rmax[Gflash::kHO]+10) - pathLength;
166  showerDepth = pathLength - theShowino->getPathLengthAtShower();
167 
168  theShowino->setPathLength(pathLength);
169 
172 
173  while(stepLengthLeft > 0.0) {
174 
175  // update shower depth and stepLengthLeft
176  if ( stepLengthLeft < Gflash::divisionStep ) {
177  deltaStep = stepLengthLeft;
178  stepLengthLeft = 0.0;
179  }
180  else {
181  deltaStep = Gflash::divisionStep;
182  stepLengthLeft -= deltaStep;
183  }
184 
185  showerDepth += deltaStep;
186 
187  //update GflashShowino
188  theShowino->updateShowino(deltaStep);
189 
190  //evaluate energy in this deltaStep along the longitudinal shower profile
191  double heightProfile = 0.;
192  double deltaEnergy = 0.;
193 
194  double hoScale = leftoverE*(pathLengthx-pathLengthy)/(pathLengthx- theShowino->getPathLengthAtShower());
195  double refDepth = theShowino->getPathLength()
197 
198  if( refDepth > 0) {
199  heightProfile = hoProfile(theShowino->getPathLength(),refDepth);
200  deltaEnergy = heightProfile*Gflash::divisionStep*hoScale;
201  }
202 
203  int nSpotsInStep = std::max(50,static_cast<int>((160.+40* CLHEP::RandGaussQ::shoot())*std::log(theShowino->getEnergy())+50.));
204 
205  double hoFraction = 1.00;
206  double poissonProb = CLHEP::RandPoissonQ::shoot(1.0);
207 
208  double fluctuatedEnergy = deltaEnergy*poissonProb;
209  double sampleSpotEnergy = hoFraction*fluctuatedEnergy/nSpotsInStep;
210 
211  // Lateral shape and fluctuations
212 
213  //evaluate the fluctuated median of the lateral distribution, R50
214  double R50 = medianLateralArm(showerDepth,Gflash::kHB);
215 
216  double hitEnergy = sampleSpotEnergy*CLHEP::GeV;
217  double hitTime = theShowino->getGlobalTime()*CLHEP::nanosecond;
218 
219  for (int ispot = 0 ; ispot < nSpotsInStep ; ispot++) {
220 
221  double incrementPath = theShowino->getPathLength()
222  + (deltaStep/nSpotsInStep)*(ispot+0.5 - 0.5*nSpotsInStep);
223 
224  // trajectoryPoint give a spot an imaginary point along the shower development
225  GflashTrajectoryPoint trajectoryPoint;
226  theShowino->getHelix()->getGflashTrajectoryPoint(trajectoryPoint,incrementPath);
227 
228  Gflash3Vector hitPosition = locateHitPosition(trajectoryPoint,R50);
229  hitPosition *= CLHEP::cm;
230 
231  if(std::fabs(hitPosition.getZ()/CLHEP::cm) > Gflash::Zmax[Gflash::kHO] ) continue;
232 
233  aHit.setTime(hitTime);
234  aHit.setEnergy(hitEnergy);
235  aHit.setPosition(hitPosition);
236  theGflashHitList.push_back(aHit);
237 
238  } // end of for HO spot iteration
239  } // end of while for HO longitudinal integration
240  }
241  }
242 
243  // delete theGflashNavigator;
244 
245 }
246 
248 {
249  edm::LogInfo("SimGeneralGFlash") << "GflashHadronShowerProfile::loadParameters() "
250  << "should be implimented for each particle type";
251 }
252 
254 {
255  double lateralArm = 0.0;
256  if(kCalor != Gflash::kNULL) {
257 
258  double showerDepthR50X = std::min(showerDepthR50/22.4, Gflash::maxShowerDepthforR50);
259  double R50 = lateralPar[kCalor][0] + std::max(0.0,lateralPar[kCalor][1]) * showerDepthR50X;
260  double varinanceR50 = std::pow((lateralPar[kCalor][2] + lateralPar[kCalor][3] * showerDepthR50X) * R50, 2);
261 
262  // Simulation of lognormal distribution
263 
264  if(R50>0) {
265  double sigmaSq = std::log(varinanceR50/(R50*R50)+1.0);
266  double sigmaR50 = std::sqrt(sigmaSq);
267  double meanR50 = std::log(R50) - (sigmaSq/2.);
268 
269  lateralArm = std::exp(meanR50 + sigmaR50* CLHEP::RandGaussQ::shoot());
270  }
271  }
272  return lateralArm;
273 }
274 
276 {
277  // Smearing in r according to f(r)= 2.*r*R50**2/(r**2+R50**2)**2
278  double rnunif = CLHEP::HepUniformRand();
279  double rxPDF = std::sqrt(rnunif/(1.-rnunif));
280  double rShower = lateralArm*rxPDF;
281 
282  //rShower within maxLateralArmforR50
283  rShower = std::min(Gflash::maxLateralArmforR50,rShower);
284 
285  // Uniform smearing in phi
286  double azimuthalAngle = CLHEP::twopi*CLHEP::HepUniformRand();
287 
288  // actual spot position by adding a radial vector to a trajectoryPoint
290  rShower*std::cos(azimuthalAngle)*point.getOrthogonalUnitVector() +
291  rShower*std::sin(azimuthalAngle)*point.getCrossUnitVector();
292 
293  //@@@debugging histograms
294  if(theHisto->getStoreFlag()) {
295  theHisto->rshower->Fill(rShower);
296  theHisto->lateralx->Fill(rShower*std::cos(azimuthalAngle));
297  theHisto->lateraly->Fill(rShower*std::sin(azimuthalAngle));
298  }
299  return position;
300 }
301 
302 //double GflashHadronShowerProfile::longitudinalProfile(double showerDepth, double pathLength) {
304 
305  double heightProfile = 0.0;
306 
308  int showerType = theShowino->getShowerType();
309  double showerDepth = theShowino->getDepth();
310  double transDepth = theShowino->getStepLengthToHcal();
311 
312  // Energy in a delta step (dz) = (energy to deposite)*[Gamma(z+dz)-Gamma(z)]*dz
313  // where the incomplete Gamma function gives an intergrate probability of the longitudinal
314  // shower up to the shower depth (z).
315  // Instead, we use approximated energy; energy in dz = (energy to deposite)*gamma(z)*dz
316  // where gamma is the Gamma-distributed probability function
317 
319 
320  if(showerType == 0 || showerType == 1 || showerType == 4 || showerType == 5 ) {
321  if(whichCalor == Gflash::kESPM || whichCalor == Gflash::kENCA ) {
322  heightProfile = twoGammaProfile(longEcal,showerDepth,whichCalor);
323  }
324  else if(whichCalor == Gflash::kHB || whichCalor == Gflash::kHE) {
325  heightProfile = twoGammaProfile(longHcal,showerDepth-transDepth,whichCalor);
326  }
327  else heightProfile = 0.;
328  }
329  else if (showerType == 2 || showerType == 6 ) {
330  //two gammas between crystal and Hcal
331  if((showerDepth - transDepth) > 0.0) {
332  heightProfile = twoGammaProfile(longHcal,showerDepth-transDepth,Gflash::kHB);
333  }
334  else heightProfile = 0.;
335  }
336  else if (showerType == 3 || showerType == 7 ) {
337  //two gammas inside Hcal
338  heightProfile = twoGammaProfile(longHcal,showerDepth,Gflash::kHB);
339  }
340 
341  return heightProfile;
342 }
343 
344 double GflashHadronShowerProfile::hoProfile(double pathLength, double refDepth) {
345 
346  double heightProfile = 0;
347 
348  GflashTrajectoryPoint tempPoint;
349  theShowino->getHelix()->getGflashTrajectoryPoint(tempPoint,pathLength);
350 
351  double dint = 1.4*Gflash::intLength[Gflash::kHO]*std::sin(tempPoint.getPosition().getTheta());
352  heightProfile = std::exp(-1.0*refDepth/dint);
353 
354  return heightProfile;
355 }
356 
357 void GflashHadronShowerProfile::getFluctuationVector(double *lowTriangle, double *correlationVector) {
358 
359  const int dim = Gflash::NPar;
360 
361  double **xr = new double *[dim];
362  double **xrho = new double *[dim];
363 
364  for(int j=0;j<dim;j++) {
365  xr[j] = new double [dim];
366  xrho[j] = new double [dim];
367  }
368 
369  for(int i = 0; i < dim; i++) {
370  for(int j = 0; j < i+1 ; j++) {
371  if(j==i) xrho[i][j] = 1.0;
372  else {
373  xrho[i][j] = lowTriangle[i*(i-1)/2 + j];
374  xrho[j][i] = xrho[i][j];
375  }
376  }
377  }
378 
379  doCholeskyReduction(xrho,xr,dim);
380 
381  for(int i = 0 ; i < dim ; i++) {
382  for (int j = 0 ; j < i+1 ; j++){
383  correlationVector[i*(i+1)/2 + j] = xr[i][j];
384  }
385  }
386 
387  for(int j=0;j<dim;j++) delete [] xr[j];
388  delete [] xr;
389  for(int j=0;j<dim;j++) delete [] xrho[j];
390  delete [] xrho;
391 }
392 
393 void GflashHadronShowerProfile::doCholeskyReduction(double **vv, double **cc, const int ndim) {
394 
395  double sumCjkSquare;
396  double vjjLess;
397  double sumCikjk;
398 
399  cc[0][0] = std::sqrt(vv[0][0]);
400 
401  for(int j=1 ; j < ndim ; j++) {
402  cc[j][0] = vv[j][0]/cc[0][0];
403  }
404 
405  for(int j=1 ; j < ndim ; j++) {
406 
407  sumCjkSquare = 0.0;
408  for (int k=0 ; k < j ; k++) sumCjkSquare += cc[j][k]*cc[j][k];
409 
410  vjjLess = vv[j][j] - sumCjkSquare;
411 
412  //check for the case that vjjLess is negative
413  cc[j][j] = std::sqrt(std::fabs(vjjLess));
414 
415  for (int i=j+1 ; i < ndim ; i++) {
416  sumCikjk = 0.;
417  for(int k=0 ; k < j ; k++) sumCikjk += cc[i][k]*cc[j][k];
418  cc[i][j] = (vv[i][j] - sumCikjk)/cc[j][j];
419  }
420  }
421 }
422 
424  //generator number of spots: energy dependent Gamma distribution of Nspots based on Geant4
425  //replacing old parameterization of H1,
426  //int numberOfSpots = std::max( 50, static_cast<int>(80.*std::log(einc)+50.));
427 
428  double einc = theShowino->getEnergy();
429  int showerType = theShowino->getShowerType();
430 
431  int numberOfSpots = 0;
432  double nmean = 0.0;
433  double nsigma = 0.0;
434 
435  if(showerType == 0 || showerType == 1 || showerType == 4 || showerType == 5 ) {
436  if(kCalor == Gflash::kESPM || kCalor == Gflash::kENCA) {
437  nmean = 10000 + 5000*log(einc);
438  nsigma = 1000;
439  }
440  if(kCalor == Gflash::kHB || kCalor == Gflash::kHE) {
441  nmean = 5000 + 2500*log(einc);
442  nsigma = 500;
443  }
444  }
445  else if (showerType == 2 || showerType == 3 || showerType == 6 || showerType == 7 ) {
446  if(kCalor == Gflash::kHB || kCalor == Gflash::kHE) {
447  nmean = 5000 + 2500*log(einc);
448  nsigma = 500;
449  }
450  else {
451  nmean = 10000;
452  nsigma = 1000;
453  }
454  }
455  //@@@need correlation and individual fluctuation on alphaNspots and betaNspots here:
456  //evaluating covariance should be straight forward since the distribution is 'one' Gamma
457 
458  numberOfSpots = std::max(500,static_cast<int> (nmean+nsigma* CLHEP::RandGaussQ::shoot()));
459 
460  //until we optimize the reduction scale in the number of Nspots
461 
462  if( kCalor == Gflash::kESPM || kCalor == Gflash::kENCA) {
463  numberOfSpots = static_cast<int>(numberOfSpots/100);
464  }
465  else {
466  numberOfSpots = static_cast<int>(numberOfSpots/3.0);
467  }
468 
469  return numberOfSpots;
470 }
471 
472 double GflashHadronShowerProfile::fTanh(double einc, const double *par) {
473  double func = 0.0;
474  if(einc>0.0) func = par[0]+par[1]*std::tanh(par[2]*(std::log(einc)-par[3]));
475  return func;
476 }
477 
478 double GflashHadronShowerProfile::fLnE1(double einc, const double *par) {
479  double func = 0.0;
480  if(einc>0.0) func = par[0]+par[1]*std::log(einc);
481  return func;
482 }
483 
484 double GflashHadronShowerProfile::depthScale(double ssp, double ssp0, double length) {
485  double func = 0.0;
486  if(length>0.0) func = std::pow((ssp-ssp0)/length,2.0);
487  return func;
488 }
489 
490 double GflashHadronShowerProfile::gammaProfile(double alpha, double beta, double showerDepth, double lengthUnit) {
491  double gamma = 0.0;
492  // if(alpha > 0 && beta > 0 && lengthUnit > 0) {
493  if(showerDepth>0.0) {
494  Genfun::LogGamma lgam;
495  double x = showerDepth*(beta/lengthUnit);
496  gamma = (beta/lengthUnit)*std::pow(x,alpha-1.0)*std::exp(-x)/std::exp(lgam(alpha));
497  }
498  return gamma;
499 }
500 
501 double GflashHadronShowerProfile::twoGammaProfile(double *longPar, double depth, Gflash::CalorimeterNumber kIndex) {
502  double twoGamma = 0.0;
503 
504  longPar[0] = std::min(1.0,longPar[0]);
505  if(longPar[3] > 4.0 || longPar[4] > 4.0) {
506  double rfactor = 2.0/std::max(longPar[3],longPar[4]);
507  longPar[3] = rfactor*(longPar[3]+1.0);
508  longPar[4] *= rfactor;
509  }
510 
511  twoGamma = longPar[0]*gammaProfile(exp(longPar[1]),exp(longPar[2]),depth,Gflash::radLength[kIndex])
512  +(1-longPar[0])*gammaProfile(exp(longPar[3]),exp(longPar[4]),depth,Gflash::intLength[kIndex]);
513  return twoGamma;
514 }
Gflash3Vector locateHitPosition(GflashTrajectoryPoint &point, double lateralArm)
const double beta
double fTanh(double einc, const double *par)
T getParameter(std::string const &) const
static GflashHistogram * instance()
int i
Definition: DBlmapReader.cc:9
void setEnergy(const double energy)
Definition: GflashHit.h:19
float alpha
Definition: AMPTWrapper.h:95
const double divisionStep
double lateralPar[Gflash::kNumberCalorimeter][Gflash::Nrpar]
const double Zmax[kNumberCalorimeter]
Gflash3Vector getCrossUnitVector()
double twoGammaProfile(double *par, double depth, Gflash::CalorimeterNumber kIndex)
Gflash3Vector & getPosition()
Definition: GflashShowino.h:34
GflashTrajectory * getHelix()
Definition: GflashShowino.h:30
double medianLateralArm(double depth, Gflash::CalorimeterNumber kCalor)
double getEnergy()
Definition: GflashShowino.h:24
int getShowerType()
Definition: GflashShowino.h:23
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
double getPathLength()
Definition: GflashShowino.h:33
void setPosition(const Gflash3Vector &pos)
Definition: GflashHit.h:20
#define min(a, b)
Definition: mlp_lapack.h:161
Exp< T >::type exp(const T &t)
Definition: Exp.h:22
const double EtaMax[kNumberCalorimeter]
const double ho_nonzero[4]
double charge(const std::vector< uint8_t > &Ampls)
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
GflashHadronShowerProfile(edm::ParameterSet parSet)
void doCholeskyReduction(double **cc, double **vv, const int ndim)
void addEnergyDeposited(double energy)
Definition: GflashShowino.h:41
double getStepLengthToHcal()
Definition: GflashShowino.h:28
void setTime(const double time)
Definition: GflashHit.h:18
const T & max(const T &a, const T &b)
double getPathLengthAtShower()
Definition: GflashShowino.h:26
double fLnE1(double einc, const double *par)
T sqrt(T t)
Definition: SSEVec.h:28
double getEnergyDeposited()
Definition: GflashShowino.h:35
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
const double MinEnergyCutOffForHO
int j
Definition: DBlmapReader.cc:9
void setPathLength(double pathLength)
Definition: GflashShowino.h:39
double gammaProfile(double alpha, double beta, double depth, double lengthUnit)
Gflash3Vector & getPositionAtShower()
Definition: GflashShowino.h:27
const int NPar
Gflash3Vector getOrthogonalUnitVector()
int k[5][pyjets_maxn]
const double intLength[kNumberCalorimeter]
void getGflashTrajectoryPoint(GflashTrajectoryPoint &point, double s) const
std::vector< GflashHit > theGflashHitList
const double maxShowerDepthforR50
double getDepth()
Definition: GflashShowino.h:36
const double radLength[kNumberCalorimeter]
Log< T >::type log(const T &t)
Definition: Log.h:22
CLHEP::Hep3Vector Gflash3Vector
Definition: Gflash3Vector.h:6
double getGlobalTime()
Definition: GflashShowino.h:32
CalorimeterNumber getCalorimeterNumber(const Gflash3Vector position)
Gflash3Vector & getPosition()
const double maxLateralArmforR50
void getFluctuationVector(double *lowTriangle, double *correlationVector)
double depthScale(double ssp, double ssp0, double length)
const double Rmax[kNumberCalorimeter]
int getNumberOfSpots(Gflash::CalorimeterNumber kCalor)
double hoProfile(double pathLength, double refDepth)
double getStepLengthToOut()
Definition: GflashShowino.h:29
const double Rmin[kNumberCalorimeter]
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
void initialize(int showerType, double energy, double globalTime, double charge, Gflash3Vector &position, Gflash3Vector &momentum)
const double par[8 *NPar][4]
double getPathLengthAtRhoEquals(double rho) const
void initialize(int showerType, double energy, double globalTime, double charge, Gflash3Vector &position, Gflash3Vector &momentum, double magneticField)
double energyScale[Gflash::kNumberCalorimeter]
void updateShowino(double deltaStep)