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

#include <G4AdjointBremsstrahlungModel.hh>

+ Inheritance diagram for G4AdjointBremsstrahlungModel:

Public Member Functions

 G4AdjointBremsstrahlungModel (G4VEmModel *aModel)
 
 G4AdjointBremsstrahlungModel ()
 
 ~G4AdjointBremsstrahlungModel () override
 
void SampleSecondaries (const G4Track &aTrack, G4bool isScatProjToProj, G4ParticleChange *fParticleChange) override
 
void RapidSampleSecondaries (const G4Track &aTrack, G4bool isScatProjToProj, G4ParticleChange *fParticleChange)
 
G4double DiffCrossSectionPerVolumePrimToSecond (const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd) override
 
G4double AdjointCrossSection (const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool isScatProjToProj) override
 
 G4AdjointBremsstrahlungModel (G4AdjointBremsstrahlungModel &)=delete
 
G4AdjointBremsstrahlungModeloperator= (const G4AdjointBremsstrahlungModel &right)=delete
 
- Public Member Functions inherited from G4VEmAdjointModel
 G4VEmAdjointModel (const G4String &nam)
 
virtual ~G4VEmAdjointModel ()
 
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 DiffCrossSectionPerVolumePrimToScatPrim (const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyScatProj)
 
virtual G4double GetSecondAdjEnergyMaxForScatProjToProj (G4double primAdjEnergy)
 
virtual G4double GetSecondAdjEnergyMinForScatProjToProj (G4double primAdjEnergy, G4double tcut=0.)
 
virtual G4double GetSecondAdjEnergyMaxForProdToProj (G4double primAdjEnergy)
 
virtual G4double GetSecondAdjEnergyMinForProdToProj (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)
 
 G4VEmAdjointModel (G4VEmAdjointModel &)=delete
 
G4VEmAdjointModeloperator= (const G4VEmAdjointModel &right)=delete
 

Additional Inherited Members

- Protected Member Functions inherited from G4VEmAdjointModel
G4double DiffCrossSectionFunction1 (G4double kinEnergyProj)
 
G4double DiffCrossSectionFunction2 (G4double kinEnergyProj)
 
G4double SampleAdjSecEnergyFromCSMatrix (std::size_t MatrixIndex, G4double prim_energy, G4bool isScatProjToProj)
 
G4double SampleAdjSecEnergyFromCSMatrix (G4double prim_energy, G4bool isScatProjToProj)
 
void SelectCSMatrix (G4bool isScatProjToProj)
 
virtual G4double SampleAdjSecEnergyFromDiffCrossSectionPerAtom (G4double prim_energy, G4bool isScatProjToProj)
 
virtual void CorrectPostStepWeight (G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool isScatProjToProj)
 
- Protected Attributes inherited from G4VEmAdjointModel
G4AdjointCSManagerfCSManager
 
G4VEmModelfDirectModel = nullptr
 
const G4String fName
 
G4MaterialfSelectedMaterial = nullptr
 
G4MaterialfCurrentMaterial = nullptr
 
G4MaterialCutsCouplefCurrentCouple = nullptr
 
G4ParticleDefinitionfAdjEquivDirectPrimPart = nullptr
 
G4ParticleDefinitionfAdjEquivDirectSecondPart = nullptr
 
G4ParticleDefinitionfDirectPrimaryPart = nullptr
 
std::vector< G4AdjointCSMatrix * > * fCSMatrixProdToProjBackScat = nullptr
 
std::vector< G4AdjointCSMatrix * > * fCSMatrixProjToProjBackScat = nullptr
 
std::vector< G4doublefElementCSScatProjToProj
 
std::vector< G4doublefElementCSProdToProj
 
G4double fKinEnergyProdForIntegration = 0.
 
G4double fKinEnergyScatProjForIntegration = 0.
 
G4double fLastCS = 0.
 
G4double fLastAdjointCSForScatProjToProj = 0.
 
G4double fLastAdjointCSForProdToProj = 0.
 
G4double fPreStepEnergy = 0.
 
G4double fTcutPrim = 0.
 
G4double fTcutSecond = 0.
 
G4double fHighEnergyLimit = 0.
 
G4double fLowEnergyLimit = 0.
 
G4double fCsBiasingFactor = 1.
 
G4double fOutsideWeightFactor = 1.
 
G4int fASelectedNucleus = 0
 
G4int fZSelectedNucleus = 0
 
std::size_t fCSMatrixUsed = 0
 
G4bool fSecondPartSameType = false
 
G4bool fInModelWeightCorr
 
G4bool fApplyCutInRange = true
 
G4bool fUseMatrix = false
 
G4bool fUseMatrixPerElement = false
 
G4bool fOneMatrixForAllElements = false
 

Detailed Description

Definition at line 52 of file G4AdjointBremsstrahlungModel.hh.

Constructor & Destructor Documentation

◆ G4AdjointBremsstrahlungModel() [1/3]

G4AdjointBremsstrahlungModel::G4AdjointBremsstrahlungModel ( G4VEmModel * aModel)
explicit

Definition at line 42 of file G4AdjointBremsstrahlungModel.cc.

43 : G4VEmAdjointModel("AdjointeBremModel")
44{
45 fDirectModel = aModel;
46 Initialize();
47}
G4VEmAdjointModel(const G4String &nam)

◆ G4AdjointBremsstrahlungModel() [2/3]

G4AdjointBremsstrahlungModel::G4AdjointBremsstrahlungModel ( )

Definition at line 50 of file G4AdjointBremsstrahlungModel.cc.

51 : G4VEmAdjointModel("AdjointeBremModel")
52{
54 Initialize();
55}

◆ ~G4AdjointBremsstrahlungModel()

G4AdjointBremsstrahlungModel::~G4AdjointBremsstrahlungModel ( )
override

Definition at line 79 of file G4AdjointBremsstrahlungModel.cc.

80{
81 if(fEmModelManagerForFwdModels)
82 delete fEmModelManagerForFwdModels;
83}

◆ G4AdjointBremsstrahlungModel() [3/3]

G4AdjointBremsstrahlungModel::G4AdjointBremsstrahlungModel ( G4AdjointBremsstrahlungModel & )
delete

Member Function Documentation

◆ AdjointCrossSection()

G4double G4AdjointBremsstrahlungModel::AdjointCrossSection ( const G4MaterialCutsCouple * aCouple,
G4double primEnergy,
G4bool isScatProjToProj )
overridevirtual

Reimplemented from G4VEmAdjointModel.

Definition at line 304 of file G4AdjointBremsstrahlungModel.cc.

307{
308 static constexpr G4double maxEnergy = 100. * MeV / 2.718281828459045;
309 // 2.78.. == std::exp(1.)
310 if(!fIsDirectModelInitialised)
311 {
312 fEmModelManagerForFwdModels->Initialise(fElectron, fGamma, 0);
313 fIsDirectModelInitialised = true;
314 }
315 if(fUseMatrix)
316 return G4VEmAdjointModel::AdjointCrossSection(aCouple, primEnergy,
317 isScatProjToProj);
318 DefineCurrentMaterial(aCouple);
319 G4double Cross = 0.;
320 // this gives the constant above
322 aCouple->GetMaterial(), fDirectPrimaryPart, 100. * MeV, maxEnergy);
323
324 if(!isScatProjToProj)
325 {
326 G4double Emax_proj = GetSecondAdjEnergyMaxForProdToProj(primEnergy);
327 G4double Emin_proj = GetSecondAdjEnergyMinForProdToProj(primEnergy);
328 if(Emax_proj > Emin_proj && primEnergy > fTcutSecond)
329 Cross = fCsBiasingFactor * fLastCZ * std::log(Emax_proj / Emin_proj);
330 }
331 else
332 {
333 G4double Emax_proj = GetSecondAdjEnergyMaxForScatProjToProj(primEnergy);
334 G4double Emin_proj =
336 if(Emax_proj > Emin_proj)
337 Cross = fLastCZ * std::log((Emax_proj - primEnergy) * Emin_proj /
338 Emax_proj / (Emin_proj - primEnergy));
339 }
340 return Cross;
341}
double G4double
Definition G4Types.hh:83
const G4DataVector * Initialise(const G4ParticleDefinition *part, const G4ParticleDefinition *secPart, G4int verb)
const G4Material * GetMaterial() const
virtual G4double GetSecondAdjEnergyMaxForProdToProj(G4double primAdjEnergy)
virtual G4double GetSecondAdjEnergyMinForScatProjToProj(G4double primAdjEnergy, G4double tcut=0.)
virtual G4double GetSecondAdjEnergyMaxForScatProjToProj(G4double primAdjEnergy)
void DefineCurrentMaterial(const G4MaterialCutsCouple *couple)
virtual G4double AdjointCrossSection(const G4MaterialCutsCouple *aCouple, G4double primEnergy, G4bool isScatProjToProj)
virtual G4double GetSecondAdjEnergyMinForProdToProj(G4double primAdjEnergy)
G4ParticleDefinition * fDirectPrimaryPart
virtual G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)

◆ DiffCrossSectionPerVolumePrimToSecond()

G4double G4AdjointBremsstrahlungModel::DiffCrossSectionPerVolumePrimToSecond ( const G4Material * aMaterial,
G4double kinEnergyProj,
G4double kinEnergyProd )
overridevirtual

Reimplemented from G4VEmAdjointModel.

Definition at line 288 of file G4AdjointBremsstrahlungModel.cc.

293{
294 if(!fIsDirectModelInitialised)
295 {
296 fEmModelManagerForFwdModels->Initialise(fElectron, fGamma, 0);
297 fIsDirectModelInitialised = true;
298 }
300 aMaterial, kinEnergyProj, kinEnergyProd);
301}
virtual G4double DiffCrossSectionPerVolumePrimToSecond(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd)

Referenced by RapidSampleSecondaries().

◆ operator=()

G4AdjointBremsstrahlungModel & G4AdjointBremsstrahlungModel::operator= ( const G4AdjointBremsstrahlungModel & right)
delete

◆ RapidSampleSecondaries()

void G4AdjointBremsstrahlungModel::RapidSampleSecondaries ( const G4Track & aTrack,
G4bool isScatProjToProj,
G4ParticleChange * fParticleChange )

Definition at line 165 of file G4AdjointBremsstrahlungModel.cc.

168{
169 const G4DynamicParticle* theAdjointPrimary = aTrack.GetDynamicParticle();
171
172 G4double adjointPrimKinEnergy = theAdjointPrimary->GetKineticEnergy();
173 G4double adjointPrimTotalEnergy = theAdjointPrimary->GetTotalEnergy();
174
175 if(adjointPrimKinEnergy > GetHighEnergyLimit() * 0.999)
176 {
177 return;
178 }
179
180 G4double projectileKinEnergy = 0.;
181 G4double gammaEnergy = 0.;
182 G4double diffCSUsed = 0.;
183 if(!isScatProjToProj)
184 {
185 gammaEnergy = adjointPrimKinEnergy;
186 G4double Emax = GetSecondAdjEnergyMaxForProdToProj(adjointPrimKinEnergy);
187 G4double Emin = GetSecondAdjEnergyMinForProdToProj(adjointPrimKinEnergy);
188 if(Emin >= Emax)
189 return;
190 projectileKinEnergy = Emin * std::pow(Emax / Emin, G4UniformRand());
191 diffCSUsed = fCsBiasingFactor * fLastCZ / projectileKinEnergy;
192 }
193 else
194 {
195 G4double Emax =
196 GetSecondAdjEnergyMaxForScatProjToProj(adjointPrimKinEnergy);
197 G4double Emin =
199 if(Emin >= Emax)
200 return;
201 G4double f1 = (Emin - adjointPrimKinEnergy) / Emin;
202 G4double f2 = (Emax - adjointPrimKinEnergy) / Emax / f1;
203 projectileKinEnergy =
204 adjointPrimKinEnergy / (1. - f1 * std::pow(f2, G4UniformRand()));
205 gammaEnergy = projectileKinEnergy - adjointPrimKinEnergy;
206 diffCSUsed =
207 fLastCZ * adjointPrimKinEnergy / projectileKinEnergy / gammaEnergy;
208 }
209
210 // Weight correction:
211 // First w_corr is set to the ratio between adjoint total CS and fwd total CS
212 // if this has to be done in the model.
213 // For the case of forced interaction this will be done in the PostStepDoIt of
214 // the forced interaction. It is important to set the weight before the
215 // creation of the secondary
218 {
219 w_corr = fCSManager->GetPostStepWeightCorrection();
220 }
221
222 // Then another correction is needed due to the fact that a biaised
223 // differential CS has been used rather than the one consistent with the
224 // direct model Here we consider the true diffCS as the one obtained by the
225 // numerical differentiation over Tcut of the direct CS, corrected by the
226 // Migdal term. Basically any other differential CS could be used here
227 // (example Penelope).
229 fCurrentMaterial, projectileKinEnergy, gammaEnergy);
230 w_corr *= diffCS / diffCSUsed;
231
232 G4double new_weight = aTrack.GetWeight() * w_corr;
233 fParticleChange->SetParentWeightByProcess(false);
234 fParticleChange->SetSecondaryWeightByProcess(false);
235 fParticleChange->ProposeParentWeight(new_weight);
236
237 // Kinematic
239 G4double projectileTotalEnergy = projectileM0 + projectileKinEnergy;
240 G4double projectileP2 =
241 projectileTotalEnergy * projectileTotalEnergy - projectileM0 * projectileM0;
242 G4double projectileP = std::sqrt(projectileP2);
243
244 // Use the angular model of the forward model to generate the gamma direction
245 // Dummy dynamic particle to use the model
246 G4DynamicParticle* aDynPart =
247 new G4DynamicParticle(fElectron, G4ThreeVector(0., 0., 1.) * projectileP);
248
249 // Get the element from the direct model
251 fCurrentCouple, fElectron, projectileKinEnergy, fTcutSecond);
252 G4int Z = elm->GetZasInt();
253 G4double energy = aDynPart->GetTotalEnergy() - gammaEnergy;
254 G4ThreeVector projectileMomentum =
256 fCurrentMaterial) * projectileP;
257 G4double phi = projectileMomentum.getPhi();
258
259 if(isScatProjToProj)
260 { // the adjoint primary is the scattered e-
261 G4ThreeVector gammaMomentum =
262 (projectileTotalEnergy - adjointPrimTotalEnergy) *
263 G4ThreeVector(0., 0., 1.);
264 G4ThreeVector dirProd = projectileMomentum - gammaMomentum;
265 G4double cost1 = std::cos(dirProd.angle(projectileMomentum));
266 G4double sint1 = std::sqrt(1. - cost1 * cost1);
267 projectileMomentum =
268 G4ThreeVector(std::cos(phi) * sint1, std::sin(phi) * sint1, cost1) *
269 projectileP;
270 }
271
272 projectileMomentum.rotateUz(theAdjointPrimary->GetMomentumDirection());
273
274 if(!isScatProjToProj)
275 { // kill the primary and add a secondary
276 fParticleChange->ProposeTrackStatus(fStopAndKill);
277 fParticleChange->AddSecondary(
278 new G4DynamicParticle(fAdjEquivDirectPrimPart, projectileMomentum));
279 }
280 else
281 {
282 fParticleChange->ProposeEnergy(projectileKinEnergy);
283 fParticleChange->ProposeMomentumDirection(projectileMomentum.unit());
284 }
285}
CLHEP::Hep3Vector G4ThreeVector
@ fStopAndKill
int G4int
Definition G4Types.hh:85
#define G4UniformRand()
Definition Randomize.hh:52
Hep3Vector unit() const
double angle(const Hep3Vector &) const
double getPhi() const
Hep3Vector & rotateUz(const Hep3Vector &)
G4double DiffCrossSectionPerVolumePrimToSecond(const G4Material *aMaterial, G4double kinEnergyProj, G4double kinEnergyProd) override
G4double GetPostStepWeightCorrection()
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4double GetTotalEnergy() const
G4int GetZasInt() const
Definition G4Element.hh:120
void AddSecondary(G4Track *aSecondary)
void ProposeEnergy(G4double finalEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
G4double GetWeight() const
const G4DynamicParticle * GetDynamicParticle() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
G4ParticleDefinition * fAdjEquivDirectPrimPart
G4MaterialCutsCouple * fCurrentCouple
G4Material * fCurrentMaterial
virtual G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, const G4Material *)=0
G4VEmAngularDistribution * GetAngularDistribution()
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void ProposeTrackStatus(G4TrackStatus status)
void SetSecondaryWeightByProcess(G4bool)
void SetParentWeightByProcess(G4bool)
void ProposeParentWeight(G4double finalWeight)
G4double energy(const ThreeVector &p, const G4double m)

Referenced by SampleSecondaries().

◆ SampleSecondaries()

void G4AdjointBremsstrahlungModel::SampleSecondaries ( const G4Track & aTrack,
G4bool isScatProjToProj,
G4ParticleChange * fParticleChange )
overridevirtual

Implements G4VEmAdjointModel.

Definition at line 86 of file G4AdjointBremsstrahlungModel.cc.

89{
90 if(!fUseMatrix)
91 return RapidSampleSecondaries(aTrack, isScatProjToProj, fParticleChange);
92
93 const G4DynamicParticle* theAdjointPrimary = aTrack.GetDynamicParticle();
95
96 G4double adjointPrimKinEnergy = theAdjointPrimary->GetKineticEnergy();
97 G4double adjointPrimTotalEnergy = theAdjointPrimary->GetTotalEnergy();
98
99 if(adjointPrimKinEnergy > GetHighEnergyLimit() * 0.999)
100 {
101 return;
102 }
103
104 G4double projectileKinEnergy =
105 SampleAdjSecEnergyFromCSMatrix(adjointPrimKinEnergy, isScatProjToProj);
106
107 // Weight correction
108 CorrectPostStepWeight(fParticleChange, aTrack.GetWeight(),
109 adjointPrimKinEnergy, projectileKinEnergy,
110 isScatProjToProj);
111
112 // Kinematic
114 G4double projectileTotalEnergy = projectileM0 + projectileKinEnergy;
115 G4double projectileP2 =
116 projectileTotalEnergy * projectileTotalEnergy - projectileM0 * projectileM0;
117 G4double projectileP = std::sqrt(projectileP2);
118
119 // Angle of the gamma direction with the projectile taken from
120 // G4eBremsstrahlungModel
121 G4double u;
122 if(0.25 > G4UniformRand())
123 u = -std::log(G4UniformRand() * G4UniformRand()) / 0.625;
124 else
125 u = -std::log(G4UniformRand() * G4UniformRand()) / 1.875;
126
127 G4double theta = u * electron_mass_c2 / projectileTotalEnergy;
128 G4double sint = std::sin(theta);
129 G4double cost = std::cos(theta);
130
131 G4double phi = twopi * G4UniformRand();
132
133 G4ThreeVector projectileMomentum =
134 G4ThreeVector(std::cos(phi) * sint, std::sin(phi) * sint, cost) *
135 projectileP; // gamma frame
136 if(isScatProjToProj)
137 { // the adjoint primary is the scattered e-
138 G4ThreeVector gammaMomentum =
139 (projectileTotalEnergy - adjointPrimTotalEnergy) *
140 G4ThreeVector(0., 0., 1.);
141 G4ThreeVector dirProd = projectileMomentum - gammaMomentum;
142 G4double cost1 = std::cos(dirProd.angle(projectileMomentum));
143 G4double sint1 = std::sqrt(1. - cost1 * cost1);
144 projectileMomentum =
145 G4ThreeVector(std::cos(phi) * sint1, std::sin(phi) * sint1, cost1) *
146 projectileP;
147 }
148
149 projectileMomentum.rotateUz(theAdjointPrimary->GetMomentumDirection());
150
151 if(!isScatProjToProj)
152 { // kill the primary and add a secondary
153 fParticleChange->ProposeTrackStatus(fStopAndKill);
154 fParticleChange->AddSecondary(
155 new G4DynamicParticle(fAdjEquivDirectPrimPart, projectileMomentum));
156 }
157 else
158 {
159 fParticleChange->ProposeEnergy(projectileKinEnergy);
160 fParticleChange->ProposeMomentumDirection(projectileMomentum.unit());
161 }
162}
void RapidSampleSecondaries(const G4Track &aTrack, G4bool isScatProjToProj, G4ParticleChange *fParticleChange)
virtual void CorrectPostStepWeight(G4ParticleChange *fParticleChange, G4double old_weight, G4double adjointPrimKinEnergy, G4double projectileKinEnergy, G4bool isScatProjToProj)
G4double SampleAdjSecEnergyFromCSMatrix(std::size_t MatrixIndex, G4double prim_energy, G4bool isScatProjToProj)

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