]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGHF/correlationHF/AliHFAssociatedTrackCuts.cxx
Incrementing class version.
[u/mrichter/AliRoot.git] / PWGHF / correlationHF / AliHFAssociatedTrackCuts.cxx
index 9217091586961f80db2146c0641cf20304703358..6bf6cf436eddf707a129e72b3871471f62c80140 100644 (file)
-/**************************************************************************\r
- * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *\r
- *                                                                        *\r
- * Author: The ALICE Off-line Project.                                    *\r
- * Contributors are mentioned in the code where appropriate.              *\r
- *                                                                        *\r
- * Permission to use, copy, modify and distribute this software and its   *\r
- * documentation strictly for non-commercial purposes is hereby granted   *\r
- * without fee, provided that the above copyright notice appears in all   *\r
- * copies and that both the copyright notice and this permission notice   *\r
- * appear in the supporting documentation. The authors make no claims     *\r
- * about the suitability of this software for any purpose. It is          *\r
- * provided "as is" without express or implied warranty.                  *\r
- **************************************************************************/\r
-\r
-/* $Id$ */\r
-\r
-////////////////////////////////////////////////////////////////////////\r
-//\r
-// Base class for cuts on Associated tracks for HF Correlation analysis\r
-//\r
-// Author: S.Bjelogrlic (Utrecht) sandro.bjelogrlic@cern.ch\r
-////////////////////////////////////////////////////////////////////////\r
-#include <Riostream.h>\r
-#include "AliHFAssociatedTrackCuts.h"\r
-#include "AliAODPidHF.h"\r
-#include "AliESDtrackCuts.h"\r
-#include "AliESDtrack.h"\r
-#include "AliESDVertex.h"\r
-#include "AliAODv0.h"\r
-#include "AliAODVertex.h"\r
-#include "AliAODMCParticle.h"\r
-#include "AliAnalysisManager.h"\r
-#include "AliInputEventHandler.h"\r
-#include "TString.h"\r
-\r
-using std::cout;\r
-using std::endl;\r
-\r
-ClassImp(AliHFAssociatedTrackCuts)\r
-\r
-//--------------------------------------------------------------------------\r
-AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts():\r
-AliAnalysisCuts(),\r
-fESDTrackCuts(0),\r
-fPidObj(0),\r
-  fEffWeights(0),\r
-\r
-fTrigEffWeightsvspt(0),\r
-fTrigEffWeightsvsptB(0),\r
-fTrigEffWeights(0),\r
-fTrigEffWeightsB(0),\r
-fPoolMaxNEvents(0), \r
-fPoolMinNTracks(0), \r
-fMinEventsToMix(0),\r
-fNzVtxBins(0), \r
-fNzVtxBinsDim(0), \r
-fZvtxBins(0), \r
-fNCentBins(0), \r
-fNCentBinsDim(0), \r
-fCentBins(0),\r
-\r
-fNofMCEventType(0),\r
-fMCEventType(0),\r
-\r
-fNTrackCuts(0),\r
-fAODTrackCuts(0),\r
-fTrackCutsNames(0),\r
-fNvZeroCuts(0),\r
-fAODvZeroCuts(0),\r
-fvZeroCutsNames(0),\r
-fBit(-1),\r
-fCharge(0),\r
-fDescription("")\r
-\r
-{\r
-       //\r
-       //default constructor\r
-       //\r
-       //\r
-       //default constructor\r
-       //\r
-       \r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts(const char* name, const char* title):\r
-AliAnalysisCuts(name,title),\r
-fESDTrackCuts(0),\r
-fPidObj(0),\r
-fEffWeights(0),\r
-fTrigEffWeightsvspt(0),\r
-fTrigEffWeightsvsptB(0),\r
-fTrigEffWeights(0),\r
-fTrigEffWeightsB(0),\r
-fPoolMaxNEvents(0), \r
-fPoolMinNTracks(0), \r
-fMinEventsToMix(0),\r
-fNzVtxBins(0), \r
-fNzVtxBinsDim(0), \r
-fZvtxBins(0), \r
-fNCentBins(0), \r
-fNCentBinsDim(0), \r
-fCentBins(0),\r
-\r
-fNofMCEventType(0),\r
-fMCEventType(0),\r
-\r
-fNTrackCuts(0),\r
-fAODTrackCuts(0),\r
-fTrackCutsNames(0),\r
-fNvZeroCuts(0),\r
-fAODvZeroCuts(0),\r
-fvZeroCutsNames(0),\r
-fBit(-1),\r
-fCharge(0),\r
-fDescription("")\r
-\r
-{\r
-       //\r
-       //default constructor\r
-       //\r
-       \r
-}\r
-//--------------------------------------------------------------------------\r
-AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts(const AliHFAssociatedTrackCuts &source) :\r
-AliAnalysisCuts(source),\r
-fESDTrackCuts(source.fESDTrackCuts),\r
-fPidObj(source.fPidObj),\r
-fEffWeights(source.fEffWeights),\r
-fTrigEffWeightsvspt(source.fTrigEffWeightsvspt),\r
-fTrigEffWeightsvsptB(source.fTrigEffWeightsvsptB),\r
-fTrigEffWeights(source.fTrigEffWeights),\r
-fTrigEffWeightsB(source.fTrigEffWeightsB),\r
-\r
-fPoolMaxNEvents(source.fPoolMaxNEvents), \r
-fPoolMinNTracks(source.fPoolMinNTracks), \r
-fMinEventsToMix(source.fMinEventsToMix),\r
-fNzVtxBins(source.fNzVtxBins), \r
-fNzVtxBinsDim(source.fNzVtxBinsDim), \r
-fZvtxBins(source.fZvtxBins), \r
-fNCentBins(source.fNCentBins), \r
-fNCentBinsDim(source.fNCentBinsDim), \r
-fCentBins(source.fCentBins),\r
-\r
-fNofMCEventType(source.fNofMCEventType),\r
-fMCEventType(source.fMCEventType),\r
-\r
-fNTrackCuts(source.fNTrackCuts),\r
-fAODTrackCuts(source.fAODTrackCuts),\r
-fTrackCutsNames(source.fTrackCutsNames),\r
-fNvZeroCuts(source.fNvZeroCuts),\r
-fAODvZeroCuts(source.fAODvZeroCuts),\r
-fvZeroCutsNames(source.fvZeroCutsNames),\r
-fBit(source.fBit),\r
-fCharge(source.fCharge),\r
-fDescription(source.fDescription)\r
-{\r
-       //\r
-       // copy constructor\r
-       //\r
-       \r
-\r
-        AliInfo("AliHFAssociatedTrackCuts::Copy constructor ");\r
-       if(source.fESDTrackCuts) AddTrackCuts(source.fESDTrackCuts);\r
-       if(source.fAODTrackCuts) SetAODTrackCuts(source.fAODTrackCuts);\r
-       if(source.fAODvZeroCuts) SetAODvZeroCuts(source.fAODvZeroCuts);\r
-       if(source.fPidObj) SetPidHF(source.fPidObj);\r
-       if(source.fEffWeights) SetEfficiencyWeightMap(source.fEffWeights);\r
-    if(source.fTrigEffWeightsvspt) SetTriggerEffWeightMapvspt(source.fTrigEffWeightsvspt);\r
-    if(source.fTrigEffWeightsvsptB) SetTriggerEffWeightMapvsptB(source.fTrigEffWeightsvspt);\r
-    if(source.fTrigEffWeights) SetTriggerEffWeightMap(source.fTrigEffWeights);\r
-    if(source.fTrigEffWeightsB)SetTriggerEffWeightMapB(source.fTrigEffWeightsB);\r
-   \r
-    \r
-}\r
-//--------------------------------------------------------------------------\r
-AliHFAssociatedTrackCuts &AliHFAssociatedTrackCuts::operator=(const AliHFAssociatedTrackCuts &source)\r
-{\r
-       //\r
-       // assignment operator\r
-       //      \r
-       if(&source == this) return *this;\r
-       \r
-       AliAnalysisCuts::operator=(source);\r
-       fESDTrackCuts=source.fESDTrackCuts;\r
-       fPidObj=source.fPidObj;\r
-       fEffWeights=source.fEffWeights;\r
-    fTrigEffWeightsvspt=source.fTrigEffWeightsvspt;\r
-       fTrigEffWeightsvsptB=source.fTrigEffWeightsvsptB;\r
-    fTrigEffWeights=source.fTrigEffWeights;\r
-       fTrigEffWeightsB=source.fTrigEffWeightsB;\r
-       fNTrackCuts=source.fNTrackCuts;\r
-       fAODTrackCuts=source.fAODTrackCuts;\r
-       fTrackCutsNames=source.fTrackCutsNames;\r
-       fNvZeroCuts=source.fNvZeroCuts;\r
-       fAODvZeroCuts=source.fAODvZeroCuts;\r
-       fvZeroCutsNames=source.fvZeroCutsNames;\r
-       fBit=source.fBit;\r
-       fCharge=source.fCharge;\r
-       \r
-       return *this;\r
-\r
-}\r
-\r
-\r
-//--------------------------------------------------------------------------\r
-AliHFAssociatedTrackCuts::~AliHFAssociatedTrackCuts()\r
-{\r
-       if(fESDTrackCuts) {delete fESDTrackCuts; fESDTrackCuts = 0;}\r
-       if(fPidObj) {delete fPidObj; fPidObj = 0;}\r
-       if(fEffWeights){delete fEffWeights;fEffWeights=0;}\r
-    if(fTrigEffWeightsvspt){delete fTrigEffWeightsvspt;fTrigEffWeightsvspt=0;}\r
-       if(fTrigEffWeightsvsptB){delete fTrigEffWeightsvsptB;fTrigEffWeightsvsptB=0;}\r
-    if(fTrigEffWeights){delete fTrigEffWeights;fTrigEffWeights=0;}\r
-       if(fTrigEffWeightsB){delete fTrigEffWeightsB;fTrigEffWeightsB=0;}\r
-       if(fZvtxBins) {delete[] fZvtxBins; fZvtxBins=0;} \r
-       if(fCentBins) {delete[] fCentBins; fCentBins=0;}\r
-       if(fAODTrackCuts) {delete[] fAODTrackCuts; fAODTrackCuts=0;}\r
-       if(fTrackCutsNames) {delete[] fTrackCutsNames; fTrackCutsNames=0;}\r
-       if(fAODvZeroCuts){delete[] fAODvZeroCuts; fAODvZeroCuts=0;}\r
-       if(fvZeroCutsNames) {delete[] fvZeroCutsNames; fvZeroCutsNames=0;}\r
-\r
-       \r
-}\r
-//--------------------------------------------------------------------------\r
-Bool_t AliHFAssociatedTrackCuts::IsInAcceptance()\r
-{\r
-       printf("Careful: method AliHFAssociatedTrackCuts::IsInAcceptance is not implemented yet \n");\r
-       return kFALSE;\r
-}\r
-//--------------------------------------------------------------------------\r
-Bool_t AliHFAssociatedTrackCuts::IsHadronSelected(AliAODTrack * track,const AliESDVertex *primary,const Double_t magfield)\r
-{\r
-  \r
-  AliESDtrack esdtrack(track);\r
-  if(primary){// needed to calculate impact parameters\r
-    // needed to calculate the impact parameters\r
-    esdtrack.RelateToVertex(primary,magfield,3.); \r
-  }\r
-  // set the TPC cluster info\r
-  esdtrack.SetTPCClusterMap(track->GetTPCClusterMap());\r
-  esdtrack.SetTPCSharedMap(track->GetTPCSharedMap());\r
-  esdtrack.SetTPCPointsF(track->GetTPCNclsF());\r
-  \r
-  if(!fESDTrackCuts->IsSelected(&esdtrack)) return kFALSE;\r
-  \r
-  if(fBit>-1 && !track->TestFilterBit(fBit)) return kFALSE; // check the filter bit\r
-  \r
-  return kTRUE;\r
-       \r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-Bool_t AliHFAssociatedTrackCuts::CheckHadronKinematic(Double_t pt, Double_t d0) \r
-{\r
-       \r
-       \r
-       \r
-       if(pt < fAODTrackCuts[0]) return kFALSE;\r
-       if(pt > fAODTrackCuts[1]) return kFALSE;\r
-       if(d0 < fAODTrackCuts[2]) return kFALSE;\r
-       if(d0 > fAODTrackCuts[3]) return kFALSE;\r
-       \r
-       return kTRUE;\r
-\r
-       \r
-}\r
-//--------------------------------------------------------------------------\r
-\r
-Bool_t AliHFAssociatedTrackCuts::Charge(Short_t charge, AliAODTrack* track) \r
-{// charge is the charge to compare to (for example, a daughter of a D meson)\r
-       \r
-       if(!fCharge) return kTRUE; // if fCharge is set to 0 (no selection on the charge), returns always true\r
-       if(track->Charge()!= fCharge*charge) return kFALSE;\r
-       return kTRUE;\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-Bool_t AliHFAssociatedTrackCuts::CheckKaonCompatibility(AliAODTrack * track, Bool_t useMc, TClonesArray* mcArray, Int_t method)\r
-{\r
-       Bool_t isKaon = kFALSE;\r
-       \r
-       if(useMc) { // on MC\r
-               Int_t hadLabel = track->GetLabel();\r
-               if(hadLabel < 0) return kFALSE;\r
-               AliAODMCParticle* hadron = dynamic_cast<AliAODMCParticle*>(mcArray->At(hadLabel)); \r
-               if(hadron){\r
-                 Int_t pdg = TMath::Abs(hadron->GetPdgCode()); \r
-                 if (pdg == 321) isKaon = kTRUE;\r
-               }\r
-       }\r
-       \r
-       if(!useMc) { // on DATA\r
-          switch(method) {\r
-         case(1): {\r
-               Bool_t isKTPC=kFALSE;\r
-               Bool_t isPiTPC=kFALSE;\r
-               Bool_t isPTPC=kFALSE;\r
-               Bool_t isKTOF=kFALSE;\r
-               Bool_t isPiTOF=kFALSE;\r
-               Bool_t isPTOF=kFALSE;\r
-               \r
-               Bool_t KaonHyp = kFALSE;\r
-               Bool_t PionHyp = kFALSE;\r
-               Bool_t ProtonHyp = kFALSE;\r
-               \r
-               if(fPidObj->CheckStatus(track,"TOF")) {\r
-                       isKTOF=fPidObj->IsKaonRaw(track,"TOF");\r
-                       isPiTOF=fPidObj->IsPionRaw(track,"TOF");\r
-                       isPTOF=fPidObj->IsProtonRaw(track,"TOF");\r
-               }\r
-               if(fPidObj->CheckStatus(track,"TPC")){\r
-                       isKTPC=fPidObj->IsKaonRaw(track,"TPC");\r
-                       isPiTPC=fPidObj->IsPionRaw(track,"TPC");\r
-                       isPTPC=fPidObj->IsProtonRaw(track,"TPC");               \r
-               }\r
-               \r
-               if (isKTOF && isKTPC) KaonHyp = kTRUE;\r
-               if (isPiTOF && isPiTPC) PionHyp = kTRUE;\r
-               if (isPTOF && isPTPC) ProtonHyp = kTRUE;\r
-               \r
-               if(KaonHyp && !PionHyp && !ProtonHyp) isKaon = kTRUE; \r
-               break;\r
-             }\r
-      case(2): {\r
-               if(fPidObj->MakeRawPid(track,3)>=1) isKaon = kTRUE;\r
-               break;\r
-             }\r
-      }\r
-       }\r
-       \r
-       return isKaon;\r
-       \r
-}\r
-//--------------------------------------------------------------------------\r
-Bool_t AliHFAssociatedTrackCuts::IsKZeroSelected(AliAODv0 *vzero, AliAODVertex *vtx1)\r
-{\r
-       \r
-       if(vzero->DcaV0Daughters()>fAODvZeroCuts[0]) return kFALSE;\r
-       if(vzero->Chi2V0()>fAODvZeroCuts[1]) return kFALSE;\r
-       if(vzero->DecayLength(vtx1) < fAODvZeroCuts[2]) return kFALSE;\r
-       if(vzero->DecayLength(vtx1) > fAODvZeroCuts[3]) return kFALSE;\r
-       if(vzero->OpenAngleV0() > fAODvZeroCuts[4]) return kFALSE;\r
-       if(vzero->Pt() < fAODvZeroCuts[5]) return kFALSE;\r
-       if(TMath::Abs(vzero->Eta()) > fAODvZeroCuts[6]) return kFALSE;\r
-\r
-       \r
-       return kTRUE;\r
-}\r
-//--------------------------------------------------------------------------\r
-Bool_t *AliHFAssociatedTrackCuts::IsMCpartFromHF(Int_t label, TClonesArray*mcArray){\r
-  // Check origin in MC\r
-\r
-  AliAODMCParticle* mcParticle;\r
-  Int_t pdgCode = -1;\r
-       \r
-  Bool_t isCharmy = kFALSE;\r
-  Bool_t isBeauty = kFALSE;\r
-  Bool_t isD = kFALSE;\r
-  Bool_t isB = kFALSE;\r
-    \r
-     Bool_t *originvect = new Bool_t[4];\r
-    \r
-    originvect[0] = kFALSE;\r
-       originvect[1] = kFALSE;\r
-       originvect[2] = kFALSE;\r
-       originvect[3] = kFALSE;\r
-\r
-       if (label<0) return originvect;\r
-  \r
-       while(pdgCode!=2212){ // loops back to the collision to check the particle source\r
-\r
-    mcParticle = dynamic_cast<AliAODMCParticle*>(mcArray->At(label));\r
-    if(!mcParticle) {AliError("NO MC PARTICLE"); break;}\r
-    pdgCode =  TMath::Abs(mcParticle->GetPdgCode());\r
-\r
-    label = mcParticle->GetMother();\r
-\r
-\r
-    if((pdgCode>=400 && pdgCode <500) || (pdgCode>=4000 && pdgCode<5000 )) isD = kTRUE;\r
-    if((pdgCode>=500 && pdgCode <600) || (pdgCode>=5000 && pdgCode<6000 )) {isD = kFALSE; isB = kTRUE;}\r
-\r
-\r
-    if(pdgCode == 4) isCharmy = kTRUE;\r
-    if(pdgCode == 5) {isBeauty = kTRUE; isCharmy = kFALSE;}\r
-    if(label<0) break;\r
-\r
-  }\r
-\r
-       \r
-       originvect[0] = isCharmy;\r
-       originvect[1] = isBeauty;\r
-       originvect[2] = isD;\r
-       originvect[3] = isB;\r
\r
-    \r
-  return originvect;\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-Bool_t AliHFAssociatedTrackCuts::InvMassDstarRejection(AliAODRecoDecayHF2Prong* d, AliAODTrack *track, Int_t hypD0) const {\r
-       //\r
-       // Calculates invmass of track+D0 and rejects if compatible with D*\r
-       // (to remove pions from D*)\r
-       // \r
-       Double_t nsigma = 3.;\r
-       \r
-       Double_t mD0, mD0bar;\r
-       d->InvMassD0(mD0,mD0bar);\r
-       \r
-       Double_t invmassDstar1 = 0, invmassDstar2 = 0; \r
-       Double_t e1Pi = d->EProng(0,211), e2K = d->EProng(1,321); //hyp 1 (pi,K) - D0\r
-       Double_t e1K = d->EProng(0,321), e2Pi = d->EProng(1,211); //hyp 2 (K,pi) - D0bar\r
-       Double_t psum2 = (d->Px()+track->Px())*(d->Px()+track->Px())\r
-       +(d->Py()+track->Py())*(d->Py()+track->Py())\r
-       +(d->Pz()+track->Pz())*(d->Pz()+track->Pz());\r
-       \r
-       switch(hypD0) {\r
-               case 1:\r
-                       invmassDstar1 = TMath::Sqrt(pow(e1Pi+e2K+track->E(0.1396),2.)-psum2);\r
-                       if ((TMath::Abs(invmassDstar1-mD0)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;\r
-                       break;\r
-               case 2:\r
-                       invmassDstar2 = TMath::Sqrt(pow(e2Pi+e1K+track->E(0.1396),2.)-psum2);\r
-                       if ((TMath::Abs(invmassDstar2-mD0bar)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;\r
-                       break;\r
-               case 3:\r
-                       invmassDstar1 = TMath::Sqrt(pow(e1Pi+e2K+track->E(0.1396),2.)-psum2);\r
-                       invmassDstar2 = TMath::Sqrt(pow(e2Pi+e1K+track->E(0.1396),2.)-psum2);\r
-                       if ((TMath::Abs(invmassDstar1-mD0)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;\r
-                       if ((TMath::Abs(invmassDstar2-mD0bar)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;\r
-                       break;\r
-       }\r
-       \r
-       return kTRUE;\r
-}\r
-//________________________________________________________\r
-void AliHFAssociatedTrackCuts::SetMCEventTypes(Int_t *MCEventTypeArray)\r
-// set the array of event types you want to process in MonteCarlo (gluon splitting, pair production etc.)\r
-{\r
-       if(!fMCEventType) fMCEventType = new Int_t[fNofMCEventType];\r
-       \r
-       for(Int_t k=0; k<fNofMCEventType; k++){\r
-               fMCEventType[k] = MCEventTypeArray[k];\r
-       }\r
-       return; \r
-}\r
-\r
-//________________________________________________________\r
-void AliHFAssociatedTrackCuts::SetAODTrackCuts(Float_t *cutsarray)\r
-{\r
-       if(!fAODTrackCuts) fAODTrackCuts = new Float_t[fNTrackCuts];\r
-       for(Int_t i =0; i<fNTrackCuts; i++){\r
-               fAODTrackCuts[i] = cutsarray[i];\r
-       }\r
-       SetTrackCutsNames();\r
-       return;\r
-}\r
-//________________________________________________________\r
-void AliHFAssociatedTrackCuts::SetTrackCutsNames(/*TString *namearray*/){\r
-       \r
-       fTrackCutsNames = new TString[4];\r
-       fTrackCutsNames[0]= "associated track:: pt min [GeV/c]................: ";\r
-       fTrackCutsNames[1]= "associated track:: pt max [GeV/c]................: ";\r
-       fTrackCutsNames[2]= "associated track:: d0 min [cm]...................: ";\r
-       fTrackCutsNames[3]= "associated track:: d0 max [cm]...................: ";\r
-       \r
-\r
-       \r
-       return;\r
-}\r
-//--------------------------------------------------------------------------\r
-void AliHFAssociatedTrackCuts::SetAODvZeroCuts(Float_t *cutsarray)\r
-{\r
-       \r
-\r
-       if(!fAODvZeroCuts) fAODvZeroCuts = new Float_t[fNvZeroCuts];\r
-       for(Int_t i =0; i<fNvZeroCuts; i++){\r
-               fAODvZeroCuts[i] = cutsarray[i];\r
-       }\r
-       SetvZeroCutsNames();\r
-       return;\r
-}\r
-//--------------------------------------------------------------------------\r
-void AliHFAssociatedTrackCuts::SetvZeroCutsNames(/*TString *namearray*/){\r
-       \r
-       fvZeroCutsNames = new TString[7];\r
-       fvZeroCutsNames[0] = "vZero:: max DCA between two daughters [cm].......: ";\r
-       fvZeroCutsNames[1] = "vZero:: max fit Chi Square between two daughters.: ";\r
-       fvZeroCutsNames[2] = "vZero:: min decay length [cm]....................: ";\r
-       fvZeroCutsNames[3] = "vZero:: max decay length [cm]....................: ";\r
-       fvZeroCutsNames[4] = "vZero:: max opening angle between daughters [rad]: ";\r
-       fvZeroCutsNames[5] = "vZero:: pt min [Gev/c]...........................: ";\r
-       fvZeroCutsNames[6] = "vZero:: |Eta| range <............................: ";\r
-       \r
-       \r
-       return;\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-void AliHFAssociatedTrackCuts::SetPidAssociated()\r
-{\r
-  //setting PidResponse\r
-  if(fPidObj->GetOldPid()==kFALSE && fPidObj->GetPidResponse()==0x0){\r
-    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();\r
-    AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();\r
-    AliPIDResponse *pidResp=inputHandler->GetPIDResponse();\r
-    fPidObj->SetPidResponse(pidResp);\r
-  }\r
-}\r
-//--------------------------------------------------------------------------\r
-\r
-void AliHFAssociatedTrackCuts::Print(Option_t *option) const\r
-{\r
-  /// overloaded from TObject: print info\r
-  if (strcmp(option, "parameters")==0) {\r
-    PrintPoolParameters();\r
-    return;\r
-  } else if (strcmp(option, "selectedMC")==0) {\r
-    PrintSelectedMCevents();\r
-    return;\r
-  }\r
-  PrintAll();\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-void AliHFAssociatedTrackCuts::PrintAll() const\r
-{\r
-       \r
-       if(fDescription){\r
-         printf("=================================================");\r
-         printf("\nAdditional description\n");\r
-         std::cout << fDescription << std::endl;\r
-         printf("\n");\r
-       }\r
-       printf("\n=================================================");\r
-       if(fESDTrackCuts){\r
-         printf("\nCuts for the associated track: \n \n");\r
-         \r
-         printf("ITS Refit........................................: %s\n",fESDTrackCuts->GetRequireITSRefit() ? "Yes" : "No");\r
-         printf("TPC Refit........................................: %s\n",fESDTrackCuts->GetRequireTPCRefit() ? "Yes" : "No");\r
-         printf("ITS SA...........................................: %s\n",fESDTrackCuts->GetRequireITSStandAlone() ? "Yes" : "No");\r
-         printf("TPC SA...........................................: %s\n",fESDTrackCuts->GetRequireTPCStandAlone() ? "Yes" : "No");\r
-         printf("Min number of ITS clusters.......................: %d\n",fESDTrackCuts->GetMinNClustersITS());\r
-         printf("Min number of TPC clusters.......................: %d\n",fESDTrackCuts->GetMinNClusterTPC());\r
-         Int_t spd = fESDTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD);\r
-         if(spd==0) std::cout <<  "SPD..............................................: kOff"  << std::endl;\r
-         if(spd==1) std::cout <<  "SPD..............................................: kNone"  << std::endl;\r
-         if(spd==2) std::cout <<  "SPD..............................................: kAny"  << std::endl;\r
-         if(spd==3) std::cout <<  "SPD..............................................: kFirst"  << std::endl;\r
-         if(spd==4) std::cout <<  "SPD..............................................: kOnlyFirst"  << std::endl;\r
-         if(spd==5) std::cout <<  "SPD..............................................: kSecond"  << std::endl;\r
-         if(spd==6) std::cout <<  "SPD..............................................: kOnlySecond"  << std::endl;\r
-         if(spd==7) std::cout <<  "SPD..............................................: kBoth"  << std::endl;\r
-       }\r
-       else printf("\nNo Cuts for Associated Tracks\n");\r
-       std::cout <<  "Filter Bit.......................................: " << fBit  << std::endl;\r
-       std::cout <<  "Charge...........................................: " << fCharge  << std::endl;\r
-       \r
-       if(fAODTrackCuts){\r
-         for(Int_t j=0;j<fNTrackCuts;j++){\r
-           std::cout << fTrackCutsNames[j] << fAODTrackCuts[j] << std::endl;\r
-         }\r
-       }\r
-\r
-       if(fAODvZeroCuts){\r
-         printf("\n");\r
-         printf("=================================================");\r
-         printf("\nCuts for the K0 candidates: \n \n");\r
-         for(Int_t k=0;k<fNvZeroCuts;k++){\r
-           std::cout << fvZeroCutsNames[k] <<  fAODvZeroCuts[k] << std::endl;\r
-         }\r
-       }\r
-       else printf("\nNo Cuts for the K0 candidates\n");\r
-       std::cout << " " << std::endl;\r
-       PrintPoolParameters();\r
-       PrintSelectedMCevents();\r
-\r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-void AliHFAssociatedTrackCuts::PrintPoolParameters() const\r
-{   \r
-       printf("=================================================");\r
-       printf("\nEvent Pool settings: \n \n");\r
-       \r
-       printf("Number of zVtx Bins: %d\n", fNzVtxBins);\r
-       printf("\nzVtx Bins:\n");\r
-       //Double_t zVtxbinLims[fNzVtxBins+1] = fNzVtxBins;\r
-       for(Int_t k=0; k<fNzVtxBins; k++){\r
-               printf("Bin %d..............................................: %.1f - %.1f cm\n", k, fZvtxBins[k], fZvtxBins[k+1]);      \r
-       }\r
-       printf("\n");\r
-       printf("\nNumber of Centrality(multiplicity) Bins: %d\n", fNCentBins);\r
-       printf("\nCentrality(multiplicity) Bins:\n");\r
-       for(Int_t k=0; k<fNCentBins; k++){\r
-               printf("Bin %d..............................................: %.1f - %.1f\n", k, fCentBins[k], fCentBins[k+1]);\r
-       }\r
-\r
-       \r
-       \r
-}\r
-//--------------------------------------------------------------------------\r
-\r
-Double_t AliHFAssociatedTrackCuts::GetTrackWeight(Double_t pt, Double_t eta,Double_t zvtx){\r
-  if(!fEffWeights)return 1.;\r
-  \r
-  Int_t bin=fEffWeights->FindBin(pt,eta,zvtx);\r
-  if(fEffWeights->IsBinUnderflow(bin)||fEffWeights->IsBinOverflow(bin))return 1.;\r
-  return fEffWeights->GetBinContent(bin);\r
-\r
-}\r
-\r
-\r
-//--------------------------------------------------------------------------\r
-Double_t AliHFAssociatedTrackCuts::GetTrigWeight(Double_t pt, Double_t mult){\r
-    \r
-    \r
-    \r
-    if(fTrigEffWeightsvspt){\r
-       Int_t bin=fTrigEffWeightsvspt->FindBin(pt);\r
-        if(fTrigEffWeightsvspt->IsBinUnderflow(bin)||fTrigEffWeightsvspt->IsBinOverflow(bin))return 1.;\r
-        return fTrigEffWeightsvspt->GetBinContent(bin);\r
-        \r
-    }\r
-    \r
-    if(fTrigEffWeights){\r
-        Int_t bin=fTrigEffWeights->FindBin(pt,mult);\r
-        if(fTrigEffWeights->IsBinUnderflow(bin)||fTrigEffWeights->IsBinOverflow(bin))return 1.;\r
-        return fTrigEffWeights->GetBinContent(bin);\r
-        \r
-    }\r
-    \r
-    //if(!fTrigEffWeights && !fTrigEffWeightsvspt)return 1.;\r
-    \r
-    return 1.;\r
-    \r
-}\r
-\r
-//--------------------------------------------------------------------------\r
-Double_t AliHFAssociatedTrackCuts::GetTrigWeightB(Double_t pt, Double_t mult){\r
-    \r
-    if(fTrigEffWeightsvsptB){\r
-        Int_t bin=fTrigEffWeightsvsptB->FindBin(pt);\r
-        if(fTrigEffWeightsvsptB->IsBinUnderflow(bin)||fTrigEffWeightsvsptB->IsBinOverflow(bin))return 1.;\r
-        return fTrigEffWeightsvsptB->GetBinContent(bin);\r
-        \r
-    }\r
-    \r
-    if(fTrigEffWeightsB){\r
-        Int_t bin=fTrigEffWeightsB->FindBin(pt,mult);\r
-        if(fTrigEffWeightsB->IsBinUnderflow(bin)||fTrigEffWeightsB->IsBinOverflow(bin))return 1.;\r
-        return fTrigEffWeightsB->GetBinContent(bin);\r
-        \r
-    }\r
-    \r
- //   if(!fTrigEffWeightsB && !fTrigEffWeightsvsptB)return 1.;\r
-    return 1;\r
-}\r
-//--------------------------------------------------------------------------\r
-void AliHFAssociatedTrackCuts::PrintSelectedMCevents() const\r
-{\r
-       printf("\n=================================================");\r
-       \r
-       printf("\nSelected MC events: \n \n");\r
-       printf("Number of selected events: %d\n",fNofMCEventType);\r
-       \r
-       for(Int_t k=0; k<fNofMCEventType; k++){\r
-       if(fMCEventType[k]==28) printf("=> Flavour excitation \n");     \r
-       if(fMCEventType[k]==53) printf("=> Pair creation \n");  \r
-       if(fMCEventType[k]==68) printf("=> Gluon splitting \n");        \r
-       }\r
-       \r
-       printf("\n");\r
-       for(Int_t k=0; k<fNofMCEventType; k++){\r
-               printf("MC process code %d \n",fMCEventType[k]);                \r
-       }\r
-       \r
-       printf("\n");\r
-       \r
-       \r
-               \r
-       \r
-}\r
-\r
-\r
+/**************************************************************************
+ * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/* $Id$ */
+
+////////////////////////////////////////////////////////////////////////
+//
+// Base class for cuts on Associated tracks for HF Correlation analysis
+//
+// Author: S.Bjelogrlic (Utrecht) sandro.bjelogrlic@cern.ch
+////////////////////////////////////////////////////////////////////////
+#include <Riostream.h>
+#include "AliHFAssociatedTrackCuts.h"
+#include "AliAODPidHF.h"
+#include "AliESDtrackCuts.h"
+#include "AliESDtrack.h"
+#include "AliESDVertex.h"
+#include "AliAODv0.h"
+#include "AliAODVertex.h"
+#include "AliAODMCParticle.h"
+#include "AliAnalysisManager.h"
+#include "AliInputEventHandler.h"
+#include "TString.h"
+
+using std::cout;
+using std::endl;
+
+ClassImp(AliHFAssociatedTrackCuts)
+
+//--------------------------------------------------------------------------
+AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts():
+AliAnalysisCuts(),
+fESDTrackCuts(0),
+fPidObj(0),
+  fEffWeights(0),
+
+fTrigEffWeightsvspt(0),
+fTrigEffWeightsvsptB(0),
+fTrigEffWeights(0),
+fTrigEffWeightsB(0),
+fPoolMaxNEvents(0), 
+fPoolMinNTracks(0), 
+fMinEventsToMix(0),
+fNzVtxBins(0), 
+fNzVtxBinsDim(0), 
+fZvtxBins(0), 
+fNCentBins(0), 
+fNCentBinsDim(0), 
+fCentBins(0),
+
+fNofMCEventType(0),
+fMCEventType(0),
+
+fNTrackCuts(0),
+fAODTrackCuts(0),
+fTrackCutsNames(0),
+fNvZeroCuts(0),
+fAODvZeroCuts(0),
+fvZeroCutsNames(0),
+fBit(-1),
+fCharge(0),
+fDescription("")
+
+{
+       //
+       //default constructor
+       //
+       //
+       //default constructor
+       //
+       
+}
+
+//--------------------------------------------------------------------------
+AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts(const char* name, const char* title):
+AliAnalysisCuts(name,title),
+fESDTrackCuts(0),
+fPidObj(0),
+fEffWeights(0),
+fTrigEffWeightsvspt(0),
+fTrigEffWeightsvsptB(0),
+fTrigEffWeights(0),
+fTrigEffWeightsB(0),
+fPoolMaxNEvents(0), 
+fPoolMinNTracks(0), 
+fMinEventsToMix(0),
+fNzVtxBins(0), 
+fNzVtxBinsDim(0), 
+fZvtxBins(0), 
+fNCentBins(0), 
+fNCentBinsDim(0), 
+fCentBins(0),
+
+fNofMCEventType(0),
+fMCEventType(0),
+
+fNTrackCuts(0),
+fAODTrackCuts(0),
+fTrackCutsNames(0),
+fNvZeroCuts(0),
+fAODvZeroCuts(0),
+fvZeroCutsNames(0),
+fBit(-1),
+fCharge(0),
+fDescription("")
+
+{
+       //
+       //default constructor
+       //
+       
+}
+//--------------------------------------------------------------------------
+AliHFAssociatedTrackCuts::AliHFAssociatedTrackCuts(const AliHFAssociatedTrackCuts &source) :
+AliAnalysisCuts(source),
+fESDTrackCuts(source.fESDTrackCuts),
+fPidObj(source.fPidObj),
+fEffWeights(source.fEffWeights),
+fTrigEffWeightsvspt(source.fTrigEffWeightsvspt),
+fTrigEffWeightsvsptB(source.fTrigEffWeightsvsptB),
+fTrigEffWeights(source.fTrigEffWeights),
+fTrigEffWeightsB(source.fTrigEffWeightsB),
+
+fPoolMaxNEvents(source.fPoolMaxNEvents), 
+fPoolMinNTracks(source.fPoolMinNTracks), 
+fMinEventsToMix(source.fMinEventsToMix),
+fNzVtxBins(source.fNzVtxBins), 
+fNzVtxBinsDim(source.fNzVtxBinsDim), 
+fZvtxBins(source.fZvtxBins), 
+fNCentBins(source.fNCentBins), 
+fNCentBinsDim(source.fNCentBinsDim), 
+fCentBins(source.fCentBins),
+
+fNofMCEventType(source.fNofMCEventType),
+fMCEventType(source.fMCEventType),
+
+fNTrackCuts(source.fNTrackCuts),
+fAODTrackCuts(source.fAODTrackCuts),
+fTrackCutsNames(source.fTrackCutsNames),
+fNvZeroCuts(source.fNvZeroCuts),
+fAODvZeroCuts(source.fAODvZeroCuts),
+fvZeroCutsNames(source.fvZeroCutsNames),
+fBit(source.fBit),
+fCharge(source.fCharge),
+fDescription(source.fDescription)
+{
+       //
+       // copy constructor
+       //
+       
+
+        AliInfo("AliHFAssociatedTrackCuts::Copy constructor ");
+       if(source.fESDTrackCuts) AddTrackCuts(source.fESDTrackCuts);
+       if(source.fAODTrackCuts) SetAODTrackCuts(source.fAODTrackCuts);
+       if(source.fAODvZeroCuts) SetAODvZeroCuts(source.fAODvZeroCuts);
+       if(source.fPidObj) SetPidHF(source.fPidObj);
+       if(source.fEffWeights) SetEfficiencyWeightMap(source.fEffWeights);
+       if(source.fTrigEffWeightsvspt) SetTriggerEffWeightMapvspt(source.fTrigEffWeightsvspt);
+       if(source.fTrigEffWeightsvsptB) SetTriggerEffWeightMapvsptB(source.fTrigEffWeightsvsptB);
+       if(source.fTrigEffWeights) SetTriggerEffWeightMap(source.fTrigEffWeights);
+       if(source.fTrigEffWeightsB)SetTriggerEffWeightMapB(source.fTrigEffWeightsB);
+   
+    
+}
+//--------------------------------------------------------------------------
+AliHFAssociatedTrackCuts &AliHFAssociatedTrackCuts::operator=(const AliHFAssociatedTrackCuts &source)
+{
+       //
+       // assignment operator
+       //      
+       if(&source == this) return *this;
+       
+       AliAnalysisCuts::operator=(source);
+       fESDTrackCuts=source.fESDTrackCuts;
+       fPidObj=source.fPidObj;
+       fEffWeights=source.fEffWeights;
+    fTrigEffWeightsvspt=source.fTrigEffWeightsvspt;
+       fTrigEffWeightsvsptB=source.fTrigEffWeightsvsptB;
+    fTrigEffWeights=source.fTrigEffWeights;
+       fTrigEffWeightsB=source.fTrigEffWeightsB;
+       fNTrackCuts=source.fNTrackCuts;
+       fAODTrackCuts=source.fAODTrackCuts;
+       fTrackCutsNames=source.fTrackCutsNames;
+       fNvZeroCuts=source.fNvZeroCuts;
+       fAODvZeroCuts=source.fAODvZeroCuts;
+       fvZeroCutsNames=source.fvZeroCutsNames;
+       fBit=source.fBit;
+       fCharge=source.fCharge;
+       
+       return *this;
+
+}
+
+
+//--------------------------------------------------------------------------
+AliHFAssociatedTrackCuts::~AliHFAssociatedTrackCuts()
+{
+       if(fESDTrackCuts) {delete fESDTrackCuts; fESDTrackCuts = 0;}
+       if(fPidObj) {delete fPidObj; fPidObj = 0;}
+       if(fEffWeights){delete fEffWeights;fEffWeights=0;}
+    if(fTrigEffWeightsvspt){delete fTrigEffWeightsvspt;fTrigEffWeightsvspt=0;}
+       if(fTrigEffWeightsvsptB){delete fTrigEffWeightsvsptB;fTrigEffWeightsvsptB=0;}
+    if(fTrigEffWeights){delete fTrigEffWeights;fTrigEffWeights=0;}
+       if(fTrigEffWeightsB){delete fTrigEffWeightsB;fTrigEffWeightsB=0;}
+       if(fZvtxBins) {delete[] fZvtxBins; fZvtxBins=0;} 
+       if(fCentBins) {delete[] fCentBins; fCentBins=0;}
+       if(fAODTrackCuts) {delete[] fAODTrackCuts; fAODTrackCuts=0;}
+       if(fTrackCutsNames) {delete[] fTrackCutsNames; fTrackCutsNames=0;}
+       if(fAODvZeroCuts){delete[] fAODvZeroCuts; fAODvZeroCuts=0;}
+       if(fvZeroCutsNames) {delete[] fvZeroCutsNames; fvZeroCutsNames=0;}
+
+       
+}
+//--------------------------------------------------------------------------
+Bool_t AliHFAssociatedTrackCuts::IsInAcceptance()
+{
+       printf("Careful: method AliHFAssociatedTrackCuts::IsInAcceptance is not implemented yet \n");
+       return kFALSE;
+}
+//--------------------------------------------------------------------------
+Bool_t AliHFAssociatedTrackCuts::IsHadronSelected(AliAODTrack * track,const AliESDVertex *primary, Double_t magfield)
+{
+  
+  AliESDtrack esdtrack(track);
+  if(primary){// needed to calculate impact parameters
+    // needed to calculate the impact parameters
+    esdtrack.RelateToVertex(primary,magfield,3.); 
+  }
+  // set the TPC cluster info
+  esdtrack.SetTPCClusterMap(track->GetTPCClusterMap());
+  esdtrack.SetTPCSharedMap(track->GetTPCSharedMap());
+  esdtrack.SetTPCPointsF(track->GetTPCNclsF());
+  
+  if(!fESDTrackCuts->IsSelected(&esdtrack)) return kFALSE;
+  
+  if(fBit>-1 && !track->TestFilterBit(fBit)) return kFALSE; // check the filter bit
+  
+  return kTRUE;
+       
+}
+
+//--------------------------------------------------------------------------
+Bool_t AliHFAssociatedTrackCuts::CheckHadronKinematic(Double_t pt, Double_t d0) 
+{
+       
+       
+       
+       if(pt < fAODTrackCuts[0]) return kFALSE;
+       if(pt > fAODTrackCuts[1]) return kFALSE;
+       if(d0 < fAODTrackCuts[2]) return kFALSE;
+       if(d0 > fAODTrackCuts[3]) return kFALSE;
+       
+       return kTRUE;
+
+       
+}
+//--------------------------------------------------------------------------
+
+Bool_t AliHFAssociatedTrackCuts::Charge(Short_t charge, AliAODTrack* track) 
+{// charge is the charge to compare to (for example, a daughter of a D meson)
+       
+       if(!fCharge) return kTRUE; // if fCharge is set to 0 (no selection on the charge), returns always true
+       if(track->Charge()!= fCharge*charge) return kFALSE;
+       return kTRUE;
+}
+
+//--------------------------------------------------------------------------
+Bool_t AliHFAssociatedTrackCuts::CheckKaonCompatibility(AliAODTrack * track, Bool_t useMc, TClonesArray* mcArray, Int_t method)
+{
+       Bool_t isKaon = kFALSE;
+       
+       if(useMc) { // on MC
+               Int_t hadLabel = track->GetLabel();
+               if(hadLabel < 0) return kFALSE;
+               AliAODMCParticle* hadron = dynamic_cast<AliAODMCParticle*>(mcArray->At(hadLabel)); 
+               if(hadron){
+                 Int_t pdg = TMath::Abs(hadron->GetPdgCode()); 
+                 if (pdg == 321) isKaon = kTRUE;
+               }
+       }
+       
+       if(!useMc) { // on DATA
+          switch(method) {
+         case(1): {
+               Bool_t isKTPC=kFALSE;
+               Bool_t isPiTPC=kFALSE;
+               Bool_t isPTPC=kFALSE;
+               Bool_t isKTOF=kFALSE;
+               Bool_t isPiTOF=kFALSE;
+               Bool_t isPTOF=kFALSE;
+               
+               Bool_t KaonHyp = kFALSE;
+               Bool_t PionHyp = kFALSE;
+               Bool_t ProtonHyp = kFALSE;
+               
+               if(fPidObj->CheckStatus(track,"TOF")) {
+                       isKTOF=fPidObj->IsKaonRaw(track,"TOF");
+                       isPiTOF=fPidObj->IsPionRaw(track,"TOF");
+                       isPTOF=fPidObj->IsProtonRaw(track,"TOF");
+               }
+               if(fPidObj->CheckStatus(track,"TPC")){
+                       isKTPC=fPidObj->IsKaonRaw(track,"TPC");
+                       isPiTPC=fPidObj->IsPionRaw(track,"TPC");
+                       isPTPC=fPidObj->IsProtonRaw(track,"TPC");               
+               }
+               
+               if (isKTOF && isKTPC) KaonHyp = kTRUE;
+               if (isPiTOF && isPiTPC) PionHyp = kTRUE;
+               if (isPTOF && isPTPC) ProtonHyp = kTRUE;
+               
+               if(KaonHyp && !PionHyp && !ProtonHyp) isKaon = kTRUE; 
+               break;
+             }
+      case(2): {
+               if(fPidObj->MakeRawPid(track,3)>=1) isKaon = kTRUE;
+               break;
+             }
+      }
+       }
+       
+       return isKaon;
+       
+}
+//--------------------------------------------------------------------------
+Bool_t AliHFAssociatedTrackCuts::IsKZeroSelected(AliAODv0 *vzero, AliAODVertex *vtx1)
+{
+       
+       if(vzero->DcaV0Daughters()>fAODvZeroCuts[0]) return kFALSE;
+       if(vzero->Chi2V0()>fAODvZeroCuts[1]) return kFALSE;
+       if(vzero->DecayLength(vtx1) < fAODvZeroCuts[2]) return kFALSE;
+       if(vzero->DecayLength(vtx1) > fAODvZeroCuts[3]) return kFALSE;
+       if(vzero->OpenAngleV0() > fAODvZeroCuts[4]) return kFALSE;
+       if(vzero->Pt() < fAODvZeroCuts[5]) return kFALSE;
+       if(TMath::Abs(vzero->Eta()) > fAODvZeroCuts[6]) return kFALSE;
+
+       
+       return kTRUE;
+}
+//--------------------------------------------------------------------------
+Bool_t *AliHFAssociatedTrackCuts::IsMCpartFromHF(Int_t label, TClonesArray*mcArray){
+  // Check origin in MC
+
+  AliAODMCParticle* mcParticle;
+  Int_t pdgCode = -1;
+       
+  Bool_t isCharmy = kFALSE;
+  Bool_t isBeauty = kFALSE;
+  Bool_t isD = kFALSE;
+  Bool_t isB = kFALSE;
+    
+     Bool_t *originvect = new Bool_t[4];
+    
+    originvect[0] = kFALSE;
+       originvect[1] = kFALSE;
+       originvect[2] = kFALSE;
+       originvect[3] = kFALSE;
+
+       if (label<0) return originvect;
+  
+       while(pdgCode!=2212){ // loops back to the collision to check the particle source
+
+    mcParticle = dynamic_cast<AliAODMCParticle*>(mcArray->At(label));
+    if(!mcParticle) {AliError("NO MC PARTICLE"); break;}
+    pdgCode =  TMath::Abs(mcParticle->GetPdgCode());
+
+    label = mcParticle->GetMother();
+
+
+    if((pdgCode>=400 && pdgCode <500) || (pdgCode>=4000 && pdgCode<5000 )) isD = kTRUE;
+    if((pdgCode>=500 && pdgCode <600) || (pdgCode>=5000 && pdgCode<6000 )) {isD = kFALSE; isB = kTRUE;}
+
+
+    if(pdgCode == 4) isCharmy = kTRUE;
+    if(pdgCode == 5) {isBeauty = kTRUE; isCharmy = kFALSE;}
+    if(label<0) break;
+
+  }
+
+       
+       originvect[0] = isCharmy;
+       originvect[1] = isBeauty;
+       originvect[2] = isD;
+       originvect[3] = isB;
+    
+  return originvect;
+}
+
+//--------------------------------------------------------------------------
+Bool_t AliHFAssociatedTrackCuts::InvMassDstarRejection(AliAODRecoDecayHF2Prong* d, AliAODTrack *track, Int_t hypD0) const {
+       //
+       // Calculates invmass of track+D0 and rejects if compatible with D*
+       // (to remove pions from D*)
+       // 
+       Double_t nsigma = 3.;
+       
+       Double_t mD0, mD0bar;
+       d->InvMassD0(mD0,mD0bar);
+       
+       Double_t invmassDstar1 = 0, invmassDstar2 = 0; 
+       Double_t e1Pi = d->EProng(0,211), e2K = d->EProng(1,321); //hyp 1 (pi,K) - D0
+       Double_t e1K = d->EProng(0,321), e2Pi = d->EProng(1,211); //hyp 2 (K,pi) - D0bar
+       Double_t psum2 = (d->Px()+track->Px())*(d->Px()+track->Px())
+       +(d->Py()+track->Py())*(d->Py()+track->Py())
+       +(d->Pz()+track->Pz())*(d->Pz()+track->Pz());
+       
+       switch(hypD0) {
+               case 1:
+                       invmassDstar1 = TMath::Sqrt(pow(e1Pi+e2K+track->E(0.1396),2.)-psum2);
+                       if ((TMath::Abs(invmassDstar1-mD0)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
+                       break;
+               case 2:
+                       invmassDstar2 = TMath::Sqrt(pow(e2Pi+e1K+track->E(0.1396),2.)-psum2);
+                       if ((TMath::Abs(invmassDstar2-mD0bar)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
+                       break;
+               case 3:
+                       invmassDstar1 = TMath::Sqrt(pow(e1Pi+e2K+track->E(0.1396),2.)-psum2);
+                       invmassDstar2 = TMath::Sqrt(pow(e2Pi+e1K+track->E(0.1396),2.)-psum2);
+                       if ((TMath::Abs(invmassDstar1-mD0)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
+                       if ((TMath::Abs(invmassDstar2-mD0bar)-0.14543) < nsigma*800.*pow(10.,-6.)) return kFALSE;
+                       break;
+       }
+       
+       return kTRUE;
+}
+//________________________________________________________
+void AliHFAssociatedTrackCuts::SetMCEventTypes(Int_t *MCEventTypeArray)
+// set the array of event types you want to process in MonteCarlo (gluon splitting, pair production etc.)
+{
+       if(!fMCEventType) fMCEventType = new Int_t[fNofMCEventType];
+       
+       for(Int_t k=0; k<fNofMCEventType; k++){
+               fMCEventType[k] = MCEventTypeArray[k];
+       }
+       return; 
+}
+
+//________________________________________________________
+void AliHFAssociatedTrackCuts::SetAODTrackCuts(Float_t *cutsarray)
+{
+       if(!fAODTrackCuts) fAODTrackCuts = new Float_t[fNTrackCuts];
+       for(Int_t i =0; i<fNTrackCuts; i++){
+               fAODTrackCuts[i] = cutsarray[i];
+       }
+       SetTrackCutsNames();
+       return;
+}
+//________________________________________________________
+void AliHFAssociatedTrackCuts::SetTrackCutsNames(/*TString *namearray*/){
+       
+       fTrackCutsNames = new TString[4];
+       fTrackCutsNames[0]= "associated track:: pt min [GeV/c]................: ";
+       fTrackCutsNames[1]= "associated track:: pt max [GeV/c]................: ";
+       fTrackCutsNames[2]= "associated track:: d0 min [cm]...................: ";
+       fTrackCutsNames[3]= "associated track:: d0 max [cm]...................: ";
+       
+
+       
+       return;
+}
+//--------------------------------------------------------------------------
+void AliHFAssociatedTrackCuts::SetAODvZeroCuts(Float_t *cutsarray)
+{
+       
+
+       if(!fAODvZeroCuts) fAODvZeroCuts = new Float_t[fNvZeroCuts];
+       for(Int_t i =0; i<fNvZeroCuts; i++){
+               fAODvZeroCuts[i] = cutsarray[i];
+       }
+       SetvZeroCutsNames();
+       return;
+}
+//--------------------------------------------------------------------------
+void AliHFAssociatedTrackCuts::SetvZeroCutsNames(/*TString *namearray*/){
+       
+       fvZeroCutsNames = new TString[7];
+       fvZeroCutsNames[0] = "vZero:: max DCA between two daughters [cm].......: ";
+       fvZeroCutsNames[1] = "vZero:: max fit Chi Square between two daughters.: ";
+       fvZeroCutsNames[2] = "vZero:: min decay length [cm]....................: ";
+       fvZeroCutsNames[3] = "vZero:: max decay length [cm]....................: ";
+       fvZeroCutsNames[4] = "vZero:: max opening angle between daughters [rad]: ";
+       fvZeroCutsNames[5] = "vZero:: pt min [Gev/c]...........................: ";
+       fvZeroCutsNames[6] = "vZero:: |Eta| range <............................: ";
+       
+       
+       return;
+}
+
+//--------------------------------------------------------------------------
+void AliHFAssociatedTrackCuts::SetPidAssociated()
+{
+  //setting PidResponse
+  if(fPidObj->GetOldPid()==kFALSE && fPidObj->GetPidResponse()==0x0){
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
+    AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
+    fPidObj->SetPidResponse(pidResp);
+  }
+}
+//--------------------------------------------------------------------------
+
+void AliHFAssociatedTrackCuts::Print(Option_t *option) const
+{
+  /// overloaded from TObject: print info
+  if (strcmp(option, "parameters")==0) {
+    PrintPoolParameters();
+    return;
+  } else if (strcmp(option, "selectedMC")==0) {
+    PrintSelectedMCevents();
+    return;
+  }
+  PrintAll();
+}
+
+//--------------------------------------------------------------------------
+Int_t AliHFAssociatedTrackCuts::GetPoolBin(Double_t multorcent, Double_t zVtx) const
+{
+    Int_t poolbin = -1;
+    Int_t centbin = -1;
+    Int_t zvtxbin = -1;
+    
+    
+    if(multorcent <fCentBins[0]) return poolbin;
+    if(zVtx <fZvtxBins[0]) return poolbin;
+    
+    
+    for (Int_t i=0;i<fNCentBins;i++){
+        if(multorcent<fCentBins[i+1]) {
+            centbin=i;
+            break;
+        }
+    }
+    
+    for (Int_t i=0;i<fNzVtxBins;i++){
+        if(zVtx<fZvtxBins[i+1]) {
+            zvtxbin=i;
+            break;
+        }
+    }
+
+    poolbin = centbin  + zvtxbin*fNzVtxBins;
+    
+    return poolbin;
+}
+//--------------------------------------------------------------------------
+void AliHFAssociatedTrackCuts::PrintAll() const
+{
+       
+       if(fDescription){
+         printf("=================================================");
+         printf("\nAdditional description\n");
+         std::cout << fDescription << std::endl;
+         printf("\n");
+       }
+       printf("\n=================================================");
+       if(fESDTrackCuts){
+         printf("\nCuts for the associated track: \n \n");
+         
+         printf("ITS Refit........................................: %s\n",fESDTrackCuts->GetRequireITSRefit() ? "Yes" : "No");
+         printf("TPC Refit........................................: %s\n",fESDTrackCuts->GetRequireTPCRefit() ? "Yes" : "No");
+         printf("ITS SA...........................................: %s\n",fESDTrackCuts->GetRequireITSStandAlone() ? "Yes" : "No");
+         printf("TPC SA...........................................: %s\n",fESDTrackCuts->GetRequireTPCStandAlone() ? "Yes" : "No");
+         printf("Min number of ITS clusters.......................: %d\n",fESDTrackCuts->GetMinNClustersITS());
+         printf("Min number of TPC clusters.......................: %d\n",fESDTrackCuts->GetMinNClusterTPC());
+         Int_t spd = fESDTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD);
+         if(spd==0) std::cout <<  "SPD..............................................: kOff"  << std::endl;
+         if(spd==1) std::cout <<  "SPD..............................................: kNone"  << std::endl;
+         if(spd==2) std::cout <<  "SPD..............................................: kAny"  << std::endl;
+         if(spd==3) std::cout <<  "SPD..............................................: kFirst"  << std::endl;
+         if(spd==4) std::cout <<  "SPD..............................................: kOnlyFirst"  << std::endl;
+         if(spd==5) std::cout <<  "SPD..............................................: kSecond"  << std::endl;
+         if(spd==6) std::cout <<  "SPD..............................................: kOnlySecond"  << std::endl;
+         if(spd==7) std::cout <<  "SPD..............................................: kBoth"  << std::endl;
+       }
+       else printf("\nNo Cuts for Associated Tracks\n");
+       std::cout <<  "Filter Bit.......................................: " << fBit  << std::endl;
+       std::cout <<  "Charge...........................................: " << fCharge  << std::endl;
+       
+       if(fAODTrackCuts){
+         for(Int_t j=0;j<fNTrackCuts;j++){
+           std::cout << fTrackCutsNames[j] << fAODTrackCuts[j] << std::endl;
+         }
+       }
+
+       if(fAODvZeroCuts){
+         printf("\n");
+         printf("=================================================");
+         printf("\nCuts for the K0 candidates: \n \n");
+         for(Int_t k=0;k<fNvZeroCuts;k++){
+           std::cout << fvZeroCutsNames[k] <<  fAODvZeroCuts[k] << std::endl;
+         }
+       }
+       else printf("\nNo Cuts for the K0 candidates\n");
+       std::cout << " " << std::endl;
+       PrintPoolParameters();
+       PrintSelectedMCevents();
+
+}
+
+//--------------------------------------------------------------------------
+void AliHFAssociatedTrackCuts::PrintPoolParameters() const
+{   
+       printf("=================================================");
+       printf("\nEvent Pool settings: \n \n");
+       
+       printf("Number of zVtx Bins: %d\n", fNzVtxBins);
+       printf("\nzVtx Bins:\n");
+       //Double_t zVtxbinLims[fNzVtxBins+1] = fNzVtxBins;
+       for(Int_t k=0; k<fNzVtxBins; k++){
+               printf("Bin %d..............................................: %.1f - %.1f cm\n", k, fZvtxBins[k], fZvtxBins[k+1]);      
+       }
+       printf("\n");
+       printf("\nNumber of Centrality(multiplicity) Bins: %d\n", fNCentBins);
+       printf("\nCentrality(multiplicity) Bins:\n");
+       for(Int_t k=0; k<fNCentBins; k++){
+               printf("Bin %d..............................................: %.1f - %.1f\n", k, fCentBins[k], fCentBins[k+1]);
+       }
+
+       
+       
+}
+//--------------------------------------------------------------------------
+
+Double_t AliHFAssociatedTrackCuts::GetTrackWeight(Double_t pt, Double_t eta,Double_t zvtx){
+  if(!fEffWeights)return 1.;
+  
+  Int_t bin=fEffWeights->FindBin(pt,eta,zvtx);
+  if(fEffWeights->IsBinUnderflow(bin)||fEffWeights->IsBinOverflow(bin))return 1.;
+  return fEffWeights->GetBinContent(bin);
+
+}
+
+
+//--------------------------------------------------------------------------
+Double_t AliHFAssociatedTrackCuts::GetTrigWeight(Double_t pt, Double_t mult){
+    
+    
+    
+    if(fTrigEffWeightsvspt){
+       Int_t bin=fTrigEffWeightsvspt->FindBin(pt);
+        if(fTrigEffWeightsvspt->IsBinUnderflow(bin)||fTrigEffWeightsvspt->IsBinOverflow(bin))return 1.;
+        return fTrigEffWeightsvspt->GetBinContent(bin);
+        
+    }
+    
+    if(fTrigEffWeights){
+        Int_t bin=fTrigEffWeights->FindBin(pt,mult);
+        if(fTrigEffWeights->IsBinUnderflow(bin)||fTrigEffWeights->IsBinOverflow(bin))return 1.;
+        return fTrigEffWeights->GetBinContent(bin);
+        
+    }
+    
+    //if(!fTrigEffWeights && !fTrigEffWeightsvspt)return 1.;
+    
+    return 1.;
+    
+}
+
+//--------------------------------------------------------------------------
+Double_t AliHFAssociatedTrackCuts::GetTrigWeightB(Double_t pt, Double_t mult){
+    
+    if(fTrigEffWeightsvsptB){
+        Int_t bin=fTrigEffWeightsvsptB->FindBin(pt);
+        if(fTrigEffWeightsvsptB->IsBinUnderflow(bin)||fTrigEffWeightsvsptB->IsBinOverflow(bin))return 1.;
+        return fTrigEffWeightsvsptB->GetBinContent(bin);
+        
+    }
+    
+    if(fTrigEffWeightsB){
+        Int_t bin=fTrigEffWeightsB->FindBin(pt,mult);
+        if(fTrigEffWeightsB->IsBinUnderflow(bin)||fTrigEffWeightsB->IsBinOverflow(bin))return 1.;
+        return fTrigEffWeightsB->GetBinContent(bin);
+        
+    }
+    
+ //   if(!fTrigEffWeightsB && !fTrigEffWeightsvsptB)return 1.;
+    return 1;
+}
+//--------------------------------------------------------------------------
+void AliHFAssociatedTrackCuts::PrintSelectedMCevents() const
+{
+       printf("\n=================================================");
+       
+       printf("\nSelected MC events: \n \n");
+       printf("Number of selected events: %d\n",fNofMCEventType);
+       
+       for(Int_t k=0; k<fNofMCEventType; k++){
+       if(fMCEventType[k]==28) printf("=> Flavour excitation \n");     
+       if(fMCEventType[k]==53) printf("=> Pair creation \n");  
+       if(fMCEventType[k]==68) printf("=> Gluon splitting \n");        
+       }
+       
+       printf("\n");
+       for(Int_t k=0; k<fNofMCEventType; k++){
+               printf("MC process code %d \n",fMCEventType[k]);                
+       }
+       
+       printf("\n");
+       
+       
+               
+       
+}
+
+