From Francesco:
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveITSModuleStepper.cxx
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #include "AliEveITSModuleStepper.h"
11 #include "AliEveITSDigitsInfo.h"
12 #include "AliEveITSScaledModule.h"
13
14 #include <TEveManager.h>
15 #include <TEveGedEditor.h>
16 #include <TEveGridStepper.h>
17 #include <TEveGLText.h>
18 #include <TEveTrans.h>
19
20 #include <TObject.h>
21 #include <TMath.h>
22
23 #include <TBuffer3D.h>
24 #include <TBuffer3DTypes.h>
25 #include <TVirtualPad.h>
26 #include <TVirtualViewer3D.h>
27
28 #include <TGLRnrCtx.h>
29 #include <TGLSelectRecord.h>
30 #include <TGLText.h>
31 // #include <FTFont.h>
32 #include <TGLAxis.h>
33 #include <TGLViewer.h>
34
35
36 //______________________________________________________________________________
37 // AliEveITSModuleStepper
38 //
39
40 ClassImp(AliEveITSModuleStepper)
41
42 AliEveITSModuleStepper::AliEveITSModuleStepper(AliEveITSDigitsInfo* di) :
43   TEveElementList("ITS 2DStore", "AliEveITSModuleStepper", kTRUE),
44
45   fIDs(),
46   fPosition(0),
47
48   fDigitsInfo(di),
49   fScaleInfo(0),
50
51   fSubDet(-1),
52
53   fStepper(0),
54   fAxis(0),
55   fText(0),
56   fTextSize(0.05),
57   fPagerGap(0.1),
58   fRnrFrame(kFALSE),
59
60   fExpandCell(0.85),
61   fModuleFrameCol(2),
62
63   fPaletteOffset(0.2),
64   fPaletteLength(0.6),
65
66   fWActive(-1),
67   fWWidth(0.025),
68   fWHeight(0.032),
69   fWOff(0.05),
70   fWCol(30),
71   fWActiveCol(45),
72   fFontCol(8)
73 {
74   // override member from base TEveElementList
75   fChildClass = AliEveITSScaledModule::Class();
76
77   SetMainColorPtr(&fWCol);
78
79   fDigitsInfo->IncRefCount();
80
81   fStepper = new TEveGridStepper();
82   fStepper->SetNs(5, 4);
83
84   fScaleInfo = new AliEveDigitScaleInfo();
85   fScaleInfo->IncRefCount();
86
87   fAxis = new TGLAxis();
88   fAxis->SetLineColor(4);
89   fAxis->SetTextColor(fFontCol);
90
91   fText = new TGLText();
92   fText->SetTextColor(fFontCol);
93   fText->SetGLTextFont(40);
94   fText->SetGLTextAngles(0, 0, 0);
95   fText->SetTextSize(fTextSize);
96
97   gEve->GetGLViewer()->AddOverlayElement(this);
98 }
99
100 AliEveITSModuleStepper::~AliEveITSModuleStepper()
101 {
102   gEve->GetGLViewer()->RemoveOverlayElement(this);
103
104    fScaleInfo->DecRefCount();
105   fDigitsInfo->DecRefCount();
106
107   delete fStepper;
108
109   delete fAxis;
110   delete fText;
111 }
112
113 /******************************************************************************/
114
115 void AliEveITSModuleStepper::Capacity()
116 {
117   Int_t N = fStepper->GetNx()*fStepper->GetNy();
118   if (N != GetNChildren())
119   {
120     DestroyElements();
121     for (Int_t m=0; m<N; m++)
122     {
123       AddElement(new AliEveITSScaledModule(m, fDigitsInfo, fScaleInfo));
124     }
125   }
126 }
127
128 /******************************************************************************/
129
130 void AliEveITSModuleStepper::SetFirst(Int_t first)
131 {
132   Int_t lastpage = fIDs.size()/Nxy();
133   if(fIDs.size() % Nxy() ) lastpage++;
134
135   Int_t first_lastpage = (lastpage -1)*Nxy();
136   if(first > first_lastpage) first = first_lastpage;
137   if(first < 0) first = 0;
138   fPosition = first;
139   Apply();
140 }
141
142 void AliEveITSModuleStepper::Start()
143 {
144   fPosition = 0;
145   Apply();
146 }
147
148 void AliEveITSModuleStepper::Next()
149 {
150   SetFirst(fPosition + Nxy());
151 }
152
153 void AliEveITSModuleStepper::Previous()
154 {
155   // move to the top left corner first
156   SetFirst(fPosition - Nxy());
157 }
158
159 void AliEveITSModuleStepper::End()
160 {
161   Int_t lastpage = fIDs.size()/Nxy();
162   if(fIDs.size() % Nxy() ) lastpage++;
163   fPosition = (lastpage -1)*Nxy();
164
165   fStepper->Reset();
166   Apply();
167 }
168
169 /******************************************************************************/
170
171 void AliEveITSModuleStepper::DisplayDet(Int_t det, Int_t layer)
172 {
173   fSubDet = det;
174   fIDs.clear();
175   AliEveITSModuleSelection sel = AliEveITSModuleSelection();
176   sel.SetType (det);
177   sel.SetLayer(layer);
178   fDigitsInfo->GetModuleIDs(&sel, fIDs);
179   //in reder menu define a space between left and right pager
180   fPagerGap = 1.2*TextLength(Form("%d/%d",GetPages(), GetPages()));
181   Start();
182 }
183
184 /******************************************************************************/
185
186 void AliEveITSModuleStepper::DisplayTheta(Float_t min, Float_t max)
187 {
188   fIDs.clear();
189   AliEveITSModuleSelection sel = AliEveITSModuleSelection();
190   sel.SetThetaRange(min, max);
191   fDigitsInfo->GetModuleIDs(&sel, fIDs);
192   Start();
193 }
194
195 /******************************************************************************/
196
197 Int_t AliEveITSModuleStepper::GetCurrentPage()
198 {
199   Int_t idx = fPosition +1;
200   Int_t n = idx/Nxy();
201   if(idx % Nxy()) n++;
202   return n;
203 }
204
205 /******************************************************************************/
206
207 Int_t AliEveITSModuleStepper::GetPages()
208 {
209   Int_t n = fIDs.size()/Nxy();
210   if(fIDs.size() % Nxy()) n++;
211   return n;
212 }
213
214 /******************************************************************************/
215
216 void  AliEveITSModuleStepper::Apply()
217 {
218   // printf("AliEveITSModuleStepper::Apply fPosition %d \n", fPosition);
219   gEve->DisableRedraw();
220   Capacity();
221
222   UInt_t idx = fPosition;
223   for(List_i childit=fChildren.begin(); childit!=fChildren.end(); ++childit)
224   {
225     if(idx < fIDs.size())
226     {
227       AliEveITSScaledModule* mod = dynamic_cast<AliEveITSScaledModule*>(*childit);
228       mod->SetID(fIDs[idx], kFALSE);
229       TEveTrans& tr = mod->RefHMTrans();
230       tr.UnitTrans();
231       tr.RotateLF(3,2,TMath::PiOver2());
232       tr.RotateLF(1,3,TMath::PiOver2());
233
234       // scaling
235       Float_t mz, mx;
236       Float_t* fp = mod->GetFrame()->GetFramePoints();
237       // switch x,z it will be rotated afterwards
238       mx = -2*fp[0];
239       mz = -2*fp[2];
240
241       // fit width first
242       Double_t sx = fStepper->GetDx();
243       Double_t sy = (mx*fStepper->GetDx())/mz;
244       if(sy > fStepper->GetDy())
245       {
246         //      printf("fit width \n");
247         sy =  fStepper->GetDy();
248         sx =  (mz*fStepper->GetDx())/mx;
249       }
250       Float_t scale = (fExpandCell*sx)/mz;
251       tr.Scale(scale, scale, scale);
252
253       Float_t  p[3];
254       fStepper->GetPosition(p);
255       tr.SetPos(p[0]+0.5*fStepper->GetDx(), p[1]+0.5*fStepper->GetDy(), p[2]+0.5*fStepper->GetDz());
256
257       if(mod->GetSubDetID() == 2)
258         mod->SetName(Form("SSD %d", idx));
259       else if(mod->GetSubDetID() == 1)
260         mod->SetName(Form("SDD %d", idx));
261       else
262         mod->SetName(Form("SPD %d", idx));
263       mod->SetRnrSelf(kTRUE);
264       mod->UpdateItems();
265
266       fStepper->Step();
267       idx++;
268     }
269     else {
270       (*childit)->SetRnrSelf(kFALSE);
271     }
272   }
273
274   fStepper->Reset();
275   ElementChanged();
276   gEve->EnableRedraw();
277 }
278
279 /******************************************************************************/
280
281 void AliEveITSModuleStepper::Render(TGLRnrCtx& rnrCtx)
282 {
283   // render everyting in relative coordinates
284   glMatrixMode(GL_PROJECTION);
285   glPushMatrix();
286   glLoadIdentity();
287   if (rnrCtx.Selection())
288   {
289     // Should be
290     // glLoadMatrix(rnrCtx.GetCamera()->GetProjMBase());
291     TGLRect rect(*rnrCtx.GetPickRectangle());
292     rnrCtx.GetCamera()->WindowToViewport(rect);
293     gluPickMatrix(rect.X(), rect.Y(), rect.Width(), rect.Height(),
294                   (Int_t*) rnrCtx.GetCamera()->RefViewport().CArr());
295   }
296
297   glMatrixMode(GL_MODELVIEW);
298   glPushMatrix();
299   glLoadIdentity();
300
301   GLboolean lightp;
302   glGetBooleanv(GL_LIGHTING, &lightp);
303   if (lightp) glDisable(GL_LIGHTING);
304
305   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
306   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
307   glDisable(GL_CULL_FACE);
308   glEnable(GL_BLEND);
309   glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
310   RenderMenu();
311   RenderPalette(fPaletteLength, 1.6*fWWidth, fWHeight*0.6);
312   glPopMatrix();
313   glPopAttrib();
314
315   if (lightp) glEnable(GL_LIGHTING);
316
317   glMatrixMode(GL_PROJECTION);
318   glPopMatrix();
319
320   glMatrixMode(GL_MODELVIEW);
321   RenderCellIDs();
322 }
323
324
325 /******************************************************************************/
326 // Protected sub-renderers
327 /******************************************************************************/
328
329 //______________________________________________________________________________
330 Float_t AliEveITSModuleStepper::TextLength(const char* txt)
331 {
332   Float_t llx, lly, llz, urx, ury, urz;
333   fText->BBox(txt, llx, lly, llz, urx, ury, urz);
334   return (urx-llx)*fTextSize;
335 }
336
337 //______________________________________________________________________________
338 void AliEveITSModuleStepper::RenderString(TString string, Int_t id)
339 {
340   Float_t txtY = fWHeight*0.5;
341   Float_t txtl = TextLength(string.Data());
342
343   if(id > 0) glLoadName(id);
344   if(id>0 && fWActive == id)
345     fText->SetTextColor(fWActiveCol);
346   else
347     fText->SetTextColor(fFontCol);
348
349
350   if(id>0)
351   {
352     if(fWActive == id)
353       fText->SetTextColor(fWActiveCol);
354     else
355       fText->SetTextColor(fFontCol);
356
357     glLoadName(id);
358     Float_t ss = fWWidth*0.4;
359     fText->PaintGLText(ss, txtY, -0.8, string.Data());
360     // box
361     Float_t bw =2*ss+txtl;
362     RenderFrame(bw,fWHeight*2,id);
363     glTranslatef( bw, 0, 0);
364   }
365   else
366   {
367     fText->SetTextColor(fFontCol);
368     fText->PaintGLText(0, txtY, -0.8, string.Data());
369     glTranslatef(txtl, 0, 0);
370   }
371 }
372
373 //______________________________________________________________________________
374 void AliEveITSModuleStepper::RenderFrame(Float_t dx, Float_t dy, Int_t id)
375 {
376   if(fRnrFrame == kFALSE)return;
377
378   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
379   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
380   UChar_t color[4];
381   if (fWActive == id)
382     TEveUtil::TEveUtil::ColorFromIdx(fWActiveCol, color);
383   else
384     TEveUtil:: TEveUtil::ColorFromIdx(fWCol, color);
385   glColor4ubv(color);
386
387   glBegin(GL_QUADS);
388   glVertex2f(0, 0);   glVertex2f(dx, 0);
389   glVertex2f(dx, dy); glVertex2f(0, dy);
390   glEnd();
391   glPopAttrib();
392 }
393
394 //______________________________________________________________________________
395 void AliEveITSModuleStepper::RenderSymbol(Float_t dx, Float_t dy, Int_t id)
396 {
397   glLoadName(id);
398
399   UChar_t color[4];
400   if (fWActive == id)
401     TEveUtil::TEveUtil::ColorFromIdx(fWActiveCol, color);
402   else
403     TEveUtil::TEveUtil::ColorFromIdx(fWCol, color);
404   glColor4ubv(color);
405
406   Float_t xs = dx/4, ys = dy/4;
407   if(id == 0) {
408     glBegin(GL_QUADS);
409     glVertex2f(0,ys); glVertex2f(0, ys*3);
410     glVertex2f(dx, ys*3); glVertex2f(dx, ys);
411     glEnd();
412     return;
413   }
414
415   glBegin(GL_TRIANGLES);
416   switch (id) {
417     case 1:
418     {
419       // left
420       //      glVertex2f(xs*2.5, ys*3); glVertex2f(xs*1.5, ys*2); glVertex2f(xs*2.5, ys);
421       glVertex2f(xs*3, ys*3); glVertex2f(xs*1, ys*2); glVertex2f(xs*3, ys);
422       break;
423     }
424     case 2:
425     {
426       //double left
427       glVertex2f(xs*2, ys*3); glVertex2f(xs, ys*2);    glVertex2f(xs*2, ys);
428       glVertex2f(xs*3, ys*3); glVertex2f(xs*2, ys*2);  glVertex2f(xs*3, ys);
429       break;
430     }
431     case 3:
432     {
433       // right
434       //glVertex2f(xs*1.5, ys); glVertex2f(xs*2.5, ys*2); glVertex2f(xs*1.5, ys*3);
435       glVertex2f(xs*1, ys); glVertex2f(xs*3, ys*2); glVertex2f(xs*1, ys*3);
436       break;
437     }
438     case 4:
439     {
440       // double right
441       glVertex2f(xs, ys);     glVertex2f(xs*2, ys*2);   glVertex2f(xs, ys*3);
442       glVertex2f(xs*2, ys);   glVertex2f(xs*3, ys*2);   glVertex2f(xs*2, ys*3);
443       break;
444     }
445     case 5:
446     {
447       // up
448       glVertex2f(xs, ys*2.5);  glVertex2f(xs*2, ys*3.5); glVertex2f(xs*3, ys*2.5);
449       break;
450     }
451     case 6:
452     {
453       // down
454       glVertex2f(xs, ys*1.5);  glVertex2f(xs*2, ys*0.5); glVertex2f(xs*3, ys*1.5);
455       break;
456     }
457
458     default:
459       break;
460   }
461   glEnd();
462   glLoadName(0);
463 }
464
465 //______________________________________________________________________________
466 void AliEveITSModuleStepper::RenderPalette(Float_t dx, Float_t x, Float_t y)
467 {
468   glPushMatrix();
469   glLoadIdentity();
470   glTranslatef(1 -x- dx, -1+y*4, 0);
471   AliEveITSModule* qs = dynamic_cast<AliEveITSModule*>(*BeginChildren());
472   TEveRGBAPalette* p = qs->GetPalette();
473   glBegin(GL_QUAD_STRIP);
474   glColor4ubv(p->ColorFromValue(p->GetMinVal()));
475   glVertex2f(0, 0);
476   glVertex2f(0, y);
477   if (p->GetMaxVal() > p->GetMinVal() + 1)
478   {
479     Float_t xs = dx/(p->GetMaxVal() - p->GetMinVal());
480     Float_t x0 = xs;
481     for(Int_t i=p->GetMinVal() + 1; i<p->GetMaxVal(); i++)
482     {
483       glColor4ubv(p->ColorFromValue(i));
484       glVertex2f(x0, 0);
485       glVertex2f(x0, y);
486       x0+=xs;
487     }
488   }
489   glColor4ubv(p->ColorFromValue(p->GetMaxVal()));
490   glVertex2f(dx, 0);
491   glVertex2f(dx, y);
492   glEnd();
493
494   if (p->GetMaxVal() > p->GetMinVal())
495   {
496     glRotatef(-90,1, 0, 0 );
497     Double_t v1[3] = {0., 0., 0.};
498     Double_t v2[3] = {dx, 0, 0.};
499     fAxis->SetLabelsSize(fTextSize/dx);
500     fAxis->PaintGLAxis(v1, v2, p->GetMinVal(), p->GetMaxVal(), 206);
501   }
502   glPopMatrix();
503 }
504
505 //______________________________________________________________________________
506 void AliEveITSModuleStepper::RenderMenu()
507 {
508   Float_t ww = 2*fWWidth;
509   Float_t wh = 2*fWHeight;
510
511   // transparent bar
512   Float_t a=0.3;
513   glColor4f(a, a, a, a);
514   Float_t H = 1.9*wh*(1+ 2*fWOff);
515   if(1) {
516     glBegin(GL_QUADS);
517     glVertex3f(-1, -1,   0.1); glVertex3f(-1, -1+H, 0.1);
518     glVertex3f(1 , -1+H, 0.1); glVertex3f( 1, -1  , 0.1);
519     glEnd();
520   }
521
522   Float_t y_base = -1 + wh*0.35;
523   glTranslatef(-1, y_base, 0.);
524   glPushName(0);
525   // pager
526   glPushMatrix();
527   glTranslatef(ww, 0, 0.);
528   fText->SetTextSize(fTextSize);
529   Float_t soff = ww*1.3;
530   glTranslatef(0, fWOff*wh, 0);
531   RenderSymbol(ww, wh, 2);
532   RenderFrame(ww,wh,2);
533   glTranslatef(soff, 0, 0);
534   RenderSymbol(ww, wh, 1);
535   RenderFrame(ww,wh,1);
536   glTranslatef(soff, 0, 0);
537   // text info
538   {
539     const char* txt =  Form("%d/%d ", GetCurrentPage(), GetPages());
540     Float_t dx = (fPagerGap - TextLength(txt))*0.5;
541     fText->SetTextColor(fFontCol);
542     fText->PaintGLText(dx, wh*0.25, -0.8, txt);
543   }
544   glTranslatef(fPagerGap, 0, 0);
545
546   RenderSymbol(ww, wh, 3);
547   RenderFrame(ww,wh,3);
548   glTranslatef(soff, 0, 0);
549   RenderSymbol(ww, wh, 4);
550   RenderFrame(ww,wh,4);
551   glTranslatef(2*ww, 0, 0);
552   glPopMatrix();
553
554   // scale info
555   glPushMatrix();
556   AliEveITSDigitsInfo* di = fDigitsInfo;
557   Int_t scale = fScaleInfo->GetScale() - 1;
558   AliEveITSScaledModule* sm = dynamic_cast<AliEveITSScaledModule*>(*BeginChildren());
559   Int_t cnx = 0, cnz = 0;
560   switch(sm->GetSubDetID())
561   {
562     case 0:
563       cnx = di->fSPDScaleX[scale], cnz = di->fSPDScaleZ[scale];
564       break;
565     case 1:
566       cnx = di->fSDDScaleX[scale], cnz = di->fSDDScaleZ[scale];
567       break;
568     case 2:
569       cnx = di->fSSDScale[scale], cnz = 1;
570       break;
571   }
572   glTranslatef(10*ww,0, 0);
573   RenderString(Form("Zoom: "));
574   glPushMatrix();
575   glTranslatef(0, 0.2*wh, 0);
576   RenderSymbol(ww, wh*0.9, 5);
577   glTranslatef(0, 0.4*wh, 0);
578   RenderFrame(ww, wh*0.5, 5);
579   glPopMatrix();
580   RenderSymbol(ww, wh*0.9, 6);
581   RenderFrame(ww, wh*0.5, 6);
582   glTranslatef(ww, 0, 0);
583   RenderString(Form("%dx%d ", cnx, cnz));
584   glPopMatrix();
585
586   //choose detector
587   glPushMatrix();
588   glTranslatef(18*ww, 0, 0);
589   Float_t bs = ww*0.2;
590   RenderString("SPD", 8);
591   glTranslatef(bs, 0, 0);
592   RenderString("SDD", 9);
593   glTranslatef(bs, 0, 0);
594   RenderString("SSD", 10);
595   glPopMatrix();
596
597   glPopName();
598 }
599
600 //______________________________________________________________________________
601 void AliEveITSModuleStepper::RenderCellIDs()
602 {
603   fText->SetTextSize(fStepper->GetDy()*0.1);
604   fText->SetTextColor(fFontCol);
605   Double_t x, y, z;
606   Double_t sx, sy, sz;
607   UInt_t idx = fPosition;
608   for (List_i childit=fChildren.begin(); childit!=fChildren.end(); ++childit)
609   {
610     if(idx < fIDs.size())
611     {
612       AliEveITSScaledModule* mod = dynamic_cast<AliEveITSScaledModule*>(*childit);
613       TEveTrans& tr = mod->RefHMTrans();
614       TString name = Form("%d",mod->GetID());
615       tr.GetPos(x,y,z);
616       x += fStepper->GetDx()*0.5;
617       y -= fStepper->GetDy()*0.5;
618       z += 0.4; // !!! MT hack - cross check with overlay rendering.
619       Float_t llx, lly, llz, urx, ury, urz;
620       fText->BBox(name, llx, lly, llz, urx, ury, urz);
621       tr.GetScale(sx, sy, sz);
622       fText->PaintGLText(x-(urx-llx)*sx, y, z, name);
623       idx++;
624     }
625   }
626 }
627
628
629 /******************************************************************************/
630 // Virtual event handlers from TGLOverlayElement
631 /******************************************************************************/
632
633 //______________________________________________________________________________
634 Bool_t AliEveITSModuleStepper::Handle(TGLRnrCtx          & /*rnrCtx*/,
635                                 TGLOvlSelectRecord & rec,
636                                 Event_t            * event)
637 {
638   // Handle overlay event.
639   // Return TRUE if event was handled.
640
641   switch (event->fType)
642   {
643     case kMotionNotify:
644     {
645       Int_t item = rec.GetN() < 2 ? -1 : (Int_t)rec.GetItem(1);
646       if (fWActive != item) {
647         fWActive = item;
648         return kTRUE;
649       } else {
650         return kFALSE;
651       }
652       break;
653     }
654     case kButtonPress:
655     {
656       if (event->fCode != kButton1) {
657         return kFALSE;
658       }
659       switch (rec.GetItem(1))
660       {
661         case 1:
662           Previous();
663           break;
664         case 2:
665           Start();
666           break;
667         case 3:
668           Next();
669           break;
670         case 4:
671           End();
672           break;
673         case 5:
674         {
675           AliEveDigitScaleInfo* si = fScaleInfo;
676           if(si->GetScale() < 5)
677           {
678             si->ScaleChanged(si->GetScale() + 1);
679             ElementChanged(kTRUE, kTRUE);
680           }
681           break;
682         }
683         case 6:
684         {
685           AliEveDigitScaleInfo* si = fScaleInfo;
686           if(si->GetScale() > 1)
687           {
688             si->ScaleChanged(si->GetScale() - 1);
689             ElementChanged(kTRUE, kTRUE);
690           }
691           break;
692         }
693         case 7:
694           gEve->GetEditor()->DisplayElement(*BeginChildren());
695           break;
696
697         case 8:
698             DisplayDet(0, -1);
699           break;
700         case 9:
701             DisplayDet(1, -1);
702           break;
703         case 10:
704             DisplayDet(2, -1);
705           break;
706         default:
707           break;
708       }
709       return kTRUE;
710       break;
711     }
712     default:
713       break;
714   } // end switch
715   return kFALSE;
716 }
717
718 //______________________________________________________________________________
719 Bool_t AliEveITSModuleStepper::MouseEnter(TGLOvlSelectRecord& /*rec*/)
720 {
721   return kTRUE;
722 }
723
724 //______________________________________________________________________________
725 void AliEveITSModuleStepper::MouseLeave()
726 {
727   // Mouse has left the element.
728
729   fWActive = -1;
730 }