00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef G4PENELOPERAYLEIGHMODEL_HH
00043 #define G4PENELOPERAYLEIGHMODEL_HH 1
00044
00045 #include "globals.hh"
00046 #include "G4VEmModel.hh"
00047 #include "G4DataVector.hh"
00048 #include "G4ParticleChangeForGamma.hh"
00049
00050 class G4ParticleDefinition;
00051 class G4DynamicParticle;
00052 class G4MaterialCutsCouple;
00053 class G4Material;
00054 class G4PhysicsFreeVector;
00055 class G4PenelopeSamplingData;
00056
00057 class G4PenelopeRayleighModel : public G4VEmModel
00058 {
00059
00060 public:
00061 G4PenelopeRayleighModel(const G4ParticleDefinition* p=0,
00062 const G4String& processName ="PenRayleigh");
00063
00064 virtual ~G4PenelopeRayleighModel();
00065
00066 virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
00067
00068 virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
00069 G4double kinEnergy,
00070 G4double Z,
00071 G4double A=0,
00072 G4double cut=0,
00073 G4double emax=DBL_MAX);
00074
00075 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
00076 const G4MaterialCutsCouple*,
00077 const G4DynamicParticle*,
00078 G4double tmin,
00079 G4double maxEnergy);
00080
00081 void SetVerbosityLevel(G4int lev){verboseLevel = lev;};
00082 G4int GetVerbosityLevel(){return verboseLevel;};
00083
00084
00085 void DumpFormFactorTable(const G4Material*);
00086
00087 protected:
00088 G4ParticleChangeForGamma* fParticleChange;
00089
00090 private:
00091 G4PenelopeRayleighModel& operator=(const G4PenelopeRayleighModel &right);
00092 G4PenelopeRayleighModel(const G4PenelopeRayleighModel&);
00093
00094
00095
00096 G4double fIntrinsicLowEnergyLimit;
00097 G4double fIntrinsicHighEnergyLimit;
00098
00099 G4int verboseLevel;
00100 G4bool isInitialised;
00101
00102
00103 std::map<G4int,G4PhysicsFreeVector*> *logAtomicCrossSection;
00104 std::map<G4int,G4PhysicsFreeVector*> *atomicFormFactor;
00105
00106
00107 G4DataVector logQSquareGrid;
00108 std::map<const G4Material*,G4PhysicsFreeVector*> *logFormFactorTable;
00109
00110 G4DataVector logEnergyGridPMax;
00111 std::map<const G4Material*,G4PhysicsFreeVector*> *pMaxTable;
00112
00113 std::map<const G4Material*,G4PenelopeSamplingData*> *samplingTable;
00114
00115
00116 void ReadDataFile(G4int);
00117 void ClearTables();
00118 void BuildFormFactorTable(const G4Material*);
00119 void GetPMaxTable(const G4Material*);
00120
00121 G4double GetFSquared(const G4Material*,const G4double);
00122 void InitializeSamplingAlgorithm(const G4Material*);
00123
00124 };
00125
00126 #endif
00127