ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2007, 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.                  *
 **************************************************************************/

/* $Id$ */

#include "AliAnalysisTaskTrigChEff.h"

// ROOT includes
#include "TH1.h"
#include "TH2.h"
#include "TCanvas.h"
#include "TLegend.h"
#include "TMath.h"
#include "TObjString.h"
#include "TObjArray.h"
#include "TStyle.h"
#include "TROOT.h"
#include "TGraphAsymmErrors.h"
#include "TList.h"
#include "TFile.h"

// STEER includes
#include "AliVParticle.h"
#include "AliAODTrack.h"
#include "AliESDMuonTrack.h"

// ANALYSIS includes
#include "AliAnalysisManager.h"
#include "AliAnalysisDataSlot.h"
#include "AliAnalysisDataContainer.h"

// PWG3 includes
#include "AliVAnalysisMuon.h"
#include "AliMuonEventCuts.h"
#include "AliMuonTrackCuts.h"
#include "AliMergeableCollection.h"
#include "AliAnalysisMuonUtility.h"


/// \cond CLASSIMP
ClassImp(AliAnalysisTaskTrigChEff) // Class implementation in ROOT context
/// \endcond


//________________________________________________________________________
AliAnalysisTaskTrigChEff::AliAnalysisTaskTrigChEff() :
  AliVAnalysisMuon(),
  fTrackSelKeys(0x0),
  fCountTypeKeys(0x0),
  fHistoTypeKeys(0x0),
  fEffMethodKeys(0x0),
  fMatchTrigKeys(0x0),
//  fUseGhosts(kFALSE),
  fList(0x0)
{
  /// Default ctor.
}

//________________________________________________________________________
AliAnalysisTaskTrigChEff::AliAnalysisTaskTrigChEff(const char *name, const AliMuonTrackCuts& cuts) :
  AliVAnalysisMuon(name, cuts),
  fTrackSelKeys(0x0),
  fCountTypeKeys(0x0),
  fHistoTypeKeys(0x0),
  fEffMethodKeys(0x0),
  fMatchTrigKeys(0x0),
//  fUseGhosts(kFALSE),
  fList(0x0)
{
  //
  /// Constructor.
  //

  InitLocalKeys();
  
  DefineOutput(2, TList::Class());
}


//________________________________________________________________________
AliAnalysisTaskTrigChEff::~AliAnalysisTaskTrigChEff()
{
  //
  /// Destructor
  //
  delete fTrackSelKeys;
  delete fCountTypeKeys;
  delete fHistoTypeKeys;
  delete fEffMethodKeys;
  delete fMatchTrigKeys;
  if ( ! AliAnalysisManager::GetAnalysisManager() || ! AliAnalysisManager::GetAnalysisManager()->IsProofMode() ) {
    delete fList;
  }
}

//___________________________________________________________________________
TList* AliAnalysisTaskTrigChEff::GetEffHistoList(TString physSel, TString trigClassNames, TString centrality, TString trackSelection)
{
  /// Get the list of efficiency objects by merging the 
  // results from the histogram collection
  
  TList* outList = new TList();
  outList->SetOwner();
  FillEffHistoList(physSel, trigClassNames, centrality, trackSelection, outList);
  return outList;
}

//___________________________________________________________________________
Bool_t AliAnalysisTaskTrigChEff::FillEffHistoList(TString physSel, TString trigClassNames, TString centrality, TString trackSelection, TList* outList)
{
  /// Fill the list of objects for the efficiency calculation
  /// merging the splitted output of the fHistogramCollection
  /// The obtained list can be converted in the efficiency map used in simulations
  /// in a backward compatible way
  
  if ( ! fMergeableCollection ) return kFALSE;
  if ( ! outList ) outList = fList;
  TString histoName = "";
  TString histoPattern = "";
  TH1* histo = 0x0;
  Bool_t isOk = kTRUE;
  for ( Int_t icount=0; icount<kNcounts; ++icount ) {
    histoName = GetHistoName(kHchamberEff, icount, -1, -1, -1, -1);
    histoPattern = Form("%s%s", histoName.Data(), trackSelection.Data());
    histo = (TH1*)GetSum(physSel, trigClassNames, centrality, histoPattern);
    if ( histo ) {
      histo->SetName(histoName.Data());
      histo->SetTitle(histoName.Data());
      histo->SetDirectory(0);
      outList->Add(histo);
    }
    else isOk = kFALSE;
  }
  for ( Int_t icount=0; icount<kNcounts; ++icount ) {
    for ( Int_t ich=0; ich<4; ++ich ) {
      histoName = GetHistoName(kHslatEff, icount, ich, -1, -1, -1);
      histoPattern = Form("%s%s", histoName.Data(), trackSelection.Data());
      histo = (TH1*)GetSum(physSel, trigClassNames, centrality, histoPattern);
      if ( histo ) {
        histo->SetName(histoName.Data());
        histo->SetTitle(histoName.Data());
        histo->SetDirectory(0);
        outList->Add(histo);
      }
      else isOk = kFALSE;
    }
  }
  for ( Int_t icount=0; icount<kNcounts; ++icount ) {
    for ( Int_t ich=0; ich<4; ++ich ) {
      histoName = GetHistoName(kHboardEff, icount, ich, -1, -1, -1);
      histoPattern = Form("%s%s", histoName.Data(), trackSelection.Data());
      histo = (TH1*)GetSum(physSel, trigClassNames, centrality, histoPattern);
      if ( histo ) {
        histo->SetName(histoName.Data());
        histo->SetTitle(histoName.Data());
        histo->SetDirectory(0);
        outList->Add(histo);
      }
      else isOk = kFALSE;
    }
  }
  
  histoName = GetHistoName(kHcheckBoard, -1, -1, -1, -1, -1);
  histoPattern = Form("%s%s", histoName.Data(), trackSelection.Data());
  histo = (TH1*)GetSum(physSel, trigClassNames, centrality, histoPattern);
  if ( histo ) {
    histo->SetName(histoName.Data());
    histo->SetTitle(histoName.Data());
    histo->SetDirectory(0);
    outList->Add(histo);
  }
  else isOk = kFALSE;
  
  return isOk;
}

//___________________________________________________________________________
void AliAnalysisTaskTrigChEff::FinishTaskOutput()
{
  //
  /// Merge Apt, Lpt and Hpt
  /// Fill the final efficiency object (for backward compatibility)
  //

  TString histoName = "";
  for ( Int_t isel=0; isel<kNselections; ++isel ) {
    for ( Int_t itrig=0; itrig<GetAllSelectedTrigClasses()->GetEntries(); ++itrig ) {
      for ( Int_t icent=1; icent<=GetCentralityClasses()->GetNbins(); ++icent ) {
        for ( Int_t itrackSel=0; itrackSel<kNtrackSel; ++itrackSel ) {
          for ( Int_t imethod=0; imethod<kNeffMethods; ++imethod ) {
            for ( Int_t itype=0; itype<kNhistoTypes; ++itype ) {
              for ( Int_t icount=-1; icount<kNcounts; ++icount ) {
                for ( Int_t ich=-1; ich<4; ++ich ) {
                  for ( Int_t imatch=kMatchApt; imatch<kMatchHpt; ++imatch ) {
                    TH1* histo = 0x0;
                    for ( Int_t jmatch=imatch+1; jmatch<=kMatchHpt; ++jmatch ) {
                      histoName = GetHistoName(itype, icount, ich, itrackSel, jmatch, imethod);
                      TH1* histoAdd = (TH1*)fMergeableCollection->GetObject(Form("/%s/%s/%s/",fPhysSelKeys->At(isel)->GetName(), GetAllSelectedTrigClasses()->At(itrig)->GetName(), GetCentralityClasses()->GetBinLabel(icent)), histoName);
                      if ( ! histoAdd ) continue;
                      histoName = GetHistoName(itype, icount, ich, itrackSel, imatch, imethod);
                      if ( ! histo ) histo = (TH1*)GetMergeableObject(fPhysSelKeys->At(isel)->GetName(), GetAllSelectedTrigClasses()->At(itrig)->GetName(), GetCentralityClasses()->GetBinLabel(icent), histoName);
                      AliDebug(2,Form("Adding %s (%g) to %s (%g)", histoAdd->GetName(), histoAdd->Integral(), histo->GetName(), histo->Integral()));
                      histo->Add(histoAdd);
                    } // loop on higher pt matching
                  } // loop on match trigger
                } // loop on chamber
              } // loop on count type
            } // loop on histo type
          } // loop on eff method
        } // loop on track selection
      } // loop on centrality
    } // loop on trigger classes
  } // loop on physics selection

  TString physSel = fPhysSelKeys->At(kPhysSelPass)->GetName();
  TString trigClass = "ANY";
  TString centrality = "all";
  TString histoPattern = GetHistoName(-1,-1,-1,kSelectTrack,kMatchApt,kEffFromTrack);
  
  FillEffHistoList(physSel, trigClass, centrality, histoPattern, fList);

  AliVAnalysisMuon::FinishTaskOutput();
}


//___________________________________________________________________________
void AliAnalysisTaskTrigChEff::InitLocalKeys()
{
  //
  /// Initialyze objects
  //
  
  TString matchTrigNames = "Nopt Apt Lpt Hpt";
  fMatchTrigKeys = matchTrigNames.Tokenize(" ");
  
  TString countTypeNames = "bendPlaneCount nonBendPlaneCount bothPlanesCount allTracksCount";
  fCountTypeKeys = countTypeNames.Tokenize(" ");
  
  TString histoTypeKeys = "Chamber Slat Board checkRejectedBoard";
  fHistoTypeKeys = histoTypeKeys.Tokenize(" ");
  
  TString effMethodKeys = "FromTrk FromTrg";
  fEffMethodKeys = effMethodKeys.Tokenize(" ");
  
  TString trackSelNames = "Match NoSelMatch";
  fTrackSelKeys = trackSelNames.Tokenize(" ");
}

//___________________________________________________________________________
void AliAnalysisTaskTrigChEff::MyUserCreateOutputObjects()
{
  //
  /// Create prototype objects for mergeable collection
  //
  
  const Char_t* yAxisTitle = "counts";
  
  Int_t nChamberBins = 4;
  Float_t chamberLow = 11.-0.5, chamberHigh = (Float_t)(nChamberBins)+11.-0.5;
  const Char_t* chamberName = "chamber";
  
  Int_t nSlatBins = 18;
  Float_t slatLow = 0.-0.5, slatHigh = (Float_t)nSlatBins-0.5;
  const Char_t* slatName = "slat";
  
  Int_t nBoardBins = 234;
  Float_t boardLow = 1.-0.5, boardHigh = (Float_t)nBoardBins+1.-0.5;
  const Char_t* boardName = "board";
  
  TString baseName, histoName, histoTitle;
  
  TH1* histo;
  TH2F* histo2D;
  
  for ( Int_t itrackSel = 0; itrackSel<kNtrackSel; ++itrackSel ) {
    for ( Int_t imethod=0; imethod<kNeffMethods; ++imethod ) {
      for ( Int_t imatch = 0; imatch<kNtrigMatch; ++imatch ) {
        for ( Int_t icount=0; icount<kNcounts; ++icount ) {
          histoName = GetHistoName(kHchamberEff, icount, -1, itrackSel, imatch, imethod);
          histo = new TH1F(histoName, histoName,
                           nChamberBins, chamberLow, chamberHigh);
          histo->GetXaxis()->SetTitle(chamberName);
          histo->GetYaxis()->SetTitle(yAxisTitle);
          AddObjectToCollection(histo);
        } // loop on counts
      
        for ( Int_t icount=0; icount<kNcounts; ++icount ) {
          for ( Int_t ich=0; ich<4; ++ich ) {
            histoName = GetHistoName(kHslatEff, icount, ich, itrackSel, imatch, imethod);
            histo = new TH1F(histoName, histoName,
                             nSlatBins, slatLow, slatHigh);
            histo->GetXaxis()->SetTitle(slatName);
            histo->GetYaxis()->SetTitle(yAxisTitle);
            AddObjectToCollection(histo);
          } // loop on chamber
        } // loop on counts
      
        for ( Int_t icount=0; icount<kNcounts; ++icount ) {
          for ( Int_t ich=0; ich<4; ++ich ) {
            histoName = GetHistoName(kHboardEff, icount, ich, itrackSel, imatch, imethod);
            histo = new TH1F(histoName, histoName,
                             nBoardBins, boardLow, boardHigh);
            histo->GetXaxis()->SetTitle(boardName);
            histo->GetYaxis()->SetTitle(yAxisTitle);
            AddObjectToCollection(histo);
          } // loop on chamber
        } // loop on counts
      
        histoName = GetHistoName(kHcheckBoard, -1, -1, itrackSel, imatch, imethod);
        histo2D = new TH2F(histoName.Data(), "Rejected tracks motivation",
                           5, 20.5, 25.5, nBoardBins, boardLow, boardHigh);
        histo2D->GetXaxis()->SetBinLabel(1,"Many pads");
        histo2D->GetXaxis()->SetBinLabel(2,"Few pads");
        histo2D->GetXaxis()->SetBinLabel(3,"Outside geom");
        histo2D->GetXaxis()->SetBinLabel(4,"Tracker track");
        histo2D->GetXaxis()->SetBinLabel(5,"Masked board");
        histo2D->GetYaxis()->SetTitle(boardName);
        AddObjectToCollection(histo2D);
      } // loop on trig match
    } // loop on eff method
  } // loop on track selection

  fMuonTrackCuts->Print();
  
  fList = new TList();
  fList->SetOwner();
  PostData(2, fList);

}

//___________________________________________________________________________
TString AliAnalysisTaskTrigChEff::GetHistoName(Int_t itype, Int_t icount, Int_t ichamber, Int_t itrackSel, Int_t imatch, Int_t imethod)
{
  /// Get histogram index
  TString histoName = "";
  if ( itype < kHcheckBoard && icount >= 0 ) histoName += static_cast<TObjString*>(fCountTypeKeys->At(icount))->GetString();
  if ( itype >= 0 ) histoName += ((TObjString*)fHistoTypeKeys->At(itype))->GetString();
  if ( ichamber >= 0 ) histoName += Form("Ch%i", 11+ichamber);
  if ( itrackSel >= 0 ) histoName += static_cast<TObjString*>(fTrackSelKeys->At(itrackSel))->GetString();
  if ( imatch >= 0 ) histoName += static_cast<TObjString*>(fMatchTrigKeys->At(imatch))->GetString();
  if ( imethod >= 0 ) histoName += static_cast<TObjString*>(fEffMethodKeys->At(imethod))->GetString();
  return histoName;
}

//________________________________________________________________________
void AliAnalysisTaskTrigChEff::ProcessEvent(TString physSel, const TObjArray& selectTrigClasses, TString centrality)
{
  //
  /// Fill histogram
  //

  Int_t slat = 0, board = 0;
  UInt_t pattern = 0;
  TString histoName = "";

  TArrayI othersEfficient(4);

  AliVParticle* track = 0x0;
  
  UInt_t addMask[4] = {0, AliMuonTrackCuts::kMuMatchApt, AliMuonTrackCuts::kMuMatchApt|AliMuonTrackCuts::kMuMatchLpt, AliMuonTrackCuts::kMuMatchApt|AliMuonTrackCuts::kMuMatchLpt|AliMuonTrackCuts::kMuMatchHpt};

  Int_t nTracks = AliAnalysisMuonUtility::GetNTracks(InputEvent());
  for ( Int_t itrack = 0; itrack < nTracks; ++itrack ) {
    track = AliAnalysisMuonUtility::GetTrack(itrack,InputEvent());

    Bool_t matchTracker = AliAnalysisMuonUtility::IsMuonTrack(track);

    Int_t matchTrig = AliAnalysisMuonUtility::GetMatchTrigger(track);
    UInt_t selection = fMuonTrackCuts->GetSelectionMask(track);
    
    // Apply the sharp pt cut according to the matched pt level of the track
    UInt_t filterMask = fMuonTrackCuts->GetFilterMask() | addMask[matchTrig];
    Bool_t isSelected = ( ( selection & filterMask ) == filterMask );

    for ( Int_t imethod=0; imethod<kNeffMethods; ++imethod ) {
      if ( imethod == kEffFromTrack ) {
        if ( ! matchTracker || track->P() < 10. ) continue;
        pattern = AliAnalysisMuonUtility::GetMUONTrigHitsMapTrk(track);
        board = AliESDMuonTrack::GetCrossedBoard(pattern);
      }
      else {
        if ( matchTrig == 0 ) continue;
        pattern = AliAnalysisMuonUtility::GetMUONTrigHitsMapTrg(track);
        board = ( AliAnalysisMuonUtility::IsAODEvent(InputEvent()) ) ? AliESDMuonTrack::GetCrossedBoard(pattern) : ((AliESDMuonTrack*)track)->LoCircuit();
      }
      
      Int_t effFlag = AliESDMuonTrack::GetEffFlag(pattern);
      
      if ( effFlag < AliESDMuonTrack::kChEff ) {
        for ( Int_t itrackSel=0; itrackSel<kNtrackSel; ++itrackSel ) {
          if ( itrackSel == kSelectTrack && ! isSelected ) continue;
          for ( Int_t itrig=0; itrig<selectTrigClasses.GetEntries(); ++itrig ) {
            TString trigClassName = ((TObjString*)selectTrigClasses.At(itrig))->GetString();
          
            histoName = GetHistoName(kHcheckBoard, -1, -1, itrackSel, matchTrig, imethod);
            ((TH2F*)GetMergeableObject(physSel, trigClassName, centrality, histoName))->Fill(AliESDMuonTrack::GetSlatOrInfo(pattern), board);
          }
        }
        continue; // Track not good for efficiency calculation
      }
      
      othersEfficient.Reset(1);
      for ( Int_t cath=0; cath<2; ++cath ) {
        for ( Int_t ich=0; ich<4; ++ich ) {
          if ( ! AliESDMuonTrack::IsChamberHit(pattern, cath, ich) ) {
            for ( Int_t jch=0; jch<4; jch++ ) {
              if ( jch != ich ) othersEfficient[jch] = 0;
            } // loop on other chambers
            break;
          } // if chamber not efficient
        } // loop on chambers
      } // loop on cathodes
      
      Bool_t rejectTrack = kTRUE;
      for ( Int_t ich=0; ich<4; ++ich ) {
        if ( othersEfficient[ich] > 0 ) {
          rejectTrack = kFALSE;
          break;
        }
      }
      
      if ( rejectTrack ) continue;
      
      slat = AliESDMuonTrack::GetSlatOrInfo(pattern);
      
      for ( Int_t ich=0; ich<4; ++ich ) {
        if ( ! othersEfficient[ich] )
          continue; // Reject track if the info of the chamber under study 
        // is necessary to create the track itself
        
        Int_t iChamber = 11 + ich;
        
        Bool_t hitsBend = AliESDMuonTrack::IsChamberHit(pattern, 0, ich);
        Bool_t hitsNonBend = AliESDMuonTrack::IsChamberHit(pattern, 1, ich);
        
        Bool_t fillHisto[kNcounts] = {
          hitsBend,
          hitsNonBend,
          ( hitsBend && hitsNonBend ),
          kTRUE
        };
        
        for ( Int_t itrackSel=0; itrackSel<kNtrackSel; ++itrackSel ) {
          if ( itrackSel == kSelectTrack && ! isSelected ) continue;
          for (Int_t icount=0; icount<kNcounts; ++icount){
            if ( ! fillHisto[icount] ) continue;
            for ( Int_t itrig=0; itrig<selectTrigClasses.GetEntries(); ++itrig ) {
              TString trigClassName = ((TObjString*)selectTrigClasses.At(itrig))->GetString();
              
              histoName = GetHistoName(kHchamberEff, icount, -1, itrackSel, matchTrig, imethod);
              ((TH1*)GetMergeableObject(physSel, trigClassName, centrality, histoName))->Fill(iChamber);
            
              if ( effFlag < AliESDMuonTrack::kSlatEff ) continue; // Track crossed different slats
              histoName = GetHistoName(kHslatEff, icount, ich, itrackSel, matchTrig, imethod);
              ((TH1*)GetMergeableObject(physSel, trigClassName, centrality, histoName))->Fill(slat);
            
              if ( effFlag < AliESDMuonTrack::kBoardEff ) continue; // Track crossed different boards
              histoName = GetHistoName(kHboardEff, icount, ich, itrackSel, matchTrig, imethod);
              ((TH1*)GetMergeableObject(physSel, trigClassName, centrality, histoName))->Fill(board);
            } // loop on trigger classes
          } // loop on count types
        } // loop on track selection
      } // loop on chambers
    } // loop on tracks
  } // loop on eff methods
  
  PostData(2, fList);
}


//________________________________________________________________________
void AliAnalysisTaskTrigChEff::Terminate(Option_t *)
{
  //
  /// Draw some histogram at the end.
  //

  AliVAnalysisMuon::Terminate("");
  
  if ( ! fMergeableCollection ) return;
  

  Int_t xshift = 100;
  Int_t yshift = 20;
  Int_t igroup1 = -1;
  Int_t igroup2 = 0;

  TObjArray* physSel =  ((TObjString*)fTerminateOptions->At(0))->GetString().Tokenize(" ");
  physSel->SetOwner();
  TObjArray* trigClasses = ((TObjString*)fTerminateOptions->At(1))->GetString().Tokenize(" ");
  trigClasses->SetOwner();
  TObjArray* centrality = ((TObjString*)fTerminateOptions->At(2))->GetString().Tokenize(" ");
  centrality->SetOwner();
  TString furtherOpt = ((TObjString*)fTerminateOptions->At(3))->GetString();

  TString currName = "";
  TObjArray* optArr = furtherOpt.Tokenize(" ");
  TObjArray trackSel, methodSel;
  trackSel.SetOwner();
  methodSel.SetOwner();
  TString outFileOpt = "";
  for ( Int_t iopt=0; iopt<optArr->GetEntries(); iopt++ ) {
    currName = optArr->At(iopt)->GetName();
    if ( currName.Contains(".root") ) outFileOpt = currName;
    else if ( currName.Contains("Match") ) trackSel.Add(new TObjString(currName));
    else if ( currName.Contains("From") ) methodSel.Add(new TObjString(currName));
  }
  delete optArr;
  
  if ( trackSel.GetEntries() == 0 ) trackSel.Add(new TObjString(GetHistoName(-1,-1,-1,kSelectTrack,kMatchApt,-1)));
  if ( methodSel.GetEntries() == 0 ) methodSel.Add(new TObjString(fEffMethodKeys->At(kEffFromTrack)->GetName()));

  furtherOpt.ToUpper();
  
  Int_t chosenType = ( furtherOpt.Contains("BOARD") ) ? kHboardEff : kHslatEff;

  igroup1++;
  igroup2 = 0;
  TString histoName = "", yAxisTitle = "";
  
  TH1 *num = 0x0;
  TH1 *den = 0x0;
  TGraphAsymmErrors* effGraph = 0x0;
  
  ////////////////
  // Show tests //
  ////////////////
  
  for ( Int_t icount=0; icount<kNcounts-1; ++icount ) {
    currName = Form("%s%s_can", fHistoTypeKeys->At(chosenType)->GetName(), fCountTypeKeys->At(icount)->GetName());
    TCanvas* can = new TCanvas(currName.Data(), currName.Data(), igroup1*xshift,igroup2*yshift,600,600);
    can->Divide(2,2);
    TLegend* leg = new TLegend(0.6, 0.6, 0.9, 0.9);
    leg->SetBorderSize(1);
    for ( Int_t ich=0; ich<4; ++ich ) {
      TGraph* refGraph = 0x0;
      can->cd(ich+1);
      gPad->SetRightMargin(0.03);
      Int_t icolor = 1;
      Int_t istyle = 0;
      TString drawOpt = "AP";
      for ( Int_t isel=0; isel<physSel->GetEntries(); ++isel ) {
        for ( Int_t itrig=0; itrig<trigClasses->GetEntries(); ++itrig ) {
          for ( Int_t icent=0; icent<centrality->GetEntries(); ++icent ) {
            for ( Int_t imethodSel=0; imethodSel<methodSel.GetEntries(); ++imethodSel ) {
              for ( Int_t itrackSel=0; itrackSel<trackSel.GetEntries(); ++itrackSel ) {
                histoName = GetHistoName(chosenType, kAllTracks, ich, -1, -1, -1); // partial name
                histoName += Form("%s%s",trackSel.At(itrackSel)->GetName(),methodSel.At(imethodSel)->GetName());
                den = (TH1*)GetSum(physSel->At(isel)->GetName(), trigClasses->At(itrig)->GetName(), centrality->At(icent)->GetName(), histoName.Data());
                if ( ! den ) {
                  printf("Warning: cannot find %s\n", histoName.Data());
                  continue;
                }
                histoName = GetHistoName(chosenType, icount, ich, -1, -1, -1); // partial name
                histoName += Form("%s%s",trackSel.At(itrackSel)->GetName(),methodSel.At(imethodSel)->GetName());
                num = (TH1*)GetSum(physSel->At(isel)->GetName(), trigClasses->At(itrig)->GetName(), centrality->At(icent)->GetName(), histoName.Data());
                if ( ! num ) continue;
                effGraph = new TGraphAsymmErrors(num, den, "e0");
                currName = Form("%s_%s_%s_%s_%s", physSel->At(isel)->GetName(), trigClasses->At(itrig)->GetName(), centrality->At(icent)->GetName(), trackSel.At(itrackSel)->GetName(), methodSel.At(imethodSel)->GetName());
                effGraph->SetTitle(currName.Data());

                Double_t ymin = 0.;
                Double_t ymax = 1.1;
                yAxisTitle = "Efficiency";

                if ( furtherOpt.Contains("DIFF") || furtherOpt.Contains("PULL") ) {
                  if ( ! refGraph ) {
                    refGraph = effGraph;
                    continue;
                  }
                  Double_t currX, currY, baseX, baseY, errYlow = 0., errYhigh = 0., newY = 0.;
                  Double_t refVal = 1., errY = 0.; 
                  for ( Int_t ipoint=0; ipoint<effGraph->GetN(); ipoint++ ) {
                    refGraph->GetPoint(ipoint, baseX, baseY);
                    effGraph->GetPoint(ipoint, currX, currY);
                    Double_t errX = effGraph->GetErrorXlow(ipoint);
                    if ( furtherOpt.Contains("DIFF") ) {
                      refVal = ( baseY > 0. ) ? baseY : 1.;
                      newY = ( currY - baseY ) / refVal;
                      Double_t errYlow1 = effGraph->GetErrorYlow(ipoint);
                      Double_t errYlow2 = refGraph->GetErrorYlow(ipoint);
                      Double_t errYhigh1 = effGraph->GetErrorYhigh(ipoint);
                      Double_t errYhigh2 = refGraph->GetErrorYhigh(ipoint);
                      errYlow = TMath::Sqrt(errYlow1*errYlow1 + errYlow2*errYlow2) / refVal;
                      errYhigh = TMath::Sqrt(errYhigh1*errYhigh1 + errYhigh2*errYhigh2) / refVal;
                      //yAxisTitle = Form("(%s - %s) / %s", effGraph->GetTitle(), refGraph->GetTitle(), refGraph->GetTitle());
                      yAxisTitle = "(eff - ref ) / ref";
                      effGraph->SetTitle(Form("Rel. diff. w.r.t. %s", refGraph->GetTitle()));
                      ymin = -0.1;
                      ymax = 0.1;
                    }
                    else if ( furtherOpt.Contains("PULL") ) {
                      errY = 0.5 * ( effGraph->GetErrorYlow(ipoint) + effGraph->GetErrorYhigh(ipoint));
                      newY = ( errY > 0. ) ? ( currY - baseY ) / errY : 0.;
                      errYlow = 1.;
                      errYhigh = 1.;
                      //yAxisTitle = Form("( %s - %s ) / err", effGraph->GetTitle(), refGraph->GetTitle());
                      yAxisTitle = "(eff - ref ) / err";
                      effGraph->SetTitle(Form("Pull w.r.t. %s", refGraph->GetTitle()));
                      ymin = -4.;
                      ymax = 4.;
                    }
                    effGraph->SetPoint(ipoint, currX, newY);
                    effGraph->SetPointError(ipoint, errX, errX, errYlow, errYhigh);
                  } // loop on points
                }
                effGraph->GetYaxis()->SetRangeUser(ymin, ymax);
                effGraph->GetYaxis()->SetTitle(yAxisTitle.Data());
                effGraph->SetLineColor(icolor);
                effGraph->SetMarkerColor(icolor);
                effGraph->SetMarkerStyle(20 + istyle);
                //effGraph->SetMarkerSize(0.3);
                icolor++;
                if ( icolor == 5 || icolor == 10 ) icolor++;
                istyle++;
                effGraph->Draw(drawOpt.Data());
                drawOpt = "P";
                if ( ich < 3 ) continue;
                leg->AddEntry(effGraph, currName.Data(), "lp");
              } // loop on match trigger
            } // loop on eff method
          } // loop on centrality
        } // loop on trigger classes
      } // loop on physics selection
    } // loop on chamber
    leg->Draw("same");
  } // loop on count type
  //} // loop on detection element type

  delete physSel;
  delete trigClasses;
  delete centrality;
  
   
  fList = dynamic_cast<TList*>(GetOutputData(2));
  if ( fList ) {
  
    ///////////////////////////
    // Show final efficiency //
    ///////////////////////////
    TString baseName[3] = {"Chamber", "RPC", "Board"};
    Int_t baseIndex[3] = {kHchamberEff, kHslatEff, kHboardEff};
    TString effName[kNcounts-1] = {"BendPlane", "NonBendPlane", "BothPlanes"};
    for ( Int_t itype=0; itype<3; itype++ ) {
      for ( Int_t icount=0; icount<kNcounts-1; icount++ ){
        TString canName = Form("efficiencyPer%s_%s",baseName[itype].Data(),effName[icount].Data());
        TCanvas* can = new TCanvas(canName.Data(),canName.Data(),10*(1+kNcounts*itype+icount),10*(1+kNcounts*itype+icount),310,310);
        can->SetFillColor(10); can->SetHighLightColor(10);
        can->SetLeftMargin(0.15); can->SetBottomMargin(0.15);  
        if ( itype > 0 )
          can->Divide(2,2);
        
        for ( Int_t ich=-1; ich<4; ich++ ) {
          histoName = GetHistoName(baseIndex[itype], icount, ich, -1, -1, -1);
          num = (TH1*)fList->FindObject(histoName.Data());
          histoName = GetHistoName(baseIndex[itype], kNcounts-1, ich, -1, -1, -1);
          den = (TH1*)fList->FindObject(histoName.Data());
          if ( ! num || ! den ) continue;
          effGraph = new TGraphAsymmErrors(num, den, "e0");
          effGraph->GetYaxis()->SetRangeUser(0., 1.1);
          effGraph->GetYaxis()->SetTitle("Efficiency");
          effGraph->GetXaxis()->SetTitle(baseName[itype].Data());
          can->cd(ich+1);
          effGraph->Draw("AP");
          if ( itype == 0 ) break;
        } // loop on chamber
      } // loop on count types
    } // loop on histo
  }

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