00001
00002
00003 #ifndef DETDESC_SOLIDCHILD_H
00004 #define DETDESC_SOLIDCHILD_H 1
00006 #include <functional>
00007
00008 #include "GaudiKernel/Transform3DTypes.h"
00010 #include "DetDesc/SolidException.h"
00011 #include "DetDesc/SolidBase.h"
00013 class MsgStream;
00014 class SolidBoolean;
00015 template <class TYPE>
00016 class SolidFactory;
00017
00018
00030 class SolidChild : public virtual SolidBase
00031 {
00033 friend class SolidBoolean;
00034 friend class SolidFactory<SolidChild>;
00036 protected:
00037
00041 SolidChild( const std::string& Name = "" );
00042
00048 SolidChild( ISolid* solid ,
00049 const Gaudi::Transform3D* mtrx = 0 ,
00050 const std::string& Name = "" );
00051
00058 SolidChild( ISolid* solid ,
00059 const Gaudi::XYZPoint& pos ,
00060 const Gaudi::Rotation3D& rot = Gaudi::Rotation3D() ,
00061 const std::string& Name = "" );
00062
00063 public:
00064
00066 virtual ~SolidChild();
00067
00068 public:
00069
00073 inline virtual std::string typeName () const { return "SolidChild" ; }
00074
00078 inline virtual const ISolid* cover () const { return solid()->cover() ; };
00079
00084 virtual inline const ISolid* coverTop () const
00085 { return solid()->coverTop() ; };
00086
00091 virtual std::ostream& printOut ( std::ostream& os = std::cout ) const ;
00092
00097 virtual MsgStream& printOut ( MsgStream& os ) const ;
00098
00107 virtual bool isInside ( const Gaudi::XYZPoint& point) const;
00108 virtual bool isInside ( const Gaudi::Polar3DPoint & point ) const;
00109 virtual bool isInside ( const Gaudi::RhoZPhiPoint & point ) const;
00112 virtual ISolid* reset();
00113
00132 virtual unsigned int
00133 intersectionTicks ( const Gaudi::XYZPoint& Point ,
00134 const Gaudi::XYZVector& Vector ,
00135 ISolid::Ticks& ticks ) const;
00136 virtual unsigned int
00137 intersectionTicks ( const Gaudi::Polar3DPoint& Point ,
00138 const Gaudi::Polar3DVector& Vector ,
00139 ISolid::Ticks& ticks ) const;
00140
00141 virtual unsigned int
00142 intersectionTicks ( const Gaudi::RhoZPhiPoint & Point ,
00143 const Gaudi::RhoZPhiVector & Vector ,
00144 ISolid::Ticks & ticks ) const;
00145
00150 Ticks::size_type maxNumberOfTicks() const { return solid() ? solid()->maxNumberOfTicks() : 0 ; }
00151
00152 public:
00153
00155 inline const ISolid* solid () const { return m_sc_solid; };
00156
00157 inline bool simple() const { return m_sc_simple; };
00158
00159 inline const Gaudi::Transform3D& matrix () const
00160 {
00161 if( 0 == m_sc_matrix ) { m_sc_matrix = new Gaudi::Transform3D; }
00162 return *m_sc_matrix;
00163 };
00164
00165 protected:
00166
00169 void setBP();
00170
00171 private:
00172
00176 SolidChild ( const SolidChild& solid );
00177
00182 SolidChild& operator=( const SolidChild& solid );
00183
00189 template<class aPoint>
00190 bool isInsideImpl(const aPoint& point) const;
00191
00192 template<class aPoint, class aVector>
00193 unsigned int intersectionTicksImpl ( const aPoint& Point ,
00194 const aVector& Vector ,
00195 ISolid::Ticks& ticks ) const;
00196
00197 private:
00199 ISolid* m_sc_solid ;
00200 mutable Gaudi::Transform3D* m_sc_matrix ;
00201 bool m_sc_simple ;
00202
00203 };
00204
00206 #endif
00207