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.                  *
**************************************************************************/
//
// Extra cuts implemented by the ALICE Heavy Flavour Electron Group
// Cuts stored here:
// - ITS pixels
// - TPC cluster ratio
// - TRD tracklets
//
// Authors:
//   Markus Fasel <M.Fasel@gsi.de>
//
#include <TBits.h>
#include <TClass.h>
#include <TH1F.h>
#include <TH2F.h>
#include <TList.h>
#include <TString.h>
#include <TMath.h>

#include "AliAODEvent.h"
#include "AliAODTrack.h"
#include "AliAODPid.h"
#include "AliAODVertex.h"
#include "AliAODTrack.h"
#include "AliESDEvent.h"
#include "AliESDVertex.h"
#include "AliESDtrack.h"
#include "AliLog.h"
#include "AliMCParticle.h"
#include "AliVEvent.h"
#include "AliVTrack.h"
#include "AliVParticle.h"
#include "AliVertexerTracks.h"
#include "AliVVertex.h"
#include "AliExternalTrackParam.h"

#include "AliHFEextraCuts.h"

ClassImp(AliHFEextraCuts)

const Int_t AliHFEextraCuts::fgkNQAhistos = 10;

//______________________________________________________
AliHFEextraCuts::AliHFEextraCuts(const Char_t *name, const Char_t *title):
  AliCFCutBase(name, title),
  fEvent(NULL),
  fCutCorrelation(0),
  fRequirements(0),
  fMinNClustersTPC(0),
  fMinNClustersTPCPID(0),
  fClusterRatioTPC(0.),
  fMinTrackletsTRD(0),
  fMaxChi2TRD(5.0),
  fMinNbITScls(0),
  fTRDtrackletsExact(0),
  fPixelITS(0),
  fDriftITS(0),
  fTPCclusterDef(0),
  fTPCclusterRatioDef(0),
  fFractionTPCShared(-1.0),
  fOppSideIPcut(kFALSE),
  fTOFsignalDx(1.0),
  fTOFsignalDz(1.0),
  fMagField(-10000),
  fAODFilterBit(0),
  fListKinkMothers(1000),
  fNumberKinkMothers(0),
  fCheck(kFALSE),
  fQAlist(0x0) ,
  fDebugLevel(0)
{
  //
  // Default Constructor
  //
  //printf("Set the number of min ITS clusters %d\n",(Int_t)fMinNbITScls);
  memset(fImpactParamCut, 0, sizeof(Float_t) * 4);
  memset(fIPcutParam, 0, sizeof(Float_t) * 4);
}

//______________________________________________________
AliHFEextraCuts::AliHFEextraCuts(const AliHFEextraCuts &c):
  AliCFCutBase(c),
  fEvent(c.fEvent),
  fCutCorrelation(c.fCutCorrelation),
  fRequirements(c.fRequirements),
  fMinNClustersTPC(c.fMinNClustersTPC),
  fMinNClustersTPCPID(c.fMinNClustersTPCPID),
  fClusterRatioTPC(c.fClusterRatioTPC),
  fMinTrackletsTRD(c.fMinTrackletsTRD),
  fMaxChi2TRD(c.fMaxChi2TRD),
  fMinNbITScls(c.fMinNbITScls),
  fTRDtrackletsExact(c.fTRDtrackletsExact),
  fPixelITS(c.fPixelITS),
  fDriftITS(c.fDriftITS),
  fTPCclusterDef(c.fTPCclusterDef),
  fTPCclusterRatioDef(c.fTPCclusterRatioDef),
  fFractionTPCShared(c.fFractionTPCShared),
  fOppSideIPcut(c.fOppSideIPcut),
  fTOFsignalDx(c.fTOFsignalDx),
  fTOFsignalDz(c.fTOFsignalDz),
  fMagField(c.fMagField),
  fAODFilterBit(c.fAODFilterBit),
  fListKinkMothers(c.fListKinkMothers),
  fNumberKinkMothers(c.fNumberKinkMothers),
  fCheck(c.fCheck),
  fQAlist(0x0),
  fDebugLevel(0)
{
  //
  // Copy constructor
  // Performs a deep copy
  //
  memcpy(fImpactParamCut, c.fImpactParamCut, sizeof(Float_t) * 4);
  memcpy(fIPcutParam, c.fIPcutParam, sizeof(Float_t) * 4);
  if(IsQAOn()){
    fIsQAOn = kTRUE;
    fQAlist = dynamic_cast<TList *>(c.fQAlist->Clone());
    if(fQAlist) fQAlist->SetOwner();
  }
}

//______________________________________________________
AliHFEextraCuts &AliHFEextraCuts::operator=(const AliHFEextraCuts &c){
  //
  // Assignment operator
  //
  if(this != &c){
    AliCFCutBase::operator=(c);
    fEvent = c.fEvent;
    fCutCorrelation = c.fCutCorrelation;
    fRequirements = c.fRequirements;
    fClusterRatioTPC = c.fClusterRatioTPC;
    fMinNClustersTPC = c.fMinNClustersTPC;
    fMinNClustersTPCPID = c.fMinNClustersTPCPID;
    fMinTrackletsTRD = c.fMinTrackletsTRD;
    fMaxChi2TRD      = c.fMaxChi2TRD;
    fMinNbITScls = c.fMinNbITScls;
    fTRDtrackletsExact = c.fTRDtrackletsExact;
    fPixelITS = c.fPixelITS;
    fDriftITS = c.fDriftITS;
    fTPCclusterDef = c.fTPCclusterDef;
    fTPCclusterRatioDef = c.fTPCclusterRatioDef;
    fFractionTPCShared = c.fFractionTPCShared;
    fOppSideIPcut = c.fOppSideIPcut;
    fTOFsignalDx = c.fTOFsignalDx;
    fTOFsignalDz = c.fTOFsignalDz;
    fMagField = c.fMagField;
    fAODFilterBit = c.fAODFilterBit;
    fListKinkMothers = c.fListKinkMothers;
    fNumberKinkMothers = c.fNumberKinkMothers;
    fCheck = c.fCheck;
    fDebugLevel = c.fDebugLevel;
    memcpy(fImpactParamCut, c.fImpactParamCut, sizeof(Float_t) * 4);
    memcpy(fIPcutParam, c.fIPcutParam, sizeof(Float_t) * 4);
    if(IsQAOn()){
      fIsQAOn = kTRUE;
      fQAlist = dynamic_cast<TList *>(c.fQAlist->Clone());
      if(fQAlist) fQAlist->SetOwner();
    }else fQAlist = 0x0;
  }
  return *this;
}

//______________________________________________________
AliHFEextraCuts::~AliHFEextraCuts(){
  //
  // Destructor
  //
  if(fQAlist) delete fQAlist;
}

//______________________________________________________
void AliHFEextraCuts::SetRecEventInfo(const TObject *event){
  //
  // Set Virtual event an make a copy
  //
  if (!event) {
    AliError("Pointer to AliVEvent !");
    return;
  }
  TString className(event->ClassName());
  if (! (className.CompareTo("AliESDEvent")==0 || className.CompareTo("AliAODEvent")==0)) {
    AliError("argument must point to an AliESDEvent or AliAODEvent !");
    return ;
  }
  fEvent = (AliVEvent*) event;
  
  AliAODEvent *aodevent = dynamic_cast<AliAODEvent *>(fEvent);
  if(aodevent){
    // Initialize lookup for kink mother rejection
    if(aodevent->GetNumberOfVertices() > fListKinkMothers.GetSize()) fListKinkMothers.Set(aodevent->GetNumberOfVertices());
    fNumberKinkMothers = 0;
    for(Int_t ivtx = 0; ivtx < aodevent->GetNumberOfVertices(); ivtx++){
      AliAODVertex *aodvtx = aodevent->GetVertex(ivtx);
      if(aodvtx->GetType() != AliAODVertex::kKink) continue;
      AliAODTrack *mother = (AliAODTrack *) aodvtx->GetParent();
      if(!mother) continue;
      Int_t idmother = mother->GetID();
      fListKinkMothers[fNumberKinkMothers++] = idmother;
    }
  }
}

//______________________________________________________
Bool_t AliHFEextraCuts::IsSelected(TObject *o){
  //
  // Steering function for the track selection
  //
  TClass *type = o->IsA();
  AliDebug(2, Form("Object type %s", type->GetName()));
  if((type == AliESDtrack::Class()) || (type == AliAODTrack::Class())){
    return CheckRecCuts(dynamic_cast<AliVTrack *>(o));
  }
  return CheckMCCuts(dynamic_cast<AliVParticle *>(o));
}

//______________________________________________________
Bool_t AliHFEextraCuts::CheckRecCuts(AliVTrack *track){
  //
  // Checks cuts on reconstructed tracks
  // returns true if track is selected
  // QA histograms are filled before track selection and for
  // selected tracks after track selection
  //
  AliDebug(1, Form("%s: Called", GetName()));
  ULong64_t survivedCut = 0;	// Bitmap for cuts which are passed by the track, later to be compared with fRequirements
  if(IsQAOn()) FillQAhistosRec(track, kBeforeCuts);
  // Apply cuts
  Float_t impactR = -999.;
  Float_t impactZ = -999.;
  Double_t hfeimpactR, hfeimpactnsigmaR;
  Double_t hfeimpactRcut, hfeimpactnsigmaRcut;
  Double_t maximpactRcut; 
  GetImpactParameters(track, impactR, impactZ);
  if(TESTBIT(fRequirements, kMinHFEImpactParamR) || TESTBIT(fRequirements, kMinHFEImpactParamNsigmaR)||TESTBIT(fRequirements, kMinHFEImpactParamRcharge)){
    // Protection for PbPb
    GetHFEImpactParameterCuts(track, hfeimpactRcut, hfeimpactnsigmaRcut);
    GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
  }
  Int_t  nclsITS = GetITSNbOfcls(track);
  UInt_t nclsTPC = GetTPCncls(track);
  UInt_t nclsTPCPID = track->GetTPCsignalN();
  // printf("Check TPC findable clusters: %d, found Clusters: %d\n", track->GetTPCNclsF(), track->GetTPCNcls());
  Float_t fractionSharedClustersTPC = GetTPCsharedClustersRatio(track);
  Double_t ratioTPC = GetTPCclusterRatio(track);
  UChar_t trdTracklets;
  trdTracklets = track->GetTRDntrackletsPID();
  Float_t trdchi2=-999.;
  trdchi2=GetTRDchi(track);
  UChar_t itsPixel = track->GetITSClusterMap();
  Int_t status1 = GetITSstatus(track, 0);
  Int_t status2 = GetITSstatus(track, 1);
  Bool_t statusL0 = CheckITSstatus(status1);
  Bool_t statusL1 = CheckITSstatus(status2);
  Double_t tofsignalDx = 0.0;
  Double_t tofsignalDz = 0.0;
  GetTOFsignalDxDz(track,tofsignalDx,tofsignalDz);

  if(TESTBIT(fRequirements, kTPCfractionShared)) {
    // cut on max fraction of shared TPC clusters
    if(TMath::Abs(fractionSharedClustersTPC) < fFractionTPCShared) SETBIT(survivedCut, kTPCfractionShared);    
  }
  if(TESTBIT(fRequirements, kMinImpactParamR)){
    // cut on min. Impact Parameter in Radial direction
    if(TMath::Abs(impactR) >= fImpactParamCut[0]) SETBIT(survivedCut, kMinImpactParamR);
  }
  if(TESTBIT(fRequirements, kMinImpactParamZ)){
    // cut on min. Impact Parameter in Z direction
    if(TMath::Abs(impactZ) >= fImpactParamCut[1]) SETBIT(survivedCut, kMinImpactParamZ);
  }
  if(TESTBIT(fRequirements, kMaxImpactParamR)){
    // cut on max. Impact Parameter in Radial direction
    if(TMath::Abs(impactR) <= fImpactParamCut[2]) SETBIT(survivedCut, kMaxImpactParamR);
  }
  if(TESTBIT(fRequirements, kMaxImpactParameterRpar)) {
    // HFE Impact parameter cut
    GetMaxImpactParameterCutR(track,maximpactRcut);
    if(TMath::Abs(impactR) >= maximpactRcut) SETBIT(fRequirements, kMaxImpactParameterRpar);
  }
  if(TESTBIT(fRequirements, kMaxImpactParamZ)){
    // cut on max. Impact Parameter in Z direction
    if(TMath::Abs(impactZ) <= fImpactParamCut[3]) SETBIT(survivedCut, kMaxImpactParamZ);
  }
  if(TESTBIT(fRequirements, kMinHFEImpactParamR)){
    // cut on min. HFE Impact Parameter in Radial direction
    if(TMath::Abs(hfeimpactR) >= hfeimpactRcut) SETBIT(survivedCut, kMinHFEImpactParamR);
  }
  if(TESTBIT(fRequirements, kMinHFEImpactParamRcharge)){
    // cut on min. HFE Impact Parameter in Radial direction, multiplied by particle charge
    Double_t charge = (Double_t)track->Charge();
    
    if(fMagField < 0)charge *= -1.;//the IP distribution side to be chosen depends on magnetic field polarization
    if(fOppSideIPcut)charge*=-1.;//in case we choose to select electrons from the side of the photon peak
    Double_t hfeimpactRcharge = hfeimpactR*charge;//switch selected side of the peak
    if(hfeimpactRcharge >= hfeimpactRcut) SETBIT(survivedCut, kMinHFEImpactParamRcharge);
  }
  if(TESTBIT(fRequirements, kMinHFEImpactParamNsigmaR)){
    // cut on max. HFE Impact Parameter n sigma in Radial direction
    // if(fAbsHFEImpactParamNsigmaR) {
    //   //if((TMath::Abs(hfeimpactnsigmaR) >= hfeimpactnsigmaRcut) && (TMath::Abs(hfeimpactnsigmaR) < 8)) { //mj debug
    //     if(TMath::Abs(hfeimpactnsigmaR) >= hfeimpactnsigmaRcut) {
    //       SETBIT(survivedCut, kMinHFEImpactParamNsigmaR);
    //       //  printf("0: hfeimpactnsigmaR= %lf hfeimpactnsigmaRcut= %lf\n",hfeimpactnsigmaR,hfeimpactnsigmaRcut);
    //     }
    //   }
    //   else {
    if(hfeimpactnsigmaRcut>0){
      if(hfeimpactnsigmaR >= hfeimpactnsigmaRcut) {
        SETBIT(survivedCut, kMinHFEImpactParamNsigmaR);
        //printf("1: hfeimpactnsigmaR= %lf hfeimpactnsigmaRcut= %lf\n",hfeimpactnsigmaR,hfeimpactnsigmaRcut);
      }
    }
    else{
      if(hfeimpactnsigmaR <= hfeimpactnsigmaRcut) {
        SETBIT(survivedCut, kMinHFEImpactParamNsigmaR);
        //printf("2: hfeimpactnsigmaR= %lf hfeimpactnsigmaRcut= %lf\n",hfeimpactnsigmaR,hfeimpactnsigmaRcut);
      }
    }
    //}
  }
  if(TESTBIT(fRequirements, kClusterRatioTPC)){
    // cut on min ratio of found TPC clusters vs findable TPC clusters
    if(ratioTPC >= fClusterRatioTPC) SETBIT(survivedCut, kClusterRatioTPC);
  }
  if(TESTBIT(fRequirements, kMinTrackletsTRD)){
    // cut on minimum number of TRD tracklets
    AliDebug(1, Form("%s: Min TRD cut: [%d|%d], Require exact number [%s]\n", GetName(), fMinTrackletsTRD, trdTracklets, fTRDtrackletsExact ? "Yes" : "No"));
    if(fTRDtrackletsExact){
      if(trdTracklets == fMinTrackletsTRD) {
        SETBIT(survivedCut, kMinTrackletsTRD);
        AliDebug(1, Form("%s: Track Selected", GetName()));
      }
    }else{
      if(trdTracklets >= fMinTrackletsTRD){ 
        SETBIT(survivedCut, kMinTrackletsTRD);
        AliDebug(1, Form("%s: Track Selected", GetName()));
      }
      //printf("Min number of tracklets %d\n",fMinTrackletsTRD);
    }
  }

  if(TESTBIT(fRequirements, kMaxTRDChi2)){
    // cut on TRD chi2
    AliDebug(1, Form("%s: Cut on TRD chi2: [%f|%f]\n", GetName(),fMaxChi2TRD, trdchi2));
    if(trdchi2 < fMaxChi2TRD) {
	SETBIT(survivedCut, kMaxTRDChi2);
        AliDebug(1,Form("%s: survived %f\n",GetName(),trdchi2));
    }
  }

  if(TESTBIT(fRequirements, kMinNbITScls)){
    // cut on minimum number of ITS clusters
    //printf(Form("Min ITS clusters: [%d|%d]\n", (Int_t)fMinNbITScls, nclsITS));
    AliDebug(1, Form("%s: Min ITS clusters: [%d|%d]\n", GetName(), fMinNbITScls, nclsITS));
    if(nclsITS >= ((Int_t)fMinNbITScls)) SETBIT(survivedCut, kMinNbITScls);
  }
  
  if(TESTBIT(fRequirements, kMinNClustersTPC)){
    // cut on minimum number of TPC tracklets
    //printf(Form("Min TPC cut: [%d|%d]\n", fMinNClustersTPC, nclsTPC));
    AliDebug(1, Form("%s: Min TPC cut: [%d|%d]\n", GetName(), fMinNClustersTPC, nclsTPC));
    if(nclsTPC >= fMinNClustersTPC) SETBIT(survivedCut, kMinNClustersTPC);
  }
  if(TESTBIT(fRequirements, kMinNClustersTPCPID)){
    AliDebug(1, Form("%s: Min TPC PID cut: [%d|%d]\n", GetName(), fMinNClustersTPCPID, nclsTPCPID));
    if(nclsTPCPID >= fMinNClustersTPCPID) SETBIT(survivedCut, kMinNClustersTPCPID);
  }
  if(TESTBIT(fRequirements, kDriftITS)){
    //printf("Require drift\n");
    switch(fDriftITS){
    case kFirstD:
      if(TESTBIT(itsPixel, 2)) SETBIT(survivedCut, kDriftITS);
      break;
    default: 
      SETBIT(survivedCut, kDriftITS);
      break;
  }
  }
  if(TESTBIT(fRequirements, kPixelITS)){
    // cut on ITS pixel layers
    AliDebug(1, Form("%s: ITS cluster Map: ", GetName()));
    //PrintBitMap(itsPixel);
    switch(fPixelITS){
      case kFirst:
        AliDebug(2, "First");
	//printf("First\n");
	      if(TESTBIT(itsPixel, 0)) 
	        SETBIT(survivedCut, kPixelITS);
        else
	        if(fCheck && !statusL0)
	          SETBIT(survivedCut, kPixelITS);
		    break;
      case kSecond: 
	//printf("Second\n");
        AliDebug(2, "Second");
	      if(TESTBIT(itsPixel, 1))
	        SETBIT(survivedCut, kPixelITS);
        else
	        if(fCheck && !statusL1)
	          SETBIT(survivedCut, kPixelITS);
		    break;
      case kBoth: 
	//printf("Both\n");
        AliDebug(2, "Both");
	      if(TESTBIT(itsPixel,0) && TESTBIT(itsPixel,1))
		      SETBIT(survivedCut, kPixelITS);
	      else
          if(fCheck && !(statusL0 && statusL1)) 
		        SETBIT(survivedCut, kPixelITS);
	      break;
      case kAny: 
	//printf("Any\n");
        AliDebug(2, "Any");
	      if(TESTBIT(itsPixel, 0) || TESTBIT(itsPixel, 1))
	        SETBIT(survivedCut, kPixelITS);
        else
	        if(fCheck && !(statusL0 || statusL1))
	            SETBIT(survivedCut, kPixelITS);
		    break;
      case kExclusiveSecond:
        AliDebug(2, "Exlusive second");
        if(fCheck){ // Cut out tracks which pass a dead ITS Layer 0
          if(TESTBIT(itsPixel,1) && !TESTBIT(itsPixel,0) && statusL0)
            SETBIT(survivedCut, kPixelITS);
        } else {
          if(TESTBIT(itsPixel,1) && !TESTBIT(itsPixel,0))
            SETBIT(survivedCut, kPixelITS);
        }
        break;
      case kNone:
        // No cut applied, set as survived
        SETBIT(survivedCut, kPixelITS);
        break;
      default: 
        // default, defined as no cut applied 
        AliDebug(2, "None");
        SETBIT(survivedCut, kPixelITS);
        break;
    }
    AliDebug(1, Form("%s: Survived Cut: %s\n", GetName(), TESTBIT(survivedCut, kPixelITS) ? "YES" : "NO"));
  }

  if(TESTBIT(fRequirements, kTOFPID)){
    // cut on TOF pid
    if(track->GetStatus() & AliESDtrack::kTOFpid) SETBIT(survivedCut, kTOFPID);
  }

  if(TESTBIT(fRequirements, kTOFmismatch)){
    // cut on TOF mismatch
    if(!(track->GetStatus() & AliESDtrack::kTOFmismatch)) SETBIT(survivedCut, kTOFmismatch);
  }

  if(TESTBIT(fRequirements, kTOFlabel)){
    if(MatchTOFlabel(track)) SETBIT(survivedCut, kTOFlabel);
  }

  if(TESTBIT(fRequirements, kTPCPIDCleanUp)){
      // cut on TPC PID cleanup
      Bool_t fBitsAboveThreshold=GetTPCCountSharedMapBitsAboveThreshold(track);
      if((fBitsAboveThreshold==0)&&(nclsTPCPID>80)) SETBIT(survivedCut, kTPCPIDCleanUp);
  }

  if(TESTBIT(fRequirements, kEMCALmatch)){
    if(track->GetStatus() && AliESDtrack::kEMCALmatch) SETBIT(survivedCut, kEMCALmatch);
  }

  if(TESTBIT(fRequirements, kRejectKinkDaughter)){
    //printf("test daughter\n");
    if(!IsKinkDaughter(track)) SETBIT(survivedCut, kRejectKinkDaughter);
    //else printf("Found kink daughter\n");
  }

  if(TESTBIT(fRequirements, kRejectKinkMother)){
    //printf("test mother\n");
    if(!IsKinkMother(track)) SETBIT(survivedCut, kRejectKinkMother);
    //else printf("Found kink mother\n");
  } 
  if(TESTBIT(fRequirements, kTOFsignalDxy)){
    // cut on TOF matching cluster
    if((TMath::Abs(tofsignalDx) <= fTOFsignalDx) && (TMath::Abs(tofsignalDz) <= fTOFsignalDz)) SETBIT(survivedCut, kTOFsignalDxy);
  }
  if(TESTBIT(fRequirements, kITSpattern)){
    // cut on ITS pattern (every layer with a working ITS module must have an ITS cluster)
    if(CheckITSpattern(track)) SETBIT(survivedCut, kITSpattern); 
  }
  if(TESTBIT(fRequirements, kAODFilterBit)){
    AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
    if(aodtrack){
      Int_t aodfilter = 1 << fAODFilterBit;
      if(aodtrack->TestFilterBit(aodfilter)) SETBIT(survivedCut, kAODFilterBit);
    }
  }
  
  if(fRequirements == survivedCut){
    // 
    // Track selected
    //
    AliDebug(2, Form("%s: Track Survived cuts\n", GetName()));
    if(IsQAOn()) FillQAhistosRec(track, kAfterCuts);
    return kTRUE;
  }
  AliDebug(2, Form("%s: Track cut", GetName()));
  if(IsQAOn()) FillCutCorrelation(survivedCut);
  return kFALSE;
}

//______________________________________________________
Bool_t AliHFEextraCuts::CheckMCCuts(AliVParticle */*track*/) const {
  //
  // Checks cuts on Monte Carlo tracks
  // returns true if track is selected
  // QA histograms are filled before track selection and for
  // selected tracks after track selection
  //
  return kTRUE;	// not yet implemented
}

//______________________________________________________
void AliHFEextraCuts::FillQAhistosRec(AliVTrack *track, UInt_t when){
  //
  // Fill the QA histograms for ESD tracks
  // Function can be called before cuts or after cut application (second argument)
  //
  Float_t impactR, impactZ;
  GetImpactParameters(track, impactR, impactZ);
  TH1 *htmp = NULL;
  if((htmp = dynamic_cast<TH1F *>(fQAlist->At(0 + when * fgkNQAhistos)))) htmp->Fill(impactR);
  if((htmp = dynamic_cast<TH1F *>(fQAlist->At(1 + when * fgkNQAhistos)))) htmp->Fill(impactZ);
  // printf("TPC findable clusters: %d, found Clusters: %d\n", track->GetTPCNclsF(), track->GetTPCNcls());
  if((htmp = dynamic_cast<TH1F *>(fQAlist->At(2 + when * fgkNQAhistos)))) htmp->Fill(GetTPCclusterRatio(track));
  if((htmp = dynamic_cast<TH1F *>(fQAlist->At(3 + when * fgkNQAhistos)))) htmp->Fill(track->GetTRDntrackletsPID());
  if((htmp = dynamic_cast<TH1F *>(fQAlist->At(4 + when * fgkNQAhistos)))) htmp->Fill(GetTPCncls(track));
  UChar_t itsPixel = track->GetITSClusterMap();
  TH1 *pixelHist = dynamic_cast<TH1F *>(fQAlist->At(5 + when * fgkNQAhistos));
  //Int_t firstEntry = pixelHist->GetXaxis()->GetFirst();
  if(pixelHist){
    Double_t firstEntry = 0.5;
    if(!((itsPixel & BIT(0)) || (itsPixel & BIT(1))))
      pixelHist->Fill(firstEntry + 3);
    else{
      if(itsPixel & BIT(0)){
        pixelHist->Fill(firstEntry);
        if(itsPixel & BIT(1)) pixelHist->Fill(firstEntry + 2);
        else pixelHist->Fill(firstEntry + 4);
      }
      if(itsPixel & BIT(1)){
        pixelHist->Fill(firstEntry + 1);
        if(!(itsPixel & BIT(0))) pixelHist->Fill(firstEntry + 5);
      }
    }
  }
  // Fill histogram with the status bits
  TH1 *hStatusBits = dynamic_cast<TH1 *>(fQAlist->At(6 + when * fgkNQAhistos));
  if(hStatusBits) {
    hStatusBits->Fill(0);  // Fill first bin with all tracks
    if(track->GetStatus() && AliESDtrack::kTOFpid) hStatusBits->Fill(1);
    if(!(track->GetStatus() && AliESDtrack::kTOFmismatch)) hStatusBits->Fill(2);
    if(track->GetStatus() && AliESDtrack::kEMCALmatch) hStatusBits->Fill(3);
    if(GetTPCCountSharedMapBitsAboveThreshold(track)==0) hStatusBits->Fill(4);
  }
  if((htmp = dynamic_cast<TH1F *>(fQAlist->At(7 + when * fgkNQAhistos)))) htmp->Fill(track->GetTPCsignalN());

  if((htmp = dynamic_cast<TH1F *>(fQAlist->At(8 + when * fgkNQAhistos)))) htmp->Fill(GetTRDchi(track));

  if((htmp = dynamic_cast<TH1F *>(fQAlist->At(9 + when * fgkNQAhistos)))) htmp->Fill(GetITSNbOfcls(track));
}

// //______________________________________________________
// void AliHFEextraCuts::FillQAhistosMC(AliMCParticle *track, UInt_t when){
//   //
//   // Fill the QA histograms for MC tracks
//   // Function can be called before cuts or after cut application (second argument)
//   // Not yet implemented
//   //
// }

//______________________________________________________
void AliHFEextraCuts::FillCutCorrelation(ULong64_t survivedCut){
  //
  // Fill cut correlation histograms for tracks that didn't pass cuts
  //
  TH2 *correlation = dynamic_cast<TH2F *>(fQAlist->At(2 * fgkNQAhistos));
  if(correlation){
    for(Int_t icut = 0; icut < kNcuts; icut++){
      if(!TESTBIT(fRequirements, icut)) continue;
      for(Int_t jcut = icut; jcut < kNcuts; jcut++){
        if(!TESTBIT(fRequirements, jcut)) continue;
        if(TESTBIT(survivedCut, icut) && TESTBIT(survivedCut, jcut))
	        correlation->Fill(icut, jcut);
      }
    }
  }
}

//______________________________________________________
void AliHFEextraCuts::AddQAHistograms(TList *qaList){
  //
  // Add QA histograms
  // For each cut a histogram before and after track cut is created
  // Histos before respectively after cut are stored in different lists
  // Additionally a histogram with the cut correlation is created and stored
  // in the top directory
  //

  TH1 *histo1D = 0x0;
  TH2 *histo2D = 0x0;
  TString cutstr[2] = {"before", "after"};

  if(!fQAlist) fQAlist = new TList;  // for internal representation, not owner
  for(Int_t icond = 0; icond < 2; icond++){
    qaList->AddAt((histo1D = new TH1F(Form("%s_impactParamR%s",GetName(),cutstr[icond].Data()), "Radial Impact Parameter", 100, 0, 10)), 0 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 0 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("Impact Parameter");
    histo1D->GetYaxis()->SetTitle("Number of Tracks");
    qaList->AddAt((histo1D = new TH1F(Form("%s_impactParamZ%s",GetName(),cutstr[icond].Data()), "Z Impact Parameter", 200, 0, 20)), 1 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 1 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("Impact Parameter");
    histo1D->GetYaxis()->SetTitle("Number of Tracks");
    qaList->AddAt((histo1D = new TH1F(Form("%s_tpcClr%s",GetName(),cutstr[icond].Data()), "Cluster Ratio TPC", 100, 0, 1.3)), 2 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 2 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("Cluster Ratio TPC");
    histo1D->GetYaxis()->SetTitle("Number of Tracks");
    qaList->AddAt((histo1D = new TH1F(Form("%s_trdTracklets%s",GetName(),cutstr[icond].Data()), "Number of TRD tracklets", 7, 0, 7)), 3 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 3 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("Number of TRD Tracklets");
    histo1D->GetYaxis()->SetTitle("Number of Tracks");
    qaList->AddAt((histo1D = new TH1F(Form("%s_tpcClusters%s",GetName(),cutstr[icond].Data()), "Number of TPC clusters", 161, 0, 160)), 4 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 4 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("Number of TPC clusters");
    histo1D->GetYaxis()->SetTitle("Number of Tracks");
    qaList->AddAt((histo1D = new TH1F(Form("%s_itsPixel%s",GetName(),cutstr[icond].Data()), "ITS Pixel Hits", 6, 0, 6)), 5 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 5 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("ITS Pixel");
    histo1D->GetYaxis()->SetTitle("Number of Tracks");
    Int_t first = histo1D->GetXaxis()->GetFirst();
    TString binNames[6] = { "First", "Second", "Both", "None", "Exclusive First", "Exclusive Second"};
    for(Int_t ilabel = 0; ilabel < 6; ilabel++)
      histo1D->GetXaxis()->SetBinLabel(first + ilabel, binNames[ilabel].Data());
    qaList->AddAt((histo1D = new TH1F(Form("%s_trackStatus%s",GetName(),cutstr[icond].Data()), "Track Status", 5, 0, 5)), 6 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 6 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("Track Status Bit");
    histo1D->GetYaxis()->SetTitle("Number of tracks");
    TString tsnames[5] = {"All", "TOFPID", "No TOFmismatch", "EMCALmatch","No TPC shared bit"};
    for(Int_t istat = 0; istat < 5; istat++) histo1D->GetXaxis()->SetBinLabel(istat + 1, tsnames[istat].Data());
    qaList->AddAt((histo1D = new TH1F(Form("%s_tpcdEdxClusters%s",GetName(),cutstr[icond].Data()), "Number of TPC clusters for dEdx calculation", 161, 0, 160)), 7 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 7 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("Number of TPC clusters for dEdx calculation");
    histo1D->GetYaxis()->SetTitle("counts");
    qaList->AddAt((histo1D = new TH1F(Form("%s_trdchi2perTracklet%s",GetName(),cutstr[icond].Data()), "chi2 per TRD tracklet", 100, 0, 10)), 8 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 8 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("Chi2 per TRD Tracklet");
    histo1D->GetYaxis()->SetTitle("Number of Tracks");
    qaList->AddAt((histo1D = new TH1F(Form("%s_ITScls%s",GetName(),cutstr[icond].Data()), "ITScls", 6, 0, 6)), 9 + icond * fgkNQAhistos);
    fQAlist->AddAt(histo1D, 9 + icond * fgkNQAhistos);
    histo1D->GetXaxis()->SetTitle("ITScls");
    histo1D->GetYaxis()->SetTitle("Number of ITS cls");

  }
  // Add cut correlation
  qaList->AddAt((histo2D = new TH2F(Form("%s_cutcorrelation",GetName()), "Cut Correlation", kNcuts, 0, kNcuts - 1, kNcuts, 0, kNcuts -1)), 2 * fgkNQAhistos);
  fQAlist->AddAt(histo2D, 2 * fgkNQAhistos);
  TString labels[kNcuts] = {"MinImpactParamR", "MaxImpactParamR", "MinImpactParamZ", "MaxImpactParamZ", "ClusterRatioTPC", "MinTrackletsTRD", "ITSpixel", "kMinHFEImpactParamR", "kMinHFEImpactParamNsigmaR", "TPC Number of clusters" "Fraction Shared TPC clusters", "TOFPID", "No TOFmismatch", "EMCALmatch", "ImpactParam"};
  Int_t firstx = histo2D->GetXaxis()->GetFirst(), firsty = histo2D->GetYaxis()->GetFirst();
  for(Int_t icut = 0; icut < kNcuts; icut++){
    histo2D->GetXaxis()->SetBinLabel(firstx + icut, labels[icut].Data());
    histo2D->GetYaxis()->SetBinLabel(firsty + icut, labels[icut].Data());
  }
}

//______________________________________________________
void AliHFEextraCuts::PrintBitMap(Int_t bitmap){
  for(Int_t ibit = 32; ibit--; )
    printf("%d", bitmap & BIT(ibit) ? 1 : 0);
  printf("\n");
}

//______________________________________________________
Bool_t AliHFEextraCuts::CheckITSstatus(Int_t itsStatus) const {
  //
  // Check whether ITS area is dead
  //
  Bool_t status;
  switch(itsStatus){
    case 2: status = kFALSE; break;
    case 3: status = kFALSE; break;
    case 7: status = kFALSE; break;
    default: status = kTRUE;
  }
  return status;
}

//______________________________________________________
Int_t AliHFEextraCuts::GetITSstatus(const AliVTrack * const track, Int_t layer) const {
	//
	// Check ITS layer status
	//
	Int_t status = 0;
	if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
		Int_t det;
		Float_t xloc, zloc;
		const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
		if(esdtrack) esdtrack->GetITSModuleIndexInfo(layer, det, status, xloc, zloc);
	}
	return status;
}


//______________________________________________________
Bool_t AliHFEextraCuts::GetTPCCountSharedMapBitsAboveThreshold(AliVTrack *track){
  //
  // Checks if number of shared bits is above 1
  //
  Int_t nsharebit = 1;
  const TBits *shared;
  if(track->IsA() == AliESDtrack::Class())
    shared = &((static_cast<AliESDtrack *>(track))->GetTPCSharedMap());
  else if(track->IsA() == AliAODTrack::Class())
    shared = &((static_cast<AliAODTrack *>(track))->GetTPCSharedMap());
   else 
    return 0;

	if(shared->CountBits() >= 2) nsharebit=1;
  else nsharebit=0;
 
  return nsharebit;
}

//______________________________________________________
UInt_t AliHFEextraCuts::GetTPCncls(AliVTrack *track){
  //
  // Get Number of findable clusters in the TPC
  //
  Int_t nClusters = 0; // in case no Information available consider all clusters findable
  TClass *type = track->IsA();
  if(TESTBIT(fTPCclusterDef, kFoundIter1)){
    if(type == AliESDtrack::Class()){
      AliDebug(2, ("Using def kFoundIter1"));
      AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
      nClusters = esdtrack->GetTPCNclsIter1();
    } else {
      AliDebug(2, ("Number of clusters in iteration 1 not available for AOD tracks"));
    }
  } else if(TESTBIT(fTPCclusterDef, kCrossedRows)){
    AliDebug(2, ("Using def kCrossedRows"));
    nClusters = static_cast<UInt_t>(track->GetTPCClusterInfo(2,1));
  } else if(TESTBIT(fTPCclusterDef, kFound)){
    AliDebug(2, ("Using def kFound"));
    nClusters = track->GetTPCNcls();
  }
  else {
    AliDebug(2, ("Using def kFoundAll"));
    if(type == AliESDtrack::Class()){
      AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
      const TBits &clusterTPC = esdtrack->GetTPCClusterMap();
      nClusters = clusterTPC.CountBits();
    } 
    else {
      AliAODTrack *aodtrack = static_cast<AliAODTrack *>(track);
      const TBits &clusterTPC = aodtrack->GetTPCClusterMap();
      nClusters = clusterTPC.CountBits();
    }  
  }
  return nClusters;
}

//______________________________________________________
Float_t AliHFEextraCuts::GetTPCsharedClustersRatio(AliVTrack *track){
  //
  // Get fraction of shared TPC clusters
  //
  Float_t fracClustersTPCShared = 0.0; 
  Int_t nClustersTPC = track->GetTPCNcls();
  Int_t nClustersTPCShared = 0;
  TClass *type = track->IsA();
  if(type == AliESDtrack::Class()){
    AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
    nClustersTPCShared = esdtrack->GetTPCnclsS();
  } else if(type == AliAODTrack::Class()){
    AliAODTrack *aodtrack = static_cast<AliAODTrack *>(track);
    const TBits &shared = aodtrack->GetTPCSharedMap();
    nClustersTPCShared = shared.CountBits(0) - shared.CountBits(159);
  }
  if (nClustersTPC!=0) {
    fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
  }
  return fracClustersTPCShared;
}

//______________________________________________________
Double_t AliHFEextraCuts::GetTPCclusterRatio(AliVTrack *track){
  //
  // Get Ratio of found / findable clusters for different definitions
  // Only implemented for ESD tracks
  //
  Double_t clusterRatio = 1.; // in case no Information available consider all clusters findable
  TClass *type = track->IsA();
  if(TESTBIT(fTPCclusterRatioDef, kCROverFindable)){
    AliDebug(2, "Using ratio def kCROverFindable");
    clusterRatio = track->GetTPCNclsF() ? track->GetTPCClusterInfo(2,1)/static_cast<Double_t>(track->GetTPCNclsF()) : 1.; // crossed rows/findable
  } else if(TESTBIT(fTPCclusterRatioDef, kFoundOverCR)){
    AliDebug(2, "Using ratio def kFoundOverCR");
    clusterRatio = track->GetTPCClusterInfo(2,0); // found/crossed rows
  } else if(TESTBIT(fTPCclusterRatioDef, kFoundOverFindableIter1)){
    if(type == AliESDtrack::Class()){
      AliDebug(2, "Using ratio def kFoundOverFindableIter1");
      AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
      clusterRatio = esdtrack->GetTPCNclsFIter1() ? static_cast<Double_t>(esdtrack->GetTPCNclsIter1())/static_cast<Double_t>(esdtrack->GetTPCNclsFIter1()) : 1.; // crossed
    } else {
      AliDebug(2, "Cluster ratio after iteration 1 not possible for AOD tracks");
      clusterRatio = 1.;
    }
  } else if(TESTBIT(fTPCclusterRatioDef, kFoundOverFindable)) {
    AliDebug(2, "Using ratio def kFoundOverFindable");
    clusterRatio = track->GetTPCNclsF() ? static_cast<Double_t>(track->GetTPCNcls())/static_cast<Double_t>(track->GetTPCNclsF()) : 1.; // found/findable
  }
  else {
    AliDebug(2, "Using ratio def kFoundAllOverFindable");
    Int_t allclusters = 0;
    if(type == AliESDtrack::Class()){
      AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
      const TBits &clusterTPC = esdtrack->GetTPCClusterMap();
      allclusters = clusterTPC.CountBits();
    }
    else {
      AliAODTrack *aodtrack = static_cast<AliAODTrack *>(track);
      const TBits &clusterTPC = aodtrack->GetTPCClusterMap();
      allclusters = clusterTPC.CountBits();
    }
    clusterRatio = track->GetTPCNclsF() ? static_cast<Double_t>(allclusters)/static_cast<Double_t>(track->GetTPCNclsF()) : 1.; // foundall/findable
  }
  return clusterRatio;

}
//___________________________________________________
void AliHFEextraCuts::GetImpactParameters(AliVTrack *track, Float_t &radial, Float_t &z){
  //
  // Get impact parameter
  //

  const Double_t kBeampiperadius=3.;
  Double_t dcaD[2]={-999.,-999.},
           covD[3]={-999.,-999.,-999.};
  TClass *type = track->IsA();
  if(type == AliESDtrack::Class()){
    AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
    esdtrack->GetImpactParameters(radial, z);
  }
  else if(type == AliAODTrack::Class()){

    //case of AOD tracks
    AliAODEvent *aodevent = dynamic_cast<AliAODEvent *>(fEvent);
    if(!aodevent) {
      AliDebug(1, "No aod event available\n");
      return;
    }

    //Case ESD track: take copy constructor
    AliAODTrack *aodtrack = NULL;
    AliAODTrack *tmptrack = dynamic_cast<AliAODTrack *>(track);
    if(tmptrack) aodtrack = new AliAODTrack(*tmptrack);

    AliAODVertex *vtxAODSkip  = aodevent->GetPrimaryVertex();
    if(!vtxAODSkip) return;
    AliExternalTrackParam etp; etp.CopyFromVTrack(aodtrack);
    if(etp.PropagateToDCA(vtxAODSkip, aodevent->GetMagneticField(), kBeampiperadius, dcaD, covD)) {
      radial = dcaD[0];
      z = dcaD[1];
    }
    //if(vtxAODSkip) delete vtxAODSkip;
    if(aodtrack) delete aodtrack;
  }
}
//______________________________________________________
Bool_t AliHFEextraCuts::IsKinkDaughter(AliVTrack *track){
  //
  // Is kink Daughter
  //
  TClass *type = track->IsA();
  if(type == AliESDtrack::Class()){
    AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
    if(!esdtrack) return kFALSE;
    if(esdtrack->GetKinkIndex(0)>0) return kTRUE;
    else return kFALSE;

  }
  else if(type == AliAODTrack::Class()){
    AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
    if(aodtrack){
      AliAODVertex *aodvertex = aodtrack->GetProdVertex();
      if(!aodvertex) return kFALSE;
      if(aodvertex->GetType()==AliAODVertex::kKink) return kTRUE;
      else return kFALSE;
    }
    else return kFALSE;
  }

  return kFALSE;
}
//______________________________________________________
Bool_t AliHFEextraCuts::IsKinkMother(AliVTrack *track){
  //
  // Is kink Mother 
  //

  TClass *type = track->IsA();
  if(type == AliESDtrack::Class()){
    AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
    if(!esdtrack) return kFALSE;
    if(esdtrack->GetKinkIndex(0)!=0) return kTRUE;
    else return kFALSE;
  } else if(type == AliAODTrack::Class()){
    AliAODTrack *aodtrack = static_cast<AliAODTrack *>(track);
    for(int ikink = 0; ikink < fNumberKinkMothers; ikink++){
      if(fListKinkMothers[ikink] == aodtrack->GetID()) return kTRUE;
    }
  }

  return kFALSE;

}

//______________________________________________________
Float_t AliHFEextraCuts::GetTRDchi(AliVTrack *track){
  //
  // Get TRDchi2
  //
  Int_t ntls(0);
  TClass *type = track->IsA();
  if(type == AliESDtrack::Class()){
      AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
      ntls = esdtrack->GetTRDntracklets();
      return ntls ? esdtrack->GetTRDchi2()/ntls : -999;
  }
  else if(type == AliAODTrack::Class()){
    AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
    if(aodtrack){
      return  999.;
    }
  }

  return 999.;

}

//______________________________________________________
Int_t AliHFEextraCuts::GetITSNbOfcls(AliVTrack *track){
  //
  // Get ITS nb of clusters
  //
  TClass *type = track->IsA();
  if(type == AliESDtrack::Class()){
    AliESDtrack *esdtrack = static_cast<AliESDtrack *>(track);
    return esdtrack->GetITSclusters(0);

  }
  else if(type == AliAODTrack::Class()){
    AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
    if(aodtrack){
      return  aodtrack->GetITSNcls();
    }
  }

  return 0;
}
//______________________________________________________
void AliHFEextraCuts::GetHFEImpactParameters(const AliVTrack * const track, Double_t &dcaxy, Double_t &dcansigmaxy){
  //
  // Get HFE impact parameter (with recalculated primary vertex)
  //
  dcaxy=0;
  dcansigmaxy=0;
  if(!fEvent){
    AliDebug(1, "No Input event available\n");
    return;
  }
  TString type = track->IsA()->GetName();
  const Double_t kBeampiperadius=3.;
  Double_t dcaD[2]={-999.,-999.},
           covD[3]={-999.,-999.,-999.};
  Bool_t isRecalcVertex(kFALSE);

  if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
    //case of ESD tracks
    AliESDEvent *esdevent = dynamic_cast<AliESDEvent *>(fEvent);
    if(!esdevent) {
      AliDebug(1, "No esd event available\n");
      return;
    }

    const AliVVertex *vtxESDSkip = esdevent->GetPrimaryVertex();
    if(!vtxESDSkip) return;

    //case ESD track: take copy constructor
    const AliESDtrack *tmptrack = dynamic_cast<const AliESDtrack *>(track);
    if(tmptrack){

      if( vtxESDSkip->GetNContributors() < 30){ // if vertex contributor is smaller than 30, recalculate the primary vertex
        vtxESDSkip = RemoveDaughtersFromPrimaryVtx(esdevent, track);
        isRecalcVertex = kTRUE;
      }

      if(vtxESDSkip){
        AliESDtrack esdtrack(*tmptrack);
        fMagField = fEvent->GetMagneticField();
        if(esdtrack.PropagateToDCA(vtxESDSkip, fMagField, kBeampiperadius, dcaD, covD)){
          dcaxy = dcaD[0];
          if(covD[0]) dcansigmaxy = dcaxy/TMath::Sqrt(covD[0]);
        }
        if(isRecalcVertex) delete vtxESDSkip;
      }
    }
  }
  else {
    //case of AOD tracks
    AliAODEvent *aodevent = dynamic_cast<AliAODEvent *>(fEvent);
    if(!aodevent) {
      AliDebug(1, "No aod event available\n");
      return;
    }

    AliAODVertex *vtxAODSkip  = aodevent->GetPrimaryVertex();
    if(!vtxAODSkip) return;

    //Case ESD track: take copy constructor
    const AliAODTrack *tmptrack = dynamic_cast<const AliAODTrack *>(track);
    if(tmptrack){ 

      if(vtxAODSkip->GetNContributors() < 30){ // if vertex contributor is smaller than 30, recalculate the primary vertex
        vtxAODSkip = RemoveDaughtersFromPrimaryVtx(aodevent, track);
        isRecalcVertex = kTRUE;
      } 
      if(vtxAODSkip){
        AliAODTrack aodtrack(*tmptrack);
        AliExternalTrackParam etp; etp.CopyFromVTrack(&aodtrack);
        fMagField = aodevent->GetMagneticField();
        if(etp.PropagateToDCA(vtxAODSkip,fMagField, kBeampiperadius, dcaD, covD)) {
          dcaxy = dcaD[0];
          if(covD[0]) dcansigmaxy = dcaxy/TMath::Sqrt(covD[0]);
        }
        if(isRecalcVertex) delete vtxAODSkip;
      }
    }
  }
}

//______________________________________________________
void AliHFEextraCuts::GetHFEImpactParameters(const AliVTrack * const track, Double_t dcaD[2], Double_t covD[3]){
	//
	// Get HFE impact parameter (with recalculated primary vertex)
	//
  if(!fEvent){
    AliDebug(1, "No Input event available\n");
    return;
  }
  const Double_t kBeampiperadius=3.;
  TString type = track->IsA()->GetName();
  Bool_t isRecalcVertex(kFALSE);
  
  if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
    //case of ESD tracks
    AliESDEvent *esdevent = dynamic_cast<AliESDEvent *>(fEvent);
    if(!esdevent) {
      AliDebug(1, "No esd event available\n");
      return;
    }

    // Check whether primary vertex is available
    const AliVVertex *vtxESDSkip = esdevent->GetPrimaryVertex();
    if(!vtxESDSkip) return;

    const AliESDtrack *tmptrack = dynamic_cast<const AliESDtrack *>(track);
    if(tmptrack){
      //case ESD track: take copy constructor

      if( vtxESDSkip->GetNContributors() < 30){ // if vertex contributor is smaller than 30, recalculate the primary vertex
        vtxESDSkip = RemoveDaughtersFromPrimaryVtx(esdevent, track);
        isRecalcVertex = kTRUE;
      }
      if(vtxESDSkip){
        AliESDtrack esdtrack(*tmptrack);
        fMagField = fEvent->GetMagneticField();
        esdtrack.PropagateToDCA(vtxESDSkip, fMagField, kBeampiperadius, dcaD, covD);

        if(isRecalcVertex) delete vtxESDSkip;
      }
    }
  }
  else {
    //case of AOD tracks
    AliAODEvent *aodevent = dynamic_cast<AliAODEvent *>(fEvent);
    if(!aodevent) {
      AliDebug(1, "No aod event available\n");
      return;
    }

    // Check whether primary vertex is available
    AliAODVertex *vtxAODSkip  = aodevent->GetPrimaryVertex();
    if(!vtxAODSkip) return;

    //Case ESD track: take copy constructor
    const AliAODTrack *tmptrack = dynamic_cast<const AliAODTrack *>(track);
    if(tmptrack){

      if(vtxAODSkip->GetNContributors() < 30){ // if vertex contributor is smaller than 30, recalculate the primary vertex
        vtxAODSkip = RemoveDaughtersFromPrimaryVtx(aodevent, track);
        isRecalcVertex = kTRUE;
      }
      if(vtxAODSkip){
        AliAODTrack aodtrack(*tmptrack);
        AliExternalTrackParam etp; etp.CopyFromVTrack(&aodtrack);
        fMagField = aodevent->GetMagneticField();
        etp.PropagateToDCA(vtxAODSkip, fMagField, kBeampiperadius, dcaD, covD);

        if(isRecalcVertex) delete vtxAODSkip;
      }
    }
  }
}

//______________________________________________________
void AliHFEextraCuts::GetHFEImpactParameterCuts(const AliVTrack * const track, Double_t &hfeimpactRcut, Double_t &hfeimpactnsigmaRcut){
	//
	// Get HFE impact parameter cut(pt dependent)
	//
  
  Double_t pt = track->Pt();	
  hfeimpactRcut = fIPcutParam[0]+fIPcutParam[1]*exp(fIPcutParam[2]*pt);  // abs R cut
  hfeimpactnsigmaRcut = fIPcutParam[3];                                  // sigma cut
}
//______________________________________________________
void AliHFEextraCuts::GetMaxImpactParameterCutR(const AliVTrack * const track, Double_t &maximpactRcut){
	//
	// Get max impact parameter cut r (pt dependent)
	//
  
  Double_t pt = track->Pt();	
  if(pt > 0.15) {
    maximpactRcut = 0.0182 + 0.035/TMath::Power(pt,1.01);  // abs R cut
  }
  else maximpactRcut = 9999999999.0;
}
//______________________________________________________
void AliHFEextraCuts::GetTOFsignalDxDz(const AliVTrack * const track, Double_t &tofsignalDx, Double_t &tofsignalDz){
  //
  // TOF matching 
  //
  
  TString type = track->IsA()->GetName();
  if(!type.CompareTo("AliESDtrack")){
    const AliESDtrack *esdtrack = dynamic_cast<const AliESDtrack *>(track);
    if(!esdtrack) return;
    tofsignalDx = esdtrack->GetTOFsignalDx();
    tofsignalDz = esdtrack->GetTOFsignalDz();
  }

}

//______________________________________________________
Bool_t AliHFEextraCuts::MatchTOFlabel(const AliVTrack *const track) const { 
  //
  // Check whether the TOF label is the same as the track label
  //
  const AliESDtrack *esdtrk(NULL);
  const AliAODTrack *aodtrk(NULL);
  int trklabel(99999), toflabel[3] = {99999,99999,99999};
  if((esdtrk = dynamic_cast<const AliESDtrack *>(track))){
    trklabel = esdtrk->GetLabel(); 
    esdtrk->GetTOFLabel(toflabel); 
  } else if((aodtrk = dynamic_cast<const AliAODTrack *>(track))){
    trklabel = aodtrk->GetLabel(); 
    aodtrk->GetTOFLabel(toflabel); 
  } else return kFALSE;
  if(TMath::Abs(trklabel) == TMath::Abs(toflabel[0])) return kTRUE;
  return kFALSE;
}
//______________________________________________________
Bool_t AliHFEextraCuts::CheckITSpattern(const AliVTrack *const track) const {
  //
  // Check if every ITS layer, which has a module which is alive, also
  // has an ITS cluster
  //
  Bool_t patternOK(kTRUE);
  Int_t status(0);
  for(Int_t ily = 0; ily < 6; ily++){
    status = GetITSstatus(track, ily);
    if(CheckITSstatus(status)){
      // pixel alive, check whether layer has a cluster
      if(!TESTBIT(track->GetITSClusterMap(),ily)){
        // No cluster even though pixel is alive - reject track
        patternOK = kFALSE;
        break;
      }
    }
  }
  return patternOK;
}

//---------------------------------------------------------------------------
const AliVVertex* AliHFEextraCuts::RemoveDaughtersFromPrimaryVtx(const AliESDEvent * const esdevent, const AliVTrack * const track) {
  //
  // This method returns a primary vertex without the daughter tracks of the 
  // candidate and it recalculates the impact parameters and errors for ESD tracks.
  // 
  // The output vertex is created with "new". 
  //

  //const AliVVertex *vtxESDSkip = esdevent->GetPrimaryVertex();

  AliVertexerTracks vertexer(fEvent->GetMagneticField());
  vertexer.SetITSMode();
  vertexer.SetMinClusters(4);
  Int_t skipped[2];
  skipped[0] = track->GetID();
  vertexer.SetSkipTracks(1,skipped);

  //diamond constraint
  vertexer.SetConstraintOn();
  Float_t diamondcovxy[3];
  esdevent->GetDiamondCovXY(diamondcovxy);
  Double_t pos[3]={esdevent->GetDiamondX(),esdevent->GetDiamondY(),0.};
  Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
  AliESDVertex diamond(pos,cov,1.,1);
  vertexer.SetVtxStart(&diamond);

  const AliVVertex *vtxESDSkip = vertexer.FindPrimaryVertex(fEvent);

  return vtxESDSkip;
}

//---------------------------------------------------------------------------
AliAODVertex* AliHFEextraCuts::RemoveDaughtersFromPrimaryVtx(const AliAODEvent * const aod, const AliVTrack * const track) {
  //
  // This method returns a primary vertex without the daughter tracks of the 
  // candidate and it recalculates the impact parameters and errors for AOD tracks.
  // The output vertex is created with "new". 
  //

  AliAODVertex *vtxAOD = aod->GetPrimaryVertex();
  if(!vtxAOD) return 0;
  TString title=vtxAOD->GetTitle();
  if(!title.Contains("VertexerTracks")) return 0;

  AliVertexerTracks vertexer(aod->GetMagneticField());

  vertexer.SetITSMode();
  vertexer.SetMinClusters(3);
  vertexer.SetConstraintOff();

  if(title.Contains("WithConstraint")) {
    Float_t diamondcovxy[3];
    aod->GetDiamondCovXY(diamondcovxy);
    Double_t pos[3]={aod->GetDiamondX(),aod->GetDiamondY(),0.};
    Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
    AliESDVertex diamond(pos,cov,1.,1);
    vertexer.SetVtxStart(&diamond);
  }
  Int_t skipped[2]; for(Int_t i=0;i<2;i++) skipped[i]=-1;
  Int_t id = (Int_t)track->GetID();
  if(!(id<0)) skipped[0] = id;

  /*// exclude tracks with global constrained parameters
  Int_t nTracks=aod->GetNumberOfTracks();
  for(Int_t i=0; i<nTracks; i++){
    t = aod->GetTrack(i);
    if(t->TestFilterMask(512)){
      id = (Int_t)t->GetID();
      skipped[nTrksToSkip++] = id;
    }
  }*/

  vertexer.SetSkipTracks(1,skipped);
  AliESDVertex *vtxESDNew = vertexer.FindPrimaryVertex(aod);

  if(!vtxESDNew) return 0;
  if(vtxESDNew->GetNContributors()<=0) {
    delete vtxESDNew; vtxESDNew=NULL;
    return 0;
  }

  // convert to AliAODVertex
  Double_t pos[3],cov[6],chi2perNDF;
  vtxESDNew->GetXYZ(pos); // position
  vtxESDNew->GetCovMatrix(cov); //covariance matrix
  chi2perNDF = vtxESDNew->GetChi2toNDF();
  delete vtxESDNew; vtxESDNew=NULL;

  AliAODVertex *vtxAODNew = new AliAODVertex(pos,cov,chi2perNDF);

  return vtxAODNew;
}
 AliHFEextraCuts.cxx:1
 AliHFEextraCuts.cxx:2
 AliHFEextraCuts.cxx:3
 AliHFEextraCuts.cxx:4
 AliHFEextraCuts.cxx:5
 AliHFEextraCuts.cxx:6
 AliHFEextraCuts.cxx:7
 AliHFEextraCuts.cxx:8
 AliHFEextraCuts.cxx:9
 AliHFEextraCuts.cxx:10
 AliHFEextraCuts.cxx:11
 AliHFEextraCuts.cxx:12
 AliHFEextraCuts.cxx:13
 AliHFEextraCuts.cxx:14
 AliHFEextraCuts.cxx:15
 AliHFEextraCuts.cxx:16
 AliHFEextraCuts.cxx:17
 AliHFEextraCuts.cxx:18
 AliHFEextraCuts.cxx:19
 AliHFEextraCuts.cxx:20
 AliHFEextraCuts.cxx:21
 AliHFEextraCuts.cxx:22
 AliHFEextraCuts.cxx:23
 AliHFEextraCuts.cxx:24
 AliHFEextraCuts.cxx:25
 AliHFEextraCuts.cxx:26
 AliHFEextraCuts.cxx:27
 AliHFEextraCuts.cxx:28
 AliHFEextraCuts.cxx:29
 AliHFEextraCuts.cxx:30
 AliHFEextraCuts.cxx:31
 AliHFEextraCuts.cxx:32
 AliHFEextraCuts.cxx:33
 AliHFEextraCuts.cxx:34
 AliHFEextraCuts.cxx:35
 AliHFEextraCuts.cxx:36
 AliHFEextraCuts.cxx:37
 AliHFEextraCuts.cxx:38
 AliHFEextraCuts.cxx:39
 AliHFEextraCuts.cxx:40
 AliHFEextraCuts.cxx:41
 AliHFEextraCuts.cxx:42
 AliHFEextraCuts.cxx:43
 AliHFEextraCuts.cxx:44
 AliHFEextraCuts.cxx:45
 AliHFEextraCuts.cxx:46
 AliHFEextraCuts.cxx:47
 AliHFEextraCuts.cxx:48
 AliHFEextraCuts.cxx:49
 AliHFEextraCuts.cxx:50
 AliHFEextraCuts.cxx:51
 AliHFEextraCuts.cxx:52
 AliHFEextraCuts.cxx:53
 AliHFEextraCuts.cxx:54
 AliHFEextraCuts.cxx:55
 AliHFEextraCuts.cxx:56
 AliHFEextraCuts.cxx:57
 AliHFEextraCuts.cxx:58
 AliHFEextraCuts.cxx:59
 AliHFEextraCuts.cxx:60
 AliHFEextraCuts.cxx:61
 AliHFEextraCuts.cxx:62
 AliHFEextraCuts.cxx:63
 AliHFEextraCuts.cxx:64
 AliHFEextraCuts.cxx:65
 AliHFEextraCuts.cxx:66
 AliHFEextraCuts.cxx:67
 AliHFEextraCuts.cxx:68
 AliHFEextraCuts.cxx:69
 AliHFEextraCuts.cxx:70
 AliHFEextraCuts.cxx:71
 AliHFEextraCuts.cxx:72
 AliHFEextraCuts.cxx:73
 AliHFEextraCuts.cxx:74
 AliHFEextraCuts.cxx:75
 AliHFEextraCuts.cxx:76
 AliHFEextraCuts.cxx:77
 AliHFEextraCuts.cxx:78
 AliHFEextraCuts.cxx:79
 AliHFEextraCuts.cxx:80
 AliHFEextraCuts.cxx:81
 AliHFEextraCuts.cxx:82
 AliHFEextraCuts.cxx:83
 AliHFEextraCuts.cxx:84
 AliHFEextraCuts.cxx:85
 AliHFEextraCuts.cxx:86
 AliHFEextraCuts.cxx:87
 AliHFEextraCuts.cxx:88
 AliHFEextraCuts.cxx:89
 AliHFEextraCuts.cxx:90
 AliHFEextraCuts.cxx:91
 AliHFEextraCuts.cxx:92
 AliHFEextraCuts.cxx:93
 AliHFEextraCuts.cxx:94
 AliHFEextraCuts.cxx:95
 AliHFEextraCuts.cxx:96
 AliHFEextraCuts.cxx:97
 AliHFEextraCuts.cxx:98
 AliHFEextraCuts.cxx:99
 AliHFEextraCuts.cxx:100
 AliHFEextraCuts.cxx:101
 AliHFEextraCuts.cxx:102
 AliHFEextraCuts.cxx:103
 AliHFEextraCuts.cxx:104
 AliHFEextraCuts.cxx:105
 AliHFEextraCuts.cxx:106
 AliHFEextraCuts.cxx:107
 AliHFEextraCuts.cxx:108
 AliHFEextraCuts.cxx:109
 AliHFEextraCuts.cxx:110
 AliHFEextraCuts.cxx:111
 AliHFEextraCuts.cxx:112
 AliHFEextraCuts.cxx:113
 AliHFEextraCuts.cxx:114
 AliHFEextraCuts.cxx:115
 AliHFEextraCuts.cxx:116
 AliHFEextraCuts.cxx:117
 AliHFEextraCuts.cxx:118
 AliHFEextraCuts.cxx:119
 AliHFEextraCuts.cxx:120
 AliHFEextraCuts.cxx:121
 AliHFEextraCuts.cxx:122
 AliHFEextraCuts.cxx:123
 AliHFEextraCuts.cxx:124
 AliHFEextraCuts.cxx:125
 AliHFEextraCuts.cxx:126
 AliHFEextraCuts.cxx:127
 AliHFEextraCuts.cxx:128
 AliHFEextraCuts.cxx:129
 AliHFEextraCuts.cxx:130
 AliHFEextraCuts.cxx:131
 AliHFEextraCuts.cxx:132
 AliHFEextraCuts.cxx:133
 AliHFEextraCuts.cxx:134
 AliHFEextraCuts.cxx:135
 AliHFEextraCuts.cxx:136
 AliHFEextraCuts.cxx:137
 AliHFEextraCuts.cxx:138
 AliHFEextraCuts.cxx:139
 AliHFEextraCuts.cxx:140
 AliHFEextraCuts.cxx:141
 AliHFEextraCuts.cxx:142
 AliHFEextraCuts.cxx:143
 AliHFEextraCuts.cxx:144
 AliHFEextraCuts.cxx:145
 AliHFEextraCuts.cxx:146
 AliHFEextraCuts.cxx:147
 AliHFEextraCuts.cxx:148
 AliHFEextraCuts.cxx:149
 AliHFEextraCuts.cxx:150
 AliHFEextraCuts.cxx:151
 AliHFEextraCuts.cxx:152
 AliHFEextraCuts.cxx:153
 AliHFEextraCuts.cxx:154
 AliHFEextraCuts.cxx:155
 AliHFEextraCuts.cxx:156
 AliHFEextraCuts.cxx:157
 AliHFEextraCuts.cxx:158
 AliHFEextraCuts.cxx:159
 AliHFEextraCuts.cxx:160
 AliHFEextraCuts.cxx:161
 AliHFEextraCuts.cxx:162
 AliHFEextraCuts.cxx:163
 AliHFEextraCuts.cxx:164
 AliHFEextraCuts.cxx:165
 AliHFEextraCuts.cxx:166
 AliHFEextraCuts.cxx:167
 AliHFEextraCuts.cxx:168
 AliHFEextraCuts.cxx:169
 AliHFEextraCuts.cxx:170
 AliHFEextraCuts.cxx:171
 AliHFEextraCuts.cxx:172
 AliHFEextraCuts.cxx:173
 AliHFEextraCuts.cxx:174
 AliHFEextraCuts.cxx:175
 AliHFEextraCuts.cxx:176
 AliHFEextraCuts.cxx:177
 AliHFEextraCuts.cxx:178
 AliHFEextraCuts.cxx:179
 AliHFEextraCuts.cxx:180
 AliHFEextraCuts.cxx:181
 AliHFEextraCuts.cxx:182
 AliHFEextraCuts.cxx:183
 AliHFEextraCuts.cxx:184
 AliHFEextraCuts.cxx:185
 AliHFEextraCuts.cxx:186
 AliHFEextraCuts.cxx:187
 AliHFEextraCuts.cxx:188
 AliHFEextraCuts.cxx:189
 AliHFEextraCuts.cxx:190
 AliHFEextraCuts.cxx:191
 AliHFEextraCuts.cxx:192
 AliHFEextraCuts.cxx:193
 AliHFEextraCuts.cxx:194
 AliHFEextraCuts.cxx:195
 AliHFEextraCuts.cxx:196
 AliHFEextraCuts.cxx:197
 AliHFEextraCuts.cxx:198
 AliHFEextraCuts.cxx:199
 AliHFEextraCuts.cxx:200
 AliHFEextraCuts.cxx:201
 AliHFEextraCuts.cxx:202
 AliHFEextraCuts.cxx:203
 AliHFEextraCuts.cxx:204
 AliHFEextraCuts.cxx:205
 AliHFEextraCuts.cxx:206
 AliHFEextraCuts.cxx:207
 AliHFEextraCuts.cxx:208
 AliHFEextraCuts.cxx:209
 AliHFEextraCuts.cxx:210
 AliHFEextraCuts.cxx:211
 AliHFEextraCuts.cxx:212
 AliHFEextraCuts.cxx:213
 AliHFEextraCuts.cxx:214
 AliHFEextraCuts.cxx:215
 AliHFEextraCuts.cxx:216
 AliHFEextraCuts.cxx:217
 AliHFEextraCuts.cxx:218
 AliHFEextraCuts.cxx:219
 AliHFEextraCuts.cxx:220
 AliHFEextraCuts.cxx:221
 AliHFEextraCuts.cxx:222
 AliHFEextraCuts.cxx:223
 AliHFEextraCuts.cxx:224
 AliHFEextraCuts.cxx:225
 AliHFEextraCuts.cxx:226
 AliHFEextraCuts.cxx:227
 AliHFEextraCuts.cxx:228
 AliHFEextraCuts.cxx:229
 AliHFEextraCuts.cxx:230
 AliHFEextraCuts.cxx:231
 AliHFEextraCuts.cxx:232
 AliHFEextraCuts.cxx:233
 AliHFEextraCuts.cxx:234
 AliHFEextraCuts.cxx:235
 AliHFEextraCuts.cxx:236
 AliHFEextraCuts.cxx:237
 AliHFEextraCuts.cxx:238
 AliHFEextraCuts.cxx:239
 AliHFEextraCuts.cxx:240
 AliHFEextraCuts.cxx:241
 AliHFEextraCuts.cxx:242
 AliHFEextraCuts.cxx:243
 AliHFEextraCuts.cxx:244
 AliHFEextraCuts.cxx:245
 AliHFEextraCuts.cxx:246
 AliHFEextraCuts.cxx:247
 AliHFEextraCuts.cxx:248
 AliHFEextraCuts.cxx:249
 AliHFEextraCuts.cxx:250
 AliHFEextraCuts.cxx:251
 AliHFEextraCuts.cxx:252
 AliHFEextraCuts.cxx:253
 AliHFEextraCuts.cxx:254
 AliHFEextraCuts.cxx:255
 AliHFEextraCuts.cxx:256
 AliHFEextraCuts.cxx:257
 AliHFEextraCuts.cxx:258
 AliHFEextraCuts.cxx:259
 AliHFEextraCuts.cxx:260
 AliHFEextraCuts.cxx:261
 AliHFEextraCuts.cxx:262
 AliHFEextraCuts.cxx:263
 AliHFEextraCuts.cxx:264
 AliHFEextraCuts.cxx:265
 AliHFEextraCuts.cxx:266
 AliHFEextraCuts.cxx:267
 AliHFEextraCuts.cxx:268
 AliHFEextraCuts.cxx:269
 AliHFEextraCuts.cxx:270
 AliHFEextraCuts.cxx:271
 AliHFEextraCuts.cxx:272
 AliHFEextraCuts.cxx:273
 AliHFEextraCuts.cxx:274
 AliHFEextraCuts.cxx:275
 AliHFEextraCuts.cxx:276
 AliHFEextraCuts.cxx:277
 AliHFEextraCuts.cxx:278
 AliHFEextraCuts.cxx:279
 AliHFEextraCuts.cxx:280
 AliHFEextraCuts.cxx:281
 AliHFEextraCuts.cxx:282
 AliHFEextraCuts.cxx:283
 AliHFEextraCuts.cxx:284
 AliHFEextraCuts.cxx:285
 AliHFEextraCuts.cxx:286
 AliHFEextraCuts.cxx:287
 AliHFEextraCuts.cxx:288
 AliHFEextraCuts.cxx:289
 AliHFEextraCuts.cxx:290
 AliHFEextraCuts.cxx:291
 AliHFEextraCuts.cxx:292
 AliHFEextraCuts.cxx:293
 AliHFEextraCuts.cxx:294
 AliHFEextraCuts.cxx:295
 AliHFEextraCuts.cxx:296
 AliHFEextraCuts.cxx:297
 AliHFEextraCuts.cxx:298
 AliHFEextraCuts.cxx:299
 AliHFEextraCuts.cxx:300
 AliHFEextraCuts.cxx:301
 AliHFEextraCuts.cxx:302
 AliHFEextraCuts.cxx:303
 AliHFEextraCuts.cxx:304
 AliHFEextraCuts.cxx:305
 AliHFEextraCuts.cxx:306
 AliHFEextraCuts.cxx:307
 AliHFEextraCuts.cxx:308
 AliHFEextraCuts.cxx:309
 AliHFEextraCuts.cxx:310
 AliHFEextraCuts.cxx:311
 AliHFEextraCuts.cxx:312
 AliHFEextraCuts.cxx:313
 AliHFEextraCuts.cxx:314
 AliHFEextraCuts.cxx:315
 AliHFEextraCuts.cxx:316
 AliHFEextraCuts.cxx:317
 AliHFEextraCuts.cxx:318
 AliHFEextraCuts.cxx:319
 AliHFEextraCuts.cxx:320
 AliHFEextraCuts.cxx:321
 AliHFEextraCuts.cxx:322
 AliHFEextraCuts.cxx:323
 AliHFEextraCuts.cxx:324
 AliHFEextraCuts.cxx:325
 AliHFEextraCuts.cxx:326
 AliHFEextraCuts.cxx:327
 AliHFEextraCuts.cxx:328
 AliHFEextraCuts.cxx:329
 AliHFEextraCuts.cxx:330
 AliHFEextraCuts.cxx:331
 AliHFEextraCuts.cxx:332
 AliHFEextraCuts.cxx:333
 AliHFEextraCuts.cxx:334
 AliHFEextraCuts.cxx:335
 AliHFEextraCuts.cxx:336
 AliHFEextraCuts.cxx:337
 AliHFEextraCuts.cxx:338
 AliHFEextraCuts.cxx:339
 AliHFEextraCuts.cxx:340
 AliHFEextraCuts.cxx:341
 AliHFEextraCuts.cxx:342
 AliHFEextraCuts.cxx:343
 AliHFEextraCuts.cxx:344
 AliHFEextraCuts.cxx:345
 AliHFEextraCuts.cxx:346
 AliHFEextraCuts.cxx:347
 AliHFEextraCuts.cxx:348
 AliHFEextraCuts.cxx:349
 AliHFEextraCuts.cxx:350
 AliHFEextraCuts.cxx:351
 AliHFEextraCuts.cxx:352
 AliHFEextraCuts.cxx:353
 AliHFEextraCuts.cxx:354
 AliHFEextraCuts.cxx:355
 AliHFEextraCuts.cxx:356
 AliHFEextraCuts.cxx:357
 AliHFEextraCuts.cxx:358
 AliHFEextraCuts.cxx:359
 AliHFEextraCuts.cxx:360
 AliHFEextraCuts.cxx:361
 AliHFEextraCuts.cxx:362
 AliHFEextraCuts.cxx:363
 AliHFEextraCuts.cxx:364
 AliHFEextraCuts.cxx:365
 AliHFEextraCuts.cxx:366
 AliHFEextraCuts.cxx:367
 AliHFEextraCuts.cxx:368
 AliHFEextraCuts.cxx:369
 AliHFEextraCuts.cxx:370
 AliHFEextraCuts.cxx:371
 AliHFEextraCuts.cxx:372
 AliHFEextraCuts.cxx:373
 AliHFEextraCuts.cxx:374
 AliHFEextraCuts.cxx:375
 AliHFEextraCuts.cxx:376
 AliHFEextraCuts.cxx:377
 AliHFEextraCuts.cxx:378
 AliHFEextraCuts.cxx:379
 AliHFEextraCuts.cxx:380
 AliHFEextraCuts.cxx:381
 AliHFEextraCuts.cxx:382
 AliHFEextraCuts.cxx:383
 AliHFEextraCuts.cxx:384
 AliHFEextraCuts.cxx:385
 AliHFEextraCuts.cxx:386
 AliHFEextraCuts.cxx:387
 AliHFEextraCuts.cxx:388
 AliHFEextraCuts.cxx:389
 AliHFEextraCuts.cxx:390
 AliHFEextraCuts.cxx:391
 AliHFEextraCuts.cxx:392
 AliHFEextraCuts.cxx:393
 AliHFEextraCuts.cxx:394
 AliHFEextraCuts.cxx:395
 AliHFEextraCuts.cxx:396
 AliHFEextraCuts.cxx:397
 AliHFEextraCuts.cxx:398
 AliHFEextraCuts.cxx:399
 AliHFEextraCuts.cxx:400
 AliHFEextraCuts.cxx:401
 AliHFEextraCuts.cxx:402
 AliHFEextraCuts.cxx:403
 AliHFEextraCuts.cxx:404
 AliHFEextraCuts.cxx:405
 AliHFEextraCuts.cxx:406
 AliHFEextraCuts.cxx:407
 AliHFEextraCuts.cxx:408
 AliHFEextraCuts.cxx:409
 AliHFEextraCuts.cxx:410
 AliHFEextraCuts.cxx:411
 AliHFEextraCuts.cxx:412
 AliHFEextraCuts.cxx:413
 AliHFEextraCuts.cxx:414
 AliHFEextraCuts.cxx:415
 AliHFEextraCuts.cxx:416
 AliHFEextraCuts.cxx:417
 AliHFEextraCuts.cxx:418
 AliHFEextraCuts.cxx:419
 AliHFEextraCuts.cxx:420
 AliHFEextraCuts.cxx:421
 AliHFEextraCuts.cxx:422
 AliHFEextraCuts.cxx:423
 AliHFEextraCuts.cxx:424
 AliHFEextraCuts.cxx:425
 AliHFEextraCuts.cxx:426
 AliHFEextraCuts.cxx:427
 AliHFEextraCuts.cxx:428
 AliHFEextraCuts.cxx:429
 AliHFEextraCuts.cxx:430
 AliHFEextraCuts.cxx:431
 AliHFEextraCuts.cxx:432
 AliHFEextraCuts.cxx:433
 AliHFEextraCuts.cxx:434
 AliHFEextraCuts.cxx:435
 AliHFEextraCuts.cxx:436
 AliHFEextraCuts.cxx:437
 AliHFEextraCuts.cxx:438
 AliHFEextraCuts.cxx:439
 AliHFEextraCuts.cxx:440
 AliHFEextraCuts.cxx:441
 AliHFEextraCuts.cxx:442
 AliHFEextraCuts.cxx:443
 AliHFEextraCuts.cxx:444
 AliHFEextraCuts.cxx:445
 AliHFEextraCuts.cxx:446
 AliHFEextraCuts.cxx:447
 AliHFEextraCuts.cxx:448
 AliHFEextraCuts.cxx:449
 AliHFEextraCuts.cxx:450
 AliHFEextraCuts.cxx:451
 AliHFEextraCuts.cxx:452
 AliHFEextraCuts.cxx:453
 AliHFEextraCuts.cxx:454
 AliHFEextraCuts.cxx:455
 AliHFEextraCuts.cxx:456
 AliHFEextraCuts.cxx:457
 AliHFEextraCuts.cxx:458
 AliHFEextraCuts.cxx:459
 AliHFEextraCuts.cxx:460
 AliHFEextraCuts.cxx:461
 AliHFEextraCuts.cxx:462
 AliHFEextraCuts.cxx:463
 AliHFEextraCuts.cxx:464
 AliHFEextraCuts.cxx:465
 AliHFEextraCuts.cxx:466
 AliHFEextraCuts.cxx:467
 AliHFEextraCuts.cxx:468
 AliHFEextraCuts.cxx:469
 AliHFEextraCuts.cxx:470
 AliHFEextraCuts.cxx:471
 AliHFEextraCuts.cxx:472
 AliHFEextraCuts.cxx:473
 AliHFEextraCuts.cxx:474
 AliHFEextraCuts.cxx:475
 AliHFEextraCuts.cxx:476
 AliHFEextraCuts.cxx:477
 AliHFEextraCuts.cxx:478
 AliHFEextraCuts.cxx:479
 AliHFEextraCuts.cxx:480
 AliHFEextraCuts.cxx:481
 AliHFEextraCuts.cxx:482
 AliHFEextraCuts.cxx:483
 AliHFEextraCuts.cxx:484
 AliHFEextraCuts.cxx:485
 AliHFEextraCuts.cxx:486
 AliHFEextraCuts.cxx:487
 AliHFEextraCuts.cxx:488
 AliHFEextraCuts.cxx:489
 AliHFEextraCuts.cxx:490
 AliHFEextraCuts.cxx:491
 AliHFEextraCuts.cxx:492
 AliHFEextraCuts.cxx:493
 AliHFEextraCuts.cxx:494
 AliHFEextraCuts.cxx:495
 AliHFEextraCuts.cxx:496
 AliHFEextraCuts.cxx:497
 AliHFEextraCuts.cxx:498
 AliHFEextraCuts.cxx:499
 AliHFEextraCuts.cxx:500
 AliHFEextraCuts.cxx:501
 AliHFEextraCuts.cxx:502
 AliHFEextraCuts.cxx:503
 AliHFEextraCuts.cxx:504
 AliHFEextraCuts.cxx:505
 AliHFEextraCuts.cxx:506
 AliHFEextraCuts.cxx:507
 AliHFEextraCuts.cxx:508
 AliHFEextraCuts.cxx:509
 AliHFEextraCuts.cxx:510
 AliHFEextraCuts.cxx:511
 AliHFEextraCuts.cxx:512
 AliHFEextraCuts.cxx:513
 AliHFEextraCuts.cxx:514
 AliHFEextraCuts.cxx:515
 AliHFEextraCuts.cxx:516
 AliHFEextraCuts.cxx:517
 AliHFEextraCuts.cxx:518
 AliHFEextraCuts.cxx:519
 AliHFEextraCuts.cxx:520
 AliHFEextraCuts.cxx:521
 AliHFEextraCuts.cxx:522
 AliHFEextraCuts.cxx:523
 AliHFEextraCuts.cxx:524
 AliHFEextraCuts.cxx:525
 AliHFEextraCuts.cxx:526
 AliHFEextraCuts.cxx:527
 AliHFEextraCuts.cxx:528
 AliHFEextraCuts.cxx:529
 AliHFEextraCuts.cxx:530
 AliHFEextraCuts.cxx:531
 AliHFEextraCuts.cxx:532
 AliHFEextraCuts.cxx:533
 AliHFEextraCuts.cxx:534
 AliHFEextraCuts.cxx:535
 AliHFEextraCuts.cxx:536
 AliHFEextraCuts.cxx:537
 AliHFEextraCuts.cxx:538
 AliHFEextraCuts.cxx:539
 AliHFEextraCuts.cxx:540
 AliHFEextraCuts.cxx:541
 AliHFEextraCuts.cxx:542
 AliHFEextraCuts.cxx:543
 AliHFEextraCuts.cxx:544
 AliHFEextraCuts.cxx:545
 AliHFEextraCuts.cxx:546
 AliHFEextraCuts.cxx:547
 AliHFEextraCuts.cxx:548
 AliHFEextraCuts.cxx:549
 AliHFEextraCuts.cxx:550
 AliHFEextraCuts.cxx:551
 AliHFEextraCuts.cxx:552
 AliHFEextraCuts.cxx:553
 AliHFEextraCuts.cxx:554
 AliHFEextraCuts.cxx:555
 AliHFEextraCuts.cxx:556
 AliHFEextraCuts.cxx:557
 AliHFEextraCuts.cxx:558
 AliHFEextraCuts.cxx:559
 AliHFEextraCuts.cxx:560
 AliHFEextraCuts.cxx:561
 AliHFEextraCuts.cxx:562
 AliHFEextraCuts.cxx:563
 AliHFEextraCuts.cxx:564
 AliHFEextraCuts.cxx:565
 AliHFEextraCuts.cxx:566
 AliHFEextraCuts.cxx:567
 AliHFEextraCuts.cxx:568
 AliHFEextraCuts.cxx:569
 AliHFEextraCuts.cxx:570
 AliHFEextraCuts.cxx:571
 AliHFEextraCuts.cxx:572
 AliHFEextraCuts.cxx:573
 AliHFEextraCuts.cxx:574
 AliHFEextraCuts.cxx:575
 AliHFEextraCuts.cxx:576
 AliHFEextraCuts.cxx:577
 AliHFEextraCuts.cxx:578
 AliHFEextraCuts.cxx:579
 AliHFEextraCuts.cxx:580
 AliHFEextraCuts.cxx:581
 AliHFEextraCuts.cxx:582
 AliHFEextraCuts.cxx:583
 AliHFEextraCuts.cxx:584
 AliHFEextraCuts.cxx:585
 AliHFEextraCuts.cxx:586
 AliHFEextraCuts.cxx:587
 AliHFEextraCuts.cxx:588
 AliHFEextraCuts.cxx:589
 AliHFEextraCuts.cxx:590
 AliHFEextraCuts.cxx:591
 AliHFEextraCuts.cxx:592
 AliHFEextraCuts.cxx:593
 AliHFEextraCuts.cxx:594
 AliHFEextraCuts.cxx:595
 AliHFEextraCuts.cxx:596
 AliHFEextraCuts.cxx:597
 AliHFEextraCuts.cxx:598
 AliHFEextraCuts.cxx:599
 AliHFEextraCuts.cxx:600
 AliHFEextraCuts.cxx:601
 AliHFEextraCuts.cxx:602
 AliHFEextraCuts.cxx:603
 AliHFEextraCuts.cxx:604
 AliHFEextraCuts.cxx:605
 AliHFEextraCuts.cxx:606
 AliHFEextraCuts.cxx:607
 AliHFEextraCuts.cxx:608
 AliHFEextraCuts.cxx:609
 AliHFEextraCuts.cxx:610
 AliHFEextraCuts.cxx:611
 AliHFEextraCuts.cxx:612
 AliHFEextraCuts.cxx:613
 AliHFEextraCuts.cxx:614
 AliHFEextraCuts.cxx:615
 AliHFEextraCuts.cxx:616
 AliHFEextraCuts.cxx:617
 AliHFEextraCuts.cxx:618
 AliHFEextraCuts.cxx:619
 AliHFEextraCuts.cxx:620
 AliHFEextraCuts.cxx:621
 AliHFEextraCuts.cxx:622
 AliHFEextraCuts.cxx:623
 AliHFEextraCuts.cxx:624
 AliHFEextraCuts.cxx:625
 AliHFEextraCuts.cxx:626
 AliHFEextraCuts.cxx:627
 AliHFEextraCuts.cxx:628
 AliHFEextraCuts.cxx:629
 AliHFEextraCuts.cxx:630
 AliHFEextraCuts.cxx:631
 AliHFEextraCuts.cxx:632
 AliHFEextraCuts.cxx:633
 AliHFEextraCuts.cxx:634
 AliHFEextraCuts.cxx:635
 AliHFEextraCuts.cxx:636
 AliHFEextraCuts.cxx:637
 AliHFEextraCuts.cxx:638
 AliHFEextraCuts.cxx:639
 AliHFEextraCuts.cxx:640
 AliHFEextraCuts.cxx:641
 AliHFEextraCuts.cxx:642
 AliHFEextraCuts.cxx:643
 AliHFEextraCuts.cxx:644
 AliHFEextraCuts.cxx:645
 AliHFEextraCuts.cxx:646
 AliHFEextraCuts.cxx:647
 AliHFEextraCuts.cxx:648
 AliHFEextraCuts.cxx:649
 AliHFEextraCuts.cxx:650
 AliHFEextraCuts.cxx:651
 AliHFEextraCuts.cxx:652
 AliHFEextraCuts.cxx:653
 AliHFEextraCuts.cxx:654
 AliHFEextraCuts.cxx:655
 AliHFEextraCuts.cxx:656
 AliHFEextraCuts.cxx:657
 AliHFEextraCuts.cxx:658
 AliHFEextraCuts.cxx:659
 AliHFEextraCuts.cxx:660
 AliHFEextraCuts.cxx:661
 AliHFEextraCuts.cxx:662
 AliHFEextraCuts.cxx:663
 AliHFEextraCuts.cxx:664
 AliHFEextraCuts.cxx:665
 AliHFEextraCuts.cxx:666
 AliHFEextraCuts.cxx:667
 AliHFEextraCuts.cxx:668
 AliHFEextraCuts.cxx:669
 AliHFEextraCuts.cxx:670
 AliHFEextraCuts.cxx:671
 AliHFEextraCuts.cxx:672
 AliHFEextraCuts.cxx:673
 AliHFEextraCuts.cxx:674
 AliHFEextraCuts.cxx:675
 AliHFEextraCuts.cxx:676
 AliHFEextraCuts.cxx:677
 AliHFEextraCuts.cxx:678
 AliHFEextraCuts.cxx:679
 AliHFEextraCuts.cxx:680
 AliHFEextraCuts.cxx:681
 AliHFEextraCuts.cxx:682
 AliHFEextraCuts.cxx:683
 AliHFEextraCuts.cxx:684
 AliHFEextraCuts.cxx:685
 AliHFEextraCuts.cxx:686
 AliHFEextraCuts.cxx:687
 AliHFEextraCuts.cxx:688
 AliHFEextraCuts.cxx:689
 AliHFEextraCuts.cxx:690
 AliHFEextraCuts.cxx:691
 AliHFEextraCuts.cxx:692
 AliHFEextraCuts.cxx:693
 AliHFEextraCuts.cxx:694
 AliHFEextraCuts.cxx:695
 AliHFEextraCuts.cxx:696
 AliHFEextraCuts.cxx:697
 AliHFEextraCuts.cxx:698
 AliHFEextraCuts.cxx:699
 AliHFEextraCuts.cxx:700
 AliHFEextraCuts.cxx:701
 AliHFEextraCuts.cxx:702
 AliHFEextraCuts.cxx:703
 AliHFEextraCuts.cxx:704
 AliHFEextraCuts.cxx:705
 AliHFEextraCuts.cxx:706
 AliHFEextraCuts.cxx:707
 AliHFEextraCuts.cxx:708
 AliHFEextraCuts.cxx:709
 AliHFEextraCuts.cxx:710
 AliHFEextraCuts.cxx:711
 AliHFEextraCuts.cxx:712
 AliHFEextraCuts.cxx:713
 AliHFEextraCuts.cxx:714
 AliHFEextraCuts.cxx:715
 AliHFEextraCuts.cxx:716
 AliHFEextraCuts.cxx:717
 AliHFEextraCuts.cxx:718
 AliHFEextraCuts.cxx:719
 AliHFEextraCuts.cxx:720
 AliHFEextraCuts.cxx:721
 AliHFEextraCuts.cxx:722
 AliHFEextraCuts.cxx:723
 AliHFEextraCuts.cxx:724
 AliHFEextraCuts.cxx:725
 AliHFEextraCuts.cxx:726
 AliHFEextraCuts.cxx:727
 AliHFEextraCuts.cxx:728
 AliHFEextraCuts.cxx:729
 AliHFEextraCuts.cxx:730
 AliHFEextraCuts.cxx:731
 AliHFEextraCuts.cxx:732
 AliHFEextraCuts.cxx:733
 AliHFEextraCuts.cxx:734
 AliHFEextraCuts.cxx:735
 AliHFEextraCuts.cxx:736
 AliHFEextraCuts.cxx:737
 AliHFEextraCuts.cxx:738
 AliHFEextraCuts.cxx:739
 AliHFEextraCuts.cxx:740
 AliHFEextraCuts.cxx:741
 AliHFEextraCuts.cxx:742
 AliHFEextraCuts.cxx:743
 AliHFEextraCuts.cxx:744
 AliHFEextraCuts.cxx:745
 AliHFEextraCuts.cxx:746
 AliHFEextraCuts.cxx:747
 AliHFEextraCuts.cxx:748
 AliHFEextraCuts.cxx:749
 AliHFEextraCuts.cxx:750
 AliHFEextraCuts.cxx:751
 AliHFEextraCuts.cxx:752
 AliHFEextraCuts.cxx:753
 AliHFEextraCuts.cxx:754
 AliHFEextraCuts.cxx:755
 AliHFEextraCuts.cxx:756
 AliHFEextraCuts.cxx:757
 AliHFEextraCuts.cxx:758
 AliHFEextraCuts.cxx:759
 AliHFEextraCuts.cxx:760
 AliHFEextraCuts.cxx:761
 AliHFEextraCuts.cxx:762
 AliHFEextraCuts.cxx:763
 AliHFEextraCuts.cxx:764
 AliHFEextraCuts.cxx:765
 AliHFEextraCuts.cxx:766
 AliHFEextraCuts.cxx:767
 AliHFEextraCuts.cxx:768
 AliHFEextraCuts.cxx:769
 AliHFEextraCuts.cxx:770
 AliHFEextraCuts.cxx:771
 AliHFEextraCuts.cxx:772
 AliHFEextraCuts.cxx:773
 AliHFEextraCuts.cxx:774
 AliHFEextraCuts.cxx:775
 AliHFEextraCuts.cxx:776
 AliHFEextraCuts.cxx:777
 AliHFEextraCuts.cxx:778
 AliHFEextraCuts.cxx:779
 AliHFEextraCuts.cxx:780
 AliHFEextraCuts.cxx:781
 AliHFEextraCuts.cxx:782
 AliHFEextraCuts.cxx:783
 AliHFEextraCuts.cxx:784
 AliHFEextraCuts.cxx:785
 AliHFEextraCuts.cxx:786
 AliHFEextraCuts.cxx:787
 AliHFEextraCuts.cxx:788
 AliHFEextraCuts.cxx:789
 AliHFEextraCuts.cxx:790
 AliHFEextraCuts.cxx:791
 AliHFEextraCuts.cxx:792
 AliHFEextraCuts.cxx:793
 AliHFEextraCuts.cxx:794
 AliHFEextraCuts.cxx:795
 AliHFEextraCuts.cxx:796
 AliHFEextraCuts.cxx:797
 AliHFEextraCuts.cxx:798
 AliHFEextraCuts.cxx:799
 AliHFEextraCuts.cxx:800
 AliHFEextraCuts.cxx:801
 AliHFEextraCuts.cxx:802
 AliHFEextraCuts.cxx:803
 AliHFEextraCuts.cxx:804
 AliHFEextraCuts.cxx:805
 AliHFEextraCuts.cxx:806
 AliHFEextraCuts.cxx:807
 AliHFEextraCuts.cxx:808
 AliHFEextraCuts.cxx:809
 AliHFEextraCuts.cxx:810
 AliHFEextraCuts.cxx:811
 AliHFEextraCuts.cxx:812
 AliHFEextraCuts.cxx:813
 AliHFEextraCuts.cxx:814
 AliHFEextraCuts.cxx:815
 AliHFEextraCuts.cxx:816
 AliHFEextraCuts.cxx:817
 AliHFEextraCuts.cxx:818
 AliHFEextraCuts.cxx:819
 AliHFEextraCuts.cxx:820
 AliHFEextraCuts.cxx:821
 AliHFEextraCuts.cxx:822
 AliHFEextraCuts.cxx:823
 AliHFEextraCuts.cxx:824
 AliHFEextraCuts.cxx:825
 AliHFEextraCuts.cxx:826
 AliHFEextraCuts.cxx:827
 AliHFEextraCuts.cxx:828
 AliHFEextraCuts.cxx:829
 AliHFEextraCuts.cxx:830
 AliHFEextraCuts.cxx:831
 AliHFEextraCuts.cxx:832
 AliHFEextraCuts.cxx:833
 AliHFEextraCuts.cxx:834
 AliHFEextraCuts.cxx:835
 AliHFEextraCuts.cxx:836
 AliHFEextraCuts.cxx:837
 AliHFEextraCuts.cxx:838
 AliHFEextraCuts.cxx:839
 AliHFEextraCuts.cxx:840
 AliHFEextraCuts.cxx:841
 AliHFEextraCuts.cxx:842
 AliHFEextraCuts.cxx:843
 AliHFEextraCuts.cxx:844
 AliHFEextraCuts.cxx:845
 AliHFEextraCuts.cxx:846
 AliHFEextraCuts.cxx:847
 AliHFEextraCuts.cxx:848
 AliHFEextraCuts.cxx:849
 AliHFEextraCuts.cxx:850
 AliHFEextraCuts.cxx:851
 AliHFEextraCuts.cxx:852
 AliHFEextraCuts.cxx:853
 AliHFEextraCuts.cxx:854
 AliHFEextraCuts.cxx:855
 AliHFEextraCuts.cxx:856
 AliHFEextraCuts.cxx:857
 AliHFEextraCuts.cxx:858
 AliHFEextraCuts.cxx:859
 AliHFEextraCuts.cxx:860
 AliHFEextraCuts.cxx:861
 AliHFEextraCuts.cxx:862
 AliHFEextraCuts.cxx:863
 AliHFEextraCuts.cxx:864
 AliHFEextraCuts.cxx:865
 AliHFEextraCuts.cxx:866
 AliHFEextraCuts.cxx:867
 AliHFEextraCuts.cxx:868
 AliHFEextraCuts.cxx:869
 AliHFEextraCuts.cxx:870
 AliHFEextraCuts.cxx:871
 AliHFEextraCuts.cxx:872
 AliHFEextraCuts.cxx:873
 AliHFEextraCuts.cxx:874
 AliHFEextraCuts.cxx:875
 AliHFEextraCuts.cxx:876
 AliHFEextraCuts.cxx:877
 AliHFEextraCuts.cxx:878
 AliHFEextraCuts.cxx:879
 AliHFEextraCuts.cxx:880
 AliHFEextraCuts.cxx:881
 AliHFEextraCuts.cxx:882
 AliHFEextraCuts.cxx:883
 AliHFEextraCuts.cxx:884
 AliHFEextraCuts.cxx:885
 AliHFEextraCuts.cxx:886
 AliHFEextraCuts.cxx:887
 AliHFEextraCuts.cxx:888
 AliHFEextraCuts.cxx:889
 AliHFEextraCuts.cxx:890
 AliHFEextraCuts.cxx:891
 AliHFEextraCuts.cxx:892
 AliHFEextraCuts.cxx:893
 AliHFEextraCuts.cxx:894
 AliHFEextraCuts.cxx:895
 AliHFEextraCuts.cxx:896
 AliHFEextraCuts.cxx:897
 AliHFEextraCuts.cxx:898
 AliHFEextraCuts.cxx:899
 AliHFEextraCuts.cxx:900
 AliHFEextraCuts.cxx:901
 AliHFEextraCuts.cxx:902
 AliHFEextraCuts.cxx:903
 AliHFEextraCuts.cxx:904
 AliHFEextraCuts.cxx:905
 AliHFEextraCuts.cxx:906
 AliHFEextraCuts.cxx:907
 AliHFEextraCuts.cxx:908
 AliHFEextraCuts.cxx:909
 AliHFEextraCuts.cxx:910
 AliHFEextraCuts.cxx:911
 AliHFEextraCuts.cxx:912
 AliHFEextraCuts.cxx:913
 AliHFEextraCuts.cxx:914
 AliHFEextraCuts.cxx:915
 AliHFEextraCuts.cxx:916
 AliHFEextraCuts.cxx:917
 AliHFEextraCuts.cxx:918
 AliHFEextraCuts.cxx:919
 AliHFEextraCuts.cxx:920
 AliHFEextraCuts.cxx:921
 AliHFEextraCuts.cxx:922
 AliHFEextraCuts.cxx:923
 AliHFEextraCuts.cxx:924
 AliHFEextraCuts.cxx:925
 AliHFEextraCuts.cxx:926
 AliHFEextraCuts.cxx:927
 AliHFEextraCuts.cxx:928
 AliHFEextraCuts.cxx:929
 AliHFEextraCuts.cxx:930
 AliHFEextraCuts.cxx:931
 AliHFEextraCuts.cxx:932
 AliHFEextraCuts.cxx:933
 AliHFEextraCuts.cxx:934
 AliHFEextraCuts.cxx:935
 AliHFEextraCuts.cxx:936
 AliHFEextraCuts.cxx:937
 AliHFEextraCuts.cxx:938
 AliHFEextraCuts.cxx:939
 AliHFEextraCuts.cxx:940
 AliHFEextraCuts.cxx:941
 AliHFEextraCuts.cxx:942
 AliHFEextraCuts.cxx:943
 AliHFEextraCuts.cxx:944
 AliHFEextraCuts.cxx:945
 AliHFEextraCuts.cxx:946
 AliHFEextraCuts.cxx:947
 AliHFEextraCuts.cxx:948
 AliHFEextraCuts.cxx:949
 AliHFEextraCuts.cxx:950
 AliHFEextraCuts.cxx:951
 AliHFEextraCuts.cxx:952
 AliHFEextraCuts.cxx:953
 AliHFEextraCuts.cxx:954
 AliHFEextraCuts.cxx:955
 AliHFEextraCuts.cxx:956
 AliHFEextraCuts.cxx:957
 AliHFEextraCuts.cxx:958
 AliHFEextraCuts.cxx:959
 AliHFEextraCuts.cxx:960
 AliHFEextraCuts.cxx:961
 AliHFEextraCuts.cxx:962
 AliHFEextraCuts.cxx:963
 AliHFEextraCuts.cxx:964
 AliHFEextraCuts.cxx:965
 AliHFEextraCuts.cxx:966
 AliHFEextraCuts.cxx:967
 AliHFEextraCuts.cxx:968
 AliHFEextraCuts.cxx:969
 AliHFEextraCuts.cxx:970
 AliHFEextraCuts.cxx:971
 AliHFEextraCuts.cxx:972
 AliHFEextraCuts.cxx:973
 AliHFEextraCuts.cxx:974
 AliHFEextraCuts.cxx:975
 AliHFEextraCuts.cxx:976
 AliHFEextraCuts.cxx:977
 AliHFEextraCuts.cxx:978
 AliHFEextraCuts.cxx:979
 AliHFEextraCuts.cxx:980
 AliHFEextraCuts.cxx:981
 AliHFEextraCuts.cxx:982
 AliHFEextraCuts.cxx:983
 AliHFEextraCuts.cxx:984
 AliHFEextraCuts.cxx:985
 AliHFEextraCuts.cxx:986
 AliHFEextraCuts.cxx:987
 AliHFEextraCuts.cxx:988
 AliHFEextraCuts.cxx:989
 AliHFEextraCuts.cxx:990
 AliHFEextraCuts.cxx:991
 AliHFEextraCuts.cxx:992
 AliHFEextraCuts.cxx:993
 AliHFEextraCuts.cxx:994
 AliHFEextraCuts.cxx:995
 AliHFEextraCuts.cxx:996
 AliHFEextraCuts.cxx:997
 AliHFEextraCuts.cxx:998
 AliHFEextraCuts.cxx:999
 AliHFEextraCuts.cxx:1000
 AliHFEextraCuts.cxx:1001
 AliHFEextraCuts.cxx:1002
 AliHFEextraCuts.cxx:1003
 AliHFEextraCuts.cxx:1004
 AliHFEextraCuts.cxx:1005
 AliHFEextraCuts.cxx:1006
 AliHFEextraCuts.cxx:1007
 AliHFEextraCuts.cxx:1008
 AliHFEextraCuts.cxx:1009
 AliHFEextraCuts.cxx:1010
 AliHFEextraCuts.cxx:1011
 AliHFEextraCuts.cxx:1012
 AliHFEextraCuts.cxx:1013
 AliHFEextraCuts.cxx:1014
 AliHFEextraCuts.cxx:1015
 AliHFEextraCuts.cxx:1016
 AliHFEextraCuts.cxx:1017
 AliHFEextraCuts.cxx:1018
 AliHFEextraCuts.cxx:1019
 AliHFEextraCuts.cxx:1020
 AliHFEextraCuts.cxx:1021
 AliHFEextraCuts.cxx:1022
 AliHFEextraCuts.cxx:1023
 AliHFEextraCuts.cxx:1024
 AliHFEextraCuts.cxx:1025
 AliHFEextraCuts.cxx:1026
 AliHFEextraCuts.cxx:1027
 AliHFEextraCuts.cxx:1028
 AliHFEextraCuts.cxx:1029
 AliHFEextraCuts.cxx:1030
 AliHFEextraCuts.cxx:1031
 AliHFEextraCuts.cxx:1032
 AliHFEextraCuts.cxx:1033
 AliHFEextraCuts.cxx:1034
 AliHFEextraCuts.cxx:1035
 AliHFEextraCuts.cxx:1036
 AliHFEextraCuts.cxx:1037
 AliHFEextraCuts.cxx:1038
 AliHFEextraCuts.cxx:1039
 AliHFEextraCuts.cxx:1040
 AliHFEextraCuts.cxx:1041
 AliHFEextraCuts.cxx:1042
 AliHFEextraCuts.cxx:1043
 AliHFEextraCuts.cxx:1044
 AliHFEextraCuts.cxx:1045
 AliHFEextraCuts.cxx:1046
 AliHFEextraCuts.cxx:1047
 AliHFEextraCuts.cxx:1048
 AliHFEextraCuts.cxx:1049
 AliHFEextraCuts.cxx:1050
 AliHFEextraCuts.cxx:1051
 AliHFEextraCuts.cxx:1052
 AliHFEextraCuts.cxx:1053
 AliHFEextraCuts.cxx:1054
 AliHFEextraCuts.cxx:1055
 AliHFEextraCuts.cxx:1056
 AliHFEextraCuts.cxx:1057
 AliHFEextraCuts.cxx:1058
 AliHFEextraCuts.cxx:1059
 AliHFEextraCuts.cxx:1060
 AliHFEextraCuts.cxx:1061
 AliHFEextraCuts.cxx:1062
 AliHFEextraCuts.cxx:1063
 AliHFEextraCuts.cxx:1064
 AliHFEextraCuts.cxx:1065
 AliHFEextraCuts.cxx:1066
 AliHFEextraCuts.cxx:1067
 AliHFEextraCuts.cxx:1068
 AliHFEextraCuts.cxx:1069
 AliHFEextraCuts.cxx:1070
 AliHFEextraCuts.cxx:1071
 AliHFEextraCuts.cxx:1072
 AliHFEextraCuts.cxx:1073
 AliHFEextraCuts.cxx:1074
 AliHFEextraCuts.cxx:1075
 AliHFEextraCuts.cxx:1076
 AliHFEextraCuts.cxx:1077
 AliHFEextraCuts.cxx:1078
 AliHFEextraCuts.cxx:1079
 AliHFEextraCuts.cxx:1080
 AliHFEextraCuts.cxx:1081
 AliHFEextraCuts.cxx:1082
 AliHFEextraCuts.cxx:1083
 AliHFEextraCuts.cxx:1084
 AliHFEextraCuts.cxx:1085
 AliHFEextraCuts.cxx:1086
 AliHFEextraCuts.cxx:1087
 AliHFEextraCuts.cxx:1088
 AliHFEextraCuts.cxx:1089
 AliHFEextraCuts.cxx:1090
 AliHFEextraCuts.cxx:1091
 AliHFEextraCuts.cxx:1092
 AliHFEextraCuts.cxx:1093
 AliHFEextraCuts.cxx:1094
 AliHFEextraCuts.cxx:1095
 AliHFEextraCuts.cxx:1096
 AliHFEextraCuts.cxx:1097
 AliHFEextraCuts.cxx:1098
 AliHFEextraCuts.cxx:1099
 AliHFEextraCuts.cxx:1100
 AliHFEextraCuts.cxx:1101
 AliHFEextraCuts.cxx:1102
 AliHFEextraCuts.cxx:1103
 AliHFEextraCuts.cxx:1104
 AliHFEextraCuts.cxx:1105
 AliHFEextraCuts.cxx:1106
 AliHFEextraCuts.cxx:1107
 AliHFEextraCuts.cxx:1108
 AliHFEextraCuts.cxx:1109
 AliHFEextraCuts.cxx:1110
 AliHFEextraCuts.cxx:1111
 AliHFEextraCuts.cxx:1112
 AliHFEextraCuts.cxx:1113
 AliHFEextraCuts.cxx:1114
 AliHFEextraCuts.cxx:1115
 AliHFEextraCuts.cxx:1116
 AliHFEextraCuts.cxx:1117
 AliHFEextraCuts.cxx:1118
 AliHFEextraCuts.cxx:1119
 AliHFEextraCuts.cxx:1120
 AliHFEextraCuts.cxx:1121
 AliHFEextraCuts.cxx:1122
 AliHFEextraCuts.cxx:1123
 AliHFEextraCuts.cxx:1124
 AliHFEextraCuts.cxx:1125
 AliHFEextraCuts.cxx:1126
 AliHFEextraCuts.cxx:1127
 AliHFEextraCuts.cxx:1128
 AliHFEextraCuts.cxx:1129
 AliHFEextraCuts.cxx:1130
 AliHFEextraCuts.cxx:1131
 AliHFEextraCuts.cxx:1132
 AliHFEextraCuts.cxx:1133
 AliHFEextraCuts.cxx:1134
 AliHFEextraCuts.cxx:1135
 AliHFEextraCuts.cxx:1136
 AliHFEextraCuts.cxx:1137
 AliHFEextraCuts.cxx:1138
 AliHFEextraCuts.cxx:1139
 AliHFEextraCuts.cxx:1140
 AliHFEextraCuts.cxx:1141
 AliHFEextraCuts.cxx:1142
 AliHFEextraCuts.cxx:1143
 AliHFEextraCuts.cxx:1144
 AliHFEextraCuts.cxx:1145
 AliHFEextraCuts.cxx:1146
 AliHFEextraCuts.cxx:1147
 AliHFEextraCuts.cxx:1148
 AliHFEextraCuts.cxx:1149
 AliHFEextraCuts.cxx:1150
 AliHFEextraCuts.cxx:1151
 AliHFEextraCuts.cxx:1152
 AliHFEextraCuts.cxx:1153
 AliHFEextraCuts.cxx:1154
 AliHFEextraCuts.cxx:1155
 AliHFEextraCuts.cxx:1156
 AliHFEextraCuts.cxx:1157
 AliHFEextraCuts.cxx:1158
 AliHFEextraCuts.cxx:1159
 AliHFEextraCuts.cxx:1160
 AliHFEextraCuts.cxx:1161
 AliHFEextraCuts.cxx:1162
 AliHFEextraCuts.cxx:1163
 AliHFEextraCuts.cxx:1164
 AliHFEextraCuts.cxx:1165
 AliHFEextraCuts.cxx:1166
 AliHFEextraCuts.cxx:1167
 AliHFEextraCuts.cxx:1168
 AliHFEextraCuts.cxx:1169
 AliHFEextraCuts.cxx:1170
 AliHFEextraCuts.cxx:1171
 AliHFEextraCuts.cxx:1172
 AliHFEextraCuts.cxx:1173
 AliHFEextraCuts.cxx:1174
 AliHFEextraCuts.cxx:1175
 AliHFEextraCuts.cxx:1176
 AliHFEextraCuts.cxx:1177
 AliHFEextraCuts.cxx:1178
 AliHFEextraCuts.cxx:1179
 AliHFEextraCuts.cxx:1180
 AliHFEextraCuts.cxx:1181
 AliHFEextraCuts.cxx:1182
 AliHFEextraCuts.cxx:1183
 AliHFEextraCuts.cxx:1184
 AliHFEextraCuts.cxx:1185
 AliHFEextraCuts.cxx:1186
 AliHFEextraCuts.cxx:1187
 AliHFEextraCuts.cxx:1188
 AliHFEextraCuts.cxx:1189
 AliHFEextraCuts.cxx:1190
 AliHFEextraCuts.cxx:1191
 AliHFEextraCuts.cxx:1192
 AliHFEextraCuts.cxx:1193
 AliHFEextraCuts.cxx:1194
 AliHFEextraCuts.cxx:1195
 AliHFEextraCuts.cxx:1196
 AliHFEextraCuts.cxx:1197
 AliHFEextraCuts.cxx:1198
 AliHFEextraCuts.cxx:1199
 AliHFEextraCuts.cxx:1200
 AliHFEextraCuts.cxx:1201
 AliHFEextraCuts.cxx:1202
 AliHFEextraCuts.cxx:1203
 AliHFEextraCuts.cxx:1204
 AliHFEextraCuts.cxx:1205
 AliHFEextraCuts.cxx:1206
 AliHFEextraCuts.cxx:1207
 AliHFEextraCuts.cxx:1208
 AliHFEextraCuts.cxx:1209
 AliHFEextraCuts.cxx:1210
 AliHFEextraCuts.cxx:1211
 AliHFEextraCuts.cxx:1212
 AliHFEextraCuts.cxx:1213
 AliHFEextraCuts.cxx:1214
 AliHFEextraCuts.cxx:1215
 AliHFEextraCuts.cxx:1216
 AliHFEextraCuts.cxx:1217
 AliHFEextraCuts.cxx:1218
 AliHFEextraCuts.cxx:1219
 AliHFEextraCuts.cxx:1220
 AliHFEextraCuts.cxx:1221
 AliHFEextraCuts.cxx:1222
 AliHFEextraCuts.cxx:1223
 AliHFEextraCuts.cxx:1224
 AliHFEextraCuts.cxx:1225
 AliHFEextraCuts.cxx:1226
 AliHFEextraCuts.cxx:1227
 AliHFEextraCuts.cxx:1228
 AliHFEextraCuts.cxx:1229
 AliHFEextraCuts.cxx:1230
 AliHFEextraCuts.cxx:1231
 AliHFEextraCuts.cxx:1232
 AliHFEextraCuts.cxx:1233
 AliHFEextraCuts.cxx:1234
 AliHFEextraCuts.cxx:1235
 AliHFEextraCuts.cxx:1236
 AliHFEextraCuts.cxx:1237
 AliHFEextraCuts.cxx:1238
 AliHFEextraCuts.cxx:1239
 AliHFEextraCuts.cxx:1240
 AliHFEextraCuts.cxx:1241
 AliHFEextraCuts.cxx:1242
 AliHFEextraCuts.cxx:1243
 AliHFEextraCuts.cxx:1244
 AliHFEextraCuts.cxx:1245
 AliHFEextraCuts.cxx:1246
 AliHFEextraCuts.cxx:1247
 AliHFEextraCuts.cxx:1248
 AliHFEextraCuts.cxx:1249
 AliHFEextraCuts.cxx:1250
 AliHFEextraCuts.cxx:1251
 AliHFEextraCuts.cxx:1252
 AliHFEextraCuts.cxx:1253
 AliHFEextraCuts.cxx:1254
 AliHFEextraCuts.cxx:1255
 AliHFEextraCuts.cxx:1256
 AliHFEextraCuts.cxx:1257
 AliHFEextraCuts.cxx:1258
 AliHFEextraCuts.cxx:1259
 AliHFEextraCuts.cxx:1260
 AliHFEextraCuts.cxx:1261
 AliHFEextraCuts.cxx:1262
 AliHFEextraCuts.cxx:1263
 AliHFEextraCuts.cxx:1264
 AliHFEextraCuts.cxx:1265
 AliHFEextraCuts.cxx:1266
 AliHFEextraCuts.cxx:1267
 AliHFEextraCuts.cxx:1268
 AliHFEextraCuts.cxx:1269
 AliHFEextraCuts.cxx:1270
 AliHFEextraCuts.cxx:1271
 AliHFEextraCuts.cxx:1272
 AliHFEextraCuts.cxx:1273
 AliHFEextraCuts.cxx:1274
 AliHFEextraCuts.cxx:1275
 AliHFEextraCuts.cxx:1276
 AliHFEextraCuts.cxx:1277
 AliHFEextraCuts.cxx:1278
 AliHFEextraCuts.cxx:1279
 AliHFEextraCuts.cxx:1280
 AliHFEextraCuts.cxx:1281
 AliHFEextraCuts.cxx:1282
 AliHFEextraCuts.cxx:1283
 AliHFEextraCuts.cxx:1284
 AliHFEextraCuts.cxx:1285
 AliHFEextraCuts.cxx:1286
 AliHFEextraCuts.cxx:1287
 AliHFEextraCuts.cxx:1288
 AliHFEextraCuts.cxx:1289
 AliHFEextraCuts.cxx:1290
 AliHFEextraCuts.cxx:1291
 AliHFEextraCuts.cxx:1292
 AliHFEextraCuts.cxx:1293
 AliHFEextraCuts.cxx:1294
 AliHFEextraCuts.cxx:1295
 AliHFEextraCuts.cxx:1296
 AliHFEextraCuts.cxx:1297
 AliHFEextraCuts.cxx:1298
 AliHFEextraCuts.cxx:1299
 AliHFEextraCuts.cxx:1300
 AliHFEextraCuts.cxx:1301
 AliHFEextraCuts.cxx:1302
 AliHFEextraCuts.cxx:1303