-/**************************************************************************\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");
+
+
+
+
+}
+
+