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 #ifndef G4LivermorePolarizedGammaConversionModel_h
00032 #define G4LivermorePolarizedGammaConversionModel_h 1
00033
00034 #include "G4VEmModel.hh"
00035 #include "G4Electron.hh"
00036 #include "G4Positron.hh"
00037 #include "G4ParticleChangeForGamma.hh"
00038 #include "G4CrossSectionHandler.hh"
00039 #include "G4LogLogInterpolation.hh"
00040 #include "G4CompositeEMDataSet.hh"
00041 #include "G4ProductionCutsTable.hh"
00042 #include "G4ForceCondition.hh"
00043
00044
00045 class G4LivermorePolarizedGammaConversionModel : public G4VEmModel
00046 {
00047
00048 public:
00049
00050 G4LivermorePolarizedGammaConversionModel(const G4ParticleDefinition* p = 0,
00051 const G4String& nam = "LivermorePolarizedGammaConversion");
00052
00053 virtual ~G4LivermorePolarizedGammaConversionModel();
00054
00055 virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&);
00056
00057 virtual G4double ComputeCrossSectionPerAtom(
00058 const G4ParticleDefinition*,
00059 G4double kinEnergy,
00060 G4double Z,
00061 G4double A=0,
00062 G4double cut=0,
00063 G4double emax=DBL_MAX);
00064
00065 virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
00066 const G4MaterialCutsCouple*,
00067 const G4DynamicParticle*,
00068 G4double tmin,
00069 G4double maxEnergy);
00070
00071 protected:
00072
00073 G4ParticleChangeForGamma* fParticleChange;
00074
00075 G4double GetMeanFreePath(const G4Track& aTrack,
00076 G4double previousStepSize,
00077 G4ForceCondition* condition);
00078 private:
00079
00080 G4double lowEnergyLimit;
00081 G4double highEnergyLimit;
00082 G4bool isInitialised;
00083 G4int verboseLevel;
00084
00085 G4VEMDataSet* meanFreePathTable;
00086 G4VCrossSectionHandler* crossSectionHandler;
00087
00088
00089
00090
00091 G4ThreeVector GetRandomPolarization(G4ThreeVector& direction0);
00092 G4ThreeVector GetPerpendicularPolarization(const G4ThreeVector& direction0, const G4ThreeVector& polarization0) const;
00093 G4ThreeVector SetPerpendicularVector(G4ThreeVector& a);
00094 void SystemOfRefChange(G4ThreeVector& direction0, G4ThreeVector& direction1,
00095 G4ThreeVector& polarization0);
00096
00097
00098
00099
00100 G4double SetPhi(G4double);
00101 G4double SetPsi(G4double, G4double);
00102
00103 G4double ScreenFunction1(G4double screenVariable);
00104 G4double ScreenFunction2(G4double screenVariable);
00105 void SetTheta(G4double*, G4double*, G4double);
00106
00107 G4double Poli(G4double , G4double, G4double, G4double);
00108 G4double Fln(G4double, G4double, G4double);
00109
00110 G4double Encu(G4double*, G4double*, G4double);
00111
00112 G4double Flor(G4double*, G4double);
00113 G4double Glor(G4double*, G4double);
00114
00115 G4double Fdlor(G4double*, G4double);
00116 G4double Fintlor(G4double*, G4double);
00117 G4double Finvlor(G4double*, G4double,G4double);
00118
00119 G4double Ftan(G4double*, G4double);
00120
00121
00122
00123 G4double Fdtan(G4double*, G4double);
00124 G4double Finttan(G4double*, G4double);
00125 G4double Finvtan(G4double*, G4double, G4double);
00126
00127 G4double smallEnergy;
00128 G4double Psi, Phi;
00129
00130
00131 G4LivermorePolarizedGammaConversionModel & operator=(const G4LivermorePolarizedGammaConversionModel &right);
00132 G4LivermorePolarizedGammaConversionModel(const G4LivermorePolarizedGammaConversionModel&);
00133
00134 };
00135
00136
00137
00138 #endif