Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGeoOpticalSurface.h
Go to the documentation of this file.
1 // @(#)root/geom:$Id$
2 // Author: Andrei Gheata 05/12/18
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TGeoOpticalSurface
13 #define ROOT_TGeoOpticalSurface
14 
15 #include <TNamed.h>
16 #include <TList.h>
17 
18 ////////////////////////////////////////////////////////////////////////////
19 // //
20 // TGeoOpticalSurface - class describing surface properties for //
21 // compatibility with Geant4 //
22 // //
23 ////////////////////////////////////////////////////////////////////////////
24 
25 class TGDMLMatrix;
26 
27 class TGeoOpticalSurface : public TNamed {
28 public:
29  enum ESurfaceFinish {
30  kFpolished, // smooth perfectly polished surface
31  kFpolishedfrontpainted, // smooth top-layer (front) paint
32  kFpolishedbackpainted, // same is 'polished' but with a back-paint
33 
34  kFground, // rough surface
35  kFgroundfrontpainted, // rough top-layer (front) paint
36  kFgroundbackpainted, // same as 'ground' but with a back-paint
37 
38  kFpolishedlumirrorair, // mechanically polished surface, with lumirror
39  kFpolishedlumirrorglue, // mechanically polished surface, with lumirror & meltmount
40  kFpolishedair, // mechanically polished surface
41  kFpolishedteflonair, // mechanically polished surface, with teflon
42  kFpolishedtioair, // mechanically polished surface, with tio paint
43  kFpolishedtyvekair, // mechanically polished surface, with tyvek
44  kFpolishedvm2000air, // mechanically polished surface, with esr film
45  kFpolishedvm2000glue, // mechanically polished surface, with esr film & meltmount
46 
47  kFetchedlumirrorair, // chemically etched surface, with lumirror
48  kFetchedlumirrorglue, // chemically etched surface, with lumirror & meltmount
49  kFetchedair, // chemically etched surface
50  kFetchedteflonair, // chemically etched surface, with teflon
51  kFetchedtioair, // chemically etched surface, with tio paint
52  kFetchedtyvekair, // chemically etched surface, with tyvek
53  kFetchedvm2000air, // chemically etched surface, with esr film
54  kFetchedvm2000glue, // chemically etched surface, with esr film & meltmount
55 
56  kFgroundlumirrorair, // rough-cut surface, with lumirror
57  kFgroundlumirrorglue, // rough-cut surface, with lumirror & meltmount
58  kFgroundair, // rough-cut surface
59  kFgroundteflonair, // rough-cut surface, with teflon
60  kFgroundtioair, // rough-cut surface, with tio paint
61  kFgroundtyvekair, // rough-cut surface, with tyvek
62  kFgroundvm2000air, // rough-cut surface, with esr film
63  kFgroundvm2000glue, // rough-cut surface, with esr film & meltmount
64 
65  // for DAVIS model
66  kFRough_LUT, // rough surface
67  kFRoughTeflon_LUT, // rough surface wrapped in Teflon tape
68  kFRoughESR_LUT, // rough surface wrapped with ESR
69  kFRoughESRGrease_LUT, // rough surface wrapped with ESR and coupled with opical grease
70  kFPolished_LUT, // polished surface
71  kFPolishedTeflon_LUT, // polished surface wrapped in Teflon tape
72  kFPolishedESR_LUT, // polished surface wrapped with ESR
73  kFPolishedESRGrease_LUT, // polished surface wrapped with ESR and coupled with opical grease
74  kFDetector_LUT // polished surface with optical grease
75  };
76 
77  enum ESurfaceModel {
78  kMglisur, // original GEANT3 model
79  kMunified, // UNIFIED model
80  kMLUT, // Look-Up-Table model
81  kMDAVIS, // DAVIS model
82  kMdichroic // dichroic filter
83  };
84 
85  enum ESurfaceType {
86  kTdielectric_metal, // dielectric-metal interface
87  kTdielectric_dielectric, // dielectric-dielectric interface
88  kTdielectric_LUT, // dielectric-Look-Up-Table interface
89  kTdielectric_LUTDAVIS, // dielectric-Look-Up-Table DAVIS interface
90  kTdielectric_dichroic, // dichroic filter interface
91  kTfirsov, // for Firsov Process
92  kTx_ray // for x-ray mirror process
93  };
94 
95 private:
96  std::string fName = ""; // Surface name
97  ESurfaceType fType = kTdielectric_metal; // Surface type
98  ESurfaceModel fModel = kMglisur; // Surface model
99  ESurfaceFinish fFinish = kFpolished; // Surface finish
100 
101  Double_t fValue = 0.0; // The value used to determine sigmaalpha and polish
102  Double_t fSigmaAlpha = 0.0; // The sigma of micro-facet polar angle
103  Double_t fPolish = 0.0; // Polish parameter in glisur model
104 
105  TList fProperties; // List of surface properties
106 
107  // No copy
108  TGeoOpticalSurface(const TGeoOpticalSurface &);
109  TGeoOpticalSurface &operator=(const TGeoOpticalSurface &);
110 
111 public:
112  // constructors
113  TGeoOpticalSurface() {}
114 
115  TGeoOpticalSurface(const char *name, ESurfaceModel model = kMglisur, ESurfaceFinish finish = kFpolished,
116  ESurfaceType type = kTdielectric_dielectric, Double_t value = 1.0);
117 
118  virtual ~TGeoOpticalSurface() {}
119 
120  // Accessors
121  bool AddProperty(const char *property, const char *ref);
122  const char *GetPropertyRef(const char *property);
123  TList const &GetProperties() const { return fProperties; }
124  Int_t GetNproperties() const { return fProperties.GetSize(); }
125  TGDMLMatrix* GetProperty(const char* name) const;
126  TGDMLMatrix* GetProperty(Int_t i) const;
127  ESurfaceType GetType() const { return fType; }
128  ESurfaceModel GetModel() const { return fModel; }
129  ESurfaceFinish GetFinish() const { return fFinish; }
130  Double_t GetPolish() const { return fPolish; }
131  Double_t GetValue() const { return fValue; }
132  Double_t GetSigmaAlpha() const { return fSigmaAlpha; }
133 
134  void SetType(ESurfaceType type) { fType = type; }
135  void SetModel(ESurfaceModel model) { fModel = model; }
136  void SetFinish(ESurfaceFinish finish) { fFinish = finish; }
137  void SetPolish(Double_t polish) { fPolish = polish; }
138  void SetValue(Double_t value) { fValue = value; }
139  void SetSigmaAlpha(Double_t sigmaalpha) { fSigmaAlpha = sigmaalpha; }
140 
141  void Print(Option_t *option = "") const;
142 
143  static ESurfaceType StringToType(const char *type);
144  static const char *TypeToString(ESurfaceType type);
145  static ESurfaceModel StringToModel(const char *model);
146  static const char *ModelToString(ESurfaceModel model);
147  static ESurfaceFinish StringToFinish(const char *finish);
148  static const char *FinishToString(ESurfaceFinish finish);
149 
150  ClassDef(TGeoOpticalSurface, 1) // Class representing an optical surface
151 };
152 
153 ////////////////////////////////////////////////////////////////////////////
154 // //
155 // TGeoSkinSurface - class describing a surface having optical properties //
156 // surrounding a volume //
157 // //
158 ////////////////////////////////////////////////////////////////////////////
159 
160 class TGeoVolume;
161 
162 class TGeoSkinSurface : public TNamed {
163 private:
164  TGeoOpticalSurface const *fSurface = nullptr; // Referenced optical surface
165  TGeoVolume const *fVolume = nullptr; // Referenced volume
166 public:
167  TGeoSkinSurface() {}
168  TGeoSkinSurface(const char *name, const char *ref, TGeoOpticalSurface const *surf, TGeoVolume const *vol)
169  : TNamed(name, ref), fSurface(surf), fVolume(vol)
170  {
171  }
172  virtual ~TGeoSkinSurface() {}
173 
174  TGeoOpticalSurface const *GetSurface() const { return fSurface; }
175  TGeoVolume const *GetVolume() const { return fVolume; }
176 
177  void Print(Option_t *option = "") const;
178 
179  ClassDef(TGeoSkinSurface, 1) // A surface with optical properties surrounding a volume
180 };
181 
182 ////////////////////////////////////////////////////////////////////////////
183 // //
184 // TGeoBorderSurface - class describing a surface having optical //
185 // properties between 2 touching volumes //
186 // //
187 ////////////////////////////////////////////////////////////////////////////
188 
189 class TGeoNode;
190 
191 class TGeoBorderSurface : public TNamed {
192 private:
193  TGeoOpticalSurface const *fSurface = nullptr; // Referenced optical surface
194  TGeoNode const *fNode1 = nullptr; // Referenced node 1
195  TGeoNode const *fNode2 = nullptr; // Referenced node 2
196 public:
197  TGeoBorderSurface() {}
198  TGeoBorderSurface(const char *name, const char *ref, TGeoOpticalSurface const *surf, TGeoNode const *node1,
199  TGeoNode const *node2)
200  : TNamed(name, ref), fSurface(surf), fNode1(node1), fNode2(node2)
201  {
202  }
203  virtual ~TGeoBorderSurface() {}
204 
205  TGeoOpticalSurface const *GetSurface() const { return fSurface; }
206  TGeoNode const *GetNode1() const { return fNode1; }
207  TGeoNode const *GetNode2() const { return fNode2; }
208 
209  void Print(Option_t *option = "") const;
210 
211  ClassDef(TGeoBorderSurface, 1) // A surface with optical properties betwqeen 2 touching volumes
212 };
213 
214 #endif // ROOT_TGeoOpticalSurface