00001
00002
00003 #ifndef DETDESC_ILVOLUME_H
00004 #define DETDESC_ILVOLUME_H 1
00006 #include <iostream>
00007 #include <string>
00008 #include <vector>
00010 #include "GaudiKernel/MsgStream.h"
00011 #include "GaudiKernel/Point3DTypes.h"
00012 #include "GaudiKernel/Vector3DTypes.h"
00014 #include "DetDesc/ISolid.h"
00015
00017 class StatusCode;
00018 class Material;
00019 class IPVolume;
00020 class ISolid;
00021 template <class TYPE>
00022 class SmartRefVector;
00023 class Surface;
00024
00026 static const InterfaceID IID_ILVolume( 153 , 3 , 1 );
00027
00036 class ILVolume : virtual public IInterface
00037 {
00039 public:
00040
00042 typedef std::vector<IPVolume*> PVolumes;
00043 typedef PVolumes::size_type ReplicaType;
00044 typedef std::vector<ReplicaType> ReplicaPath;
00045 typedef std::vector<const IPVolume*> PVolumePath;
00046
00050 typedef std::pair<ISolid::Tick,ISolid::Tick> Interval;
00051 typedef std::pair<Interval,const Material*> Intersection;
00052 typedef std::vector<Intersection> Intersections;
00053
00055 typedef SmartRefVector<Surface> Surfaces;
00056
00057 public:
00058
00063 static const InterfaceID& interfaceID() { return IID_ILVolume; }
00064
00065 public:
00066
00070 virtual const std::string& name () const = 0;
00071
00079 virtual bool isAssembly () const = 0 ;
00080
00084 virtual const ISolid* solid () const = 0;
00085
00089 virtual const std::string& materialName () const = 0;
00090
00095 virtual const Material* material () const = 0;
00096
00101 virtual PVolumes& pvolumes () = 0 ;
00102
00106 virtual const PVolumes& pvolumes () const = 0;
00107
00111 virtual ILVolume::ReplicaType noPVolumes () const = 0;
00112
00117 virtual const IPVolume* operator[]
00118 ( const ILVolume::ReplicaType& index ) const = 0;
00119
00124 virtual const IPVolume* operator[]
00125 ( const std::string& name ) const = 0;
00126
00131 virtual const IPVolume* pvolume
00132 ( const ILVolume::ReplicaType& index ) const = 0;
00133
00138 virtual const IPVolume* pvolume
00139 ( const std::string& name ) const = 0;
00140
00144 virtual ILVolume::PVolumes::iterator pvBegin () = 0 ;
00145
00150 virtual ILVolume::PVolumes::const_iterator pvBegin () const = 0 ;
00151
00155 virtual ILVolume::PVolumes::iterator pvEnd () = 0 ;
00156
00161 virtual ILVolume::PVolumes::const_iterator pvEnd () const = 0 ;
00162
00170 virtual StatusCode traverse
00171 ( ILVolume::ReplicaPath::const_iterator pathBegin,
00172 ILVolume::ReplicaPath::const_iterator pathEnd ,
00173 ILVolume::PVolumePath& volumePath ) const = 0;
00174
00181 virtual StatusCode traverse
00182 ( const ILVolume::ReplicaPath& replicaPath,
00183 ILVolume::PVolumePath& volumePath ) const = 0;
00184
00196 virtual bool isInside ( const Gaudi::XYZPoint& LocalPoint ) const = 0;
00197
00206 virtual StatusCode
00207 belongsTo
00208 ( const Gaudi::XYZPoint& localPoint ,
00209 const int level ,
00210 ILVolume::PVolumePath& volumePath ) const = 0;
00211
00220 virtual StatusCode belongsTo
00221 ( const Gaudi::XYZPoint& localPoint ,
00222 const int level ,
00223 ILVolume::ReplicaPath& replicaPath ) const = 0;
00224
00244 virtual unsigned int intersectLine
00245 ( const Gaudi::XYZPoint & Point ,
00246 const Gaudi::XYZVector & Vector ,
00247 ILVolume::Intersections & intersections ,
00248 const double threshold ) const = 0 ;
00249
00271 virtual unsigned int intersectLine
00272 ( const Gaudi::XYZPoint & Point ,
00273 const Gaudi::XYZVector & Vector ,
00274 ILVolume::Intersections & intersections ,
00275 const ISolid::Tick tickMin ,
00276 const ISolid::Tick tickMax ,
00277 const double Threshold ) const = 0 ;
00278
00282 virtual const std::string& sdName () const = 0 ;
00283
00287 virtual const std::string& mfName () const = 0 ;
00288
00292 virtual Surfaces& surfaces() = 0 ;
00293
00297 virtual const Surfaces& surfaces() const = 0 ;
00298
00303 virtual std::ostream& printOut( std::ostream & os = std::cout) const = 0;
00304
00309 virtual MsgStream& printOut( MsgStream & os ) const = 0;
00310
00314 virtual ILVolume* reset() = 0;
00315
00316 protected:
00317
00320 virtual ~ILVolume() ;
00321 };
00322
00323
00329
00330 inline std::ostream& operator<<( std::ostream& os , const ILVolume& lv )
00331 { return lv.printOut( os ); };
00332
00333
00339
00340 inline std::ostream& operator<<( std::ostream& os , const ILVolume* lv )
00341 { return ((0==lv)?( os<<" ILVolume* points to NULL "):(os<<(*lv)));};
00342
00343
00349
00350 inline MsgStream& operator<<( MsgStream& os , const ILVolume& lv )
00351 { return lv.printOut( os ); };
00352
00353
00359
00360 inline MsgStream& operator<<( MsgStream& os , const ILVolume* lv )
00361 { return ((0==lv)?( os<<" ILVolume* points to NULL "):(os<<(*lv)));};
00362
00363
00364
00365
00366 #endif
00367 // ============================================================================