| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

SolidCons.h

Go to the documentation of this file.
00001 // $Id: SolidCons.h,v 1.22 2008/10/28 12:04:37 cattanem Exp $ 
00002 // ===========================================================================
00003 #ifndef     DETDESC_SOLIDCONS_H
00004 #define     DETDESC_SOLIDCONS_H 1   
00005 // STD and STL 
00006 #include <cmath> 
00007 #include <iostream>
00008 // Units
00009 #include "GaudiKernel/SystemOfUnits.h"
00010 // Geometry Definitions
00011 #include "GaudiKernel/Point3DTypes.h"
00012 #include "GaudiKernel/Vector3DTypes.h"
00013 // DetDesc 
00014 #include "DetDesc/SolidBase.h" 
00015 // forward declarations 
00016 template <class TYPE>
00017 class SolidFactory;
00018 
00028 class SolidCons: public virtual SolidBase
00029 {
00031   friend class SolidFactory<SolidCons>;
00032 
00033 public:
00034   
00047   SolidCons( const std::string& name                                  ,
00048              const double       ZHalfLength                           , 
00049              const double       OuterRadiusAtMinusZ                   ,
00050              const double       OuterRadiusAtPlusZ                    ,
00051              const double       InnerRadiusAtMinusZ  =   0.0          , 
00052              const double       InnerRadiusAtPlusZ   =   0.0          , 
00053              const double       StartPhiAngle =   0.0 * Gaudi::Units::degree, 
00054              const double       DeltaPhiAngle = 360.0 * Gaudi::Units::degree,
00055              const int          CoverModel           =   0            );
00056 
00058   virtual ~SolidCons();
00059   
00065   inline std::string typeName () const { return "SolidCons"; };
00066   
00075   bool isInside (  const Gaudi::XYZPoint& point ) const ;
00076   bool isInside ( const Gaudi::Polar3DPoint   & point ) const;
00077   bool isInside ( const Gaudi::RhoZPhiPoint   & point ) const; 
00092   const ISolid* cover () const ;
00093   
00102   virtual std::ostream&  printOut ( std::ostream& os = std::cout )    const;
00103   
00112   virtual MsgStream&     printOut ( MsgStream&                   )    const; 
00113   
00133   virtual unsigned int intersectionTicks( const Gaudi::XYZPoint & Point,
00134                                           const Gaudi::XYZVector& Vector,
00135                                           ISolid::Ticks& ticks  ) const ;
00136 
00137   virtual unsigned int intersectionTicks( const Gaudi::Polar3DPoint  & Point,
00138                                           const Gaudi::Polar3DVector & Vector,
00139                                           ISolid::Ticks     & ticks) const ; 
00140 
00141   virtual unsigned int intersectionTicks( const Gaudi::RhoZPhiPoint  & Point,
00142                                           const Gaudi::RhoZPhiVector & Vector,
00143                                           ISolid::Ticks     & ticks) const ;
00144   
00167   unsigned int intersectionTicks( const Gaudi::XYZPoint& Point,
00168                                   const Gaudi::XYZVector & Vector,
00169                                   const ISolid::Tick& tickMin,
00170                                   const ISolid::Tick& tickMax,
00171                                   ISolid::Ticks& ticks   ) const ; 
00172 
00173   unsigned int intersectionTicks( const Gaudi::Polar3DPoint& Point,
00174                                   const Gaudi::Polar3DVector & Vector,
00175                                   const ISolid::Tick& tickMin,
00176                                   const ISolid::Tick& tickMax,
00177                                   ISolid::Ticks& ticks   ) const ; 
00178 
00179   unsigned int intersectionTicks( const Gaudi::RhoZPhiPoint& Point,
00180                                   const Gaudi::RhoZPhiVector & Vector,
00181                                   const ISolid::Tick& tickMin,
00182                                   const ISolid::Tick& tickMax,
00183                                   ISolid::Ticks& ticks   ) const ; 
00184 
00188   inline double  innerRadiusAtMinusZ () const 
00189   { return m_cons_innerRadiusMinusZ ; };
00190   
00194   inline double  outerRadiusAtMinusZ () const 
00195   { return m_cons_outerRadiusMinusZ ; };
00196   
00200   inline double  innerRadiusAtPlusZ  () const 
00201   { return m_cons_innerRadiusPlusZ  ; };
00202   
00206   inline double  outerRadiusAtPlusZ  () const 
00207   { return m_cons_outerRadiusPlusZ  ; };
00208   
00212   inline double  zHalfLength         () const 
00213   { return m_cons_zHalfLength       ; };
00214 
00218   inline double  startPhiAngle       () const 
00219   { return m_cons_startPhiAngle     ; }; 
00220 
00224   inline double  deltaPhiAngle       () const
00225   { return m_cons_deltaPhiAngle     ; }; 
00226 
00230   inline double  innerDiameterAtMinusZ () const 
00231   { return m_cons_innerRadiusMinusZ * 2 ; };
00232   
00236   inline double  outerDiameterAtMinusZ () const 
00237   { return m_cons_outerRadiusMinusZ * 2 ; };
00238   
00242   inline double  innerDiameterAtPlusZ  () const 
00243   { return m_cons_innerRadiusPlusZ  * 2 ; };
00244   
00248   inline double  outerDiameterAtPlusZ  () const 
00249   { return m_cons_outerRadiusPlusZ  * 2 ; };
00250   
00254   inline double  zLength               () const 
00255   { return m_cons_zHalfLength       * 2 ; };
00256   
00260   inline double  endPhiAngle           () const 
00261   { return m_cons_startPhiAngle + m_cons_deltaPhiAngle ; }; 
00262   
00263 protected:
00264 
00269   inline double iR_z( const double z ) const ;
00270   
00275   inline double oR_z( const double z ) const ;
00276 
00277 
00279   bool noPhiGap() const { return m_noPhiGap ; }
00280   
00282   inline bool insidePhi ( const double phi /* [-pi,pi] */ ) const ;
00283 
00288   template <class aPoint>
00289   inline bool insidePhi ( const aPoint& point ) const ;
00290 
00295   Ticks::size_type maxNumberOfTicks() const { return 4 ; }
00296 
00297 protected:
00298   
00302   SolidCons( const std::string& Name = "Anonymous CONS") ;
00303 
00306   void setBP();
00307 
00308 private:
00309 
00310   SolidCons           ( const SolidCons & );  
00311   SolidCons& operator=( const SolidCons & );  
00312 
00318   template<class aPoint>
00319   bool isInsideImpl(const aPoint& point) const;
00320 
00321   template<class aPoint, class aVector>
00322   unsigned int intersectionTicksImpl( const aPoint  & Point,
00323                                       const aVector & Vector,
00324                                       const ISolid::Tick& tickMin,
00325                                       const ISolid::Tick& tickMax,
00326                                       ISolid::Ticks&  ticks) const;
00327 
00328   template<class aPoint, class aVector>
00329   unsigned int intersectionTicksImpl( const aPoint  & Point,
00330                                       const aVector & Vector,
00331                                       ISolid::Ticks& ticks ) const;
00332 
00333 private:
00334 
00335   double                  m_cons_zHalfLength       ;
00336   double                  m_cons_outerRadiusMinusZ ;
00337   double                  m_cons_outerRadiusPlusZ  ;
00338   double                  m_cons_innerRadiusMinusZ ;
00339   double                  m_cons_innerRadiusPlusZ  ;
00340   double                  m_cons_startPhiAngle     ;
00341   double                  m_cons_deltaPhiAngle     ;
00343   int                     m_cons_coverModel        ;
00344   bool                    m_noPhiGap               ;
00345   
00346 };
00347 // ===========================================================================
00348 
00349 // ===========================================================================
00354 // ===========================================================================
00355 inline double SolidCons::iR_z( const double z ) const
00356 {  
00357   const double a = 
00358     ( innerRadiusAtPlusZ () - innerRadiusAtMinusZ () ) / zHalfLength ();
00359   const double b = 
00360     ( innerRadiusAtPlusZ () + innerRadiusAtMinusZ () )  ; 
00361   return 0.5 * ( a * z  + b );
00362 };
00363 // ===========================================================================
00364 
00365 // ===========================================================================
00370 // ===========================================================================
00371 inline double SolidCons::oR_z( const double z ) const
00372 {
00373   const double a = 
00374     ( outerRadiusAtPlusZ () - outerRadiusAtMinusZ () ) / zHalfLength ();
00375   const double b = 
00376     ( outerRadiusAtPlusZ () + outerRadiusAtMinusZ () )  ; 
00377   return 0.5*(a*z+b);
00378 };
00379 // ===========================================================================
00380 
00381 // ===========================================================================
00386 // ===========================================================================
00387 inline bool SolidCons::insidePhi ( const double phi /* [-pi,pi] */ ) const
00388 {
00389   return 
00390     noPhiGap() ||
00391     ( startPhiAngle ()                   <= phi &&
00392       startPhiAngle () + deltaPhiAngle() >= phi     ) ||
00393     ( startPhiAngle ()                   <= phi + 2*M_PI &&
00394       startPhiAngle () + deltaPhiAngle() >= phi + 2*M_PI ) ;
00395 };
00396 
00397 // ===========================================================================
00402 // ===========================================================================
00403 template< class aPoint>
00404 inline bool SolidCons::insidePhi ( const aPoint& point ) const 
00405 {
00406   return noPhiGap() || insidePhi( point.phi() ) ;
00407 };
00408 // ===========================================================================
00409 #endif 
00410 // ===========================================================================
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:00:13 2011 for DetDesc by doxygen 1.4.7