00001
00002 #ifndef DETDESC_PVOLUME_H
00003 #define DETDESC_PVOLUME_H 1
00004
00006 #include "GaudiKernel/Transform3DTypes.h"
00008 #include "DetDesc/Services.h"
00009 #include "DetDesc/IPVolume.h"
00010
00012 class IDataProviderSvc;
00013 class IMessageSvc;
00014 class MsgStream;
00015 class GaudiException;
00016 class PVolumeException;
00017
00027 class PVolume: public IPVolume
00028 {
00030 friend class LogVolBase;
00031
00032 protected:
00033
00040 PVolume
00041 ( const std::string& PhysVol_name ,
00042 const std::string& LogVol_name ,
00043
00044 const Gaudi::XYZPoint& Position = Gaudi::XYZPoint () ,
00045 const Gaudi::Rotation3D& Rotation = Gaudi::Rotation3D () );
00046
00052 PVolume
00053 ( const std::string& PhysVol_name ,
00054 const std::string& LogVol_name ,
00055
00056 const Gaudi::Transform3D& Transform );
00057
00059 virtual ~PVolume();
00060
00061 public:
00062
00063
00068 virtual const std::string& name () const { return m_name ; };
00069
00073 virtual const std::string& lvolumeName() const { return m_lvname ; };
00074
00078 virtual const ILVolume* lvolume () const ;
00079
00083 virtual const Gaudi::Transform3D& matrix () const { return m_matrix ; }
00084
00088 virtual const Gaudi::Transform3D& matrixInv () const ;
00089
00094 virtual Gaudi::XYZPoint toLocal ( const Gaudi::XYZPoint& PointInMother ) const ;
00095
00100 virtual Gaudi::XYZPoint toMother ( const Gaudi::XYZPoint& PointInLocal ) const ;
00101
00106 virtual bool isInside ( const Gaudi::XYZPoint& PointInMother ) const ;
00107
00112 virtual std::ostream& printOut
00113 ( std::ostream& os = std::cout ) const;
00114
00119 virtual MsgStream& printOut
00120 ( MsgStream& os ) const;
00121
00125 virtual IPVolume* reset () ;
00126
00148 virtual unsigned int intersectLine
00149 ( const Gaudi::XYZPoint & Point ,
00150 const Gaudi::XYZVector & Vector ,
00151 ILVolume::Intersections & intersections ,
00152 const double threshold ) const ;
00153
00177 virtual unsigned int intersectLine
00178 ( const Gaudi::XYZPoint & Point ,
00179 const Gaudi::XYZVector & Vector ,
00180 ILVolume::Intersections & intersections ,
00181 const ISolid::Tick tickMin ,
00182 const ISolid::Tick tickMax ,
00183 const double threshold ) const ;
00184
00191
00192
00197 virtual const Gaudi::Transform3D&
00198 applyMisAlignment ( const Gaudi::Transform3D& ma ) ;
00199
00203 virtual const Gaudi::Transform3D&
00204 resetMisAlignment ( ) ;
00205
00211 virtual StatusCode
00212 queryInterface( const InterfaceID& ID , void** ppI ) ;
00213
00217 virtual unsigned long addRef ();
00218
00222 virtual unsigned long release ();
00223
00224 protected:
00225
00229 ILVolume* findLogical () const ;
00230
00234 Gaudi::Transform3D* findMatrix () const ;
00235
00241 void Assert
00242 ( bool assertion ,
00243 const std::string& name ) const;
00244
00245
00252 void Assert
00253 ( bool assertion ,
00254 const std::string& name ,
00255 const GaudiException& Exception ) const;
00256
00257 protected:
00258
00263 IDataProviderSvc* dataSvc() const;
00264
00265 private:
00266
00268 PVolume() ;
00270 PVolume ( const PVolume& );
00272 PVolume& operator=( const PVolume& );
00273
00274 private:
00275
00276
00277
00278
00279 std::string m_name ;
00280
00281 std::string m_lvname ;
00282
00283 Gaudi::Transform3D m_nominal ;
00284
00285 Gaudi::Transform3D m_matrix ;
00286
00287 mutable Gaudi::Transform3D* m_imatrix ;
00288
00289 mutable ILVolume* m_lvolume ;
00290
00291 static unsigned long s_volumeCounter ;
00292
00293 DetDesc::Services* m_services ;
00294 };
00295
00297 #endif
00298
00299