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 // $Id: G4GoudsmitSaundersonTable.hh 93663 2015-10-28 09:50:49Z gcosmo $ 26 // 27 // 27 // ------------------------------------------- 28 // ----------------------------------------------------------------------------- 28 // 29 // 29 // GEANT4 Class header file 30 // GEANT4 Class header file 30 // 31 // 31 // File name: G4GoudsmitSaundersonTable 32 // File name: G4GoudsmitSaundersonTable 32 // 33 // 33 // Author: Mihaly Novak / (Omrane Kadri 34 // Author: Mihaly Novak / (Omrane Kadri) 34 // 35 // 35 // Creation date: 20.02.2009 36 // Creation date: 20.02.2009 36 // 37 // 37 // Class description: 38 // Class description: 38 // Class to handle multiple scattering angul 39 // Class to handle multiple scattering angular distributions precomputed by 39 // using Kawrakow-Bielajew Goudsmit-Saunders 40 // using Kawrakow-Bielajew Goudsmit-Saunderson MSC model based on the screened 40 // Rutherford DCS for elastic scattering of 41 // Rutherford DCS for elastic scattering of electrons/positrons [1,2]. This 41 // class is used by G4GoudsmitSaundersonMscM 42 // class is used by G4GoudsmitSaundersonMscModel to sample the angular 42 // deflection of electrons/positrons after t 43 // deflection of electrons/positrons after travelling a given path. 43 // 44 // 44 // Modifications: 45 // Modifications: 45 // 04.03.2009 V.Ivanchenko cleanup and format 46 // 04.03.2009 V.Ivanchenko cleanup and format according to Geant4 EM style 46 // 18.05.2015 M. Novak This class has been com 47 // 18.05.2015 M. Novak This class has been completely replaced (only the original 47 // class name was kept; class descr 48 // class name was kept; class description was also inserted): 48 // A new version of Kawrakow-Bielaj 49 // A new version of Kawrakow-Bielajew Goudsmit-Saunderson MSC model 49 // based on the screened Rutherford 50 // based on the screened Rutherford DCS for elastic scattering of 50 // electrons/positrons has been int 51 // electrons/positrons has been introduced[1,2]. The corresponding MSC 51 // angular distributions over a 2D 52 // angular distributions over a 2D parameter grid have been recomputed 52 // and the CDFs are now stored in a 53 // and the CDFs are now stored in a variable transformed (smooth) form 53 // together with the corresponding 54 // together with the corresponding rational interpolation parameters. 54 // The new version is several times 55 // The new version is several times faster, more robust and accurate 55 // compared to the earlier version 56 // compared to the earlier version (G4GoudsmitSaundersonMscModel class 56 // that use these data has been als 57 // that use these data has been also completely replaced) 57 // 28.04.2017 M. Novak: the GS angular distrib << 58 // data size has been reduced from << 59 // representation, the class has be << 60 // this new data representation. << 61 // 23.08.2017 M. Novak: Added funtionality to << 62 // base GS angular distributions an << 63 // parameter, first and second mome << 64 // activated in the GS-MSC model. << 65 // 58 // 66 // References: 59 // References: 67 // [1] A.F.Bielajew, NIMB, 111 (1996) 195-20 60 // [1] A.F.Bielajew, NIMB, 111 (1996) 195-208 68 // [2] I.Kawrakow, A.F.Bielajew, NIMB 134(19 61 // [2] I.Kawrakow, A.F.Bielajew, NIMB 134(1998) 325-336 69 // 62 // 70 // ------------------------------------------- 63 // ----------------------------------------------------------------------------- 71 64 72 << 73 #ifndef G4GoudsmitSaundersonTable_h 65 #ifndef G4GoudsmitSaundersonTable_h 74 #define G4GoudsmitSaundersonTable_h 1 66 #define G4GoudsmitSaundersonTable_h 1 75 67 76 #include <vector> 68 #include <vector> 77 69 78 #include "G4Types.hh" 70 #include "G4Types.hh" 79 71 80 class G4GSMottCorrection; << 72 class G4GoudsmitSaundersonTable 81 class G4MaterialCutsCouple; << 73 { 82 << 83 class G4GoudsmitSaundersonTable { << 84 << 85 public: 74 public: 86 G4GoudsmitSaundersonTable(G4bool iselectron) << 87 ~G4GoudsmitSaundersonTable(); << 88 << 89 void Initialise(G4double lownergylimit, G4do << 90 << 91 // structure to store one GS transformed ang << 92 struct GSMSCAngularDtr { << 93 G4int fNumData; // # of data points << 94 G4double *fUValues; // array of transfo << 95 G4double *fParamA; // array of interpo << 96 G4double *fParamB; // array of interpo << 97 }; << 98 << 99 void LoadMSCData(); << 100 << 101 G4bool Sampling(G4double lambdaval, G4doub << 102 G4double &cost, G4doub << 103 G4double beta2, G4int << 104 G4int &mcekini, G4int &mcd << 105 G4bool isfirst); << 106 << 107 G4double SampleCosTheta(G4double lambdaval, << 108 G4double lekin, << 109 GSMSCAngularDtr **gs << 110 G4double &transfPar, << 111 75 112 G4double SampleGSSRCosTheta(const GSMSCAngul << 76 G4GoudsmitSaundersonTable(){}; >> 77 ~G4GoudsmitSaundersonTable(); 113 78 114 G4double SingleScattering(G4double lambdaval << 79 // initialie: 115 G4double beta2, G4 << 80 // - loads the precomputed MSC angular CDFs into memory 116 << 81 // - init. material dependent MSC parameters (Moliere's screening) 117 GSMSCAngularDtr* GetGSAngularDtr(G4double sc << 82 // (- only Master thread and only once) 118 G4double &q << 83 void Initialise(); >> 84 >> 85 // samples cos(theta) i.e. angular deflection from the precomputed angular >> 86 // distributions in the real multiple scattering case >> 87 G4double SampleCosTheta(G4double, G4double, G4double, G4double, G4double, G4double); >> 88 G4double SampleCosThetaII(G4double, G4double, G4double, G4double, G4double, G4double); >> 89 >> 90 // returns with the screening parameter value that results with the first >> 91 // transport coefficient (G1) received as input parameter according to the >> 92 // screened Rutherford DCS. Used only when fgIsUsePWATotalXsecData is TRUE >> 93 // in G4GoudsmitSaundersonMscModel i.e. when PWA screeing is used instead of >> 94 // Moliere's one. >> 95 G4double GetScreeningParam(G4double); >> 96 >> 97 // samples angular deflection cos(theta) and sin(theta) for electrons/positrons >> 98 // involving sampling of no scattering, single scattering, "few" scattering and >> 99 // real multiple scattering >> 100 void Sampling(G4double, G4double, G4double, G4double&, G4double&); 119 101 120 // material dependent MSC parameters (comput 102 // material dependent MSC parameters (computed at initialisation) regarding 121 // Moliere's screening parameter 103 // Moliere's screening parameter 122 G4double GetMoliereBc(G4int matindx) { retu << 104 G4double GetMoliereBc(G4int matindx){return (*fgMoliereBc)[matindx];} 123 << 105 G4double GetMoliereXc2(G4int matindx){return (*fgMoliereXc2)[matindx];} 124 G4double GetMoliereXc2(G4int matindx) { retu << 125 << 126 void GetMottCorrectionFactors(G4double l << 127 G4int mati << 128 G4double & << 129 106 130 // set option to activate/inactivate Mott-co << 107 private: 131 void SetOptionMottCorrection(G4bool val) << 132 // set option to activate/inactivate PWA-cor << 133 void SetOptionPWACorrection(G4bool val) << 134 << 135 // this method returns with the scattering p << 136 // interpolated from tables prepared at init << 137 G4double ComputeScatteringPowerCorrection(co << 138 108 139 void InitSCPCorrection(); << 109 // hide assignment operator and cpy ctr. >> 110 G4GoudsmitSaundersonTable & operator=(const G4GoudsmitSaundersonTable &right); >> 111 G4GoudsmitSaundersonTable(const G4GoudsmitSaundersonTable&); >> 112 >> 113 // load precomputed CDFs of MSC angular distributions over a 2D parameter grid >> 114 // CDFs are stored in a variable transformed, equally probable intervall form >> 115 // together with the corresponding rational interpolation paraneters >> 116 void LoadMSCData(); >> 117 void LoadMSCDataII(); 140 118 141 private: << 142 // initialisation of material dependent Moli 119 // initialisation of material dependent Moliere's MSC parameters 143 void InitMoliereMSCParams(); 120 void InitMoliereMSCParams(); 144 121 >> 122 private: >> 123 //@{ >> 124 /** size of grids of some parameters */ >> 125 static const G4int fgNumLambdas = 76; /** number of \f$ s/\lambda_{e} $\f-values */ >> 126 static const G4int fgNumLamG1 = 21; /** number of \f$ s/\lambda_{e}G_{1} $\f-values */ >> 127 static const G4int fgNumLamG1II = 22; /** number of \f$ s/\lambda_{e}G_{1} $\f-values */ >> 128 static const G4int fgNumUvalues = 101; /** number of u-vaues */ >> 129 static const G4int fgNumScreeningParams = 160; /** number of A-vaues */ >> 130 //@} >> 131 >> 132 //@{ >> 133 /** girds of fixed parameter values */ >> 134 /** the grid \f$ s/\lambda_{e} $\f-values; size = fgNumLambdas = 76 */ >> 135 static const G4double fgLambdaValues[]; >> 136 /** the grid of \f$ s/\lambda_{e}G_{1} $\f-values; size = fgNumLamG1 = 11 */ >> 137 static const G4double fgLamG1Values[]; >> 138 static const G4double fgLamG1ValuesII[]; >> 139 >> 140 /** the grid of u-values; size = fgNumUvalues = 101 */ >> 141 static const G4double fgUValues[]; >> 142 //@} >> 143 >> 144 // precomputed G1(A) function as a table -> run time interpolation to determine >> 145 // the screening parameter value A that gives back the given first transport >> 146 // coefficient G1 >> 147 static const G4double fgG1Values[]; >> 148 static const G4double fgScreeningParam[]; >> 149 static const G4double fgSrcAValues[]; >> 150 static const G4double fgSrcBValues[]; >> 151 //@{ >> 152 /** Precomputed equaly probable inverse CDF-s over the 3D parameter grid plus >> 153 * precomputed parameters necessary for proper rational interpolation of the >> 154 * inverse CDF. >> 155 */ >> 156 static G4double fgInverseQ2CDFs[fgNumLambdas*fgNumLamG1*fgNumUvalues]; >> 157 static G4double fgInterParamsA2[fgNumLambdas*fgNumLamG1*fgNumUvalues]; >> 158 static G4double fgInterParamsB2[fgNumLambdas*fgNumLamG1*fgNumUvalues]; >> 159 static G4double fgInverseQ2CDFsII[fgNumLambdas*fgNumLamG1II*fgNumUvalues]; >> 160 static G4double fgInterParamsA2II[fgNumLambdas*fgNumLamG1II*fgNumUvalues]; >> 161 static G4double fgInterParamsB2II[fgNumLambdas*fgNumLamG1II*fgNumUvalues]; >> 162 >> 163 //@} 145 164 146 private: << 147 static G4bool gIsInitialised; << 148 static constexpr G4int gLAMBNUM = 64; << 149 static constexpr G4int gQNUM1 = 15; << 150 static constexpr G4int gQNUM2 = 32; << 151 static constexpr G4int gNUMSCR1 = 201; << 152 static constexpr G4int gNUMSCR2 = 51; << 153 static constexpr G4double gLAMBMIN = 1.0; << 154 static constexpr G4double gLAMBMAX = 100000 << 155 static constexpr G4double gQMIN1 = 0.001; << 156 static constexpr G4double gQMAX1 = 0.99; << 157 static constexpr G4double gQMIN2 = 0.99; << 158 static constexpr G4double gQMAX2 = 7.99; << 159 // << 160 G4bool fIsElectron; // GS-table << 161 G4bool fIsMottCorrection; // flag to i << 162 G4bool fIsPWACorrection; // flag to i << 163 G4double fLogLambda0; // ln(gLAMBM << 164 G4double fLogDeltaLambda; // ln(gLAMBM << 165 G4double fInvLogDeltaLambda; // 1/[ln(gLA << 166 G4double fInvDeltaQ1; // 1/[(gQMAX << 167 G4double fDeltaQ2; // [(gQMAX2- << 168 G4double fInvDeltaQ2; // 1/[(gQMAX << 169 // << 170 G4double fLowEnergyLimit; << 171 G4double fHighEnergyLimit; << 172 // << 173 int fNumSPCEbinPerDec; // scatterin << 174 struct SCPCorrection { << 175 bool fIsUse; // << 176 double fPrCut; // sec. e- p << 177 double fLEmin; // log min e << 178 double fILDel; // inverse l << 179 //std::vector<double> fVEkin; // scatter << 180 std::vector<double> fVSCPC; // scatterin << 181 }; << 182 std::vector<SCPCorrection*> fSCPCPerMatCut << 183 << 184 << 185 // vector to store all GS transformed angul << 186 static std::vector<GSMSCAngularDtr*> gGSMSC << 187 static std::vector<GSMSCAngularDtr*> gGSMSC << 188 165 189 //@{ 166 //@{ 190 /** Precomputed \f$ b_lambda_{c} $\f and \f 167 /** Precomputed \f$ b_lambda_{c} $\f and \f$ \chi_c^{2} $\f material dependent 191 * Moliere parameters that can be used to 168 * Moliere parameters that can be used to compute the screening parameter, 192 * the elastic scattering cross section (o 169 * the elastic scattering cross section (or \f$ \lambda_{e} $\f) under the 193 * screened Rutherford cross section appro 170 * screened Rutherford cross section approximation. (These are used in 194 * G4GoudsmitSaundersonMscModel if fgIsUse 171 * G4GoudsmitSaundersonMscModel if fgIsUsePWATotalXsecData is FALSE.) 195 */ 172 */ 196 static std::vector<double> gMoliereBc; << 173 static std::vector<G4double> *fgMoliereBc; 197 static std::vector<double> gMoliereXc2; << 174 static std::vector<G4double> *fgMoliereXc2; 198 // << 175 //@} 199 // << 176 200 G4GSMottCorrection *fMottCorrection; << 177 // flag to check if data are alredy in memory >> 178 static G4bool fgIsInitialised; >> 179 201 }; 180 }; 202 181 203 #endif 182 #endif 204 183