00001
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
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;
00141
00142
00143
00144 Shape* _volume;
00145 Material* _material;
00146 Detector* _detector;
00147 Field* _field;
00148
00149 Medium* _parent;
00150
00151
00152 float _keCutOff;
00153 float _maxStep;
00154
00155 char* _title;
00156
00157 static const Medium *lastMedium;
00158
00159 };
00160
00161
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