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

In This Package:

SolidPolycone.h

Go to the documentation of this file.
00001 // $Id: SolidPolycone.h,v 1.15 2008/12/11 15:33:25 cattanem Exp $ 
00002 // ============================================================================
00003 #ifndef DETDESC_SOLIDPOLYCONE_H 
00004 #define DETDESC_SOLIDPOLYCONE_H 1
00005 // Include files
00006 // STD and STL 
00007 #include <cmath> 
00008 #include <iostream>
00009 #include <functional>
00010 #include <algorithm>
00011 #include <vector>
00012 // Units
00013 #include "GaudiKernel/SystemOfUnits.h"
00014 // Geometry Definitions
00015 #include "GaudiKernel/Point3DTypes.h"
00016 #include "GaudiKernel/Vector3DTypes.h"
00017 // DetDesc 
00018 #include "DetDesc/SolidBase.h" 
00019 // forward declarations 
00020 template <class TYPE>
00021 class SolidFactory;
00022 
00033 class SolidPolycone: public virtual SolidBase
00034 {
00036   friend class SolidFactory<SolidPolycone>;
00037 
00038 public:
00039   
00040   typedef std::pair<double,double>  Pair     ;
00041   typedef std::pair<double,Pair>    Triplet  ;
00042   typedef std::vector<Triplet>      Triplets ;
00043   typedef Triplets::const_iterator  Iterator ;
00044   
00052   SolidPolycone( const std::string&  Name                       ,
00053                  const Triplets   &  Params                     ,
00054                  const double        StartPhiAngle = 0          ,
00055                  const double        DeltaPhiAngle = 360*Gaudi::Units::degree );
00056 
00058   virtual ~SolidPolycone();
00059   
00065   inline std::string typeName () const { return "SolidPolycone"; };
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 ;
00083   const ISolid* cover () const ;
00084 
00093   virtual std::ostream&  printOut ( std::ostream& os = std::cout )    const;
00094   
00103   virtual MsgStream&     printOut ( MsgStream&                   )    const; 
00104   
00123   virtual unsigned int intersectionTicks( const Gaudi::XYZPoint & Point,
00124                                           const Gaudi::XYZVector& Vector,
00125                                           ISolid::Ticks& ticks  ) const ;
00126 
00127   virtual unsigned int intersectionTicks( const Gaudi::Polar3DPoint  & Point,
00128                                           const Gaudi::Polar3DVector & Vector,
00129                                           ISolid::Ticks     & ticks) const ; 
00130 
00131   virtual unsigned int intersectionTicks( const Gaudi::RhoZPhiPoint  & Point,
00132                                           const Gaudi::RhoZPhiVector & Vector,
00133                                           ISolid::Ticks     & ticks) const ;
00134   
00141   inline unsigned int number   () const { return triplets().size() ; }
00142   
00146   inline const Triplets&
00147   triplets () const { return m_triplets ; }
00148   
00152   inline Triplets::const_iterator 
00153   begin    () const { return triplets().begin(); }
00154   
00158   inline Triplets::const_iterator 
00159   end      () const { return triplets().end  (); }
00160 
00165   inline double  z( Triplets::size_type index ) const 
00166   { return ( begin() + index )->first ; }
00167   
00172   inline double  RMax( Triplets::size_type index ) const 
00173   { return ( begin() + index )->second.first ; }
00174   
00179   inline double  RMin( Triplets::size_type index ) const 
00180   { return ( begin() + index )->second.second ; }
00181   
00185   inline double startPhiAngle() const { return m_startPhiAngle;}
00186 
00190   inline double deltaPhiAngle() const { return m_deltaPhiAngle;}
00191   
00196   inline Triplets::size_type index( const double thisz ) const 
00197   { 
00198     Triplets::size_type i = thisz < z(0) || thisz > z(number()-1) ? number()-1 : 0 ;
00199     for(; i<number()-1 && z(i+1) <= thisz; ++i) {}
00200     return i ;
00201   }
00202 
00207   Ticks::size_type maxNumberOfTicks() const { return (number()+1)*2 ; }
00208 
00209 protected:
00210   
00215   class CmpZ: 
00216     public std::binary_function<Triplet,double,bool>
00217   { 
00218   public:
00219     inline bool operator() ( const Triplet& triplet , const double&  Z ) const
00220     { return triplet.first >= Z ; }
00221   };
00222 
00223 protected:
00225   static Triplets makeTriplets(double ZHalfLength        , 
00226                                double OuterRadiusMinusZ  ,
00227                                double OuterRadiusPlusZ   ,
00228                                double InnerRadiusMinusZ  , 
00229                                double InnerRadiusPlusZ ) ;
00230 
00232   static Triplets makeTriplets(double ZHalfLength        , 
00233                                double OuterRadius,
00234                                double InnerRadius) {
00235     return makeTriplets(ZHalfLength,OuterRadius,OuterRadius,InnerRadius,InnerRadius) ; }
00236 
00237 protected:
00238   
00242   SolidPolycone( const std::string& Name = "Anonymous Polycone") ;
00243 
00246   void setBP();
00247   
00248 private:
00249   
00250   SolidPolycone           ( const SolidPolycone & );  
00251   SolidPolycone& operator=( const SolidPolycone & );  
00252 
00258   template <class aPoint>
00259   bool isInsideImpl(const aPoint& point) const;
00260   
00261   template<class aPoint, class aVector>
00262   unsigned int intersectionTicksImpl( const aPoint  & Point,
00263                                       const aVector & Vector,
00264                                       ISolid::Ticks& ticks ) const;
00265 
00267   inline bool insidePhi ( const double phi /* [-pi,pi] */ ) const {
00268     return 
00269       noPhiGap() ||
00270       ( startPhiAngle ()                   <= phi &&
00271         startPhiAngle () + deltaPhiAngle() >= phi     ) ||
00272       ( startPhiAngle ()                   <= phi + 2*M_PI &&
00273         startPhiAngle () + deltaPhiAngle() >= phi + 2*M_PI ) ;
00274   }
00275 
00277   bool noPhiGap() const { return m_deltaPhiAngle == 360 * Gaudi::Units::degree ; }
00278 
00279 private:
00280   
00281   Triplets       m_triplets      ; 
00282   double         m_startPhiAngle ; 
00283   double         m_deltaPhiAngle ; 
00284   
00285   //-------------------------------------
00286   //Define a function to sort only the first element of a pair
00287   struct sort_first
00288   {
00289     bool operator () (const Triplet& left, const Triplet& right)
00290     { return left.first < right.first;  }
00291   };
00292   //-------------------------------------
00293   
00294 };
00295 
00296 // ============================================================================
00297 // The END 
00298 // ============================================================================
00299 #endif 
00300 // ============================================================================
| 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