00001
00002
00003 #ifndef DETDESC_SOLIDCONS_H
00004 #define DETDESC_SOLIDCONS_H 1
00005
00006 #include <cmath>
00007 #include <iostream>
00008
00009 #include "GaudiKernel/SystemOfUnits.h"
00010
00011 #include "GaudiKernel/Point3DTypes.h"
00012 #include "GaudiKernel/Vector3DTypes.h"
00013
00014 #include "DetDesc/SolidBase.h"
00015
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 ) 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 ) 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 // ===========================================================================