00001
00002
00003
00004
00005 #ifndef DETDESC_MIXTURE_H
00006 #define DETDESC_MIXTURE_H
00007
00008 #include "DetDesc/Material.h"
00009 #include "DetDesc/Element.h"
00010 #include "DetDesc/CLIDMixture.h"
00012 #include <vector>
00013
00014
00025 class Mixture : public Material
00026 {
00028 public:
00030 typedef std::pair<double,SmartRef<Element> > Entry ;
00031 typedef std::vector<Entry> Elements ;
00032 typedef std::vector<int> Atoms ;
00035 Mixture( const std::string& name = "" ,
00036 const double a = 0 ,
00037 const double z = 0 ,
00038 const double i = 0 ,
00039 const double density = 0 ,
00040 const double rl = 0 ,
00041 const double al = 0 ,
00042 const double temp = Gaudi::Units::STP_Temperature,
00043 const double press = Gaudi::Units::STP_Pressure,
00044 const eState s = stateUndefined );
00045
00047 virtual ~Mixture();
00048
00050 inline int nOfItems() const;
00051
00056 void addElement( const SmartRef<Element>& e ,
00057 const int nOfAtoms ,
00058 const bool comp = false );
00059 void addElement( const SmartRef<Element>& e ,
00060 const double fraction ,
00061 const bool comp = false );
00062
00066 void addMixture( const SmartRef<Mixture>& mx ,
00067 const double fraction ,
00068 const bool comp = false);
00069
00071 const SmartRef<Element>& element ( const unsigned int i ) const ;
00072 SmartRef<Element>& element ( const unsigned int i ) ;
00073
00075 inline const Elements& elements() const ;
00076 inline Elements& elements() ;
00077
00079 StatusCode compute();
00080
00082 double elementFraction( const unsigned int i ) const ;
00083
00085
00087 virtual inline double A() const;
00088 virtual inline void setA( const double value );
00090 virtual inline double Z() const;
00091 virtual inline void setZ( const double value );
00093 virtual inline double I() const;
00094 virtual inline void setI( const double value );
00096 virtual inline double C() const;
00097 virtual inline void setC( const double value );
00098 virtual inline double a() const;
00099 virtual inline void seta( const double value );
00100 virtual inline double m() const;
00101 virtual inline void setm( const double value );
00102 virtual inline double X0() const;
00103 virtual inline void setX0( const double value );
00104 virtual inline double X1() const;
00105 virtual inline void setX1( const double value );
00106
00107
00108
00110 virtual inline double N() const;
00112 virtual inline const CLID& clID () const { return Mixture::classID(); }
00113 static const CLID& classID () { return CLID_Mixture ; }
00114
00116 virtual std::ostream& fillStream ( std::ostream& s ) const ;
00118 virtual MsgStream& fillStream ( MsgStream& s ) const ;
00120 protected:
00122 StatusCode addMyself();
00124 StatusCode computeByAtoms();
00126 StatusCode computeByFraction () ;
00128 private:
00129
00131 Elements m_elements ;
00132
00134 Atoms m_atoms ;
00135
00137 Element* m_own ;
00138
00140 double m_A ;
00141 double m_Z ;
00142 double m_I ;
00143 double m_a ;
00144 double m_m ;
00145 double m_C ;
00146 double m_X0;
00147 double m_X1;
00149 };
00150
00152 #include "DetDesc/Mixture.icpp"
00154
00155 #endif // DETDESC_MIXTURE_H