/************************************************************************** * 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. * **************************************************************************/ ///////////////////////////////////////////////////////////// // // Base class for cuts on AOD reconstructed heavy-flavour decay // // Author: A.Dainese, andrea.dainese@pd.infn.it ///////////////////////////////////////////////////////////// #include #include "AliVEvent.h" #include "AliESDEvent.h" #include "AliAODEvent.h" #include "AliVVertex.h" #include "AliESDVertex.h" #include "AliLog.h" #include "AliAODVertex.h" #include "AliESDtrack.h" #include "AliAODTrack.h" #include "AliESDtrackCuts.h" #include "AliCentrality.h" #include "AliAODRecoDecayHF.h" #include "AliAnalysisVertexingHF.h" #include "AliRDHFCuts.h" ClassImp(AliRDHFCuts) //-------------------------------------------------------------------------- AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title), fMinVtxType(3), fMinVtxContr(1), fMaxVtxRedChi2(1e6), fMaxVtxZ(1e6), fMinSPDMultiplicity(0), fTriggerMask(0), fTrackCuts(0), fnPtBins(1), fnPtBinLimits(1), fPtBinLimits(0), fnVars(1), fVarNames(0), fnVarsForOpt(0), fVarsForOpt(0), fGlobalIndex(1), fCutsRD(0), fIsUpperCut(0), fUsePID(kFALSE), fPidHF(0), fWhyRejection(0), fRemoveDaughtersFromPrimary(kFALSE), fOptPileup(0), fMinContrPileup(3), fMinDzPileup(0.6), fUseCentrality(0), fMinCentrality(0.), fMaxCentrality(100.), fFixRefs(kFALSE) { // // Default Constructor // } //-------------------------------------------------------------------------- AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) : AliAnalysisCuts(source), fMinVtxType(source.fMinVtxType), fMinVtxContr(source.fMinVtxContr), fMaxVtxRedChi2(source.fMaxVtxRedChi2), fMaxVtxZ(source.fMaxVtxZ), fMinSPDMultiplicity(source.fMinSPDMultiplicity), fTriggerMask(source.fTriggerMask), fTrackCuts(0), fnPtBins(source.fnPtBins), fnPtBinLimits(source.fnPtBinLimits), fPtBinLimits(0), fnVars(source.fnVars), fVarNames(0), fnVarsForOpt(source.fnVarsForOpt), fVarsForOpt(0), fGlobalIndex(source.fGlobalIndex), fCutsRD(0), fIsUpperCut(0), fUsePID(source.fUsePID), fPidHF(0), fWhyRejection(source.fWhyRejection), fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary), fOptPileup(source.fOptPileup), fMinContrPileup(source.fMinContrPileup), fMinDzPileup(source.fMinDzPileup), fUseCentrality(source.fUseCentrality), fMinCentrality(source.fMinCentrality), fMaxCentrality(source.fMaxCentrality), fFixRefs(source.fFixRefs) { // // Copy constructor // cout<<"Copy constructor"<GetTriggerMask()!=fTriggerMask) return kFALSE; // TEMPORARY FIX FOR REFERENCES // Fix references to daughter tracks if(fFixRefs) { AliAnalysisVertexingHF *fixer = new AliAnalysisVertexingHF(); fixer->FixReferences((AliAODEvent*)event); delete fixer; } // fWhyRejection=0; // multiplicity cuts no implemented yet const AliVVertex *vertex = event->GetPrimaryVertex(); if(!vertex) return kFALSE; TString title=vertex->GetTitle(); if(title.Contains("Z") && fMinVtxType>1) return kFALSE; if(title.Contains("3D") && fMinVtxType>2) return kFALSE; if(vertex->GetNContributors()GetZ())>fMaxVtxZ) return kFALSE; // switch to settings for 1-pad cls in TPC if(fPidHF) { if(event->GetRunNumber()>121693 && event->GetRunNumber()<136851) fPidHF->SetOnePad(kTRUE); if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517) fPidHF->SetPbPb(kTRUE); } if(fOptPileup==kRejectPileupEvent){ Int_t cutc=(Int_t)fMinContrPileup; Double_t cutz=(Double_t)fMinDzPileup; if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) { fWhyRejection=1; return kFALSE; } } //centrality selection if (!(fUseCentrality==kCentOff)){ if(fUseCentrality=kCentInvalid){ AliWarning("Centrality estimator not valid"); fWhyRejection=3; return kFALSE; }else{ Float_t centvalue=GetCentrality((AliAODEvent*)event); if (centvalue<0.){ if (fWhyRejection==3) return kFALSE; else return kTRUE; } else{ if (centvaluefMaxCentrality){ fWhyRejection=2; return kFALSE; } } } } return kTRUE; } //--------------------------------------------------------------------------- Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const { // // Daughter tracks selection // if(!fTrackCuts) return kTRUE; Int_t ndaughters = d->GetNDaughters(); AliAODVertex *vAOD = d->GetPrimaryVtx(); Double_t pos[3],cov[6]; vAOD->GetXYZ(pos); vAOD->GetCovarianceMatrix(cov); const AliESDVertex vESD(pos,cov,100.,100); Bool_t retval=kTRUE; for(Int_t idg=0; idgGetDaughter(idg); if(!dgTrack) {retval = kFALSE; continue;} //printf("charge %d\n",dgTrack->Charge()); if(dgTrack->Charge()==0) continue; // it's not a track, but a V0 if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE; } return retval; } //--------------------------------------------------------------------------- Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const { // // Convert to ESDtrack, relate to vertex and check cuts // if(!cuts) return kTRUE; Bool_t retval=kTRUE; // convert to ESD track here AliESDtrack esdTrack(track); // needed to calculate the impact parameters esdTrack.RelateToVertex(primary,0.,3.); if(!cuts->IsSelected(&esdTrack)) retval = kFALSE; if(fOptPileup==kRejectTracksFromPileupVertex){ // to be implemented // we need either to have here the AOD Event, // or to have the pileup vertex object } return retval; } //--------------------------------------------------------------------------- void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) { // Set the pt bins if(fPtBinLimits) { delete [] fPtBinLimits; fPtBinLimits = NULL; printf("Changing the pt bins\n"); } if(nPtBinLimits != fnPtBins+1){ cout<<"Warning: ptBinLimits dimention "< "<=kCentInvalid) AliWarning("Centrality estimator not valid"); return; } //--------------------------------------------------------------------------- void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) { // // store the cuts // if(nVars!=fnVars) { printf("Wrong number of variables: it has to be %d\n",fnVars); return; } if(nPtBins!=fnPtBins) { printf("Wrong number of pt bins: it has to be %d\n",fnPtBins); return; } if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex]; for(Int_t iv=0; iv=fGlobalIndex) { cout<<"Overflow, exit..."< 0) ? "Yes" : "No"); if(fOptPileup==1) printf(" -- Reject pileup event"); if(fOptPileup==2) printf(" -- Reject tracks from pileup vtx"); if(fUseCentrality>0) { TString estimator=""; if(fUseCentrality==1) estimator = "V0"; if(fUseCentrality==2) estimator = "Tracks"; if(fUseCentrality==3) estimator = "Tracklets"; if(fUseCentrality==4) estimator = "SPD clusters outer"; printf("Centrality class considered: %.1f-%.1f, estimated with %s",fMinCentrality,fMaxCentrality,estimator.Data()); } if(fVarNames){ cout<<"Array of variables"<GetHeader(); AliCentrality *centrality=header->GetCentralityP(); Float_t cent=-999.; if(!centrality) return cent; else{ if (estimator==kCentV0M) cent=(Float_t)(centrality->GetCentralityPercentile("V0M")); else { if (estimator==kCentTRK) cent=(Float_t)(centrality->GetCentralityPercentile("TRK")); else{ if (estimator==kCentTKL) cent=(Float_t)(centrality->GetCentralityPercentile("TKL")); else{ if (estimator==kCentCL1) cent=(Float_t)(centrality->GetCentralityPercentile("CL1")); else { AliWarning("Centrality estimator not valid"); } } } } } return cent; } //------------------------------------------------------------------- Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const { // // Compare two cuts objects // Bool_t areEqual=kTRUE; if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;} if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;} if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) { printf("Max vtx red chi2 %f %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;} if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) { printf("Min SPD mult %d\n %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;} if(fUsePID!=obj->fUsePID) { printf("Use PID %d %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;} if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;} if(fTrackCuts){ if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;} if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;} if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;} if(fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)!=obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)) {printf("ClusterReq SPD %d %d\n",fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD),obj->fTrackCuts->GetClusterRequirementITS(AliESDtrackCuts::kSPD)); areEqual=kFALSE;} } if(fCutsRD) { for(Int_t iv=0;ivfCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) { cout<<"fCutsRD["<fCutsRD[GetGlobalIndex(iv,ib)]<<"\n"; areEqual=kFALSE; } } } } return areEqual; } //--------------------------------------------------------------------------- void AliRDHFCuts::MakeTable() const { // // print cuts values in table format // TString ptString = "pT range"; if(fVarNames && fPtBinLimits && fCutsRD){ TString firstLine(Form("* %-15s",ptString.Data())); for (Int_t ivar=0; ivarGetOwnPrimaryVtx()) origownvtx=new AliAODVertex(*d->GetOwnPrimaryVtx()); recvtx=d->RemoveDaughtersFromPrimaryVtx(aod); if(!recvtx){ AliDebug(2,"Removal of daughter tracks failed"); if(origownvtx){ delete origownvtx; origownvtx=NULL; } return kFALSE; } //set recalculed primary vertex d->SetOwnPrimaryVtx(recvtx); delete recvtx; recvtx=NULL; return kTRUE; } //-------------------------------------------------------------------------- void AliRDHFCuts::CleanOwnPrimaryVtx(AliAODRecoDecayHF *d,AliAODVertex *origownvtx) const { // // Clean-up own primary vertex if needed // if(origownvtx) { d->SetOwnPrimaryVtx(origownvtx); delete origownvtx; origownvtx=NULL; } else if(fRemoveDaughtersFromPrimary) { d->UnsetOwnPrimaryVtx(); AliDebug(3,"delete new vertex\n"); } return; }