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