ROOT logo
/*************************************************************************
* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

///////////////////////////////////////////////////////////////////////////
//       Dielectron Correction framework draw helper                     //
//                                                                       //
/*









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

#include <TSeqCollection.h>
#include <TObjArray.h>
#include <TKey.h>
#include <TList.h>
#include <TClass.h>
#include <TObject.h>
#include <TVirtualPS.h>
#include <TFile.h>
#include <TString.h>
#include <TObjString.h>
#include <TVectorD.h>
#include <TMath.h>
#include <TH1.h>
#include <TH2.h>
#include <TH3.h>
#include <TPad.h>
#include <TCanvas.h>
#include <TLegend.h>
#include <AliCFEffGrid.h>

#include <AliLog.h>

#include "AliDielectronCFdraw.h"
#include "AliDielectron.h"
#include "AliDielectronVarManager.h"

ClassImp(AliDielectronCFdraw)

AliDielectronCFdraw::AliDielectronCFdraw() :
  TNamed(),
  fCfContainer(0x0),
  fEffGrid(0x0),
  fVdata(0)
{
  //
  // Ctor
  //
}

//________________________________________________________________
AliDielectronCFdraw::AliDielectronCFdraw(const char*name, const char* title) :
  TNamed(name,title),
  fCfContainer(0x0),
  fEffGrid(0x0),
  fVdata(0)
{
  //
  // Named Ctor
  //
  
}

//________________________________________________________________
AliDielectronCFdraw::AliDielectronCFdraw(AliCFContainer *cont) :
  TNamed(cont->GetName(), cont->GetTitle()),
  fCfContainer(cont),
  fEffGrid(new AliCFEffGrid("eff","eff",*cont)),
  fVdata(0)
{
  //
  // directly set the CF container
  //

}

//________________________________________________________________
AliDielectronCFdraw::AliDielectronCFdraw(const char* filename) :
  TNamed(),
  fCfContainer(0x0),
  fEffGrid(0x0),
  fVdata(0)
{
  //
  // get CF container(s) from file 'filename'
  //
  SetCFContainers(filename);
}

//________________________________________________________________
AliDielectronCFdraw::~AliDielectronCFdraw()
{
  //
  // dtor
  //
  delete fCfContainer;
  delete fEffGrid;
}

//________________________________________________________________
void AliDielectronCFdraw::SetCFContainers(const TSeqCollection *arr)
{
  //
  // Merge CF Container out of several containers
  //

  delete fCfContainer; fCfContainer=0x0;
  delete fEffGrid; fEffGrid=0x0;
  TIter next(arr);
  TObject *o=0x0;

  Int_t nstep=0;
  while ( (o=next()) ){
    AliCFContainer *cf=dynamic_cast<AliCFContainer*>(o);
    if (!cf) continue;
    nstep+=cf->GetNStep();
  }
  if (nstep==0) return;
  Int_t nbins[1]={1};
  fCfContainer=new AliCFContainer(GetName(), GetTitle(), nstep, 1, nbins);

  //delete unneeded steps
//   for (Int_t istep=0; istep<nstep; ++istep) delete fCfContainer->GetGrid(istep);

  //add step to the new container
  Int_t istep=0;
  for (Int_t icf=0; icf<arr->GetEntries(); ++icf){
    AliCFContainer *cf=dynamic_cast<AliCFContainer*>(arr->At(icf));
    if (!cf) continue;
    for (Int_t istepCurr=0; istepCurr<cf->GetNStep(); ++istepCurr){
      fCfContainer->SetGrid(istep, cf->GetGrid(istepCurr));
      fCfContainer->SetStepTitle(istep,Form("%s, Pair: %s",cf->GetTitle(),cf->GetStepTitle(istepCurr)));
      ++istep;
    }
  }
  if (fEffGrid) delete fEffGrid;
  fEffGrid=new AliCFEffGrid("eff","eff",*fCfContainer);
}

//________________________________________________________________
void AliDielectronCFdraw::SetCFContainers(const char* filename)
{
  //
  // get CF containers from file
  //

  TFile f(filename);
  TList *l=f.GetListOfKeys();
  TIter nextKey(l);
  TKey *k=0x0;
  while ( (k=static_cast<TKey*>(nextKey())) ){
    TObject *o=k->ReadObj();
    if (o->IsA()->InheritsFrom(TSeqCollection::Class())){
      TSeqCollection *arr=static_cast<TSeqCollection*>(o);
      SetCFContainers(arr);
    } else if (o->IsA()==AliCFContainer::Class()){
      fCfContainer=static_cast<AliCFContainer*>(o);
      if (fEffGrid) delete fEffGrid;
      fEffGrid=new AliCFEffGrid("eff","eff",*fCfContainer);
    }
  }
}

//________________________________________________________________
void AliDielectronCFdraw::SetRangeUser(Int_t ivar, Double_t min, Double_t max, const char* slices)
{
  //
  // Set range of cut steps defined in slices
  // Steps may be separated by one the the characteres ,;:
  //
  if (ivar==-1) return;
  TObjArray *arr=TString(slices).Tokenize(",:;");

  //Changes in root TAxis r48279
  //it doesn't work any longer to give the same min and max in SetRangeUser
  //the lines below fix this

  TAxis *a = fCfContainer->GetAxis(ivar,0);
  if (a) {
    const Int_t bin=a->FindBin(min);
    const Double_t binw=a->GetBinWidth(bin);
    if (TMath::Abs(max-min)<binw*0.001){
      max+=binw*0.001;
    }
  }

  if (arr->GetEntriesFast()==0){
    // all slices in case of 0 entries
    for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
      fCfContainer->GetGrid(istep)->SetRangeUser(ivar,min,max);
      fCfContainer->GetAxis(ivar,istep)->SetBit(TAxis::kAxisRange,1);
    }
  } else {
    TIter next(arr);
    TObjString *ostr=0x0;
    while ( (ostr=static_cast<TObjString*>(next())) ) {
      Int_t istep=ostr->GetString().Atoi();
      fCfContainer->GetGrid(istep)->SetRangeUser(ivar,min,max);
      fCfContainer->GetAxis(ivar,istep)->SetBit(TAxis::kAxisRange,1);
    }
  }
  delete arr;
}

//________________________________________________________________
void AliDielectronCFdraw::SetRangeUser(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max, const char* slices, Bool_t leg)
{
  //
  // Set range of cut steps defined in slices
  // Steps may be separated by one the the characteres ,;:
  //
  SetRangeUser(Form("%s%s",(leg?"Leg1_":""),AliDielectronVarManager::GetValueName(type)), min, max, slices);
  if(leg) SetRangeUser(Form("%s%s","Leg2_",AliDielectronVarManager::GetValueName(type)), min, max, slices);

}

//________________________________________________________________
void AliDielectronCFdraw::SetRangeUser(const char* varname, Double_t min, Double_t max, const char* slices)
{
  //
  // Set range from variable name
  //
  Int_t ivar=fCfContainer->GetVar(varname);
  if (ivar==-1){
    AliFatal(Form("Variable '%s' not found",varname));
    return;
  }
  SetRangeUser(ivar,min,max,slices);
}

//________________________________________________________________
void AliDielectronCFdraw::UnsetRangeUser(const char* varname, const char* slices)
{
  //
  // Unset range from variable name
  //
  Int_t ivar=fCfContainer->GetVar(varname);
  if (ivar==-1){
    AliFatal(Form("Variable '%s' not found",varname));
    return;
  }
  UnsetRangeUser(ivar,slices);
}

//________________________________________________________________
void AliDielectronCFdraw::UnsetRangeUser(AliDielectronVarManager::ValueTypes type, const char* slices, Bool_t leg)
{
  //
  // Unset range of cut steps defined in slices
  // Steps may be separated by one the the characteres ,;:
  //
  UnsetRangeUser(Form("%s%s",(leg?"Leg1_":""),AliDielectronVarManager::GetValueName(type)), slices);
  UnsetRangeUser(Form("%s%s",(leg?"Leg2_":""),AliDielectronVarManager::GetValueName(type)), slices);
}

//________________________________________________________________
void AliDielectronCFdraw::UnsetRangeUser(Int_t ivar, const char* slices)
{
  //
  // Unset range of cut steps defined in slices
  // Steps may be separated by one the the characteres ,;:
  //
  if (ivar==-1) return;
  TObjArray *arr=TString(slices).Tokenize(",:;");
  
  if (arr->GetEntriesFast()==0){
    // all slices in case of 0 entries
    for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
      fCfContainer->GetAxis(ivar,istep)->SetRange(0,0);
      fCfContainer->GetAxis(ivar,istep)->SetBit(TAxis::kAxisRange,0);
    }
  } else {
    TIter next(arr);
    TObjString *ostr=0x0;
    while ( (ostr=static_cast<TObjString*>(next())) ) {
      Int_t istep=ostr->GetString().Atoi();
      fCfContainer->GetAxis(ivar,istep)->SetRange(0,0);
      fCfContainer->GetAxis(ivar,istep)->SetBit(TAxis::kAxisRange,0);
    }
  }
  delete arr;
}

//________________________________________________________________
void AliDielectronCFdraw::Draw(const Option_t* varnames, const char* opt, const char* slices)
{
  //
  // Draw 'variables' of 'slices'
  // for multidimensional draw variables may be separated by a ':'
  // slice numbers may be separated by any of ,:;
  //
  // variables may be called by either their name or number
  //

  TObjArray *arrVars=TString(varnames).Tokenize(":");
  Int_t entries=arrVars->GetEntriesFast();
  if (entries<1||entries>3){
    AliError("Wrong number of variables, supported are 1 - 3 dimensions");
    delete arrVars;
    return;
  }
  
  TIter next(arrVars);
  TObjString *ostr=0x0;
  Int_t ivar[3]={-1,-1,-1};
  for (Int_t i=entries-1; i>=0; --i){
    ostr=static_cast<TObjString*>(next());
    if (ostr->GetString().IsDigit()){
      ivar[i]=ostr->GetString().Atoi();
    } else {
      ivar[i]=fCfContainer->GetVar(ostr->GetName());
    }
  }

  Draw(ivar[0],ivar[1],ivar[2],opt,slices);
  delete arrVars;
}

//________________________________________________________________
TString AliDielectronCFdraw::FindSteps(const char* search)
{
  //
  // find steps/slices containg search string
  // search strings may be separated by any of ,:;
  //
  TObjArray *arr=TString(search).Tokenize(",:;");
  TIter next(arr);
  TObjString *ostr=0x0;

  TString slices="";
  Int_t nfnd=0;
  // loop over all steps
  for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
    TString steptit = fCfContainer->GetStepTitle(istep);
    Bool_t bfnd=kFALSE;
    next.Reset();
    // loop over all search strings
    while ( (ostr=static_cast<TObjString*>(next())) ) {
      if( steptit.Contains(ostr->GetName()) ) bfnd=kTRUE;
      else {
	bfnd=kFALSE;
	break;
      }
    }
    // append found slices string
    if(bfnd) {
      if(nfnd)
	slices.Append(Form(":%d",istep));
      else
	slices.Append(Form("%d", istep));
      nfnd++;
    }
  }
  delete arr;

  if(!nfnd) AliWarning(" No step searched for found. returning all steps!");
  return slices;
}
//________________________________________________________________
Int_t AliDielectronCFdraw::FindStep(const char* search)
{
  //
  // find first step/slice containg search string
  // search strings may be separated by any of ,:;
  //
  TObjArray *arr=TString(search).Tokenize(",:;");
  TIter next(arr);
  TObjString *ostr=0x0;

  // loop over all steps
  for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
    TString steptit = fCfContainer->GetStepTitle(istep);
    Bool_t bfnd=kFALSE;
    next.Reset();
    // loop over all search strings
    while ( (ostr=static_cast<TObjString*>(next())) ) {
      if( steptit.Contains(ostr->GetName()) ) bfnd=kTRUE;
      else {
	bfnd=kFALSE;
	break;
      }
    }
    // return found slice/step
    if(bfnd) {
      delete arr;
      return istep;
    }
  }

  AliError(" No step searched for found. returning -1!");
  delete arr;
  return -1;

}
//________________________________________________________________
TObjArray* AliDielectronCFdraw::CollectHistosProj(const Option_t* varnames, const char* slices)
{
  //
  // Collect histos with 'variables' of 'slices'
  // for multidimensional histograms, variables may be separated by a ':'
  // slice numbers may be separated by any of ,:;
  //
  // variables may be called by either their name or number
  //
  
  TObjArray *arrVars=TString(varnames).Tokenize(":");
  Int_t entries=arrVars->GetEntriesFast();
  if (entries<1||entries>3){
    AliError("Wrong number of variables, supported are 1 - 3 dimensions");
    delete arrVars;
    return 0x0;
  }
  
  TIter next(arrVars);
  TObjString *ostr=0x0;
  Int_t ivar[3]={-1,-1,-1};
  for (Int_t i=entries-1; i>=0; --i){
    ostr=static_cast<TObjString*>(next());
    if (ostr->GetString().IsDigit()){
      ivar[i]=ostr->GetString().Atoi();
    } else {
      ivar[i]=fCfContainer->GetVar(ostr->GetName());
    }
  }
  delete arrVars;
  
  return CollectHistosProj(ivar,slices);
}

//________________________________________________________________
void AliDielectronCFdraw::Draw(Int_t var, const char* opt, const char* slices)
{
  //
  // Draw variable var for all slices
  // slices may be divided by and of ,;:
  //
  // if opt contains 'same' all histograms are drawn in the same pad
  // otherwise the pad will be divided in sub pads and the histograms
  // are drawn in each sub pad
  //

  Int_t vars[3]={var,-1,-1};
  TObjArray *arr=CollectHistosProj(vars,slices);
  Draw(arr,opt);
  delete arr; 
}

//________________________________________________________________
void AliDielectronCFdraw::Draw(Int_t var0, Int_t var1, const char* opt, const char* slices)
{
  //
  // Draw 2D case
  //
  Int_t vars[3]={var0,var1,-1};
  TObjArray *arr=CollectHistosProj(vars,slices);
  Draw(arr,opt);
  delete arr;
}

//________________________________________________________________
void AliDielectronCFdraw::Draw(Int_t var0, Int_t var1, Int_t var2, const char* opt, const char* slices)
{
  //
  // Draw 3D case
  //
  Int_t vars[3]={var0,var1,var2};
  TObjArray *arr=CollectHistosProj(vars,slices);
  Draw(arr,opt);
  delete arr;
}

//________________________________________________________________
TObjArray* AliDielectronCFdraw::CollectHistosProj(const Int_t vars[3], const char* slices)
{
  //
  // Collect histos with up to 3 dimension of the 'slices' separated by one of "':;'"
  // in a TObjArray and return it
  // if a dimension is not used it must be set to -1
  //
  TObjArray *arr=TString(slices).Tokenize(",:;");
  TObjArray *arrHists=0x0;
  if (arr->GetEntriesFast()==0){
    // all slices in case of 0 entries
    arrHists=new TObjArray(fCfContainer->GetNStep());
    for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
      TH1 *hproj=Project(vars,istep);
      if (!hproj) continue;
      hproj->SetName(Form("proj_%02d",istep));
      hproj->SetTitle(fCfContainer->GetStepTitle(istep));
      arrHists->Add(hproj);
    }
  } else {
    arrHists=new TObjArray(arr->GetEntriesFast());
    TIter next(arr);
    TObjString *ostr=0x0;
    while ( (ostr=static_cast<TObjString*>(next())) ) {
      Int_t istep=ostr->GetString().Atoi();
      TH1 *hproj=Project(vars,istep);
      if (!hproj) continue;
      hproj->SetName(Form("proj_%02d",istep));
      hproj->SetTitle(fCfContainer->GetStepTitle(istep));
      arrHists->Add(hproj);
    }
  }
  delete arr;

  return arrHists;
}

//________________________________________________________________
TObjArray* AliDielectronCFdraw::CollectMinvProj(Int_t slice, ECollectType collect, TString var)
{
  //
  // Collect invariant mass spectra of step 'slice' for pair types
  //

  TObjArray *arr = new TObjArray();
  arr->SetOwner();
  for (Int_t iType = 0; iType <= AliDielectron::kEv1PMRot; iType++) {

    switch (iType) {
      // same events
      case AliDielectron::kEv1PP:
      case AliDielectron::kEv1MM:
        if(collect==kROT || collect==kME || collect==kMEOS) continue; break;
        // mixed events
      case AliDielectron::kEv1PEv2P:
      case AliDielectron::kEv1MEv2M:
        if(collect==kROT || collect==kSE || collect==kMEOS) continue; break;
      case AliDielectron::kEv1MEv2P:
      case AliDielectron::kEv1PEv2M:
        if(collect==kROT || collect==kSE) continue; break;
        // rotations
      case AliDielectron::kEv1PMRot:
        if(collect==kSE || collect==kME || collect==kMEOS) continue; break;
        // unused
      case AliDielectron::kEv2PP:
      case AliDielectron::kEv2PM:
      case AliDielectron::kEv2MM:
        continue; break;
    }
    SetRangeUser("PairType",iType,iType,Form("%d",slice));
    TH1 *hM=Project(var.Data(),slice);
    hM->SetDirectory(0x0);
    hM->SetNameTitle(Form("Minv_%d",iType),Form("M for type %d;M (GeV/c^{2})", iType));
    arr->AddAt(hM,iType);
  }
  UnsetRangeUser("PairType",Form("%d",slice));
  return arr;
}

//________________________________________________________________
TH1* AliDielectronCFdraw::Project(const Int_t *vars, Int_t slice)
{
  //
  // Do an ndim projection
  //
  return fCfContainer->Project(slice,vars[0],vars[1],vars[2]);
}

//________________________________________________________________
TH1* AliDielectronCFdraw::Project(const Option_t* var, Int_t slice)
{
  //
  // translate variable names and do projection
  //
  TObjArray *arrVars=TString(var).Tokenize(":");
  Int_t entries=arrVars->GetEntriesFast();
  if (entries<1||entries>3){
    AliError("Wrong number of variables, supported are 1 - 3 dimensions");
    delete arrVars;
    return 0x0;
  }

  TIter next(arrVars);
  TObjString *ostr=0x0;
  Int_t ivar[3]={-1,-1,-1};
  for (Int_t i=entries-1; i>=0; --i){
    ostr=static_cast<TObjString*>(next());
    if (ostr->GetString().IsDigit()){
      ivar[i]=ostr->GetString().Atoi();
    } else {
      ivar[i]=fCfContainer->GetVar(ostr->GetName());
    }
  }
  if (ivar[0]==-1) return 0x0;
  delete arrVars;
  return fCfContainer->Project(slice,ivar[0],ivar[1],ivar[2]);
}

//________________________________________________________________
void AliDielectronCFdraw::DrawEfficiency(const char* varnames, const char* numerators, Int_t denominator, const char* opt)
{
  //
  // plot efficiencies for variables. Variable may be up to 3 dim, separated by a ':'
  // you may have several numerators, sparated by one of ',:;'
  //
  
  TObjArray *arrVars=TString(varnames).Tokenize(":");
  Int_t entries=arrVars->GetEntriesFast();
  if (entries<1||entries>3){
    AliError("Wrong number of variables, supported are 1 - 3 dimensions");
    delete arrVars;
    return;
  }
  
  TIter next(arrVars);
  TObjString *ostr=0x0;
  Int_t ivar[3]={-1,-1,-1};
  for (Int_t i=entries-1; i>=0; --i){
    ostr=static_cast<TObjString*>(next());
    if (ostr->GetString().IsDigit()){
      ivar[i]=ostr->GetString().Atoi();
    } else {
      ivar[i]=fCfContainer->GetVar(ostr->GetName());
    }
  }

  Int_t type=0;
  TString optStr(opt);
  if (optStr.Contains("2")) type=1;
  
  DrawEfficiency(ivar[0],ivar[1],ivar[2],numerators, denominator,opt,type);
  delete arrVars;
}

//________________________________________________________________
void AliDielectronCFdraw::DrawEfficiency(Int_t var, const char* numerators, Int_t denominator, const char* opt, Int_t type)
{
  //
  // Draw Efficiencies for all numerators
  // numerators may be divided by and of ,;:
  //
  // if opt contains 'same' all histograms are drawn in the same pad
  // otherwise the pad will be divided in sub pads and the histograms
  // are drawn in each sub pad
  //
  
  Int_t vars[3]={var,-1,-1};
  TObjArray *arr=CollectHistosEff(vars,numerators,denominator,type);
  TString drawOpt=opt;
  drawOpt+="eff";
  Draw(arr,drawOpt);
  delete arr;
}

//________________________________________________________________
void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, const char* numerators, Int_t denominator, const char* opt, Int_t type)
{
  //
  // Draw 2D case
  //
  Int_t vars[3]={var0,var1,-1};
  TObjArray *arr=CollectHistosEff(vars,numerators,denominator,type);
  TString drawOpt=opt;
  drawOpt+="eff";
  Draw(arr,drawOpt);
  delete arr;
}

//________________________________________________________________
void AliDielectronCFdraw::DrawEfficiency(Int_t var0, Int_t var1, Int_t var2, const char* numerators, Int_t denominator, const char* opt, Int_t type)
{
  //
  // Draw 3D case
  //
  Int_t vars[3]={var0,var1,var2};
  TObjArray *arr=CollectHistosEff(vars,numerators,denominator,type);
  TString drawOpt=opt;
  drawOpt+="eff";
  Draw(arr,drawOpt);
  delete arr;
}

//________________________________________________________________
TObjArray* AliDielectronCFdraw::CollectHistosEff(const  Int_t vars[3], const char* numerators, Int_t denominator, Int_t type)
{
  //
  // Collect histos with 'dim'ension of the 'slices' separated by one of "':;'"
  // in a TObjArray and return it
  //
  TObjArray *arr=TString(numerators).Tokenize(",:;");
  TObjArray *arrHists=0x0;

  if (type==0){
    if (arr->GetEntriesFast()==0){
    // all slices in case of 0 entries
      arrHists=new TObjArray(fCfContainer->GetNStep());
      fVdata.ResizeTo(arrHists->GetSize());
      for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
        fEffGrid->CalculateEfficiency(istep,denominator);
        TH1 *hproj=ProjectEff(vars);
        if (!hproj) continue;
        Float_t eff=fEffGrid->GetAverage();
        fVdata(istep)=eff;
        hproj->SetName(Form("eff_%02d/%02d",istep,denominator));
        hproj->SetTitle(Form("%s (%.3f)",fCfContainer->GetStepTitle(istep),eff));
        arrHists->Add(hproj);
      }
    } else {
      arrHists=new TObjArray(arr->GetEntriesFast());
      TIter next(arr);
      TObjString *ostr=0x0;
      fVdata.ResizeTo(arrHists->GetSize());
      Int_t count=0;
      while ( (ostr=static_cast<TObjString*>(next())) ) {
        Int_t istep=ostr->GetString().Atoi();
        fEffGrid->CalculateEfficiency(istep,denominator);
        TH1 *hproj=ProjectEff(vars);
        if (!hproj) continue;
        Float_t eff=fEffGrid->GetAverage();
        fVdata(count++)=eff;
        hproj->SetName(Form("eff_%02d/%02d",istep,denominator));
        hproj->SetTitle(Form("%s (%.3f)",fCfContainer->GetStepTitle(istep),eff));
        arrHists->Add(hproj);
      }
    }
  }

  //second approach
  if (type==1){
    TH1 *hDen=Project(vars,denominator);
    Double_t entriesDen=hDen->GetEffectiveEntries();
    if (arr->GetEntriesFast()==0){
    // all slices in case of 0 entries
      arrHists=new TObjArray(fCfContainer->GetNStep());
      fVdata.ResizeTo(arrHists->GetSize());
      for (Int_t istep=0; istep<fCfContainer->GetNStep(); ++istep){
        TH1 *hproj=Project(vars,istep);
        if (!hproj) continue;
        Float_t eff=0;
        if (entriesDen>0) eff=hproj->GetEffectiveEntries()/entriesDen;
        fVdata(istep)=eff;
        hproj->Divide(hproj,hDen,1,1,"B");
        hproj->SetName(Form("eff_%02d/%02d",istep,denominator));
        hproj->SetTitle(Form("%s (%.3f)",fCfContainer->GetStepTitle(istep),eff));
        arrHists->Add(hproj);
      }
    } else {
      arrHists=new TObjArray(arr->GetEntriesFast());
      fVdata.ResizeTo(arrHists->GetSize());
      TIter next(arr);
      TObjString *ostr=0x0;
      Int_t count=0;
      while ( (ostr=static_cast<TObjString*>(next())) ) {
        Int_t istep=ostr->GetString().Atoi();
        TH1 *hproj=Project(vars,istep);
        if (!hproj) continue;
        Float_t eff=0;
        if (entriesDen>0) eff=hproj->GetEffectiveEntries()/entriesDen;
        fVdata(count++)=eff;
        hproj->Divide(hproj,hDen,1,1,"B");
        hproj->SetName(Form("eff_%02d/%02d",istep,denominator));
        hproj->SetTitle(Form("%s (%.3f)",fCfContainer->GetStepTitle(istep),eff));
        arrHists->Add(hproj);
      }
    }
    delete hDen;
  }
  

  delete arr;
  return arrHists;
}

//________________________________________________________________
TH1* AliDielectronCFdraw::ProjectEff(const Int_t vars[3])
{
  //
  // Do an nim projection
  //
  return fEffGrid->Project(vars[0],vars[1],vars[2]);
}

//________________________________________________________________
void AliDielectronCFdraw::Draw(const TObjArray *arr, const char* opt)
{
  //
  // draw all objects in arr
  //
  TString optStr(opt);
  optStr.ToLower();
  Bool_t drawSame     = optStr.Contains("same");
  Bool_t drawSamePlus = optStr.Contains("same+");
  Bool_t drawEff      = optStr.Contains("eff");
  Bool_t optLeg       = optStr.Contains("leg");
  Bool_t optScaleMax  = optStr.Contains("max");
  
  if (!drawSamePlus) optStr.ReplaceAll("same","");
  
  optStr.ReplaceAll("+","");
  optStr.ReplaceAll("eff","");
  optStr.ReplaceAll("leg","");
  optStr.ReplaceAll("max","");
  
  if (!gPad) new TCanvas;
  
  Int_t nPads = arr->GetEntriesFast();
  if (nPads==0) return;
  
//   if (nPads==1){
//     arr->UncheckedAt(0)->Draw(optStr.Data());
//     return;
//   }
  
  TCanvas *c=gPad->GetCanvas();
  if (!gVirtualPS&&!drawSamePlus&&!drawSame&&nPads>1) c->Clear();
  
  if (!drawSame&&nPads>1){
    //optimised division
    Int_t nCols = (Int_t)TMath::Ceil( TMath::Sqrt(nPads) );
    Int_t nRows = (Int_t)TMath::Ceil( (Double_t)nPads/(Double_t)nCols );
    c->Divide(nCols,nRows);
    for (Int_t i=0; i<nPads; ++i){
      c->cd(i+1);
      arr->UncheckedAt(i)->Draw(optStr.Data());
    }
  } else {
    TLegend *leg=0;
    if (drawSamePlus){
      //find already existing legend to attach entries to it
      TIter nextPrimitive(gPad->GetListOfPrimitives());
      TObject *o=0x0;
      while ((o=nextPrimitive())) if (o->IsA()==TLegend::Class()) leg=(TLegend*)o;
    }
    
    if (optLeg&&!leg) leg=new TLegend(.2,.3,.99,.9);
    Int_t addColor=0;
    if (leg) addColor=leg->GetNRows();
    Int_t offset=20;
    if (nPads<7) offset=24;
    for (Int_t i=0; i<nPads; ++i){
      if (i==1&&!drawSamePlus) optStr+="same";
      TH1 *hist=static_cast<TH1*>(arr->UncheckedAt(i));
      hist->SetLineColor(i+1+addColor);
      hist->SetLineWidth(2);
      hist->SetMarkerColor(i+1+addColor);
      hist->SetMarkerStyle(offset+i+addColor);
      hist->Draw(optStr.Data());
      
      if (drawEff&&i==0&&!drawSamePlus) {
        hist->GetYaxis()->SetRangeUser(0,2);
        hist->SetYTitle("Rec. Signal / Gen. Signal");
      }
      
      if (leg) leg->AddEntry(hist,hist->GetTitle(),"lp");
    }
    if (leg){
      leg->SetFillColor(10);
      leg->SetY1(.9-leg->GetNRows()*.05);
      leg->SetY1NDC(.9-leg->GetNRows()*.05);
      leg->SetMargin(.1);
      if (!drawSamePlus) leg->Draw();
    }
    if (optScaleMax){
      TIter nextPrimitive(gPad->GetListOfPrimitives());
      TObject *o=0x0;
      TH1 *hfirst=0x0;
      Float_t max=0;
      while ((o=nextPrimitive())) if (o->InheritsFrom(TH1::Class())){
        TH1 *h=(TH1*)o;
        if (!hfirst) hfirst=h;
        if (h->GetMaximum()>max) max=h->GetMaximum();
      }
      max*=1.1;
      hfirst->SetMaximum(max);
    }
  }
  
}

//________________________________________________________________
Double_t AliDielectronCFdraw::GetAverageEfficiency(Int_t numerator, Int_t denominator, Double_t &effErr)
{
  //
  // Extract the mean efficiency of the numerator and denominator
  //

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