Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

Medium.h

Go to the documentation of this file.
00001 // $Header: /nfs/slac/g/glast/ground/cvs/gismo/gismo/Medium.h,v 1.3 2001/01/23 03:41:32 burnett Exp $
00002 //
00003 
00004 
00005 #ifndef GISMO_MEDIUM_H
00006 #define GISMO_MEDIUM_H
00007 
00008 #ifdef __GNUG__
00009 #pragma interface
00010 #endif
00011 
00012 #include "geometry/GeomObject.h"
00013 
00014 class Material;
00015 class Detector;
00016 namespace gui {class DisplayRep; }
00017 class Field;
00018 class Shape;
00019 class Ray;
00020 class Vector;
00021 class Point;
00022 class DetectorVisitor;
00023 
00035 class Medium  : public GeomObject
00036 {
00037 public:
00038     
00040     Medium(Medium* parent =0, float size=100);
00042 
00049     Medium(Medium* parent, Shape* vol, const char* mat= "vacuum", Detector * det= 0);
00050 
00052     Medium(const Medium& old);
00053     
00055     virtual ~Medium();
00056     
00058     virtual Medium&  addMedium(Medium* nextMedium);
00060     virtual Medium& removeMedium (Medium* oldMedium);
00061     
00062     
00064     Medium&  setParent(Medium* p)       {_parent = p; return *this;}
00065     Medium&  setVolume(Shape* vol)      {_volume = vol;return *this;}
00066     Medium&  setMaterial(Material *mat) {_material = mat;return *this;}
00067     Medium&  setDetector(Detector *det) {_detector = det;return *this;}
00068     Medium&  setTitle(const char *newTitle);
00069     
00071     virtual Medium& setKECutOff(float keCut);
00072     virtual Medium& setMaxStep(float mxStep);
00073     virtual Medium& setField(Field* );
00074     
00075     
00076     
00078     virtual const char* nameOf() const;
00079     virtual int  isComposite()const;
00080     const char* title()  const  {return _title? _title : "no title";}
00081     
00082     Shape&      volume()        {return *_volume;}
00083     const Shape& volume()const   {return *_volume;}
00084     Field&      field()const    {return *_field;}
00085     Material&   material()const {return *_material;}
00086     
00087     const Medium* getParent() const {return _parent;}
00088     const Medium* parent()const     {return _parent;}
00089     
00090     float       kECutOff()const  {return _keCutOff;}
00091     float       maxStep()const   {return _maxStep;}
00092     Detector*   detector()const  {return _detector;}
00093     
00095         GeomObject& transform(const CoordTransform& );
00096     
00097     //  Methods for tracking
00098     
00100     Ray* CreateRay(const Point& position, const Vector& momentum, float charge,float maxdist=0 )const;
00101     
00103 
00106     virtual double distanceToLeave( const Ray& r,       const Medium*& nextMedium, double maxStep ) const;
00107     
00109     virtual const Medium * inside(const Point& r)const;
00110     
00112     virtual double distanceToEnter( const Ray& r,               const Medium*& newstuff, double ) const;
00113     
00115     static void setLastMedium(const Medium *last) {lastMedium = last;}
00116     
00117     
00119     virtual void clear();
00120     virtual void generateResponse();
00121     virtual void accept(DetectorVisitor&);
00122     virtual void readData(std::istream&);
00123     virtual void writeData(std::ostream&);
00124     
00126     virtual void notify(); 
00127     
00129     virtual void printOn( std::ostream& os = std::cout ) const;
00130     virtual void printResponse(std::ostream& os= std::cout) const;
00131     
00133     virtual void createDetectorView(gui::DisplayRep& v);
00135     virtual void createResponseView(gui::DisplayRep& v);
00136     
00137     
00138 protected:
00139     void set_defaults();
00140     static unsigned s_count;  // keep informal track of number of Medium's constructed
00141 
00142     // Medium contents:
00143 
00144     Shape*      _volume;        // Container Volume
00145     Material*   _material;      // Material description
00146     Detector*   _detector;      // (optional) Detector
00147     Field*      _field;         // Magnetic Field, null for no field
00148     
00149     Medium*     _parent;        // The medium in which this exists, null for root 
00150     
00151     // attributes for tracking
00152     float       _keCutOff;      // Cut-off momentum for swimming
00153     float       _maxStep;       // Step size limit
00154     
00155     char*       _title;         // User setable title
00156     
00157     static const Medium *lastMedium; // pointer to the last distanceToLeave Medium
00158        
00159 };
00160 //
00161 // Operator overloads for <<
00162 inline std::ostream& operator<< (std::ostream& os, const Medium &m){m.printOn(os);return os;}
00163 inline std::ostream& operator<< (std::ostream& os, const Medium *m){m->printOn(os);return os;}
00164 
00165 #endif
00166 

Generated at Wed Nov 21 12:20:26 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000