ROOT logo
// $Id$
// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

#include "AliEveTPCSector2DGL.h"

#include <EveDet/AliEveTPCSector2D.h>

#include <TGLRnrCtx.h>
#include <TGLSelectRecord.h>
#include <TGLIncludes.h>

//______________________________________________________________________________
//
// GL renderer for AliEveTPCSector2D.

ClassImp(AliEveTPCSector2DGL)

// This can be optimized to non-pow-2 values once everybody has GL 1.4.

const Int_t AliEveTPCSector2DGL::fgkTextureWidth    = 256;
const Int_t AliEveTPCSector2DGL::fgkTextureHeight   = 128;
const Int_t AliEveTPCSector2DGL::fgkTextureByteSize = 4*256*128;

/******************************************************************************/

AliEveTPCSector2DGL::AliEveTPCSector2DGL() :
  TGLObject(),

  fSector     (0),
  fSectorData (0),

  fImage   (0),
  fTexture (0),
  fRTS     (0)
{
  // Constructor.
}

AliEveTPCSector2DGL::~AliEveTPCSector2DGL()
{
  // Destructor.
  // !!!! Should unregister texture via ContextIdentity!

  if (fImage)   delete [] fImage;
  if (fTexture) glDeleteTextures(1, &fTexture);
}

/******************************************************************************/

Bool_t AliEveTPCSector2DGL::SetModel(TObject* obj, const Option_t* /*opt*/)
{
  // Set model object.

  if (SetModelCheckClass(obj, AliEveTPCSector2D::Class())) {
    fSector = (AliEveTPCSector2D*) fExternalObj;
    return kTRUE;
  }
  return kFALSE;
}

void AliEveTPCSector2DGL::SetBBox()
{
  // Set bounding-box.

  SetAxisAlignedBBox(((AliEveTPCSector2D*)fExternalObj)->AssertBBox());
}

/******************************************************************************/

void AliEveTPCSector2DGL::ProcessSelection(TGLRnrCtx       & /*rnrCtx*/,
                                           TGLSelectRecord & rec)
{
  // Process selection record.
  // Determine row and pad, call PadSelected() in model object.

  if (rec.GetN() != 3) return;
  Int_t row = rec.GetItem(1);
  Int_t pad = rec.GetItem(2);
  if (row < 0 || row >= AliEveTPCSectorData::GetNAllRows())      return;
  if (pad < 0 || pad >= AliEveTPCSectorData::GetNPadsInRow(row)) return;
  fSector->PadSelected(row, pad);
}

/******************************************************************************/

void AliEveTPCSector2DGL::DirectDraw(TGLRnrCtx& rnrCtx) const
{
  // Actual GL drawing.

  // printf("AliEveTPCSector2DGL::DirectDraw \n");

  fSectorData = fSector->GetSectorData();

  if (fRTS < fSector->fRTS && fSectorData != 0) {
    CreateTexture();
    fRTS = fSector->fRTS;
  }

  glPushAttrib(GL_CURRENT_BIT | GL_COLOR_BUFFER_BIT | GL_POLYGON_BIT | GL_ENABLE_BIT);

  glDisable(GL_LIGHTING);
  glDisable(GL_CULL_FACE);

  // Display digits
  if (fSectorData != 0)
  {
    const AliEveTPCSectorData::SegmentInfo&  iSeg = AliEveTPCSectorData::GetInnSeg();
    const AliEveTPCSectorData::SegmentInfo& o1Seg = AliEveTPCSectorData::GetOut1Seg();
    const AliEveTPCSectorData::SegmentInfo& o2Seg = AliEveTPCSectorData::GetOut2Seg();

    if (rnrCtx.SecSelection())
    {

      if(fSector->fRnrInn)  DisplayNamedQuads(iSeg, 0, 0);
      if(fSector->fRnrOut1) DisplayNamedQuads(o1Seg, iSeg.GetNMaxPads(), 0);
      if(fSector->fRnrOut2) DisplayNamedQuads(o2Seg, 0, o1Seg.GetNRows());
    }
    else
    {
      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
      if (fSector->fUseTexture)
      {
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_BLEND);

	glAlphaFunc(GL_GREATER, 0.2);
	glEnable(GL_ALPHA_TEST);

	glBindTexture(GL_TEXTURE_2D, fTexture);
	glEnable(GL_TEXTURE_2D);

	if(fSector->fRnrInn)  DisplayTexture(iSeg, 0, 0);
	if(fSector->fRnrOut1) DisplayTexture(o1Seg, iSeg.GetNMaxPads(), 0);
	if(fSector->fRnrOut2) DisplayTexture(o2Seg, 0, o1Seg.GetNRows());

	glDisable(GL_TEXTURE_2D);
      }
      else
      {
	if(fSector->fRnrInn)  DisplayQuads(iSeg, 0, 0);
	if(fSector->fRnrOut1) DisplayQuads(o1Seg, iSeg.GetNMaxPads(), 0);
	if(fSector->fRnrOut2) DisplayQuads(o2Seg, 0, o1Seg.GetNRows());
      }
      glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
      DisplayFrame();
    }
  }

  glPopAttrib();
}

/******************************************************************************/
// Data import
/******************************************************************************/

void AliEveTPCSector2DGL::LoadPadrow(AliEveTPCSectorData::RowIterator& iter,
                                     Int_t row, Int_t colOff) const
{
  // Load data for one pad-row into the texture.

  Int_t    padVal;
  Int_t    time, val;

  Int_t    minTime = fSector->fMinTime;
  Int_t    maxTime = fSector->fMaxTime;
  Bool_t   halfBorderTime = ((maxTime - minTime) % 2 == 0);

  UChar_t* imgPos = GetRowCol(row, colOff);
  while (iter.NextPad()) {
    padVal = 0;

    while (iter.Next()) {
      time = iter.Time();
      val  = iter.Signal();

      if(time < minTime || time > maxTime)
	continue;

      if(fSector->fShowMax) {
        if(val > padVal) {
          padVal = val;
        }
      } else {
	if(halfBorderTime && (time == minTime || time == maxTime))
	  padVal += val/2;
	else
	  padVal += val;
      }
    }

    if (fSector->fShowMax == kFALSE && fSector->fAverage) {
      padVal = (Int_t)((Float_t)padVal / (maxTime - minTime));
    }
    padVal = TMath::Min(padVal, fSector->fMaxVal);
    if (padVal > fSector->fThreshold) {
      fSector->ColorFromArray(padVal, imgPos);
    }
    imgPos += 4;
  }
}

/******************************************************************************/

void AliEveTPCSector2DGL::CreateTexture() const
{
  // Create texture that holds pad data.

  if (fImage == 0)
  {
    fImage = new UChar_t[fgkTextureByteSize];
    glGenTextures(1, &fTexture);
  }
  memset(fImage, 0, fgkTextureByteSize);

  Int_t rowOff[3], colOff[3];
  Bool_t isOn[3];
  rowOff[0] = 0;
  rowOff[1] = rowOff[2] = -AliEveTPCSectorData::GetSeg(1).GetFirstRow();
  colOff[0] = colOff[2] = 0;
  colOff[1] = AliEveTPCSectorData::GetSeg(0).GetNMaxPads();
  isOn[0] = fSector->fRnrInn;
  isOn[1] = fSector->fRnrOut1;
  isOn[2] = fSector->fRnrOut2;

  fSector->SetupColorArray();

  // Loop over 3 main segments
  for (Int_t sId = 0; sId <= 2; ++sId)
  {
    if (isOn[sId] == kFALSE)
      continue;
    const AliEveTPCSectorData::SegmentInfo& sInfo = AliEveTPCSectorData::GetSeg(sId);
    for (Int_t row = sInfo.GetFirstRow(); row <= sInfo.GetLastRow(); ++row)
    {
      AliEveTPCSectorData::RowIterator i = fSectorData->MakeRowIterator(row);
      Int_t offset = (sInfo.GetNMaxPads() - AliEveTPCSectorData::GetNPadsInRow(row))/2;
      LoadPadrow(i, row + rowOff[sId], offset + colOff[sId]);
    }
  }

  glBindTexture  (GL_TEXTURE_2D, fTexture);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexEnvf      (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,   GL_REPLACE);
  glTexImage2D   (GL_TEXTURE_2D, 0, GL_RGBA, fgkTextureWidth, fgkTextureHeight,
                  0, GL_RGBA, GL_UNSIGNED_BYTE, fImage);

}

/******************************************************************************/
// Data display
/******************************************************************************/

void AliEveTPCSector2DGL::DisplayTexture(const AliEveTPCSectorData::SegmentInfo& seg,
                                         Int_t startCol, Int_t startRow) const
{
  // Display segment data via one textured rectangle.

  Float_t w  = seg.GetNMaxPads()*seg.GetPadWidth()/2;
  Float_t y1 = seg.GetRLow();
  Float_t y2 = y1 + seg.GetNRows()*seg.GetPadHeight();

  Float_t u1 = (Float_t) startCol / fgkTextureWidth;
  Float_t v1 = (Float_t) startRow / fgkTextureHeight;
  Float_t u2 = u1 + (Float_t) seg.GetNMaxPads() / fgkTextureWidth;
  Float_t v2 = v1 + (Float_t) seg.GetNRows()    / fgkTextureHeight;

  glBegin(GL_QUADS);
  glTexCoord2f(u1, v1);  glVertex2f(-w, y1);
  glTexCoord2f(u1, v2);  glVertex2f(-w, y2);
  glTexCoord2f(u2, v2);  glVertex2f( w, y2);
  glTexCoord2f(u2, v1);  glVertex2f( w, y1);
  glEnd();
}

/******************************************************************************/

void AliEveTPCSector2DGL::DisplayQuads(const AliEveTPCSectorData::SegmentInfo& seg,
                                       Int_t startCol, Int_t startRow) const
{
  // Display segment data by rendering one quad per pad.

  Float_t yD, yU;
  Float_t xOff, x;
  Float_t padW = seg.GetPadWidth();
  Float_t padH = seg.GetPadHeight();

  glBegin(GL_QUADS);
  for (Int_t row = 0; row < seg.GetNRows(); row++)
  {
    yD = seg.GetRLow() + row*padH;
    yU = yD + padH;
    xOff = -seg.GetNMaxPads()*padW/2;
    Int_t tpcRow = row + seg.GetFirstRow();
    Int_t deltaPad = (seg.GetNMaxPads() - AliEveTPCSectorData::GetNPadsInRow(tpcRow))/2;
    Int_t   maxPad = seg.GetNMaxPads() - deltaPad;
    UChar_t   *pix = GetRowCol(row + startRow, startCol + deltaPad);
    for (Int_t pad = deltaPad; pad < maxPad; pad++, pix+=4)
    {
      x = xOff + pad*padW;
      if (pix[3] != 0)
      {
        TGLUtil::Color4ubv(pix);
        glVertex2f(x+padW, yD);
        glVertex2f(x,      yD);
        glVertex2f(x,      yU);
        glVertex2f(x+padW, yU);
      }
    }
  }
  glEnd();
}

void AliEveTPCSector2DGL::DisplayNamedQuads(const AliEveTPCSectorData::SegmentInfo& seg,
                                            Int_t startCol, Int_t startRow) const
{
  // Display segmen data as one quad per pad.
  // Tag the rows and pads for selection.

  Float_t yD, yU;
  Float_t xOff, x;
  Float_t padW = seg.GetPadWidth();
  Float_t padH = seg.GetPadHeight();

  glPushName(0);
  for (Int_t row = 0; row < seg.GetNRows(); row++)
  {
    yD = seg.GetRLow() + row*padH;
    yU = yD + padH;
    xOff = -seg.GetNMaxPads()*padW/2;
    Int_t tpcRow = row + seg.GetFirstRow();
    glLoadName(tpcRow);
    Int_t deltaPad = (seg.GetNMaxPads() - AliEveTPCSectorData::GetNPadsInRow(tpcRow))/2;
    Int_t   maxPad = seg.GetNMaxPads() - deltaPad;
    UChar_t   *pix = GetRowCol(row + startRow, startCol + deltaPad);
    glPushName(0);
    for (Int_t pad = deltaPad; pad < maxPad; pad++, pix+=4) 
    {
      x = xOff + pad*padW;
      if (pix[3] != 0 || fSector->fPickEmpty)
      {
	glLoadName(pad - deltaPad);
	glBegin(GL_QUADS);
        glVertex2f(x+padW, yD);
        glVertex2f(x,      yD);
        glVertex2f(x,      yU);
        glVertex2f(x+padW, yU);
	glEnd();
      }
    }
    glPopName();
  }
  glPopName();
}

/******************************************************************************/
// Frame drawing
/******************************************************************************/

void AliEveTPCSector2DGL::TraceStepsUp(const AliEveTPCSectorData::SegmentInfo& s)
{
  // Trace border of segment upwards.

  Float_t x = -(s.GetNMaxPads()*1.0/2 - s.GetNYSteps())*s.GetPadWidth();
  Float_t y  = s.GetRLow();
  glVertex2f(x, y);
  for (Int_t i = 0; i < s.GetNYSteps(); ++i)
  {
    y = s.GetYStep(i);
    glVertex2f(x, y);
    x -= s.GetPadWidth();
    glVertex2f(x, y);
  }
  y =  s.GetRLow() + s.GetNRows()*s.GetPadHeight();
  glVertex2f(-s.GetNMaxPads()*s.GetPadWidth()/2, y);
}

void AliEveTPCSector2DGL::TraceStepsDown(const AliEveTPCSectorData::SegmentInfo& s)
{
  // Trace border of segment downwards.

  Float_t x = s.GetNMaxPads()*s.GetPadWidth()/2;
  Float_t y = s.GetRLow() + s.GetNRows()*s.GetPadHeight();
  glVertex2f(x, y);
  for (Int_t i = s.GetNYSteps() - 1; i >= 0; --i)
  {
    y =  s.GetYStep(i);
    glVertex2f(x, y);
    x -= s.GetPadWidth();
    glVertex2f(x, y);
  }
  y = s.GetRLow();
  glVertex2f((0.5*s.GetNMaxPads() - s.GetNYSteps())*s.GetPadWidth(), y);
}

void AliEveTPCSector2DGL::DisplayFrame() const
{
  // Display frame of the sector.
  // Each segment's frame is drawn only if its data is drawn, too.

  TGLUtil::Color(fSector->fFrameColor);

  if(fSector->fRnrInn)
  {
    glBegin(GL_POLYGON);
    TraceStepsUp  (AliEveTPCSectorData::GetInnSeg());
    TraceStepsDown(AliEveTPCSectorData::GetInnSeg());
    glEnd();
  }
  if(fSector->fRnrOut1)
  {
    glBegin(GL_POLYGON);
    TraceStepsUp  (AliEveTPCSectorData::GetOut1Seg());
    TraceStepsDown(AliEveTPCSectorData::GetOut1Seg());
    glEnd();
  }
  if(fSector->fRnrOut2)
  {
    glBegin(GL_POLYGON);
    TraceStepsUp  (AliEveTPCSectorData::GetOut2Seg());
    TraceStepsDown(AliEveTPCSectorData::GetOut2Seg());
    glEnd();
  }
}
 AliEveTPCSector2DGL.cxx:1
 AliEveTPCSector2DGL.cxx:2
 AliEveTPCSector2DGL.cxx:3
 AliEveTPCSector2DGL.cxx:4
 AliEveTPCSector2DGL.cxx:5
 AliEveTPCSector2DGL.cxx:6
 AliEveTPCSector2DGL.cxx:7
 AliEveTPCSector2DGL.cxx:8
 AliEveTPCSector2DGL.cxx:9
 AliEveTPCSector2DGL.cxx:10
 AliEveTPCSector2DGL.cxx:11
 AliEveTPCSector2DGL.cxx:12
 AliEveTPCSector2DGL.cxx:13
 AliEveTPCSector2DGL.cxx:14
 AliEveTPCSector2DGL.cxx:15
 AliEveTPCSector2DGL.cxx:16
 AliEveTPCSector2DGL.cxx:17
 AliEveTPCSector2DGL.cxx:18
 AliEveTPCSector2DGL.cxx:19
 AliEveTPCSector2DGL.cxx:20
 AliEveTPCSector2DGL.cxx:21
 AliEveTPCSector2DGL.cxx:22
 AliEveTPCSector2DGL.cxx:23
 AliEveTPCSector2DGL.cxx:24
 AliEveTPCSector2DGL.cxx:25
 AliEveTPCSector2DGL.cxx:26
 AliEveTPCSector2DGL.cxx:27
 AliEveTPCSector2DGL.cxx:28
 AliEveTPCSector2DGL.cxx:29
 AliEveTPCSector2DGL.cxx:30
 AliEveTPCSector2DGL.cxx:31
 AliEveTPCSector2DGL.cxx:32
 AliEveTPCSector2DGL.cxx:33
 AliEveTPCSector2DGL.cxx:34
 AliEveTPCSector2DGL.cxx:35
 AliEveTPCSector2DGL.cxx:36
 AliEveTPCSector2DGL.cxx:37
 AliEveTPCSector2DGL.cxx:38
 AliEveTPCSector2DGL.cxx:39
 AliEveTPCSector2DGL.cxx:40
 AliEveTPCSector2DGL.cxx:41
 AliEveTPCSector2DGL.cxx:42
 AliEveTPCSector2DGL.cxx:43
 AliEveTPCSector2DGL.cxx:44
 AliEveTPCSector2DGL.cxx:45
 AliEveTPCSector2DGL.cxx:46
 AliEveTPCSector2DGL.cxx:47
 AliEveTPCSector2DGL.cxx:48
 AliEveTPCSector2DGL.cxx:49
 AliEveTPCSector2DGL.cxx:50
 AliEveTPCSector2DGL.cxx:51
 AliEveTPCSector2DGL.cxx:52
 AliEveTPCSector2DGL.cxx:53
 AliEveTPCSector2DGL.cxx:54
 AliEveTPCSector2DGL.cxx:55
 AliEveTPCSector2DGL.cxx:56
 AliEveTPCSector2DGL.cxx:57
 AliEveTPCSector2DGL.cxx:58
 AliEveTPCSector2DGL.cxx:59
 AliEveTPCSector2DGL.cxx:60
 AliEveTPCSector2DGL.cxx:61
 AliEveTPCSector2DGL.cxx:62
 AliEveTPCSector2DGL.cxx:63
 AliEveTPCSector2DGL.cxx:64
 AliEveTPCSector2DGL.cxx:65
 AliEveTPCSector2DGL.cxx:66
 AliEveTPCSector2DGL.cxx:67
 AliEveTPCSector2DGL.cxx:68
 AliEveTPCSector2DGL.cxx:69
 AliEveTPCSector2DGL.cxx:70
 AliEveTPCSector2DGL.cxx:71
 AliEveTPCSector2DGL.cxx:72
 AliEveTPCSector2DGL.cxx:73
 AliEveTPCSector2DGL.cxx:74
 AliEveTPCSector2DGL.cxx:75
 AliEveTPCSector2DGL.cxx:76
 AliEveTPCSector2DGL.cxx:77
 AliEveTPCSector2DGL.cxx:78
 AliEveTPCSector2DGL.cxx:79
 AliEveTPCSector2DGL.cxx:80
 AliEveTPCSector2DGL.cxx:81
 AliEveTPCSector2DGL.cxx:82
 AliEveTPCSector2DGL.cxx:83
 AliEveTPCSector2DGL.cxx:84
 AliEveTPCSector2DGL.cxx:85
 AliEveTPCSector2DGL.cxx:86
 AliEveTPCSector2DGL.cxx:87
 AliEveTPCSector2DGL.cxx:88
 AliEveTPCSector2DGL.cxx:89
 AliEveTPCSector2DGL.cxx:90
 AliEveTPCSector2DGL.cxx:91
 AliEveTPCSector2DGL.cxx:92
 AliEveTPCSector2DGL.cxx:93
 AliEveTPCSector2DGL.cxx:94
 AliEveTPCSector2DGL.cxx:95
 AliEveTPCSector2DGL.cxx:96
 AliEveTPCSector2DGL.cxx:97
 AliEveTPCSector2DGL.cxx:98
 AliEveTPCSector2DGL.cxx:99
 AliEveTPCSector2DGL.cxx:100
 AliEveTPCSector2DGL.cxx:101
 AliEveTPCSector2DGL.cxx:102
 AliEveTPCSector2DGL.cxx:103
 AliEveTPCSector2DGL.cxx:104
 AliEveTPCSector2DGL.cxx:105
 AliEveTPCSector2DGL.cxx:106
 AliEveTPCSector2DGL.cxx:107
 AliEveTPCSector2DGL.cxx:108
 AliEveTPCSector2DGL.cxx:109
 AliEveTPCSector2DGL.cxx:110
 AliEveTPCSector2DGL.cxx:111
 AliEveTPCSector2DGL.cxx:112
 AliEveTPCSector2DGL.cxx:113
 AliEveTPCSector2DGL.cxx:114
 AliEveTPCSector2DGL.cxx:115
 AliEveTPCSector2DGL.cxx:116
 AliEveTPCSector2DGL.cxx:117
 AliEveTPCSector2DGL.cxx:118
 AliEveTPCSector2DGL.cxx:119
 AliEveTPCSector2DGL.cxx:120
 AliEveTPCSector2DGL.cxx:121
 AliEveTPCSector2DGL.cxx:122
 AliEveTPCSector2DGL.cxx:123
 AliEveTPCSector2DGL.cxx:124
 AliEveTPCSector2DGL.cxx:125
 AliEveTPCSector2DGL.cxx:126
 AliEveTPCSector2DGL.cxx:127
 AliEveTPCSector2DGL.cxx:128
 AliEveTPCSector2DGL.cxx:129
 AliEveTPCSector2DGL.cxx:130
 AliEveTPCSector2DGL.cxx:131
 AliEveTPCSector2DGL.cxx:132
 AliEveTPCSector2DGL.cxx:133
 AliEveTPCSector2DGL.cxx:134
 AliEveTPCSector2DGL.cxx:135
 AliEveTPCSector2DGL.cxx:136
 AliEveTPCSector2DGL.cxx:137
 AliEveTPCSector2DGL.cxx:138
 AliEveTPCSector2DGL.cxx:139
 AliEveTPCSector2DGL.cxx:140
 AliEveTPCSector2DGL.cxx:141
 AliEveTPCSector2DGL.cxx:142
 AliEveTPCSector2DGL.cxx:143
 AliEveTPCSector2DGL.cxx:144
 AliEveTPCSector2DGL.cxx:145
 AliEveTPCSector2DGL.cxx:146
 AliEveTPCSector2DGL.cxx:147
 AliEveTPCSector2DGL.cxx:148
 AliEveTPCSector2DGL.cxx:149
 AliEveTPCSector2DGL.cxx:150
 AliEveTPCSector2DGL.cxx:151
 AliEveTPCSector2DGL.cxx:152
 AliEveTPCSector2DGL.cxx:153
 AliEveTPCSector2DGL.cxx:154
 AliEveTPCSector2DGL.cxx:155
 AliEveTPCSector2DGL.cxx:156
 AliEveTPCSector2DGL.cxx:157
 AliEveTPCSector2DGL.cxx:158
 AliEveTPCSector2DGL.cxx:159
 AliEveTPCSector2DGL.cxx:160
 AliEveTPCSector2DGL.cxx:161
 AliEveTPCSector2DGL.cxx:162
 AliEveTPCSector2DGL.cxx:163
 AliEveTPCSector2DGL.cxx:164
 AliEveTPCSector2DGL.cxx:165
 AliEveTPCSector2DGL.cxx:166
 AliEveTPCSector2DGL.cxx:167
 AliEveTPCSector2DGL.cxx:168
 AliEveTPCSector2DGL.cxx:169
 AliEveTPCSector2DGL.cxx:170
 AliEveTPCSector2DGL.cxx:171
 AliEveTPCSector2DGL.cxx:172
 AliEveTPCSector2DGL.cxx:173
 AliEveTPCSector2DGL.cxx:174
 AliEveTPCSector2DGL.cxx:175
 AliEveTPCSector2DGL.cxx:176
 AliEveTPCSector2DGL.cxx:177
 AliEveTPCSector2DGL.cxx:178
 AliEveTPCSector2DGL.cxx:179
 AliEveTPCSector2DGL.cxx:180
 AliEveTPCSector2DGL.cxx:181
 AliEveTPCSector2DGL.cxx:182
 AliEveTPCSector2DGL.cxx:183
 AliEveTPCSector2DGL.cxx:184
 AliEveTPCSector2DGL.cxx:185
 AliEveTPCSector2DGL.cxx:186
 AliEveTPCSector2DGL.cxx:187
 AliEveTPCSector2DGL.cxx:188
 AliEveTPCSector2DGL.cxx:189
 AliEveTPCSector2DGL.cxx:190
 AliEveTPCSector2DGL.cxx:191
 AliEveTPCSector2DGL.cxx:192
 AliEveTPCSector2DGL.cxx:193
 AliEveTPCSector2DGL.cxx:194
 AliEveTPCSector2DGL.cxx:195
 AliEveTPCSector2DGL.cxx:196
 AliEveTPCSector2DGL.cxx:197
 AliEveTPCSector2DGL.cxx:198
 AliEveTPCSector2DGL.cxx:199
 AliEveTPCSector2DGL.cxx:200
 AliEveTPCSector2DGL.cxx:201
 AliEveTPCSector2DGL.cxx:202
 AliEveTPCSector2DGL.cxx:203
 AliEveTPCSector2DGL.cxx:204
 AliEveTPCSector2DGL.cxx:205
 AliEveTPCSector2DGL.cxx:206
 AliEveTPCSector2DGL.cxx:207
 AliEveTPCSector2DGL.cxx:208
 AliEveTPCSector2DGL.cxx:209
 AliEveTPCSector2DGL.cxx:210
 AliEveTPCSector2DGL.cxx:211
 AliEveTPCSector2DGL.cxx:212
 AliEveTPCSector2DGL.cxx:213
 AliEveTPCSector2DGL.cxx:214
 AliEveTPCSector2DGL.cxx:215
 AliEveTPCSector2DGL.cxx:216
 AliEveTPCSector2DGL.cxx:217
 AliEveTPCSector2DGL.cxx:218
 AliEveTPCSector2DGL.cxx:219
 AliEveTPCSector2DGL.cxx:220
 AliEveTPCSector2DGL.cxx:221
 AliEveTPCSector2DGL.cxx:222
 AliEveTPCSector2DGL.cxx:223
 AliEveTPCSector2DGL.cxx:224
 AliEveTPCSector2DGL.cxx:225
 AliEveTPCSector2DGL.cxx:226
 AliEveTPCSector2DGL.cxx:227
 AliEveTPCSector2DGL.cxx:228
 AliEveTPCSector2DGL.cxx:229
 AliEveTPCSector2DGL.cxx:230
 AliEveTPCSector2DGL.cxx:231
 AliEveTPCSector2DGL.cxx:232
 AliEveTPCSector2DGL.cxx:233
 AliEveTPCSector2DGL.cxx:234
 AliEveTPCSector2DGL.cxx:235
 AliEveTPCSector2DGL.cxx:236
 AliEveTPCSector2DGL.cxx:237
 AliEveTPCSector2DGL.cxx:238
 AliEveTPCSector2DGL.cxx:239
 AliEveTPCSector2DGL.cxx:240
 AliEveTPCSector2DGL.cxx:241
 AliEveTPCSector2DGL.cxx:242
 AliEveTPCSector2DGL.cxx:243
 AliEveTPCSector2DGL.cxx:244
 AliEveTPCSector2DGL.cxx:245
 AliEveTPCSector2DGL.cxx:246
 AliEveTPCSector2DGL.cxx:247
 AliEveTPCSector2DGL.cxx:248
 AliEveTPCSector2DGL.cxx:249
 AliEveTPCSector2DGL.cxx:250
 AliEveTPCSector2DGL.cxx:251
 AliEveTPCSector2DGL.cxx:252
 AliEveTPCSector2DGL.cxx:253
 AliEveTPCSector2DGL.cxx:254
 AliEveTPCSector2DGL.cxx:255
 AliEveTPCSector2DGL.cxx:256
 AliEveTPCSector2DGL.cxx:257
 AliEveTPCSector2DGL.cxx:258
 AliEveTPCSector2DGL.cxx:259
 AliEveTPCSector2DGL.cxx:260
 AliEveTPCSector2DGL.cxx:261
 AliEveTPCSector2DGL.cxx:262
 AliEveTPCSector2DGL.cxx:263
 AliEveTPCSector2DGL.cxx:264
 AliEveTPCSector2DGL.cxx:265
 AliEveTPCSector2DGL.cxx:266
 AliEveTPCSector2DGL.cxx:267
 AliEveTPCSector2DGL.cxx:268
 AliEveTPCSector2DGL.cxx:269
 AliEveTPCSector2DGL.cxx:270
 AliEveTPCSector2DGL.cxx:271
 AliEveTPCSector2DGL.cxx:272
 AliEveTPCSector2DGL.cxx:273
 AliEveTPCSector2DGL.cxx:274
 AliEveTPCSector2DGL.cxx:275
 AliEveTPCSector2DGL.cxx:276
 AliEveTPCSector2DGL.cxx:277
 AliEveTPCSector2DGL.cxx:278
 AliEveTPCSector2DGL.cxx:279
 AliEveTPCSector2DGL.cxx:280
 AliEveTPCSector2DGL.cxx:281
 AliEveTPCSector2DGL.cxx:282
 AliEveTPCSector2DGL.cxx:283
 AliEveTPCSector2DGL.cxx:284
 AliEveTPCSector2DGL.cxx:285
 AliEveTPCSector2DGL.cxx:286
 AliEveTPCSector2DGL.cxx:287
 AliEveTPCSector2DGL.cxx:288
 AliEveTPCSector2DGL.cxx:289
 AliEveTPCSector2DGL.cxx:290
 AliEveTPCSector2DGL.cxx:291
 AliEveTPCSector2DGL.cxx:292
 AliEveTPCSector2DGL.cxx:293
 AliEveTPCSector2DGL.cxx:294
 AliEveTPCSector2DGL.cxx:295
 AliEveTPCSector2DGL.cxx:296
 AliEveTPCSector2DGL.cxx:297
 AliEveTPCSector2DGL.cxx:298
 AliEveTPCSector2DGL.cxx:299
 AliEveTPCSector2DGL.cxx:300
 AliEveTPCSector2DGL.cxx:301
 AliEveTPCSector2DGL.cxx:302
 AliEveTPCSector2DGL.cxx:303
 AliEveTPCSector2DGL.cxx:304
 AliEveTPCSector2DGL.cxx:305
 AliEveTPCSector2DGL.cxx:306
 AliEveTPCSector2DGL.cxx:307
 AliEveTPCSector2DGL.cxx:308
 AliEveTPCSector2DGL.cxx:309
 AliEveTPCSector2DGL.cxx:310
 AliEveTPCSector2DGL.cxx:311
 AliEveTPCSector2DGL.cxx:312
 AliEveTPCSector2DGL.cxx:313
 AliEveTPCSector2DGL.cxx:314
 AliEveTPCSector2DGL.cxx:315
 AliEveTPCSector2DGL.cxx:316
 AliEveTPCSector2DGL.cxx:317
 AliEveTPCSector2DGL.cxx:318
 AliEveTPCSector2DGL.cxx:319
 AliEveTPCSector2DGL.cxx:320
 AliEveTPCSector2DGL.cxx:321
 AliEveTPCSector2DGL.cxx:322
 AliEveTPCSector2DGL.cxx:323
 AliEveTPCSector2DGL.cxx:324
 AliEveTPCSector2DGL.cxx:325
 AliEveTPCSector2DGL.cxx:326
 AliEveTPCSector2DGL.cxx:327
 AliEveTPCSector2DGL.cxx:328
 AliEveTPCSector2DGL.cxx:329
 AliEveTPCSector2DGL.cxx:330
 AliEveTPCSector2DGL.cxx:331
 AliEveTPCSector2DGL.cxx:332
 AliEveTPCSector2DGL.cxx:333
 AliEveTPCSector2DGL.cxx:334
 AliEveTPCSector2DGL.cxx:335
 AliEveTPCSector2DGL.cxx:336
 AliEveTPCSector2DGL.cxx:337
 AliEveTPCSector2DGL.cxx:338
 AliEveTPCSector2DGL.cxx:339
 AliEveTPCSector2DGL.cxx:340
 AliEveTPCSector2DGL.cxx:341
 AliEveTPCSector2DGL.cxx:342
 AliEveTPCSector2DGL.cxx:343
 AliEveTPCSector2DGL.cxx:344
 AliEveTPCSector2DGL.cxx:345
 AliEveTPCSector2DGL.cxx:346
 AliEveTPCSector2DGL.cxx:347
 AliEveTPCSector2DGL.cxx:348
 AliEveTPCSector2DGL.cxx:349
 AliEveTPCSector2DGL.cxx:350
 AliEveTPCSector2DGL.cxx:351
 AliEveTPCSector2DGL.cxx:352
 AliEveTPCSector2DGL.cxx:353
 AliEveTPCSector2DGL.cxx:354
 AliEveTPCSector2DGL.cxx:355
 AliEveTPCSector2DGL.cxx:356
 AliEveTPCSector2DGL.cxx:357
 AliEveTPCSector2DGL.cxx:358
 AliEveTPCSector2DGL.cxx:359
 AliEveTPCSector2DGL.cxx:360
 AliEveTPCSector2DGL.cxx:361
 AliEveTPCSector2DGL.cxx:362
 AliEveTPCSector2DGL.cxx:363
 AliEveTPCSector2DGL.cxx:364
 AliEveTPCSector2DGL.cxx:365
 AliEveTPCSector2DGL.cxx:366
 AliEveTPCSector2DGL.cxx:367
 AliEveTPCSector2DGL.cxx:368
 AliEveTPCSector2DGL.cxx:369
 AliEveTPCSector2DGL.cxx:370
 AliEveTPCSector2DGL.cxx:371
 AliEveTPCSector2DGL.cxx:372
 AliEveTPCSector2DGL.cxx:373
 AliEveTPCSector2DGL.cxx:374
 AliEveTPCSector2DGL.cxx:375
 AliEveTPCSector2DGL.cxx:376
 AliEveTPCSector2DGL.cxx:377
 AliEveTPCSector2DGL.cxx:378
 AliEveTPCSector2DGL.cxx:379
 AliEveTPCSector2DGL.cxx:380
 AliEveTPCSector2DGL.cxx:381
 AliEveTPCSector2DGL.cxx:382
 AliEveTPCSector2DGL.cxx:383
 AliEveTPCSector2DGL.cxx:384
 AliEveTPCSector2DGL.cxx:385
 AliEveTPCSector2DGL.cxx:386
 AliEveTPCSector2DGL.cxx:387
 AliEveTPCSector2DGL.cxx:388
 AliEveTPCSector2DGL.cxx:389
 AliEveTPCSector2DGL.cxx:390
 AliEveTPCSector2DGL.cxx:391
 AliEveTPCSector2DGL.cxx:392
 AliEveTPCSector2DGL.cxx:393
 AliEveTPCSector2DGL.cxx:394
 AliEveTPCSector2DGL.cxx:395
 AliEveTPCSector2DGL.cxx:396
 AliEveTPCSector2DGL.cxx:397
 AliEveTPCSector2DGL.cxx:398
 AliEveTPCSector2DGL.cxx:399
 AliEveTPCSector2DGL.cxx:400
 AliEveTPCSector2DGL.cxx:401
 AliEveTPCSector2DGL.cxx:402
 AliEveTPCSector2DGL.cxx:403
 AliEveTPCSector2DGL.cxx:404
 AliEveTPCSector2DGL.cxx:405
 AliEveTPCSector2DGL.cxx:406
 AliEveTPCSector2DGL.cxx:407
 AliEveTPCSector2DGL.cxx:408
 AliEveTPCSector2DGL.cxx:409
 AliEveTPCSector2DGL.cxx:410
 AliEveTPCSector2DGL.cxx:411
 AliEveTPCSector2DGL.cxx:412
 AliEveTPCSector2DGL.cxx:413
 AliEveTPCSector2DGL.cxx:414
 AliEveTPCSector2DGL.cxx:415
 AliEveTPCSector2DGL.cxx:416
 AliEveTPCSector2DGL.cxx:417
 AliEveTPCSector2DGL.cxx:418
 AliEveTPCSector2DGL.cxx:419
 AliEveTPCSector2DGL.cxx:420
 AliEveTPCSector2DGL.cxx:421
 AliEveTPCSector2DGL.cxx:422
 AliEveTPCSector2DGL.cxx:423
 AliEveTPCSector2DGL.cxx:424
 AliEveTPCSector2DGL.cxx:425
 AliEveTPCSector2DGL.cxx:426
 AliEveTPCSector2DGL.cxx:427
 AliEveTPCSector2DGL.cxx:428
 AliEveTPCSector2DGL.cxx:429
 AliEveTPCSector2DGL.cxx:430
 AliEveTPCSector2DGL.cxx:431
 AliEveTPCSector2DGL.cxx:432