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 "TROOT.h"
#include "TStyle.h"
#include "TVector.h"
#include "TLinearFitter.h"
#include "TCanvas.h"
#include "TGeoMatrix.h"
#include "TGeoManager.h"

#include "TEveTrans.h"
#include "TEveManager.h"

#include "EveBase/AliEveEventManager.h"

#include "AliEveTRDData.h"
#include "AliEveTRDModuleImp.h"
#include "AliEveTRDLoader.h"
#include "AliEveTRDLoaderImp.h"

#include "AliGeomManager.h"
#include "AliESDtrack.h"
#include "AliLog.h"
#include "AliPID.h"
#include "AliTrackPointArray.h"
#include "AliRieman.h"

#include "AliTRDhit.h"
#include "AliTRDcluster.h"
#include "AliTRDseedV1.h"
#include "AliTRDtrackletMCM.h"
#include "AliTRDtrackletWord.h"
#include "AliTRDmcmSim.h"
#include "AliTRDtrackV1.h"
#include "AliTRDtrackerV1.h"
#include "AliTRDpadPlane.h"
#include "AliTRDdigitsManager.h"
#include "AliTRDmcmSim.h"
#include "AliTRDarrayADC.h"
#include "AliTRDSignalIndex.h"
#include "AliTRDgeometry.h"
#include "AliTRDtransform.h"
#include "AliTRDReconstructor.h"
#include "AliTRDrecoParam.h"

ClassImp(AliEveTRDHits)
ClassImp(AliEveTRDDigits)
ClassImp(AliEveTRDClusters)
ClassImp(AliEveTRDTracklet)
ClassImp(AliEveTRDTrack)
ClassImp(AliEveTRDTrackletOnline)
ClassImp(AliEveTRDmcm)

///////////////////////////////////////////////////////////
/////////////   AliEveTRDDigits       /////////////////////
///////////////////////////////////////////////////////////

//______________________________________________________________________________
AliEveTRDDigits::AliEveTRDDigits(AliEveTRDChamber *p) 
  :TEveQuadSet("digits", "")
  ,fParent(p)
{
  // Constructor.
  SetOwnIds(kTRUE);
  gStyle->SetPalette(1, 0);
  SetPalette(new TEveRGBAPalette(0, 512));
  Reset(TEveQuadSet::kQT_RectangleYZ, kFALSE, 32);
}

//______________________________________________________________________________
AliEveTRDDigits::~AliEveTRDDigits()
{
//  AliInfo(GetTitle());
}

//______________________________________________________________________________
void AliEveTRDDigits::SetData(AliTRDdigitsManager *digits)
{
  // Set data source.

  Int_t det(fParent->GetID());
  AliTRDarrayADC *data = digits->GetDigits(det);
  if(!data->GetDim()) return;
  data->Expand();

  AliTRDSignalIndex *indexes = digits->GetIndexes(det);
  if(!indexes->IsAllocated()) digits->BuildIndexes(det);

  Double_t scale, dy, dz;
  Int_t ly    = AliTRDgeometry::GetLayer(det),
        stk   = AliTRDgeometry::GetStack(det),
        sec   = AliTRDgeometry::GetSector(det),
        vid   = AliGeomManager::LayerToVolUID(AliGeomManager::kTRD1 + ly, stk + AliTRDgeometry::Nstack() * sec);
  SetNameTitle(Form("digits%03d", det), Form("D-%03d [%02d_%d_%d]", det, sec, stk, ly));
  Short_t sig[7]={0,0,0,10,0,0,0};

  AliTRDtransform transform(det);
  AliTRDpadPlane *pp(fParent->fGeo->GetPadPlane(ly, stk));

  Int_t row, col;
  AliTRDcluster c;
  indexes->ResetCounters();
  while (indexes->NextRCIndex(row, col)){
    dz = pp->GetRowSize(row);
    dy = pp->GetColSize(col);
    Short_t *const adc = data->GetDataAddress(row,col);
    for (Int_t time(0); time<30; time++){     
      if(data->IsPadCorrupted(row, col, time)) break;
      if(adc[time] <= 1) continue;
      new (&c) AliTRDcluster(det, col, row, time, sig, vid);
      transform.Transform(&c);

      scale = adc[time] < 512 ? adc[time]/512. : 1.;
      AddQuad(c.GetY()-0.5*dy, c.GetZ()-0.5*dz*scale, c.GetX(), dy*0.95, dz*scale);
      QuadValue(Int_t(adc[time]));
      QuadId(new TNamed(Form("ADC %d", adc[time]), Form("det[%3d(%02d_%d_%d)] col[%3d] row[%2d] tb[%2d]", det, sec, stk, ly, col, row, time)));
    } 
  }

  // rotate to global coordinates
  RefitPlex();
  TEveTrans& t = RefMainTrans();
  t.SetRotByAngles((sec+.5)*AliTRDgeometry::GetAlpha(), 0.,0.);
}


// //______________________________________________________________________________
// void AliEveTRDDigits::Paint(Option_t *option)
// {
//   // Paint the object.
// 
//   if(fParent->GetDigitsBox()) fBoxes.Paint(option);
//   else TEveQuadSet::Paint(option);
// }

// //______________________________________________________________________________
// void AliEveTRDDigits::Reset()
// {
//   // Reset raw and visual data.
// 
//   TEveQuadSet::Reset(TEveQuadSet::kQT_RectangleYZ, kTRUE, 64);
//   // MT fBoxes.fBoxes.clear();
//   fData.Reset();
// }

///////////////////////////////////////////////////////////
/////////////   AliEveTRDHits         /////////////////////
///////////////////////////////////////////////////////////

//______________________________________________________________________________
AliEveTRDHits::AliEveTRDHits() : TEvePointSet("hits", 20)
{
  // Constructor.
  SetMarkerSize(.1);
  SetMarkerColor(kGreen);
  SetOwnIds(kTRUE);
}

//______________________________________________________________________________
AliEveTRDHits::~AliEveTRDHits()
{
  //AliInfo(GetTitle());
}

//______________________________________________________________________________
void AliEveTRDHits::PointSelected(Int_t n)
{
  // Handle an individual point selection from GL.

  AliTRDhit *h = NULL;
  if(!(h = dynamic_cast<AliTRDhit*>(GetPointId(n)))) return;
  printf("Id[%3d] Det[%3d] Reg[%c] TR[%c] Q[%3d] MC[%d] t[%f]\n", 
    n, h->GetDetector(), 
    h->FromAmplification() ? 'A' : 'D', 
    h->FromTRphoton() ? 'y' : 'n', 
    h->GetCharge(), h->GetTrack(), h->GetTime());
}


///////////////////////////////////////////////////////////
/////////////   AliEveTRDClusters         /////////////////////
///////////////////////////////////////////////////////////

//______________________________________________________________________________
AliEveTRDClusters::AliEveTRDClusters():AliEveTRDHits()
{
  // Constructor.
  SetName("clusters");

  SetMarkerSize(.4);
  SetMarkerStyle(24);
  SetMarkerColor(kGray);
  SetOwnIds(kTRUE);
}

//______________________________________________________________________________
void AliEveTRDClusters::PointSelected(Int_t n)
{
  // Handle an individual point selection from GL.

  AliTRDcluster *c = dynamic_cast<AliTRDcluster*>(GetPointId(n));
  if(!c) return;
  c->Print();
  Emit("PointSelected(Int_t)", n);
  // Bool_t	AliCluster::GetGlobalCov(Float_t* cov) const
  // Bool_t	AliCluster::GetGlobalXYZ(Float_t* xyz) const
  // Float_t	AliCluster::GetSigmaY2() const
  // Float_t	AliCluster::GetSigmaYZ() const
  // Float_t	AliCluster::GetSigmaZ2() const
}

//______________________________________________________________________________
void AliEveTRDClusters::Print(Option_t *o) const
{
  AliTRDcluster *c = NULL;

  for(Int_t n = GetN(); n--;){
    if(!(c = dynamic_cast<AliTRDcluster*>(GetPointId(n)))) continue;
    c->Print(o);
  }
}

//______________________________________________________________________________
void AliEveTRDClusters::Load(const Char_t *w) const
{
  Int_t typ = -1;
  if(strcmp(w, "hit")==0) typ = 0;
  else if(strcmp(w, "dig")==0) typ = 1;
  else if(strcmp(w, "cls")==0) typ = 2;
  else if(strcmp(w, "tlt")==0) typ = 3;
  else if(strcmp(w, "all")==0) typ = 4;
  else{
    AliInfo("The following arguments are accepted:");
    AliInfo("   \"hit\" : loading of MC hits");
    AliInfo("   \"dig\" : loading of digits");
    AliInfo("   \"cls\" : loading of reconstructed clusters");
    AliInfo("   \"tlt\" : loading of online tracklets");
    AliInfo("   \"all\" : loading everything available");
    return;
  }

  AliTRDcluster *c = NULL;
  Int_t n = 0;
  while((n = GetN() && !(c = dynamic_cast<AliTRDcluster*>(GetPointId(n))))) n++;
  if(!c) return;

  Int_t det = c->GetDetector();
  AliEveTRDLoader *loader(NULL);
  switch(typ){
  case 0:
    loader = new AliEveTRDLoader("Hits");
    if(!loader->Open("TRD.Hits.root")){
      delete loader;
      return;
    }
    break;
  case 1:
    loader = new AliEveTRDLoader("Digits");
    if(!loader->Open("TRD.Digits.root")){
      delete loader;
      return;
    }
    break;
  case 2:
    loader = new AliEveTRDLoader("Clusters");
    if(!loader->Open("TRD.RecPoints.root")){
      delete loader;
      return;
    }
    break;
  case 3:
    loader = new AliEveTRDLoader("Tracklets");
    if(!loader->Open("TRD.Tracklets.root")){
      delete loader;
      return;
    }
    break;
  case 4:
    loader = new AliEveTRDLoaderSim("MC"); // Assume MC data. Try to load via run loader
    if(!loader->Open("galice.root")){
      delete loader; loader=NULL;
      // Assume measured data. Try to load data types individualy
      Int_t failed(0);
      loader = new AliEveTRDLoader("Data");
      if(!loader->Open("TRD.Digits.root")) failed++;
      if(!loader->Open("TRD.RecPoints.root")) failed++;
      if(!loader->Open("TRD.Tracklets.root")) failed++;
      if(failed==3){delete loader;loader=NULL;}
    }else loader->SetDataType(AliEveTRDLoader::kTRDHits | AliEveTRDLoader::kTRDDigits | AliEveTRDLoader::kTRDClusters);
    break;
  default: return;
  }
  if(!loader) return;

  loader->AddChambers(AliTRDgeometry::GetSector(det),AliTRDgeometry::GetStack(det), AliTRDgeometry::GetLayer(det));
  // load first event
  if(!loader->GoToEvent(AliEveEventManager::GetCurrent()->GetEventId())) AliWarning(Form("No data loaded for event %d", AliEveEventManager::GetCurrent()->GetEventId()));
  // register loader with alieve
  gEve->AddElement(loader->GetChamber(det), *(BeginParents()));
  //loader->SpawnEditor();
  gEve->Redraw3D();
}

///////////////////////////////////////////////////////////
/////////////   AliEveTRDTracklet         /////////////////////
///////////////////////////////////////////////////////////

//______________________________________________________________________________
AliEveTRDTracklet::AliEveTRDTracklet(AliTRDseedV1 *trklt):TEveLine()
  ,fClusters(NULL)
{
  // Constructor.
  SetName("tracklet");
  
  if(!gGeoManager) AliEveEventManager::AssertGeometry();
  SetUserData(trklt);
  // init tracklet line
  Int_t sec = AliTRDgeometry::GetSector(trklt->GetDetector());
  Float_t alpha((0.5+sec)*AliTRDgeometry::GetAlpha()),
          cphi(TMath::Cos(alpha)),
          sphi(TMath::Sin(alpha));
  Float_t dx;
  Float_t x0   = trklt->GetX0();
  Float_t y0   = trklt->GetYref(0);
  Float_t z0   = trklt->GetZref(0);
  Float_t dydx = trklt->GetYref(1);
  Float_t dzdx = trklt->GetZref(1);
  Float_t  tilt = trklt->GetTilt();
  Float_t g[3];
  AliTRDcluster *c = NULL;
  for(Int_t ic=0; ic<AliTRDseedV1::kNclusters; ic++){
    if(!(c = trklt->GetClusters(ic))) continue;
    if(!fClusters) AddElement(fClusters = new AliEveTRDClusters());
    dx = x0 - c->GetX();
    //Float_t yt = y0 - dx*dydx;
    Float_t zt = z0 - dx*dzdx;
    // backup yc - for testing purposes
    Float_t yc = c->GetY(); 
    c->SetY(yc-tilt*(c->GetZ()-zt));
    
    // Ben: Temporary(?) fix -> Issue with wrongly set flag "fIsMisaligned" of AliCluster
    // Changes can be undone ofter the issue with the flag has been solved
    //c->GetGlobalXYZ(g);
    
    // The following code for the trasformation local-to-global is just adapted from
    // AliTRDgeometry::RotateBack(...)
  
    // tracking to global coordinates transformation
    Float_t loc[3] = { c->GetX(), c->GetY(), c->GetZ() }; 
    g[0] = loc[0] * cphi - loc[1] * sphi;
    g[1] = loc[0] * sphi + loc[1] * cphi;
    g[2] = loc[2];
    // Ben: End of fix
    Int_t id = fClusters->SetNextPoint(g[0], g[1], g[2]);
    c->SetY(yc);
    fClusters->SetPointId(id, new AliTRDcluster(*c));
  } 
  if(fClusters){
    fClusters->SetName("TC clusters");
    fClusters->SetTitle(Form("N[%d]", trklt->GetN()));
    fClusters->SetMarkerColor(kMagenta);
  }

  SetTitle(Form("Det[%d] RC[%c] Layer[%d] P[%7.3f]", trklt->GetDetector(), trklt->IsRowCross()?'y':'n', trklt->GetPlane(), trklt->GetMomentum()));
  SetLineColor(kRed);
  //SetOwnIds(kTRUE);
  
  //trklt->Fit(kTRUE);
  y0   = trklt->GetYfit(0);
  dydx = trklt->GetYfit(1);
  Double_t xg(x0 * cphi - y0 * sphi),
           yg(x0 * sphi + y0 * cphi);
  SetPoint(0, xg, yg, z0); 
  //SetPoint(0, x0, y0, z0);


  dx = .5*AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght();
  x0 -= dx; 
  y0 -= dydx*dx,
  z0 -= dzdx*dx; 
  xg = x0 * cphi - y0 * sphi;
  yg = x0 * sphi + y0 * cphi;
  SetPoint(1, xg, yg, z0);
  //SetPoint(1, x0, y0, z0);
}


AliEveTRDTracklet::~AliEveTRDTracklet() 
{

}

//______________________________________________________________________________
void AliEveTRDTracklet::Print(Option_t *o) const
{
  AliTRDseedV1 *tracklet = (AliTRDseedV1*)GetUserData();
  if(!tracklet) return;
  tracklet->Print(o);
}

///////////////////////////////////////////////////////////
/////////////   AliEveTRDTrack         /////////////////////
///////////////////////////////////////////////////////////

//______________________________________________________________________________
AliEveTRDTrack::AliEveTRDTrack(AliTRDtrackV1 *trk) 
  :TEveLine()
  ,fTrackState(0)
  ,fESDStatus(0)
  ,fAlpha(0.)
  ,fPoints(NULL)
  ,fRim(NULL)
{
  // Constructor.
  SetUserData(trk);
  SetName("");

//  AliTRDtrackerV1::SetNTimeBins(24);

  fRim = new AliRieman(trk->GetNumberOfClusters());
  AliTRDseedV1 *tracklet = NULL;
  for(Int_t il=0; il<AliTRDgeometry::kNlayer; il++){
    if(!(tracklet = trk->GetTracklet(il))) continue;
    if(!tracklet->IsOK()) continue;
    AddElement(new AliEveTRDTracklet(tracklet));

//     tracklet->ResetClusterIter(kFALSE);
//     while((c = tracklet->PrevCluster())){
//    AliTRDcluster *c(NULL);
/*    for(Int_t ic=AliTRDseedV1::kNtb; ic--;){
      if(!(c=tracklet->GetClusters(ic))) continue;
      Float_t xc = c->GetX();
      Float_t yc = c->GetY();
      Float_t zc = c->GetZ();
      Float_t zt = tracklet->GetZref(0) - (tracklet->GetX0()-xc)*tracklet->GetZref(1); 
      yc -= tracklet->GetTilt()*(zc-zt);
      fRim->AddPoint(xc, yc, zc, .05, 2.3);
    }*/
  }
  if(trk->GetNumberOfTracklets()>1) fRim->Update();
  SetStatus(fTrackState);
}

//______________________________________________________________________________
AliEveTRDTrack::~AliEveTRDTrack()
{
  if(fPoints) delete [] fPoints; fPoints = NULL;
  //delete dynamic_cast<AliTRDtrackV1*>(GetUserData());
}

//______________________________________________________________________________
void AliEveTRDTrack::Print(Option_t *o) const
{
  AliTRDtrackV1 *track = (AliTRDtrackV1*)GetUserData();
  if(!track) return;
  track->Print(o);
}

//______________________________________________________________________________
void AliEveTRDTrack::SetStatus(UChar_t s)
{
  // nothing to be done
  if(fPoints && fTrackState == s) return;
  //return;
  const Int_t nc = AliTRDtrackV1::kMAXCLUSTERSPERTRACK;
  AliTRDtrackV1 *trk(NULL);
  if(!(trk=static_cast<AliTRDtrackV1*>(GetUserData()))) {
    AliError("Failed casting data to TRD track.");
    return;
  }

  Bool_t BUILD = kFALSE;
  if(!fPoints){ 
    fPoints = new AliTrackPoint[nc];

    // define the radial span of the track in the TRD
    Double_t xmin = -1., xmax = -1.;
    Int_t det = 0;
    AliTRDseedV1 *trklt = NULL;
    for(Int_t ily=0; ily<AliTRDgeometry::kNlayer; ily++){
      if(!(trklt = trk->GetTracklet(ily))) continue;
      if(xmin<0.) xmin = trklt->GetX0() - AliTRDgeometry::CamHght() - AliTRDgeometry::CdrHght();
      if(trklt->GetX0()>xmax) xmax = trklt->GetX0();
      det = trklt->GetDetector();
    }
    Int_t sec = det/AliTRDgeometry::kNdets;
    fAlpha = AliTRDgeometry::GetAlpha() * (sec<9 ? sec + .5 : sec - 17.5); //trk->GetAlpha()

    Double_t dx =(xmax - xmin)/nc;
    for(Int_t ip=0; ip<nc; ip++){
      fPoints[ip].SetXYZ(xmin, 0., 0.);
      xmin+=dx;
    }
    BUILD = kTRUE;
  }

  // select track model
  if(BUILD || ((s&12) != (fTrackState&12))){
    if(TESTBIT(s, kTrackCosmics)){
      //printf("Straight track\n");
      AliTRDtrackerV1::FitLine(trk, NULL, kFALSE, nc, fPoints);
    } else {
      if(TESTBIT(s, kTrackModel)){
        //printf("Kalman track\n");
        if(trk->GetNumberOfTracklets() >=4) AliTRDtrackerV1::FitKalman(trk, NULL, kFALSE, nc, fPoints);
      } else { 
        //printf("Rieman track rim[%p] nc[%d]\n", (void*)fRim, nc);
        //if(trk->GetNumberOfTracklets() >=4) AliTRDtrackerV1::FitRiemanTilt(trk, NULL, kTRUE, nc, fPoints);
        Float_t x = 0.;
        for(Int_t ip = nc; ip--;){
          x = fPoints[ip].GetX();
          //printf("%2d x[%f] y[%f] z[%f]\n", ip, x, fRim->GetYat(x), fRim->GetZat(x));
          fPoints[ip].SetXYZ(x, fRim->GetYat(x), fRim->GetZat(x));
        }
      }
    }
  
    Float_t global[3];
    for(Int_t ip=0; ip<nc; ip++){
      fPoints[ip].Rotate(-fAlpha).GetXYZ(global);
      SetPoint(ip, global[0], global[1], global[2]);
      //printf("*** %2d x[%f] y[%f] z[%f]\n", ip, global[0], global[1], global[2]);
    
    }
    SetSmooth(kTRUE);
  }

  // set color
  if(BUILD || ((s&3) != (fTrackState&3))){
    if(TESTBIT(s, kSource)){
      //printf("Source color\n");
      if(fESDStatus&AliESDtrack::kTRDin){
        SetMarkerColor(kGreen);
        SetLineColor(kGreen);
      } else {
        SetMarkerColor(kMagenta);
        SetLineColor(kMagenta);
      }
    } else {
      if(TESTBIT(s, kPID) == AliTRDpidUtil::kLQ){
        //printf("PID color kLQPID\n");
        //trk->GetReconstructor()->SetOption("!nn");
      } else {
        //printf("PID color kNNPID\n");
        //trk->GetReconstructor()->SetOption("nn");
      }
      //trk->CookPID();
  
      Int_t species = 0; Float_t pid = 0.;
      for(Int_t is=0; is<AliPID::kSPECIES; ++is) 
        if(trk->GetPID(is) > pid){
          pid = trk->GetPID(is);
		  species = (AliPID::EParticleType) is;
        }
      switch(species){
      case AliPID::kElectron:
        SetMarkerColor(kRed);
        SetLineColor(kRed);
        break;
      default:
        SetMarkerColor(kBlue);
        SetLineColor(kBlue);
        break;
      }
    }
    SetLineWidth(2);
  }
  
  const Char_t *model = "line";
  if(!TESTBIT(s, kTrackCosmics)){
    if(TESTBIT(s, kTrackModel)) model = "kalman";
    else model = "rieman";
  }
  Int_t species = 0; Float_t pid = 0.;
  for(Int_t is=0; is<AliPID::kSPECIES; is++) 
    if(trk->GetPID(is) > pid){
      pid = trk->GetPID(is);
      species = is;
    }

  SetTitle(Form(
    "Tracklets[%d] Clusters[%d]\n"
    "Reconstruction Source[%s]\n"
    "PID[%4.1f %4.1f %4.1f %4.1f %4.1f]\n"
    "MC[%d]", trk->GetNumberOfTracklets(), trk->GetNumberOfClusters(), fESDStatus&AliESDtrack::kTRDin ? "barrel" : "sa",
    1.E2*trk->GetPID(0), 1.E2*trk->GetPID(1),
    1.E2*trk->GetPID(2), 1.E2*trk->GetPID(3), 1.E2*trk->GetPID(4), trk->GetLabel()));

  if(GetName()){
    char id[6]; snprintf(id, 6, "%s", GetName());
    SetName(Form("%s %s", id, AliPID::ParticleName(species)));
  }

  // save track status
  fTrackState = s;
}

//______________________________________________________________________________
void AliEveTRDTrack::Load(const Char_t *what) const
{
// Spread downwards to tracklets the command "what"

  const AliEveTRDTracklet* trklt(NULL);
  TEveElement::List_ci itrklt=BeginChildren();
  while(itrklt!=EndChildren()){
    if((trklt = dynamic_cast<const AliEveTRDTracklet*>(*itrklt))) trklt->Load(what);
    itrklt++;
  }
}

//______________________________________________________________________________
AliEveTRDTrackletOnline::AliEveTRDTrackletOnline(AliTRDtrackletMCM *tracklet) :
  TEveLine(),
  fDetector(-1),
  fROB(-1),
  fMCM(-1)
{
  AliTRDtrackletMCM *trkl = new AliTRDtrackletMCM(*tracklet);
  SetUserData(trkl);

  fDetector = trkl->GetDetector();
  fROB = trkl->GetROB();
  fMCM = trkl->GetMCM();

  SetName("sim. tracklet");
  SetTitle(Form("Det: %i, ROB: %i, MCM: %i, Label: %i\n0x%08x", 
                trkl->GetDetector(), trkl->GetROB(), trkl->GetMCM(), trkl->GetLabel(),
                trkl->GetTrackletWord()));
  SetLineColor(kGreen);
  SetLineWidth(3);

  AliTRDgeometry geo;
  TGeoHMatrix *matrix = geo.GetClusterMatrix(trkl->GetDetector());

  fDetector = trkl->GetDetector();
  fROB = trkl->GetROB();
  fMCM = trkl->GetMCM();
  
  Float_t length = 3.;
  Double_t x[3];
  Double_t p[3];
  Double_t p2[3];
  x[0] = AliTRDgeometry::AnodePos(); 
  x[1] = trkl->GetY();
  x[2] = trkl->GetLocalZ();

  matrix->LocalToMaster(x, p);
  geo.RotateBack(trkl->GetDetector(), p, p2);
  SetPoint(0, p2[0], p2[1], p2[2]);

  x[0] -= length;
  x[1] -= length * trkl->GetdYdX();
  matrix->LocalToMaster(x, p);
  p[2] *= p[0] / (p[0] + length);
  geo.RotateBack(trkl->GetDetector(), p, p2);
  SetPoint(1, p2[0], p2[1], p2[2]);
}

AliEveTRDTrackletOnline::AliEveTRDTrackletOnline(AliTRDtrackletWord *tracklet) :
  TEveLine(),
  fDetector(-1),
  fROB(-1),
  fMCM(-1)
{
  AliTRDtrackletWord *trkl = new AliTRDtrackletWord(*tracklet);
  SetUserData(trkl);

  fDetector = trkl->GetDetector();
  fROB = trkl->GetROB(); 
  fMCM = trkl->GetMCM(); 

  SetName("raw tracklet");
  SetTitle(Form("Det: %i, ROB: %i, MCM: %i, Label: %i\n0x%08x", 
                trkl->GetDetector(), fROB, fMCM, -1,
                trkl->GetTrackletWord()));
  SetLineColor(kRed);
  SetLineWidth(3);

  AliTRDgeometry geo;
  TGeoHMatrix *matrix = geo.GetClusterMatrix(trkl->GetDetector());

  Float_t length = 3.;
  Double_t x[3];
  Double_t p[3];
  Double_t p2[3];
  x[0] = AliTRDgeometry::AnodePos();
  x[1] = trkl->GetY();
  x[2] = trkl->GetLocalZ();
  
  matrix->LocalToMaster(x, p);
  geo.RotateBack(trkl->GetDetector(), p, p2);
  SetPoint(0, p2[0], p2[1], p2[2]);

  x[0] -= length;
  x[1] -= length * trkl->GetdYdX();
  matrix->LocalToMaster(x, p);
  p[2] *= p[0] / (p[0] + length);
  geo.RotateBack(trkl->GetDetector(), p, p2);
  SetPoint(1, p2[0], p2[1], p2[2]);
}

AliEveTRDTrackletOnline::~AliEveTRDTrackletOnline() 
{
  delete ((AliTRDtrackletBase*) GetUserData());
  SetUserData(0x0);
}

void AliEveTRDTrackletOnline::ShowMCM(Option_t *opt) const
{
  if (fDetector < 0 || fROB < 0 || fMCM < 0)
    return;

  AliEveTRDmcm *evemcm = new AliEveTRDmcm();
  evemcm->Init(fDetector, fROB, fMCM);
  evemcm->LoadDigits();
  evemcm->Draw(opt);

  TEveElementList *mcmlist = NULL;
  if (gEve->GetCurrentEvent()) 
    mcmlist = (TEveElementList*) gEve->GetCurrentEvent()->FindChild("TRD MCMs");
  if (!mcmlist) {
    mcmlist = new TEveElementList("TRD MCMs");
    gEve->AddElement(mcmlist);
  }
  gEve->AddElement(evemcm, mcmlist);
}


AliEveTRDmcm::AliEveTRDmcm() :
  TEveElement(),
  TNamed(),
  fMCM(new AliTRDmcmSim())
{
  SetName("MCM");
  SetTitle("Unknown MCM");
}

AliEveTRDmcm::~AliEveTRDmcm()
{
  delete fMCM;
}

Bool_t AliEveTRDmcm::Init(Int_t det, Int_t rob, Int_t mcm)
{
  SetName(Form("MCM: Det. %i, ROB %i, MCM %i", det, rob, mcm));
  SetTitle(Form("MCM: Det. %i, ROB %i, MCM %i", det, rob, mcm));
  fMCM->Init(det, rob, mcm);
  fMCM->Reset();
  return kTRUE;
}

Bool_t AliEveTRDmcm::LoadDigits()
{
  AliRunLoader *rl = AliEveEventManager::AssertRunLoader();
  return fMCM->LoadMCM(rl, fMCM->GetDetector(), 
                       fMCM->GetRobPos(), fMCM->GetMcmPos());
}

Bool_t AliEveTRDmcm::Filter()
{
  fMCM->Filter();
  return kTRUE;
}

Bool_t AliEveTRDmcm::Tracklet()
{
  fMCM->Tracklet();
  return kTRUE;
}

void AliEveTRDmcm::Draw(Option_t* option)
{
  const char *mcmname = Form("mcm_%i_%i_%i", fMCM->GetDetector(),
                             fMCM->GetRobPos(), fMCM->GetMcmPos());

  TCanvas *c = dynamic_cast<TCanvas*> (gROOT->FindObject(mcmname));
  if (!c)
    c = gEve->AddCanvasTab("TRD MCM");
  c->SetTitle(Form("MCM %i on ROB %i of det. %i", 
                   fMCM->GetMcmPos(), fMCM->GetRobPos(), fMCM->GetDetector()));
  c->SetName(mcmname);
  c->cd();
  fMCM->Draw(option);
}

Bool_t AliEveTRDmcm::AssignPointer(const char* ptrname)
{
  gROOT->ProcessLine(Form("AliTRDmcmSim* %s = (AliTRDmcmSim *)%p", ptrname, (void*)fMCM));
  return kTRUE;
}
 AliEveTRDData.cxx:1
 AliEveTRDData.cxx:2
 AliEveTRDData.cxx:3
 AliEveTRDData.cxx:4
 AliEveTRDData.cxx:5
 AliEveTRDData.cxx:6
 AliEveTRDData.cxx:7
 AliEveTRDData.cxx:8
 AliEveTRDData.cxx:9
 AliEveTRDData.cxx:10
 AliEveTRDData.cxx:11
 AliEveTRDData.cxx:12
 AliEveTRDData.cxx:13
 AliEveTRDData.cxx:14
 AliEveTRDData.cxx:15
 AliEveTRDData.cxx:16
 AliEveTRDData.cxx:17
 AliEveTRDData.cxx:18
 AliEveTRDData.cxx:19
 AliEveTRDData.cxx:20
 AliEveTRDData.cxx:21
 AliEveTRDData.cxx:22
 AliEveTRDData.cxx:23
 AliEveTRDData.cxx:24
 AliEveTRDData.cxx:25
 AliEveTRDData.cxx:26
 AliEveTRDData.cxx:27
 AliEveTRDData.cxx:28
 AliEveTRDData.cxx:29
 AliEveTRDData.cxx:30
 AliEveTRDData.cxx:31
 AliEveTRDData.cxx:32
 AliEveTRDData.cxx:33
 AliEveTRDData.cxx:34
 AliEveTRDData.cxx:35
 AliEveTRDData.cxx:36
 AliEveTRDData.cxx:37
 AliEveTRDData.cxx:38
 AliEveTRDData.cxx:39
 AliEveTRDData.cxx:40
 AliEveTRDData.cxx:41
 AliEveTRDData.cxx:42
 AliEveTRDData.cxx:43
 AliEveTRDData.cxx:44
 AliEveTRDData.cxx:45
 AliEveTRDData.cxx:46
 AliEveTRDData.cxx:47
 AliEveTRDData.cxx:48
 AliEveTRDData.cxx:49
 AliEveTRDData.cxx:50
 AliEveTRDData.cxx:51
 AliEveTRDData.cxx:52
 AliEveTRDData.cxx:53
 AliEveTRDData.cxx:54
 AliEveTRDData.cxx:55
 AliEveTRDData.cxx:56
 AliEveTRDData.cxx:57
 AliEveTRDData.cxx:58
 AliEveTRDData.cxx:59
 AliEveTRDData.cxx:60
 AliEveTRDData.cxx:61
 AliEveTRDData.cxx:62
 AliEveTRDData.cxx:63
 AliEveTRDData.cxx:64
 AliEveTRDData.cxx:65
 AliEveTRDData.cxx:66
 AliEveTRDData.cxx:67
 AliEveTRDData.cxx:68
 AliEveTRDData.cxx:69
 AliEveTRDData.cxx:70
 AliEveTRDData.cxx:71
 AliEveTRDData.cxx:72
 AliEveTRDData.cxx:73
 AliEveTRDData.cxx:74
 AliEveTRDData.cxx:75
 AliEveTRDData.cxx:76
 AliEveTRDData.cxx:77
 AliEveTRDData.cxx:78
 AliEveTRDData.cxx:79
 AliEveTRDData.cxx:80
 AliEveTRDData.cxx:81
 AliEveTRDData.cxx:82
 AliEveTRDData.cxx:83
 AliEveTRDData.cxx:84
 AliEveTRDData.cxx:85
 AliEveTRDData.cxx:86
 AliEveTRDData.cxx:87
 AliEveTRDData.cxx:88
 AliEveTRDData.cxx:89
 AliEveTRDData.cxx:90
 AliEveTRDData.cxx:91
 AliEveTRDData.cxx:92
 AliEveTRDData.cxx:93
 AliEveTRDData.cxx:94
 AliEveTRDData.cxx:95
 AliEveTRDData.cxx:96
 AliEveTRDData.cxx:97
 AliEveTRDData.cxx:98
 AliEveTRDData.cxx:99
 AliEveTRDData.cxx:100
 AliEveTRDData.cxx:101
 AliEveTRDData.cxx:102
 AliEveTRDData.cxx:103
 AliEveTRDData.cxx:104
 AliEveTRDData.cxx:105
 AliEveTRDData.cxx:106
 AliEveTRDData.cxx:107
 AliEveTRDData.cxx:108
 AliEveTRDData.cxx:109
 AliEveTRDData.cxx:110
 AliEveTRDData.cxx:111
 AliEveTRDData.cxx:112
 AliEveTRDData.cxx:113
 AliEveTRDData.cxx:114
 AliEveTRDData.cxx:115
 AliEveTRDData.cxx:116
 AliEveTRDData.cxx:117
 AliEveTRDData.cxx:118
 AliEveTRDData.cxx:119
 AliEveTRDData.cxx:120
 AliEveTRDData.cxx:121
 AliEveTRDData.cxx:122
 AliEveTRDData.cxx:123
 AliEveTRDData.cxx:124
 AliEveTRDData.cxx:125
 AliEveTRDData.cxx:126
 AliEveTRDData.cxx:127
 AliEveTRDData.cxx:128
 AliEveTRDData.cxx:129
 AliEveTRDData.cxx:130
 AliEveTRDData.cxx:131
 AliEveTRDData.cxx:132
 AliEveTRDData.cxx:133
 AliEveTRDData.cxx:134
 AliEveTRDData.cxx:135
 AliEveTRDData.cxx:136
 AliEveTRDData.cxx:137
 AliEveTRDData.cxx:138
 AliEveTRDData.cxx:139
 AliEveTRDData.cxx:140
 AliEveTRDData.cxx:141
 AliEveTRDData.cxx:142
 AliEveTRDData.cxx:143
 AliEveTRDData.cxx:144
 AliEveTRDData.cxx:145
 AliEveTRDData.cxx:146
 AliEveTRDData.cxx:147
 AliEveTRDData.cxx:148
 AliEveTRDData.cxx:149
 AliEveTRDData.cxx:150
 AliEveTRDData.cxx:151
 AliEveTRDData.cxx:152
 AliEveTRDData.cxx:153
 AliEveTRDData.cxx:154
 AliEveTRDData.cxx:155
 AliEveTRDData.cxx:156
 AliEveTRDData.cxx:157
 AliEveTRDData.cxx:158
 AliEveTRDData.cxx:159
 AliEveTRDData.cxx:160
 AliEveTRDData.cxx:161
 AliEveTRDData.cxx:162
 AliEveTRDData.cxx:163
 AliEveTRDData.cxx:164
 AliEveTRDData.cxx:165
 AliEveTRDData.cxx:166
 AliEveTRDData.cxx:167
 AliEveTRDData.cxx:168
 AliEveTRDData.cxx:169
 AliEveTRDData.cxx:170
 AliEveTRDData.cxx:171
 AliEveTRDData.cxx:172
 AliEveTRDData.cxx:173
 AliEveTRDData.cxx:174
 AliEveTRDData.cxx:175
 AliEveTRDData.cxx:176
 AliEveTRDData.cxx:177
 AliEveTRDData.cxx:178
 AliEveTRDData.cxx:179
 AliEveTRDData.cxx:180
 AliEveTRDData.cxx:181
 AliEveTRDData.cxx:182
 AliEveTRDData.cxx:183
 AliEveTRDData.cxx:184
 AliEveTRDData.cxx:185
 AliEveTRDData.cxx:186
 AliEveTRDData.cxx:187
 AliEveTRDData.cxx:188
 AliEveTRDData.cxx:189
 AliEveTRDData.cxx:190
 AliEveTRDData.cxx:191
 AliEveTRDData.cxx:192
 AliEveTRDData.cxx:193
 AliEveTRDData.cxx:194
 AliEveTRDData.cxx:195
 AliEveTRDData.cxx:196
 AliEveTRDData.cxx:197
 AliEveTRDData.cxx:198
 AliEveTRDData.cxx:199
 AliEveTRDData.cxx:200
 AliEveTRDData.cxx:201
 AliEveTRDData.cxx:202
 AliEveTRDData.cxx:203
 AliEveTRDData.cxx:204
 AliEveTRDData.cxx:205
 AliEveTRDData.cxx:206
 AliEveTRDData.cxx:207
 AliEveTRDData.cxx:208
 AliEveTRDData.cxx:209
 AliEveTRDData.cxx:210
 AliEveTRDData.cxx:211
 AliEveTRDData.cxx:212
 AliEveTRDData.cxx:213
 AliEveTRDData.cxx:214
 AliEveTRDData.cxx:215
 AliEveTRDData.cxx:216
 AliEveTRDData.cxx:217
 AliEveTRDData.cxx:218
 AliEveTRDData.cxx:219
 AliEveTRDData.cxx:220
 AliEveTRDData.cxx:221
 AliEveTRDData.cxx:222
 AliEveTRDData.cxx:223
 AliEveTRDData.cxx:224
 AliEveTRDData.cxx:225
 AliEveTRDData.cxx:226
 AliEveTRDData.cxx:227
 AliEveTRDData.cxx:228
 AliEveTRDData.cxx:229
 AliEveTRDData.cxx:230
 AliEveTRDData.cxx:231
 AliEveTRDData.cxx:232
 AliEveTRDData.cxx:233
 AliEveTRDData.cxx:234
 AliEveTRDData.cxx:235
 AliEveTRDData.cxx:236
 AliEveTRDData.cxx:237
 AliEveTRDData.cxx:238
 AliEveTRDData.cxx:239
 AliEveTRDData.cxx:240
 AliEveTRDData.cxx:241
 AliEveTRDData.cxx:242
 AliEveTRDData.cxx:243
 AliEveTRDData.cxx:244
 AliEveTRDData.cxx:245
 AliEveTRDData.cxx:246
 AliEveTRDData.cxx:247
 AliEveTRDData.cxx:248
 AliEveTRDData.cxx:249
 AliEveTRDData.cxx:250
 AliEveTRDData.cxx:251
 AliEveTRDData.cxx:252
 AliEveTRDData.cxx:253
 AliEveTRDData.cxx:254
 AliEveTRDData.cxx:255
 AliEveTRDData.cxx:256
 AliEveTRDData.cxx:257
 AliEveTRDData.cxx:258
 AliEveTRDData.cxx:259
 AliEveTRDData.cxx:260
 AliEveTRDData.cxx:261
 AliEveTRDData.cxx:262
 AliEveTRDData.cxx:263
 AliEveTRDData.cxx:264
 AliEveTRDData.cxx:265
 AliEveTRDData.cxx:266
 AliEveTRDData.cxx:267
 AliEveTRDData.cxx:268
 AliEveTRDData.cxx:269
 AliEveTRDData.cxx:270
 AliEveTRDData.cxx:271
 AliEveTRDData.cxx:272
 AliEveTRDData.cxx:273
 AliEveTRDData.cxx:274
 AliEveTRDData.cxx:275
 AliEveTRDData.cxx:276
 AliEveTRDData.cxx:277
 AliEveTRDData.cxx:278
 AliEveTRDData.cxx:279
 AliEveTRDData.cxx:280
 AliEveTRDData.cxx:281
 AliEveTRDData.cxx:282
 AliEveTRDData.cxx:283
 AliEveTRDData.cxx:284
 AliEveTRDData.cxx:285
 AliEveTRDData.cxx:286
 AliEveTRDData.cxx:287
 AliEveTRDData.cxx:288
 AliEveTRDData.cxx:289
 AliEveTRDData.cxx:290
 AliEveTRDData.cxx:291
 AliEveTRDData.cxx:292
 AliEveTRDData.cxx:293
 AliEveTRDData.cxx:294
 AliEveTRDData.cxx:295
 AliEveTRDData.cxx:296
 AliEveTRDData.cxx:297
 AliEveTRDData.cxx:298
 AliEveTRDData.cxx:299
 AliEveTRDData.cxx:300
 AliEveTRDData.cxx:301
 AliEveTRDData.cxx:302
 AliEveTRDData.cxx:303
 AliEveTRDData.cxx:304
 AliEveTRDData.cxx:305
 AliEveTRDData.cxx:306
 AliEveTRDData.cxx:307
 AliEveTRDData.cxx:308
 AliEveTRDData.cxx:309
 AliEveTRDData.cxx:310
 AliEveTRDData.cxx:311
 AliEveTRDData.cxx:312
 AliEveTRDData.cxx:313
 AliEveTRDData.cxx:314
 AliEveTRDData.cxx:315
 AliEveTRDData.cxx:316
 AliEveTRDData.cxx:317
 AliEveTRDData.cxx:318
 AliEveTRDData.cxx:319
 AliEveTRDData.cxx:320
 AliEveTRDData.cxx:321
 AliEveTRDData.cxx:322
 AliEveTRDData.cxx:323
 AliEveTRDData.cxx:324
 AliEveTRDData.cxx:325
 AliEveTRDData.cxx:326
 AliEveTRDData.cxx:327
 AliEveTRDData.cxx:328
 AliEveTRDData.cxx:329
 AliEveTRDData.cxx:330
 AliEveTRDData.cxx:331
 AliEveTRDData.cxx:332
 AliEveTRDData.cxx:333
 AliEveTRDData.cxx:334
 AliEveTRDData.cxx:335
 AliEveTRDData.cxx:336
 AliEveTRDData.cxx:337
 AliEveTRDData.cxx:338
 AliEveTRDData.cxx:339
 AliEveTRDData.cxx:340
 AliEveTRDData.cxx:341
 AliEveTRDData.cxx:342
 AliEveTRDData.cxx:343
 AliEveTRDData.cxx:344
 AliEveTRDData.cxx:345
 AliEveTRDData.cxx:346
 AliEveTRDData.cxx:347
 AliEveTRDData.cxx:348
 AliEveTRDData.cxx:349
 AliEveTRDData.cxx:350
 AliEveTRDData.cxx:351
 AliEveTRDData.cxx:352
 AliEveTRDData.cxx:353
 AliEveTRDData.cxx:354
 AliEveTRDData.cxx:355
 AliEveTRDData.cxx:356
 AliEveTRDData.cxx:357
 AliEveTRDData.cxx:358
 AliEveTRDData.cxx:359
 AliEveTRDData.cxx:360
 AliEveTRDData.cxx:361
 AliEveTRDData.cxx:362
 AliEveTRDData.cxx:363
 AliEveTRDData.cxx:364
 AliEveTRDData.cxx:365
 AliEveTRDData.cxx:366
 AliEveTRDData.cxx:367
 AliEveTRDData.cxx:368
 AliEveTRDData.cxx:369
 AliEveTRDData.cxx:370
 AliEveTRDData.cxx:371
 AliEveTRDData.cxx:372
 AliEveTRDData.cxx:373
 AliEveTRDData.cxx:374
 AliEveTRDData.cxx:375
 AliEveTRDData.cxx:376
 AliEveTRDData.cxx:377
 AliEveTRDData.cxx:378
 AliEveTRDData.cxx:379
 AliEveTRDData.cxx:380
 AliEveTRDData.cxx:381
 AliEveTRDData.cxx:382
 AliEveTRDData.cxx:383
 AliEveTRDData.cxx:384
 AliEveTRDData.cxx:385
 AliEveTRDData.cxx:386
 AliEveTRDData.cxx:387
 AliEveTRDData.cxx:388
 AliEveTRDData.cxx:389
 AliEveTRDData.cxx:390
 AliEveTRDData.cxx:391
 AliEveTRDData.cxx:392
 AliEveTRDData.cxx:393
 AliEveTRDData.cxx:394
 AliEveTRDData.cxx:395
 AliEveTRDData.cxx:396
 AliEveTRDData.cxx:397
 AliEveTRDData.cxx:398
 AliEveTRDData.cxx:399
 AliEveTRDData.cxx:400
 AliEveTRDData.cxx:401
 AliEveTRDData.cxx:402
 AliEveTRDData.cxx:403
 AliEveTRDData.cxx:404
 AliEveTRDData.cxx:405
 AliEveTRDData.cxx:406
 AliEveTRDData.cxx:407
 AliEveTRDData.cxx:408
 AliEveTRDData.cxx:409
 AliEveTRDData.cxx:410
 AliEveTRDData.cxx:411
 AliEveTRDData.cxx:412
 AliEveTRDData.cxx:413
 AliEveTRDData.cxx:414
 AliEveTRDData.cxx:415
 AliEveTRDData.cxx:416
 AliEveTRDData.cxx:417
 AliEveTRDData.cxx:418
 AliEveTRDData.cxx:419
 AliEveTRDData.cxx:420
 AliEveTRDData.cxx:421
 AliEveTRDData.cxx:422
 AliEveTRDData.cxx:423
 AliEveTRDData.cxx:424
 AliEveTRDData.cxx:425
 AliEveTRDData.cxx:426
 AliEveTRDData.cxx:427
 AliEveTRDData.cxx:428
 AliEveTRDData.cxx:429
 AliEveTRDData.cxx:430
 AliEveTRDData.cxx:431
 AliEveTRDData.cxx:432
 AliEveTRDData.cxx:433
 AliEveTRDData.cxx:434
 AliEveTRDData.cxx:435
 AliEveTRDData.cxx:436
 AliEveTRDData.cxx:437
 AliEveTRDData.cxx:438
 AliEveTRDData.cxx:439
 AliEveTRDData.cxx:440
 AliEveTRDData.cxx:441
 AliEveTRDData.cxx:442
 AliEveTRDData.cxx:443
 AliEveTRDData.cxx:444
 AliEveTRDData.cxx:445
 AliEveTRDData.cxx:446
 AliEveTRDData.cxx:447
 AliEveTRDData.cxx:448
 AliEveTRDData.cxx:449
 AliEveTRDData.cxx:450
 AliEveTRDData.cxx:451
 AliEveTRDData.cxx:452
 AliEveTRDData.cxx:453
 AliEveTRDData.cxx:454
 AliEveTRDData.cxx:455
 AliEveTRDData.cxx:456
 AliEveTRDData.cxx:457
 AliEveTRDData.cxx:458
 AliEveTRDData.cxx:459
 AliEveTRDData.cxx:460
 AliEveTRDData.cxx:461
 AliEveTRDData.cxx:462
 AliEveTRDData.cxx:463
 AliEveTRDData.cxx:464
 AliEveTRDData.cxx:465
 AliEveTRDData.cxx:466
 AliEveTRDData.cxx:467
 AliEveTRDData.cxx:468
 AliEveTRDData.cxx:469
 AliEveTRDData.cxx:470
 AliEveTRDData.cxx:471
 AliEveTRDData.cxx:472
 AliEveTRDData.cxx:473
 AliEveTRDData.cxx:474
 AliEveTRDData.cxx:475
 AliEveTRDData.cxx:476
 AliEveTRDData.cxx:477
 AliEveTRDData.cxx:478
 AliEveTRDData.cxx:479
 AliEveTRDData.cxx:480
 AliEveTRDData.cxx:481
 AliEveTRDData.cxx:482
 AliEveTRDData.cxx:483
 AliEveTRDData.cxx:484
 AliEveTRDData.cxx:485
 AliEveTRDData.cxx:486
 AliEveTRDData.cxx:487
 AliEveTRDData.cxx:488
 AliEveTRDData.cxx:489
 AliEveTRDData.cxx:490
 AliEveTRDData.cxx:491
 AliEveTRDData.cxx:492
 AliEveTRDData.cxx:493
 AliEveTRDData.cxx:494
 AliEveTRDData.cxx:495
 AliEveTRDData.cxx:496
 AliEveTRDData.cxx:497
 AliEveTRDData.cxx:498
 AliEveTRDData.cxx:499
 AliEveTRDData.cxx:500
 AliEveTRDData.cxx:501
 AliEveTRDData.cxx:502
 AliEveTRDData.cxx:503
 AliEveTRDData.cxx:504
 AliEveTRDData.cxx:505
 AliEveTRDData.cxx:506
 AliEveTRDData.cxx:507
 AliEveTRDData.cxx:508
 AliEveTRDData.cxx:509
 AliEveTRDData.cxx:510
 AliEveTRDData.cxx:511
 AliEveTRDData.cxx:512
 AliEveTRDData.cxx:513
 AliEveTRDData.cxx:514
 AliEveTRDData.cxx:515
 AliEveTRDData.cxx:516
 AliEveTRDData.cxx:517
 AliEveTRDData.cxx:518
 AliEveTRDData.cxx:519
 AliEveTRDData.cxx:520
 AliEveTRDData.cxx:521
 AliEveTRDData.cxx:522
 AliEveTRDData.cxx:523
 AliEveTRDData.cxx:524
 AliEveTRDData.cxx:525
 AliEveTRDData.cxx:526
 AliEveTRDData.cxx:527
 AliEveTRDData.cxx:528
 AliEveTRDData.cxx:529
 AliEveTRDData.cxx:530
 AliEveTRDData.cxx:531
 AliEveTRDData.cxx:532
 AliEveTRDData.cxx:533
 AliEveTRDData.cxx:534
 AliEveTRDData.cxx:535
 AliEveTRDData.cxx:536
 AliEveTRDData.cxx:537
 AliEveTRDData.cxx:538
 AliEveTRDData.cxx:539
 AliEveTRDData.cxx:540
 AliEveTRDData.cxx:541
 AliEveTRDData.cxx:542
 AliEveTRDData.cxx:543
 AliEveTRDData.cxx:544
 AliEveTRDData.cxx:545
 AliEveTRDData.cxx:546
 AliEveTRDData.cxx:547
 AliEveTRDData.cxx:548
 AliEveTRDData.cxx:549
 AliEveTRDData.cxx:550
 AliEveTRDData.cxx:551
 AliEveTRDData.cxx:552
 AliEveTRDData.cxx:553
 AliEveTRDData.cxx:554
 AliEveTRDData.cxx:555
 AliEveTRDData.cxx:556
 AliEveTRDData.cxx:557
 AliEveTRDData.cxx:558
 AliEveTRDData.cxx:559
 AliEveTRDData.cxx:560
 AliEveTRDData.cxx:561
 AliEveTRDData.cxx:562
 AliEveTRDData.cxx:563
 AliEveTRDData.cxx:564
 AliEveTRDData.cxx:565
 AliEveTRDData.cxx:566
 AliEveTRDData.cxx:567
 AliEveTRDData.cxx:568
 AliEveTRDData.cxx:569
 AliEveTRDData.cxx:570
 AliEveTRDData.cxx:571
 AliEveTRDData.cxx:572
 AliEveTRDData.cxx:573
 AliEveTRDData.cxx:574
 AliEveTRDData.cxx:575
 AliEveTRDData.cxx:576
 AliEveTRDData.cxx:577
 AliEveTRDData.cxx:578
 AliEveTRDData.cxx:579
 AliEveTRDData.cxx:580
 AliEveTRDData.cxx:581
 AliEveTRDData.cxx:582
 AliEveTRDData.cxx:583
 AliEveTRDData.cxx:584
 AliEveTRDData.cxx:585
 AliEveTRDData.cxx:586
 AliEveTRDData.cxx:587
 AliEveTRDData.cxx:588
 AliEveTRDData.cxx:589
 AliEveTRDData.cxx:590
 AliEveTRDData.cxx:591
 AliEveTRDData.cxx:592
 AliEveTRDData.cxx:593
 AliEveTRDData.cxx:594
 AliEveTRDData.cxx:595
 AliEveTRDData.cxx:596
 AliEveTRDData.cxx:597
 AliEveTRDData.cxx:598
 AliEveTRDData.cxx:599
 AliEveTRDData.cxx:600
 AliEveTRDData.cxx:601
 AliEveTRDData.cxx:602
 AliEveTRDData.cxx:603
 AliEveTRDData.cxx:604
 AliEveTRDData.cxx:605
 AliEveTRDData.cxx:606
 AliEveTRDData.cxx:607
 AliEveTRDData.cxx:608
 AliEveTRDData.cxx:609
 AliEveTRDData.cxx:610
 AliEveTRDData.cxx:611
 AliEveTRDData.cxx:612
 AliEveTRDData.cxx:613
 AliEveTRDData.cxx:614
 AliEveTRDData.cxx:615
 AliEveTRDData.cxx:616
 AliEveTRDData.cxx:617
 AliEveTRDData.cxx:618
 AliEveTRDData.cxx:619
 AliEveTRDData.cxx:620
 AliEveTRDData.cxx:621
 AliEveTRDData.cxx:622
 AliEveTRDData.cxx:623
 AliEveTRDData.cxx:624
 AliEveTRDData.cxx:625
 AliEveTRDData.cxx:626
 AliEveTRDData.cxx:627
 AliEveTRDData.cxx:628
 AliEveTRDData.cxx:629
 AliEveTRDData.cxx:630
 AliEveTRDData.cxx:631
 AliEveTRDData.cxx:632
 AliEveTRDData.cxx:633
 AliEveTRDData.cxx:634
 AliEveTRDData.cxx:635
 AliEveTRDData.cxx:636
 AliEveTRDData.cxx:637
 AliEveTRDData.cxx:638
 AliEveTRDData.cxx:639
 AliEveTRDData.cxx:640
 AliEveTRDData.cxx:641
 AliEveTRDData.cxx:642
 AliEveTRDData.cxx:643
 AliEveTRDData.cxx:644
 AliEveTRDData.cxx:645
 AliEveTRDData.cxx:646
 AliEveTRDData.cxx:647
 AliEveTRDData.cxx:648
 AliEveTRDData.cxx:649
 AliEveTRDData.cxx:650
 AliEveTRDData.cxx:651
 AliEveTRDData.cxx:652
 AliEveTRDData.cxx:653
 AliEveTRDData.cxx:654
 AliEveTRDData.cxx:655
 AliEveTRDData.cxx:656
 AliEveTRDData.cxx:657
 AliEveTRDData.cxx:658
 AliEveTRDData.cxx:659
 AliEveTRDData.cxx:660
 AliEveTRDData.cxx:661
 AliEveTRDData.cxx:662
 AliEveTRDData.cxx:663
 AliEveTRDData.cxx:664
 AliEveTRDData.cxx:665
 AliEveTRDData.cxx:666
 AliEveTRDData.cxx:667
 AliEveTRDData.cxx:668
 AliEveTRDData.cxx:669
 AliEveTRDData.cxx:670
 AliEveTRDData.cxx:671
 AliEveTRDData.cxx:672
 AliEveTRDData.cxx:673
 AliEveTRDData.cxx:674
 AliEveTRDData.cxx:675
 AliEveTRDData.cxx:676
 AliEveTRDData.cxx:677
 AliEveTRDData.cxx:678
 AliEveTRDData.cxx:679
 AliEveTRDData.cxx:680
 AliEveTRDData.cxx:681
 AliEveTRDData.cxx:682
 AliEveTRDData.cxx:683
 AliEveTRDData.cxx:684
 AliEveTRDData.cxx:685
 AliEveTRDData.cxx:686
 AliEveTRDData.cxx:687
 AliEveTRDData.cxx:688
 AliEveTRDData.cxx:689
 AliEveTRDData.cxx:690
 AliEveTRDData.cxx:691
 AliEveTRDData.cxx:692
 AliEveTRDData.cxx:693
 AliEveTRDData.cxx:694
 AliEveTRDData.cxx:695
 AliEveTRDData.cxx:696
 AliEveTRDData.cxx:697
 AliEveTRDData.cxx:698
 AliEveTRDData.cxx:699
 AliEveTRDData.cxx:700
 AliEveTRDData.cxx:701
 AliEveTRDData.cxx:702
 AliEveTRDData.cxx:703
 AliEveTRDData.cxx:704
 AliEveTRDData.cxx:705
 AliEveTRDData.cxx:706
 AliEveTRDData.cxx:707
 AliEveTRDData.cxx:708
 AliEveTRDData.cxx:709
 AliEveTRDData.cxx:710
 AliEveTRDData.cxx:711
 AliEveTRDData.cxx:712
 AliEveTRDData.cxx:713
 AliEveTRDData.cxx:714
 AliEveTRDData.cxx:715
 AliEveTRDData.cxx:716
 AliEveTRDData.cxx:717
 AliEveTRDData.cxx:718
 AliEveTRDData.cxx:719
 AliEveTRDData.cxx:720
 AliEveTRDData.cxx:721
 AliEveTRDData.cxx:722
 AliEveTRDData.cxx:723
 AliEveTRDData.cxx:724
 AliEveTRDData.cxx:725
 AliEveTRDData.cxx:726
 AliEveTRDData.cxx:727
 AliEveTRDData.cxx:728
 AliEveTRDData.cxx:729
 AliEveTRDData.cxx:730
 AliEveTRDData.cxx:731
 AliEveTRDData.cxx:732
 AliEveTRDData.cxx:733
 AliEveTRDData.cxx:734
 AliEveTRDData.cxx:735
 AliEveTRDData.cxx:736
 AliEveTRDData.cxx:737
 AliEveTRDData.cxx:738
 AliEveTRDData.cxx:739
 AliEveTRDData.cxx:740
 AliEveTRDData.cxx:741
 AliEveTRDData.cxx:742
 AliEveTRDData.cxx:743
 AliEveTRDData.cxx:744
 AliEveTRDData.cxx:745
 AliEveTRDData.cxx:746
 AliEveTRDData.cxx:747
 AliEveTRDData.cxx:748
 AliEveTRDData.cxx:749
 AliEveTRDData.cxx:750
 AliEveTRDData.cxx:751
 AliEveTRDData.cxx:752
 AliEveTRDData.cxx:753
 AliEveTRDData.cxx:754
 AliEveTRDData.cxx:755
 AliEveTRDData.cxx:756
 AliEveTRDData.cxx:757
 AliEveTRDData.cxx:758
 AliEveTRDData.cxx:759
 AliEveTRDData.cxx:760
 AliEveTRDData.cxx:761
 AliEveTRDData.cxx:762
 AliEveTRDData.cxx:763
 AliEveTRDData.cxx:764
 AliEveTRDData.cxx:765
 AliEveTRDData.cxx:766
 AliEveTRDData.cxx:767
 AliEveTRDData.cxx:768
 AliEveTRDData.cxx:769
 AliEveTRDData.cxx:770
 AliEveTRDData.cxx:771
 AliEveTRDData.cxx:772
 AliEveTRDData.cxx:773
 AliEveTRDData.cxx:774
 AliEveTRDData.cxx:775
 AliEveTRDData.cxx:776
 AliEveTRDData.cxx:777
 AliEveTRDData.cxx:778
 AliEveTRDData.cxx:779
 AliEveTRDData.cxx:780
 AliEveTRDData.cxx:781
 AliEveTRDData.cxx:782
 AliEveTRDData.cxx:783
 AliEveTRDData.cxx:784
 AliEveTRDData.cxx:785
 AliEveTRDData.cxx:786
 AliEveTRDData.cxx:787
 AliEveTRDData.cxx:788
 AliEveTRDData.cxx:789
 AliEveTRDData.cxx:790
 AliEveTRDData.cxx:791
 AliEveTRDData.cxx:792
 AliEveTRDData.cxx:793
 AliEveTRDData.cxx:794
 AliEveTRDData.cxx:795
 AliEveTRDData.cxx:796
 AliEveTRDData.cxx:797