This commit was generated by cvs2svn to compensate for changes in r13732,
[u/mrichter/AliRoot.git] / EVE / Reve / PointSet.cxx
1 // $Header$
2
3 #include "PointSet.h"
4
5 #include <Reve/RGTopFrame.h>
6
7 #include <TTree.h>
8 #include <TF3.h>
9
10 #include <TColor.h>
11 #include <TCanvas.h>
12
13 using namespace Reve;
14
15 //______________________________________________________________________
16 // PointSet
17 //
18
19 ClassImp(PointSet)
20
21 PointSet::PointSet(Int_t n_points) :
22   TPointSet3D(n_points),
23   RenderElement(fMarkerColor)
24 {
25   fMarkerStyle = 20;
26 }
27
28 PointSet::PointSet(const Text_t* name, Int_t n_points) :
29   TPointSet3D(n_points),
30   RenderElement(fMarkerColor)
31 {
32   fMarkerStyle = 20;
33   SetName(name);
34 }
35
36 PointSet::PointSet(const Text_t* name, TTree* tree,
37                    TreeVarType_e tv_type) :
38   TPointSet3D(tree->GetSelectedRows()),
39   RenderElement(fMarkerColor)
40 {
41   static const Exc_t eH("PointSet::PointSet ");
42
43   fMarkerStyle = 20;
44   SetName(name);
45   Double_t *vx = tree->GetV1(), *vy = tree->GetV2(), *vz = tree->GetV3();
46   Long64_t nr = tree->GetSelectedRows();
47
48   switch(tv_type) {
49   case TVT_XYZ:
50     while(nr-- > 0) {
51       SetNextPoint(*vx, *vy, *vz);
52       ++vx; ++vy; ++vz;
53     }
54     break;
55   case TVT_RPhiZ:
56     while(nr-- > 0) {
57       SetNextPoint(*vx * TMath::Cos(*vy), *vx * TMath::Sin(*vy), *vz);
58       ++vx; ++vy; ++vz;
59     }
60     break;
61   default:
62     throw(eH + "unknown tree variable type.");
63   }
64 }
65
66 /**************************************************************************/
67
68 void PointSet::Reset(Int_t n_points)
69 {
70   delete [] fP; fP = 0;
71   fN = n_points;
72   if(fN) fP = new Float_t [3*fN];
73   memset(fP, 0, 3*fN*sizeof(Float_t));
74   fLastPoint = -1;
75   ResetBBox();
76 }
77
78 /**************************************************************************/
79
80 void PointSet::Paint(Option_t* option)
81 {
82   if(fRnrElement == false) return;
83
84   TPointSet3D::Paint(option);
85 }
86
87 /**************************************************************************/
88 /**************************************************************************/
89
90 //______________________________________________________________________
91 // PointSetArray
92 //
93
94 ClassImp(PointSetArray)
95
96 PointSetArray::PointSetArray(const Text_t* name,
97                                              const Text_t* title) :
98   TNamed(name, title), RenderElementListBase(fColor)
99 {
100   fBins  = 0;
101   fColor = 1;
102 }
103
104 PointSetArray::~PointSetArray()
105 {
106   delete [] fBins;
107 }
108
109 /**************************************************************************/
110 /**************************************************************************/
111
112 void PointSetArray::InitBins(TGListTreeItem* tree_item, const Text_t* quant_name,
113                                      Int_t nbins, Double_t min, Double_t max)
114 {
115   fQuantName = quant_name;
116   fNBins     = nbins;
117   fMin = fCurMin = min;
118   fMax = fCurMax = max;
119   fBinWidth  = (fMax - fMin)/fNBins;
120
121   fBins = new Reve::PointSet*[fNBins];
122   for(Int_t i=0; i<fNBins; ++i) {
123     fBins[i] = new Reve::PointSet
124       (Form("Slice %d [%4.3lf, %4.3lf]", i, fMin + i*fBinWidth, fMin + (i+1)*fBinWidth));
125     AddElement(fBins[i]);
126     if(tree_item)
127       gReve->AddRenderElement(tree_item, fBins[i]);
128   }
129 }
130
131 void PointSetArray::Fill(Double_t quant, Double_t x, Double_t y, Double_t z)
132 {
133   Int_t bin    = Int_t( (quant - fMin)/fBinWidth );
134   if(bin >= 0 && bin < fNBins)
135     fBins[bin]->SetNextPoint(x, y, z);
136 }
137
138 void PointSetArray::Fill(TF3* , TTree* , TreeVarType_e )
139 {
140
141 }
142
143 void PointSetArray::CloseBins(Int_t mark_stlye, Float_t mark_size)
144 {
145   for(Int_t i=0; i<fNBins; ++i) {
146     fBins[i]->SetMarkerColor(fColor);
147     fBins[i]->SetMarkerColor(fColor);
148     fBins[i]->SetMarkerStyle(mark_stlye);
149     fBins[i]->SetMarkerSize(mark_size);
150     fBins[i]->fN = fBins[i]->fLastPoint; // HACK! PolyMarker3D does half-management of array size.
151     fBins[i]->ComputeBBox();
152   }
153 }
154
155 /**************************************************************************/
156
157 void PointSetArray::SetRange(Double_t min, Double_t max)
158 {
159   using namespace TMath;
160
161   fCurMin = min; fCurMax = max;
162   Int_t  low_b = (Int_t) Max(Double_t(0),       Floor((min-fMin)/fBinWidth));
163   Int_t high_b = (Int_t) Min(Double_t(fNBins-1), Ceil((max-fMin)/fBinWidth));
164   for(Int_t i=0; i<fNBins; ++i) {
165     fBins[i]->SetRnrElement(i>=low_b && i<=high_b);
166   }
167 }
168
169 /**************************************************************************/
170
171 #include <TGFrame.h>
172 #include <TGDoubleSlider.h>
173 #include <TGXYLayout.h>
174
175 void PointSetArray::MakeScrollbar()
176 {
177   TGMainFrame* mf = new TGMainFrame(gClient->GetRoot(), 320, 60);
178
179   TGDoubleHSlider* hs = new TGDoubleHSlider(mf);
180   hs->SetRange(fMin, fMax);
181   hs->SetPosition(fMin, fMax);
182   hs->Resize(300, 25);
183   mf->AddFrame(hs, new TGLayoutHints(kLHintsCenterX, 10, 10, 10, 10));
184
185   hs->Connect("PositionChanged()", "Reve::PointSetArray",
186               this, "HandleScrollEvent()");
187
188   mf->SetWindowName(fQuantName + " Selector");
189   mf->MapSubwindows();
190   mf->Resize(mf->GetDefaultSize()); // this is used here to init layout algorithm
191   mf->MapWindow();
192 }
193
194 void PointSetArray::HandleScrollEvent()
195 {
196   TGDoubleHSlider* hs = (TGDoubleHSlider*)gTQSender;
197
198   Float_t min = hs->GetMinPosition(), max = hs->GetMaxPosition();
199   printf("hslidor min=%f max=%f\n", min, max);
200   SetRange(min, max);
201 }