Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4OpticalSurface.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25
26////////////////////////////////////////////////////////////////////////
27// G4OpticalSurface Definition
28////////////////////////////////////////////////////////////////////////
29//
30// File: G4OpticalSurface.hh
31// Description: A optical surface class for use in G4OpBoundaryProcess
32// Version: 2.0
33// Created: 1997-06-26
34// Author: Peter Gumplinger
35// Updated: 1999-10-29 add method and class descriptors
36// 2017-02-24 Mariele Stockhoff add DAVIS model
37//
38// Class Description:
39// A optical surface class for use in the G4OpBoundaryProcess class.
40// Contains the enumerations: G4OpticalSurfaceFinish, G4OpticalSurfaceType,
41// and G4OpticalSurfaceModel.
42////////////////////////////////////////////////////////////////////////
43
44#ifndef G4OpticalSurface_h
45#define G4OpticalSurface_h 1
46
47#include "G4Physics2DVector.hh"
48#include "G4SurfaceProperty.hh"
49#include "G4Types.hh"
50
51// clang-format off
53{
54 polished, // smooth perfectly polished surface
55 polishedfrontpainted, // smooth top-layer (front) paint
56 polishedbackpainted, // same is 'polished' but with a back-paint
57
58 ground, // rough surface
59 groundfrontpainted, // rough top-layer (front) paint
60 groundbackpainted, // same as 'ground' but with a back-paint
61
62 // for LBNL LUT model
63 polishedlumirrorair, // mechanically polished surface, with lumirror
64 polishedlumirrorglue, // mechanically polished surface, with lumirror &
65 // meltmount
66 polishedair, // mechanically polished surface
67 polishedteflonair, // mechanically polished surface, with teflon
68 polishedtioair, // mechanically polished surface, with tio paint
69 polishedtyvekair, // mechanically polished surface, with tyvek
70 polishedvm2000air, // mechanically polished surface, with esr film
71 polishedvm2000glue, // mechanically polished surface, with esr film &
72 // meltmount
73
74 etchedlumirrorair, // chemically etched surface, with lumirror
75 etchedlumirrorglue, // chemically etched surface, with lumirror & meltmount
76 etchedair, // chemically etched surface
77 etchedteflonair, // chemically etched surface, with teflon
78 etchedtioair, // chemically etched surface, with tio paint
79 etchedtyvekair, // chemically etched surface, with tyvek
80 etchedvm2000air, // chemically etched surface, with esr film
81 etchedvm2000glue, // chemically etched surface, with esr film & meltmount
82
83 groundlumirrorair, // rough-cut surface, with lumirror
84 groundlumirrorglue, // rough-cut surface, with lumirror & meltmount
85 groundair, // rough-cut surface
86 groundteflonair, // rough-cut surface, with teflon
87 groundtioair, // rough-cut surface, with tio paint
88 groundtyvekair, // rough-cut surface, with tyvek
89 groundvm2000air, // rough-cut surface, with esr film
90 groundvm2000glue, // rough-cut surface, with esr film & meltmount
91
92 // for DAVIS model
93 Rough_LUT, // rough surface
94 RoughTeflon_LUT, // rough surface wrapped in Teflon tape
95 RoughESR_LUT, // rough surface wrapped with ESR
96 RoughESRGrease_LUT, // rough surface wrapped with ESR
97 // and coupled with optical grease
98 Polished_LUT, // polished surface
99 PolishedTeflon_LUT, // polished surface wrapped in Teflon tape
100 PolishedESR_LUT, // polished surface wrapped with ESR
101 PolishedESRGrease_LUT, // polished surface wrapped with ESR
102 // and coupled with optical grease
103 Detector_LUT // polished surface with optical grease
105
107{
108 glisur, // original GEANT3 model
109 unified, // UNIFIED model
110 LUT, // Look-Up-Table model (LBNL model)
111 DAVIS, // DAVIS model
112 dichroic // dichroic filter
114
115// clang-format on
116
118
120{
121 public:
122 // Constructor of an optical surface object.
125 G4double value = 1.0);
126
127 ~G4OpticalSurface() override;
128
131
132 G4bool operator==(const G4OpticalSurface& right) const;
133 G4bool operator!=(const G4OpticalSurface& right) const;
134
135 void SetType(const G4SurfaceType& type) override;
136
137 // Returns the optical surface finish.
138 inline G4OpticalSurfaceFinish GetFinish() const { return theFinish; }
139
140 // Sets the optical surface finish.
142
143 // Returns the optical surface model used.
144 inline G4OpticalSurfaceModel GetModel() const { return theModel; }
145
146 // Sets the optical surface model to be followed.
147 inline void SetModel(const G4OpticalSurfaceModel model) { theModel = model; }
148
149 // Returns an unified model surface parameter.
150 inline G4double GetSigmaAlpha() const { return sigma_alpha; }
151
152 // Sets an unified model surface parameter.
153 inline void SetSigmaAlpha(const G4double s_a) { sigma_alpha = s_a; }
154
155 // Returns the optical surface polish type.
156 G4double GetPolish() const { return polish; }
157
158 // Sets the optical surface polish type.
159 inline void SetPolish(const G4double plsh) { polish = plsh; }
160
161 // Retrieves the pointer of the G4MaterialPropertiesTable
162 // attached to optical surface.
164 {
165 return theMaterialPropertiesTable;
166 }
167
168 // Attaches a G4MaterialPropertiesTable to the optical surface.
170 {
171 theMaterialPropertiesTable = anMPT;
172 }
173
174 // Prints information about the optical surface.
175 void DumpInfo() const;
176
177 // call the correct ReadXXXFile
178 void ReadDataFile();
179
180 // read a zlib-compressed file
181 void ReadCompressedFile(const G4String&, std::istringstream&);
182
183 // Method to read the Look-Up-Table into array AngularDistribution
184 void ReadLUTFile();
185
186 // for DAVIS model
188
189 // Returns the AngularDistributionValue
191
192 // Method to read the Davis Look-Up-Table into array AngularDistribution
193 void ReadLUTDAVISFile();
194
195 // Method to read the Look-Up-Table for reflectivity
197
198 // Returns the reflectivity value from the Davis Look-Up-Table
200
201 // Returns the number of lines in the Davis Look-Up-Table
202 G4int GetInmax() const;
203
204 // Returns the number of probability values per incidentangle
205 G4int GetLUTbins() const;
206
207 // Returns the number of reflectivity values per angle
208 G4int GetRefMax() const;
209
210 G4int GetThetaIndexMax() const;
211 G4int GetPhiIndexMax() const;
212
213 // Method to read the dichroic surface data file into Dichroic
214 void ReadDichroicFile();
215
217
218 private:
219 G4OpticalSurfaceModel theModel; // Surface model
220 G4OpticalSurfaceFinish theFinish; // Surface finish
221
222 G4double sigma_alpha; // The sigma of micro-facet polar angle
223 G4double polish; // Polish parameter in glisur model
224
225 G4MaterialPropertiesTable* theMaterialPropertiesTable{nullptr};
226
227 static const G4int incidentIndexMax = 91;
228 static const G4int thetaIndexMax = 45;
229 static const G4int phiIndexMax = 37;
230
231 G4float* AngularDistribution;
232 G4Physics2DVector* DichroicVector;
233
234 // for DAVIS model
235 static const G4int indexmax = 7280001; // 3640001;
236 static const G4int RefMax = 90;
237 static const G4int LUTbins = 20000;
238 G4float* AngularDistributionLUT;
239 G4float* Reflectivity;
240};
241
242////////////////////
243// Inline methods
244////////////////////
245
247 G4int angleIncident, G4int thetaIndex, G4int phiIndex)
248{
249 G4int product = angleIncident * thetaIndex * phiIndex;
250 if (product < 0 || product >= incidentIndexMax * thetaIndexMax * phiIndexMax) {
252 ed << "Index angleIncident: " << angleIncident << " thetaIndex: " << thetaIndex
253 << " phiIndex: " << phiIndex << " out of range!";
254 G4Exception("G4OpticalSurface::GetAngularDistributionValue", "mat317", FatalException, ed);
255 return 0.;
256 }
257 return (G4double)AngularDistribution[angleIncident + thetaIndex * incidentIndexMax +
258 phiIndex * thetaIndexMax * incidentIndexMax];
259}
260
262{
263 if (i < 0 || i >= indexmax) {
265 ed << "Index " << i << " out of range!";
266 G4Exception("G4OpticalSurface::GetAngularDistributionValueLUT", "mat318", FatalException, ed);
267 return 0.;
268 }
269 return (G4double)AngularDistributionLUT[i];
270}
271
273{
274 if (i < 0 || i >= RefMax) {
276 ed << "Index " << i << " out of range!";
277 G4Exception("G4OpticalSurface::GetReflectivityLUTValue", "mat319", FatalException, ed);
278 return 0.;
279 }
280 return (G4double)Reflectivity[i];
281}
282
283inline G4Physics2DVector* G4OpticalSurface::GetDichroicVector() { return DichroicVector; }
284
285#endif /* G4OpticalSurface_h */
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4OpticalSurfaceModel
@ unified
@ dichroic
G4OpticalSurfaceFinish
@ groundfrontpainted
@ polishedlumirrorair
@ groundtyvekair
@ groundtioair
@ PolishedESR_LUT
@ groundvm2000glue
@ polishedair
@ groundair
@ etchedteflonair
@ etchedtyvekair
@ etchedvm2000glue
@ RoughESR_LUT
@ polishedbackpainted
@ etchedtioair
@ Polished_LUT
@ groundvm2000air
@ polished
@ Detector_LUT
@ polishedlumirrorglue
@ polishedtyvekair
@ PolishedESRGrease_LUT
@ RoughESRGrease_LUT
@ ground
@ Rough_LUT
@ polishedteflonair
@ etchedair
@ polishedvm2000air
@ etchedlumirrorglue
@ polishedvm2000glue
@ polishedfrontpainted
@ RoughTeflon_LUT
@ polishedtioair
@ groundlumirrorglue
@ PolishedTeflon_LUT
@ etchedvm2000air
@ groundbackpainted
@ etchedlumirrorair
@ groundlumirrorair
@ groundteflonair
G4SurfaceType
@ dielectric_dielectric
float G4float
Definition G4Types.hh:84
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
G4int GetLUTbins() const
G4double GetAngularDistributionValueLUT(G4int)
void SetSigmaAlpha(const G4double s_a)
void SetMaterialPropertiesTable(G4MaterialPropertiesTable *anMPT)
void SetType(const G4SurfaceType &type) override
G4OpticalSurfaceModel GetModel() const
G4double GetSigmaAlpha() const
G4OpticalSurfaceFinish GetFinish() const
void SetModel(const G4OpticalSurfaceModel model)
G4int GetThetaIndexMax() const
G4double GetPolish() const
G4bool operator==(const G4OpticalSurface &right) const
G4OpticalSurface & operator=(const G4OpticalSurface &right)
void ReadCompressedFile(const G4String &, std::istringstream &)
G4MaterialPropertiesTable * GetMaterialPropertiesTable() const
G4Physics2DVector * GetDichroicVector()
G4int GetPhiIndexMax() const
G4double GetReflectivityLUTValue(G4int)
G4bool operator!=(const G4OpticalSurface &right) const
~G4OpticalSurface() override
G4int GetRefMax() const
G4int GetInmax() const
G4double GetAngularDistributionValue(G4int, G4int, G4int)
void SetFinish(const G4OpticalSurfaceFinish)
G4OpticalSurface(const G4String &name, G4OpticalSurfaceModel model=glisur, G4OpticalSurfaceFinish finish=polished, G4SurfaceType type=dielectric_dielectric, G4double value=1.0)
void SetPolish(const G4double plsh)