af8db6b3773c3ec996b30bfd4f267cbb9b7da48e
[u/mrichter/AliRoot.git] / EVE / Alieve / MUONChamber.cxx
1 #include "MUONChamber.h"
2
3 #include <Alieve/MUONData.h>
4 #include <Alieve/MUONChamberData.h>
5
6 #include <TBuffer3D.h>
7 #include <TBuffer3DTypes.h>
8 #include <TVirtualPad.h>
9 #include <TVirtualViewer3D.h>
10
11 #include <TStyle.h>
12 #include <TColor.h>
13 #include <TMath.h>
14
15 using namespace Alieve;
16
17 //______________________________________________________________________
18 // MUONChamber
19 //
20
21 ClassImp(MUONChamber)
22
23 //______________________________________________________________________
24 MUONChamber::MUONChamber(Int_t id, const Text_t* n, const Text_t* t) :
25 TEveElement(fFrameColor),
26 TNamed(n,t),
27 fMUONData(0),
28 fFrameColor((Color_t)2),
29 fRTS(1),
30 fChamberID(0),
31 fQuadSet1(n,t),
32 fQuadSet2(n,t),
33 fPointSet1(n),
34 fPointSet2(n),
35 fThreshold(0),
36 fMaxVal(4096),
37 fClusterSize(5),
38 fHitSize(5)
39 {
40   //
41   // constructor
42   //
43
44   Char_t name[256];
45   if (id < 10) {
46     sprintf(name,"Chamber %02d (trac)",id);
47   } else {
48     sprintf(name,"Chamber %02d (trig)",id);
49   }
50   SetName(name);
51
52   ComputeBBox();
53
54 }
55
56 //______________________________________________________________________
57 MUONChamber::~MUONChamber()
58 {
59   //
60   // destructor
61   //
62
63   if(fMUONData) fMUONData->DecRefCount();
64
65 }
66
67 //______________________________________________________________________
68 void MUONChamber::ComputeBBox()
69 {
70   //
71   // bounding box
72   //
73
74 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,11,2)
75   bbox_init();
76 #else
77   BBoxInit();
78 #endif
79   
80   fBBox[0] = - 400.0;
81   fBBox[1] = + 400.0;
82   fBBox[2] = - 400.0;
83   fBBox[3] = + 400.0;
84   fBBox[4] = -1800.0;
85   fBBox[5] = + 500.0;
86
87   Float_t* b1 = fQuadSet1.AssertBBox();
88   for(Int_t i=0; i<6; ++i) { b1[i] = fBBox[i]; }
89   Float_t* b2 = fQuadSet2.AssertBBox();
90   for(Int_t i=0; i<6; ++i) { b2[i] = fBBox[i]; }
91   Float_t* b3 = fPointSet1.AssertBBox();
92   for(Int_t i=0; i<6; ++i) { b3[i] = fBBox[i]; }
93   Float_t* b4 = fPointSet2.AssertBBox();
94   for(Int_t i=0; i<6; ++i) { b4[i] = fBBox[i]; }
95   
96 }
97
98 //______________________________________________________________________
99 void MUONChamber::Paint(Option_t*)
100 {
101   //
102   // draw...
103   //
104
105   if(fRnrSelf == kFALSE)
106     return;
107
108   TBuffer3D buffer(TBuffer3DTypes::kGeneric);
109
110   buffer.fID           = this;
111   buffer.fColor        = 2;
112   buffer.fTransparency = 0;
113   buffer.fLocalFrame   = 0;
114
115   buffer.SetSectionsValid(TBuffer3D::kCore);
116   Int_t reqSections = gPad->GetViewer3D()->AddObject(buffer);
117   if (reqSections == TBuffer3D::kNone) {
118     //printf("MUONChamber::Paint viewer was happy with Core buff3d.\n");
119     return;
120   }
121
122   printf("MUONChamber::Paint only GL supported.\n");
123   return;
124
125 }
126
127 //______________________________________________________________________
128 void MUONChamber::SetThreshold(Short_t t)
129 {
130   //
131   // digits amplitude threshold
132   //
133
134   fThreshold = TMath::Min(t, (Short_t)(fMaxVal - 1));
135   ClearColorArray();
136   IncRTS();
137
138 }
139
140 //______________________________________________________________________
141 void MUONChamber::SetMaxVal(Int_t mv)
142 {
143   //
144   // digits amplitude maximum value
145   //
146
147   fMaxVal = TMath::Max(mv, (Int_t)(fThreshold + 1));
148   ClearColorArray();
149   IncRTS();
150
151 }
152
153 //______________________________________________________________________
154 void MUONChamber::SetClusterSize(Int_t size)
155 {
156   //
157   // cluster point size
158   //
159
160   fClusterSize = TMath::Max(1, size);
161   IncRTS();
162
163 }
164
165 //______________________________________________________________________
166 void MUONChamber::SetHitSize(Int_t size)
167 {
168   //
169   // hit point size
170   //
171
172   fHitSize = TMath::Max(1, size);
173   IncRTS();
174
175 }
176
177 //______________________________________________________________________
178 void MUONChamber::SetupColor(Int_t val, UChar_t* pixel) const
179 {
180   //
181   // RGBA color for amplitude "val"
182   //
183
184   Float_t div  = TMath::Max(1, fMaxVal - fThreshold);
185   Int_t   nCol = gStyle->GetNumberOfColors();
186   Int_t   cBin = (Int_t) TMath::Nint(nCol*(val - fThreshold)/div);
187
188   TEveUtil::ColorFromIdx(gStyle->GetColorPalette(TMath::Min(nCol - 1, cBin)), pixel);
189
190 }
191
192 //______________________________________________________________________
193 Int_t MUONChamber::ColorIndex(Int_t val) const
194 {
195   //
196   // index color 
197   //
198
199   if(val < fThreshold) val = fThreshold;
200   if(val > fMaxVal)    val = fMaxVal;
201
202   Float_t div  = TMath::Max(1, fMaxVal - fThreshold);
203   Int_t   nCol = gStyle->GetNumberOfColors();
204   Int_t   cBin = (Int_t) TMath::Nint(nCol*(val - fThreshold)/div);
205
206   return gStyle->GetColorPalette(TMath::Min(nCol - 1, cBin));
207
208 }
209
210 //______________________________________________________________________
211 void MUONChamber::SetupColorArray() const
212 {
213   //
214   // build array of colors
215   //
216
217   if(fColorArray)
218     return;
219
220   fColorArray = new UChar_t [4 * (fMaxVal - fThreshold + 1)];
221   UChar_t* p = fColorArray;
222   for(Int_t v=fThreshold; v<=fMaxVal; ++v, p+=4)
223     SetupColor(v, p);
224
225 }
226
227 //______________________________________________________________________
228 void MUONChamber::ClearColorArray()
229 {
230   //
231   // delete array of colors
232   //
233
234   if(fColorArray) {
235     delete [] fColorArray;
236     fColorArray = 0;
237   }
238 }
239
240 //______________________________________________________________________
241 void MUONChamber::SetDataSource(MUONData* data)
242 {
243
244   if (data == fMUONData) return;
245   if(fMUONData) fMUONData->DecRefCount();
246   fMUONData = data;
247   if(fMUONData) fMUONData->IncRefCount();
248   IncRTS();
249
250 }
251
252 //______________________________________________________________________
253 MUONChamberData* MUONChamber::GetChamberData() const
254 {
255   
256   return fMUONData ? fMUONData->GetChamberData(fChamberID) : 0;
257
258 }
259
260 //______________________________________________________________________
261 void MUONChamber::UpdateQuads()
262 {
263
264   fQuadSet1.Reset(TEveQuadSet::kQT_RectangleXY, kTRUE, 32);
265   fQuadSet2.Reset(TEveQuadSet::kQT_RectangleXY, kTRUE, 32);
266   fPointSet1.Reset();
267   fPointSet2.Reset();
268
269   MUONChamberData* data = GetChamberData();
270   
271   Float_t *buffer;
272   Float_t x0, y0, z, w, h, clsq;
273   Int_t charge, cathode, nDigits, nClusters, nHits, oldSize, ic1, ic2;
274   Double_t clsX, clsY, clsZ;
275   Float_t hitX, hitY, hitZ;
276     
277   if (data != 0) {
278
279     SetupColorArray();
280
281     // digits
282
283     nDigits = data->GetNDigits();
284     
285     for (Int_t id = 0; id < nDigits; id++) {
286
287       buffer = data->GetDigitBuffer(id);
288
289       x0 = buffer[0]-buffer[2];
290       y0 = buffer[1]-buffer[3];
291       w  = 2*buffer[2];
292       h  = 2*buffer[3];
293       z  = buffer[4];
294       charge = (Int_t)buffer[5];
295       cathode = (Int_t)buffer[6];
296       
297       if (charge <= fThreshold) continue;
298
299       if (cathode == 0) {
300
301         fQuadSet1.AddQuad(x0, y0, z, w, h);
302         fQuadSet1.QuadColor(ColorIndex(charge));
303         
304       }
305
306       if (cathode == 1) {
307
308         fQuadSet2.AddQuad(x0, y0, z, w, h);
309         fQuadSet2.QuadColor(ColorIndex(charge));
310         
311       }
312
313     } // end digits loop
314
315     // clusters
316     
317     nClusters = data->GetNClusters()/2;  // only one cathode plane
318     oldSize = fPointSet1.GrowFor(nClusters);
319     ic1 = ic2 = 0;
320     for (Int_t ic = 0; ic < (nClusters*2); ic++) {
321
322       buffer = data->GetClusterBuffer(ic);
323
324       clsX    = (Double_t)buffer[0];
325       clsY    = (Double_t)buffer[1];
326       clsZ    = (Double_t)buffer[2];
327       clsq    = buffer[3];      
328       cathode = (Int_t)buffer[4];
329
330       if (cathode == 0) {
331         fPointSet1.SetPoint(ic1,clsX,clsY,clsZ);
332         ic1++;
333       }
334
335     } // end clusters loop
336
337     // hits
338
339     nHits = data->GetNHits();
340     oldSize = fPointSet2.GrowFor(nHits);
341     for (Int_t ih = 0; ih < nHits; ih++) {
342       buffer = data->GetHitBuffer(ih);
343       hitX = buffer[0];
344       hitY = buffer[1];
345       hitZ = buffer[2];
346       fPointSet2.SetPoint(ih,hitX,hitY,hitZ);
347     }
348
349   } // end data
350
351 }
352
353 //______________________________________________________________________
354 void MUONChamber::SetChamberID(Int_t id)
355 {
356
357   if (id <  0) id = 0;
358   if (id > 13) id = 13;
359
360   fChamberID = id;
361   IncRTS();
362
363 }
364