Merge from EVE-dev to HEAD.
[u/mrichter/AliRoot.git] / EVE / Alieve / ITSModule.cxx
1 #include "ITSModule.h"
2
3 #include <AliITSdigitSPD.h>
4 #include <AliITSdigitSDD.h>
5 #include <AliITSdigitSSD.h>
6
7 #include <TStyle.h>
8
9 using namespace Reve;
10 using namespace Alieve;
11 using namespace std;
12
13 Short_t ITSModule::fgSDDThreshold  = 5;
14 Short_t ITSModule::fgSDDMaxVal     = 80;
15 Short_t ITSModule::fgSSDThreshold  = 2;
16 Short_t ITSModule::fgSSDMaxVal     = 100;
17
18 ClassImp(ITSModule)
19
20 /**************************************************************************/
21
22 void ITSModule::Init()
23 {
24   fTrans = false;
25   fID   = -1;
26   fInfo = 0;
27 }
28
29 /**************************************************************************/
30
31 ITSModule::ITSModule(Int_t id, ITSDigitsInfo* info, Color_t col) :
32   QuadSet(Form("ITS module %d", id)), Reve::RenderElement(fFrameColor),
33   fFrameColor(col)
34 {
35   Init();
36   
37   fInfo = info;
38   SetID(id);
39 }
40
41 ITSModule::~ITSModule()
42 {
43   if(fInfo) fInfo->DecRefCount();
44 }
45
46 /**************************************************************************/
47
48 void ITSModule::SetMainColor(Color_t col)
49 {
50   Reve::RenderElement::SetMainColor(col);
51   if(!fQuads.empty()) {
52     fQuads.front().ColorFromIdx(col);
53   }
54 }
55
56 /**************************************************************************/
57
58 void ITSModule::SetID(Int_t id)
59 {
60   static const Exc_t eH("ITSModule::SetID ");
61
62   if(fInfo == 0)
63     throw(eH + "ITSDigitsInfo not set.");
64
65   if (id < fInfo->fGeom->GetStartSPD() || id > fInfo->fGeom->GetLastSSD())
66     throw(eH + Form("%d is not valid. ID range from %d to %d", id,
67                      fInfo->fGeom->GetStartSPD(), fInfo->fGeom->GetLastSSD()));
68
69   fID = id;
70   InitModule();
71 }
72
73 /**************************************************************************/
74
75 void ITSModule::InitModule()
76 {
77   fInfo->fGeom->GetModuleId(fID,fLayer,fLadder,fDet);
78   SetName(Form("ITSModule %d", fID));
79
80   if (fID <= fInfo->fGeom->GetLastSPD()) {
81     fDetID = 0;
82     fDx = fInfo->fSegSPD->Dx()*0.00005;
83     fDz = 3.48; 
84     fDy = fInfo->fSegSPD->Dy()*0.00005;
85   }
86   else if (fID <= fInfo->fGeom->GetLastSDD()) {
87     fDetID = 1;
88     fDx = fInfo->fSegSDD->Dx()*0.0001;
89     fDz = fInfo->fSegSDD->Dz()*0.00005;
90     fDy = fInfo->fSegSDD->Dy()*0.00005;
91   }
92   else {
93     fDetID = 2;
94     fInfo->fSegSSD->SetLayer(fLayer);  
95     fDx = fInfo->fSegSSD->Dx()*0.00005;
96     fDz = fInfo->fSegSSD->Dz()*0.00005;
97     fDy = fInfo->fSegSSD->Dy()*0.00005;
98   }
99
100   LoadQuads();  
101   ComputeBBox();
102   SetTrans();
103 }
104
105 void ITSModule::LoadQuads()
106 {
107   // printf("its module load quads \n");
108   Float_t x = fDx;
109   Float_t z = fDz;
110   Bool_t aboveThreshold = false;
111
112   // Module frame in xy plane
113   fQuads.push_back(Reve::Quad(fFrameColor));
114   Float_t dy = -0.;
115   Float_t* p = fQuads.back().vertices;
116   p[0] = -x;  p[1] =  dy; p[2]  = -z;
117   p[3] = -x;  p[4] =  dy; p[5]  =  z;
118   p[6] =  x;  p[7] =  dy; p[8]  =  z;
119   p[9] =  x;  p[10] = dy; p[11] = -z;
120
121   // Digits
122   TClonesArray *digits;
123   Int_t ndigits;
124   Float_t dpx,dpz; 
125   Int_t i,j;
126   digits  = fInfo->GetDigits(fID, fDetID );
127   ndigits = digits->GetEntriesFast(); 
128   Int_t n_col = gStyle->GetNumberOfColors();
129
130   switch(fDetID) {
131
132   case 0: { // SPD
133     aboveThreshold = true;
134     AliITSsegmentationSPD* seg =  fInfo->fSegSPD; 
135     AliITSdigitSPD *d=0;
136
137     for (Int_t k=0; k<ndigits; k++) {
138       d=(AliITSdigitSPD*)digits->UncheckedAt(k);
139       j = d->GetCoord1();
140       i = d->GetCoord2();
141       x  = -seg->Dx()/2 + seg->Dpx(0) *i;
142       x *=  0.0001;
143       fInfo->GetSPDLocalZ(j,z);
144       dpx = seg->Dpx(i)*0.0001;
145       dpz = seg->Dpz(j)*0.0001;
146
147       fQuads.push_back(Reve::Quad(7));
148       Float_t* p = fQuads.back().vertices;
149       p[0] = x;        p[1] = 0.; p[2]  = z;
150       p[3] = x;        p[4] = 0.; p[5]  = z + dpz;
151       p[6] = x + dpx;  p[7] = 0.; p[8]  = z + dpz;
152       p[9] = x + dpx;  p[10] =0.; p[11] = z;
153     }
154     break;
155   }
156
157   case 1: { // SDD
158     AliITSsegmentationSDD* seg =  fInfo->fSegSDD; 
159     AliITSdigitSDD *d=0;
160     x = 2*fDx;
161     z = 2*fDz;
162     for (Int_t k=0; k<ndigits; k++) {
163       d=(AliITSdigitSDD*)digits->UncheckedAt(k);
164
165       if (d->GetSignal() > fgSDDThreshold) {
166         j = d->GetCoord1();
167         i = d->GetCoord2();
168         aboveThreshold = true;
169         seg->DetToLocal(i,j,x,z);
170         dpx = seg->Dpx(i)*0.0001;
171         dpz = seg->Dpz(j)*0.0001;
172
173         Int_t ci = gStyle->GetColorPalette
174           (TMath::Min(n_col - 1,
175                       (n_col*(d->GetSignal() - fgSDDThreshold))/(fgSDDMaxVal - fgSDDThreshold)));
176         fQuads.push_back(Reve::Quad(ci, p));
177         Float_t* p = fQuads.back().vertices;
178         p[0] = x;        p[1] = 0.; p[2]  = z;
179         p[3] = x;        p[4] = 0.; p[5]  = z + dpz;
180         p[6] = x + dpx;  p[7] = 0.; p[8]  = z + dpz;
181         p[9] = x + dpx;  p[10] =0.; p[11] = z;
182       }
183     }
184     break;
185   }
186
187   case 2: { // SSD
188     AliITSsegmentationSSD* seg = fInfo->fSegSSD; 
189     AliITSdigitSSD *d=0;
190     Float_t ap,an,a;
191     seg->Angles(ap,an);
192     for (Int_t k=0; k<ndigits; k++) {
193       d=(AliITSdigitSSD*)digits->UncheckedAt(k);
194       if(d->GetSignal() > fgSSDThreshold){
195         aboveThreshold = true;
196         j = d->GetCoord1();
197         i = d->GetCoord2();
198         seg->DetToLocal(i,j,x,z);
199
200         if( d->GetCoord1() == 1) {
201           a = ap;
202         }
203         else {
204           a = -an;
205         }
206         fQuads.push_back(Reve::Quad());
207         Int_t ci = gStyle->GetColorPalette
208           (TMath::Min(n_col - 1,
209                       (n_col*(d->GetSignal() - fgSSDThreshold))/(fgSSDMaxVal - fgSSDThreshold)));
210
211         fQuads.back().ColorFromIdx(ci);
212         Float_t* p = fQuads.back().vertices;
213         
214         p[0] = x-TMath::Tan(a)*fDz;  p[1] =  0; p[2]  = -fDz;
215         p[3] = x+TMath::Tan(a)*fDz;  p[4] =  0; p[5]  = fDz ;
216         p[6] = x+TMath::Tan(a)*fDz;  p[7] =  0; p[8]  = fDz  ;
217         p[9] = x-TMath::Tan(a)*fDz;  p[10] = 0; p[11] = -fDz;
218         //      printf("%3d -> %3d -> %8x\n", d->GetSignal(), ci, fQuads.back().color);
219       }
220     }
221     break;
222   }
223
224   }
225 }
226
227 /**************************************************************************/
228
229 void ITSModule::SetTrans()
230 {
231   Double_t pos[3];
232   Double_t rot[9];
233   fInfo->fGeom->GetTrans(fID,pos);
234   fInfo->fGeom->GetRotMatrix(fID,rot);
235   Double_t *s, *d;
236
237   // column major ii
238   s = &rot[0]; d = &fMatrix[0];
239   d[0] = s[0]; d[1] = s[3]; d[2] = s[6]; d[3] = 0;
240   s = &rot[1]; d = &fMatrix[4];
241   d[0] = s[0]; d[1] = s[3]; d[2] = s[6]; d[3] = 0;
242   s = &rot[2]; d = &fMatrix[8];
243   d[0] = s[0]; d[1] = s[3]; d[2] = s[6]; d[3] = 0;
244   s = &pos[0]; d = &fMatrix[12];
245   d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = 1;
246
247   fTrans = true;
248 }
249
250 /**************************************************************************/
251
252 void ITSModule::Print(Option_t* ) const
253 {
254   printf("ID %d, layer %d, ladder %d, det %d \n", fID, fLayer, fLadder, fDetID);
255 }