00001
00002
00003 #ifndef DETDESC_SOLIDBOOLEAN_H
00004 #define DETDESC_SOLIDBOOLEAN_H 1
00006 #include <string>
00007 #include <vector>
00008 #include <algorithm>
00010 #include "DetDesc/SolidChild.h"
00011
00012
00013 class StatusCode;
00014 class MsgStream;
00015
00016
00027 class SolidBoolean: public virtual SolidBase
00028 {
00029 public:
00030
00031 typedef std::vector<SolidChild*> SolidChildrens;
00032
00033
00037 virtual std::string typeName () const { return "SolidBoolean"; };
00038
00042 virtual const ISolid* cover () const { return first()->cover() ; };
00043
00048 virtual const ISolid* coverTop () const { return first()->coverTop() ; };
00049
00054 virtual std::ostream& printOut ( std::ostream& os = std::cout ) const ;
00055
00060 virtual MsgStream& printOut ( MsgStream& os ) const ;
00061
00064 virtual ISolid* reset() ;
00065
00074 virtual unsigned int intersectionTicks( const Gaudi::XYZPoint & Point,
00075 const Gaudi::XYZVector& Vector,
00076 ISolid::Ticks& ticks ) const ;
00077
00078 virtual unsigned int intersectionTicks( const Gaudi::Polar3DPoint & Point,
00079 const Gaudi::Polar3DVector & Vector,
00080 ISolid::Ticks & ticks) const ;
00081
00082 virtual unsigned int intersectionTicks( const Gaudi::RhoZPhiPoint & Point,
00083 const Gaudi::RhoZPhiVector & Vector,
00084 ISolid::Ticks & ticks) const ;
00085
00098 virtual unsigned int intersectionTicks( const Gaudi::XYZPoint& Point,
00099 const Gaudi::XYZVector & Vector,
00100 const ISolid::Tick& tickMin,
00101 const ISolid::Tick& tickMax,
00102 ISolid::Ticks& ticks ) const ;
00103
00104 virtual unsigned int intersectionTicks( const Gaudi::Polar3DPoint& Point,
00105 const Gaudi::Polar3DVector & Vector,
00106 const ISolid::Tick& tickMin,
00107 const ISolid::Tick& tickMax,
00108 ISolid::Ticks& ticks ) const ;
00109
00110 virtual unsigned int intersectionTicks( const Gaudi::RhoZPhiPoint& Point,
00111 const Gaudi::RhoZPhiVector & Vector,
00112 const ISolid::Tick& tickMin,
00113 const ISolid::Tick& tickMax,
00114 ISolid::Ticks& ticks ) const ;
00115
00119 const ISolid* first () const { return m_sb_first; } ;
00120
00124 unsigned int noChildrens () const { return m_sb_childrens.size(); } ;
00125
00130 const ISolid* operator[] ( unsigned int index ) const
00131 { return ( ( index < noChildrens() ) ? *(childBegin()+index) : 0 ) ; } ;
00132
00136 SolidChildrens::const_iterator
00137 childBegin () const { return m_sb_childrens.begin(); };
00138
00142 SolidChildrens::const_iterator
00143 childEnd () const { return m_sb_childrens.end (); };
00144
00146 protected:
00147
00153 SolidBoolean( const std::string& name ,
00154 ISolid* solid );
00155
00157 virtual ~SolidBoolean();
00158
00162 SolidBoolean ( const std::string& name="Undefined" );
00163
00169 StatusCode addChild
00170 ( ISolid* child ,
00171 const Gaudi::Transform3D* mtrx );
00172
00178 StatusCode addChild
00179 ( ISolid* child ,
00180 const Gaudi::XYZPoint& position ,
00181 const Gaudi::Rotation3D& rotation );
00182
00186 SolidChildrens::iterator
00187 childBegin () { return m_sb_childrens.begin(); };
00188
00192 SolidChildrens::iterator
00193 childEnd () { return m_sb_childrens.end (); };
00194
00199 Ticks::size_type maxNumberOfTicks() const ;
00200
00201 private:
00202
00203
00204
00205
00206 SolidBoolean& operator=(SolidBoolean & ) ;
00207
00208 template<class aPoint, class aVector>
00209 unsigned int intersectionTicksImpl( const aPoint & Point,
00210 const aVector & Vector,
00211 const ISolid::Tick& tickMin,
00212 const ISolid::Tick& tickMax,
00213 ISolid::Ticks& ticks) const;
00214
00215 template<class aPoint, class aVector>
00216 unsigned int intersectionTicksImpl( const aPoint & Point,
00217 const aVector & Vector,
00218 ISolid::Ticks& ticks ) const;
00219
00220 protected:
00221
00224 void setBP();
00225
00226 private:
00228 std::string m_sb_name ;
00229 mutable ISolid* m_sb_first ;
00230 mutable SolidChildrens m_sb_childrens;
00231
00232 };
00233
00235 #endif
00236