b986d57301a3670b7170cda3d621e9dc6f17c189
[u/mrichter/AliRoot.git] / EVE / Alieve / TPCSector3D.cxx
1 // $Header$
2
3 #include "TPCSector3D.h"
4 #include <Alieve/TPCSectorData.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
14 using namespace Reve;
15 using namespace Alieve;
16
17 //______________________________________________________________________
18 // TPCSector3D
19 //
20
21 ClassImp(TPCSector3D)
22
23 TPCSector3D::TPCSector3D(const Text_t* n, const Text_t* t) :
24   TPCSectorViz(n, t),
25
26   fBoxSet       (n, t),
27   fPointSetArray(n, t),
28   fPointFrac    (0.25),
29   fPointSize    (3),
30
31   fPointSetOn     (0),
32   fPointSetMaxVal (0),
33
34   fDriftVel  (1),
35   fZStep     (250.0/450)
36 {
37   fRnrFrame = kFALSE;
38   ComputeBBox();
39 }
40
41 TPCSector3D::~TPCSector3D()
42 {}
43
44 /**************************************************************************/
45
46 void TPCSector3D::SetRnrFrame(Bool_t rf)
47 {
48   if(fRnrFrame != rf) {
49     fRnrFrame = rf;
50     IncRTS();
51   }
52 }
53
54 /**************************************************************************/
55
56 void TPCSector3D::ComputeBBox()
57 {
58   const TPCSectorData::SegmentInfo&  iSeg = TPCSectorData::GetInnSeg();
59   const TPCSectorData::SegmentInfo& o2Seg = TPCSectorData::GetOut2Seg();
60
61 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,11,2)
62   bbox_init();
63 #else
64   BBoxInit();
65 #endif
66   Float_t w = 0.5*o2Seg.GetNMaxPads()*o2Seg.GetPadWidth();
67   fBBox[0] = -w;
68   fBBox[1] =  w;
69   fBBox[2] =  iSeg.GetRLow();
70   fBBox[3] =  o2Seg.GetRLow() + o2Seg.GetNRows()*o2Seg.GetPadHeight();
71   fBBox[4] =  0;
72   fBBox[5] =  TPCSectorData::GetZLength();
73   Float_t* b = fBoxSet.AssertBBox();
74   for(Int_t i=0; i<6; ++i) { b[i] = fBBox[i]; }
75
76 }
77
78 void TPCSector3D::Paint(Option_t* /*option*/)
79 {
80   if(fRnrElement == kFALSE)
81     return;
82
83   TBuffer3D buffer(TBuffer3DTypes::kGeneric);
84
85   // Section kCore
86   buffer.fID           = this;
87   buffer.fColor        = 1;
88   buffer.fTransparency = 0;
89   buffer.fLocalFrame   = fTrans; 
90   if (fTrans)
91     memcpy(buffer.fLocalMaster, fMatrix, 16*sizeof(Double_t));
92   buffer.SetSectionsValid(TBuffer3D::kCore);
93    
94   Int_t reqSections = gPad->GetViewer3D()->AddObject(buffer);
95   if (reqSections == TBuffer3D::kNone) {
96     return;
97   }
98
99   printf("TPCSector3D::Paint only GL supported.\n");
100   return;
101 }
102
103 /**************************************************************************/
104
105 void TPCSector3D::LoadPadrow(TPCSectorData::RowIterator& iter,
106                              Float_t xs, Float_t ys, Float_t pw, Float_t ph) 
107 {
108   Short_t pad, time, val;
109   Float_t x0, x1, z0, z1;
110   Float_t ym = ys + 0.5*ph;
111   Float_t ye = ys + ph;
112   Float_t zs = fZStep/fDriftVel;
113
114   while (iter.NextPad()) {
115     pad = iter.Pad();
116     while (iter.Next()) {
117       time = iter.Time();
118       val  = iter.Signal();
119
120       if(val <= fThreshold || time < fMinTime || time > fMaxTime)
121         continue;
122
123       if(fPointSetOn && val <= fPointSetMaxVal) {
124         fPointSetArray.Fill(xs + (pad+0.5)*pw, ym, (time+0.5)*zs, val);
125       } else {
126         fBoxSet.fBoxes.push_back(Reve::Box());
127         ColorFromArray(val, fBoxSet.fBoxes.back().color);
128         x0 = xs + pad*pw;
129         x1 = x0 + pw;
130         z0 = time*zs;
131         z1 = z0 + zs;
132         Float_t* p = fBoxSet.fBoxes.back().vertices; 
133         // front
134         p[0] = x0;  p[1] = ys;  p[2] = z0;  p += 3;
135         p[0] = x1;  p[1] = ys;  p[2] = z0;  p += 3;
136         p[0] = x1;  p[1] = ye;  p[2] = z0;  p += 3;
137         p[0] = x0;  p[1] = ye;  p[2] = z0;  p += 3;
138         // back
139         p[0] = x0;  p[1] = ys;  p[2] = z1;  p += 3;
140         p[0] = x1;  p[1] = ys;  p[2] = z1;  p += 3;
141         p[0] = x1;  p[1] = ye;  p[2] = z1;  p += 3;
142         p[0] = x0;  p[1] = ye;  p[2] = z1;
143       }
144     }
145   }
146 }
147
148 void TPCSector3D::UpdateBoxes()
149 {
150   // Populate parent class Reve::BoxSet with digit information.
151
152   // printf("TPCSector3D update boxes\n");
153
154   fBoxSet.ClearSet();
155   fPointSetArray.RemoveElements();
156
157   TPCSectorData* data = GetSectorData();
158   if (data != 0) {
159     Bool_t isOn[3];
160     isOn[0] = fRnrInn;
161     isOn[1] = fRnrOut1;
162     isOn[2] = fRnrOut2;
163
164     SetupColorArray();
165     SetupPointSetArray();
166
167     // Loop over 3 main segments
168     for (Int_t sId = 0; sId <= 2; ++sId) {
169       if(isOn[sId] == kFALSE)
170         continue;
171       const TPCSectorData::SegmentInfo& sInfo = TPCSectorData::GetSeg(sId);
172       Float_t sy = sInfo.GetRLow();
173       for (Int_t row=sInfo.GetFirstRow(); row<=sInfo.GetLastRow(); ++row) {
174         TPCSectorData::RowIterator i = data->MakeRowIterator(row);
175         Float_t sx = -0.5*TPCSectorData::GetNPadsInRow(row)*sInfo.GetPadWidth();
176         LoadPadrow(i, sx, sy, sInfo.GetPadWidth(), sInfo.GetPadHeight());
177         sy += sInfo.GetPadHeight();
178       }
179     }
180
181     if(fPointSetOn)
182       fPointSetArray.CloseBins();
183   }
184 }
185
186 void TPCSector3D::SetupPointSetArray()
187 {
188   Int_t   nBins = (Int_t) TMath::Nint(fPointFrac*gStyle->GetNumberOfColors());
189   if(nBins > 0) {
190     fPointSetOn = kTRUE;
191     fPointSetMaxVal = fThreshold + (Int_t) TMath::Nint(fPointFrac*(fMaxVal - fThreshold));
192     // printf("SetupPointSetArray frac=%f nbins=%d psmv=%d (%d,%d)\n", fPointFrac, nBins, fPointSetMaxVal, fThreshold, fMaxVal);
193     fPointSetArray.InitBins("", nBins, fThreshold, fPointSetMaxVal, kFALSE);
194     for(Int_t b=0; b<nBins; ++b) {
195       fPointSetArray.GetBin(b)->SetMarkerColor(gStyle->GetColorPalette(b));
196     }
197   } else {
198     fPointSetOn = kFALSE;
199   }
200 }