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 // >> 28 // >> 29 /////////////////////////////////////////////////////////////////////////// >> 30 // 28 // base class for 'fast' parametrisation model 31 // base class for 'fast' parametrisation model describing X-ray transition 29 // created in some G4Envelope. Angular distrib << 32 // created in some G4Envelope. Anglur distribuiton is very rough !!! (see DoIt 30 // method 33 // method 31 // << 34 // 32 // History: 35 // History: 33 // 06.10.05 V. Grichine first step to discret << 36 // 06.10.05 V. Grichine first step to discrete process 34 // 15.01.02 V. Grichine first version << 37 // 15.01.02 V. Grichine first version 35 // 28.07.05, P.Gumplinger add G4ProcessType to 38 // 28.07.05, P.Gumplinger add G4ProcessType to constructor 36 // 28.09.07, V.Ivanchenko general cleanup with 39 // 28.09.07, V.Ivanchenko general cleanup without change of algorithms 37 // 19.09.21, V. Grichine, set/get functions fo << 40 // 38 41 39 #ifndef G4VXTRenergyLoss_h 42 #ifndef G4VXTRenergyLoss_h 40 #define G4VXTRenergyLoss_h 1 43 #define G4VXTRenergyLoss_h 1 41 44 >> 45 #include <complex> 42 #include "globals.hh" 46 #include "globals.hh" 43 #include "G4Gamma.hh" << 47 #include "Randomize.hh" >> 48 44 #include "G4LogicalVolume.hh" 49 #include "G4LogicalVolume.hh" 45 #include "G4Material.hh" << 50 46 #include "G4ParticleChange.hh" << 47 #include "G4PhysicsTable.hh" 51 #include "G4PhysicsTable.hh" >> 52 #include "G4PhysicsLogVector.hh" >> 53 #include "G4Gamma.hh" >> 54 #include "G4ThreeVector.hh" >> 55 #include "G4ParticleMomentum.hh" 48 #include "G4Step.hh" 56 #include "G4Step.hh" 49 #include "G4Track.hh" 57 #include "G4Track.hh" >> 58 #include "G4VContinuousProcess.hh" 50 #include "G4VDiscreteProcess.hh" 59 #include "G4VDiscreteProcess.hh" >> 60 #include "G4DynamicParticle.hh" >> 61 #include "G4Material.hh" >> 62 #include "G4PhysicsTable.hh" >> 63 #include "G4MaterialPropertiesTable.hh" >> 64 #include "G4PhysicsOrderedFreeVector.hh" >> 65 #include "G4Integrator.hh" >> 66 #include "G4ParticleChange.hh" 51 67 52 class G4SandiaTable; 68 class G4SandiaTable; 53 class G4VParticleChange; 69 class G4VParticleChange; 54 class G4PhysicsFreeVector; 70 class G4PhysicsFreeVector; 55 class G4PhysicsLinearVector; 71 class G4PhysicsLinearVector; 56 class G4PhysicsLogVector; << 57 72 58 class G4VXTRenergyLoss : public G4VDiscretePro << 73 class G4VXTRenergyLoss : public G4VDiscreteProcess // G4VContinuousProcess 59 { 74 { 60 public: << 75 public: 61 explicit G4VXTRenergyLoss(G4LogicalVolume* a << 76 62 G4Material*, G4dou << 77 explicit G4VXTRenergyLoss (G4LogicalVolume *anEnvelope,G4Material*, 63 const G4String& pr << 78 G4Material*, G4double,G4double,G4int, 64 G4ProcessType type << 79 const G4String & processName = "XTRenergyLoss", 65 virtual ~G4VXTRenergyLoss(); << 80 G4ProcessType type = fElectromagnetic); 66 << 81 virtual ~G4VXTRenergyLoss (); 67 virtual void ProcessDescription(std::ostream << 82 68 virtual void DumpInfo() const override { Pro << 83 // These virtual has to be implemented in inherited particular TR radiators 69 << 84 70 G4VXTRenergyLoss(G4VXTRenergyLoss&) = delete << 85 virtual G4double GetStackFactor( G4double energy, G4double gamma, 71 G4VXTRenergyLoss& operator=(const G4VXTRener << 86 G4double varAngle ); 72 << 73 // Virtual methods to be implemented in inhe << 74 virtual G4double GetStackFactor(G4double ene << 75 G4double var << 76 87 77 virtual G4bool IsApplicable(const G4Particle 88 virtual G4bool IsApplicable(const G4ParticleDefinition&) override; 78 89 79 virtual G4VParticleChange* PostStepDoIt(cons << 90 virtual G4VParticleChange* PostStepDoIt(const G4Track& aTrack, 80 cons << 91 const G4Step& aStep) override; 81 92 82 virtual G4double GetMeanFreePath(const G4Tra 93 virtual G4double GetMeanFreePath(const G4Track& aTrack, 83 G4double pr << 94 G4double previousStepSize, 84 G4ForceCond << 95 G4ForceCondition* condition) override; 85 96 86 virtual void BuildPhysicsTable(const G4Parti 97 virtual void BuildPhysicsTable(const G4ParticleDefinition&) override; 87 void BuildEnergyTable(); << 98 void BuildEnergyTable() ; 88 void BuildAngleForEnergyBank(); << 99 void BuildAngleForEnergyBank() ; >> 100 >> 101 void BuildTable(){} ; >> 102 void BuildAngleTable() ; >> 103 void BuildGlobalAngleTable() ; >> 104 >> 105 G4complex OneInterfaceXTRdEdx( G4double energy, >> 106 G4double gamma, >> 107 G4double varAngle ) ; 89 108 90 void BuildTable(){}; << 109 G4double SpectralAngleXTRdEdx(G4double varAngle) ; 91 void BuildAngleTable(); << 92 void BuildGlobalAngleTable(); << 93 110 94 G4complex OneInterfaceXTRdEdx(G4double energ << 111 virtual G4double SpectralXTRdEdx(G4double energy) ; 95 G4double varAn << 96 112 97 G4double SpectralAngleXTRdEdx(G4double varAn << 113 G4double AngleSpectralXTRdEdx(G4double energy) ; 98 114 99 virtual G4double SpectralXTRdEdx(G4double en << 115 G4double AngleXTRdEdx(G4double varAngle) ; 100 116 101 G4double AngleSpectralXTRdEdx(G4double energ << 102 117 103 G4double AngleXTRdEdx(G4double varAngle); << 118 ///////////////////////////////////////////////////////////// >> 119 >> 120 G4double OneBoundaryXTRNdensity( G4double energy, >> 121 G4double gamma, >> 122 G4double varAngle ) const ; 104 123 105 G4double OneBoundaryXTRNdensity(G4double ene << 106 G4double var << 107 124 108 // for photon energy distribution tables 125 // for photon energy distribution tables 109 G4double XTRNSpectralAngleDensity(G4double v << 110 G4double XTRNSpectralDensity(G4double energy << 111 126 >> 127 G4double XTRNSpectralAngleDensity(G4double varAngle) ; >> 128 G4double XTRNSpectralDensity(G4double energy) ; >> 129 112 // for photon angle distribution tables 130 // for photon angle distribution tables 113 G4double XTRNAngleSpectralDensity(G4double e << 114 G4double XTRNAngleDensity(G4double varAngle) << 115 131 116 void GetNumberOfPhotons(); << 132 G4double XTRNAngleSpectralDensity(G4double energy) ; >> 133 G4double XTRNAngleDensity(G4double varAngle) ; 117 134 118 // Auxiliary functions for plate/gas materia << 135 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 136 183 // modes of XTR angle distribution << 137 // 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 138 191 << 139 G4double GetPlateFormationZone(G4double,G4double,G4double); >> 140 G4complex GetPlateComplexFZ(G4double,G4double,G4double); >> 141 void ComputePlatePhotoAbsCof(); >> 142 G4double GetPlateLinearPhotoAbs(G4double); >> 143 void GetPlateZmuProduct() ; >> 144 G4double GetPlateZmuProduct(G4double,G4double,G4double); >> 145 >> 146 G4double GetGasFormationZone(G4double,G4double,G4double); >> 147 G4complex GetGasComplexFZ(G4double,G4double,G4double); >> 148 void ComputeGasPhotoAbsCof(); >> 149 G4double GetGasLinearPhotoAbs(G4double); >> 150 void GetGasZmuProduct(); >> 151 G4double GetGasZmuProduct(G4double,G4double,G4double); >> 152 >> 153 G4double GetPlateCompton(G4double); >> 154 G4double GetGasCompton(G4double); >> 155 G4double GetComptonPerAtom(G4double,G4double); >> 156 >> 157 G4double GetXTRrandomEnergy( G4double scaledTkin, G4int iTkin ); >> 158 G4double GetXTRenergy( G4int iPlace, G4double position, G4int iTransfer ); >> 159 >> 160 G4double GetRandomAngle( G4double energyXTR, G4int iTkin ); >> 161 G4double GetAngleXTR(G4int iTR,G4double position,G4int iAngle); >> 162 >> 163 G4double GetGamma() {return fGamma;}; >> 164 G4double GetEnergy() {return fEnergy;}; >> 165 G4double GetVarAngle(){return fVarAngle;}; >> 166 >> 167 void SetGamma(G4double gamma) {fGamma = gamma;}; >> 168 void SetEnergy(G4double energy) {fEnergy = energy;}; >> 169 void SetVarAngle(G4double varAngle){fVarAngle = varAngle;}; >> 170 void SetAngleRadDistr(G4bool pAngleRadDistr){fAngleRadDistr=pAngleRadDistr;}; >> 171 void SetCompton(G4bool pC){fCompton=pC;}; 192 172 193 G4PhysicsLogVector* GetProtonVector() { retu << 173 G4PhysicsLogVector* GetProtonVector(){ return fProtonEnergyVector;}; 194 G4int GetTotBin() { return fTotBin; }; << 174 G4int GetTotBin(){return fTotBin;}; 195 G4PhysicsFreeVector* GetAngleVector(G4double 175 G4PhysicsFreeVector* GetAngleVector(G4double energy, G4int n); 196 176 197 protected: << 177 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 178 205 // static const members << 179 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 180 232 G4ParticleChange fParticleChange; << 181 G4double* fGammaCutInKineticEnergy ; // TR photon cut in energy array 233 std::vector<G4PhysicsTable*> fAngleBank; << 182 >> 183 G4double fGammaTkinCut ; // Tkin cut of TR photon in current mat. >> 184 G4LogicalVolume* fEnvelope ; >> 185 G4PhysicsTable* fAngleDistrTable ; >> 186 G4PhysicsTable* fEnergyDistrTable ; >> 187 >> 188 G4PhysicsLogVector* fProtonEnergyVector ; >> 189 G4PhysicsLogVector* fXTREnergyVector ; >> 190 >> 191 G4double fTheMinEnergyTR; // min TR energy >> 192 G4double fTheMaxEnergyTR; // max TR energy >> 193 G4double fMinEnergyTR; // min TR energy in material >> 194 G4double fMaxEnergyTR; // max TR energy in material >> 195 G4double fTheMaxAngle; // max theta of TR quanta >> 196 G4double fTheMinAngle; // max theta of TR quanta >> 197 G4double fMaxThetaTR; // max theta of TR quanta >> 198 G4int fBinTR; // number of bins in TR vectors >> 199 >> 200 G4double fMinProtonTkin; // min Tkin of proton in tables >> 201 G4double fMaxProtonTkin; // max Tkin of proton in tables >> 202 G4int fTotBin; // number of bins in log scale >> 203 G4double fGamma; // current Lorentz factor >> 204 G4double fEnergy; // energy and >> 205 G4double fVarAngle; // angle squared >> 206 G4double fLambda; >> 207 >> 208 G4double fPlasmaCof ; // physical consts for plasma energy >> 209 G4double fCofTR ; >> 210 >> 211 G4bool fExitFlux; >> 212 G4bool fAngleRadDistr; >> 213 G4bool fCompton; >> 214 G4double fSigma1; >> 215 G4double fSigma2; // plasma energy Sq of matter1/2 >> 216 >> 217 G4int fMatIndex1; >> 218 G4int fMatIndex2; >> 219 G4int fPlateNumber; 234 220 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; 221 G4double fTotalDist; 240 G4double fPlateThick; 222 G4double fPlateThick; 241 G4double fGasThick; << 223 G4double fGasThick; 242 G4double fAlphaPlate; 224 G4double fAlphaPlate; 243 G4double fAlphaGas; << 225 G4double fAlphaGas ; 244 G4double fGamma; // current Lorentz fact << 226 245 G4double fEnergy; // energy and << 227 G4SandiaTable* fPlatePhotoAbsCof; 246 G4double fVarAngle; // angle squared! << 228 247 G4double fLambda; << 229 G4SandiaTable* fGasPhotoAbsCof; 248 G4double fSigma1; << 230 249 G4double fSigma2; // plasma energy Sq of ma << 231 G4ParticleChange fParticleChange; >> 232 >> 233 G4PhysicsTable* fAngleForEnergyTable; >> 234 std::vector<G4PhysicsTable*> fAngleBank; >> 235 >> 236 private: 250 237 251 G4int fMatIndex1; << 238 // copy constructor and hide assignment operator 252 G4int fMatIndex2; << 239 G4VXTRenergyLoss(G4VXTRenergyLoss &) = delete; 253 G4int fPlateNumber; << 240 G4VXTRenergyLoss & operator=(const G4VXTRenergyLoss &right) = delete; 254 << 255 G4bool fExitFlux; << 256 G4bool fFastAngle, fAngleRadDistr; << 257 G4bool fCompton; << 258 241 259 G4int secID = -1; // creator modelID << 260 }; 242 }; 261 243 262 #endif 244 #endif 263 245