Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 ////////////////////////////////////////////// << 27 // 26 // >> 27 // $Id$ >> 28 // >> 29 // >> 30 /////////////////////////////////////////////////////////////////////////// >> 31 // 28 // base class for 'fast' parametrisation model 32 // base class for 'fast' parametrisation model describing X-ray transition 29 // created in some G4Envelope. Angular distrib << 33 // created in some G4Envelope. Anglur distribuiton is very rough !!! (see DoIt 30 // method 34 // method 31 // << 35 // 32 // History: 36 // History: 33 // 06.10.05 V. Grichine first step to discret << 37 // 06.10.05 V. Grichine first step to discrete process 34 // 15.01.02 V. Grichine first version << 38 // 15.01.02 V. Grichine first version 35 // 28.07.05, P.Gumplinger add G4ProcessType to 39 // 28.07.05, P.Gumplinger add G4ProcessType to constructor 36 // 28.09.07, V.Ivanchenko general cleanup with 40 // 28.09.07, V.Ivanchenko general cleanup without change of algorithms 37 // 19.09.21, V. Grichine, set/get functions fo << 41 // 38 42 39 #ifndef G4VXTRenergyLoss_h 43 #ifndef G4VXTRenergyLoss_h 40 #define G4VXTRenergyLoss_h 1 44 #define G4VXTRenergyLoss_h 1 41 45 >> 46 #include <complex> 42 #include "globals.hh" 47 #include "globals.hh" 43 #include "G4Gamma.hh" << 48 #include "Randomize.hh" >> 49 44 #include "G4LogicalVolume.hh" 50 #include "G4LogicalVolume.hh" 45 #include "G4Material.hh" << 51 46 #include "G4ParticleChange.hh" << 47 #include "G4PhysicsTable.hh" 52 #include "G4PhysicsTable.hh" >> 53 #include "G4PhysicsLogVector.hh" >> 54 #include "G4Gamma.hh" >> 55 #include "G4ThreeVector.hh" >> 56 #include "G4ParticleMomentum.hh" 48 #include "G4Step.hh" 57 #include "G4Step.hh" 49 #include "G4Track.hh" 58 #include "G4Track.hh" >> 59 #include "G4VContinuousProcess.hh" 50 #include "G4VDiscreteProcess.hh" 60 #include "G4VDiscreteProcess.hh" >> 61 #include "G4DynamicParticle.hh" >> 62 #include "G4Material.hh" >> 63 #include "G4PhysicsTable.hh" >> 64 #include "G4MaterialPropertiesTable.hh" >> 65 #include "G4PhysicsOrderedFreeVector.hh" >> 66 #include "G4Integrator.hh" >> 67 #include "G4ParticleChange.hh" 51 68 52 class G4SandiaTable; 69 class G4SandiaTable; 53 class G4VParticleChange; 70 class G4VParticleChange; 54 class G4PhysicsFreeVector; 71 class G4PhysicsFreeVector; 55 class G4PhysicsLinearVector; 72 class G4PhysicsLinearVector; 56 class G4PhysicsLogVector; << 57 73 58 class G4VXTRenergyLoss : public G4VDiscretePro << 74 class G4VXTRenergyLoss : public G4VDiscreteProcess // G4VContinuousProcess 59 { 75 { 60 public: << 76 public: 61 explicit G4VXTRenergyLoss(G4LogicalVolume* a << 77 62 G4Material*, G4dou << 78 G4VXTRenergyLoss (G4LogicalVolume *anEnvelope,G4Material*,G4Material*, 63 const G4String& pr << 79 G4double,G4double,G4int, 64 G4ProcessType type << 80 const G4String & processName = "XTRenergyLoss", 65 virtual ~G4VXTRenergyLoss(); << 81 G4ProcessType type = fElectromagnetic); >> 82 virtual ~G4VXTRenergyLoss (); >> 83 >> 84 // These virtual has to be implemented in inherited particular TR radiators >> 85 >> 86 virtual G4double GetStackFactor( G4double energy, G4double gamma, >> 87 G4double varAngle ); 66 88 67 virtual void ProcessDescription(std::ostream << 89 G4bool IsApplicable(const G4ParticleDefinition&); 68 virtual void DumpInfo() const override { Pro << 69 90 70 G4VXTRenergyLoss(G4VXTRenergyLoss&) = delete << 91 G4VParticleChange* PostStepDoIt(const G4Track& aTrack, 71 G4VXTRenergyLoss& operator=(const G4VXTRener << 92 const G4Step& aStep); 72 93 73 // Virtual methods to be implemented in inhe << 94 G4double GetMeanFreePath(const G4Track& aTrack, 74 virtual G4double GetStackFactor(G4double ene << 95 G4double previousStepSize, 75 G4double var << 96 G4ForceCondition* condition); 76 97 77 virtual G4bool IsApplicable(const G4Particle << 98 void BuildPhysicsTable(const G4ParticleDefinition&); >> 99 void BuildEnergyTable() ; >> 100 void BuildAngleForEnergyBank() ; 78 101 79 virtual G4VParticleChange* PostStepDoIt(cons << 102 void BuildTable(){} ; 80 cons << 103 void BuildAngleTable() ; >> 104 void BuildGlobalAngleTable() ; 81 105 82 virtual G4double GetMeanFreePath(const G4Tra << 106 G4complex OneInterfaceXTRdEdx( G4double energy, 83 G4double pr << 107 G4double gamma, 84 G4ForceCond << 108 G4double varAngle ) ; 85 109 86 virtual void BuildPhysicsTable(const G4Parti << 110 G4double SpectralAngleXTRdEdx(G4double varAngle) ; 87 void BuildEnergyTable(); << 88 void BuildAngleForEnergyBank(); << 89 111 90 void BuildTable(){}; << 112 virtual G4double SpectralXTRdEdx(G4double energy) ; 91 void BuildAngleTable(); << 92 void BuildGlobalAngleTable(); << 93 113 94 G4complex OneInterfaceXTRdEdx(G4double energ << 114 G4double AngleSpectralXTRdEdx(G4double energy) ; 95 G4double varAn << 96 115 97 G4double SpectralAngleXTRdEdx(G4double varAn << 116 G4double AngleXTRdEdx(G4double varAngle) ; 98 117 99 virtual G4double SpectralXTRdEdx(G4double en << 100 118 101 G4double AngleSpectralXTRdEdx(G4double energ << 119 ///////////////////////////////////////////////////////////// 102 120 103 G4double AngleXTRdEdx(G4double varAngle); << 121 G4double OneBoundaryXTRNdensity( G4double energy, >> 122 G4double gamma, >> 123 G4double varAngle ) const ; 104 124 105 G4double OneBoundaryXTRNdensity(G4double ene << 106 G4double var << 107 125 108 // for photon energy distribution tables 126 // for photon energy distribution tables 109 G4double XTRNSpectralAngleDensity(G4double v << 110 G4double XTRNSpectralDensity(G4double energy << 111 127 >> 128 G4double XTRNSpectralAngleDensity(G4double varAngle) ; >> 129 G4double XTRNSpectralDensity(G4double energy) ; >> 130 112 // for photon angle distribution tables 131 // for photon angle distribution tables 113 G4double XTRNAngleSpectralDensity(G4double e << 114 G4double XTRNAngleDensity(G4double varAngle) << 115 132 116 void GetNumberOfPhotons(); << 133 G4double XTRNAngleSpectralDensity(G4double energy) ; >> 134 G4double XTRNAngleDensity(G4double varAngle) ; 117 135 118 // Auxiliary functions for plate/gas materia << 136 void GetNumberOfPhotons() ; 119 G4double GetPlateFormationZone(G4double, G4d << 120 G4complex GetPlateComplexFZ(G4double, G4doub << 121 void ComputePlatePhotoAbsCof(); << 122 G4double GetPlateLinearPhotoAbs(G4double); << 123 void GetPlateZmuProduct(); << 124 G4double GetPlateZmuProduct(G4double, G4doub << 125 << 126 G4double GetGasFormationZone(G4double, G4dou << 127 G4complex GetGasComplexFZ(G4double, G4double << 128 void ComputeGasPhotoAbsCof(); << 129 G4double GetGasLinearPhotoAbs(G4double); << 130 void GetGasZmuProduct(); << 131 G4double GetGasZmuProduct(G4double, G4double << 132 << 133 G4double GetPlateCompton(G4double); << 134 G4double GetGasCompton(G4double); << 135 G4double GetComptonPerAtom(G4double, G4doubl << 136 << 137 G4double GetXTRrandomEnergy(G4double scaledT << 138 G4double GetXTRenergy(G4int iPlace, G4double << 139 << 140 G4double GetRandomAngle(G4double energyXTR, << 141 G4double GetAngleXTR(G4int iTR, G4double pos << 142 << 143 // set/get methods for class fields << 144 << 145 void SetGamma(G4double gamma) { fGamma = << 146 G4double GetGamma() { return fGamma; }; << 147 void SetEnergy(G4double energy) { fEnerg << 148 G4double GetEnergy() { return fEnergy; }; << 149 void SetVarAngle(G4double varAngle) { fV << 150 G4double GetVarAngle() { return fVarAngle; } << 151 void SetCompton(G4bool pC) { fCompton = pC << 152 G4bool GetCompton() { return fCompton; }; << 153 << 154 G4int GetKrange(){ return fKrange;}; << 155 void SetKrange( G4int kk ){ fKrange = kk;}; << 156 << 157 << 158 void SetAlphaGas(G4double ag){ fAlphaGas << 159 G4double GetAlphaGas() { return fAlphaGas; } << 160 void SetAlphaPlate(G4double ap){ fAlphaP << 161 G4double GetAlphaPlate() { return fAlphaPlat << 162 << 163 void SetTheMinEnergyTR(G4double minetr){ << 164 G4double GetTheMinEnergyTR() { return fTheMi << 165 void SetTheMaxEnergyTR(G4double maxetr){ << 166 G4double GetTheMaxEnergyTR() { return fTheMa << 167 << 168 void SetMinEnergyTR(G4double minetr){ fM << 169 G4double GetMinEnergyTR() { return fMinEnerg << 170 void SetMaxEnergyTR(G4double maxetr){ fM << 171 G4double GetMaxEnergyTR() { return fMaxEnerg << 172 << 173 void SetTheMinAngle(G4double minang){ fT << 174 G4double GetTheMinAngle() { return fTheMinAn << 175 void SetTheMaxAngle(G4double maxang){ fT << 176 G4double GetTheMaxAngle() { return fTheMaxAn << 177 << 178 void SetMinThetaTR(G4double minatr){ fMi << 179 G4double GetMinThetaTR() { return fMinThetaT << 180 void SetMaxThetaTR(G4double maxatr){ fMa << 181 G4double GetMaxThetaTR() { return fMaxThetaT << 182 137 183 // modes of XTR angle distribution << 138 // Auxiliary functions for plate/gas material parameters 184 << 185 void SetFastAngle(G4bool fatr){ fFastAngle << 186 G4bool GetFastAngle() { return fFastAngle; } << 187 void SetAngleRadDistr(G4bool fatr){ fAngle << 188 G4bool GetAngleRadDistr() { return fAngleRad << 189 << 190 139 191 << 140 G4double GetPlateFormationZone(G4double,G4double,G4double); >> 141 G4complex GetPlateComplexFZ(G4double,G4double,G4double); >> 142 void ComputePlatePhotoAbsCof(); >> 143 G4double GetPlateLinearPhotoAbs(G4double); >> 144 void GetPlateZmuProduct() ; >> 145 G4double GetPlateZmuProduct(G4double,G4double,G4double); >> 146 >> 147 G4double GetGasFormationZone(G4double,G4double,G4double); >> 148 G4complex GetGasComplexFZ(G4double,G4double,G4double); >> 149 void ComputeGasPhotoAbsCof(); >> 150 G4double GetGasLinearPhotoAbs(G4double); >> 151 void GetGasZmuProduct(); >> 152 G4double GetGasZmuProduct(G4double,G4double,G4double); >> 153 >> 154 G4double GetPlateCompton(G4double); >> 155 G4double GetGasCompton(G4double); >> 156 G4double GetComptonPerAtom(G4double,G4double); >> 157 >> 158 G4double GetXTRrandomEnergy( G4double scaledTkin, G4int iTkin ); >> 159 G4double GetXTRenergy( G4int iPlace, G4double position, G4int iTransfer ); >> 160 >> 161 G4double GetRandomAngle( G4double energyXTR, G4int iTkin ); >> 162 G4double GetAngleXTR(G4int iTR,G4double position,G4int iAngle); >> 163 >> 164 G4double GetGamma() {return fGamma;}; >> 165 G4double GetEnergy() {return fEnergy;}; >> 166 G4double GetVarAngle(){return fVarAngle;}; >> 167 >> 168 void SetGamma(G4double gamma) {fGamma = gamma;}; >> 169 void SetEnergy(G4double energy) {fEnergy = energy;}; >> 170 void SetVarAngle(G4double varAngle){fVarAngle = varAngle;}; >> 171 void SetAngleRadDistr(G4bool pAngleRadDistr){fAngleRadDistr=pAngleRadDistr;}; >> 172 void SetCompton(G4bool pC){fCompton=pC;}; 192 173 193 G4PhysicsLogVector* GetProtonVector() { retu << 174 G4PhysicsLogVector* GetProtonVector(){ return fProtonEnergyVector;}; 194 G4int GetTotBin() { return fTotBin; }; << 175 G4int GetTotBin(){return fTotBin;}; 195 G4PhysicsFreeVector* GetAngleVector(G4double 176 G4PhysicsFreeVector* GetAngleVector(G4double energy, G4int n); 196 177 197 protected: << 178 protected: 198 // min TR energy << 199 G4double fTheMinEnergyTR; << 200 // max TR energy << 201 G4double fTheMaxEnergyTR; << 202 G4double fTheMinAngle; // min theta of TR << 203 G4double fTheMaxAngle; // 1.e-4; // max << 204 179 205 // static const members << 180 G4ParticleDefinition* fPtrGamma ; // pointer to TR photon 206 << 207 // min Tkin of proton in tables << 208 static constexpr G4double fMinProtonTkin = 1 << 209 // max Tkin of proton in tables << 210 static constexpr G4double fMaxProtonTkin = 1 << 211 // physical constants for plasma energy << 212 static constexpr G4double fPlasmaCof = << 213 4. * CLHEP::pi * CLHEP::fine_structure_con << 214 CLHEP::hbarc / CLHEP::electron_mass_c2; << 215 static constexpr G4double fCofTR = CLHEP::fi << 216 << 217 G4int fTotBin; // number of bins in log-ga << 218 G4int fBinTR; // number of bins in TR ene << 219 G4int fKrange; << 220 G4ParticleDefinition* fPtrGamma; // pointer << 221 << 222 G4double* fGammaCutInKineticEnergy; // TR p << 223 G4LogicalVolume* fEnvelope; << 224 G4PhysicsTable* fAngleDistrTable; << 225 G4PhysicsTable* fEnergyDistrTable; << 226 G4PhysicsTable* fAngleForEnergyTable; << 227 G4PhysicsLogVector* fProtonEnergyVector; << 228 G4PhysicsLogVector* fXTREnergyVector; << 229 G4SandiaTable* fPlatePhotoAbsCof; << 230 G4SandiaTable* fGasPhotoAbsCof; << 231 181 232 G4ParticleChange fParticleChange; << 182 G4double* fGammaCutInKineticEnergy ; // TR photon cut in energy array 233 std::vector<G4PhysicsTable*> fAngleBank; << 183 >> 184 G4double fGammaTkinCut ; // Tkin cut of TR photon in current mat. >> 185 G4LogicalVolume* fEnvelope ; >> 186 G4PhysicsTable* fAngleDistrTable ; >> 187 G4PhysicsTable* fEnergyDistrTable ; >> 188 >> 189 G4PhysicsLogVector* fProtonEnergyVector ; >> 190 G4PhysicsLogVector* fXTREnergyVector ; >> 191 >> 192 G4double fTheMinEnergyTR; // min TR energy >> 193 G4double fTheMaxEnergyTR; // max TR energy >> 194 G4double fMinEnergyTR; // min TR energy in material >> 195 G4double fMaxEnergyTR; // max TR energy in material >> 196 G4double fTheMaxAngle; // max theta of TR quanta >> 197 G4double fTheMinAngle; // max theta of TR quanta >> 198 G4double fMaxThetaTR; // max theta of TR quanta >> 199 G4int fBinTR; // number of bins in TR vectors >> 200 >> 201 G4double fMinProtonTkin; // min Tkin of proton in tables >> 202 G4double fMaxProtonTkin; // max Tkin of proton in tables >> 203 G4int fTotBin; // number of bins in log scale >> 204 G4double fGamma; // current Lorentz factor >> 205 G4double fEnergy; // energy and >> 206 G4double fVarAngle; // angle squared >> 207 G4double fLambda; >> 208 >> 209 G4double fPlasmaCof ; // physical consts for plasma energy >> 210 G4double fCofTR ; >> 211 >> 212 G4bool fExitFlux; >> 213 G4bool fAngleRadDistr; >> 214 G4bool fCompton; >> 215 G4double fSigma1; >> 216 G4double fSigma2; // plasma energy Sq of matter1/2 >> 217 >> 218 G4int fMatIndex1; >> 219 G4int fMatIndex2; >> 220 G4int fPlateNumber; 234 221 235 G4double fGammaTkinCut; // Tkin cut of TR p << 236 G4double fMinEnergyTR; // min TR energy i << 237 G4double fMaxEnergyTR; // max TR energy i << 238 G4double fMinThetaTR, fMaxThetaTR; // mi << 239 G4double fTotalDist; 222 G4double fTotalDist; 240 G4double fPlateThick; 223 G4double fPlateThick; 241 G4double fGasThick; << 224 G4double fGasThick; 242 G4double fAlphaPlate; 225 G4double fAlphaPlate; 243 G4double fAlphaGas; << 226 G4double fAlphaGas ; 244 G4double fGamma; // current Lorentz fact << 227 245 G4double fEnergy; // energy and << 228 G4SandiaTable* fPlatePhotoAbsCof; 246 G4double fVarAngle; // angle squared! << 229 247 G4double fLambda; << 230 G4SandiaTable* fGasPhotoAbsCof; 248 G4double fSigma1; << 231 249 G4double fSigma2; // plasma energy Sq of ma << 232 G4ParticleChange fParticleChange; 250 233 251 G4int fMatIndex1; << 234 // G4double fEnergyForAngle; 252 G4int fMatIndex2; << 235 // G4PhysicsLinearVector* fAngleVector; 253 G4int fPlateNumber; << 236 G4PhysicsTable* fAngleForEnergyTable; 254 << 237 std::vector<G4PhysicsTable*> fAngleBank; 255 G4bool fExitFlux; << 256 G4bool fFastAngle, fAngleRadDistr; << 257 G4bool fCompton; << 258 238 259 G4int secID = -1; // creator modelID << 260 }; 239 }; 261 240 262 #endif 241 #endif 263 242