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