00001
00002
00003 #ifndef DETDESC_SOLIDBOX_H
00004 #define DETDESC_SOLIDBOX_H
00006 #include <cmath>
00007 #include <iostream>
00009 #include "GaudiKernel/Point3DTypes.h"
00010 #include "GaudiKernel/Vector3DTypes.h"
00012 #include "DetDesc/SolidBase.h"
00014 template <class TYPE>
00015 class SolidFactory;
00016
00025 class SolidBox: public virtual SolidBase
00026 {
00028 friend class SolidFactory<SolidBox>;
00029
00030 public:
00031
00039 SolidBox( const std::string& Name ,
00040 const double xHalf ,
00041 const double yHalf ,
00042 const double zHalf);
00043
00046 virtual ~SolidBox();
00047
00053 inline std::string typeName () const { return "SolidBox" ; };
00054
00063 virtual bool isInside ( const Gaudi::XYZPoint& point ) const;
00064 virtual bool isInside ( const Gaudi::Polar3DPoint& point ) const ;
00065 virtual bool isInside ( const Gaudi::RhoZPhiPoint& point ) const ;
00072 virtual const ISolid* cover () const ;
00073
00082 virtual const ISolid* coverTop () const ;
00083
00092 virtual std::ostream& printOut ( std::ostream& os ) const;
00093
00102 virtual MsgStream& printOut ( MsgStream& os ) const;
00103
00122 virtual unsigned int intersectionTicks( const Gaudi::XYZPoint& Point ,
00123 const Gaudi::XYZVector& Vector ,
00124 ISolid::Ticks & ticks ) const ;
00125 virtual unsigned int intersectionTicks( const Gaudi::Polar3DPoint & Point,
00126 const Gaudi::Polar3DVector & Vector,
00127 ISolid::Ticks & ticks) const ;
00128 virtual unsigned int intersectionTicks( const Gaudi::RhoZPhiPoint & Point,
00129 const Gaudi::RhoZPhiVector & Vector,
00130 ISolid::Ticks & ticks) const ;
00152 virtual unsigned int intersectionTicks( const Gaudi::XYZPoint & Point,
00153 const Gaudi::XYZVector& Vector,
00154 const ISolid::Tick& tickMin,
00155 const ISolid::Tick& tickMax ,
00156 ISolid::Ticks& ticks ) const ;
00157
00158 virtual unsigned int intersectionTicks( const Gaudi::Polar3DPoint& Point,
00159 const Gaudi::Polar3DVector & Vector,
00160 const ISolid::Tick& tickMin,
00161 const ISolid::Tick& tickMax,
00162 ISolid::Ticks& ticks ) const ;
00163
00164 virtual unsigned int intersectionTicks( const Gaudi::RhoZPhiPoint& Point,
00165 const Gaudi::RhoZPhiVector & Vector,
00166 const ISolid::Tick& tickMin,
00167 const ISolid::Tick& tickMax,
00168 ISolid::Ticks& ticks ) const ;
00169
00170
00174 inline double xsize () const
00175 { return m_box_xHalfLength*2 ; };
00176
00180 inline double ysize () const
00181 { return m_box_yHalfLength*2 ; };
00182
00186 inline double zsize () const
00187 { return m_box_zHalfLength*2 ; };
00188
00192 inline double xHalfLength() const
00193 { return m_box_xHalfLength ; };
00194
00198 inline double yHalfLength() const
00199 { return m_box_yHalfLength ; };
00200
00204 inline double zHalfLength() const
00205 { return m_box_zHalfLength ; };
00206
00207
00212 Ticks::size_type maxNumberOfTicks() const { return 2 ; }
00213
00214 protected:
00215
00218 SolidBox();
00219
00222 void setBP() ;
00223
00224 private:
00225
00226 SolidBox ( const SolidBox & );
00227 SolidBox& operator=( const SolidBox & );
00228
00234 template <class aPoint>
00235 bool isInsideImpl(const aPoint& point) const;
00236 template<class aPoint, class aVector>
00237
00238 unsigned int intersectionTicksImpl( const aPoint & Point,
00239 const aVector & Vector,
00240 const ISolid::Tick& tickMin,
00241 const ISolid::Tick& tickMax,
00242 ISolid::Ticks& ticks) const;
00243
00244 template<class aPoint, class aVector>
00245 unsigned int intersectionTicksImpl( const aPoint & Point,
00246 const aVector & Vector,
00247 ISolid::Ticks& ticks ) const;
00248
00249 private:
00250
00251 double m_box_xHalfLength ;
00252 double m_box_yHalfLength ;
00253 double m_box_zHalfLength ;
00254
00255 };
00256
00257
00259 #endif
00260