c3e34498 |
1 | // EMCAL event display |
2 | // Visualization of an EMCAL super module. |
3 | // |
4 | // Author: Magali Estienne (magali.estienne@cern.ch) |
5 | // June 30 2008 |
c3e34498 |
6 | |
345a46b0 |
7 | #include "AliEveEMCALSModule.h" |
8 | |
9 | //#include <vector> |
c3e34498 |
10 | |
c3e34498 |
11 | #include <TEveFrameBox.h> |
12 | #include <TEveQuadSet.h> |
13 | #include <TEvePointSet.h> |
c3e34498 |
14 | #include <TEveRGBAPalette.h> |
15 | |
c3e34498 |
16 | |
345a46b0 |
17 | class Riostream; |
18 | //class vector; |
19 | class TEveTrans; |
20 | class TEveElement; |
21 | class TClonesArray; |
22 | class TStyle; |
23 | class TBuffer3DTypes; |
24 | class TBuffer3D; |
25 | class TVirtualPad; |
26 | class TVirtualViewer3D; |
27 | class AliEveEMCALData; |
28 | class AliEMCALHit; |
29 | class AliEMCALDigit; |
30 | class AliEveEMCALSModuleData; |
c3e34498 |
31 | |
32 | ClassImp(AliEveEMCALSModule) |
33 | |
345a46b0 |
34 | Bool_t AliEveEMCALSModule::fgStaticInit = kFALSE; |
ebedba59 |
35 | Float_t AliEveEMCALSModule::fgSMBigBBox[3]; |
36 | Float_t AliEveEMCALSModule::fgSMSmallBBox[3]; |
37 | TEveFrameBox* AliEveEMCALSModule::fgFrameBigBox = 0; |
38 | TEveFrameBox* AliEveEMCALSModule::fgFrameSmallBox = 0; |
39 | TEveRGBAPalette* AliEveEMCALSModule::fgFrameDigPalette = 0; |
40 | TEveRGBAPalette* AliEveEMCALSModule::fgFrameCluPalette = 0; |
c3e34498 |
41 | |
42 | AliEveEMCALSModule::AliEveEMCALSModule(Int_t smid, const Text_t* n, const Text_t* t) : |
43 | TEveElement(fFrameColor), |
44 | TNamed(n,t), |
a312477b |
45 | TAtt3D(), |
c3e34498 |
46 | fEMCALData(0), |
47 | fEMCALSModuleData(0), |
48 | fFrameColor((Color_t)10), |
c3e34498 |
49 | fSModuleID(smid), |
50 | fQuadSet(new TEveQuadSet(n,t)), |
51 | fQuadSet2(new TEveQuadSet(n,t)), |
52 | fPointSet(new TEvePointSet(n)), |
c3e34498 |
53 | fClusterSize(5), |
54 | fHitSize(5), |
c3e34498 |
55 | fDebug(0) |
56 | { |
57 | // Constructor. |
58 | Char_t name[256]; |
59 | if (smid < 10) { |
81480403 |
60 | snprintf(name,256,"Full Super Module %02d",smid); |
c3e34498 |
61 | } else { |
81480403 |
62 | snprintf(name,256,"Half Super Module %02d",smid); |
c3e34498 |
63 | } |
64 | SetName(name); |
65 | |
c3e34498 |
66 | // Hits |
67 | fPointSet->IncDenyDestroy(); |
68 | AddElement(fPointSet); |
69 | // Digits |
70 | fQuadSet->IncDenyDestroy(); |
71 | AddElement(fQuadSet); |
72 | // Clusters |
73 | fQuadSet2->IncDenyDestroy(); |
74 | AddElement(fQuadSet2); |
75 | |
76 | } |
77 | |
78 | AliEveEMCALSModule::AliEveEMCALSModule(const AliEveEMCALSModule &esm) : |
79 | TEveElement(fFrameColor), |
80 | TNamed(), |
a312477b |
81 | TAtt3D(), |
c3e34498 |
82 | fEMCALData(esm.fEMCALData), |
83 | fEMCALSModuleData(esm.fEMCALSModuleData), |
84 | fFrameColor(esm.fFrameColor), |
c3e34498 |
85 | fSModuleID(esm.fSModuleID), |
86 | fQuadSet(esm.fQuadSet), |
87 | fQuadSet2(esm.fQuadSet2), |
88 | fPointSet(esm.fPointSet), |
c3e34498 |
89 | fClusterSize(esm.fClusterSize), |
90 | fHitSize(esm.fHitSize), |
c3e34498 |
91 | fDebug(esm.fDebug) |
92 | { |
a312477b |
93 | // Copy constructor. |
c3e34498 |
94 | Char_t name[256]; |
95 | if (fSModuleID < 10) { |
96 | sprintf(name,"Full Super Module %02d",fSModuleID); |
97 | } else { |
98 | sprintf(name,"Half Super Module %02d",fSModuleID); |
99 | } |
100 | SetName(name); |
101 | |
c3e34498 |
102 | // Hits |
103 | fPointSet->IncDenyDestroy(); |
104 | AddElement(fPointSet); |
105 | // Digits |
106 | fQuadSet->IncDenyDestroy(); |
107 | AddElement(fQuadSet); |
108 | // Clusters |
109 | fQuadSet2->IncDenyDestroy(); |
110 | AddElement(fQuadSet2); |
111 | |
112 | } |
113 | |
114 | AliEveEMCALSModule::~AliEveEMCALSModule() |
115 | { |
116 | // |
117 | // Destructor. |
118 | // |
119 | |
120 | fPointSet->DecDenyDestroy(); |
121 | fQuadSet->DecDenyDestroy(); |
ef3891ac |
122 | fQuadSet2->DecDenyDestroy(); |
c3e34498 |
123 | |
124 | if(fEMCALData) fEMCALData->DecRefCount(); |
c3e34498 |
125 | } |
126 | |
127 | //______________________________________________________________________________ |
345a46b0 |
128 | void AliEveEMCALSModule::DropData() const |
c3e34498 |
129 | { |
130 | // |
131 | // release the sm data |
132 | // |
133 | |
134 | // fNDigits = 0; |
135 | // fNClusters = 0; |
136 | // fNHits = 0; |
137 | |
138 | return; |
139 | |
140 | } |
141 | |
142 | //______________________________________________________________________________ |
ebedba59 |
143 | void AliEveEMCALSModule::InitStatics(AliEveEMCALSModuleData* md) |
c3e34498 |
144 | { |
145 | // |
a312477b |
146 | // Bounding box, Framebox and Palette |
c3e34498 |
147 | // |
148 | |
345a46b0 |
149 | if (fgStaticInit) return; |
150 | fgStaticInit = kTRUE; |
c3e34498 |
151 | |
ebedba59 |
152 | md->GetSModuleBigBox(fgSMBigBBox[0],fgSMBigBBox[1], fgSMBigBBox[2]); |
153 | md->GetSModuleSmallBox(fgSMSmallBBox[0],fgSMSmallBBox[1], fgSMSmallBBox[2]); |
154 | |
155 | fgFrameBigBox = new TEveFrameBox(); |
156 | fgFrameBigBox->SetAABoxCenterHalfSize(0, 0, 0, fgSMBigBBox[0], fgSMBigBBox[1], fgSMBigBBox[2]); |
157 | fgFrameBigBox->SetFrameColor((Color_t)10); |
158 | fgFrameBigBox->IncRefCount(); |
159 | fgFrameDigPalette = new TEveRGBAPalette(0,512); |
160 | fgFrameDigPalette->SetLimits(0, 1024); |
161 | fgFrameDigPalette->IncRefCount(); |
162 | |
163 | fgFrameSmallBox = new TEveFrameBox(); |
164 | fgFrameSmallBox->SetAABoxCenterHalfSize(0, 0, 0, fgSMSmallBBox[0], fgSMSmallBBox[1], fgSMSmallBBox[2]); |
165 | fgFrameSmallBox->SetFrameColor((Color_t)10); |
166 | fgFrameSmallBox->IncRefCount(); |
167 | fgFrameCluPalette = new TEveRGBAPalette(0,512); |
168 | fgFrameCluPalette->SetLimits(0, 1024); |
169 | fgFrameCluPalette->IncRefCount(); |
c3e34498 |
170 | } |
171 | |
c3e34498 |
172 | //______________________________________________________________________________ |
173 | void AliEveEMCALSModule::SetClusterSize(Int_t size) |
174 | { |
175 | // |
a312477b |
176 | // Cluster point size |
c3e34498 |
177 | // |
178 | |
179 | fClusterSize = TMath::Max(1, size); |
c3e34498 |
180 | } |
181 | |
182 | //______________________________________________________________________________ |
183 | void AliEveEMCALSModule::SetHitSize(Int_t size) |
184 | { |
185 | // |
186 | // hit point size |
187 | // |
188 | |
189 | fHitSize = TMath::Max(1, size); |
c3e34498 |
190 | } |
191 | |
192 | //______________________________________________________________________________ |
345a46b0 |
193 | void AliEveEMCALSModule::SetDataSource(AliEveEMCALData* const data) |
c3e34498 |
194 | { |
a312477b |
195 | // |
c3e34498 |
196 | // Set source of data. |
a312477b |
197 | // |
c3e34498 |
198 | |
199 | if (data == fEMCALData) return; |
200 | if(fEMCALData) fEMCALData->DecRefCount(); |
201 | fEMCALData = data; |
202 | if(fEMCALData) fEMCALData->IncRefCount(); |
203 | |
a312477b |
204 | // Get pointer on SM data |
c3e34498 |
205 | fEMCALSModuleData = GetSModuleData(); |
c3e34498 |
206 | } |
207 | |
208 | //______________________________________________________________________________ |
209 | AliEveEMCALSModuleData* AliEveEMCALSModule::GetSModuleData() const |
210 | { |
a312477b |
211 | // |
c3e34498 |
212 | // Return source of data. |
a312477b |
213 | // |
c3e34498 |
214 | |
215 | return fEMCALData ? fEMCALData->GetSModuleData(fSModuleID) : 0; |
216 | } |
217 | |
218 | //______________________________________________________________________________ |
219 | void AliEveEMCALSModule::UpdateQuads() |
220 | { |
a312477b |
221 | // |
c3e34498 |
222 | // Update hit/digit/cluster representation. |
a312477b |
223 | // |
c3e34498 |
224 | |
a312477b |
225 | vector< vector<Double_t> > bufferDigit; |
226 | vector< vector<Double_t> > bufferCluster; |
c3e34498 |
227 | vector< vector<Float_t> > bufferHit; |
a312477b |
228 | Int_t nDigits, nClusters, nHits, oldSize; |
c3e34498 |
229 | Float_t hitX, hitY, hitZ; |
230 | Int_t smId = fEMCALSModuleData->GetSmId(); |
231 | |
232 | //-------------------------- |
233 | // Hits from runloader |
234 | //-------------------------- |
235 | fPointSet->Reset(); |
236 | |
a312477b |
237 | /* |
c3e34498 |
238 | TEvePointSet* points = fEMCALData->GetPointSetData(); |
239 | char form[1000]; |
240 | if(points){ |
241 | sprintf(form,"N=%d", points->Size()); |
242 | points->SetTitle(form); |
243 | points->SetMarkerSize(.5); |
244 | points->SetMarkerColor((Color_t)2); |
245 | fPointSet->AddElement(points); |
246 | } |
247 | else {printf("There is no hits in Runloader \n"); } |
248 | |
a312477b |
249 | */ |
250 | |
c3e34498 |
251 | if (fEMCALSModuleData != 0) { |
ebedba59 |
252 | |
345a46b0 |
253 | if (!fgStaticInit) |
ebedba59 |
254 | InitStatics(fEMCALSModuleData); |
255 | |
c3e34498 |
256 | // digits ------------------------ |
a312477b |
257 | |
258 | // Define TEveQuadSet for digits |
c3e34498 |
259 | fQuadSet->SetOwnIds(kTRUE); |
260 | fQuadSet->Reset(TEveQuadSet::kQT_RectangleYZFixedDimX, kFALSE, 32); |
261 | fQuadSet->SetDefWidth (fEMCALSModuleData->GetPhiTileSize()); |
262 | fQuadSet->SetDefHeight(fEMCALSModuleData->GetEtaTileSize()); |
263 | fQuadSet->RefMainTrans().SetFrom(*fEMCALSModuleData->GetSModuleMatrix()); |
ebedba59 |
264 | fQuadSet->SetPalette(fgFrameDigPalette); |
c3e34498 |
265 | if(smId<fEMCALSModuleData->GetNsmf()) |
ebedba59 |
266 | fQuadSet->SetFrame(fgFrameBigBox); |
267 | else fQuadSet->SetFrame(fgFrameSmallBox); |
c3e34498 |
268 | |
a312477b |
269 | // Get the digit information from the buffer |
c3e34498 |
270 | bufferDigit = fEMCALSModuleData->GetDigitBuffer(); |
271 | if(!bufferDigit.empty()) |
272 | { |
273 | nDigits = fEMCALSModuleData->GetNDigits(); |
274 | if(fDebug>1) cout << "nDigits: " << nDigits << endl; |
275 | // loop over digits |
276 | for (Int_t id = 0; id < nDigits; id++) { |
a312477b |
277 | // Int_t iid = (Int_t)bufferDigit[id][0]; |
278 | // Int_t isupMod = (Int_t)bufferDigit[id][1]; |
279 | Double_t iamp = bufferDigit[id][2]; |
280 | Int_t amp = (Int_t)(iamp+0.5); |
281 | // Double_t ix = bufferDigit[id][3]; |
282 | Double_t iy = bufferDigit[id][4]; |
283 | Double_t iz = bufferDigit[id][5]; |
c3e34498 |
284 | |
a312477b |
285 | // Add digit information to the TEveQuadSet |
c3e34498 |
286 | fQuadSet->AddQuad(iy, iz); |
a312477b |
287 | fQuadSet->QuadValue(amp); |
c3e34498 |
288 | } // end digits loop |
289 | } |
ef3891ac |
290 | else { if (fDebug) printf("There is no digits in SM %d \n", smId); } |
c3e34498 |
291 | |
292 | // hits -------------------------- |
a312477b |
293 | bufferHit = fEMCALSModuleData->GetHitBuffer(); |
c3e34498 |
294 | if(!bufferHit.empty()) |
295 | { |
a312477b |
296 | char form[1000]; |
c3e34498 |
297 | nHits = fEMCALSModuleData->GetNHits(); |
298 | if(fDebug>1) cout << "nHits: " << nHits << endl; |
299 | oldSize = fPointSet->GrowFor(nHits); |
300 | // Loop over hits |
301 | for (Int_t ih = 0; ih < nHits; ih++) { |
a312477b |
302 | hitX = bufferHit[ih][3]; |
303 | hitY = bufferHit[ih][4]; |
304 | hitZ = bufferHit[ih][5]; |
c3e34498 |
305 | fPointSet->SetPoint(ih,hitX,hitY,hitZ); |
a312477b |
306 | sprintf(form,"N=%d", fPointSet->Size()); |
307 | fPointSet->SetTitle(form); |
308 | fPointSet->SetMarkerSize(.5); |
309 | fPointSet->SetMarkerColor((Color_t)2); |
c3e34498 |
310 | } |
311 | } |
ef3891ac |
312 | else { if (fDebug) printf("There is no hits in SM %d \n", smId); } |
c3e34498 |
313 | |
314 | // clusters ------------------------ |
a312477b |
315 | |
316 | // Define TEveQuadSet for clusters |
c3e34498 |
317 | fQuadSet2->SetOwnIds(kTRUE); |
318 | fQuadSet2->Reset(TEveQuadSet::kQT_RectangleYZFixedDimX, kFALSE, 32); |
319 | fQuadSet2->SetDefWidth (fEMCALSModuleData->GetPhiTileSize()); |
320 | fQuadSet2->SetDefHeight(fEMCALSModuleData->GetEtaTileSize()); |
321 | fQuadSet2->RefMainTrans().SetFrom(*fEMCALSModuleData->GetSModuleMatrix()); |
ebedba59 |
322 | fQuadSet2->SetPalette(fgFrameCluPalette); |
c3e34498 |
323 | if(smId<fEMCALSModuleData->GetNsmf()) |
ebedba59 |
324 | fQuadSet2->SetFrame(fgFrameBigBox); |
325 | else fQuadSet2->SetFrame(fgFrameSmallBox); |
c3e34498 |
326 | |
a312477b |
327 | // Get the cluster information from the buffer |
c3e34498 |
328 | bufferCluster = fEMCALSModuleData->GetClusterBuffer(); |
329 | if(!bufferCluster.empty()) |
330 | { |
331 | nClusters = fEMCALSModuleData->GetNClusters(); |
332 | if(fDebug>1) cout << "nClusters: " << nClusters << endl; |
333 | // loop over clusters |
334 | for (Int_t id = 0; id < nClusters; id++) { |
335 | if(fDebug>1) { |
336 | cout << "bufferCluster[" << id << "][0]: " << bufferCluster[id][0] << endl; |
337 | cout << "bufferCluster[" << id << "][1]: " << bufferCluster[id][1] << endl; |
338 | cout << "bufferCluster[" << id << "][2]: " << bufferCluster[id][2] << endl; |
339 | cout << "bufferCluster[" << id << "][3]: " << bufferCluster[id][3] << endl; |
340 | cout << "bufferCluster[" << id << "][4]: " << bufferCluster[id][4] << endl; |
341 | } |
a312477b |
342 | // Int_t isupMod = (Int_t)bufferCluster[id][0]; |
343 | Double_t iamp = bufferCluster[id][1]; |
344 | Int_t amp = (Int_t)(iamp+0.5); |
345 | // Double_t ix = bufferCluster[id][2]; |
346 | Double_t iy = bufferCluster[id][3]; |
347 | Double_t iz = bufferCluster[id][4]; |
c3e34498 |
348 | |
a312477b |
349 | // Add cluster information to the TEveQuadSet |
c3e34498 |
350 | fQuadSet2->AddQuad(iy, iz); |
a312477b |
351 | fQuadSet2->QuadValue(amp); |
c3e34498 |
352 | // fQuadSet2->QuadId(iid); |
353 | |
354 | } // end clusters loop |
355 | } |
ef3891ac |
356 | else { if (fDebug) printf("There is no clusters in SM %d \n", smId); } |
c3e34498 |
357 | |
358 | } // end if (fEMCALSModuleData != 0) |
359 | |
360 | } |
361 | |
362 | //______________________________________________________________________________ |
363 | void AliEveEMCALSModule::SetSModuleID(Int_t id) |
364 | { |
a312477b |
365 | // |
366 | // Set id of the SM to display. |
367 | // |
c3e34498 |
368 | |
369 | if (id < 0) id = 0; |
370 | if (id > 12) id = 12; |
371 | |
372 | fSModuleID = id; |
c3e34498 |
373 | } |