Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VEmAdjointModel.hh
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// Module: G4VEMAdjointModel
30// Author: L. Desorgher
31// Organisation: SpaceIT GmbH
32// Contract: ESA contract 21435/08/NL/AT
33// Customer: ESA/ESTEC
34/////////////////////////////////////////////////////////////////////////////////
35//
36// CHANGE HISTORY
37// --------------
38// ChangeHistory:
39// 10 September 2009 Move to a virtual class. L. Desorgher
40// 1st April 2007 creation by L. Desorgher
41//
42//-------------------------------------------------------------
43// Documentation:
44// Base class for Adjoint EM model. It is based on the use of direct G4VEmModel.
45//
46
47
48#ifndef G4VEmAdjointModel_h
49#define G4VEmAdjointModel_h 1
50
51#include "globals.hh"
52#include "G4DynamicParticle.hh"
55#include "G4Material.hh"
56#include "G4Element.hh"
57#include "G4ElementVector.hh"
58#include "Randomize.hh"
60#include "G4VEmModel.hh"
61#include "G4Electron.hh"
62#include "G4Gamma.hh"
64
65class G4PhysicsTable;
66class G4Region;
69class G4Track;
71
73{
74
75public: // public methods
76
77 G4VEmAdjointModel(const G4String& nam);
78
79 virtual ~G4VEmAdjointModel();
80
81 //------------------------------------------------------------------------
82 // Virtual methods to be implemented for the sample secondaries concrete model
83 //------------------------------------------------------------------------
84
85 //virtual void Initialise()=0;
86
87 virtual void SampleSecondaries(const G4Track& aTrack,
88 G4bool IsScatProjToProjCase,
89 G4ParticleChange* fParticleChange)=0;
90
91
92 //------------------------------------------------------------------------
93 // Methods for adjoint processes; may be overwritten if needed;
94 //------------------------------------------------------------------------
95
96
98 G4double primEnergy,
99 G4bool IsScatProjToProjCase);
100
102 G4double primEnergy,
103 G4bool IsScatProjToProjCase);
104
106 G4double kinEnergyProj, // kinetic energy of the primary particle before the interaction
107 G4double kinEnergyProd, // kinetic energy of the secondary particle
108 G4double Z,
109 G4double A = 0.);
110
112 G4double kinEnergyProj, // kinetic energy of the primary particle before the interaction
113 G4double kinEnergyScatProj, // kinetic energy of the primary particle after the interaction
114 G4double Z,
115 G4double A = 0.);
116
117
118
120 const G4Material* aMaterial,
121 G4double kinEnergyProj, // kinetic energy of the primary particle before the interaction
122 G4double kinEnergyProd // kinetic energy of the secondary particle
123 );
124
126 const G4Material* aMaterial,
127 G4double kinEnergyProj, // kinetic energy of the primary particle before the interaction
128 G4double kinEnergyScatProj // kinetic energy of the primary particle after the interaction
129 );
130
131
132 //Energy limits of adjoint secondary
133 //------------------
134
139
140
141
142 //Other Methods
143 //---------------
144
146
147
148 std::vector< std::vector< double>* > ComputeAdjointCrossSectionVectorPerAtomForSecond(
149 G4double kinEnergyProd,
150 G4double Z,
151 G4double A = 0.,
152 G4int nbin_pro_decade=10
153 );
154 std::vector< std::vector< double>* > ComputeAdjointCrossSectionVectorPerAtomForScatProj(
155 G4double kinEnergyProd,
156 G4double Z,
157 G4double A = 0.,
158 G4int nbin_pro_decade=10
159 );
160
161 std::vector< std::vector< double>* > ComputeAdjointCrossSectionVectorPerVolumeForSecond(
162 G4Material* aMaterial,
163 G4double kinEnergyProd,
164 G4int nbin_pro_decade=10
165 );
166 std::vector< std::vector< double>* > ComputeAdjointCrossSectionVectorPerVolumeForScatProj(
167 G4Material* aMaterial,
168 G4double kinEnergyProd,
169 G4int nbin_pro_decade=10
170 );
171
172
173
174 inline void SetCSMatrices(std::vector< G4AdjointCSMatrix* >* Vec1CSMatrix, std::vector< G4AdjointCSMatrix* >* Vec2CSMatrix){
177
178
179 };
180
182
184
186
188
189 void SetHighEnergyLimit(G4double aVal);
190
191 void SetLowEnergyLimit(G4double aVal);
192
193 inline void DefineDirectEMModel(G4VEmModel* aModel){theDirectEMModel = aModel;}
194
196
199 }
200
202
204
205 inline void SetUseMatrix(G4bool aBool) { UseMatrix = aBool;}
206
209
210 inline void SetApplyCutInRange(G4bool aBool){ ApplyCutInRange = aBool;}
211 inline G4bool GetUseMatrix() {return UseMatrix;}
215
216 inline G4String GetName(){ return name;}
217 inline virtual void SetCSBiasingFactor(G4double aVal) {CS_biasing_factor = aVal;}
218
219protected:
220
221 //Some of them can be overriden by daughter classes
222
223
227
228
229
230 //General methods to sample secondary energy
231 //--------------------------------------
232 G4double SampleAdjSecEnergyFromCSMatrix(size_t MatrixIndex,G4double prim_energy,G4bool IsScatProjToProjCase);
233 G4double SampleAdjSecEnergyFromCSMatrix(G4double prim_energy,G4bool IsScatProjToProjCase);
234 void SelectCSMatrix(G4bool IsScatProjToProjCase);
235
236 virtual G4double SampleAdjSecEnergyFromDiffCrossSectionPerAtom(G4double prim_energy,G4bool IsScatProjToProjCase);
237
238
239
240 //Post Step weight correction
241 //----------------------------
242 virtual void CorrectPostStepWeight(G4ParticleChange* fParticleChange,
243 G4double old_weight,
244 G4double adjointPrimKinEnergy,
245 G4double projectileKinEnergy,
246 G4bool IsScatProjToProjCase);
247
248
249
250
251
252
253protected: //attributes
254
257
258
259
260
261 //Name
262 //-----
263
265
266 //Needed for CS integration at the initialisation phase
267 //-----------------------------------------------------
268
275
276
277 //for the adjoint simulation we need for each element or material:
278 //an adjoint CS Matrix
279 //-----------------------------
280
281 std::vector< G4AdjointCSMatrix* >* pOnCSMatrixForProdToProjBackwardScattering;
282 std::vector< G4AdjointCSMatrix* >* pOnCSMatrixForScatProjToProjBackwardScattering;
284 std::vector<G4double> CS_Vs_ElementForProdToProjCase;
285
289
290
291
292
293 //particle definition
294 //------------------
295
300
301
302 //Prestep energy
303 //-------------
305
306 //Current couple material
307 //----------------------
315
316
317
318
319 //For ions
320 //---------
323
324
325 //Energy limits
326 //-------------
327
330
331
332
333 //Cross Section biasing factor
334 //---------------------------
336
337
338 //Type of Model with Matrix or not
339 //--------------------------------
341 G4bool UseMatrixPerElement; //other possibility is per Material
343
344
345 //Index of Cross section matrices to be used
346 //------------
348
350
351
352
353
354
355
356
357
358};
359
360
361#endif
362
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
void SetUseMatrixPerElement(G4bool aBool)
virtual G4double DiffCrossSectionPerVolumePrimToScatPrim(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyScatProj)
void SetAdjointEquivalentOfDirectSecondaryParticleDefinition(G4ParticleDefinition *aPart)
G4bool GetSecondPartOfSameType()
void SetCSMatrices(std::vector< G4AdjointCSMatrix * > *Vec1CSMatrix, std::vector< G4AdjointCSMatrix * > *Vec2CSMatrix)
virtual ~G4VEmAdjointModel()
G4double lastAdjointCSForProdToProjCase
virtual void SampleSecondaries(const G4Track &aTrack, G4bool IsScatProjToProjCase, G4ParticleChange *fParticleChange)=0
G4double DiffCrossSectionFunction1(G4double kinEnergyProj)
G4VEmModel * theDirectEMModel
void SetUseMatrix(G4bool aBool)
G4bool GetUseOnlyOneMatrixForAllElements()
G4double lastAdjointCSForScatProjToProjCase
virtual G4double GetSecondAdjEnergyMaxForProdToProjCase(G4double PrimAdjEnergy)
G4double kinEnergyProjForIntegration
size_t indexOfUsedCrossSectionMatrix
void SelectCSMatrix(G4bool IsScatProjToProjCase)
std::vector< std::vector< double > * > ComputeAdjointCrossSectionVectorPerAtomForSecond(G4double kinEnergyProd, G4double Z, G4double A=0., G4int nbin_pro_decade=10)
virtual void CorrectPostStepWeight(G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool IsScatProjToProjCase)
virtual void SetCSBiasingFactor(G4double aVal)
virtual G4double DiffCrossSectionPerVolumePrimToSecond(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)
G4ParticleDefinition * GetAdjointEquivalentOfDirectPrimaryParticleDefinition()
G4double GetLowEnergyLimit()
virtual G4double DiffCrossSectionPerAtomPrimToScatPrim(G4double kinEnergyProj, G4double kinEnergyScatProj, G4double Z, G4double A=0.)
void SetLowEnergyLimit(G4double aVal)
G4double DiffCrossSectionPerVolumeFunctionForIntegrationOverEkinProj(G4double EkinProd)
std::vector< G4double > CS_Vs_ElementForScatProjToProjCase
void DefineCurrentMaterial(const G4MaterialCutsCouple *couple)
G4ParticleDefinition * GetAdjointEquivalentOfDirectSecondaryParticleDefinition()
G4ParticleDefinition * theDirectPrimaryPartDef
G4double SampleAdjSecEnergyFromCSMatrix(size_t MatrixIndex, G4double prim_energy, G4bool IsScatProjToProjCase)
virtual G4double GetSecondAdjEnergyMaxForScatProjToProjCase(G4double PrimAdjEnergy)
G4double kinEnergyProdForIntegration
G4double kinEnergyScatProjForIntegration
void SetSecondPartOfSameType(G4bool aBool)
G4double currentTcutForDirectPrim
std::vector< G4AdjointCSMatrix * > * pOnCSMatrixForScatProjToProjBackwardScattering
G4Material * currentMaterial
virtual G4double GetAdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
std::vector< std::vector< double > * > ComputeAdjointCrossSectionVectorPerVolumeForSecond(G4Material *aMaterial, G4double kinEnergyProd, G4int nbin_pro_decade=10)
G4bool UseOnlyOneMatrixForAllElements
virtual G4double GetSecondAdjEnergyMinForProdToProjCase(G4double PrimAdjEnergy)
G4Material * SelectedMaterial
std::vector< G4AdjointCSMatrix * > * pOnCSMatrixForProdToProjBackwardScattering
G4VParticleChange * pParticleChange
void SetUseOnlyOneMatrixForAllElements(G4bool aBool)
G4double DiffCrossSectionFunction2(G4double kinEnergyProj)
std::vector< G4double > CS_Vs_ElementForProdToProjCase
void SetAdjointEquivalentOfDirectPrimaryParticleDefinition(G4ParticleDefinition *aPart)
void DefineDirectEMModel(G4VEmModel *aModel)
std::vector< std::vector< double > * > ComputeAdjointCrossSectionVectorPerVolumeForScatProj(G4Material *aMaterial, G4double kinEnergyProd, G4int nbin_pro_decade=10)
virtual G4double DiffCrossSectionPerAtomPrimToSecond(G4double kinEnergyProj, G4double kinEnergyProd, G4double Z, G4double A=0.)
G4double currentTcutForDirectSecond
G4MaterialCutsCouple * currentCouple
virtual G4double AdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
virtual G4double SampleAdjSecEnergyFromDiffCrossSectionPerAtom(G4double prim_energy, G4bool IsScatProjToProjCase)
void SetHighEnergyLimit(G4double aVal)
std::vector< std::vector< double > * > ComputeAdjointCrossSectionVectorPerAtomForScatProj(G4double kinEnergyProd, G4double Z, G4double A=0., G4int nbin_pro_decade=10)
G4ParticleDefinition * theAdjEquivOfDirectSecondPartDef
G4double GetHighEnergyLimit()
void SetApplyCutInRange(G4bool aBool)
virtual G4double GetSecondAdjEnergyMinForScatProjToProjCase(G4double PrimAdjEnergy, G4double Tcut=0)
G4ParticleDefinition * theAdjEquivOfDirectPrimPartDef