2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
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"
11 #include <EveDet/AliEveMUONData.h>
12 #include <EveDet/AliEveMUONChamberData.h>
14 #include <TBuffer3D.h>
15 #include <TBuffer3DTypes.h>
16 #include <TVirtualPad.h>
17 #include <TVirtualViewer3D.h>
24 //______________________________________________________________________________
28 ClassImp(AliEveMUONChamber)
30 //______________________________________________________________________________
31 AliEveMUONChamber::AliEveMUONChamber(Int_t id, const Text_t* n, const Text_t* t) :
32 TEveElement(fFrameColor),
35 fFrameColor((Color_t)2),
53 sprintf(name,"Chamber %02d (trac)",id);
55 sprintf(name,"Chamber %02d (trig)",id);
63 //______________________________________________________________________________
64 AliEveMUONChamber::~AliEveMUONChamber()
70 if(fMUONData) fMUONData->DecRefCount();
74 //______________________________________________________________________________
75 void AliEveMUONChamber::ComputeBBox()
81 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,11,2)
94 Float_t* b1 = fQuadSet1.AssertBBox();
95 for(Int_t i=0; i<6; ++i) { b1[i] = fBBox[i]; }
96 Float_t* b2 = fQuadSet2.AssertBBox();
97 for(Int_t i=0; i<6; ++i) { b2[i] = fBBox[i]; }
98 Float_t* b3 = fPointSet1.AssertBBox();
99 for(Int_t i=0; i<6; ++i) { b3[i] = fBBox[i]; }
100 Float_t* b4 = fPointSet2.AssertBBox();
101 for(Int_t i=0; i<6; ++i) { b4[i] = fBBox[i]; }
105 //______________________________________________________________________________
106 void AliEveMUONChamber::Paint(Option_t*)
112 if(fRnrSelf == kFALSE)
115 TBuffer3D buffer(TBuffer3DTypes::kGeneric);
119 buffer.fTransparency = 0;
120 buffer.fLocalFrame = 0;
122 buffer.SetSectionsValid(TBuffer3D::kCore);
123 Int_t reqSections = gPad->GetViewer3D()->AddObject(buffer);
124 if (reqSections == TBuffer3D::kNone) {
125 //printf("AliEveMUONChamber::Paint viewer was happy with Core buff3d.\n");
129 printf("AliEveMUONChamber::Paint only GL supported.\n");
134 //______________________________________________________________________________
135 void AliEveMUONChamber::SetThreshold(Short_t t)
138 // digits amplitude threshold
141 fThreshold = TMath::Min(t, (Short_t)(fMaxVal - 1));
147 //______________________________________________________________________________
148 void AliEveMUONChamber::SetMaxVal(Int_t mv)
151 // digits amplitude maximum value
154 fMaxVal = TMath::Max(mv, (Int_t)(fThreshold + 1));
160 //______________________________________________________________________________
161 void AliEveMUONChamber::SetClusterSize(Int_t size)
164 // cluster point size
167 fClusterSize = TMath::Max(1, size);
172 //______________________________________________________________________________
173 void AliEveMUONChamber::SetHitSize(Int_t size)
179 fHitSize = TMath::Max(1, size);
184 //______________________________________________________________________________
185 void AliEveMUONChamber::SetupColor(Int_t val, UChar_t* pixel) const
188 // RGBA color for amplitude "val"
191 Float_t div = TMath::Max(1, fMaxVal - fThreshold);
192 Int_t nCol = gStyle->GetNumberOfColors();
193 Int_t cBin = (Int_t) TMath::Nint(nCol*(val - fThreshold)/div);
195 TEveUtil::TEveUtil::ColorFromIdx(gStyle->GetColorPalette(TMath::Min(nCol - 1, cBin)), pixel);
199 //______________________________________________________________________________
200 Int_t AliEveMUONChamber::ColorIndex(Int_t val) const
206 if(val < fThreshold) val = fThreshold;
207 if(val > fMaxVal) val = fMaxVal;
209 Float_t div = TMath::Max(1, fMaxVal - fThreshold);
210 Int_t nCol = gStyle->GetNumberOfColors();
211 Int_t cBin = (Int_t) TMath::Nint(nCol*(val - fThreshold)/div);
213 return gStyle->GetColorPalette(TMath::Min(nCol - 1, cBin));
217 //______________________________________________________________________________
218 void AliEveMUONChamber::SetupColorArray() const
221 // build array of colors
227 fColorArray = new UChar_t [4 * (fMaxVal - fThreshold + 1)];
228 UChar_t* p = fColorArray;
229 for(Int_t v=fThreshold; v<=fMaxVal; ++v, p+=4)
234 //______________________________________________________________________________
235 void AliEveMUONChamber::ClearColorArray()
238 // delete array of colors
242 delete [] fColorArray;
247 //______________________________________________________________________________
248 void AliEveMUONChamber::SetDataSource(AliEveMUONData* data)
251 if (data == fMUONData) return;
252 if(fMUONData) fMUONData->DecRefCount();
254 if(fMUONData) fMUONData->IncRefCount();
259 //______________________________________________________________________________
260 AliEveMUONChamberData* AliEveMUONChamber::GetChamberData() const
263 return fMUONData ? fMUONData->GetChamberData(fChamberID) : 0;
267 //______________________________________________________________________________
268 void AliEveMUONChamber::UpdateQuads()
271 fQuadSet1.Reset(TEveQuadSet::kQT_RectangleXY, kTRUE, 32);
272 fQuadSet2.Reset(TEveQuadSet::kQT_RectangleXY, kTRUE, 32);
276 AliEveMUONChamberData* data = GetChamberData();
279 Float_t x0, y0, z, w, h, clsq;
280 Int_t charge, cathode, nDigits, nClusters, nHits, oldSize, ic1, ic2;
281 Double_t clsX, clsY, clsZ;
282 Float_t hitX, hitY, hitZ;
290 nDigits = data->GetNDigits();
292 for (Int_t id = 0; id < nDigits; id++) {
294 buffer = data->GetDigitBuffer(id);
296 x0 = buffer[0]-buffer[2];
297 y0 = buffer[1]-buffer[3];
301 charge = (Int_t)buffer[5];
302 cathode = (Int_t)buffer[6];
304 if (charge <= fThreshold) continue;
308 fQuadSet1.AddQuad(x0, y0, z, w, h);
309 fQuadSet1.QuadColor(ColorIndex(charge));
315 fQuadSet2.AddQuad(x0, y0, z, w, h);
316 fQuadSet2.QuadColor(ColorIndex(charge));
324 nClusters = data->GetNClusters()/2; // only one cathode plane
325 oldSize = fPointSet1.GrowFor(nClusters);
327 for (Int_t ic = 0; ic < (nClusters*2); ic++) {
329 buffer = data->GetClusterBuffer(ic);
331 clsX = (Double_t)buffer[0];
332 clsY = (Double_t)buffer[1];
333 clsZ = (Double_t)buffer[2];
335 cathode = (Int_t)buffer[4];
338 fPointSet1.SetPoint(ic1,clsX,clsY,clsZ);
342 } // end clusters loop
346 nHits = data->GetNHits();
347 oldSize = fPointSet2.GrowFor(nHits);
348 for (Int_t ih = 0; ih < nHits; ih++) {
349 buffer = data->GetHitBuffer(ih);
353 fPointSet2.SetPoint(ih,hitX,hitY,hitZ);
360 //______________________________________________________________________________
361 void AliEveMUONChamber::SetChamberID(Int_t id)
365 if (id > 13) id = 13;