]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Alieve/TOFSector.cxx
f5e0ca302eb79295557309fc32ede1c977aa0608
[u/mrichter/AliRoot.git] / EVE / Alieve / TOFSector.cxx
1 #include "TOFSector.h"
2
3 #include <TEveManager.h>
4
5 #include <AliTOFdigit.h>
6 #include <AliTOFGeometry.h>
7
8 #include <TStyle.h>
9 using namespace Alieve;
10 using namespace std;
11
12 Bool_t       TOFSector::fgStaticInitDone = kFALSE;
13 TEveFrameBox*    TOFSector::fgTOFsectorFrameBox = 0;
14 TEveRGBAPalette* TOFSector::fgTOFsectorPalette  = 0;
15
16 //_______________________________________________________
17 ClassImp(TOFSector)
18
19 /* ************************************************************************ */
20
21 TOFSector::TOFSector(const Text_t* n, const Text_t* t) :
22   TEveQuadSet(n, t),
23   fTOFgeometry(new AliTOFGeometry()),
24   fTOFarray(0x0),
25   fTOFtree(0x0),
26   fSector(-1),
27   fDx(0), fDy(0), fDz(0),
28   fAutoTrans (kTRUE),
29   //fPlateFlag0(kTRUE), fPlateFlag1(kTRUE), fPlateFlag2(kTRUE), fPlateFlag3(kTRUE), fPlateFlag4(kTRUE),
30   fThreshold (5), fMaxVal    (80),
31   fSectorID  (0),
32   fGeoManager(0)
33 {
34
35   fPlateFlag = new Bool_t[5];
36   for (Int_t ii=0; ii<5; ii++) fPlateFlag[ii]=kTRUE;
37
38
39   fGeoManager = (TGeoManager*)gEve->GetGeometry("$REVESYS/alice-data/alice_fullgeo.root");
40   if (!fGeoManager) {
41     printf("ERROR: no TGeo\n");
42   }
43
44 }
45 /* ************************************************************************ */
46
47 TOFSector::TOFSector(TGeoManager *localGeoManager,
48                      Int_t nSector)
49   :
50   TEveQuadSet(Form("Sector%i",nSector)),
51   fTOFgeometry(new AliTOFGeometry()),
52   fTOFarray(0x0),
53   fTOFtree(0x0),
54   fSector(nSector),
55   fDx(0), fDy(0), fDz(0),
56   fAutoTrans (kTRUE),
57   //fPlateFlag0(kTRUE), fPlateFlag1(kTRUE), fPlateFlag2(kTRUE), fPlateFlag3(kTRUE), fPlateFlag4(kTRUE),
58   fThreshold (5), fMaxVal    (80),
59   fSectorID  (nSector),
60   fGeoManager(localGeoManager)
61 {
62
63   fPlateFlag = new Bool_t[5];
64   for (Int_t ii=0; ii<5; ii++) fPlateFlag[ii]=kTRUE;
65
66   /*
67   if (!fGeoManager) {
68     printf("ERROR: no TGeo\n");
69   }
70   */
71
72   InitModule();
73
74 }
75 /* ************************************************************************ */
76
77 TOFSector::TOFSector(TGeoManager *localGeoManager,
78                      Int_t nSector,
79                      TClonesArray *tofArray)
80   :
81   TEveQuadSet(Form("Sector%i",nSector)),
82   fTOFgeometry(new AliTOFGeometry()),
83   fTOFarray(tofArray),
84   fTOFtree(0x0),
85   fSector(nSector),
86   fDx(0), fDy(0), fDz(0),
87   fAutoTrans (kTRUE),
88   //fPlateFlag0(kTRUE), fPlateFlag1(kTRUE), fPlateFlag2(kTRUE), fPlateFlag3(kTRUE), fPlateFlag4(kTRUE),
89   fThreshold (5), fMaxVal    (80),
90   fSectorID  (nSector),
91   fGeoManager(localGeoManager)
92 {
93
94   fPlateFlag = new Bool_t[5];
95   for (Int_t ii=0; ii<5; ii++) fPlateFlag[ii]=kTRUE;
96
97   InitModule();
98
99 }
100 /* ************************************************************************ */
101
102 TOFSector::TOFSector(TGeoManager *localGeoManager,
103                      Int_t nSector,
104                      TTree *tofTree)
105   :
106   TEveQuadSet(Form("Sector%i",nSector)),
107   fTOFgeometry(new AliTOFGeometry()),
108   fTOFarray(0x0),
109   fTOFtree(tofTree),
110   fSector(nSector),
111   fDx(0), fDy(0), fDz(0),
112   fAutoTrans (kTRUE),
113   //fPlateFlag0(kTRUE), fPlateFlag1(kTRUE), fPlateFlag2(kTRUE), fPlateFlag3(kTRUE), fPlateFlag4(kTRUE),
114   fThreshold (5), fMaxVal    (80),
115   fSectorID  (nSector),
116   fGeoManager(localGeoManager)
117 {
118
119   fPlateFlag = new Bool_t[5];
120   for (Int_t ii=0; ii<5; ii++) fPlateFlag[ii]=kTRUE;
121
122   InitModule();
123
124 }
125 /* ************************************************************************ */
126
127 TOFSector::~TOFSector()
128 {
129   /*
130   fGeoManager = 0x0;
131   delete fGeoManager;
132
133   delete fTOFarray;
134   fTOFarray = 0x0;
135   */
136   delete fPlateFlag;
137
138 }
139
140 /* ************************************************************************ */
141 /*
142 void TOFSector::SetDigitsInfo(TOFDigitsInfo* info)
143 {
144   if(fInfo) fInfo->DecRefCount();
145   fInfo = info;
146   if(fInfo) fInfo->IncRefCount();
147
148 }
149 */
150 /* ************************************************************************ */
151 void TOFSector::InitStatics()
152 {
153   if (fgStaticInitDone) return;
154
155   Float_t dx = 124.5;
156   Float_t dz =  29.;
157   Float_t dy = 370.6*2.;
158   fgTOFsectorFrameBox = new TEveFrameBox();
159
160   fgTOFsectorFrameBox->SetAABox(-dx*0.5, -dy*0.5, -dz*0.5, dx, dy, dz);
161   fgTOFsectorFrameBox->SetFrameColor((Color_t) 32);//31);
162
163   //fgTOFsectorPalette  = new TEveRGBAPalette(0, 2048); // TOT
164   fgTOFsectorPalette  = new TEveRGBAPalette(0, 8192/*1024*/); // TDC
165   fgTOFsectorPalette->SetLimits(0, 8192); 
166
167   fgStaticInitDone = kTRUE;
168 }
169
170 /* ************************************************************************ */
171 void TOFSector::InitModule()
172 {
173
174   fDx = fTOFgeometry->XPad()*fTOFgeometry->NpadX();
175   //fDy = fTOFgeometry->XPad()*fTOFgeometry->NpadX();
176   fDz = fTOFgeometry->ZPad()*fTOFgeometry->NpadZ();
177
178   if (!fgStaticInitDone) InitStatics();
179
180   SetFrame(fgTOFsectorFrameBox);
181   SetPalette(fgTOFsectorPalette);
182   //fFrame   = fgTOFsectorFrameBox;
183   //fPalette = fgTOFsectorPalette;
184
185   LoadQuads();  
186   ComputeBBox();
187   SetTrans();
188
189 }
190
191 /* ************************************************************************ */
192 void TOFSector::LoadQuads()
193 {
194
195   Reset(kQT_FreeQuad, kFALSE, 32);
196
197   //Int_t n_col = gStyle->GetNumberOfColors();
198
199   Int_t vol[5] = {fSectorID, -1, -1, -1, -1};
200   Int_t informations[4] = {-1, -1, -1, -1};
201   Int_t dummy[3] = {-1, -1, -1};
202   Int_t tdc = -1;
203   Int_t tot = -1;
204
205   Double_t **coord = new Double_t*[4];
206   for (Int_t ii=0; ii<4; ii++) coord[ii] = new Double_t[3];
207
208   //printf(" fTOFarray->GetEntries() = %4i \n",fTOFarray->GetEntries());
209
210   if (fTOFtree && !fTOFarray) {
211     //printf("Hello world\n");
212     TClonesArray* digitsTOFnew = new TClonesArray("AliTOFdigit",  300);
213
214     fTOFarray = new TClonesArray("AliTOFdigit",  300);
215     TClonesArray &ldigits = *fTOFarray;
216     Int_t newCounter = 0;
217
218     AliTOFdigit *digs;
219
220     fTOFtree->SetBranchAddress("TOF",&digitsTOFnew);
221     fTOFtree->GetEntry(0);
222     for (Int_t digitNumber=0; digitNumber<digitsTOFnew->GetEntries(); digitNumber++) {
223
224       //if (digitNumber==digitsTOF->GetEntries()-1) printf(" Hello  4 -> %3i digit of %i \n", digitNumber+1, digitsTOF->GetEntries());
225   
226       digs = (AliTOFdigit*)digitsTOFnew->UncheckedAt(digitNumber);
227
228       if (digs->GetSector()!=fSectorID) continue;
229
230       vol[1] = digs->GetPlate();  // Plate Number (0-4)
231       vol[2] = digs->GetStrip();  // Strip Number (0-14/18)
232       vol[3] = digs->GetPadx();   // TEvePad Number in x direction (0-47)
233       vol[4] = digs->GetPadz();   // TEvePad Number in z direction (0-1)
234
235       informations[0] = digs->GetTdc();
236       informations[1] = digs->GetAdc();
237       informations[2] = digs->GetToT();
238       informations[3] = digs->GetTdcND();
239       new (ldigits[newCounter++]) AliTOFdigit(dummy, vol, informations);
240     }
241   }
242
243   AliTOFdigit *tofDigit;
244   //printf("  0x%lx\n",fTOFarray);
245   for (Int_t ii=0; ii<fTOFarray->GetEntries(); ii++) {
246
247     tofDigit = (AliTOFdigit*)fTOFarray->UncheckedAt(ii);
248    
249     if (fPlateFlag[tofDigit->GetPlate()]) {
250
251       vol[1] = tofDigit->GetPlate();
252       vol[2] = tofDigit->GetStrip();
253       vol[3] = tofDigit->GetPadz();
254       vol[4] = tofDigit->GetPadx();
255
256       tot = tofDigit->GetToT();
257       tdc = tofDigit->GetTdc();
258
259       //if (fSector==4 && fPlate==2 && fStrip==0) printf(" %2i  %1i\n", iPadX, iPadZ);
260       //if (iPadX==23 || iPadX==24) printf(" %2i  %1i %2i \n", fSector, fPlate, fStrip);
261       //if (vol[0]==4 && vol[1]==2 && vol[2]==7) {
262
263       for (Int_t kk=0; kk<4; kk++) for (Int_t jj=0; jj<3; jj++) coord[kk][jj]=0.;
264
265       fTOFgeometry->DetToSectorRF(vol, coord);
266       /*
267         printf("\n");
268         printf("  %1i   %2i,   %f  %f  %f \n", vol[3], vol[4], coord[0][0], coord[0][1], coord[0][2]);
269         printf("  %1i   %2i,   %f  %f  %f \n", vol[3], vol[4], coord[1][0], coord[1][1], coord[1][2]);
270         printf("  %1i   %2i,   %f  %f  %f \n", vol[3], vol[4], coord[2][0], coord[2][1], coord[2][2]);
271         printf("  %1i   %2i,   %f  %f  %f \n", vol[3], vol[4], coord[3][0], coord[3][1], coord[3][2]);
272       */
273       Float_t vertices[12]={(Float_t)coord[0][0], (Float_t)coord[0][1], (Float_t)coord[0][2],
274                             (Float_t)coord[1][0], (Float_t)coord[1][1], (Float_t)coord[1][2],
275                             (Float_t)coord[2][0], (Float_t)coord[2][1], (Float_t)coord[2][2],
276                             (Float_t)coord[3][0], (Float_t)coord[3][1], (Float_t)coord[3][2]};
277       
278       AddQuad(vertices);
279       //AddQuad((Float_t*)coord);
280       //AddQuad(coord[0], coord[1], coord[2], 2.5, 3.5);
281       //AddQuad(-2.5*0.5, -3.5*0.5, 2.5, 3.5);
282
283       // In principle could have color based on number of neigbours. We
284       // can insert the time-of-flight value for each pad
285       //QuadValue((Int_t)tot);
286       QuadValue((Int_t)tdc);
287       QuadId(tofDigit);
288       
289     //}
290     } // closed if control on plates switched on
291   } // closed loop on TOF sector digits
292
293   RefitPlex();
294
295   fTOFarray = 0x0;
296  
297 }
298
299 /* ************************************************************ */
300 void TOFSector::SetTrans()
301 {
302   fHMTrans.UnitTrans();
303
304   //Int_t det[5] = {fSector, -1, -1, -1, -1};
305   Char_t path[100];
306
307   Int_t localSector = fSector;
308   if (!fAutoTrans) localSector = 4;
309
310   //fTOFgeometry->GetVolumePath(det,path);
311   fTOFgeometry->GetVolumePath(localSector,path);
312   fGeoManager->cd(path);
313   TGeoHMatrix global = *fGeoManager->GetCurrentMatrix();
314   Double_t *rotMat = global.GetRotationMatrix();
315   Double_t *tr = global.GetTranslation();
316
317   fHMTrans.SetBaseVec(1, rotMat[0], rotMat[3], rotMat[6]);
318   fHMTrans.SetBaseVec(2, rotMat[1], rotMat[4], rotMat[7]);
319   fHMTrans.SetBaseVec(3, rotMat[2], rotMat[5], rotMat[8]);
320
321   fHMTrans.SetBaseVec(4, tr);
322 }
323
324 //-----------------------------------------------------
325
326 void TOFSector::SetSectorID(Int_t id)
327 {
328   fSectorID = id;
329   fSector   = id;
330   if (fAutoTrans)
331     SetTrans(); // Force repositioning.
332
333   LoadQuads();
334 }
335
336 //-----------------------------------------------------
337
338 void TOFSector::SetPlate(Int_t nPlate, Bool_t r)
339 {
340
341   fPlateFlag[nPlate] = r;
342
343   //printf("   HELLO World ! %i %i %i \n", nPlate, r, fPlateFlag[nPlate]);
344 }
345
346 /**************************************************************************/
347
348 void TOFSector::SetThreshold(Short_t t)
349 {
350   fThreshold = TMath::Min(t, (Short_t)(fMaxVal - 1));
351   // ClearColorArray();
352 }
353
354 /**************************************************************************/
355
356 void TOFSector::SetMaxVal(Int_t mv)
357 {
358   fMaxVal = TMath::Max(mv, (Int_t)(fThreshold + 1));
359   //ClearColorArray();
360 }
361
362 /**************************************************************************/
363
364 void TOFSector::DigitSelected(Int_t idx)
365 {
366   // Override control-click from TEveQuadSet
367
368   DigitBase_t* qb   = GetDigit(idx);
369   TObject* obj   = qb->fId.GetObject();
370   AliTOFdigit* digs = dynamic_cast<AliTOFdigit*>(obj);
371   // printf("TOFSector::QuadSelected "); Print();
372   printf("  idx = %5i, value = %5d, obj = 0x%lx, digit = 0x%lx  ",
373          idx, qb->fValue, (ULong_t)obj, (ULong_t)digs);
374   if (digs)
375     printf("-> Sector = %2i  Plate = %1i  Strip = %2i  ToT = %3i  Tof = %5i\n",
376            fSector , digs->GetPlate(), digs->GetStrip(), digs->GetToT(), digs->GetTdc());
377   else printf("\n");
378
379 }
380
381 /**************************************************************************/