Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4AdjointPhotoElectricModel Class Reference

#include <G4AdjointPhotoElectricModel.hh>

+ Inheritance diagram for G4AdjointPhotoElectricModel:

Public Member Functions

 G4AdjointPhotoElectricModel ()
 
 ~G4AdjointPhotoElectricModel ()
 
virtual void SampleSecondaries (const G4Track &aTrack, G4bool IsScatProjToProjCase, G4ParticleChange *fParticleChange)
 
virtual G4double AdjointCrossSection (const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
 
virtual G4double GetAdjointCrossSection (const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
 
G4double AdjointCrossSectionPerAtom (const G4Element *anElement, G4double electronEnergy)
 
void SetTheDirectPEEffectModel (G4PEEffectFluoModel *aModel)
 
virtual void CorrectPostStepWeight (G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool IsScatProjToProjCase)
 
- Public Member Functions inherited from G4VEmAdjointModel
 G4VEmAdjointModel (const G4String &nam)
 
virtual ~G4VEmAdjointModel ()
 
virtual void SampleSecondaries (const G4Track &aTrack, G4bool IsScatProjToProjCase, G4ParticleChange *fParticleChange)=0
 
virtual G4double AdjointCrossSection (const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
 
virtual G4double GetAdjointCrossSection (const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)
 
virtual G4double DiffCrossSectionPerAtomPrimToSecond (G4double kinEnergyProj, G4double kinEnergyProd, G4double Z, G4double A=0.)
 
virtual G4double DiffCrossSectionPerAtomPrimToScatPrim (G4double kinEnergyProj, G4double kinEnergyScatProj, G4double Z, G4double A=0.)
 
virtual G4double DiffCrossSectionPerVolumePrimToSecond (const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)
 
virtual G4double DiffCrossSectionPerVolumePrimToScatPrim (const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyScatProj)
 
virtual G4double GetSecondAdjEnergyMaxForScatProjToProjCase (G4double PrimAdjEnergy)
 
virtual G4double GetSecondAdjEnergyMinForScatProjToProjCase (G4double PrimAdjEnergy, G4double Tcut=0)
 
virtual G4double GetSecondAdjEnergyMaxForProdToProjCase (G4double PrimAdjEnergy)
 
virtual G4double GetSecondAdjEnergyMinForProdToProjCase (G4double PrimAdjEnergy)
 
void DefineCurrentMaterial (const G4MaterialCutsCouple *couple)
 
std::vector< std::vector< double > * > ComputeAdjointCrossSectionVectorPerAtomForSecond (G4double kinEnergyProd, G4double Z, G4double A=0., G4int nbin_pro_decade=10)
 
std::vector< std::vector< double > * > ComputeAdjointCrossSectionVectorPerAtomForScatProj (G4double kinEnergyProd, G4double Z, G4double A=0., G4int nbin_pro_decade=10)
 
std::vector< std::vector< double > * > ComputeAdjointCrossSectionVectorPerVolumeForSecond (G4Material *aMaterial, G4double kinEnergyProd, G4int nbin_pro_decade=10)
 
std::vector< std::vector< double > * > ComputeAdjointCrossSectionVectorPerVolumeForScatProj (G4Material *aMaterial, G4double kinEnergyProd, G4int nbin_pro_decade=10)
 
void SetCSMatrices (std::vector< G4AdjointCSMatrix * > *Vec1CSMatrix, std::vector< G4AdjointCSMatrix * > *Vec2CSMatrix)
 
G4ParticleDefinitionGetAdjointEquivalentOfDirectPrimaryParticleDefinition ()
 
G4ParticleDefinitionGetAdjointEquivalentOfDirectSecondaryParticleDefinition ()
 
G4double GetHighEnergyLimit ()
 
G4double GetLowEnergyLimit ()
 
void SetHighEnergyLimit (G4double aVal)
 
void SetLowEnergyLimit (G4double aVal)
 
void DefineDirectEMModel (G4VEmModel *aModel)
 
void SetAdjointEquivalentOfDirectPrimaryParticleDefinition (G4ParticleDefinition *aPart)
 
void SetAdjointEquivalentOfDirectSecondaryParticleDefinition (G4ParticleDefinition *aPart)
 
void SetSecondPartOfSameType (G4bool aBool)
 
G4bool GetSecondPartOfSameType ()
 
void SetUseMatrix (G4bool aBool)
 
void SetUseMatrixPerElement (G4bool aBool)
 
void SetUseOnlyOneMatrixForAllElements (G4bool aBool)
 
void SetApplyCutInRange (G4bool aBool)
 
G4bool GetUseMatrix ()
 
G4bool GetUseMatrixPerElement ()
 
G4bool GetUseOnlyOneMatrixForAllElements ()
 
G4bool GetApplyCutInRange ()
 
G4String GetName ()
 
virtual void SetCSBiasingFactor (G4double aVal)
 
void SetCorrectWeightForPostStepInModel (G4bool aBool)
 
void SetAdditionalWeightCorrectionFactorForPostStepOutsideModel (G4double factor)
 

Additional Inherited Members

- Protected Member Functions inherited from G4VEmAdjointModel
G4double DiffCrossSectionFunction1 (G4double kinEnergyProj)
 
G4double DiffCrossSectionFunction2 (G4double kinEnergyProj)
 
G4double DiffCrossSectionPerVolumeFunctionForIntegrationOverEkinProj (G4double EkinProd)
 
G4double SampleAdjSecEnergyFromCSMatrix (size_t MatrixIndex, G4double prim_energy, G4bool IsScatProjToProjCase)
 
G4double SampleAdjSecEnergyFromCSMatrix (G4double prim_energy, G4bool IsScatProjToProjCase)
 
void SelectCSMatrix (G4bool IsScatProjToProjCase)
 
virtual G4double SampleAdjSecEnergyFromDiffCrossSectionPerAtom (G4double prim_energy, G4bool IsScatProjToProjCase)
 
virtual void CorrectPostStepWeight (G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool IsScatProjToProjCase)
 
- Protected Attributes inherited from G4VEmAdjointModel
G4VEmModeltheDirectEMModel
 
G4VParticleChangepParticleChange
 
const G4String name
 
G4int ASelectedNucleus
 
G4int ZSelectedNucleus
 
G4MaterialSelectedMaterial
 
G4double kinEnergyProdForIntegration
 
G4double kinEnergyScatProjForIntegration
 
G4double kinEnergyProjForIntegration
 
std::vector< G4AdjointCSMatrix * > * pOnCSMatrixForProdToProjBackwardScattering
 
std::vector< G4AdjointCSMatrix * > * pOnCSMatrixForScatProjToProjBackwardScattering
 
std::vector< G4doubleCS_Vs_ElementForScatProjToProjCase
 
std::vector< G4doubleCS_Vs_ElementForProdToProjCase
 
G4double lastCS
 
G4double lastAdjointCSForScatProjToProjCase
 
G4double lastAdjointCSForProdToProjCase
 
G4ParticleDefinitiontheAdjEquivOfDirectPrimPartDef
 
G4ParticleDefinitiontheAdjEquivOfDirectSecondPartDef
 
G4ParticleDefinitiontheDirectPrimaryPartDef
 
G4bool second_part_of_same_type
 
G4double preStepEnergy
 
G4MaterialcurrentMaterial
 
G4MaterialCutsCouplecurrentCouple
 
size_t currentMaterialIndex
 
size_t currentCoupleIndex
 
G4double currentTcutForDirectPrim
 
G4double currentTcutForDirectSecond
 
G4bool ApplyCutInRange
 
G4double mass_ratio_product
 
G4double mass_ratio_projectile
 
G4double HighEnergyLimit
 
G4double LowEnergyLimit
 
G4double CS_biasing_factor
 
G4bool UseMatrix
 
G4bool UseMatrixPerElement
 
G4bool UseOnlyOneMatrixForAllElements
 
size_t indexOfUsedCrossSectionMatrix
 
size_t model_index
 
G4bool correct_weight_for_post_step_in_model
 
G4double additional_weight_correction_factor_for_post_step_outside_model
 

Detailed Description

Definition at line 61 of file G4AdjointPhotoElectricModel.hh.

Constructor & Destructor Documentation

◆ G4AdjointPhotoElectricModel()

G4AdjointPhotoElectricModel::G4AdjointPhotoElectricModel ( )

Definition at line 41 of file G4AdjointPhotoElectricModel.cc.

41 :
42 G4VEmAdjointModel("AdjointPEEffect")
43
44{ SetUseMatrix(false);
45 SetApplyCutInRange(false);
46
47 //Initialization
48 current_eEnergy =0.;
49 totAdjointCS=0.;
50 factorCSBiasing =1.;
51 post_step_AdjointCS =0.;
52 pre_step_AdjointCS =0.;
53 totBiasedAdjointCS =0.;
54
55 index_element=0;
56
61 theDirectPEEffectModel = new G4PEEffectFluoModel();
62}
static G4AdjointElectron * AdjointElectron()
static G4AdjointGamma * AdjointGamma()
static G4Gamma * Gamma()
Definition: G4Gamma.cc:85
void SetUseMatrix(G4bool aBool)
G4ParticleDefinition * theDirectPrimaryPartDef
G4ParticleDefinition * theAdjEquivOfDirectSecondPartDef
void SetApplyCutInRange(G4bool aBool)
G4ParticleDefinition * theAdjEquivOfDirectPrimPartDef

◆ ~G4AdjointPhotoElectricModel()

G4AdjointPhotoElectricModel::~G4AdjointPhotoElectricModel ( )

Definition at line 65 of file G4AdjointPhotoElectricModel.cc.

66{;}

Member Function Documentation

◆ AdjointCrossSection()

G4double G4AdjointPhotoElectricModel::AdjointCrossSection ( const G4MaterialCutsCouple aCouple,
G4double  primEnergy,
G4bool  IsScatProjToProjCase 
)
virtual

Reimplemented from G4VEmAdjointModel.

Definition at line 190 of file G4AdjointPhotoElectricModel.cc.

193{
194
195
196 if (IsScatProjToProjCase) return 0.;
197
198
199 if (aCouple !=currentCouple || current_eEnergy !=electronEnergy) {
200 totAdjointCS = 0.;
201 DefineCurrentMaterialAndElectronEnergy(aCouple, electronEnergy);
202 const G4ElementVector* theElementVector = currentMaterial->GetElementVector();
203 const double* theAtomNumDensityVector = currentMaterial->GetVecNbOfAtomsPerVolume();
204 size_t nelm = currentMaterial->GetNumberOfElements();
205 for (index_element=0;index_element<nelm;index_element++){
206
207 totAdjointCS +=AdjointCrossSectionPerAtom((*theElementVector)[index_element],electronEnergy)*theAtomNumDensityVector[index_element];
208 xsec[index_element] = totAdjointCS;
209 }
210
211 totBiasedAdjointCS=std::min(totAdjointCS,0.01);
212// totBiasedAdjointCS=totAdjointCS;
213 factorCSBiasing = totBiasedAdjointCS/totAdjointCS;
214 lastCS=totBiasedAdjointCS;
215
216
217 }
218 return totBiasedAdjointCS;
219
220
221}
std::vector< G4Element * > G4ElementVector
G4double AdjointCrossSectionPerAtom(const G4Element *anElement, G4double electronEnergy)
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:188
size_t GetNumberOfElements() const
Definition: G4Material.hh:184
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:204
G4Material * currentMaterial
G4MaterialCutsCouple * currentCouple

Referenced by GetAdjointCrossSection(), and SampleSecondaries().

◆ AdjointCrossSectionPerAtom()

G4double G4AdjointPhotoElectricModel::AdjointCrossSectionPerAtom ( const G4Element anElement,
G4double  electronEnergy 
)

Definition at line 233 of file G4AdjointPhotoElectricModel.cc.

234{
235 G4int nShells = anElement->GetNbOfAtomicShells();
236 G4double Z= anElement->GetZ();
237 G4int i = 0;
238 G4double B0=anElement->GetAtomicShell(0);
239 G4double gammaEnergy = electronEnergy+B0;
240 G4double CS= theDirectPEEffectModel->ComputeCrossSectionPerAtom(G4Gamma::Gamma(),gammaEnergy,Z,0.,0.,0.);
241 G4double adjointCS =0.;
242 if (CS >0) adjointCS += CS/gammaEnergy;
243 shell_prob[index_element][0] = adjointCS;
244 for (i=1;i<nShells;i++){
245 //G4cout<<i<<G4endl;
246 G4double Bi_= anElement->GetAtomicShell(i-1);
247 G4double Bi = anElement->GetAtomicShell(i);
248 //G4cout<<Bi_<<'\t'<<Bi<<G4endl;
249 if (electronEnergy <Bi_-Bi) {
250 gammaEnergy = electronEnergy+Bi;
251
252 CS=theDirectPEEffectModel->ComputeCrossSectionPerAtom(G4Gamma::Gamma(),gammaEnergy,Z,0.,0.,0.);
253 if (CS>0) adjointCS +=CS/gammaEnergy;
254 }
255 shell_prob[index_element][i] = adjointCS;
256
257 }
258 adjointCS*=electronEnergy;
259 return adjointCS;
260
261}
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4double GetZ() const
Definition: G4Element.hh:130
G4int GetNbOfAtomicShells() const
Definition: G4Element.hh:146
G4double GetAtomicShell(G4int index) const
Definition: G4Element.cc:366
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A, G4double, G4double) override

Referenced by AdjointCrossSection().

◆ CorrectPostStepWeight()

void G4AdjointPhotoElectricModel::CorrectPostStepWeight ( G4ParticleChange fParticleChange,
G4double  old_weight,
G4double  adjointPrimKinEnergy,
G4double  projectileKinEnergy,
G4bool  IsScatProjToProjCase 
)
virtual

Reimplemented from G4VEmAdjointModel.

Definition at line 168 of file G4AdjointPhotoElectricModel.cc.

173{
174 G4double new_weight=old_weight;
175
177 w_corr*=post_step_AdjointCS/pre_step_AdjointCS;
178
179
180 new_weight*=w_corr;
181 new_weight*=projectileKinEnergy/adjointPrimKinEnergy;
182 fParticleChange->SetParentWeightByProcess(false);
183 fParticleChange->SetSecondaryWeightByProcess(false);
184 fParticleChange->ProposeParentWeight(new_weight);
185}
G4double GetPostStepWeightCorrection()
static G4AdjointCSManager * GetAdjointCSManager()
void SetSecondaryWeightByProcess(G4bool)
void SetParentWeightByProcess(G4bool)
void ProposeParentWeight(G4double finalWeight)

Referenced by SampleSecondaries().

◆ GetAdjointCrossSection()

G4double G4AdjointPhotoElectricModel::GetAdjointCrossSection ( const G4MaterialCutsCouple aCouple,
G4double  primEnergy,
G4bool  IsScatProjToProjCase 
)
virtual

Reimplemented from G4VEmAdjointModel.

Definition at line 225 of file G4AdjointPhotoElectricModel.cc.

228{ return AdjointCrossSection(aCouple,electronEnergy,IsScatProjToProjCase);
229}
virtual G4double AdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool IsScatProjToProjCase)

◆ SampleSecondaries()

void G4AdjointPhotoElectricModel::SampleSecondaries ( const G4Track aTrack,
G4bool  IsScatProjToProjCase,
G4ParticleChange fParticleChange 
)
virtual

Implements G4VEmAdjointModel.

Definition at line 70 of file G4AdjointPhotoElectricModel.cc.

73{ if (IsScatProjToProjCase) return ;
74
75 //Compute the totAdjointCS vectors if not already done for the current couple and electron energy
76 //-----------------------------------------------------------------------------------------------
77 const G4MaterialCutsCouple* aCouple = aTrack.GetMaterialCutsCouple();
78 const G4DynamicParticle* aDynPart = aTrack.GetDynamicParticle() ;
79 G4double electronEnergy = aDynPart->GetKineticEnergy();
80 G4ThreeVector electronDirection= aDynPart->GetMomentumDirection() ;
81 pre_step_AdjointCS = totAdjointCS; //The last computed CS was at pre step point
82 post_step_AdjointCS = AdjointCrossSection(aCouple, electronEnergy,IsScatProjToProjCase);
83 post_step_AdjointCS = totAdjointCS;
84
85
86
87
88 //Sample element
89 //-------------
90 const G4ElementVector* theElementVector = currentMaterial->GetElementVector();
91 size_t nelm = currentMaterial->GetNumberOfElements();
92 G4double rand_CS= G4UniformRand()*xsec[nelm-1];
93 for (index_element=0; index_element<nelm-1; index_element++){
94 if (rand_CS<xsec[index_element]) break;
95 }
96
97 //Sample shell and binding energy
98 //-------------
99 G4int nShells = (*theElementVector)[index_element]->GetNbOfAtomicShells();
100 rand_CS= shell_prob[index_element][nShells-1]*G4UniformRand();
101 G4int i = 0;
102 for (i=0; i<nShells-1; i++){
103 if (rand_CS<shell_prob[index_element][i]) break;
104 }
105 G4double gammaEnergy= electronEnergy+(*theElementVector)[index_element]->GetAtomicShell(i);
106
107 //Sample cos theta
108 //Copy of the G4PEEfectFluoModel cos theta sampling method ElecCosThetaDistribution.
109 //This method cannot be used directly from G4PEEfectFluoModel because it is a friend method. I should ask Vladimir to change that
110 //------------------------------------------------------------------------------------------------
111 //G4double cos_theta = theDirectPEEffectModel->ElecCosThetaDistribution(electronEnergy);
112
113 G4double cos_theta = 1.;
114 G4double gamma = 1. + electronEnergy/electron_mass_c2;
115 if (gamma <= 5.) {
116 G4double beta = std::sqrt(gamma*gamma-1.)/gamma;
117 G4double b = 0.5*gamma*(gamma-1.)*(gamma-2);
118
119 G4double rndm,term,greject,grejsup;
120 if (gamma < 2.) grejsup = gamma*gamma*(1.+b-beta*b);
121 else grejsup = gamma*gamma*(1.+b+beta*b);
122
123 do { rndm = 1.-2*G4UniformRand();
124 cos_theta = (rndm+beta)/(rndm*beta+1.);
125 term = 1.-beta*cos_theta;
126 greject = (1.-cos_theta*cos_theta)*(1.+b*term)/(term*term);
127 // Loop checking, 07-Aug-2015, Vladimir Ivanchenko
128 } while(greject < G4UniformRand()*grejsup);
129 }
130
131 // direction of the adjoint gamma electron
132 //---------------------------------------
133
134
135 G4double sin_theta = std::sqrt(1.-cos_theta*cos_theta);
136 G4double Phi = twopi * G4UniformRand();
137 G4double dirx = sin_theta*std::cos(Phi),diry = sin_theta*std::sin(Phi),dirz = cos_theta;
138 G4ThreeVector adjoint_gammaDirection(dirx,diry,dirz);
139 adjoint_gammaDirection.rotateUz(electronDirection);
140
141
142
143 //Weight correction
144 //-----------------------
145 CorrectPostStepWeight(fParticleChange, aTrack.GetWeight(), electronEnergy,gammaEnergy,IsScatProjToProjCase);
146
147
148
149 //Create secondary and modify fParticleChange
150 //--------------------------------------------
151 G4DynamicParticle* anAdjointGamma = new G4DynamicParticle (
152 G4AdjointGamma::AdjointGamma(),adjoint_gammaDirection, gammaEnergy);
153
154
155
156
157
158 fParticleChange->ProposeTrackStatus(fStopAndKill);
159 fParticleChange->AddSecondary(anAdjointGamma);
160
161
162
163
164}
@ fStopAndKill
#define G4UniformRand()
Definition: Randomize.hh:52
virtual void CorrectPostStepWeight(G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool IsScatProjToProjCase)
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
void AddSecondary(G4Track *aSecondary)
G4double GetWeight() const
const G4DynamicParticle * GetDynamicParticle() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
void ProposeTrackStatus(G4TrackStatus status)

◆ SetTheDirectPEEffectModel()

void G4AdjointPhotoElectricModel::SetTheDirectPEEffectModel ( G4PEEffectFluoModel aModel)
inline

Definition at line 85 of file G4AdjointPhotoElectricModel.hh.

85 {theDirectPEEffectModel = aModel;
86 DefineDirectEMModel(aModel);}
void DefineDirectEMModel(G4VEmModel *aModel)

The documentation for this class was generated from the following files: