Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TGeoMaterial.h
Go to the documentation of this file.
1 // @(#)root/geom:$Id$
2 // Author: Andrei Gheata 25/10/01
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_TGeoMaterial
13 #define ROOT_TGeoMaterial
14 
15 #include <TNamed.h>
16 #include <TAttFill.h>
17 #include <TList.h>
18 
19 #include "TGeoElement.h"
20 
21 // forward declarations
22 class TGeoExtension;
23 class TGDMLMatrix;
24 
25 // Some units used in G4
26 static const Double_t STP_temperature = 273.15; // [K]
27 static const Double_t STP_pressure = 6.32420e+8; // [MeV/mm3]
28 
29 class TGeoMaterial : public TNamed,
30  public TAttFill
31 {
32 public:
33  enum EGeoMaterial {
34  kMatUsed = BIT(17),
35  kMatSavePrimitive = BIT(18)
36  };
37  enum EGeoMaterialState {
38  kMatStateUndefined,
39  kMatStateSolid,
40  kMatStateLiquid,
41  kMatStateGas
42  };
43 
44 protected:
45  Int_t fIndex; // material index
46  Double_t fA; // A of material
47  Double_t fZ; // Z of material
48  Double_t fDensity; // density of material
49  Double_t fRadLen; // radiation length
50  Double_t fIntLen; // interaction length
51  Double_t fTemperature; // temperature
52  Double_t fPressure; // pressure
53  EGeoMaterialState fState; // material state
54  TObject *fShader; // shader with optical properties
55  TObject *fCerenkov; // pointer to class with Cerenkov properties
56  TGeoElement *fElement; // pointer to element composing the material
57  TList fProperties; // user-defined properties
58  TList fConstProperties; // user-defined constant properties
59  TGeoExtension *fUserExtension; //! Transient user-defined extension to materials
60  TGeoExtension *fFWExtension; //! Transient framework-defined extension to materials
61 
62 // methods
63  TGeoMaterial(const TGeoMaterial&);
64  TGeoMaterial& operator=(const TGeoMaterial&);
65 
66 
67 public:
68  // constructors
69  TGeoMaterial();
70  TGeoMaterial(const char *name);
71  TGeoMaterial(const char *name, Double_t a, Double_t z,
72  Double_t rho, Double_t radlen=0, Double_t intlen=0);
73  TGeoMaterial(const char *name, Double_t a, Double_t z, Double_t rho,
74  EGeoMaterialState state, Double_t temperature=STP_temperature, Double_t pressure=STP_pressure);
75  TGeoMaterial(const char *name, TGeoElement *elem, Double_t rho);
76 
77  // destructor
78  virtual ~TGeoMaterial();
79  // methods
80  static Double_t Coulomb(Double_t z);
81  // radioactive mixture evolution
82  virtual TGeoMaterial *DecayMaterial(Double_t time, Double_t precision=0.001);
83  virtual void FillMaterialEvolution(TObjArray *population, Double_t precision=0.001);
84  // getters & setters
85  bool AddProperty(const char *property, const char *ref);
86  bool AddConstProperty(const char *property, const char *ref);
87  Int_t GetNproperties() const { return fProperties.GetSize(); }
88  Int_t GetNconstProperties() const { return fConstProperties.GetSize(); }
89  const char *GetPropertyRef(const char *property) const;
90  const char *GetPropertyRef(Int_t i) const { return (fProperties.At(i) ? fProperties.At(i)->GetTitle() : nullptr); }
91  Double_t GetConstProperty(const char *property, Bool_t *error = nullptr) const;
92  Double_t GetConstProperty(Int_t i, Bool_t *error = nullptr) const;
93  const char *GetConstPropertyRef(const char *property) const;
94  const char *GetConstPropertyRef(Int_t i) const { return (fConstProperties.At(i) ? fConstProperties.At(i)->GetTitle() : nullptr); }
95  TList const &GetProperties() const { return fProperties; }
96  TList const &GetConstProperties() const { return fConstProperties; }
97  TGDMLMatrix* GetProperty(const char* name) const;
98  TGDMLMatrix* GetProperty(Int_t i) const;
99  virtual Int_t GetByteCount() const {return sizeof(*this);}
100  virtual Double_t GetA() const {return fA;}
101  virtual Double_t GetZ() const {return fZ;}
102  virtual Int_t GetDefaultColor() const;
103  virtual Double_t GetDensity() const {return fDensity;}
104  virtual Int_t GetNelements() const {return 1;}
105  virtual TGeoElement *GetElement(Int_t i=0) const;
106  virtual void GetElementProp(Double_t &a, Double_t &z, Double_t &w, Int_t i=0);
107  TGeoElement *GetBaseElement() const {return fElement;}
108  char *GetPointerName() const;
109  virtual Double_t GetRadLen() const {return fRadLen;}
110  virtual Double_t GetIntLen() const {return fIntLen;}
111  Int_t GetIndex();
112  virtual TObject *GetCerenkovProperties() const {return fCerenkov;}
113  Char_t GetTransparency() const {return (fFillStyle<3000 || fFillStyle>3100)?0:Char_t(fFillStyle-3000);}
114  Double_t GetTemperature() const {return fTemperature;}
115  Double_t GetPressure() const {return fPressure;}
116  EGeoMaterialState GetState() const {return fState;}
117  virtual Double_t GetSpecificActivity(Int_t) const {return 0.;}
118  TGeoExtension *GetUserExtension() const {return fUserExtension;}
119  TGeoExtension *GetFWExtension() const {return fFWExtension;}
120  TGeoExtension *GrabUserExtension() const;
121  TGeoExtension *GrabFWExtension() const;
122  virtual Bool_t IsEq(const TGeoMaterial *other) const;
123  Bool_t IsUsed() const {return TObject::TestBit(kMatUsed);}
124  virtual Bool_t IsMixture() const {return kFALSE;}
125  virtual void Print(const Option_t *option="") const;
126  virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
127  virtual void SetA(Double_t a) {fA = a; SetRadLen(0);}
128  virtual void SetZ(Double_t z) {fZ = z; SetRadLen(0);}
129  virtual void SetDensity(Double_t density) {fDensity = density; SetRadLen(0);}
130  void SetIndex(Int_t index) {fIndex=index;}
131  virtual void SetCerenkovProperties(TObject* cerenkov) {fCerenkov = cerenkov;}
132  void SetRadLen(Double_t radlen, Double_t intlen=0.);
133  void SetUsed(Bool_t flag=kTRUE) {TObject::SetBit(kMatUsed, flag);}
134  void SetTransparency(Char_t transparency=0) {fFillStyle = 3000+transparency;}
135  void SetTemperature(Double_t temperature) {fTemperature = temperature;}
136  void SetPressure(Double_t pressure) {fPressure = pressure;}
137  void SetState(EGeoMaterialState state) {fState = state;}
138  void SetUserExtension(TGeoExtension *ext);
139  void SetFWExtension(TGeoExtension *ext);
140  static Double_t ScreenFactor(Double_t z);
141 
142 
143 
144  ClassDef(TGeoMaterial, 7) // base material class
145 
146 //***** Need to add classes and globals to LinkDef.h *****
147 };
148 
149 
150 class TGeoMixture : public TGeoMaterial
151 {
152 protected :
153 // data members
154  Int_t fNelements; // number of elements
155  Double_t *fZmixture; // [fNelements] array of Z of the elements
156  Double_t *fAmixture; // [fNelements] array of A of the elements
157  Double_t *fWeights; // [fNelements] array of relative proportions by mass
158  Int_t *fNatoms; // [fNelements] array of numbers of atoms
159  Double_t *fVecNbOfAtomsPerVolume; //[fNelements] array of numbers of atoms per unit volume
160  TObjArray *fElements; // array of elements composing the mixture
161 // methods
162  TGeoMixture(const TGeoMixture&); // Not implemented
163  TGeoMixture& operator=(const TGeoMixture&); // Not implemented
164  void AverageProperties();
165 
166 public:
167  // constructors
168  TGeoMixture();
169  TGeoMixture(const char *name, Int_t nel, Double_t rho=-1);
170  // destructor
171  virtual ~TGeoMixture();
172  // methods for adding elements
173  void AddElement(Double_t a, Double_t z, Double_t weight);
174  void AddElement(TGeoMaterial *mat, Double_t weight);
175  void AddElement(TGeoElement *elem, Double_t weight);
176  void AddElement(TGeoElement *elem, Int_t natoms);
177  // backward compatibility for defining elements
178  void DefineElement(Int_t iel, Double_t a, Double_t z, Double_t weight);
179  void DefineElement(Int_t iel, TGeoElement *elem, Double_t weight);
180  void DefineElement(Int_t iel, Int_t z, Int_t natoms);
181  // radioactive mixture evolution
182  virtual TGeoMaterial *DecayMaterial(Double_t time, Double_t precision=0.001);
183  virtual void FillMaterialEvolution(TObjArray *population, Double_t precision=0.001);
184  // getters
185  virtual Int_t GetByteCount() const {return 48+12*fNelements;}
186  virtual TGeoElement *GetElement(Int_t i=0) const;
187  virtual void GetElementProp(Double_t &a, Double_t &z, Double_t &w, Int_t i=0) {a=fAmixture[i]; z=fZmixture[i]; w=fWeights[i];}
188  virtual Int_t GetNelements() const {return fNelements;}
189  Double_t *GetZmixt() const {return fZmixture;}
190  Double_t *GetAmixt() const {return fAmixture;}
191  Double_t *GetWmixt() const {return fWeights;}
192  Int_t *GetNmixt() const {return fNatoms;}
193  virtual Double_t GetSpecificActivity(Int_t i=-1) const;
194  // utilities
195  virtual Bool_t IsEq(const TGeoMaterial *other) const;
196  virtual Bool_t IsMixture() const {return kTRUE;}
197  virtual void Print(const Option_t *option="") const;
198  virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
199  virtual void SetA(Double_t a) {fA = a;}
200  virtual void SetZ(Double_t z) {fZ = z;}
201  virtual void SetDensity(Double_t density) {fDensity = density; AverageProperties();}
202  void ComputeDerivedQuantities();
203  void ComputeRadiationLength();
204  void ComputeNuclearInterLength();
205 
206  ClassDef(TGeoMixture, 3) // material mixtures
207 };
208 
209 inline void TGeoMixture::DefineElement(Int_t, Double_t a, Double_t z, Double_t weight)
210  {return AddElement(a,z,weight);}
211 inline void TGeoMixture::DefineElement(Int_t, TGeoElement *elem, Double_t weight)
212  {return AddElement(elem,weight);}
213 
214 
215 #endif
216