CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Private Attributes
HFGflash Class Reference

#include <HFGflash.h>

Classes

struct  Hit
 

Public Member Functions

std::vector< HitgfParameterization (const G4Step *aStep, bool onlyLong=false)
 
 HFGflash (edm::ParameterSet const &p)
 
virtual ~HFGflash ()
 

Private Attributes

TH2F * em_2d
 
TH2F * em_2d_sd
 
TH1F * em_incE
 
TH1F * em_lateral
 
TH1F * em_lateral_sd
 
TH1F * em_long
 
TH1F * em_long_sd
 
TH1F * em_nSpots_sd
 
TH2F * em_ratio
 
TH2F * em_ratio_selected
 
TH1F * em_ssp_rho
 
TH1F * em_ssp_z
 
TH2F * em_ze
 
TH1F * em_ze_ratio
 
G4double energyScale [Gflash::kNumberCalorimeter]
 
G4double energyToDeposit
 
Gflash::CalorimeterNumber jCalorimeter
 
G4double lateralPar [4]
 
G4double longEcal [Gflash::NPar]
 
G4double longHcal [Gflash::NPar]
 
G4int showerType
 
G4double theBField
 
bool theFillHisto
 
G4Navigator * theGflashNavigator
 
G4Step * theGflashStep
 
G4TouchableHandle theGflashTouchableHandle
 
GflashTrajectorytheHelix
 
bool theWatcherOn
 

Detailed Description

Definition at line 29 of file HFGflash.h.

Constructor & Destructor Documentation

HFGflash::HFGflash ( edm::ParameterSet const &  p)

Definition at line 37 of file HFGflash.cc.

References em_2d, em_2d_sd, em_incE, em_lateral, em_lateral_sd, em_long, em_long_sd, em_nSpots_sd, em_ratio, em_ratio_selected, em_ssp_rho, em_ssp_z, em_ze, em_ze_ratio, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), edm::Service< T >::isAvailable(), jCalorimeter, Gflash::kHF, TFileDirectory::make(), TFileService::mkdir(), compare::tfile, theBField, theFillHisto, theGflashNavigator, theGflashStep, theGflashTouchableHandle, theHelix, and theWatcherOn.

37  {
38  edm::ParameterSet m_HF = p.getParameter<edm::ParameterSet>("HFGflash");
39  theBField = m_HF.getUntrackedParameter<double>("BField", 3.8);
40  theWatcherOn = m_HF.getUntrackedParameter<bool>("WatcherOn", true);
41  theFillHisto = m_HF.getUntrackedParameter<bool>("FillHisto", true);
42  edm::LogVerbatim("HFShower") << "HFGFlash:: Set B-Field to " << theBField << ", WatcherOn to " << theWatcherOn
43  << " and FillHisto to " << theFillHisto;
44 
46  theGflashStep = new G4Step();
47  theGflashNavigator = new G4Navigator();
48  // theGflashNavigator = 0;
49  theGflashTouchableHandle = new G4TouchableHistory();
50 
51 #ifdef EDM_ML_DEBUG
52  if (theFillHisto) {
54  if (tfile.isAvailable()) {
55  TFileDirectory showerDir = tfile->mkdir("GflashEMShowerProfile");
56 
57  em_incE = showerDir.make<TH1F>("em_incE", "Incoming energy (GeV)", 500, 0, 500.);
58  em_ssp_rho =
59  showerDir.make<TH1F>("em_ssp_rho", "Shower starting position;#rho (cm);Number of Events", 100, 100.0, 200.0);
60  em_ssp_z =
61  showerDir.make<TH1F>("em_ssp_z", "Shower starting position;z (cm);Number of Events", 2000, 0.0, 2000.0);
62  em_long =
63  showerDir.make<TH1F>("em_long", "Longitudinal Profile;Radiation Length;Number of Spots", 800, 800.0, 1600.0);
64  em_lateral = showerDir.make<TH1F>("em_lateral", "Lateral Profile;Radiation Length;Moliere Radius", 100, 0.0, 5.0);
65  em_2d = showerDir.make<TH2F>("em_2d",
66  "Lateral Profile vs. Shower Depth;Radiation Length;Moliere Radius",
67  800,
68  800.0,
69  1600.0,
70  100,
71  0.0,
72  5.0);
73  em_long_sd = showerDir.make<TH1F>("em_long_sd",
74  "Longitudinal Profile in Sensitive Detector;Radiation Length;Number of Spots",
75  800,
76  800.0,
77  1600.0);
79  showerDir.make<TH1F>("em_lateral_sd",
80  "Lateral Profile vs. Shower Depth in Sensitive Detector;Radiation Length;Moliere Radius",
81  100,
82  0.0,
83  5.0);
84  em_2d_sd =
85  showerDir.make<TH2F>("em_2d_sd",
86  "Lateral Profile vs. Shower Depth in Sensitive Detector;Radiation Length;Moliere Radius",
87  800,
88  800.0,
89  1600.0,
90  100,
91  0.0,
92  5.0);
93  em_ze = showerDir.make<TH2F>(
94  "em_ze", "Profile vs. Energy;Radiation Length;Moliere Radius", 800, 800.0, 1600.0, 1000, 0.0, 1.0);
95  em_ratio = showerDir.make<TH2F>(
96  "em_ratio", "Profile vs. Energy;Radiation Length;Moliere Radius", 800, 800.0, 1600.0, 1000, 0.0, 100.0);
97  em_ratio_selected = showerDir.make<TH2F>("em_ratio_selected",
98  "Profile vs. Energy;Radiation Length;Moliere Radius",
99  800,
100  800.0,
101  1600.0,
102  1000,
103  0.0,
104  100.0);
105  em_nSpots_sd =
106  showerDir.make<TH1F>("em_nSpots_sd",
107  "Number of Gflash Spots in Sensitive Detector;Number of Spots;Number of Events",
108  100,
109  0.0,
110  100);
111  em_ze_ratio = showerDir.make<TH1F>("em_ze_ratio", "Ratio of Energy and Z Position", 1000, 0.0, 0.001);
112  } else {
113  theFillHisto = false;
114  edm::LogVerbatim("HFShower") << "HFGFlash::No file is available for saving"
115  << " histos so the flag is set to false";
116  }
117  }
118 #endif
120 }
G4Step * theGflashStep
Definition: HFGflash.h:47
T getUntrackedParameter(std::string const &, T const &) const
TH2F * em_ze
Definition: HFGflash.h:66
G4Navigator * theGflashNavigator
Definition: HFGflash.h:48
TH1F * em_ssp_z
Definition: HFGflash.h:64
Gflash::CalorimeterNumber jCalorimeter
Definition: HFGflash.h:51
G4double theBField
Definition: HFGflash.h:55
bool theFillHisto
Definition: HFGflash.h:54
TH2F * em_ratio_selected
Definition: HFGflash.h:66
bool isAvailable() const
Definition: Service.h:40
G4TouchableHandle theGflashTouchableHandle
Definition: HFGflash.h:49
T * make(const Args &...args) const
make new ROOT object
bool theWatcherOn
Definition: HFGflash.h:53
TH2F * em_ratio
Definition: HFGflash.h:66
TH1F * em_ze_ratio
Definition: HFGflash.h:65
TH1F * em_ssp_rho
Definition: HFGflash.h:64
TFileDirectory mkdir(const std::string &dir, const std::string &descr="")
create a new subdirectory
Definition: TFileService.h:69
TH1F * em_lateral_sd
Definition: HFGflash.h:65
TH1F * em_nSpots_sd
Definition: HFGflash.h:65
TH1F * em_lateral
Definition: HFGflash.h:64
TH1F * em_long
Definition: HFGflash.h:64
TH1F * em_incE
Definition: HFGflash.h:64
GflashTrajectory * theHelix
Definition: HFGflash.h:46
TH1F * em_long_sd
Definition: HFGflash.h:65
TH2F * em_2d
Definition: HFGflash.h:66
TH2F * em_2d_sd
Definition: HFGflash.h:66
HFGflash::~HFGflash ( )
virtual

Definition at line 122 of file HFGflash.cc.

References theGflashNavigator, theGflashStep, and theHelix.

122  {
123  delete theHelix;
124  delete theGflashStep;
125  delete theGflashNavigator;
126 }
G4Step * theGflashStep
Definition: HFGflash.h:47
G4Navigator * theGflashNavigator
Definition: HFGflash.h:48
GflashTrajectory * theHelix
Definition: HFGflash.h:46

Member Function Documentation

std::vector< HFGflash::Hit > HFGflash::gfParameterization ( const G4Step *  aStep,
bool  onlyLong = false 
)

V.Ivanchenko - not clear if it is correct

V.Ivanchenko what this means??

Definition at line 128 of file HFGflash.cc.

References funct::abs(), alpha, pfBoostedDoubleSVAK8TagInfos_cfi::beta, ALCARECOTkAlJpsiMuMu_cff::charge, funct::cos(), HFGflash::Hit::depth, MillePedeFileConverter_cfg::e, HFGflash::Hit::edep, em_2d, em_incE, em_lateral, em_long, em_nSpots_sd, em_ssp_rho, em_ssp_z, randomXiThetaGunProducer_cfi::energy, JetChargeProducer_cfi::exp, GflashTrajectoryPoint::getCrossUnitVector(), GflashTrajectory::getGflashTrajectoryPoint(), GflashTrajectoryPoint::getOrthogonalUnitVector(), GflashTrajectory::getPathLengthAtZ(), GflashTrajectoryPoint::getPosition(), GeV, GflashTrajectory::initializeTrajectory(), invgev, jCalorimeter, Gflash::kHF, cmsBatch::log, listHistos::logY, SiStripPI::max, min(), p1, p2, p3, HFGflash::Hit::position, funct::pow(), Gflash::radLength, rho, Gflash::rMoliere, funct::sin(), mathSSE::sqrt(), metsig::tau, theBField, theFillHisto, theGflashNavigator, theHelix, HFGflash::Hit::time, tmax, HiIsolationCommonParameters_cff::track, MetAnalyzer::u1, MetAnalyzer::u2, and y.

Referenced by HFShowerParam::getHits().

128  {
129  double tempZCalo = 26; // Gflash::Z[jCalorimeter]
130  double hfcriticalEnergy = 0.021; // Gflash::criticalEnergy
131 
132  std::vector<HFGflash::Hit> hit;
133  HFGflash::Hit oneHit;
134 
135  auto const preStepPoint = aStep->GetPreStepPoint();
136  auto const track = aStep->GetTrack();
137 
138  // This part of code is copied from the original GFlash Fortran code.
139  // reference : hep-ex/0001020v1
140 
141  const G4double energyCutoff = 1;
142  const G4int maxNumberOfSpots = 10000000;
143 
144  G4ThreeVector showerStartingPosition = track->GetPosition() / cm;
145  G4ThreeVector showerMomentum = preStepPoint->GetMomentum() / GeV;
147 
148  const G4double invgev = 1.0 / CLHEP::GeV;
149  G4double energy = preStepPoint->GetTotalEnergy() * invgev; // energy left in GeV
150  G4double logEinc = std::log(energy);
151 
152  G4double y = energy / hfcriticalEnergy; // y = E/Ec, criticalEnergy is in GeV
153  G4double logY = std::log(y);
154 
155  G4double nSpots = 93.0 * std::log(tempZCalo) * energy; // total number of spot due linearization
156  if (energy < 1.6)
157  nSpots = 140.4 * std::log(tempZCalo) * std::pow(energy, 0.876);
158 
159  // // implementing magnetic field effects
160  double charge = track->GetStep()->GetPreStepPoint()->GetCharge();
161  theHelix->initializeTrajectory(showerMomentum, showerStartingPosition, charge, theBField);
162 
163  G4double pathLength0 = theHelix->getPathLengthAtZ(showerStartingPosition.getZ());
164  G4double pathLength = pathLength0; // this will grow along the shower development
165 
166  //--- 2.2 Fix intrinsic properties of em. showers.
167 
168  G4double fluctuatedTmax = std::log(logY - 0.7157);
169  G4double fluctuatedAlpha = std::log(0.7996 + (0.4581 + 1.8628 / tempZCalo) * logY);
170 
171  G4double sigmaTmax = 1.0 / (-1.4 + 1.26 * logY);
172  G4double sigmaAlpha = 1.0 / (-0.58 + 0.86 * logY);
173  G4double rho = 0.705 - 0.023 * logY;
174  G4double sqrtPL = std::sqrt((1.0 + rho) / 2.0);
175  G4double sqrtLE = std::sqrt((1.0 - rho) / 2.0);
176 
177  G4double norm1 = G4RandGauss::shoot();
178  G4double norm2 = G4RandGauss::shoot();
179  G4double tempTmax = fluctuatedTmax + sigmaTmax * (sqrtPL * norm1 + sqrtLE * norm2);
180  G4double tempAlpha = fluctuatedAlpha + sigmaAlpha * (sqrtPL * norm1 - sqrtLE * norm2);
181 
182  // tmax, alpha, beta : parameters of gamma distribution
183  G4double tmax = std::exp(tempTmax);
184  G4double alpha = std::exp(tempAlpha);
185  G4double beta = (alpha - 1.0) / tmax;
186 
187  if (!alpha)
188  return hit;
189  if (!beta)
190  return hit;
191  if (alpha < 0.00001)
192  return hit;
193  if (beta < 0.00001)
194  return hit;
195 
196  // spot fluctuations are added to tmax, alpha, beta
197  G4double averageTmax = logY - 0.858;
198  G4double averageAlpha = 0.21 + (0.492 + 2.38 / tempZCalo) * logY;
199  G4double spotTmax = averageTmax * (0.698 + .00212 * tempZCalo);
200  G4double spotAlpha = averageAlpha * (0.639 + .00334 * tempZCalo);
201  G4double spotBeta = (spotAlpha - 1.0) / spotTmax;
202 
203  if (!spotAlpha)
204  return hit;
205  if (!spotBeta)
206  return hit;
207  if (spotAlpha < 0.00001)
208  return hit;
209  if (spotBeta < 0.00001)
210  return hit;
211 
212 #ifdef EDM_ML_DEBUG
213  edm::LogVerbatim("HFShower") << "HFGflash: Incoming energy = " << energy << " Position (rho,z) = ("
214  << showerStartingPosition.rho() << ", " << showerStartingPosition.z() << ")";
215 
216  if (theFillHisto) {
217  em_incE->Fill(energy);
218  em_ssp_rho->Fill(showerStartingPosition.rho());
219  em_ssp_z->Fill(std::abs(showerStartingPosition.z()));
220  }
221 #endif
222  // parameters for lateral distribution and fluctuation
223  G4double z1 = 0.0251 + 0.00319 * logEinc;
224  G4double z2 = 0.1162 - 0.000381 * tempZCalo;
225 
226  G4double k1 = 0.659 - 0.00309 * tempZCalo;
227  G4double k2 = 0.645;
228  G4double k3 = -2.59;
229  G4double k4 = 0.3585 + 0.0421 * logEinc;
230 
231  G4double p1 = 2.623 - 0.00094 * tempZCalo;
232  G4double p2 = 0.401 + 0.00187 * tempZCalo;
233  G4double p3 = 1.313 - 0.0686 * logEinc;
234 
235  // // @@@ dwjang, intial tuning by comparing 20-150GeV TB data
236  // // the width of energy response is not yet tuned.
237  const G4double e25Scale = 1.03551;
238  z1 *= 9.76972e-01 - 3.85026e-01 * std::tanh(1.82790e+00 * std::log(energy) - 3.66237e+00);
239  p1 *= 0.96;
240 
241  G4double stepLengthLeft = 10000;
242  G4int nSpots_sd = 0; // count total number of spots in SD
243  G4double zInX0 = 0.0; // shower depth in X0 unit
244  G4double deltaZInX0 = 0.0; // segment of depth in X0 unit
245  G4double deltaZ = 0.0; // segment of depth in cm
246  G4double stepLengthLeftInX0 = 0.0; // step length left in X0 unit
247 
248  const G4double divisionStepInX0 = 0.1; //step size in X0 unit
249 
250  Genfun::IncompleteGamma gammaDist;
251 
252  G4double energyInGamma = 0.0; // energy in a specific depth(z) according to Gamma distribution
253  G4double preEnergyInGamma = 0.0; // energy calculated in a previous depth
254  G4double sigmaInGamma = 0.; // sigma of energy in a specific depth(z) according to Gamma distribution
255  G4double preSigmaInGamma = 0.0; // sigma of energy in a previous depth
256 
257  //energy segment in Gamma distribution of shower in each step
258  G4double deltaEnergy = 0.0; // energy in deltaZ
259  G4int spotCounter = 0; // keep track of number of spots generated
260 
261  //step increment along the shower direction
262  G4double deltaStep = 0.0;
263 
264  // Uniqueness of G4Step is important otherwise hits won't be created.
265  G4double timeGlobal = preStepPoint->GetGlobalTime();
266 
267  // this needs to be deleted manually at the end of this loop.
268  // theGflashNavigator = new G4Navigator();
269  theGflashNavigator->SetWorldVolume(
270  G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking()->GetWorldVolume());
271 
272  // // loop for longitudinal integration
273 
274 #ifdef EDM_ML_DEBUG
275  edm::LogVerbatim("HFShower") << "HFGflash: Energy = " << energy << " Step Length Left = " << stepLengthLeft;
276 #endif
277  while (energy > 0.0 && stepLengthLeft > 0.0) {
278  stepLengthLeftInX0 = stepLengthLeft / Gflash::radLength[jCalorimeter];
279 
280  if (stepLengthLeftInX0 < divisionStepInX0) {
281  deltaZInX0 = stepLengthLeftInX0;
282  deltaZ = deltaZInX0 * Gflash::radLength[jCalorimeter];
283  stepLengthLeft = 0.0;
284  } else {
285  deltaZInX0 = divisionStepInX0;
286  deltaZ = deltaZInX0 * Gflash::radLength[jCalorimeter];
287  stepLengthLeft -= deltaZ;
288  }
289 
290  zInX0 += deltaZInX0;
291 
292 #ifdef EDM_ML_DEBUG
293  edm::LogVerbatim("HFShower") << "HFGflash: zInX0 = " << zInX0 << " spotBeta*zInX0 = " << spotBeta * zInX0;
294 #endif
295  if ((!zInX0) || (!(spotBeta * zInX0 != 0)) || (zInX0 < 0.01) || (spotBeta * zInX0 < 0.00001) ||
296  (!(zInX0 * beta != 0)) || (zInX0 * beta < 0.00001))
297  return hit;
298 
299  G4int nSpotsInStep = 0;
300 
301 #ifdef EDM_ML_DEBUG
302  edm::LogVerbatim("HFShower") << "HFGflash: Energy - Energy Cut off = " << energy - energyCutoff;
303 #endif
304 
305  if (energy > energyCutoff) {
306  preEnergyInGamma = energyInGamma;
307  gammaDist.a().setValue(alpha); //alpha
308 
309  energyInGamma = gammaDist(beta * zInX0); //beta
310  G4double energyInDeltaZ = energyInGamma - preEnergyInGamma;
311  deltaEnergy = std::min(energy, energy * energyInDeltaZ);
312 
313  preSigmaInGamma = sigmaInGamma;
314  gammaDist.a().setValue(spotAlpha); //alpha spot
315  sigmaInGamma = gammaDist(spotBeta * zInX0); //beta spot
316  nSpotsInStep = std::max(1, int(nSpots * (sigmaInGamma - preSigmaInGamma)));
317  } else {
318  deltaEnergy = energy;
319  preSigmaInGamma = sigmaInGamma;
320  nSpotsInStep = std::max(1, int(nSpots * (1.0 - preSigmaInGamma)));
321  }
322 
323  if (deltaEnergy > energy || (energy - deltaEnergy) < energyCutoff)
324  deltaEnergy = energy;
325 
326  energy -= deltaEnergy;
327 
328  if (spotCounter + nSpotsInStep > maxNumberOfSpots) {
329  nSpotsInStep = maxNumberOfSpots - spotCounter;
330  if (nSpotsInStep < 1)
331  nSpotsInStep = 1;
332  }
333 
334  // // It begins with 0.5 of deltaZ and then icreases by 1 deltaZ
335  deltaStep += 0.5 * deltaZ;
336  pathLength += deltaStep;
337  deltaStep = 0.5 * deltaZ;
338 
339  //lateral shape and fluctuations for homogenous calo.
340  G4double tScale = tmax * alpha / (alpha - 1.0) * (1.0 - std::exp(-fluctuatedAlpha));
341  G4double tau = std::min(10.0, (zInX0 - 0.5 * deltaZInX0) / tScale);
342  G4double rCore = z1 + z2 * tau;
343  G4double rTail = k1 * (std::exp(k3 * (tau - k2)) + std::exp(k4 * (tau - k2))); // @@ check RT3 sign
344  G4double p23 = (p2 - tau) / p3;
345  G4double probabilityWeight = p1 * std::exp(p23 - std::exp(p23));
346 
347  // Deposition of spots according to lateral distr.
348  // Apply absolute energy scale
349  // Convert into MeV unit
350  G4double emSpotEnergy = deltaEnergy / (nSpotsInStep * e25Scale * GeV);
351 
352 #ifdef EDM_ML_DEBUG
353  edm::LogVerbatim("HFShower") << "HFGflash: nSpotsInStep = " << nSpotsInStep;
354 #endif
355 
356  for (G4int ispot = 0; ispot < nSpotsInStep; ispot++) {
357  spotCounter++;
358  G4double u1 = G4UniformRand();
359  G4double u2 = G4UniformRand();
360  G4double rInRM = 0.0;
361 
362  if (u1 < probabilityWeight) {
363  rInRM = rCore * std::sqrt(u2 / (1.0 - u2));
364  } else {
365  rInRM = rTail * std::sqrt(u2 / (1.0 - u2));
366  }
367 
368  G4double rShower = rInRM * Gflash::rMoliere[jCalorimeter];
369 
370  //Uniform & random rotation of spot along the azimuthal angle
371  G4double azimuthalAngle = twopi * G4UniformRand();
372 
373  //Compute global position of generated spots with taking into account magnetic field
374  //Divide deltaZ into nSpotsInStep and give a spot a global position
375  G4double incrementPath = (deltaZ / nSpotsInStep) * (ispot + 0.5 - 0.5 * nSpotsInStep);
376 
377  // trajectoryPoint give a spot an imaginary point along the shower development
378  GflashTrajectoryPoint trajectoryPoint;
379  theHelix->getGflashTrajectoryPoint(trajectoryPoint, pathLength + incrementPath);
380 
381  G4ThreeVector SpotPosition0 = trajectoryPoint.getPosition() +
382  rShower * std::cos(azimuthalAngle) * trajectoryPoint.getOrthogonalUnitVector() +
383  rShower * std::sin(azimuthalAngle) * trajectoryPoint.getCrossUnitVector();
384 
386  // Convert into mm unit
387  SpotPosition0 *= cm;
388 
389  //---------------------------------------------------
390  // fill a fake step to send it to hit maker
391  //---------------------------------------------------
392 
393  // to make a different time for each fake step. (0.03 nsec is corresponding to 1cm step size)
394  timeGlobal += 0.0001 * nanosecond;
395 
396  //fill equivalent changes to a (fake) step associated with a spot
397 
398  G4double zInX0_spot = std::abs(pathLength + incrementPath - pathLength0) / Gflash::radLength[jCalorimeter];
399 
400 #ifdef EDM_ML_DEBUG
401  edm::LogVerbatim("HFShower") << "HFGflash: zInX0_spot,emSpotEnergy/GeV =" << zInX0_spot << " , "
402  << emSpotEnergy / GeV << "emSpotEnergy/GeV =" << emSpotEnergy / GeV;
403 #endif
404 
405  if (zInX0_spot <= 0)
406  continue;
407  if (emSpotEnergy <= 0)
408  continue;
409  if (rShower / Gflash::rMoliere[jCalorimeter] <= 0)
410  continue;
411 
412  oneHit.depth = 1;
413 
414 #ifdef EDM_ML_DEBUG
415  if (theFillHisto) {
416  em_long->Fill(SpotPosition0.z() / cm, emSpotEnergy * invgev);
417  em_lateral->Fill(rShower / Gflash::rMoliere[jCalorimeter], emSpotEnergy * invgev);
418  em_2d->Fill(SpotPosition0.z() / cm, rShower / Gflash::rMoliere[jCalorimeter], emSpotEnergy * invgev);
419  }
420 #endif
421 
423  //if(SpotPosition0 == 0) continue;
424 
425  double energyratio = emSpotEnergy / (preStepPoint->GetTotalEnergy() / (nSpots * e25Scale));
426 
427  if (emSpotEnergy / GeV < 0.0001)
428  continue;
429  if (energyratio > 80)
430  continue;
431 
432  double zshift = 0;
433  if (SpotPosition0.z() > 0)
434  zshift = 18;
435  if (SpotPosition0.z() < 0)
436  zshift = -18;
437 
438  G4ThreeVector gfshift(0, 0, zshift * (pow(100, 0.1) / pow(energy, 0.1)));
439 
440  G4ThreeVector SpotPosition = gfshift + SpotPosition0;
441 
442  double LengthWeight = std::fabs(std::pow(SpotPosition0.z() / 11370, 1));
443  if (G4UniformRand() > 0.0021 * energyratio * LengthWeight)
444  continue;
445 
446  oneHit.position = SpotPosition;
447  oneHit.time = timeGlobal;
448  oneHit.edep = emSpotEnergy * invgev;
449  hit.push_back(oneHit);
450  nSpots_sd++;
451 
452  } // end of for spot iteration
453 
454  } // end of while for longitudinal integration
455 #ifdef EDM_ML_DEBUG
456  if (theFillHisto) {
457  em_nSpots_sd->Fill(nSpots_sd);
458  }
459 #endif
460  // delete theGflashNavigator;
461  return hit;
462 }
G4Navigator * theGflashNavigator
Definition: HFGflash.h:48
float alpha
Definition: AMPTWrapper.h:95
const double GeV
Definition: MathUtil.h:16
double getPathLengthAtZ(double z) const
Gflash3Vector getCrossUnitVector()
TH1F * em_ssp_z
Definition: HFGflash.h:64
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
Gflash::CalorimeterNumber jCalorimeter
Definition: HFGflash.h:51
G4double theBField
Definition: HFGflash.h:55
bool theFillHisto
Definition: HFGflash.h:54
const double rMoliere[kNumberCalorimeter]
static const float invgev
Definition: TimingSD.cc:35
T sqrt(T t)
Definition: SSEVec.h:18
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double edep
Definition: HFGflash.h:39
T min(T a, T b)
Definition: MathUtil.h:58
double p2[4]
Definition: TauolaWrapper.h:90
Gflash3Vector getOrthogonalUnitVector()
void getGflashTrajectoryPoint(GflashTrajectoryPoint &point, double s) const
static const double tmax[3]
TH1F * em_ssp_rho
Definition: HFGflash.h:64
const double radLength[kNumberCalorimeter]
double time
Definition: HFGflash.h:38
TH1F * em_nSpots_sd
Definition: HFGflash.h:65
TH1F * em_lateral
Definition: HFGflash.h:64
TH1F * em_long
Definition: HFGflash.h:64
Gflash3Vector & getPosition()
double p1[4]
Definition: TauolaWrapper.h:89
G4ThreeVector position
Definition: HFGflash.h:36
TH1F * em_incE
Definition: HFGflash.h:64
GflashTrajectory * theHelix
Definition: HFGflash.h:46
TH2F * em_2d
Definition: HFGflash.h:66
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
double p3[4]
Definition: TauolaWrapper.h:91
void initializeTrajectory(const HepGeom::Vector3D< double > &, const HepGeom::Point3D< double > &, double q, double Field)

Member Data Documentation

TH2F* HFGflash::em_2d
private

Definition at line 66 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

TH2F * HFGflash::em_2d_sd
private

Definition at line 66 of file HFGflash.h.

Referenced by HFGflash().

TH1F* HFGflash::em_incE
private

Definition at line 64 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

TH1F * HFGflash::em_lateral
private

Definition at line 64 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

TH1F * HFGflash::em_lateral_sd
private

Definition at line 65 of file HFGflash.h.

Referenced by HFGflash().

TH1F * HFGflash::em_long
private

Definition at line 64 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

TH1F* HFGflash::em_long_sd
private

Definition at line 65 of file HFGflash.h.

Referenced by HFGflash().

TH1F * HFGflash::em_nSpots_sd
private

Definition at line 65 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

TH2F * HFGflash::em_ratio
private

Definition at line 66 of file HFGflash.h.

Referenced by HFGflash().

TH2F * HFGflash::em_ratio_selected
private

Definition at line 66 of file HFGflash.h.

Referenced by HFGflash().

TH1F * HFGflash::em_ssp_rho
private

Definition at line 64 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

TH1F * HFGflash::em_ssp_z
private

Definition at line 64 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

TH2F * HFGflash::em_ze
private

Definition at line 66 of file HFGflash.h.

Referenced by HFGflash().

TH1F * HFGflash::em_ze_ratio
private

Definition at line 65 of file HFGflash.h.

Referenced by HFGflash().

G4double HFGflash::energyScale[Gflash::kNumberCalorimeter]
private

Definition at line 59 of file HFGflash.h.

G4double HFGflash::energyToDeposit
private

Definition at line 58 of file HFGflash.h.

Gflash::CalorimeterNumber HFGflash::jCalorimeter
private

Definition at line 51 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

G4double HFGflash::lateralPar[4]
private

Definition at line 62 of file HFGflash.h.

G4double HFGflash::longEcal[Gflash::NPar]
private

Definition at line 61 of file HFGflash.h.

G4double HFGflash::longHcal[Gflash::NPar]
private

Definition at line 60 of file HFGflash.h.

G4int HFGflash::showerType
private

Definition at line 57 of file HFGflash.h.

G4double HFGflash::theBField
private

Definition at line 55 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

bool HFGflash::theFillHisto
private

Definition at line 54 of file HFGflash.h.

Referenced by gfParameterization(), and HFGflash().

G4Navigator* HFGflash::theGflashNavigator
private

Definition at line 48 of file HFGflash.h.

Referenced by gfParameterization(), HFGflash(), and ~HFGflash().

G4Step* HFGflash::theGflashStep
private

Definition at line 47 of file HFGflash.h.

Referenced by HFGflash(), and ~HFGflash().

G4TouchableHandle HFGflash::theGflashTouchableHandle
private

Definition at line 49 of file HFGflash.h.

Referenced by HFGflash().

GflashTrajectory* HFGflash::theHelix
private

Definition at line 46 of file HFGflash.h.

Referenced by gfParameterization(), HFGflash(), and ~HFGflash().

bool HFGflash::theWatcherOn
private

Definition at line 53 of file HFGflash.h.

Referenced by HFGflash().