ROOT logo
///////////////////////////////////////////////////////
//
// Basic class for Performance/Calibration TRD tasks
// 
// It performs generic tasks like :
//   - data file manegment
//   - reference container management
//   - debug container management
//   - interaction with AliAnalysisManager
//   - Plot functor loop
//
// Author: Alexandru Bercuci <A.Bercuci@gsi.de>, 10/09/2008
//
/////////////////////////////////////////////////////////

#include "TClass.h"
#include "TMethod.h"
#include "TMethodCall.h"
#include "TMethodArg.h"
#include "TFile.h"
#include "TChain.h"
#include "TList.h"
#include "TMap.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3.h"
#include "TF1.h"
#include "TObjArray.h"
#include "TDirectory.h"
#include "TTreeStream.h"
#include "TBox.h"
#include "TLatex.h"
#include "TVectorT.h"

#include "AliLog.h"
#include "AliAnalysisTask.h"
#include "AliAnalysisManager.h"
#include "AliExternalTrackParam.h"

#include "info/AliTRDchmbInfo.h"
#include "info/AliTRDeventInfo.h"
#include "info/AliTRDtrendingManager.h"
#include "AliTRDrecoTask.h"
#include "AliTRDtrackV1.h"
#include "AliTRDpidUtil.h"

ClassImp(AliTRDrecoTask)

Float_t AliTRDrecoTask::fgPt[AliTRDrecoTask::fgNPt+1] = {0.};
TTreeSRedirector* AliTRDrecoTask::fgDebugStream(NULL);
TH1* AliTRDrecoTask::fgProjector(NULL);
//_______________________________________________________
AliTRDrecoTask::AliTRDrecoTask()
  : AliAnalysisTaskSE()
  ,fNRefFigures(0)
  ,fDets(NULL)
  ,fDetsV(NULL)
  ,fContainer(NULL)
  ,fEvent(NULL)
  ,fTracks(NULL)
  ,fClusters(NULL)
  ,fkClusters(NULL)
  ,fkTrack(NULL)
  ,fkMC(NULL)
  ,fkESD(NULL)
  ,fSpecies(-6)
  ,fTriggerSlot(0)
  ,fPt(-1.)
  ,fPhi(0.)
  ,fEta(0.)
  ,fNpt(0)
  ,fTriggerList(NULL)
  ,fPlotFuncList(NULL)
  ,fDetFuncList(NULL)
  ,fRunTerminate(kFALSE)
{
// Default constructor
  snprintf(fNameId, 10, "no name");
}

//_______________________________________________________
AliTRDrecoTask::AliTRDrecoTask(const char *name, const char *title)
  : AliAnalysisTaskSE(name)
  ,fNRefFigures(0)
  ,fDets(NULL)
  ,fDetsV(NULL)
  ,fContainer(NULL)
  ,fEvent(NULL)
  ,fTracks(NULL)
  ,fClusters(NULL)
  ,fkClusters(NULL)
  ,fkTrack(NULL)
  ,fkMC(NULL)
  ,fkESD(NULL)
  ,fSpecies(-6)
  ,fTriggerSlot(0)
  ,fPt(-1.)
  ,fPhi(0.)
  ,fEta(0.)
  ,fNpt(0)
  ,fTriggerList(NULL)
  ,fPlotFuncList(NULL)
  ,fDetFuncList(NULL)
  ,fRunTerminate(kFALSE)
{
// Constructor for all derived performance tasks

  SetTitle(title);
  snprintf(fNameId, 10, "no name");
  DefineInput (1, TObjArray::Class()); // track list
  DefineInput (2, AliTRDeventInfo::Class()); // event info object
  DefineInput (3, TObjArray::Class()); // cluster list object
  DefineOutput(1, TObjArray::Class()); // histogram list
}

//_______________________________________________________
AliTRDrecoTask::~AliTRDrecoTask() 
{

  // Generic task destructor

  AliDebug(2, Form(" Ending task %s[%s]", GetName(), GetTitle()));
 if(fgDebugStream){
    delete fgDebugStream;
    fgDebugStream = NULL;
  }

  if(fgProjector){
    delete fgProjector;
    fgProjector = NULL;
  }

  if(fPlotFuncList){
    fPlotFuncList->Delete();
    delete fPlotFuncList;
    fPlotFuncList = NULL;
  }
  if(fDetFuncList){
    fDetFuncList->Delete();
    delete fDetFuncList;
    fDetFuncList = NULL;
  }
  
  if(fDets){
    if(fDets->IsOwner()) fDets->Delete();
    delete fDets;
    fDets = NULL;
  }
  if(fDetsV) delete fDetsV; fDetsV=NULL;
  if(fTriggerList){fTriggerList->Delete(); delete fTriggerList;}

  if(fContainer && !(AliAnalysisManager::GetAnalysisManager() && AliAnalysisManager::GetAnalysisManager()->IsProofMode())){
    if(fContainer->IsOwner()) fContainer->Delete();
    delete fContainer;
    fContainer = NULL;
  }

/*  if(fgTrendPoint){
    TFile::Open("TRD.PerformanceTrend.root", "UPDATE");
    fgTrendPoint->Write();
    delete fgTrendPoint;
    fgTrendPoint=NULL;
    gFile->Close();
  }*/
}

//_______________________________________________________
Int_t AliTRDrecoTask::GetNRefFigures() const  
{ 
  if(!fNRefFigures) AliWarning("No reference plots available.");
  return fNRefFigures; 
} 

//____________________________________________________________________
Int_t AliTRDrecoTask::GetPtBin(Float_t pt)
{
// Get significant (very low, low, medium, high, very high) pt bin

  Int_t ipt(0);
  while(ipt<fNpt){
    if(pt<fgPt[ipt]) break;
    ipt++;
  }
  return ipt-1;
}

//_______________________________________________________
Bool_t AliTRDrecoTask::MakeMomSegmentation()
{
  switch(fNpt){
  case fgNPt:
    fgPt[0]=0.3;
    for(Int_t j(1); j<=fgNPt; j++) fgPt[j]=fgPt[j-1]+(TMath::Exp(j*j*2.e-3)-1.);
    AliDebug(2, "Using debug momentum segmentation");
    break;
  case 4:
    fgPt[0]=0.5; fgPt[1]=0.8; fgPt[2]=1.5; fgPt[3]=5.;
    AliDebug(2, "Using default momentum segmentation");
    break;
  default:
    AliError(Form("Momentum segmentation %d not supported.", fNpt));
    fNpt=0;
    return kFALSE;
  }
  return kTRUE;
}

//_______________________________________________________
void AliTRDrecoTask::UserCreateOutputObjects()
{
  if(!HasFunctorList()) InitFunctorList();
  if(DebugLevel()) fNpt = fgNPt;
  else fNpt = 4;
  MakeMomSegmentation();

  fContainer = Histos();
  PostData(1, fContainer);
}

//_______________________________________________________
void AliTRDrecoTask::UserExec(Option_t *)
{
// Loop over Plot functors published by particular tasks

  fTracks   = dynamic_cast<TObjArray *>(GetInputData(1));
  fEvent    = dynamic_cast<AliTRDeventInfo *>(GetInputData(2));
  fTriggerSlot=0;
  if(fTriggerList && fEvent){
    for(Int_t itrig(0); itrig<fTriggerList->GetEntries(); itrig++){
      if(!fEvent->GetFiredTriggerClasses().Contains(((TObjString*)(*fTriggerList)[itrig])->GetName())) continue;
      //printf("\"%s\" selected\n", ((TObjString*)(*fTriggerList)[itrig])->GetName());
      SETBIT(fTriggerSlot,itrig);
    }
    if(!fTriggerSlot){
      AliDebug(2, Form("Triggers[%s] not used for %s", fEvent->GetFiredTriggerClasses().Data(),  GetName()));
      return;
    }
  }
  fClusters = dynamic_cast<TObjArray*>(GetInputData(3));

  if(!fPlotFuncList){
    AliWarning("No track functor list defined for the task");
    return;
  }
  if(!fEvent || !fTracks) return;
  if(!fTracks->GetEntriesFast()) return;
  else AliDebug(2, Form("Tracks[%d] for %s", fTracks->GetEntriesFast(), GetName()));

  Int_t itrk(-1);
  AliTRDtrackInfo *trackInfo(NULL);
  TIter plotIter(fPlotFuncList);
  TObjArrayIter trackIter(fTracks);
  while((trackInfo = dynamic_cast<AliTRDtrackInfo*>(trackIter()))){
    itrk++; fPt=-1; fEta=0.; fPhi=0.; fSpecies=-6;
    fkMC    = trackInfo->GetMCinfo();
    fkESD   = trackInfo->GetESDinfo();
    if((fkTrack = trackInfo->GetTrack())){
      // cache properties of the track at TRD entrance
      // check input track status
      AliExternalTrackParam *tin(NULL);
      if(!(tin = fkTrack->GetTrackIn())) AliDebug(2, Form("Missing TRD track[%d] :: entry point.", itrk));
      else {
        fPt   = tin->Pt();
        fEta  = tin->Eta();
        Double_t xyz[3];
        if(!tin->GetXYZ(xyz)) AliDebug(2, Form("Failed TRD track[%d] :: global track postion", itrk));
        else fPhi  = TMath::ATan2(xyz[1], xyz[0]);
        fSpecies= fkTrack->Charge()*(AliTRDpidUtil::Mass2Pid(fkTrack->GetMass())+1);
      }
    } else AliDebug(2, Form("Missing TRD track[%d].", itrk));

    TMethodCall *plot(NULL);
    plotIter.Reset();
    while((plot=dynamic_cast<TMethodCall*>(plotIter()))) plot->Execute(this);
  }
  if(!fClusters) return;
  if(!fDetFuncList){
    AliDebug(1, "No detector functor list defined for task");
    return;
  }
  TIter detIter(fDetFuncList);
  for(Int_t idet(0); idet<AliTRDgeometry::kNdet; idet++){
    if(!(fkClusters = (TObjArray*)fClusters->At(idet))) continue;
    TMethodCall *det(NULL);
    detIter.Reset();
    while((det=dynamic_cast<TMethodCall*>(detIter()))) det->Execute(this);
  }
}

//_______________________________________________________
Bool_t AliTRDrecoTask::GetRefFigure(Int_t /*ifig*/)
{
  AliWarning("Retrieving reference figures not implemented.");
  return kFALSE;
}

//_______________________________________________________
Bool_t AliTRDrecoTask::PutTrendValue(const Char_t *name, Double_t val, Double_t err)
{
// Generic publisher for trend values

  AliTRDtrendingManager *tm = AliTRDtrendingManager::Instance();
  if(!tm){
    AliError("Wrong usage of the trending functionality. Could not instantiate AliTRDtrendingManager singleton.");
    return kFALSE;
  }
  tm->AddValue(Form("%s_%s", GetName(), name), val, err);
  return kTRUE;
}

//_______________________________________________________
void AliTRDrecoTask::InitFunctorList()
{
// Initialize list of functors

  TClass *c = this->IsA();
  if(fPlotFuncList) fPlotFuncList->Clear();
  if(fDetFuncList) fDetFuncList->Clear();

  TMethod *m(NULL);
  TIter methIter(c->GetListOfMethods());
  while((m=dynamic_cast<TMethod*>(methIter()))){
    TString name(m->GetName());
    if(name.BeginsWith("Plot")){
      if(!fPlotFuncList) fPlotFuncList = new TList();
      fPlotFuncList->AddLast(new TMethodCall(c, (const char*)name, ""));
    } else if(name.BeginsWith("Det")){
      if(!fDetFuncList) fDetFuncList = new TList();
      fDetFuncList->AddLast(new TMethodCall(c, (const char*)name, ""));
    }
  }
}

//_______________________________________________________
Bool_t AliTRDrecoTask::Load(const Char_t *file, const Char_t *dir)
{
// Generic container loader

  if(!TFile::Open(file)){
    AliWarning(Form("Couldn't open file %s.", file));
    return kFALSE;
  }
  if(!gFile->cd(dir)){
    AliWarning(Form("Couldn't cd to %s in %s.", dir, file));
    gFile->Close();
    return kFALSE;
  }
  if(!(fContainer = (TObjArray*)gDirectory->Get(GetName()))){
    AliWarning("Missing histogram container.");
    gFile->Close();
    return kFALSE;
  }
  gFile->Close();
  return kTRUE;
}

//________________________________________________________
Bool_t AliTRDrecoTask::LoadDetectorMap(const Char_t *file, const Char_t *dir)
{
// Load detector map.

  if(!TFile::Open(file)){
    AliWarning(Form("Couldn't open file %s.", file));
    return kFALSE;
  }
  if(!gFile->cd(dir)){
    AliWarning(Form("Couldn't cd to %s in %s.", dir, file));
    gFile->Close();
    return kFALSE;
  }
  TObjArray *info = NULL;
  if(!(info = (TObjArray*)gDirectory->Get("TRDinfoGen"))){
    AliWarning("Missing TRDinfoGen container.");
    gFile->Close();
    return kFALSE;
  }

  if(info->FindObject("Chambers Status"))
    fDets = (TObjArray*)((TObjArray*)info->FindObject("Chambers Status"))->Clone();

  if(!fDets){
    if(!info->At(4) || strcmp("TObjArray", info->At(4)->IsA()->GetName())) AliError("Looking for old style chamber status map. Failed.");
    else {
      AliWarning("Looking for old style chamber status map.");
      fDetsV = (TObjArray*)((TObjArray*)info->At(4))->Clone();
    }
  }
  gFile->Close();
  info->Delete(); delete info;
  return kTRUE;
}


//________________________________________________________
Bool_t AliTRDrecoTask::Save(TObjArray * const results){
  //
  // Store the output graphs in a ROOT file
  // Input TObject array will not be written as Key to the file,
  // only content itself
  //

  TDirectory *cwd = gDirectory;
  if(!TFile::Open(Form("TRD.Result%s.root", GetName()), "RECREATE")) return kFALSE;

  TIterator *iter = results->MakeIterator();
  TObject *inObject = NULL, *outObject = NULL;
  while((inObject = iter->Next())){
    outObject = inObject->Clone();
    outObject->Write(NULL, TObject::kSingleKey);
  }
  delete iter;
  gFile->Close(); delete gFile;
  cwd->cd(); 
  return kTRUE;
}

//_______________________________________________________
Bool_t AliTRDrecoTask::PostProcess()
{
// To be implemented by particular tasks

  AliWarning("Post processing of reference histograms not implemented.");
  return kTRUE;
}

//_______________________________________________________
void AliTRDrecoTask::MakeDetectorPlot(Int_t ly, const Option_t *opt)
{
// Draw chamber boundaries in eta/phi plots with misalignments
// based on info collected by AliTRDinfoGen

  if(!fDets){
    AliWarning("NEW Detector map and status not available. Try OLD");
    MakeDetectorPlotOLD(ly, opt);
    return;
  }
  AliTRDchmbInfo *ci(NULL);
  for(Int_t idet(0); idet<fDets->GetEntriesFast(); idet++){
    if(!(ci = (AliTRDchmbInfo*)fDets->At(idet))) continue;
    if(AliTRDgeometry::GetLayer(ci->GetDetector()) != ly) continue;
    ci->Draw(opt);
  }
}

//_______________________________________________________
void AliTRDrecoTask::MakeDetectorPlotOLD(Int_t ly, const Option_t *opt)
{
// Draw chamber boundaries in eta/phi plots with misalignments
// based on info collected by AliTRDinfoGen OLD data storage

  if(!fDetsV){
    AliError("OLD Detector map and status not available.");
    return;
  }
  if(!fDetsV->GetEntries()){
    AliError("OLD Detector map and status not filled.");
    return;
  }

  Float_t xmin(0.), xmax(0.);
  TBox *gdet = new TBox();
  gdet->SetLineColor(kBlack);gdet->SetFillColor(kBlack);
  Int_t style[] = {0, 3003};
  for(Int_t idet(0); idet<540; idet++){
    if(idet%6 != ly) continue;
    TVectorF *det((TVectorF*)fDetsV->At(idet));
    if(!det) continue;
    Int_t iopt = Int_t((*det)[4]);
    if(strcmp(opt, "eta")==0){
      xmin=(*det)[0]; xmax=(*det)[2];
    } else if(strcmp(opt, "pad")==0){
      Int_t stk(AliTRDgeometry::GetStack(idet));
      xmin=-0.6+16*(4-stk)-(stk<2?4:0); xmax=xmin+(stk==2?12:16)-0.2;
    } else continue;
    AliDebug(2, Form("det[%03d] 0[%+4.1f(%+4.1f) %+4.1f] 1[%+4.1f(%+4.1f) %+4.1f] opt[%d]", idet, xmin, (*det)[0], (*det)[1], xmax, (*det)[2], (*det)[3], iopt));
    if(iopt==1){
      gdet->SetFillStyle(style[1]);gdet->SetFillColor(kBlack);
      gdet->DrawBox(xmin, (*det)[1], xmax, (*det)[3]);
    } else {
      gdet->SetFillStyle(style[0]);
      gdet->DrawBox(xmin, (*det)[1], xmax, (*det)[3]);
      if(iopt==2){
        gdet->SetFillStyle(style[1]);gdet->SetFillColor(kGreen);
        gdet->DrawBox(xmin, (*det)[1], xmax, 0.5*((*det)[3]+(*det)[1]));
      } else if(iopt==3){
        gdet->SetFillStyle(style[1]);gdet->SetFillColor(kRed);
        gdet->DrawBox(xmin, 0.5*((*det)[3]+(*det)[1]), xmax, (*det)[3]);
      } else if(iopt!=0) AliError(Form("Wrong chmb. status[%d] for det[%03d]", iopt, idet));
    }
  }
  Float_t dsm = TMath::TwoPi()/AliTRDgeometry::kNsector;
  xmin=0.;
  if(strcmp(opt, "pad")==0) xmin=38.;
  TLatex *sm = new TLatex(); sm->SetTextAlign(22);sm->SetTextColor(kBlack); sm->SetTextFont(32);sm->SetTextSize(0.03);
  for(Int_t is(0); is<AliTRDgeometry::kNsector; is++) sm->DrawLatex(xmin, -TMath::Pi()+(is+0.5)*dsm, Form("%02d", is>=9?(is-9):(is+9)));
}


//_______________________________________________________
void AliTRDrecoTask::MakeSummary()
{
// To be implemented by particular tasks
  AliWarning("Summary not available");
}

//_______________________________________________________
void AliTRDrecoTask::SetDebugLevel(Int_t level)
{
// Generic debug handler

  AliAnalysisTaskSE::SetDebugLevel(level);
  if(DebugLevel()>=1 && !fgDebugStream){
    AliInfo(Form("Debug Level for Task %s set to %d", GetName(), level));
    TDirectory *savedir = gDirectory;
    fgDebugStream = new TTreeSRedirector("TRD.DebugPerformance.root", "RECREATE");
    savedir->cd();
  }
}

//____________________________________________________________________
void AliTRDrecoTask::Terminate(Option_t *)
{
  //
  // Terminate
  //

  if(fgDebugStream){ 
    delete fgDebugStream;
    fgDebugStream = NULL;
  }
  fContainer = dynamic_cast<TObjArray *>(GetOutputData(1));
  if(fContainer && fRunTerminate){
    PostProcess();
    MakeSummary();
  }
}

//________________________________________________________
Float_t AliTRDrecoTask::SetNormZ(TH2 *h2, Int_t bxmin, Int_t bxmax, Int_t bymin, Int_t bymax, Float_t thr)
{
// Normalize histo content to the mean value in the range specified by bin ranges
// [bxmin, bxmax] on the x axis and [bymin, bymax] on the y axis.
// Optionally a threshold "thr" can be specified to disregard entries with no meaning

  Float_t s = 0., c=0.; Int_t is(0);
  for(Int_t ix(bxmin); ix<=(bxmax>0?bxmax:(h2->GetXaxis()->GetNbins())); ix++){
    for(Int_t iy(bymin); iy<=(bymax>0?bymax:(h2->GetYaxis()->GetNbins())); iy++){
      if((c = h2->GetBinContent(ix, iy))<thr) continue;
      s += c; is++;
    }
  }
  s/= (is?is:1);
  for(Int_t ix(1); ix<=h2->GetXaxis()->GetNbins(); ix++){
    for(Int_t iy(1); iy<=h2->GetYaxis()->GetNbins(); iy++){
      if((c = h2->GetBinContent(ix, iy))<thr) h2->SetBinContent(ix, iy, thr-1000);
      else h2->SetBinContent(ix, iy, 100.*(c/s-1.));
    }
  }
  return s;
}

//________________________________________________________
void AliTRDrecoTask::SetRangeZ(TH2 *h2, Float_t min, Float_t max, Float_t thr)
{
// Set range on Z axis such to avoid outliers

  Float_t c(0.), dz(1.e-3*(max-min));
  for(Int_t ix(1); ix<=h2->GetXaxis()->GetNbins(); ix++){
    for(Int_t iy(1); iy<=h2->GetYaxis()->GetNbins(); iy++){
      if((c = h2->GetBinContent(ix, iy))<thr) continue;
      if(c<=min) h2->SetBinContent(ix, iy, min+dz);
    }
  }
  h2->GetZaxis()->SetRangeUser(min, max);
}

//________________________________________________________
Float_t AliTRDrecoTask::GetMeanStat(TH1 *h, Float_t cut, Int_t opt, Float_t *sigma)
{
// Return mean number of entries/bin of histogram "h".
// If optionally sigma is allocated than it is also filled with sigma paramter of the gauss fit 
//
// Option "opt" is given the following values are accepted:
//   -1 : consider only entries less than "cut"
//   1  : consider only entries greater than "cut"
//   0  : no "cut" [dafault]
// Error codes
//   -999. : statistics too low [20]
//   -998. : fit failed

  const Int_t kvd(100000);
  Float_t v[kvd];
  Int_t nbx(h->GetNbinsX()), nby(h->GetNbinsY()), nbz(h->GetNbinsZ());
  Int_t nv(0); Float_t xmin(1.e5), xmax(-xmin);
  for(Int_t ix(1); ix<=nbx; ix++){
    for(Int_t iy(1); iy<=nby; iy++){
      for(Int_t iz(1); iz<=nbz; iz++){
        Float_t c = h->GetBinContent(ix, iy, iz);
        if(opt*(c-cut)<0.) continue;
        v[nv++] = c;
        if(c<xmin) xmin = c;
        if(c>xmax) xmax = c;
        if(nv==kvd){
          printf("W - AliTRDrecoTask::GetMeanStat() :: Unreliable results for %s[%s]. Statical allocation exceeded.\n", h->GetName(), h->GetTitle());
          break;
        }
      }
      if(nv==kvd) break;
    }
    if(nv==kvd) break;
  }
  if(nv<10){
    //printf("W - AliTRDrecoTask::GetMeanStat() :: Failed for %s[%s]. Statical undefined [%d].\n", h->GetName(), h->GetTitle(), nv);
    return -999.;
  }
  if(fgProjector) delete fgProjector;
  fgProjector = new TH1F("hProjector", "", 20, 0.5*(3*xmin-xmax), 0.5*(3*xmax - xmin));
  for(Int_t iv(0); iv<nv; iv++) fgProjector->Fill(v[iv]);
  TF1 f("f", "gaus", xmin, xmax);
  f.SetParameter(0, fgProjector->Integral());
  f.SetParameter(1, fgProjector->GetMean()); f.SetParLimits(1, xmin, xmax);
  f.SetParameter(2, fgProjector->GetRMS());
  if(fgProjector->Fit(&f, "WQ0", "goff")) return -998.;
  if(sigma) *sigma = f.GetParameter(2);
  return f.GetParameter(1);
}

//________________________________________________________
Int_t AliTRDrecoTask::Rebin(TH2 *h, Int_t n, Int_t rebinX[], Int_t rebinY[], Int_t nstat)
{
// Rebin histo "h" according to "rebinning" strategy "n" steps such to obtain mean statistics per bin over "nstat"

  Int_t irebin(0);
  while(irebin<n && GetMeanStat(h, .5, 1)<nstat){
    h->Rebin2D(rebinX[irebin], rebinY[irebin]);
    irebin++;
  }
  return irebin;
}

//________________________________________________________
AliTRDrecoTask::AliTRDrecoProjection::AliTRDrecoProjection()
  :TNamed()
  ,fH(NULL)
  ,fNrebin(0)
{
  // constructor
  fRebin[0] = NULL;fRebin[1] = NULL;
  memset(fAx, 0, 3*sizeof(Int_t));
  memset(fRange, 0, 4*sizeof(Float_t));
}

//________________________________________________________
AliTRDrecoTask::AliTRDrecoProjection::~AliTRDrecoProjection()
{
  // destructor
  if(fH) delete fH;
  if(fRebin[0]) delete [] fRebin[0];
  if(fRebin[1]) delete [] fRebin[1];
}

//________________________________________________________
void AliTRDrecoTask::AliTRDrecoProjection::Build(const Char_t *n, const Char_t *t, Int_t ix, Int_t iy, Int_t iz, TAxis *aa[])
{
// check and build (if neccessary) projection determined by axis "ix", "iy" and "iz"
  if(!aa[ix] || !aa[iy] || !aa[iz]) return;
  TAxis *ax(aa[ix]), *ay(aa[iy]), *az(aa[iz]);
  // check ax definiton to protect against older versions of the data
  if(ax->GetNbins()<=0 || (ax->GetXmax()-ax->GetXmin())<=0.){
    AliWarning(Form("Wrong definition of axis[%d] \"%s\"[%d](%f %f).", ix, ax->GetTitle(), ax->GetNbins(), ax->GetXmin(), ax->GetXmax()));
    return;
  }
  if(ay->GetNbins()<=0 || (ay->GetXmax()-ay->GetXmin())<=0.){
    AliWarning(Form("Wrong definition of axis[%d] \"%s\"[%d](%f %f).", ix, ay->GetTitle(), ay->GetNbins(), ay->GetXmin(), ay->GetXmax()));
    return;
  }
  if(az->GetNbins()<=0 || (az->GetXmax()-az->GetXmin())<=0.){
    AliWarning(Form("Wrong definition of axis[%d] \"%s\"[%d](%f %f).", ix, az->GetTitle(), az->GetNbins(), az->GetXmin(), az->GetXmax()));
    return;
  }
  SetNameTitle(n,t);
  fH = new TH3I(n, Form("%s;%s;%s;%s", t, ax->GetTitle(), ay->GetTitle(), az->GetTitle()),
    ax->GetNbins(), ax->GetXmin(), ax->GetXmax(),
    ay->GetNbins(), ay->GetXmin(), ay->GetXmax(),
    az->GetNbins(), az->GetXmin(), az->GetXmax());
  fAx[0] = ix; fAx[1] = iy; fAx[2] = iz;
  fRange[0] = az->GetXmin()/3.; fRange[1] = az->GetXmax()/3.;
  AliDebug(2, Form("H3(%s, %s) :: %s[%3d %4.2f %4.2f]%s[%3d %4.2f %4.2f]%s[%3d %4.2f %4.2f]", n, t,
    ax->GetTitle(), ax->GetNbins(), ax->GetXmin(), ax->GetXmax(),
    ay->GetTitle(), ay->GetNbins(), ay->GetXmin(), ay->GetXmax(),
    az->GetTitle(), az->GetNbins(), az->GetXmin(), az->GetXmax()));
}

//________________________________________________________
AliTRDrecoTask::AliTRDrecoProjection& AliTRDrecoTask::AliTRDrecoProjection::operator=(const AliTRDrecoProjection& rhs)
{
// copy projections
  if(this == &rhs) return *this;

  TNamed::operator=(rhs);
  if(fNrebin){fNrebin=0; delete [] fRebin[0]; delete [] fRebin[1];}
  if(rhs.fNrebin) SetRebinStrategy(rhs.fNrebin, rhs.fRebin[0], rhs.fRebin[1]);
  memcpy(fAx, rhs.fAx, 3*sizeof(Int_t));
  memcpy(fRange, rhs.fRange, 4*sizeof(Float_t));
  if(fH) delete fH;
  if(rhs.fH) fH=(TH3I*)rhs.fH->Clone(Form("%s_CLONE", rhs.fH->GetName()));
  return *this;
}

//________________________________________________________
AliTRDrecoTask::AliTRDrecoProjection& AliTRDrecoTask::AliTRDrecoProjection::operator+=(const AliTRDrecoProjection& other)
{
// increment projections
  if(!fH || !other.fH) return *this;
  AliDebug(2, Form("%s+=%s [%s+=%s]", GetName(), other.GetName(), fH->GetName(), (other.fH)->GetName()));
  fH->Add(other.fH);
  return *this;
}

//________________________________________________________
void AliTRDrecoTask::AliTRDrecoProjection::Increment(Int_t bin[], Double_t v)
{
// increment bin with value "v" pointed by general coord in "bin"
  if(!fH) return;
  AliDebug(4, Form("  %s[%2d]", fH->GetName(), Int_t(v)));
  fH->AddBinContent(fH->GetBin(bin[fAx[0]],bin[fAx[1]],bin[fAx[2]]), Int_t(v));
}

//________________________________________________________
Double_t AliTRDrecoTask::AliTRDrecoProjection::GetTrendValue(const Int_t mid, Double_t *e, Double_t *s, Double_t *se) const
{
//   Return result of fitting the main distribution (represented on the z axis) with the function selected
// "mid". Optionally return the Mean and RMS of the distribution pointing to "m" and "s"

  if(!fH){
    AliDebug(1, Form("Missing 3D in %s", GetName()));
    return -999.;
  }
  TH1 *h1s(NULL);
  if(!(h1s = (TH1D*)fH->Project3D("z"))){
    AliDebug(1, Form("Failed Project3D(\"z\") in %s", GetName()));
    return -999.;
  }
  Int_t ne((Int_t)h1s->Integral());
  if(ne<30){
    AliDebug(1, Form("Statistics too low[%2d] in %s", ne, GetName()));
    delete h1s;
    return -999.;
  }
  TAxis *az(h1s->GetXaxis());
  Float_t mn(h1s->GetMean()), rms(h1s->GetRMS()),
          v(mn),  // main trending value (mean, mu, MPV)
          ve(rms),// dispersion (RMS, sigma, landau 2nd param)
          ev(h1s->GetMeanError()), // error on v
          eve(h1s->GetRMSError());// error on ve
  if(mid==1){
    TF1 fg("fg", "gaus", az->GetXmin(), az->GetXmax());
    fg.SetParameter(0, Float_t(ne)); fg.SetParameter(1, mn); fg.SetParameter(2, rms);
    h1s->Fit(&fg, "WQ0");
    v = fg.GetParameter(1); ev = fg.GetParError(1);
    ve= fg.GetParameter(2); eve= fg.GetParError(2);
  } else if (mid==2) {
    TF1 fl("fl", "landau", az->GetXmin(), az->GetXmax());
    fl.SetParameter(0, Float_t(ne)); fl.SetParameter(1, mn); fl.SetParameter(2, rms);
    h1s->Fit(&fl, "WQ0");
    v = fl.GetMaximumX(); ev = fl.GetParError(1);
    ve= fl.GetParameter(2);eve= fl.GetParError(2);
  }
  if(e)  *e  = ev;
  if(s)  *s  = ve;
  if(se) *se = eve;
  AliDebug(2, Form("[%d] %s(%4d) = M{%f+-%f} S{%f+-%f}", mid, fH->GetName(), (Int_t)h1s->Integral(), v, ev, ve, eve));

  delete h1s;
  return v;
}

//________________________________________________________
TH2* AliTRDrecoTask::AliTRDrecoProjection::Projection2Dbin(Int_t bin, Bool_t mc)
{
// dumb 2D projection for bin including under/over flow. Default all [bin==-1]

  TAxis *ax(fH->GetXaxis()), *ay(fH->GetYaxis()), *az(fH->GetZaxis());
  Int_t nbins(az->GetNbins());
  TH2F *h2(NULL);
  if(bin<0) h2 = new TH2F(Form("%s_2D", fH->GetName()),
                Form("%s;%s;%s;Entries", fH->GetTitle(), ax->GetTitle(), ay->GetTitle()),
                ax->GetNbins(), ax->GetXmin(), ax->GetXmax(),
                ay->GetNbins(), ay->GetXmin(), ay->GetXmax());
  else h2 = new TH2F(Form("%s%d_2D", fH->GetName(), bin),
                Form("%s | #it{%4.2f<=p_{t}^{%s}[GeV/c]<%4.2f};%s;%s;Entries", fH->GetTitle(),
                bin?fgPt[bin-1]:0., mc?"MC":"", bin>nbins?99.99:fgPt[bin], ax->GetTitle(), ay->GetTitle()),
                ax->GetNbins(), ax->GetXmin(), ax->GetXmax(),
                ay->GetNbins(), ay->GetXmin(), ay->GetXmax());
  for(Int_t ix(1); ix<=ax->GetNbins(); ix++){
    for(Int_t iy(1); iy<=ay->GetNbins(); iy++){
      Int_t ibin = h2->GetBin(ix, iy);
      for(Int_t iz(0); iz<=az->GetNbins()+1; iz++){
        if(bin<0) h2->AddBinContent(ibin, fH->GetBinContent(ix, iy, iz));
        else if(bin==iz){
          h2->AddBinContent(ibin, fH->GetBinContent(ix, iy, iz));
          break;
        }
      }
    }
  }
  return h2;
}

//________________________________________________________
TH2* AliTRDrecoTask::AliTRDrecoProjection::Projection2D(const Int_t nstat, const Int_t ncol, const Int_t mid, Bool_t del)
{
// build the 2D projection and adjust binning

  const Char_t *title[] = {"Mean", "#mu", "MPV"};
  if(!fH){
    AliDebug(1, Form("Missing 3D in %s", GetName()));
    return NULL;
  }
  TAxis *ax(fH->GetXaxis()), *ay(fH->GetYaxis()), *az(fH->GetZaxis());
  TH2D *h2s(NULL), *hyx(NULL);
  if(!(h2s = (TH2D*)fH->Project3D("yx"))){
    AliDebug(1, Form("Failed Project3D(\"yx\") in %s", GetName()));
    return NULL;
  }
  // save a copy of the original distribution
  if(!del){
    hyx = (TH2D*)h2s->Clone();
    hyx->SetName(Form("%sEn", fH->GetName()));
  }
  Int_t irebin(Rebin(h2s, fNrebin, fRebin[0], fRebin[1], nstat)), dxBin(1), dyBin(1);
  for(Int_t ir(0); ir<irebin; ir++){dxBin*=fRebin[0][ir]; dyBin*=fRebin[1][ir];}
  Int_t nx(h2s->GetNbinsX()), ny(h2s->GetNbinsY());
  delete h2s;
  if(mid<0) return NULL;

  // start projection
  TH1 *h(NULL); Int_t n(0);
  Float_t dz=(fRange[1]-fRange[1])/ncol;
  TString titlez(az->GetTitle()); TObjArray *tokenTitle(titlez.Tokenize(" "));
  Int_t nt(tokenTitle->GetEntriesFast());
  TH2 *h2(NULL);
  if((h2 = (TH2*)gDirectory->Get(Form("%s_2D", fH->GetName())))) delete h2; // avoid ROOT warning messages
  h2 = new TH2F(Form("%s_2D", fH->GetName()),
            Form("%s;%s;%s;%s(%s) %s", fH->GetTitle(), ax->GetTitle(), ay->GetTitle(), title[mid], nt>0?(*tokenTitle)[0]->GetName():"", nt>1?(*tokenTitle)[1]->GetName():""),
            nx, ax->GetXmin(), ax->GetXmax(), ny, ay->GetXmin(), ay->GetXmax());
  tokenTitle->Delete(); delete tokenTitle;
  h2->SetContour(ncol);
  h2->GetZaxis()->CenterTitle();
  h2->GetZaxis()->SetTitleOffset(1.4);
  h2->GetZaxis()->SetRangeUser(fRange[0], fRange[1]);
  AliDebug(2, Form("%s[%s] nx[%d] ny[%d]", h2->GetName(), h2->GetTitle(), nx, ny));
  for(Int_t iy(0); iy<ny; iy++){
    for(Int_t ix(0); ix<nx; ix++){
      h = fH->ProjectionZ(Form("%s_z", h2->GetName()), ix*dxBin+1, (ix+1)*dxBin, iy*dyBin+1, (iy+1)*dyBin);
      Int_t ne((Int_t)h->Integral());
      //printf("  x[%2d %2d] y[%2d %2d] ne[%4d]\n", ix*dxBin+1, (ix+1)*dxBin, iy*dyBin+1, (iy+1)*dyBin, ne);
      if(ne<nstat/2){
        h2->SetBinContent(ix+1, iy+1, -999);
        h2->SetBinError(ix+1, iy+1, 1.);
        n++;
      }else{
        // redo the projection by adding 1 bin @ left and 1 bin @ right for smoothing
        h = fH->ProjectionZ(Form("%s_z", h2->GetName()), ix*dxBin, (ix+1)*dxBin+1, iy*dyBin, (iy+1)*dyBin+1);
        Float_t v(h->GetMean()), ve(h->GetRMS());
        if(mid==1){
          TF1 fg("fg", "gaus", az->GetXmin(), az->GetXmax());
          fg.SetParameter(0, Float_t(ne)); fg.SetParameter(1, v); fg.SetParameter(2, ve);
          h->Fit(&fg, "WQ0");
          v = fg.GetParameter(1); ve = fg.GetParameter(2);
        } else if (mid==2) {
          TF1 fl("fl", "landau", az->GetXmin(), az->GetXmax());
          fl.SetParameter(0, Float_t(ne)); fl.SetParameter(1, v); fl.SetParameter(2, ve);
          h->Fit(&fl, "WQ0");
          v = fl.GetMaximumX(); ve = fl.GetParameter(2);
/*          TF1 fgle("gle", "[0]*TMath::Landau(x, [1], [2], 1)*TMath::Exp(-[3]*x/[1])", az->GetXmin(), az->GetXmax());
          fgle.SetParameter(0, fl.GetParameter(0));
          fgle.SetParameter(1, fl.GetParameter(1));
          fgle.SetParameter(2, fl.GetParameter(2));
          fgle.SetParameter(3, 1.);fgle.SetParLimits(3, 0., 5.);
          h->Fit(&fgle, "WQ");
          v = fgle.GetMaximumX(); ve = fgle.GetParameter(2);*/
        }
        if(v<fRange[0]) h2->SetBinContent(ix+1, iy+1, fRange[0]+0.1*dz);
        else h2->SetBinContent(ix+1, iy+1, v);
        h2->SetBinError(ix+1, iy+1, ve);
      }
    }
  }
  if(h) delete h;
  if(n==nx*ny){  // clean empty projections
    AliDebug(1, Form("Empty projection in %s", GetName()));
    delete h2; h2=NULL;
  }
  return h2;
}

//________________________________________________________
void AliTRDrecoTask::AliTRDrecoProjection::SetRebinStrategy(Int_t n, Int_t rebx[], Int_t reby[])
{
// define rebinning strategy for this projection
  fNrebin = n;
  fRebin[0] = new Int_t[n]; memcpy(fRebin[0], rebx, n*sizeof(Int_t));
  fRebin[1] = new Int_t[n]; memcpy(fRebin[1], reby, n*sizeof(Int_t));
}

//________________________________________________________
void AliTRDrecoTask::SetTriggerList(const Char_t *tl)
{
// Store list of triggers to be monitored
  TString stl(tl);
  if(fTriggerList){ fTriggerList->Delete(); delete fTriggerList;}
  TObjArray *atl = stl.Tokenize(" ");
  fTriggerList = (TObjArray*)atl->Clone("");
  atl->Delete(); delete atl;
  AliInfo("Running only for triggers::");
  fTriggerList->Print();
}


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