]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - FMD/AliFMDDisplay.cxx
Removal of effc++ warnings
[u/mrichter/AliRoot.git] / FMD / AliFMDDisplay.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 2004, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15/* $Id$ */
16/** @file AliFMDDisplay.cxx
17 @author Christian Holm Christensen <cholm@nbi.dk>
18 @date Mon Mar 27 12:39:09 2006
19 @brief FMD Event display
20*/
21//___________________________________________________________________
22//
23// The classes defined here, are utility classes for reading in data
24// for the FMD. They are put in a seperate library to not polute the
25// normal libraries. The classes are intended to be used as base
26// classes for customized class that do some sort of analysis on the
27// various types of data produced by the FMD.
28//
29// Latest changes by Christian Holm Christensen
30//
31#include "AliFMDDisplay.h" // ALIFMDDISPLAY_H
32#include "AliFMDHit.h" // ALIFMDHIT_H
33#include "AliFMDDigit.h" // ALIFMDDIGIT_H
34#include "AliFMDRecPoint.h" // ALIFMDRECPOINT_H
35#include "AliFMDGeometry.h" // ALIFMDGEOMETRY_H
36#include "AliFMDParameters.h" // ALIFMDPARAMETERS_H
37#include <AliESDFMD.h> // ALIESDFMD_H
38#include <AliLog.h>
39#include <TStyle.h>
40// #include <TArrayF.h>
41#include <TMarker3DBox.h>
42#include <TGeoManager.h>
43// #include <TMath.h>
44#include <TApplication.h>
45#include <TButton.h>
46// #include <TParticle.h>
47#include <TCanvas.h>
48#include <TView.h>
49#include <TVirtualX.h>
50
51//____________________________________________________________________
52ClassImp(AliFMDDisplay)
53#if 0
54 ; // This is here to keep Emacs for indenting the next line
55#endif
56
57//____________________________________________________________________
58AliFMDDisplay* AliFMDDisplay::fgInstance = 0;
59
60//____________________________________________________________________
61AliFMDDisplay*
62AliFMDDisplay::Instance()
63{
64 // Return static instance
65 return fgInstance;
66}
67
68//____________________________________________________________________
69AliFMDDisplay::AliFMDDisplay(const char* gAliceFile)
70 : AliFMDInput(gAliceFile),
71 fWait(kFALSE),
72 fMarkers(0),
73 fHits(0),
74 fCanvas(0),
75 fPad(0),
76 fButton(0),
77 fZoom(0),
78 fPick(0),
79 fZoomMode(kFALSE),
80 fX0(0),
81 fY0(0),
82 fX1(0),
83 fY1(0),
84 fMultCut(0),
85 fPedestalFactor(0),
86 fXPixel(0),
87 fYPixel(0),
88 fOldXPixel(0),
89 fOldYPixel(0),
90 fLineDrawn(0)
91{
92 // Constructor of an FMD display object.
93 AddLoad(kGeometry);
94 fMarkers = new TObjArray;
95 fHits = new TObjArray;
96 fMarkers->SetOwner(kTRUE);
97 fHits->SetOwner(kFALSE);
98 fgInstance = this;
99 SetMultiplicityCut();
100 SetPedestalFactor();
101}
102
103//____________________________________________________________________
104void
105AliFMDDisplay::ExecuteEvent(Int_t event, Int_t px, Int_t py)
106{
107 // AliInfo(Form("Event %d, at (%d,%d)", px, py));
108 if (px == 0 && py == 0) return;
109 if (!fZoomMode && fPad->GetView()) {
110 fPad->GetView()->ExecuteRotateView(event, px, py);
111 return;
112 }
113 fPad->SetCursor(kCross);
114 switch (event) {
115 case kButton1Down:
116 fPad->TAttLine::Modify();
117 fX0 = fPad->AbsPixeltoX(px);
118 fY0 = fPad->AbsPixeltoY(py);
119 fXPixel = fOldXPixel = px;
120 fYPixel = fOldYPixel = py;
121 fLineDrawn = kFALSE;
122 return;
123 case kButton1Motion:
124 if (fLineDrawn)
125 gVirtualX->DrawBox(fXPixel, fYPixel, fOldXPixel, fOldYPixel,
126 TVirtualX::kHollow);
127 fOldXPixel = px;
128 fOldYPixel = py;
129 fLineDrawn = kTRUE;
130 gVirtualX->DrawBox(fXPixel, fYPixel, fOldXPixel, fOldYPixel,
131 TVirtualX::kHollow);
132 return;
133 case kButton1Up:
134 fPad->GetCanvas()->FeedbackMode(kFALSE);
135 if (px == fXPixel || py == fYPixel) return;
136 fX1 = fPad->AbsPixeltoX(px);
137 fY1 = fPad->AbsPixeltoY(py);
138 if (fX1 < fX0) std::swap(fX0, fX1);
139 if (fY1 < fY0) std::swap(fY0, fY1);
140 fPad->Range(fX0, fY0, fX1, fY1);
141 fPad->Modified();
142 return;
143 }
144}
145
146//____________________________________________________________________
147Int_t
148AliFMDDisplay::DistancetoPrimitive(Int_t px, Int_t)
149{
150 // AliInfo(Form("@ (%d,%d)", px, py));
151 fPad->SetCursor(kCross);
152 Float_t xmin = fPad->GetX1();
153 Float_t xmax = fPad->GetX2();
154 Float_t dx = .02 * (xmax - xmin);
155 Float_t x = fPad->AbsPixeltoX(px);
156 if (x < xmin + dx || x > xmax - dx) return 9999;
157 return (fZoomMode ? 0 : 7);
158}
159//____________________________________________________________________
160Bool_t
161AliFMDDisplay::Init()
162{
163 // Initialize. GEt transforms and such,
164 if (!AliFMDInput::Init()) return kFALSE;
165 AliFMDGeometry* geom = AliFMDGeometry::Instance();
166 geom->Init();
167 geom->InitTransformations();
168 // AliFMDParameters* parm = AliFMDParameters::Instance();
169 // parm->Init();
170 return kTRUE;
171}
172//____________________________________________________________________
173Bool_t
174AliFMDDisplay::Begin(Int_t event)
175{
176 // Begin of event. Make canvas is not already done
177 if (!fCanvas) {
178 gStyle->SetPalette(1);
179 fCanvas = new TCanvas("display", "Display", 700, 700);
180 fCanvas->SetFillColor(1);
181 fCanvas->ToggleEventStatus();
182 fPad = new TPad("view3D", "3DView", 0.0, 0.05, 1.0, 1.0, 1, 0, 0);
183 fCanvas->cd();
184 fPad->Draw();
185 }
186 if (!fButton) {
187 fCanvas->cd();
188 fButton = new TButton("Continue", "AliFMDDisplay::Instance()->Continue()",
189 0, 0, .5, .05);
190 fButton->Draw();
191 fZoom = new TButton("Zoom", "AliFMDDisplay::Instance()->Zoom()",
192 .5, 0, .75, .05);
193 fZoom->Draw();
194 fPick = new TButton("Pick", "AliFMDDisplay::Instance()->Pick()",
195 .75, 0, 1, .05);
196 fPick->Draw();
197 }
198 AliInfo("Clearing canvas");
199 // fCanvas->Clear();
200 if (!fGeoManager) {
201 Warning("End", "No geometry manager");
202 return kFALSE;
203 }
204 AliInfo("Drawing geometry");
205 fPad->cd();
206 fGeoManager->GetTopVolume()->Draw();
207 AliInfo("Adjusting view");
208 Int_t irep;
209 if (fPad->GetView()) {
210 fPad->GetView()->SetView(-200, -40, 80, irep);
211 fPad->GetView()->Zoom();
212 fPad->Modified();
213 fPad->cd();
214 }
215 return AliFMDInput::Begin(event);
216}
217
218//____________________________________________________________________
219Bool_t
220AliFMDDisplay::End()
221{
222 // End of event. Draw everything
223 fPad->cd();
224 fMarkers->Draw();
225 fPad->cd();
226 AppendPad();
227 // fPad->Update();
228 fPad->cd();
229 // fCanvas->Modified(kTRUE);
230 //fCanvas->Update();
231 // fCanvas->cd();
232 // fPad->cd();
233 fWait = kTRUE;
234 while (fWait) {
235 gApplication->StartIdleing();
236 gSystem->InnerLoop();
237 gApplication->StopIdleing();
238 }
239 AliInfo("After idle loop");
240 fMarkers->Delete();
241 fHits->Clear();
242 AliInfo("After clearing caches");
243 return AliFMDInput::End();
244}
245
246//____________________________________________________________________
247Int_t
248AliFMDDisplay::LookupColor(Float_t x, Float_t max) const
249{
250 // Look-up color
251 Int_t idx = Int_t(x / max * gStyle->GetNumberOfColors());
252 return gStyle->GetColorPalette(idx);
253}
254
255//____________________________________________________________________
256void
257AliFMDDisplay::AddMarker(UShort_t det, Char_t rng, UShort_t sec, UShort_t str,
258 TObject* o, Float_t s, Float_t max)
259{
260 // Add a marker to the display
261 //
262 // det Detector
263 // rng Ring
264 // sec Sector
265 // str Strip
266 // o Object to refer to
267 // s Signal
268 // max Maximum of signal
269 //
270 AliFMDGeometry* geom = AliFMDGeometry::Instance();
271 Double_t x, y, z;
272 geom->Detector2XYZ(det, rng, sec, str, x, y, z);
273 Float_t size = .1;
274 Float_t zsize = s / max * 10;
275 Float_t r = TMath::Sqrt(x * x + y * y);
276 Float_t theta = TMath::ATan2(r, z);
277 Float_t phi = TMath::ATan2(y, x);
278 Float_t rz = z + (z < 0 ? 1 : -1) * zsize;
279 TMarker3DBox* marker = new TMarker3DBox(x,y,rz,size,size,zsize,theta,phi);
280 if (o) marker->SetRefObject(o);
281 marker->SetLineColor(LookupColor(s, max));
282 fMarkers->Add(marker);
283}
284
285
286//____________________________________________________________________
287Bool_t
288AliFMDDisplay::ProcessHit(AliFMDHit* hit, TParticle* p)
289{
290 // Process a hit
291 if (!hit) { AliError("No hit"); return kFALSE; }
292 if (!p) { AliError("No track"); return kFALSE; }
293
294 fHits->Add(hit);
295 Float_t size = .1;
296 Float_t zsize = hit->Edep() * 10;
297 Float_t z = hit->Z() + (hit->Z() < 0 ? 1 : -1) * zsize;
298 Float_t pt = TMath::Sqrt(hit->Py()*hit->Py()+hit->Px()*hit->Px());
299 Float_t theta = TMath::ATan2(pt, hit->Pz());
300 Float_t phi = TMath::ATan2(hit->Py(), hit->Px());
301 TMarker3DBox* marker = new TMarker3DBox(hit->X(), hit->Y(), z,
302 size, size, zsize, theta, phi);
303 marker->SetLineColor(LookupColor(hit->Edep(), 1));
304 marker->SetRefObject(hit);
305 fMarkers->Add(marker);
306 return kTRUE;
307}
308
309//____________________________________________________________________
310Bool_t
311AliFMDDisplay::ProcessDigit(AliFMDDigit* digit)
312{
313 // Process a digit
314 if (!digit) { AliError("No digit"); return kFALSE; }
315
316 AliFMDParameters* parm = AliFMDParameters::Instance();
317 UShort_t det = digit->Detector();
318 Char_t ring = digit->Ring();
319 UShort_t sec = digit->Sector();
320 UShort_t str = digit->Strip();
321 Double_t ped = parm->GetPedestal(det,ring, sec, str);
322 Double_t pedW = parm->GetPedestalWidth(det,ring, sec, str);
323 Double_t threshold = ped * fPedestalFactor * pedW;
324 Float_t counts = digit->Counts();
325 if (counts < threshold) return kTRUE;
326 fHits->Add(digit);
327
328 AddMarker(det, ring, sec, str, digit, counts, 1024);
329 return kTRUE;
330}
331
332//____________________________________________________________________
333Bool_t
334AliFMDDisplay::ProcessRaw(AliFMDDigit* digit)
335{
336 // PRocess raw data
337 return ProcessDigit(digit);
338}
339
340//____________________________________________________________________
341Bool_t
342AliFMDDisplay::ProcessRecPoint(AliFMDRecPoint* recpoint)
343{
344 // Process reconstructed point
345 if (!recpoint) { AliError("No recpoint"); return kFALSE; }
346 if (recpoint->Particles() < fMultCut) return kTRUE;
347 fHits->Add(recpoint);
348 AddMarker(recpoint->Detector(), recpoint->Ring(), recpoint->Sector(),
349 recpoint->Strip(), recpoint, recpoint->Particles(), 20);
350 return kTRUE;
351}
352
353//____________________________________________________________________
354Bool_t
355AliFMDDisplay::ProcessESD(AliESDFMD* esd)
356{
357 // Process event summary data
358 for (UShort_t det = 1; det <= 3; det++) {
359 Char_t rings[] = { 'I', (det == 1 ? '\0' : 'O'), '\0' };
360 for (Char_t* rng = rings; *rng != '\0'; rng++) {
361 UShort_t nsec = (*rng == 'I' ? 20 : 40);
362 UShort_t nstr = (*rng == 'O' ? 512 : 256);
363 for (UShort_t sec = 0; sec < nsec; sec++) {
364 for (UShort_t str = 0; str < nstr; str++) {
365 Float_t mult = esd->Multiplicity(det,*rng,sec,str);
366 if (mult < fMultCut) continue;
367 AddMarker(det,*rng,sec,str, 0, mult, 20);
368 }
369 }
370 }
371 }
372 return kTRUE;
373}
374
375//____________________________________________________________________
376//
377// EOF
378//