#ifndef ROOT_TGL5D
#define ROOT_TGL5D
#include <utility>
#include <vector>
#include <list>
#ifndef ROOT_TGLPlotPainter
#include "TGLPlotPainter.h"
#endif
#ifndef ROOT_TGLHistPainter
#include "TGLHistPainter.h"
#endif
#ifndef ROOT_TGLIsoMesh
#include "TGLIsoMesh.h"
#endif
#ifndef ROOT_TGLUtil
#include "TGLUtil.h"
#endif
#ifndef ROOT_KDEFGT
#include "TKDEFGT.h"
#endif
#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
class TGLPlotCamera;
class TGL5DPainter;
class TTree;
class TH3F;
class TGL5DDataSet : public TNamed {
friend class TGL5DPainter;
private:
enum {
kDefaultNB = 100
};
public:
TGL5DDataSet(TTree *inputData);
~TGL5DDataSet();
Int_t DistancetoPrimitive(Int_t px, Int_t py);
void ExecuteEvent(Int_t event, Int_t px, Int_t py);
char *GetObjectInfo(Int_t px, Int_t py) const;
void Paint(Option_t *option);
TH3F *GetHist()const {return fHist;}
TGL5DPainter *GetRealPainter()const;
private:
Long64_t fNP;
const Double_t *fV1;
const Double_t *fV2;
const Double_t *fV3;
const Double_t *fV4;
const Double_t *fV5;
Rgl::Range_t fV1MinMax;
Rgl::Range_t fV2MinMax;
Rgl::Range_t fV3MinMax;
Rgl::Range_t fV4MinMax;
Rgl::Range_t fV5MinMax;
TH3F *fHist;
Bool_t fV4IsString;
std::auto_ptr<TGLHistPainter> fPainter;
TGL5DDataSet(const TGL5DDataSet &rhs);
TGL5DDataSet &operator = (const TGL5DDataSet &rhs);
ClassDef(TGL5DDataSet, 0)
};
class TGL5DPainter : public TGLPlotPainter {
public:
enum EDefaults {
kNContours = 4,
kNLowPts = 50
};
typedef Rgl::Mc::TIsoMesh<Float_t> Mesh_t;
struct Surf_t {
Surf_t() : f4D(0.), fShowCloud(kFALSE), fHide(kFALSE), fColor(0)
{
}
Mesh_t fMesh;
Double_t f4D;
Double_t fRange;
Bool_t fShowCloud;
Bool_t fHide;
Color_t fColor;
std::vector<Double_t> fPreds;
};
typedef std::list<Surf_t> SurfList_t;
typedef SurfList_t::iterator SurfIter_t;
typedef SurfList_t::const_iterator ConstSurfIter_t;
private:
TKDEFGT fKDE;
const Surf_t fDummy;
Bool_t fInit;
SurfList_t fIsos;
const TGL5DDataSet *fData;
typedef std::vector<Double_t>::size_type size_type;
mutable std::vector<Double_t> fTS;
mutable std::vector<Double_t> fDens;
std::vector<Double_t> fPtsSorted;
Rgl::Range_t fV5PredictedRange;
Rgl::Range_t fV5SliderRange;
Bool_t fShowSlider;
Double_t fAlpha;
Int_t fNContours;
public:
TGL5DPainter(const TGL5DDataSet *data, TGLPlotCamera *camera, TGLPlotCoordinates *coord);
const Rgl::Range_t &GetV1Range()const;
const Rgl::Range_t &GetV2Range()const;
const Rgl::Range_t &GetV3Range()const;
const Rgl::Range_t &GetV4Range()const;
const Rgl::Range_t &GetV5Range()const;
Double_t GetV5PredictedMin()const{return fV5PredictedRange.first;}
Double_t GetV5PredictedMax()const{return fV5PredictedRange.second;}
void SetV5SliderMin(Double_t min);
Double_t GetV5SliderMin() const {return fV5SliderRange.first;}
void SetV5SliderMax(Double_t max);
Double_t GetV5SliderMax() const {return fV5SliderRange.second;}
Bool_t ShowSlider() const {return fShowSlider;}
void ShowSlider(Bool_t show) {fShowSlider = show;}
SurfIter_t AddSurface(Double_t v4, Color_t ci, Double_t isoVal = 1., Double_t sigma = 1.,
Double_t e = 10., Double_t range = 1e-3, Int_t lowNumOfPoints = kNLowPts);
void SetSurfaceMode(SurfIter_t surf, Bool_t cloudOn);
void SetSurfaceColor(SurfIter_t surf, Color_t colorIndex);
void HideSurface(SurfIter_t surf);
void ShowSurface(SurfIter_t surf);
void RemoveSurface(SurfIter_t surf);
char *GetPlotInfo(Int_t px, Int_t py);
Bool_t InitGeometry();
void StartPan(Int_t px, Int_t py);
void Pan(Int_t px, Int_t py);
void AddOption(const TString &option);
void ProcessEvent(Int_t event, Int_t px, Int_t py);
void ShowBoxCut(Bool_t show) {fBoxCut.SetActive(show);}
Bool_t IsBoxCutShown()const{return fBoxCut.IsActive();}
void SetAlpha(Double_t newAlpha);
Double_t GetAlpha()const{return fAlpha;}
void SetNContours(Int_t num);
Int_t GetNContours()const{return fNContours;}
private:
void InitGL()const;
void DeInitGL()const;
void DrawPlot()const;
void DrawSectionXOZ()const{}
void DrawSectionYOZ()const{}
void DrawSectionXOY()const{}
void SetSurfaceColor(Color_t index)const;
void DrawCloud()const;
void DrawSubCloud(Double_t v4, Double_t range, Color_t ci)const;
void DrawMesh(ConstSurfIter_t surf)const;
TGL5DPainter(const TGL5DPainter &);
TGL5DPainter &operator = (const TGL5DPainter &);
ClassDef(TGL5DPainter, 0)
};
#endif