Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
GFlashShowerModel.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id$
27//
28//
29// ------------------------------------------------------------
30// GEANT 4 class implementation
31//
32// ---------------- GFlashShowerModel ----------------
33//
34// Authors: E.Barberio & Joanna Weng - 9.11.2004
35// ------------------------------------------------------------
36
37#include "G4Electron.hh"
38#include "G4Positron.hh"
39#include "G4NeutrinoE.hh"
40#include "G4NeutrinoMu.hh"
41#include "G4NeutrinoTau.hh"
42#include "G4AntiNeutrinoE.hh"
43#include "G4AntiNeutrinoMu.hh"
44#include "G4AntiNeutrinoTau.hh"
45#include "G4PionZero.hh"
46#include "G4VProcess.hh"
47#include "G4ios.hh"
48#include "G4LogicalVolume.hh"
49#include "geomdefs.hh"
50
51#include "GFlashShowerModel.hh"
54#include "GFlashEnergySpot.hh"
55
56
58 G4Envelope* envelope)
59 : G4VFastSimulationModel(modelName, envelope),
60 PBound(0), Parameterisation(0), HMaker(0)
61{
62 FlagParamType = 0;
63 FlagParticleContainment = 1;
64 StepInX0 = 0.1;
65 Messenger = new GFlashShowerModelMessenger(this);
66}
67
69 : G4VFastSimulationModel(modelName),
70 PBound(0), Parameterisation(0), HMaker(0)
71{
72 FlagParamType =1;
73 FlagParticleContainment = 1;
74 StepInX0 = 0.1;
75 Messenger = new GFlashShowerModelMessenger(this);
76}
77
79{
80 delete Messenger;
81}
82
85{
86 return
87 &particleType == G4Electron::ElectronDefinition() ||
88 &particleType == G4Positron::PositronDefinition();
89}
90
91/**********************************************************************/
92/* Checks whether conditions of fast parameterisation are fullfilled */
93/**********************************************************************/
94
96
97{
98 G4bool select = false;
99 if(FlagParamType != 0)
100 {
101 G4double ParticleEnergy = fastTrack.GetPrimaryTrack()->GetKineticEnergy();
102 G4ParticleDefinition &ParticleType =
103 *(fastTrack.GetPrimaryTrack()->GetDefinition());
104 if(ParticleEnergy > PBound->GetMinEneToParametrise(ParticleType) &&
105 ParticleEnergy < PBound->GetMaxEneToParametrise(ParticleType) )
106 {
107 // check conditions depending on particle flavour
108 // performance to be optimized @@@@@@@
110 select = CheckParticleDefAndContainment(fastTrack);
111 if (select) EnergyStop= PBound->GetEneToKill(ParticleType);
112 }
113 }
114
115 return select;
116}
117
118
119G4bool
120GFlashShowerModel::CheckParticleDefAndContainment(const G4FastTrack& fastTrack)
121{
122 G4bool filter=false;
123 G4ParticleDefinition * ParticleType =
124 fastTrack.GetPrimaryTrack()->GetDefinition();
125
126 if( ParticleType == G4Electron::ElectronDefinition() ||
127 ParticleType == G4Positron::PositronDefinition() )
128 {
129 filter=true;
130 if(FlagParticleContainment == 1)
131 {
132 filter=CheckContainment(fastTrack);
133 }
134 }
135 return filter;
136}
137
138G4bool GFlashShowerModel::CheckContainment(const G4FastTrack& fastTrack)
139{
140 G4bool filter=false;
141 // track informations
142 G4ThreeVector DirectionShower=fastTrack.GetPrimaryTrackLocalDirection();
143 G4ThreeVector InitialPositionShower=fastTrack.GetPrimaryTrackLocalPosition();
144
145 G4ThreeVector OrthoShower, CrossShower;
146 // Returns orthogonal vector
147 OrthoShower = DirectionShower.orthogonal();
148 // Shower in direction perpendicular to OrthoShower and DirectionShower
149 CrossShower = DirectionShower.cross(OrthoShower);
150
153 G4int CosPhi[4] = {1,0,-1,0};
154 G4int SinPhi[4] = {0,1,0,-1};
155
156 G4ThreeVector Position;
157 G4int NlateralInside=0;
158 // pointer to solid we're in
159 G4VSolid *SolidCalo = fastTrack.GetEnvelopeSolid();
160 for(int i=0; i<4 ;i++)
161 {
162 // polar coordinates
163 Position = InitialPositionShower +
164 Z*DirectionShower +
165 R*CosPhi[i]*OrthoShower +
166 R*SinPhi[i]*CrossShower ;
167
168 if(SolidCalo->Inside(Position) != kOutside)
169 NlateralInside++;
170 }
171
172 // choose to parameterise or flag when all inetc...
173 if(NlateralInside==4) filter=true;
174 // std::cout << " points = " <<NlateralInside << std::endl;
175 return filter;
176}
177
178
179void
181{
182 // parametrise electrons
183 if(fastTrack.GetPrimaryTrack()->GetDefinition()
185 fastTrack.GetPrimaryTrack()->GetDefinition()
187 ElectronDoIt(fastTrack,fastStep);
188}
189
190void
191GFlashShowerModel::ElectronDoIt(const G4FastTrack& fastTrack,
192 G4FastStep& fastStep)
193{
194 // std::cout<<"--- ElectronDoit --- "<<std::endl;
195
196 fastStep.KillPrimaryTrack();
197 fastStep.SetPrimaryTrackPathLength(0.0);
198 fastStep.SetTotalEnergyDeposited(fastTrack.GetPrimaryTrack()->
199 GetKineticEnergy());
200
201 //-----------------------------
202 // Get track parameters
203 //-----------------------------
204 //E,vect{p} and t,vec(x)
205 G4double Energy = fastTrack.GetPrimaryTrack()->GetKineticEnergy();
206
207 // axis of the shower, in global reference frame:
208 G4ThreeVector DirectionShower =
210 G4ThreeVector OrthoShower, CrossShower;
211 OrthoShower = DirectionShower.orthogonal();
212 CrossShower = DirectionShower.cross(OrthoShower);
213
214 //--------------------------------
215 ///Generate longitudinal profile
216 //--------------------------------
218 // performance iteration @@@@@@@
219
220 ///Initialisation of long. loop variables
221 G4VSolid *SolidCalo = fastTrack.GetEnvelopeSolid();
224 G4double Bound = SolidCalo->DistanceToOut(pos,dir);
225
226 G4double Dz = 0.00;
227 G4double ZEndStep = 0.00;
228
229 G4double EnergyNow = Energy;
230 G4double EneIntegral = 0.00;
231 G4double LastEneIntegral = 0.00;
232 G4double DEne = 0.00;
233
234 G4double NspIntegral = 0.00;
235 G4double LastNspIntegral = 0.00;
236 G4double DNsp = 0.00;
237
238 // starting point of the shower:
239 G4ThreeVector PositionShower = fastTrack.GetPrimaryTrack()->GetPosition();
240 G4ThreeVector NewPositionShower = PositionShower;
241 G4double StepLenght = 0.00;
242
243 G4int NSpotDeposited =0;
244
245 //--------------------------
246 /// Begin Longitudinal Loop
247 //-------------------------
248
249 do
250 {
251 //determine step size=min(1Xo,next boundary)
252 G4double stepLength = StepInX0*Parameterisation->GetX0();
253 if(Bound < stepLength)
254 {
255 Dz = Bound;
256 Bound = 0.00;
257 }
258 else
259 {
260 Dz = stepLength;
261 Bound = Bound-Dz;
262 }
263 ZEndStep=ZEndStep+Dz;
264
265 // Determine Energy Release in Step
266 if(EnergyNow > EnergyStop)
267 {
268 LastEneIntegral = EneIntegral;
269 EneIntegral = Parameterisation->IntegrateEneLongitudinal(ZEndStep);
270 DEne = std::min( EnergyNow,
271 (EneIntegral-LastEneIntegral)*Energy);
272 LastNspIntegral = NspIntegral;
273 NspIntegral = Parameterisation->IntegrateNspLongitudinal(ZEndStep);
274 DNsp = std::max(1., std::floor( (NspIntegral-LastNspIntegral)
276 }
277 // end of the shower
278 else
279 {
280 DEne = EnergyNow;
281 DNsp = std::max(1., std::floor( (1.- NspIntegral)
283 }
284 EnergyNow = EnergyNow - DEne;
285
286 // Apply sampling fluctuation - only in sampling calorimeters
287 //
290 if (sp)
291 {
292 G4double DEneSampling = sp->ApplySampling(DEne,Energy);
293 DEne = DEneSampling;
294 }
295
296 //move particle in the middle of the step
297 StepLenght = StepLenght + Dz/2.00;
298 NewPositionShower = NewPositionShower +
299 StepLenght*DirectionShower;
300 StepLenght = Dz/2.00;
301
302 //generate spots & hits:
303 for (int i = 0; i < DNsp; i++)
304 {
305 NSpotDeposited++;
306 GFlashEnergySpot Spot;
307
308 //Spot energy: the same for all spots
309 Spot.SetEnergy( DEne / DNsp );
310 G4double PhiSpot = Parameterisation->GeneratePhi(); // phi of spot
311 G4double RSpot = Parameterisation // radius of spot
312 ->GenerateRadius(i,Energy,ZEndStep-Dz/2.);
313
314 // check reference-> may be need to introduce rot matrix @@@
315 // Position: equally spaced in z
316
317 G4ThreeVector SpotPosition = NewPositionShower +
318 Dz/DNsp*DirectionShower*(i+1/2.-DNsp/2.) +
319 RSpot*std::cos(PhiSpot)*OrthoShower +
320 RSpot*std::sin(PhiSpot)*CrossShower;
321 Spot.SetPosition(SpotPosition);
322
323 //Generate Hits of this spot
324 HMaker->make(&Spot, &fastTrack);
325 }
326 }
327 while(EnergyNow > 0.0 && Bound> 0.0);
328
329 //---------------
330 /// End Loop
331 //---------------
332}
333
334/*
335
336void
337GFlashShowerModel::GammaDoIt(const G4FastTrack& fastTrack,
338 G4FastStep& fastStep)
339{
340
341 if( fastTrack.GetPrimaryTrack()->GetKineticEnergy() > EnergyStop )
342 return;
343
344 //deposita in uno spot unico l'energia
345 //con andamento exp decrescente.
346
347 // Kill the particle to be parametrised
348 fastStep.KillPrimaryTrack();
349 fastStep.SetPrimaryTrackPathLength(0.0);
350 fastStep.SetTotalEnergyDeposited(fastTrack.GetPrimaryTrack()
351 ->GetKineticEnergy());
352 // other settings????
353 feSpotList.clear();
354
355 //-----------------------------
356 // Get track parameters
357 //-----------------------------
358
359 // E,vect{p} and t,vec(x)
360 G4double Energy =
361 fastTrack.GetPrimaryTrack()->GetKineticEnergy();
362 // axis of the shower, in global reference frame:
363 G4ThreeVector DirectionShower =
364 fastTrack.GetPrimaryTrack()->GetMomentumDirection();
365 // starting point of the shower:
366 G4ThreeVector PositionShower =
367 fastTrack.GetPrimaryTrack()->GetPosition();
368
369 //G4double DEneSampling = Parameterisation->ApplySampling(Energy,Energy);
370 //if(DEneSampling <= 0.00) DEneSampling=Energy;
371
372 if(Energy > 0.0)
373 {
374 G4double dist = Parameterisation->GenerateExponential(Energy);
375
376 GFlashEnergySpot Spot;
377 Spot.SetEnergy( Energy );
378 G4ThreeVector SpotPosition = PositionShower + dist*DirectionShower;
379 Spot.SetPosition(SpotPosition);
380
381 // Record the Spot:
382 feSpotList.push_back(Spot);
383
384 //Generate Hits of this spot
385 HMaker->make(Spot);
386 }
387}
388
389*/
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
Hep3Vector orthogonal() const
Hep3Vector cross(const Hep3Vector &) const
static G4Electron * ElectronDefinition()
Definition: G4Electron.cc:89
void SetTotalEnergyDeposited(G4double anEnergyPart)
void KillPrimaryTrack()
Definition: G4FastStep.cc:87
void SetPrimaryTrackPathLength(G4double)
G4ThreeVector GetPrimaryTrackLocalPosition() const
Definition: G4FastTrack.hh:213
const G4Track * GetPrimaryTrack() const
Definition: G4FastTrack.hh:208
G4ThreeVector GetPrimaryTrackLocalDirection() const
Definition: G4FastTrack.hh:223
G4VSolid * GetEnvelopeSolid() const
Definition: G4FastTrack.hh:203
static G4Positron * PositronDefinition()
Definition: G4Positron.cc:89
const G4ThreeVector & GetPosition() const
G4ParticleDefinition * GetDefinition() const
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
virtual EInside Inside(const G4ThreeVector &p) const =0
virtual G4double DistanceToOut(const G4ThreeVector &p, const G4ThreeVector &v, const G4bool calcNorm=false, G4bool *validNorm=0, G4ThreeVector *n=0) const =0
void SetPosition(const G4ThreeVector &point)
void SetEnergy(const G4double &E)
void make(GFlashEnergySpot *aSpot, const G4FastTrack *aT)
G4double GetMinEneToParametrise(G4ParticleDefinition &particleType)
G4double GetMaxEneToParametrise(G4ParticleDefinition &particleType)
G4double GetEneToKill(G4ParticleDefinition &particleType)
void DoIt(const G4FastTrack &, G4FastStep &)
G4bool ModelTrigger(const G4FastTrack &)
GFlashShowerModel(G4String, G4Envelope *)
G4bool IsApplicable(const G4ParticleDefinition &)
GFlashParticleBounds * PBound
GVFlashShowerParameterisation * Parameterisation
virtual G4double IntegrateEneLongitudinal(G4double LongitudinalStep)=0
virtual G4double GetAveR90()=0
virtual void GenerateLongitudinalProfile(G4double Energy)=0
virtual G4double GenerateRadius(G4int ispot, G4double Energy, G4double LongitudinalPosition)=0
virtual G4double GetAveT90()=0
virtual G4double GetX0()=0
virtual G4double IntegrateNspLongitudinal(G4double LongitudinalStep)=0
virtual G4double GetNspot()=0
@ kOutside
Definition: geomdefs.hh:58