]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/EveDet/AliEveITSModuleStepper.cxx
Coverity
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveITSModuleStepper.cxx
CommitLineData
d810d0de 1// $Id$
2// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
82b3616d 3
d810d0de 4/**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
51346b82 7 * full copyright notice. *
d810d0de 8 **************************************************************************/
9
10#include "AliEveITSModuleStepper.h"
11#include "AliEveITSDigitsInfo.h"
12#include "AliEveITSScaledModule.h"
82b3616d 13
84aff7a4 14#include <TEveManager.h>
15#include <TEveGedEditor.h>
16#include <TEveGridStepper.h>
84aff7a4 17#include <TEveTrans.h>
09edeb17 18
32e219c2 19#include <TGLRnrCtx.h>
c87a8d78 20#include <TGLIncludes.h>
32e219c2 21#include <TGLSelectRecord.h>
a15e6d7d 22#include <TGLUtil.h>
32e219c2 23#include <TGLViewer.h>
c87a8d78 24#include <TGLAxis.h>
d810d0de 25
c87a8d78 26#include <TMath.h>
27#include <THLimitsFinder.h>
28#include <TVirtualPad.h>
82b3616d 29
a3d4f532 30#include <RVersion.h>
31
57ffa5fb 32//______________________________________________________________________________
82b3616d 33//
698e2c9b 34// Display scaled ITS modules in a paged layout, also providing
35// GL-overaly control GUI.
36
82b3616d 37
d810d0de 38ClassImp(AliEveITSModuleStepper)
82b3616d 39
d810d0de 40AliEveITSModuleStepper::AliEveITSModuleStepper(AliEveITSDigitsInfo* di) :
41 TEveElementList("ITS 2DStore", "AliEveITSModuleStepper", kTRUE),
32e219c2 42
32e219c2 43 fDigitsInfo(di),
44 fScaleInfo(0),
c87a8d78 45 fStepper(0),
32e219c2 46
c87a8d78 47 fModuleIDs(),
48 fPosition(0),
32e219c2 49 fSubDet(-1),
09edeb17 50
9af86b69 51 fModuleFont(), fTextFont(), fSymbolFont(),
32e219c2 52 fAxis(0),
c87a8d78 53
54 fMenuHeight(0.13),
55 fTextSize(64),
56 fTextCol(kGray+1),
57 fActiveCol(kRed-4),
58
59 fActiveID(-1)
82b3616d 60{
698e2c9b 61 // Constructor.
62
c87a8d78 63 SetMainColorPtr(&fTextCol);
64 fAxis = new TGLAxis();
65
84aff7a4 66 // override member from base TEveElementList
d810d0de 67 fChildClass = AliEveITSScaledModule::Class();
32e219c2 68
32e219c2 69 fDigitsInfo->IncRefCount();
70
84aff7a4 71 fStepper = new TEveGridStepper();
32e219c2 72 fStepper->SetNs(5, 4);
73
d810d0de 74 fScaleInfo = new AliEveDigitScaleInfo();
32e219c2 75 fScaleInfo->IncRefCount();
64c42545 76
68ca2fe7 77 gEve->GetDefaultGLViewer()->AddOverlayElement(this);
82b3616d 78}
79
d810d0de 80AliEveITSModuleStepper::~AliEveITSModuleStepper()
82b3616d 81{
698e2c9b 82 // Destructor.
83
68ca2fe7 84 gEve->GetDefaultGLViewer()->RemoveOverlayElement(this);
32e219c2 85
c87a8d78 86 fScaleInfo->DecRefCount();
32e219c2 87 fDigitsInfo->DecRefCount();
88
82b3616d 89 delete fStepper;
32e219c2 90 delete fAxis;
82b3616d 91}
92
57ffa5fb 93/******************************************************************************/
d7e36bcf 94
d810d0de 95void AliEveITSModuleStepper::Capacity()
82b3616d 96{
698e2c9b 97 // Make sure we have just enough children (module representations)
98 // to store as many modules as required by the grid-stepper
99 // configuration.
100
a15e6d7d 101 Int_t n = fStepper->GetNx()*fStepper->GetNy();
fbc350a3 102 if (n != NumChildren())
82b3616d 103 {
32e219c2 104 DestroyElements();
a15e6d7d 105 for (Int_t m=0; m<n; ++m)
32e219c2 106 {
d810d0de 107 AddElement(new AliEveITSScaledModule(m, fDigitsInfo, fScaleInfo));
32e219c2 108 }
82b3616d 109 }
82b3616d 110}
111
57ffa5fb 112/******************************************************************************/
d7e36bcf 113
d810d0de 114void AliEveITSModuleStepper::SetFirst(Int_t first)
09edeb17 115{
c87a8d78 116 // Se module ID which apply to first item in stepper.
117
118 Int_t lastpage = fModuleIDs.size()/Nxy();
ba5a649d 119 if (fModuleIDs.size() % Nxy() ) lastpage++;
51346b82 120
698e2c9b 121 Int_t firstLastpage = (lastpage - 1)*Nxy();
ba5a649d 122 if (first > firstLastpage) first = firstLastpage;
123 if (first < 0) first = 0;
09edeb17 124 fPosition = first;
09edeb17 125 Apply();
126}
127
d810d0de 128void AliEveITSModuleStepper::Start()
82b3616d 129{
698e2c9b 130 // Go to first page.
131
09edeb17 132 fPosition = 0;
82b3616d 133 Apply();
134}
135
d810d0de 136void AliEveITSModuleStepper::Next()
82b3616d 137{
698e2c9b 138 // Go to next page.
139
32e219c2 140 SetFirst(fPosition + Nxy());
09edeb17 141}
142
d810d0de 143void AliEveITSModuleStepper::Previous()
09edeb17 144{
698e2c9b 145 // Go to previous page.
146
32e219c2 147 SetFirst(fPosition - Nxy());
09edeb17 148}
149
d810d0de 150void AliEveITSModuleStepper::End()
51346b82 151{
698e2c9b 152 // Go to last page.
153
c87a8d78 154 Int_t lastpage = fModuleIDs.size()/Nxy();
155 if (fModuleIDs.size() % Nxy()) lastpage++;
698e2c9b 156 fPosition = (lastpage - 1)*Nxy();
09edeb17 157
51346b82 158 fStepper->Reset();
82b3616d 159 Apply();
160}
161
57ffa5fb 162/******************************************************************************/
d7e36bcf 163
d810d0de 164void AliEveITSModuleStepper::DisplayDet(Int_t det, Int_t layer)
32e219c2 165{
c87a8d78 166 // Select modules to display by sub-det type / layer.
698e2c9b 167
32e219c2 168 fSubDet = det;
c87a8d78 169 fModuleIDs.clear();
d810d0de 170 AliEveITSModuleSelection sel = AliEveITSModuleSelection();
51346b82 171 sel.SetType (det);
172 sel.SetLayer(layer);
c87a8d78 173 fDigitsInfo->GetModuleIDs(&sel, fModuleIDs);
32e219c2 174 //in reder menu define a space between left and right pager
32e219c2 175 Start();
176}
177
57ffa5fb 178/******************************************************************************/
32e219c2 179
a15e6d7d 180Int_t AliEveITSModuleStepper::GetCurrentPage() const
32e219c2 181{
698e2c9b 182 // Get number of current page.
183
184 Int_t idx = fPosition + 1;
185 Int_t n = idx/Nxy();
186 if (idx % Nxy()) n++;
32e219c2 187 return n;
188}
189
57ffa5fb 190/******************************************************************************/
32e219c2 191
d810d0de 192Int_t AliEveITSModuleStepper::GetPages()
32e219c2 193{
698e2c9b 194 // Get number of all pages.
195
c87a8d78 196 Int_t n = fModuleIDs.size()/Nxy();
ba5a649d 197 if (fModuleIDs.size() % Nxy()) n++;
32e219c2 198 return n;
199}
51346b82 200
57ffa5fb 201/******************************************************************************/
32e219c2 202
d810d0de 203void AliEveITSModuleStepper::Apply()
82b3616d 204{
698e2c9b 205 // Apply current settings to children modules.
206
84aff7a4 207 gEve->DisableRedraw();
32e219c2 208 Capacity();
09edeb17 209
210 UInt_t idx = fPosition;
32e219c2 211 for(List_i childit=fChildren.begin(); childit!=fChildren.end(); ++childit)
82b3616d 212 {
ba5a649d 213 if (idx < fModuleIDs.size())
82b3616d 214 {
d810d0de 215 AliEveITSScaledModule* mod = dynamic_cast<AliEveITSScaledModule*>(*childit);
c87a8d78 216 mod->SetID(fModuleIDs[idx], kFALSE);
a15e6d7d 217 TEveTrans& tr = mod->RefMainTrans();
32e219c2 218 tr.UnitTrans();
219 tr.RotateLF(3,2,TMath::PiOver2());
51346b82 220 tr.RotateLF(1,3,TMath::PiOver2());
82b3616d 221
51346b82 222 // scaling
32e219c2 223 Float_t mz, mx;
d7e36bcf 224 Float_t* fp = mod->GetFrame()->GetFramePoints();
225 // switch x,z it will be rotated afterwards
32e219c2 226 mx = -2*fp[0];
227 mz = -2*fp[2];
d7e36bcf 228
32e219c2 229 // fit width first
84aff7a4 230 Double_t sx = fStepper->GetDx();
231 Double_t sy = (mx*fStepper->GetDx())/mz;
ba5a649d 232 if (sy > fStepper->GetDy())
82b3616d 233 {
84aff7a4 234 sy = fStepper->GetDy();
235 sx = (mz*fStepper->GetDx())/mx;
82b3616d 236 }
c87a8d78 237 Float_t scale = (0.85*sx)/mz;
32e219c2 238 tr.Scale(scale, scale, scale);
64c42545 239
32e219c2 240 Float_t p[3];
241 fStepper->GetPosition(p);
84aff7a4 242 tr.SetPos(p[0]+0.5*fStepper->GetDx(), p[1]+0.5*fStepper->GetDy(), p[2]+0.5*fStepper->GetDz());
51346b82 243
ba5a649d 244 if (mod->GetSubDetID() == 2)
b3ffcccb 245 mod->SetName(Form("SSD %d", idx));
ba5a649d 246 else if (mod->GetSubDetID() == 1)
b3ffcccb 247 mod->SetName(Form("SDD %d", idx));
d7e36bcf 248 else
b3ffcccb 249 mod->SetName(Form("SPD %d", idx));
32e219c2 250 mod->SetRnrSelf(kTRUE);
d7e36bcf 251
09edeb17 252 fStepper->Step();
253 idx++;
82b3616d 254 }
255 else {
256 (*childit)->SetRnrSelf(kFALSE);
257 }
258 }
09edeb17 259
32e219c2 260 fStepper->Reset();
261 ElementChanged();
84aff7a4 262 gEve->EnableRedraw();
82b3616d 263}
09edeb17 264
32e219c2 265
57ffa5fb 266/******************************************************************************/
32e219c2 267// Virtual event handlers from TGLOverlayElement
57ffa5fb 268/******************************************************************************/
09edeb17 269
57ffa5fb 270//______________________________________________________________________________
d810d0de 271Bool_t AliEveITSModuleStepper::Handle(TGLRnrCtx & /*rnrCtx*/,
698e2c9b 272 TGLOvlSelectRecord & rec,
273 Event_t * event)
09edeb17 274{
32e219c2 275 // Handle overlay event.
276 // Return TRUE if event was handled.
277
278 switch (event->fType)
51346b82 279 {
32e219c2 280 case kMotionNotify:
281 {
282 Int_t item = rec.GetN() < 2 ? -1 : (Int_t)rec.GetItem(1);
c87a8d78 283 if (fActiveID != item) {
284 fActiveID = item;
32e219c2 285 return kTRUE;
286 } else {
287 return kFALSE;
288 }
289 break;
290 }
291 case kButtonPress:
292 {
293 if (event->fCode != kButton1) {
294 return kFALSE;
295 }
296 switch (rec.GetItem(1))
297 {
298 case 1:
299 Previous();
300 break;
301 case 2:
302 Start();
303 break;
304 case 3:
305 Next();
306 break;
307 case 4:
308 End();
309 break;
310 case 5:
311 {
d810d0de 312 AliEveDigitScaleInfo* si = fScaleInfo;
ba5a649d 313 if (si->GetScale() < 5)
32e219c2 314 {
51346b82 315 si->ScaleChanged(si->GetScale() + 1);
32e219c2 316 ElementChanged(kTRUE, kTRUE);
317 }
318 break;
319 }
320 case 6:
321 {
d810d0de 322 AliEveDigitScaleInfo* si = fScaleInfo;
ba5a649d 323 if (si->GetScale() > 1)
32e219c2 324 {
51346b82 325 si->ScaleChanged(si->GetScale() - 1);
32e219c2 326 ElementChanged(kTRUE, kTRUE);
327 }
328 break;
329 }
330 case 7:
84aff7a4 331 gEve->GetEditor()->DisplayElement(*BeginChildren());
32e219c2 332 break;
333
334 case 8:
c87a8d78 335 DisplayDet(0, -1);
32e219c2 336 break;
51346b82 337 case 9:
c87a8d78 338 DisplayDet(1, -1);
32e219c2 339 break;
51346b82 340 case 10:
c87a8d78 341 DisplayDet(2, -1);
32e219c2 342 break;
343 default:
344 break;
345 }
346 return kTRUE;
347 break;
348 }
349 default:
350 break;
351 } // end switch
352 return kFALSE;
09edeb17 353}
32e219c2 354
57ffa5fb 355//______________________________________________________________________________
d810d0de 356Bool_t AliEveITSModuleStepper::MouseEnter(TGLOvlSelectRecord& /*rec*/)
32e219c2 357{
698e2c9b 358 // Mouse has entered overlay area.
359
32e219c2 360 return kTRUE;
361}
362
57ffa5fb 363//______________________________________________________________________________
d810d0de 364void AliEveITSModuleStepper::MouseLeave()
32e219c2 365{
698e2c9b 366 // Mouse has left overlay area.
32e219c2 367
c87a8d78 368 fActiveID = -1;
369}
370
371
372/******************************************************************************/
373// Protected sub-renderers
374/******************************************************************************/
375
376//______________________________________________________________________________
ba5a649d 377void AliEveITSModuleStepper::RenderText(const char* txt, Int_t id, const TGLFont &font, Float_t step)
c87a8d78 378{
379 // Render text for button id.
380
381 Float_t llx, lly, llz, urx, ury, urz;
c87a8d78 382 font.BBox(txt, llx, lly, llz, urx, ury, urz);
ba5a649d 383 (fActiveID == id && id > 0) ? TGLUtil::Color(fActiveCol) :TGLUtil::Color(fTextCol);
384
385 if (step > 0)
386 {
387 // center text in the step interval
388 glPushMatrix();
389 if (step>urx)
390 glTranslatef((step-urx+llx)*0.5f-llx, 0, 0);
391 glLoadName(id);
392 font.Render(txt);
393 glPopMatrix();
394 glTranslatef(step, 0, 0);
395 }
396 else
397 {
398 glLoadName(id);
399 glPushMatrix();
400 font.Render(txt);
401 glPopMatrix();
402 glTranslatef(urx, 0, 0);
403 }
c87a8d78 404}
405
406//______________________________________________________________________________
407void AliEveITSModuleStepper::RenderPalette(TEveRGBAPalette* p)
408{
409 // Render color palette with number axis.
410
411 Float_t length = 7*fTextSize;
412 Float_t x = 1.5*fTextSize;
413 Float_t y = 0.2*fTextSize;
414
415 glTranslatef(x, 0.8*fTextSize, 0);
416
417 TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE);
418
419 glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
420 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
421 glDisable(GL_CULL_FACE);
422 glEnable(GL_BLEND);
423 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
424
425 glBegin(GL_QUAD_STRIP);
426 TGLUtil::Color4ubv(p->ColorFromValue(p->GetMinVal()));
427 glVertex2f(0, 0);
428 glVertex2f(0, y);
429 if (p->GetMaxVal() > p->GetMinVal() + 1)
430 {
431 Float_t xs = length/(p->GetMaxVal() - p->GetMinVal());
432 Float_t x0 = xs;
433 for(Int_t i=p->GetMinVal() + 1; i<p->GetMaxVal(); i++)
434 {
435 TGLUtil::Color4ubv(p->ColorFromValue(i));
436 glVertex2f(x0, 0);
437 glVertex2f(x0, y);
438 x0+=xs;
439 }
440 }
441 TGLUtil::Color4ubv(p->ColorFromValue(p->GetMaxVal()));
442 glVertex2f(length, 0);
443 glVertex2f(length, y);
444 glEnd();
445
ba5a649d 446 glRotatef(-90, 1, 0, 0 );
c87a8d78 447 Double_t v1[3] = {0., 0., 0.};
448 Double_t v2[3] = {length, 0, 0.};
ba5a649d 449 fAxis->SetTextColor(kGray+1);
450 fAxis->SetLineColor(kGray+1);
c87a8d78 451 fAxis->PaintGLAxis(v1, v2, p->GetMinVal(), p->GetMaxVal(), 5);
452 glPopAttrib();
453}
454
455//______________________________________________________________________________
456void AliEveITSModuleStepper::RenderMenu(Int_t curP, Int_t maxP, Int_t scaleX, Int_t scaleZ)
457{
458 // Make UI to set page in stepper and UI to scale in the AliEveITSScaledModule.
459
460 TGLUtil::Color(fTextCol);
461 fTextFont.PreRender();
462 glTranslatef(0, fTextSize*0.3, 0);
ba5a649d 463 {
464 // pager
465 glTranslatef(fTextSize*0.2, 0 , 0);
466 RenderText("9", 2, fSymbolFont); // last page
467 RenderText("3", 1, fSymbolFont);//last page
468 RenderText(Form("%d/%d", curP, maxP),-1, fTextFont, 2.7*fTextSize); //status
469 {
470 // bugg in webdings font , bbox does not give realistic value
471 Float_t llx, lly, llz, urx, ury, urz;
472 fSymbolFont.BBox("4", llx, lly, llz, urx, ury, urz);
473 glTranslatef(-llx, 0, 0);
474 }
475 RenderText("4", 3, fSymbolFont); // next page
476 RenderText(":",4, fSymbolFont); // last page
477 }
478 {
479 // scale
480 glTranslatef(fTextSize,0, 0);
481 RenderText(Form("Zoom:"), -1, fTextFont);
482 RenderText("6", 6, fSymbolFont);
483 RenderText("5", 5, fSymbolFont);
484 RenderText(Form("%dx%d", scaleX, scaleZ), -1, fTextFont, 2*fTextSize);
485 }
486 {
487 // detectors
488 glTranslatef(fTextSize, 0, 0);
489 RenderText("SPD ", 8, fTextFont);
490 RenderText("SDD ", 9, fTextFont);
491 RenderText("SSD ", 10, fTextFont);
492 fTextFont.PostRender();
493 }
c87a8d78 494}
495
496//______________________________________________________________________________
497void AliEveITSModuleStepper::RenderModuleIDs()
498{
499 // Render module-ids.
500
501 Double_t x, y, z;
502 UInt_t idx = fPosition;
503 Float_t llx, lly, llz, urx, ury, urz;
504 fModuleFont.PreRender();
505 TGLUtil::Color(kWhite);
506 for (List_i childit=fChildren.begin(); childit!=fChildren.end(); ++childit)
507 {
ba5a649d 508 if (idx < fModuleIDs.size())
c87a8d78 509 {
510 AliEveITSScaledModule* mod = dynamic_cast<AliEveITSScaledModule*>(*childit);
511 TEveTrans& tr = mod->RefMainTrans();
512 tr.GetPos(x,y,z);
513 x += fStepper->GetDx()*0.5;
514 y -= fStepper->GetDy()*0.5;
515 z += 0.4; // !!! MT hack - cross check with overlay rendering.
516 const char* txt = Form("%d",mod->GetID());
517 fModuleFont.BBox(txt, llx, lly, llz, urx, ury, urz);
518 glRasterPos3f(x, y, z);
519 glBitmap(0, 0, 0, 0,-urx, 0, 0);
520 fModuleFont.Render(txt);
521 idx++;
522 }
523 }
524 fModuleFont.PostRender();
525}
526
527/******************************************************************************/
528
529void AliEveITSModuleStepper::Render(TGLRnrCtx& rnrCtx)
530{
531 // Render the overlay elements.
532
533 AliEveITSScaledModule* sm = dynamic_cast<AliEveITSScaledModule*>(*BeginChildren());
9af86b69 534 Int_t scaleIdx = fScaleInfo->GetScale() - 1;
c87a8d78 535 Int_t cnx = 0, cnz = 0;
536 switch(sm->GetSubDetID())
537 {
538 case 0:
9af86b69 539 cnx = fDigitsInfo->fSPDScaleX[scaleIdx];
540 cnz = fDigitsInfo->fSPDScaleZ[scaleIdx];
c87a8d78 541 break;
542 case 1:
9af86b69 543 cnx = fDigitsInfo->fSDDScaleX[scaleIdx];
544 cnz = fDigitsInfo->fSDDScaleZ[scaleIdx];
c87a8d78 545 break;
546 case 2:
9af86b69 547 cnx = fDigitsInfo->fSSDScale[scaleIdx];
548 cnz = 1;
c87a8d78 549 break;
550 }
551
552 // init fonts
ba5a649d 553 if (fTextFont.GetMode() == TGLFont::kUndef)
c87a8d78 554 {
a3d4f532 555#if ROOT_VERSION_CODE >= 332547
556 rnrCtx.RegisterFont(fTextSize, 4, TGLFont::kTexture, fTextFont);
557 rnrCtx.RegisterFont(72, 31, TGLFont::kTexture, fSymbolFont);
558 rnrCtx.RegisterFont(14, 4, TGLFont::kPixmap, fModuleFont);
559#else
75522c26 560 fTextFont = rnrCtx.GetFont(fTextSize, 4, TGLFont::kTexture);
561 fSymbolFont = rnrCtx.GetFont(72, 31, TGLFont::kTexture);
562 fModuleFont = rnrCtx.GetFont(14, 4, TGLFont::kPixmap);
a3d4f532 563#endif
c87a8d78 564 }
565
566 {
567 // toolbar
568 glMatrixMode(GL_PROJECTION);
569 glPushMatrix();
570 glLoadIdentity();
571 if (rnrCtx.Selection())
572 {
573 TGLRect rect(*rnrCtx.GetPickRectangle());
574 rnrCtx.GetCamera()->WindowToViewport(rect);
575 gluPickMatrix(rect.X(), rect.Y(), rect.Width(), rect.Height(),
576 (Int_t*) rnrCtx.GetCamera()->RefViewport().CArr());
577 }
578 glMatrixMode(GL_MODELVIEW);
579 glPushMatrix();
580 glLoadIdentity();
581 glTranslatef(-1, -1, 0); // translate to lower left corner
9af86b69 582 Float_t txtScale = fMenuHeight/fTextSize*0.5; // scale text
583 glScalef(txtScale, txtScale, 1.);
c87a8d78 584
585 //menu
586 glPushName(0);
587 RenderMenu(GetCurrentPage(), GetPages(), cnx, cnz);
588 glPopName();
589 //palette
9af86b69 590 Double_t labelSize = 1.6*txtScale*fTextSize;
591 fAxis->SetLabelsSize(labelSize);
592 fAxis->SetLabelsOffset(1.2*labelSize);
c87a8d78 593 RenderPalette(sm->GetPalette());
594
595 glPopMatrix();
596 glMatrixMode(GL_PROJECTION);
597 glPopMatrix();
598 glMatrixMode(GL_MODELVIEW);
599 }
600 RenderModuleIDs();
51346b82 601}