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 "AliEveTPCSectorData.h"
#include <AliTPCParamSR.h>

#include <set>
#include <string.h>

//==============================================================================
//==============================================================================
// AliEveTPCSectorData
//==============================================================================

//______________________________________________________________________________
//
// Stores data from a fiven TPC sector.
//
// Row addresses grow linearly by radius, there is no separation on
// inner/outer segments. The SegmentInfo objects can be used to get
// information about low-level segments.
//
// A lot of TPC-sector geometry information is stored as static data.
//
// For accessing data, see for example AliEveTPCSector2DGL::CreateTexture()
// and LoadPadrow().
//

ClassImp(AliEveTPCSectorData)

AliTPCParam* AliEveTPCSectorData::fgParam    = 0;
Float_t      AliEveTPCSectorData::fgZLength  = 0;
Int_t        AliEveTPCSectorData::fgNAllRows = 0;
Int_t        AliEveTPCSectorData::fgNAllPads = 0;
Int_t*       AliEveTPCSectorData::fgRowBegs  = 0;

AliEveTPCSectorData::SegmentInfo AliEveTPCSectorData::fgInnSeg;
AliEveTPCSectorData::SegmentInfo AliEveTPCSectorData::fgOut1Seg;
AliEveTPCSectorData::SegmentInfo AliEveTPCSectorData::fgOut2Seg;

AliEveTPCSectorData::SegmentInfo* AliEveTPCSectorData::fgSegInfoPtrs[3] = {0};

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

void AliEveTPCSectorData::InitStatics()
{
  // Initialize static variables.

  if (fgParam != 0) return;

  fgParam    = new AliTPCParamSR;
  fgZLength  = fgParam->GetZLength(0) + 0.275;
  fgNAllRows = fgParam->GetNRowLow()  + fgParam->GetNRowUp();
  fgNAllPads = 0;
  fgRowBegs  = new Int_t[fgNAllRows + 1];

  {
    Int_t row = 0;
    for (Int_t i=0; i<fgParam->GetNRowLow(); ++i, ++row)
    {
      fgRowBegs[row] = fgNAllPads;
      fgNAllPads += fgParam->GetNPadsLow(i);
    }
    for (Int_t i=0; i<fgParam->GetNRowUp(); ++i, ++row)
    {
      fgRowBegs[row] = fgNAllPads;
      fgNAllPads += fgParam->GetNPadsUp(i);
    }
    fgRowBegs[fgNAllRows] = fgNAllPads;
  }

  // Fill SegmentInfos, used by rendering classes.

  // General paramameters
  fgInnSeg.fPadWidth   = fgParam->GetInnerPadPitchWidth();
  fgInnSeg.fPadHeight  = fgParam->GetInnerPadPitchLength();
  fgInnSeg.fRLow       = fgParam->GetPadRowRadiiLow(0);
  fgInnSeg.fNRows      = fgParam->GetNRowLow();
  fgInnSeg.fFirstRow   = 0;
  fgInnSeg.fLastRow    = fgInnSeg.fNRows - 1;
  fgInnSeg.fNMaxPads   = fgParam->GetNPadsLow(fgInnSeg.fNRows - 1);
  fgSegInfoPtrs[0]     = &fgInnSeg;

  fgOut1Seg.fPadWidth  = fgParam->GetOuterPadPitchWidth();
  fgOut1Seg.fPadHeight = fgParam->GetOuter1PadPitchLength();
  fgOut1Seg.fRLow      = fgParam->GetPadRowRadiiUp(0);
  fgOut1Seg.fNRows     = fgParam->GetNRowUp1();
  fgOut1Seg.fFirstRow  = fgInnSeg.fNRows;
  fgOut1Seg.fLastRow   = fgOut1Seg.fFirstRow + fgOut1Seg.fNRows - 1;
  fgOut1Seg.fNMaxPads  = fgParam->GetNPadsUp(fgOut1Seg.fNRows - 1);
  fgSegInfoPtrs[1]     = &fgOut1Seg;

  fgOut2Seg.fPadWidth  = fgParam->GetOuterPadPitchWidth();
  fgOut2Seg.fPadHeight = fgParam->GetOuter2PadPitchLength();
  fgOut2Seg.fRLow      = fgParam->GetPadRowRadiiUp(fgOut1Seg.fNRows);
  fgOut2Seg.fNRows     = fgParam->GetNRowUp() - fgOut1Seg.fNRows;
  fgOut2Seg.fFirstRow  = fgOut1Seg.fLastRow + 1;
  fgOut2Seg.fLastRow   = fgOut2Seg.fFirstRow + fgOut2Seg.fNRows - 1;
  fgOut2Seg.fNMaxPads  = fgParam->GetNPadsUp(fgParam->GetNRowUp() - 1);
  fgSegInfoPtrs[2]     = &fgOut2Seg;

  // Set stepsize arrays

  { // Inner
    Int_t k=0, npads = fgParam->GetNPadsLow(0);
    for (Int_t row = 0; row < fgInnSeg.fNRows; ++row)
    {
      if (fgParam->GetNPadsLow(row) > npads)
      {
        npads = fgParam->GetNPadsLow(row);
        fgInnSeg.fYStep[k] = row*fgInnSeg.fPadHeight + fgInnSeg.fRLow;
        k++;
      }
    }
    fgInnSeg.fNYSteps = k;
  }

  {  // Outer 1 seg
    Int_t k=0, npads = fgParam->GetNPadsUp(0);
    for (Int_t row = 0; row < fgOut1Seg.fNRows; ++row)
    {
      if (fgParam->GetNPadsUp(row) > npads)
      {
        npads = fgParam->GetNPadsUp(row);
        fgOut1Seg.fYStep[k] = row*fgOut1Seg.fPadHeight + fgOut1Seg.fRLow ;
        k++;
      }
    }
    fgOut1Seg.fNYSteps = k;
  }

  {  // Outer 2 seg
    Int_t k=0, npads = fgParam->GetNPadsUp(fgOut1Seg.fNRows);
    for (Int_t row = fgOut1Seg.fNRows; row < fgParam->GetNRowUp(); ++row)
    {
      if (fgParam->GetNPadsUp(row) > npads)
      {
        npads = fgParam->GetNPadsUp(row);
        fgOut2Seg.fYStep[k] = (row - fgOut1Seg.fNRows)*fgOut2Seg.fPadHeight + fgOut2Seg.fRLow ;
        k++;
      }
    }
    fgOut2Seg.fNYSteps = k;
  }
}

Int_t AliEveTPCSectorData::GetNPadsInRow(Int_t row)
{
  // Return number of pads in given row.

  if (row < 0 || row >= fgNAllRows) return 0;
  return fgRowBegs[row + 1] - fgRowBegs[row];
}

const AliEveTPCSectorData::SegmentInfo& AliEveTPCSectorData::GetSeg(Int_t seg)
{
  // Return reference to segment geometry information.
  // 0 ~ inner, 1 ~ middle, 2 ~ outer.

  static const SegmentInfo null;

  if (seg < 0 || seg > 2)
    return null;
  else
    return *fgSegInfoPtrs[seg];
}

/******************************************************************************/
// True member functions start here.
/******************************************************************************/

void AliEveTPCSectorData::NewBlock()
{
  // Create new data-block. Position is set to the beginning.

  fBlocks.push_back(new Short_t[fkBlockSize]);
  fBlockPos = 0;
}

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

AliEveTPCSectorData::AliEveTPCSectorData(Int_t sector, Int_t bsize) :
  fSectorID(sector),  fNPadsFilled(0), fPads(),
  fkBlockSize(bsize), fBlockPos(0),    fBlocks(),
  fCurrentRow(0), fCurrentPad(0), fCurrentPos(0), fCurrentStep(0)
{
  // Constructor.
	
  memset(fPadBuffer,0,2048*sizeof(Short_t));

  if (fgParam == 0) InitStatics();

  fPads.assign(fgNAllPads, PadData());
  fBlocks.reserve(16);
  fBlockPos = fkBlockSize; // Enforce creation of a new block.
}


AliEveTPCSectorData::~AliEveTPCSectorData()
{
  // Destructor.

  for (std::vector<Short_t*>::iterator b=fBlocks.begin(); b!=fBlocks.end(); ++b)
    delete [] *b;
}

void AliEveTPCSectorData::DropData()
{
  // Drop data, deallocate data-blocks.

  fPads.assign(fgNAllPads, PadData());
  for (std::vector<Short_t*>::iterator b=fBlocks.begin(); b!=fBlocks.end(); ++b)
    delete [] *b;
  fBlocks.clear();
  fBlockPos = fkBlockSize; // Enforce creation of a new block.
}

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

void AliEveTPCSectorData::Print(Option_t* /*opt*/) const
{
  // Print summary information.

  printf("AliEveTPCSectorData sector=%d, NPadsFilled=%d, NBlocks=%d, BlockPos=%d\n",
	 fSectorID, fNPadsFilled, (Int_t) fBlocks.size(), fBlockPos);
}

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

void AliEveTPCSectorData::BeginPad(Int_t row, Int_t pad, Bool_t reverseTime)
{
  // Begin filling of pad-data as specified with arguments.

  fCurrentRow = row;
  fCurrentPad = pad;
  if (reverseTime) {
    fCurrentPos  = 2046;
    fCurrentStep = -2;
  } else {
    fCurrentPos  = 0;
    fCurrentStep = 2;
  }
  //printf("begpad for row=%d pad=%d\n  buf=%p pos=%d step=%d\n",
  //     fCurrentRow, fCurrentPad,
  //     fPadBuffer, fCurrentPos, fCurrentStep);
}

void AliEveTPCSectorData::EndPad(Bool_t autoPedestal, Short_t threshold)
{
  // End filling of pad-data. At this point data is compressed and moved
  // into the cuurent position in memory block.

  Short_t *beg, *end;
  if (fCurrentStep > 0) {
    beg = fPadBuffer;
    end = fPadBuffer + fCurrentPos;
  } else {
    beg = fPadBuffer + fCurrentPos + 2;
    end = fPadBuffer + 2048;
  }

  //printf("endpad for row=%d pad=%d\n  buf=%p beg=%p end=%p pos=%d step=%d\n",
  //     fCurrentRow, fCurrentPad,
  //     fPadBuffer, beg, end, fCurrentPos, fCurrentStep);
  if (beg >= end)
    return;

  if (autoPedestal) {
    Short_t array[1024];
    Short_t* val;
    val = beg + 1;
    while (val <= end) {
      array[(val-beg)/2] = *val;
      val += 2;
    }
    Short_t pedestal = TMath::Nint(TMath::Median((end-beg)/2, array));
    val = beg + 1;
    while (val <= end) {
      *val -= pedestal;
      val += 2;
    }
    Short_t* wpos = beg;
    Short_t* rpos = beg;
    while (rpos < end) {
      if (rpos[1] >= threshold) {
	wpos[0] = rpos[0];
	wpos[1] = rpos[1];
	wpos += 2;
      }
      rpos += 2;
    }
    end = wpos;
  }

  Short_t* wpos = beg;
  Short_t* rpos = beg;

  // Compress pad buffer
  while (rpos < end) {
    Short_t* spos = rpos;
    Short_t  t    = spos[0];
    while (true) {
      rpos += 2;
      if (rpos >= end || *rpos > t + 1 || t == 0)
	break;
      ++t;
    }
    Short_t n = t - spos[0] + 1;
    if (n == 1) {
      wpos[0] = -spos[0];
      wpos[1] =  spos[1];
      wpos += 2;
    } else {
      wpos[0] = spos[0];
      wpos[2] = spos[1];
      wpos[1] = n;
      wpos += 3; spos += 3;
      while (--n) {
	*wpos = *spos;
	++wpos;	spos += 2;
      }
    }
  }

  // Copy buffer to storage, set PadData
  if (wpos > beg) {
    Short_t len = wpos - beg;
    if (len > fkBlockSize - fBlockPos)
      NewBlock();
    Short_t *dest = fBlocks.back() + fBlockPos;
    memcpy(dest, beg, len*sizeof(Short_t));
    fBlockPos += len;

    PadData& pad = fPads[PadIndex(fCurrentRow, fCurrentPad)];
    pad.SetDataLength(dest, len);
  }

  ++fNPadsFilled;
}

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

const AliEveTPCSectorData::PadData& AliEveTPCSectorData::GetPadData(Int_t padAddr) const
{
  // Get pad-data reference by absolute index.

  static const PadData kNull;

  if (padAddr < 0 || padAddr >= fgNAllPads) return kNull;
  return fPads[padAddr];
}

const AliEveTPCSectorData::PadData& AliEveTPCSectorData::GetPadData(Int_t row, Int_t pad) const
{
  // Get pad-data reference by row and pad number.

  static const PadData kNull;

  Int_t np = GetNPadsInRow(row);
  if (np == 0 || pad < 0 || pad >= np) return kNull;
  return GetPadData(fgRowBegs[row] + pad);
}

AliEveTPCSectorData::PadIterator AliEveTPCSectorData::MakePadIterator(Int_t padAddr, Short_t thr)
{
  // Get pad-data iterator by absolute index.

  return PadIterator(GetPadData(padAddr), thr);
}

AliEveTPCSectorData::PadIterator AliEveTPCSectorData::MakePadIterator(Int_t row, Int_t pad, Short_t thr)
{
  // Get pad-data iterator by row and pad number.

  return PadIterator(GetPadData(row, pad), thr);
}

AliEveTPCSectorData::RowIterator AliEveTPCSectorData::MakeRowIterator(Int_t row, Short_t thr)
{
  // Get row iterator.

  Short_t npads = GetNPadsInRow(row);
  if (npads > 0)
    return RowIterator(&fPads[fgRowBegs[row]], npads, thr);
  else
    return RowIterator(0, 0);
}

/******************************************************************************/
// AliEveTPCSectorData::PadData
/******************************************************************************/

void AliEveTPCSectorData::PadData::Print(Option_t* /*opt*/)
{
  // Print summary information.

  printf("addr=%p, len=%hd>\n", (void*)fData, fLength);
  for (Int_t i=0; i<fLength; ++i)
    printf("  %3d %hd\n", i, fData[i]);
}

/******************************************************************************/
// AliEveTPCSectorData::PadIterator
/******************************************************************************/

Bool_t AliEveTPCSectorData::PadIterator::Next()
{
  // Move iterator to next signal above the iteration threshold.
  // Returns false when the end of data is reached.

  if (fPos >= fEnd) return kFALSE;
  if (fNChunk > 0) {
    ++fTime;
    --fNChunk;
    fSignal = *fPos; ++fPos;
  } else {
    fTime = fPos[0];
    if (fTime <= 0) {
      fTime   = -fTime;
      fSignal = fPos[1];
      fPos += 2;
    } else {
      fNChunk = fPos[1] - 1;
      fSignal = fPos[2];
      fPos += 3;
    }
  }
  return (fSignal > fThreshold) ? kTRUE : Next();
}

void AliEveTPCSectorData::PadIterator::Reset()
{
  // Return to the beginning of the pad-data. Must call Next() to get to
  // the first stored signal.

  fPos    = fBeg;
  fTime   = -1;
  fSignal = -1;
  fNChunk = 0;
}

void AliEveTPCSectorData::PadIterator::Reset(const PadData& pd)
{
  // Reinitialize to new pad-data. Must call Next() to get to the
  // first stored signal.

  fBeg = pd.Data();
  fEnd = pd.Data() + pd.Length();
  fPos = pd.Data();
  Reset();
}

void AliEveTPCSectorData::PadIterator::Test()
{
  while (Next())
    printf("  %3d %d\n", fTime, fSignal);
}

/******************************************************************************/
// AliEveTPCSectorData::RowIterator
/******************************************************************************/

Bool_t AliEveTPCSectorData::RowIterator::NextPad()
{
  // Move iterator to next pad.

  ++fPad;
  if(fPad >= fNPads) return kFALSE;
  Reset(fPadArray[fPad]);
  return kTRUE;
}

void AliEveTPCSectorData::RowIterator::ResetRow()
{
  // Return to the beginning of the row. Must call NextPad() to get to
  // the zeroth pad.

  fPad = -1;
}

void AliEveTPCSectorData::RowIterator::ResetRow(const PadData* first, Short_t npads)
{
  // Reinitialize to another pad-data array. Must call NextPad() to
  // get to the zeroth pad.

  fPadArray =  first;
  fNPads    =  npads;
  fPad      = -1;
}

/******************************************************************************/
// AliEveTPCSectorData::SegmentInfo
/******************************************************************************/

//______________________________________________________________________________
//
// Stores geometry data about a segment needed for fast data-access
// and rendering

ClassImp(AliEveTPCSectorData::SegmentInfo)

AliEveTPCSectorData::SegmentInfo::SegmentInfo() :
  TObject(),

  fPadWidth(0), fPadHeight(0),
  fRLow(0), fNRows(0), fFirstRow(0), fLastRow(0),
  fNMaxPads(0),
  fNYSteps(0)
{
  // Constructor.

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