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 // $Id: G4OpticalSurface.hh 104459 2017-05-31 15:54:52Z gcosmo $ >> 28 // >> 29 // 26 ////////////////////////////////////////////// 30 //////////////////////////////////////////////////////////////////////// 27 // G4OpticalSurface Definition 31 // G4OpticalSurface Definition 28 ////////////////////////////////////////////// 32 //////////////////////////////////////////////////////////////////////// 29 // 33 // 30 // File: G4OpticalSurface.hh 34 // File: G4OpticalSurface.hh 31 // Description: A optical surface class for us 35 // Description: A optical surface class for use in G4OpBoundaryProcess 32 // Version: 2.0 36 // Version: 2.0 33 // Created: 1997-06-26 37 // Created: 1997-06-26 34 // Author: Peter Gumplinger 38 // Author: Peter Gumplinger 35 // Updated: 1999-10-29 add method and clas 39 // Updated: 1999-10-29 add method and class descriptors 36 // 2017-02-24 Mariele Stockhoff a << 40 // 2017-02-24 Mariele Stockhoff add DAVIS model >> 41 // mail: gum@triumf.ca 37 // 42 // 38 // Class Description: << 39 // A optical surface class for use in the G4Op << 40 // Contains the enumerations: G4OpticalSurface << 41 // and G4OpticalSurfaceModel. << 42 ////////////////////////////////////////////// 43 //////////////////////////////////////////////////////////////////////// 43 44 44 #ifndef G4OpticalSurface_h 45 #ifndef G4OpticalSurface_h 45 #define G4OpticalSurface_h 1 46 #define G4OpticalSurface_h 1 46 47 >> 48 ///////////// >> 49 // Includes >> 50 ///////////// >> 51 >> 52 #include "G4Types.hh" 47 #include "G4Physics2DVector.hh" 53 #include "G4Physics2DVector.hh" 48 #include "G4SurfaceProperty.hh" 54 #include "G4SurfaceProperty.hh" 49 #include "G4Types.hh" << 50 55 51 // clang-format off << 56 // Class Description: >> 57 // A optical surface class for use in the G4OpBoundaryProcess class. >> 58 // Contains the enumerations: G4OpticalSurfaceFinish, G4OpticalSurfaceType, >> 59 // and G4OpticalSurfaceModel. >> 60 // Class Description - End: >> 61 52 enum G4OpticalSurfaceFinish 62 enum G4OpticalSurfaceFinish 53 { 63 { 54 polished, // smooth perfectly p << 64 polished, // smooth perfectly polished surface 55 polishedfrontpainted, // smooth top-layer ( << 65 polishedfrontpainted, // smooth top-layer (front) paint 56 polishedbackpainted, // same is 'polished' << 66 polishedbackpainted, // same is 'polished' but with a back-paint 57 << 67 58 ground, // rough surface << 68 ground, // rough surface 59 groundfrontpainted, // rough top-layer (fro << 69 groundfrontpainted, // rough top-layer (front) paint 60 groundbackpainted, // same as 'ground' but << 70 groundbackpainted, // same as 'ground' but with a back-paint 61 << 71 62 // for LBNL LUT model << 72 polishedlumirrorair, // mechanically polished surface, with lumirror 63 polishedlumirrorair, // mechanically polis << 73 polishedlumirrorglue, // mechanically polished surface, with lumirror & meltmount 64 polishedlumirrorglue, // mechanically polis << 74 polishedair, // mechanically polished surface 65 // meltmount << 75 polishedteflonair, // mechanically polished surface, with teflon 66 polishedair, // mechanically polis << 76 polishedtioair, // mechanically polished surface, with tio paint 67 polishedteflonair, // mechanically polis << 77 polishedtyvekair, // mechanically polished surface, with tyvek 68 polishedtioair, // mechanically polis << 78 polishedvm2000air, // mechanically polished surface, with esr film 69 polishedtyvekair, // mechanically polis << 79 polishedvm2000glue, // mechanically polished surface, with esr film & meltmount 70 polishedvm2000air, // mechanically polis << 80 71 polishedvm2000glue, // mechanically polis << 81 etchedlumirrorair, // chemically etched surface, with lumirror 72 // meltmount << 82 etchedlumirrorglue, // chemically etched surface, with lumirror & meltmount 73 << 83 etchedair, // chemically etched surface 74 etchedlumirrorair, // chemically etched su << 84 etchedteflonair, // chemically etched surface, with teflon 75 etchedlumirrorglue, // chemically etched su << 85 etchedtioair, // chemically etched surface, with tio paint 76 etchedair, // chemically etched su << 86 etchedtyvekair, // chemically etched surface, with tyvek 77 etchedteflonair, // chemically etched su << 87 etchedvm2000air, // chemically etched surface, with esr film 78 etchedtioair, // chemically etched su << 88 etchedvm2000glue, // chemically etched surface, with esr film & meltmount 79 etchedtyvekair, // chemically etched su << 89 80 etchedvm2000air, // chemically etched su << 90 groundlumirrorair, // rough-cut surface, with lumirror 81 etchedvm2000glue, // chemically etched su << 91 groundlumirrorglue, // rough-cut surface, with lumirror & meltmount 82 << 92 groundair, // rough-cut surface 83 groundlumirrorair, // rough-cut surface, w << 93 groundteflonair, // rough-cut surface, with teflon 84 groundlumirrorglue, // rough-cut surface, w << 94 groundtioair, // rough-cut surface, with tio paint 85 groundair, // rough-cut surface << 95 groundtyvekair, // rough-cut surface, with tyvek 86 groundteflonair, // rough-cut surface, w << 96 groundvm2000air, // rough-cut surface, with esr film 87 groundtioair, // rough-cut surface, w << 97 groundvm2000glue, // rough-cut surface, with esr film & meltmount 88 groundtyvekair, // rough-cut surface, w << 98 89 groundvm2000air, // rough-cut surface, w << 99 // for DAVIS model 90 groundvm2000glue, // rough-cut surface, w << 100 Rough_LUT, //rough surface 91 << 101 RoughTeflon_LUT, //rough surface wrapped in Teflon tape 92 // for DAVIS model << 102 RoughESR_LUT, //rough surface wrapped with ESR 93 Rough_LUT, // rough surface << 103 RoughESRGrease_LUT, //rough surface wrapped with ESR 94 RoughTeflon_LUT, // rough surface wra << 104 //and coupled with opical grease 95 RoughESR_LUT, // rough surface wra << 105 Polished_LUT, //polished surface 96 RoughESRGrease_LUT, // rough surface wra << 106 PolishedTeflon_LUT, //polished surface wrapped in Teflon tape 97 // and coupled with << 107 PolishedESR_LUT, //polished surface wrapped with ESR 98 Polished_LUT, // polished surface << 108 PolishedESRGrease_LUT, //polished surface wrapped with ESR 99 PolishedTeflon_LUT, // polished surface << 109 //and coupled with opical grease 100 PolishedESR_LUT, // polished surface << 110 Detector_LUT //polished surface with optical grease 101 PolishedESRGrease_LUT, // polished surface << 102 // and coupled with << 103 Detector_LUT // polished surface << 104 }; 111 }; 105 112 106 enum G4OpticalSurfaceModel 113 enum G4OpticalSurfaceModel 107 { 114 { 108 glisur, // original GEANT3 model << 115 glisur, // original GEANT3 model 109 unified, // UNIFIED model << 116 unified, // UNIFIED model 110 LUT, // Look-Up-Table model (LBNL model << 117 LUT, // Look-Up-Table model 111 DAVIS, // DAVIS model << 118 DAVIS, // DAVIS model 112 dichroic // dichroic filter << 119 dichroic // dichroic filter 113 }; 120 }; 114 121 115 // clang-format on << 116 << 117 class G4MaterialPropertiesTable; 122 class G4MaterialPropertiesTable; 118 123 >> 124 ///////////////////// >> 125 // Class Definition >> 126 ///////////////////// >> 127 119 class G4OpticalSurface : public G4SurfacePrope 128 class G4OpticalSurface : public G4SurfaceProperty 120 { 129 { 121 public: << 122 // Constructor of an optical surface object. << 123 G4OpticalSurface(const G4String& name, G4Opt << 124 G4OpticalSurfaceFinish finish = polished, << 125 G4double value = 1.0); << 126 << 127 ~G4OpticalSurface() override; << 128 << 129 G4OpticalSurface(const G4OpticalSurface& rig << 130 G4OpticalSurface& operator=(const G4OpticalS << 131 << 132 G4bool operator==(const G4OpticalSurface& ri << 133 G4bool operator!=(const G4OpticalSurface& ri << 134 << 135 void SetType(const G4SurfaceType& type) over << 136 << 137 // Returns the optical surface finish. << 138 inline G4OpticalSurfaceFinish GetFinish() co << 139 << 140 // Sets the optical surface finish. << 141 void SetFinish(const G4OpticalSurfaceFinish) << 142 << 143 // Returns the optical surface model used. << 144 inline G4OpticalSurfaceModel GetModel() cons << 145 << 146 // Sets the optical surface model to be foll << 147 inline void SetModel(const G4OpticalSurfaceM << 148 << 149 // Returns an unified model surface paramete << 150 inline G4double GetSigmaAlpha() const { retu << 151 130 152 // Sets an unified model surface parameter. << 131 public: // Without description 153 inline void SetSigmaAlpha(const G4double s_a << 132 154 << 133 ////////////// 155 // Returns the optical surface polish type. << 134 // Operators 156 G4double GetPolish() const { return polish; << 135 ////////////// 157 << 136 158 // Sets the optical surface polish type. << 137 G4OpticalSurface(const G4OpticalSurface &right); 159 inline void SetPolish(const G4double plsh) { << 138 G4OpticalSurface & operator=(const G4OpticalSurface &right); 160 << 139 161 // Retrieves the pointer of the G4MaterialPr << 140 G4int operator==(const G4OpticalSurface &right) const; 162 // attached to optical surface. << 141 G4int operator!=(const G4OpticalSurface &right) const; 163 inline G4MaterialPropertiesTable* GetMateria << 142 164 { << 143 public: // With description 165 return theMaterialPropertiesTable; << 144 166 } << 145 //////////////////////////////// 167 << 146 // Constructors and Destructor 168 // Attaches a G4MaterialPropertiesTable to t << 147 //////////////////////////////// 169 inline void SetMaterialPropertiesTable(G4Mat << 148 170 { << 149 G4OpticalSurface(const G4String& name, 171 theMaterialPropertiesTable = anMPT; << 150 G4OpticalSurfaceModel model = glisur, 172 } << 151 G4OpticalSurfaceFinish finish = polished, 173 << 152 G4SurfaceType type = dielectric_dielectric, 174 // Prints information about the optical surf << 153 G4double value = 1.0); 175 void DumpInfo() const; << 154 // Constructor of an optical surface object. 176 << 155 177 // call the correct ReadXXXFile << 156 public: // Without description 178 void ReadDataFile(); << 157 179 << 158 virtual ~G4OpticalSurface(); 180 // read a zlib-compressed file << 159 181 void ReadCompressedFile(const G4String&, std << 160 //////////// 182 << 161 // Methods 183 // Method to read the Look-Up-Table into arr << 162 //////////// 184 void ReadLUTFile(); << 163 185 << 164 // public methods 186 // for DAVIS model << 165 187 inline G4double GetAngularDistributionValue( << 166 public: // With description 188 << 167 189 // Returns the AngularDistributionValue << 168 void SetType(const G4SurfaceType& type); 190 inline G4double GetAngularDistributionValueL << 169 191 << 170 inline G4OpticalSurfaceFinish GetFinish() const { return theFinish; } 192 // Method to read the Davis Look-Up-Table in << 171 // Returns the optical surface finish. 193 void ReadLUTDAVISFile(); << 172 void SetFinish(const G4OpticalSurfaceFinish ); 194 << 173 // Sets the optical surface finish. 195 // Method to read the Look-Up-Table for refl << 174 196 void ReadReflectivityLUTFile(); << 175 inline G4OpticalSurfaceModel GetModel() const { return theModel; } 197 << 176 // Returns the optical surface model used. 198 // Returns the reflectivity value from the D << 177 inline void SetModel(const G4OpticalSurfaceModel model) 199 inline G4double GetReflectivityLUTValue(G4in << 178 { theModel = model; } 200 << 179 // Sets the optical surface model to be followed. 201 // Returns the number of lines in the Davis << 180 202 G4int GetInmax() const; << 181 inline G4double GetSigmaAlpha() const { return sigma_alpha; } 203 << 182 // Returns an unified model surface parameter. 204 // Returns the number of probability values << 183 inline void SetSigmaAlpha(const G4double s_a) { sigma_alpha = s_a; } 205 G4int GetLUTbins() const; << 184 // Sets an unified model surface parameter. 206 << 185 207 // Returns the number of reflectivity values << 186 G4double GetPolish() const { return polish; } 208 G4int GetRefMax() const; << 187 // Returns the optical surface polish type. 209 << 188 inline void SetPolish(const G4double plsh) { polish=plsh; } 210 G4int GetThetaIndexMax() const; << 189 // Sets the optical surface polish type. 211 G4int GetPhiIndexMax() const; << 190 212 << 191 inline G4MaterialPropertiesTable* GetMaterialPropertiesTable() const 213 // Method to read the dichroic surface data << 192 { return theMaterialPropertiesTable; } 214 void ReadDichroicFile(); << 193 // Retrieves the pointer of the G4MaterialPropertiesTable 215 << 194 // attached to optical surface. 216 inline G4Physics2DVector* GetDichroicVector( << 195 217 << 196 inline void SetMaterialPropertiesTable(G4MaterialPropertiesTable *anMPT) 218 private: << 197 { theMaterialPropertiesTable = anMPT; } 219 G4OpticalSurfaceModel theModel; // Surface << 198 // Attaches a G4MaterialPropertiesTable to the optical surface. 220 G4OpticalSurfaceFinish theFinish; // Surfac << 199 221 << 200 void DumpInfo() const; 222 G4double sigma_alpha; // The sigma of micro << 201 // Prints information about the optical surface. 223 G4double polish; // Polish parameter in gli << 202 224 << 203 void ReadLUTFile(void); 225 G4MaterialPropertiesTable* theMaterialProper << 204 // Method to read the Look-Up-Table into array AngularDistribution 226 << 205 227 static const G4int incidentIndexMax = 91; << 206 inline G4double GetAngularDistributionValue(G4int, G4int, G4int); 228 static const G4int thetaIndexMax = 45; << 207 229 static const G4int phiIndexMax = 37; << 208 // for DAVIS model 230 << 209 231 G4float* AngularDistribution; << 210 inline G4double GetAngularDistributionValueLUT(G4int); 232 G4Physics2DVector* DichroicVector; << 211 // Returns the AngularDistributionValue 233 << 212 234 // for DAVIS model << 213 void ReadLUTDAVISFile(void); 235 static const G4int indexmax = 7280001; // 3 << 214 // Method to read the Davis Look-Up-Table into array AngularDistribution 236 static const G4int RefMax = 90; << 215 237 static const G4int LUTbins = 20000; << 216 void ReadReflectivityLUTFile(void); 238 G4float* AngularDistributionLUT; << 217 // Method to read the Look-Up-Table for reflectivity 239 G4float* Reflectivity; << 218 >> 219 inline G4double GetReflectivityLUTValue(G4int); >> 220 // Returns the reflectivity value from the Davis Look-Up-Table >> 221 >> 222 inline G4int GetInmax(void) const { return indexmax; } >> 223 // Returns the number of lines in the Davis Look-Up-Table >> 224 >> 225 inline G4int GetLUTbins(void) const { return LUTbins; } >> 226 // Returns the number of probability values per incidentangle >> 227 >> 228 inline G4int GetRefMax(void) const { return RefMax; } >> 229 // Returns the number of reflectivity values per angle >> 230 >> 231 inline G4int GetThetaIndexMax(void) const { return thetaIndexMax; } >> 232 inline G4int GetPhiIndexMax(void) const { return phiIndexMax; } >> 233 >> 234 void ReadDichroicFile(void); >> 235 // Method to read the dichroic surface data file into Dichroic >> 236 >> 237 inline G4Physics2DVector* GetDichroicVector(); >> 238 >> 239 private: >> 240 >> 241 // ------------------ >> 242 // Basic data members ( To define an optical surface) >> 243 // ------------------ >> 244 >> 245 G4OpticalSurfaceModel theModel; // Surface model >> 246 G4OpticalSurfaceFinish theFinish; // Surface finish >> 247 >> 248 G4double sigma_alpha; // The sigma of micro-facet polar angle >> 249 G4double polish; // Polish parameter in glisur model >> 250 >> 251 G4MaterialPropertiesTable* theMaterialPropertiesTable; >> 252 >> 253 static const G4int incidentIndexMax = 91; >> 254 static const G4int thetaIndexMax = 45; >> 255 static const G4int phiIndexMax = 37; >> 256 >> 257 G4float* AngularDistribution; >> 258 G4Physics2DVector* DichroicVector; >> 259 >> 260 // for DAVIS model >> 261 static const G4int indexmax = 7280001; // 3640001; >> 262 static const G4int RefMax = 90; >> 263 static const G4int LUTbins =20000; >> 264 G4float* AngularDistributionLUT; >> 265 G4float* Reflectivity; 240 }; 266 }; 241 267 242 //////////////////// 268 //////////////////// 243 // Inline methods 269 // Inline methods 244 //////////////////// 270 //////////////////// 245 271 246 inline G4double G4OpticalSurface::GetAngularDi << 272 inline 247 G4int angleIncident, G4int thetaIndex, G4int << 273 G4double G4OpticalSurface::GetAngularDistributionValue(G4int angleIncident, >> 274 G4int thetaIndex, >> 275 G4int phiIndex) 248 { 276 { 249 G4int product = angleIncident * thetaIndex * << 277 return AngularDistribution[angleIncident+ 250 if (product < 0 || product >= incidentIndexM << 278 thetaIndex*incidentIndexMax+ 251 G4ExceptionDescription ed; << 279 phiIndex*thetaIndexMax*incidentIndexMax]; 252 ed << "Index angleIncident: " << angleInci << 253 << " phiIndex: " << phiIndex << " out o << 254 G4Exception("G4OpticalSurface::GetAngularD << 255 return 0.; << 256 } << 257 return (G4double)AngularDistribution[angleIn << 258 phiInde << 259 } 280 } 260 281 261 inline G4double G4OpticalSurface::GetAngularDi << 282 inline >> 283 G4double G4OpticalSurface::GetAngularDistributionValueLUT(G4int i) 262 { 284 { 263 if (i < 0 || i >= indexmax) { << 285 return AngularDistributionLUT[i]; 264 G4ExceptionDescription ed; << 265 ed << "Index " << i << " out of range!"; << 266 G4Exception("G4OpticalSurface::GetAngularD << 267 return 0.; << 268 } << 269 return (G4double)AngularDistributionLUT[i]; << 270 } 286 } 271 287 272 inline G4double G4OpticalSurface::GetReflectiv << 288 inline >> 289 G4double G4OpticalSurface::GetReflectivityLUTValue(G4int i) 273 { 290 { 274 if (i < 0 || i >= RefMax) { << 291 return Reflectivity[i]; 275 G4ExceptionDescription ed; << 276 ed << "Index " << i << " out of range!"; << 277 G4Exception("G4OpticalSurface::GetReflecti << 278 return 0.; << 279 } << 280 return (G4double)Reflectivity[i]; << 281 } 292 } 282 293 283 inline G4Physics2DVector* G4OpticalSurface::Ge << 294 inline >> 295 G4Physics2DVector* G4OpticalSurface::GetDichroicVector() >> 296 { >> 297 return DichroicVector; >> 298 } 284 299 285 #endif /* G4OpticalSurface_h */ 300 #endif /* G4OpticalSurface_h */ 286 301