ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, 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.                  *
**************************************************************************/
//
// Class for TRD PID
// Implements the abstract base class AliHFEpidbase 
// Make PID does the PID decision 
// Class further contains TRD specific cuts and QA histograms 
//  
// Authors: 
//   Markus Fasel <M.Fasel@gsi.de>  
// 
#include <TH1F.h>
#include <TH2F.h>
#include <THnSparse.h>
#include <TList.h>
#include <TString.h>

#include "AliAODPid.h"
#include "AliAODTrack.h"
#include "AliAODMCParticle.h"
#include "AliESDtrack.h"
#include "AliLog.h"
#include "AliMCParticle.h"
#include "AliOADBContainer.h"
#include "AliPID.h"
#include "AliPIDResponse.h"

#include "AliHFEOADBThresholdsTRD.h"
#include "AliHFEpidQAmanager.h"
#include "AliHFEpidTRD.h"

ClassImp(AliHFEpidTRD)

//___________________________________________________________________
AliHFEpidTRD::AliHFEpidTRD() :
    AliHFEpidBase()
  , fOADBThresholds(NULL)
  , fMinP(0.5)
  , fNTracklets(6)
  , fCutNTracklets(0)
  , fRunNumber(0)
  , fElectronEfficiency(0.90)
  , fTotalChargeInSlice0(kFALSE)
  , fTRDOldPIDMethod(kFALSE)
  , fTRD2DPID(kFALSE)
{
  //
  // default  constructor
  // 
  memset(fThreshParams, 0, sizeof(Double_t) * kThreshParams);
}

//___________________________________________________________________
AliHFEpidTRD::AliHFEpidTRD(const char* name) :
    AliHFEpidBase(name)
  , fOADBThresholds(NULL)
  , fMinP(0.5)
  , fNTracklets(6)
  , fCutNTracklets(0)
  , fRunNumber(0)
  , fElectronEfficiency(0.91)
  , fTotalChargeInSlice0(kFALSE)
  , fTRDOldPIDMethod(kFALSE)
  , fTRD2DPID(kFALSE)
{
  //
  // default  constructor
  // 
  memset(fThreshParams, 0, sizeof(Double_t) * kThreshParams);
}

//___________________________________________________________________
AliHFEpidTRD::AliHFEpidTRD(const AliHFEpidTRD &ref):
    AliHFEpidBase("")
  , fOADBThresholds(NULL)
  , fMinP(ref.fMinP)
  , fNTracklets(ref.fNTracklets)
  , fCutNTracklets(ref.fCutNTracklets)
  , fRunNumber(ref.fRunNumber)
  , fElectronEfficiency(ref.fElectronEfficiency)
  , fTotalChargeInSlice0(ref.fTotalChargeInSlice0)
  , fTRDOldPIDMethod(ref.fTRDOldPIDMethod)
  , fTRD2DPID(ref.fTRD2DPID)
{
  //
  // Copy constructor
  //
  memset(fThreshParams, 0, sizeof(Double_t) * kThreshParams);
  ref.Copy(*this);
}

//___________________________________________________________________
AliHFEpidTRD &AliHFEpidTRD::operator=(const AliHFEpidTRD &ref){
  //
  // Assignment operator
  //
  if(this != &ref){
    ref.Copy(*this);
  }
  return *this;
}

//___________________________________________________________________
void AliHFEpidTRD::Copy(TObject &ref) const {
  //
  // Performs the copying of the object
  //
  AliHFEpidTRD &target = dynamic_cast<AliHFEpidTRD &>(ref);
  
  target.fMinP = fMinP;
  target.fNTracklets = fNTracklets;
  target.fCutNTracklets = fCutNTracklets;
  target.fRunNumber = fRunNumber;
  target.fTotalChargeInSlice0 = fTotalChargeInSlice0;
  target.fTRDOldPIDMethod = fTRDOldPIDMethod;
  target.fTRD2DPID = fTRD2DPID;
  target.fElectronEfficiency = fElectronEfficiency;
  memcpy(target.fThreshParams, fThreshParams, sizeof(Double_t) * kThreshParams);
  AliHFEpidBase::Copy(ref);
}

//___________________________________________________________________
AliHFEpidTRD::~AliHFEpidTRD(){
  //
  // Destructor
  //
}

//______________________________________________________
Bool_t AliHFEpidTRD::InitializePID(Int_t run){
  //
  // InitializePID call different init function depending on TRD PID method
  //
  //

  if(fTRDOldPIDMethod) return Initialize1D(run);
  else return kTRUE;


}

//______________________________________________________
Bool_t AliHFEpidTRD::Initialize1D(Int_t run){
  //
  // InitializePID: Load TRD thresholds and create the electron efficiency axis
  // to navigate 
  //
  AliDebug(1, Form("Initializing TRD PID for run %d", run));
  if(InitParamsFromOADB(run)){
    SetBit(kThresholdsInitialized);
    return kTRUE;
  }
  AliDebug(1, Form("Threshold Parameters for %d tracklets and an electron efficiency %f loaded:", fNTracklets, fElectronEfficiency));
  AliDebug(1, Form("Params: [%f|%f|%f|%f]", fThreshParams[0], fThreshParams[1], fThreshParams[2], fThreshParams[3]));
  fRunNumber = run;
  return kFALSE;
}

/*
//______________________________________________________
Bool_t AliHFEpidTRD::Initialize2D(Int_t run){
  //
  // Initialize2DimPID
  //
  //

    return kTRUE;

}
*/

//______________________________________________________
Int_t AliHFEpidTRD::IsSelected(const AliHFEpidObject *track, AliHFEpidQAmanager *pidqa) const {
  //
  // Does PID for TRD alone:
  // PID algorithm selected according to flag
  //
  //

    if(fTRDOldPIDMethod) return IsSelected1D(track, pidqa);
    else return IsSelectedTRDPID(track, pidqa);
}

//______________________________________________________
Int_t AliHFEpidTRD::IsSelected1D(const AliHFEpidObject *track, AliHFEpidQAmanager *pidqa) const {
  //
  // Does PID for TRD alone:
  // PID thresholds based on 90% Electron Efficiency level approximated by a linear 
  // step function
  //
  if(!TestBit(kThresholdsInitialized)) {
    AliDebug(1,"Threshold Parameters not available");
    return 0;
  }
  AliDebug(2, "Applying TRD PID");
  if(!fkPIDResponse){
    AliDebug(2, "Cannot process track");
    return 0;
  }


/*
  const AliESDtrack *esdt = dynamic_cast<const AliESDtrack *>(track->GetRecTrack());
  printf("checking IdentifiedAsElectronTRD, number of Tracklets: %d\n", esdt->GetTRDntrackletsPID());
  if(fkPIDResponse->IdentifiedAsElectronTRD(dynamic_cast<const AliVTrack *>(track->GetRecTrack()), 0.8)) printf("Track identified as electron\n");
  else printf("Track rejected\n");
*/
  AliHFEpidObject::AnalysisType_t anatype = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis: AliHFEpidObject::kAODanalysis;
  Double_t p = GetP(track->GetRecTrack(), anatype);
  if(p < fMinP){ 
    AliDebug(2, Form("Track momentum below %f", fMinP));
    return 0;
  }

  if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kTRDpid, AliHFEdetPIDqa::kBeforePID); 

  if(fCutNTracklets > 0){
    AliDebug(1, Form("Number of tracklets cut applied: %d\n", fCutNTracklets));
    Int_t ntracklets = track->GetRecTrack() ? track->GetRecTrack()->GetTRDntrackletsPID() : 0;
    if(TestBit(kExactTrackletCut)){
      AliDebug(1, Form("Exact cut applied: %d tracklets found\n", ntracklets));
      if(ntracklets != fCutNTracklets) return 0;
    } else {
      AliDebug(1, Form("Greater Equal cut applied: %d tracklets found\n", ntracklets));
      if(ntracklets < fCutNTracklets) return 0;
    }
  }
  AliDebug(1,"Track selected\n");

  Double_t electronLike = GetElectronLikelihood(track->GetRecTrack(), anatype);
  Double_t threshold;
  if(TestBit(kSelectCutOnTheFly)){ 
    threshold = GetTRDthresholds(p, track->GetRecTrack()->GetTRDntrackletsPID());
  } else {
    threshold = GetTRDthresholds(p);
  }
  AliDebug(2, Form("Threshold: %f\n", threshold));
  if(electronLike > threshold){
    if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kTRDpid, AliHFEdetPIDqa::kAfterPID);
    return 11;
  }
  return 211;

}

//______________________________________________________
Int_t AliHFEpidTRD::IsSelectedTRDPID(const AliHFEpidObject *track, AliHFEpidQAmanager *pidqa) const {
  //
  // 2D TRD PID
  // 
  // 
  //
  AliDebug(2, "Applying TRD PID");
  if(!fkPIDResponse){
    AliDebug(2, "Cannot process track");
    return 0;
  }

  AliHFEpidObject::AnalysisType_t anatype = track->IsESDanalysis() ? AliHFEpidObject::kESDanalysis: AliHFEpidObject::kAODanalysis;
  Double_t p = GetP(track->GetRecTrack(), anatype);
  if(p < fMinP){ 
    AliDebug(2, Form("Track momentum below %f", fMinP));
    return 0;
  }

  if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kTRDpid, AliHFEdetPIDqa::kBeforePID); 
  
  if(fCutNTracklets > 0){
    AliDebug(1, Form("Number of tracklets cut applied: %d\n", fCutNTracklets));
    Int_t ntracklets = track->GetRecTrack() ? track->GetRecTrack()->GetTRDntrackletsPID() : 0;
    if(TestBit(kExactTrackletCut)){
      AliDebug(1, Form("Exact cut applied: %d tracklets found\n", ntracklets));
      if(ntracklets != fCutNTracklets) return 0;
    } else {
      AliDebug(1, Form("Greater Equal cut applied: %d tracklets found\n", ntracklets));
      if(ntracklets < fCutNTracklets) return 0;
    }
  }
  AliDebug(1,"Track selected\n");

  Int_t centralitybin = track->IsPbPb() ? track->GetCentrality() : -2;
  Float_t fCentralityLimitsdefault[12]= {0.,5.,10., 20., 30., 40., 50., 60.,70.,80., 90., 100.};
  Float_t centrality=-1;
  if(centralitybin>=0) centrality=fCentralityLimitsdefault[centralitybin]+1;

  AliTRDPIDResponse::ETRDPIDMethod fTRDPIDMethod = AliTRDPIDResponse::kLQ1D;
  if(fTRD2DPID) fTRDPIDMethod = AliTRDPIDResponse::kLQ2D;

//  printf("TRD PID Method in use: %i \n",fTRDPIDMethod);
  //  if(fkPIDResponse->IdentifiedAsElectronTRD(track->GetRecTrack(),fElectronEfficiency,centrality,fTRDPIDMethod)){
  Int_t ntrackletsPID=0;
  Bool_t iselectron=kFALSE;
  iselectron=fkPIDResponse->IdentifiedAsElectronTRD(track->GetRecTrack(),ntrackletsPID,fElectronEfficiency,centrality,fTRDPIDMethod);
  if((ntrackletsPID==fCutNTracklets) && iselectron){
      AliDebug(2, Form("Electron effi: %f %i %i %f %i\n", fElectronEfficiency,track->GetCentrality(),centralitybin,centrality,fTRDPIDMethod));
      if(pidqa) pidqa->ProcessTrack(track, AliHFEpid::kTRDpid, AliHFEdetPIDqa::kAfterPID); 
      return 11;
  } else return 211;



}

//___________________________________________________________________
Double_t AliHFEpidTRD::GetTRDthresholds(Double_t p, UInt_t nTracklets) const { 
  //
  // Return momentum dependent and electron efficiency dependent TRD thresholds
  // Determine threshold based on the number of tracklets on the fly, electron efficiency not modified
  // 
  Double_t threshParams[4];
  AliDebug(1, Form("Select cut for %d tracklets\n", nTracklets));
  // Get threshold paramters for the given number of tracklets from OADB container
  AliHFEOADBThresholdsTRD *thresholds = dynamic_cast<AliHFEOADBThresholdsTRD *>(fOADBThresholds->GetObject(fRunNumber));
  if(!thresholds){
    AliDebug(1, Form("Thresholds for run %d not in the OADB", fRunNumber));
    return 0.;
  }
  if(!thresholds->GetThresholdParameters(nTracklets, fElectronEfficiency, threshParams)){
    AliDebug(1, "loading thresholds failed\n");
    return 0.;
  }
  Double_t threshold = 1. - threshParams[0] - threshParams[1] * p - threshParams[2] * TMath::Exp(-threshParams[3] * p);
  return TMath::Max(TMath::Min(threshold, 0.99), 0.2); // truncate the threshold upperwards to 0.999 and lowerwards to 0.2 and exclude unphysical values
}

//___________________________________________________________________
Double_t AliHFEpidTRD::GetTRDthresholds(Double_t p) const { 
  //
  // Return momentum dependent and electron efficiency dependent TRD thresholds
  // 
  Double_t threshold = 1. - fThreshParams[0] - fThreshParams[1] * p - fThreshParams[2] * TMath::Exp(-fThreshParams[3] * p);
  return TMath::Max(TMath::Min(threshold, 0.99), 0.2); // truncate the threshold upperwards to 0.999 and lowerwards to 0.2 and exclude unphysical values
}


//___________________________________________________________________
Bool_t AliHFEpidTRD::InitParamsFromOADB(Int_t run){
  //
  // The name of the function says it all
  //
  AliHFEOADBThresholdsTRD *thresholds = dynamic_cast<AliHFEOADBThresholdsTRD *>(fOADBThresholds->GetObject(run));
  if(!thresholds){
    AliDebug(1, Form("Thresholds for run %d not in the OADB", run));
    return kFALSE;
  }
  return thresholds->GetThresholdParameters(fNTracklets, fElectronEfficiency, fThreshParams);
}

//___________________________________________________________________
void AliHFEpidTRD::RenormalizeElPi(const Double_t * const likein, Double_t * const likeout) const {
  //
  // Renormalize likelihoods for electrons and pions neglecting the 
  // likelihoods for protons, kaons and muons
  //
  memset(likeout, 0, sizeof(Double_t) * AliPID::kSPECIES);
  Double_t norm = likein[AliPID::kElectron] + likein[AliPID::kPion];
  if(norm == 0.) norm = 1.;   // Safety
  likeout[AliPID::kElectron] = likein[AliPID::kElectron] / norm;
  likeout[AliPID::kPion] = likein[AliPID::kPion] / norm;
}

//___________________________________________________________________
Double_t AliHFEpidTRD::GetElectronLikelihood(const AliVTrack *track, AliHFEpidObject::AnalysisType_t anaType) const {
  //
  // Get TRD likelihoods for ESD respectively AOD tracks
  //
  Double_t pidProbs[AliPID::kSPECIES]; memset(pidProbs, 0, sizeof(Double_t) * AliPID::kSPECIES);
  if(anaType == AliHFEpidObject::kESDanalysis){
    const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
    if(esdtrack) esdtrack->GetTRDpid(pidProbs);
  } else {
      if(fTRD2DPID) fkPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, pidProbs,AliTRDPIDResponse::kLQ2D);
      else fkPIDResponse->ComputeTRDProbability(track, AliPID::kSPECIES, pidProbs,AliTRDPIDResponse::kLQ1D);
  }
  if(!IsRenormalizeElPi()) return pidProbs[AliPID::kElectron];
  Double_t probsNew[AliPID::kSPECIES];
  RenormalizeElPi(pidProbs, probsNew);
  return probsNew[AliPID::kElectron];
}

//___________________________________________________________________
Double_t AliHFEpidTRD::GetP(const AliVParticle *track, AliHFEpidObject::AnalysisType_t anaType) const {
  //
  // Get the Momentum in the TRD
  //
  Double_t p = 0.;
  if(anaType == AliHFEpidObject::kESDanalysis){
    const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
    if(esdtrack) p = esdtrack->GetOuterParam() ? esdtrack->GetOuterParam()->P() : esdtrack->P();
  } else {
    const AliAODTrack *aodtrack = dynamic_cast<const AliAODTrack *>(track);
    if(aodtrack) p = aodtrack->P();
  }
  return p;
}

//___________________________________________________________________
Double_t AliHFEpidTRD::GetChargeLayer(const AliVParticle *track, UInt_t layer, AliHFEpidObject::AnalysisType_t anaType) const {
  //
  // Get the Charge in a single TRD layer
  //
  if(layer >= 6) return 0.;
  Double_t charge = 0.;
  if(anaType == AliHFEpidObject::kESDanalysis){
    const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
    if(esdtrack){
      // Distinction between old and new reconstruction: in the new reconstruction, the total charge is stored in slice 0, slices 1 to 8 are used for the slices for 
      // the neural network. 
      if(fTotalChargeInSlice0)
        charge = esdtrack->GetTRDslice(static_cast<UInt_t>(layer), 0);
      else
       for(Int_t islice = 0; islice < esdtrack->GetNumberOfTRDslices(); islice++) charge += esdtrack->GetTRDslice(static_cast<UInt_t>(layer), islice);
    }
  } else {
    const AliAODTrack *aodtrack = dynamic_cast<const AliAODTrack *>(track);
    AliAODPid *aoddetpid = aodtrack ? aodtrack->GetDetPid() : NULL;
    if(aoddetpid){
      if(fTotalChargeInSlice0)
        charge = aoddetpid->GetTRDslices()[layer * aoddetpid->GetTRDnSlices()];
      else
       for(Int_t islice = 0; islice < aoddetpid->GetTRDnSlices(); islice++) charge += aoddetpid->GetTRDslices()[layer * aoddetpid->GetTRDnSlices() + islice];
    }
  }
  return charge;
}

//___________________________________________________________________
void AliHFEpidTRD::GetTRDmomenta(const AliVTrack *track, Double_t *mom) const {
  //
  // Fill Array with momentum information at the TRD tracklet
  //
  for(Int_t itl = 0; itl < 6; itl++) 
    mom[itl] = track->GetTRDmomentum(itl);
}

//___________________________________________________________________
Double_t AliHFEpidTRD::GetTRDSignalV1(const AliESDtrack *track, Float_t truncation) const {
  //
  // Calculation of the TRD Signal via truncated mean
  // Method 1: Take all Slices available
  // cut out 0s
  // Order them in increasing order
  // Cut out the upper third
  // Calculate mean over the last 2/3 slices
  //
  const Int_t kNSlices = 48;
  const Int_t kLastSlice = 6; // Slice 7 is taken out from the truncated mean calculation
  const Double_t kVerySmall = 1e-12;
  // Weight the slice to equalize the MPV of the dQ/dl-distribution per slice to the one in the first slice
  // Pions are used as reference for the equalization
  const Double_t kWeightSlice[8] = {1., 2.122, 1.8, 1.635, 1.595, 1.614, 1.16, 7.0};
  const Double_t kWeightSliceNo0[8] = {1., 1., 1.271, 1.451, 1.531, 1.543, 1.553, 2.163};  // Weighting factors in case slice 0 stores the total charge
  const Double_t *kWeightFactor = fTotalChargeInSlice0 ? kWeightSliceNo0 : kWeightSlice;
  AliDebug(3, Form("Number of Tracklets: %d\n", track->GetTRDntrackletsPID()));
  Double_t trdSlices[kNSlices], tmp[kNSlices];
  Int_t indices[48];
  Int_t icnt = 0;
  for(Int_t idet = 0; idet < 6; idet++)
    for(Int_t islice = fTotalChargeInSlice0 ? 1 : 0 ; islice <= kLastSlice; islice++){
      AliDebug(2, Form("Chamber[%d], Slice[%d]: TRDSlice = %f", idet, islice, track->GetTRDslice(idet, islice)));
      if(TMath::Abs(track->GetTRDslice(idet, islice)) < kVerySmall) continue;;
      trdSlices[icnt++] = track->GetTRDslice(idet, islice) * kWeightFactor[islice];
    }
  AliDebug(1, Form("Number of Slices: %d\n", icnt));
  if(icnt < 6) return 0.;   // We need at least 6 Slices for the truncated mean
  TMath::Sort(icnt, trdSlices, indices, kFALSE);
  memcpy(tmp, trdSlices, sizeof(Double_t) * icnt);
  for(Int_t ien = 0; ien < icnt; ien++)
    trdSlices[ien] = tmp[indices[ien]];
  Double_t trdSignal = TMath::Mean(static_cast<Int_t>(static_cast<Float_t>(icnt) * truncation), trdSlices);
  Double_t mom = track->GetOuterParam() ? track->GetOuterParam()->P() : -1;
  AliDebug(3, Form("PID Meth. 1: p[%f], TRDSignal[%f]", mom, trdSignal));
  return trdSignal;
}

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