00001
00002
00003 #ifndef DETDESC_SOLIDPOLYCONE_H
00004 #define DETDESC_SOLIDPOLYCONE_H 1
00005
00006
00007 #include <cmath>
00008 #include <iostream>
00009 #include <functional>
00010 #include <algorithm>
00011 #include <vector>
00012
00013 #include "GaudiKernel/SystemOfUnits.h"
00014
00015 #include "GaudiKernel/Point3DTypes.h"
00016 #include "GaudiKernel/Vector3DTypes.h"
00017
00018 #include "DetDesc/SolidBase.h"
00019
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 ) 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
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
00298
00299 #endif
00300 // ============================================================================