00001 #ifndef STAR_StDraw3D
00002 #define STAR_StDraw3D
00003
00004
00005
00006 #include "TObject.h"
00007 #include "Gtypes.h"
00008 #include "TString.h"
00009 #include "TMath.h"
00010 #include <map>
00011 #include <vector>
00012
00013 class TVirtualPad;
00014 class TVirtualViewer3D;
00015 class TVolume;
00017 enum EDraw3DStyle {kVtx
00018 ,kPrimaryTrack
00019 ,kGlobalTrack
00020 ,kUsedHit
00021 ,kUnusedHit
00022 ,kTrackBegin
00023 ,kTrackEnd
00024 ,kBarrelStyle=5000
00025 ,kUser
00026 };
00027
00029 class StDraw3DStyle {
00030 private:
00031 EDraw3DStyle fType;
00032 Color_t fColor;
00033 Style_t fSty;
00034 Size_t fSiz;
00035 public:
00036 StDraw3DStyle(EDraw3DStyle typ=kUsedHit
00037 , Color_t col = Color_t(-1)
00038 , Style_t sty = Style_t(-1)
00039 , Size_t siz = Size_t (-1))
00040 : fType(typ),fColor(col),fSty(sty),fSiz(siz) {}
00041 Color_t Col() const { return fColor;}
00042 Style_t Sty() const { return fSty; }
00043 Size_t Siz() const { return fSiz; }
00044 EDraw3DStyle Type() const { return fType; }
00045 Color_t &Col() { return fColor;}
00046 Style_t &Sty() { return fSty; }
00047 Size_t &Siz() { return fSiz; }
00048 EDraw3DStyle &Type() { return fType; }
00049 void SetCol(Color_t col) { Col() = col;}
00050 void SetSty(Style_t sty) { Sty() = sty;}
00051 void SetSiz(Size_t siz) { Siz() = siz;}
00052 void SetType(Color_t col, Style_t sty, Size_t siz)
00053 { SetCol(col); SetSiz(siz); SetSty(sty); }
00054 static Color_t Pt2Color(double pt);
00055 };
00056 namespace StarRoot {
00057 class StEta {
00058 protected:
00059 double fLambda;
00060 double fDLambda1;
00061 double fDLambda2;
00062 double fEta;
00063 double fDEta;
00064 protected:
00065 StEta &SetAngle(double eta, double dEta);
00066 public:
00067 StEta(double eta,double dEta);
00068 ~StEta(){;}
00069 StEta(const StEta &eta);
00070 StEta &operator=(const StEta &eta);
00071 double Eta() const;
00072 double Deta() const;
00073 double Lambda() const;
00074 double LambdaDeg() const ;
00075 static double Lambda(double eta);
00076 double dLambda1() const;
00077 double dLambda2() const;
00078 operator double() const;
00079 const StEta operator-(double eta);
00080 const StEta operator+(double eta);
00081 const StEta operator-(const StEta &eta);
00082 const StEta operator+(const StEta &eta);
00083
00084 StEta &operator+=(const StEta &eta);
00085 StEta &operator+=(double eta);
00086 StEta &operator-=(const StEta &eta);
00087 StEta &operator-=(double eta);
00088 };
00089
00090 inline StEta &StEta::SetAngle(double eta, double dEta) {
00091 fEta = eta; fDEta = dEta;
00092 fLambda = Lambda(eta);
00093 fDLambda1 = Lambda(eta-dEta/2);
00094 fDLambda2 = Lambda(eta+dEta/2);
00095 return *this;
00096 }
00097 inline double StEta::Lambda() const { return fLambda; }
00098
00099 inline double StEta::Lambda(double eta) {
00100 return 2*TMath::ATan(TMath::Exp(-eta));
00101 }
00102
00103 inline StEta::StEta(double eta,double dEta) { SetAngle(eta,dEta); }
00104 inline StEta::StEta(const StEta &eta){
00105 fLambda = eta.fLambda; fDLambda1 = eta.fDLambda1; fDLambda2 = eta.fDLambda2;
00106 fEta = eta.fEta; fDEta = eta.fDEta;
00107 }
00108 inline StEta &StEta::operator=(const StEta &eta) {
00109 fLambda = eta.fLambda; fDLambda1 = eta.fDLambda1; fDLambda2 = eta.fDLambda2;
00110 fEta = eta.fEta; fDEta = eta.fDEta;
00111 return *this;
00112 }
00113 inline double StEta::Deta() const { return fDEta; }
00114 inline double StEta::Eta() const { return fEta; }
00115 inline double StEta::LambdaDeg() const{ return fLambda*TMath::RadToDeg(); }
00116 inline double StEta::dLambda1() const { return fDLambda1; }
00117 inline double StEta::dLambda2() const { return fDLambda2; }
00118 inline StEta::operator double() const { return fLambda; }
00119 inline const StEta StEta::operator-(double eta) { return StEta(fEta-eta,fDEta); }
00120 inline const StEta StEta::operator+(double eta) { return StEta(fEta+eta,fDEta); }
00121 inline const StEta StEta::operator-(const StEta &eta) { return operator-(eta.fEta); }
00122 inline const StEta StEta::operator+(const StEta &eta) { return operator+(eta.fEta); }
00123
00124 inline StEta &StEta::operator+=(const StEta &eta) { return operator+=(eta.fEta); }
00125 inline StEta &StEta::operator+=(double eta) { return SetAngle(fEta+eta,fDEta); }
00126 inline StEta &StEta::operator-=(const StEta &eta) { return operator-=(eta.fEta); }
00127 inline StEta &StEta::operator-=(double eta) { return SetAngle(fEta-eta,fDEta); }
00128
00129 }
00130
00131
00132 class view_3D;
00133
00136
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 class StDraw3D : public TObject
00166 {
00167 private:
00168 static int fgDraw_3d_init;
00169 std::map<EDraw3DStyle,StDraw3DStyle> fStyles;
00170 TVirtualPad *fPad;
00171 Color_t fBkColor;
00172 TVirtualViewer3D *fViewer;
00173 view_3D *fView;
00174 TString fDetectorName;
00175 StDraw3D *fMaster;
00176 TVolume *fTopVolume;
00177 Bool_t fWantPad;
00178 Bool_t fOwnViewer;
00179 Bool_t fOwnPad;
00180
00181 static Color_t fgColorDefault;
00182 static Style_t fgStyDefault;
00183 static Size_t fgSizDefault;
00184 static Color_t fgBkColor;
00185 static Int_t fDrawCanvasCounter;
00186 TVirtualPad *InitPad();
00187 void SetMaster(StDraw3D *master);
00188 void InitViewer();
00189 void Redraw();
00190 protected:
00191 virtual void UpdateViewer(TVirtualPad *pad=0);
00192
00193 public:
00194 StDraw3D(const char *detectorName="TPC",TVirtualPad *pad = 0);
00195 StDraw3D(TVirtualViewer3D *viewer,TVirtualPad *pad);
00196 virtual ~StDraw3D();
00197 virtual const StDraw3DStyle &AddStyle(EDraw3DStyle type,Color_t col,Style_t sty,Size_t siz);
00198 TVirtualPad *Pad() const;
00199 TVirtualViewer3D *Viewer() const;
00200 virtual void Clear(Option_t *opt="update");
00201 virtual TObject *Draw(TObject *o, const char *option="");
00202 virtual const TString &DetectorNames() const;
00203 virtual void SetDetectors(const char*nameDetectors);
00204 virtual void AddDetectors(const char*nameDetectors);
00205 virtual void Draw(Option_t *option="") {TObject::Draw(option);}
00206 virtual const StDraw3DStyle &Style(EDraw3DStyle type) const;
00207 virtual StDraw3DStyle &Style(EDraw3DStyle type);
00208 virtual void SetBkColor(Color_t newBkColor);
00209
00210 virtual TObject *Draw3D(int n, const float *xyz);
00211
00212 virtual TObject *Draw3D(int n, const double *xyz);
00213
00214 virtual TObject *Points(int n, const float *xyz
00215 , EDraw3DStyle sty);
00216
00217 virtual TObject *Points(int n, const double *xyz
00218 , EDraw3DStyle sty);
00219
00220 virtual TObject *Points(int n, const float *xyz
00221 , Color_t col= Color_t(-1)
00222 , Style_t sty= Style_t(-1)
00223 , Size_t siz = Size_t (-1));
00224
00225 virtual TObject *Points(int n, const double *xyz
00226 , Color_t col= Color_t(-1)
00227 , Style_t sty= Style_t(-1)
00228 , Size_t siz = Size_t (-1));
00229
00230 virtual TObject *Points(const std::vector<float> &xyz
00231 , EDraw3DStyle sty);
00232
00233 virtual TObject *Points(const std::vector<double> &xyz
00234 , EDraw3DStyle sty);
00235
00236 virtual TObject *Points(const std::vector<float> &xyz
00237 , Color_t col= Color_t(-1)
00238 , Style_t sty= Style_t(-1)
00239 , Size_t siz = Size_t (-1));
00240
00241 virtual TObject *Points(const std::vector<double> &xyz
00242 , Color_t col= Color_t(-1)
00243 , Style_t sty= Style_t(-1)
00244 , Size_t siz = Size_t (-1));
00245
00246 virtual TObject *Point(float x, float y, float z
00247 , Color_t col= Color_t(-1)
00248 , Style_t sty= Style_t(-1)
00249 , Size_t siz = Size_t (-1));
00250
00251 virtual TObject *Point(float x, float y, float z
00252 , EDraw3DStyle sty);
00253
00254 virtual TObject *Line(int n, const double *xyz
00255 , Color_t col= Color_t(-1)
00256 , Style_t sty= Style_t(-1)
00257 , Size_t siz = Size_t (-1));
00258
00259 virtual TObject *Line(float x0, float y0, float z0
00260 , float x1, float y1, float z1
00261 , Color_t col= Color_t(-1)
00262 , Style_t sty= Style_t(-1)
00263 , Size_t siz = Size_t (-1));
00264
00265 virtual TObject *Line(int n, const float *xyz
00266 , Color_t col= Color_t(-1)
00267 , Style_t sty= Style_t(-1)
00268 , Size_t siz = Size_t (-1));
00269
00270 virtual TObject *Line(const std::vector<float> &xyz
00271 , Color_t col= Color_t(-1)
00272 , Style_t sty= Style_t(-1)
00273 , Size_t siz = Size_t (-1));
00274
00275 virtual TObject *Line(const std::vector<double> &xyz
00276 , Color_t col= Color_t(-1)
00277 , Style_t sty= Style_t(-1)
00278 , Size_t siz = Size_t (-1));
00279
00280 virtual TObject *Line(int n, const float *xyz
00281 , EDraw3DStyle sty);
00282
00283 virtual TObject *Line(int n, const double *xyz
00284 , EDraw3DStyle sty);
00285
00286 virtual TObject *Line(const std::vector<float> &xyz
00287 , EDraw3DStyle sty);
00288
00289 virtual TObject *Line(const std::vector<double> &xyz
00290 , EDraw3DStyle sty);
00291
00292 virtual TObject *Tower(float radius
00293 , float lambda, float lambda1, float lambda2
00294 , float phi,float dphi
00295 , Color_t col,Style_t sty, Size_t siz);
00296 virtual TObject *Tower( float radius, float lambda, float phi
00297 , float dlambda, float dphi
00298 , Color_t col,Style_t sty, Size_t siz);
00299 virtual TObject *Tower( float radius, const StarRoot::StEta &eta
00300 , float phi, float dphi
00301 , Color_t col,Style_t sty, Size_t siz);
00302
00303 virtual void Joint(StDraw3D *dsp);
00304 virtual void SetModel(TObject *model);
00305 virtual void SetComment(const char *cmnt);
00306 virtual void AddComment(const char *cmnt);
00307 virtual void Print(const char *filename) const ;
00308 virtual void Print(const char *filename, const char*type) const ;
00309 virtual void Save(const char *filename, const char*type="png") const ;
00310 virtual void Update(bool asap=false);
00311 virtual void Modified();
00312 virtual void UpdateModified();
00313 virtual void SetDrawOption(Option_t *option="");
00314 virtual void SetFooter(const char *footer);
00315 virtual void Animate();
00316
00317 void Draw3DTest();
00318 static void ShowTest();
00319 static void ShowDetectorTest(const char *detectorName="StarDetectorUnfolding");
00320 private:
00321 void Init();
00322
00323 ClassDef(StDraw3D,0);
00324 };
00325 #endif