00001
00003 #ifndef DETDESC_SOLIDTRAP_H
00004 #define DETDESC_SOLIDTRAP_H 1
00005
00007 #include <cmath>
00008 #include <iostream>
00009
00011 #include "GaudiKernel/Point3DTypes.h"
00012 #include "GaudiKernel/Vector3DTypes.h"
00013 #include "GaudiKernel/Plane3DTypes.h"
00014
00016 #include "DetDesc/SolidBase.h"
00017 #include "DetDesc/SolidPolyHedronHelper.h"
00018
00020 template <class TYPE>
00021 class SolidFactory;
00022
00031 class SolidTrap: public virtual SolidBase ,
00032 protected virtual SolidPolyHedronHelper
00033 {
00035 friend class SolidFactory<SolidTrap>;
00036
00037 public:
00038
00040 typedef std::vector<Gaudi::XYZPoint> VERTICES;
00041
00042 public:
00043
00059 SolidTrap( const std::string& name ,
00060 const double zHalfLength ,
00061 const double theta ,
00062 const double phi ,
00063 const double dyAtMinusZ ,
00064 const double dxAtMinusZMinusY ,
00065 const double dxAtMinusZPlusY ,
00066 const double alphaAtMinusZ ,
00067 const double dyAtPlusZ ,
00068 const double dxAtPlusZMinusY ,
00069 const double dxAtPlusZPlusY ,
00070 const double alphaAtPlusZ );
00071
00073 virtual ~SolidTrap();
00074
00080 inline std::string typeName () const { return "SolidTrap" ; };
00081
00088 const ISolid* cover () const;
00089
00098 virtual std::ostream& printOut ( std::ostream& os = std::cout ) const;
00099
00108 virtual MsgStream& printOut ( MsgStream& os ) const;
00109
00113 inline const double& zHalfLength () const
00114 { return m_trap_zHalfLength ; };
00115
00117
00118 inline const double& theta () const
00119 { return m_trap_theta ; };
00120 inline const double& phi () const
00121 { return m_trap_phi ; };
00123
00125
00126 inline const double& dyAtMinusZ () const
00127 { return m_trap_dyAtMinusZ ; };
00128 inline const double& dxAtMinusZMinusY () const
00129 { return m_trap_dxAtMinusZMinusY ; };
00130 inline const double& dxAtMinusZPlusY () const
00131 { return m_trap_dxAtMinusZPlusY ; };
00132 inline const double& alphaAtMinusZ () const
00133 { return m_trap_alphaAtMinusZ ; };
00135
00137
00138 inline const double& dyAtPlusZ () const
00139 { return m_trap_dyAtPlusZ ; };
00140 inline const double& dxAtPlusZMinusY () const
00141 { return m_trap_dxAtPlusZMinusY ; };
00142 inline const double& dxAtPlusZPlusY () const
00143 { return m_trap_dxAtPlusZPlusY ; };
00144 inline const double& alphaAtPlusZ () const
00145 { return m_trap_alphaAtPlusZ ; };
00147
00148 protected:
00149
00153 SolidTrap( const std::string& Name = "Anonymous Trap");
00154
00158 void makeAll();
00159
00164 inline const Gaudi::XYZPoint& point( const VERTICES::size_type& indx ) const
00165 { return m_ph_vertices[indx]; }
00166
00167 private:
00168
00169 SolidTrap ( const SolidTrap & );
00170 SolidTrap& operator=( const SolidTrap & );
00171
00172 private:
00173
00175
00176 double m_trap_zHalfLength ;
00177 double m_trap_theta ;
00178 double m_trap_phi ;
00179 double m_trap_dyAtMinusZ ;
00180 double m_trap_dxAtMinusZMinusY ;
00181 double m_trap_dxAtMinusZPlusY ;
00182 double m_trap_alphaAtMinusZ ;
00183 double m_trap_dyAtPlusZ ;
00184 double m_trap_dxAtPlusZMinusY ;
00185 double m_trap_dxAtPlusZPlusY ;
00186 double m_trap_alphaAtPlusZ ;
00187 double m_trap_sinAlphaAtPlusZ ;
00188 double m_trap_cosAlphaAtPlusZ ;
00190 };
00191
00193 #endif
00194