1 /**************************************************************************
2 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 /////////////////////////////////////////////////////////////
20 // Base class for cuts on AOD reconstructed heavy-flavour decay
22 // Author: A.Dainese, andrea.dainese@pd.infn.it
23 /////////////////////////////////////////////////////////////
24 #include <Riostream.h>
26 #include "AliVEvent.h"
27 #include "AliESDEvent.h"
28 #include "AliAODEvent.h"
29 #include "AliVVertex.h"
30 #include "AliESDVertex.h"
32 #include "AliAODVertex.h"
33 #include "AliESDtrack.h"
34 #include "AliAODTrack.h"
35 #include "AliESDtrackCuts.h"
36 #include "AliCentrality.h"
37 #include "AliAODRecoDecayHF.h"
38 #include "AliAnalysisVertexingHF.h"
39 #include "AliAODMCHeader.h"
40 #include "AliAODMCParticle.h"
41 #include "AliRDHFCuts.h"
42 #include "AliAnalysisManager.h"
43 #include "AliInputEventHandler.h"
44 #include "AliPIDResponse.h"
48 //--------------------------------------------------------------------------
49 AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) :
50 AliAnalysisCuts(name,title),
55 fMinSPDMultiplicity(0),
57 fTriggerClass("CINT1"),
73 fRemoveDaughtersFromPrimary(kFALSE),
88 // Default Constructor
91 //--------------------------------------------------------------------------
92 AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
93 AliAnalysisCuts(source),
94 fMinVtxType(source.fMinVtxType),
95 fMinVtxContr(source.fMinVtxContr),
96 fMaxVtxRedChi2(source.fMaxVtxRedChi2),
97 fMaxVtxZ(source.fMaxVtxZ),
98 fMinSPDMultiplicity(source.fMinSPDMultiplicity),
99 fTriggerMask(source.fTriggerMask),
100 fTriggerClass(source.fTriggerClass),
102 fnPtBins(source.fnPtBins),
103 fnPtBinLimits(source.fnPtBinLimits),
105 fnVars(source.fnVars),
107 fnVarsForOpt(source.fnVarsForOpt),
109 fGlobalIndex(source.fGlobalIndex),
112 fUsePID(source.fUsePID),
113 fUseAOD049(source.fUseAOD049),
115 fWhyRejection(source.fWhyRejection),
116 fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
117 fUseMCVertex(source.fUseMCVertex),
118 fOptPileup(source.fOptPileup),
119 fMinContrPileup(source.fMinContrPileup),
120 fMinDzPileup(source.fMinDzPileup),
121 fUseCentrality(source.fUseCentrality),
122 fMinCentrality(source.fMinCentrality),
123 fMaxCentrality(source.fMaxCentrality),
124 fFixRefs(source.fFixRefs),
125 fIsSelectedCuts(source.fIsSelectedCuts),
126 fIsSelectedPID(source.fIsSelectedPID),
127 fMinPtCand(source.fMinPtCand),
128 fMaxPtCand(source.fMaxPtCand)
133 cout<<"Copy constructor"<<endl;
134 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
135 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
136 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
137 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
138 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
139 if(source.fPidHF) SetPidHF(source.fPidHF);
143 //--------------------------------------------------------------------------
144 AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
147 // assignment operator
149 if(&source == this) return *this;
151 AliAnalysisCuts::operator=(source);
153 fMinVtxType=source.fMinVtxType;
154 fMinVtxContr=source.fMinVtxContr;
155 fMaxVtxRedChi2=source.fMaxVtxRedChi2;
156 fMaxVtxZ=source.fMaxVtxZ;
157 fMinSPDMultiplicity=source.fMinSPDMultiplicity;
158 fTriggerMask=source.fTriggerMask;
159 fTriggerClass=source.fTriggerClass;
160 fnPtBins=source.fnPtBins;
161 fnVars=source.fnVars;
162 fGlobalIndex=source.fGlobalIndex;
163 fnVarsForOpt=source.fnVarsForOpt;
164 fUsePID=source.fUsePID;
165 fUseAOD049=source.fUseAOD049;
166 SetPidHF(source.GetPidHF());
167 fWhyRejection=source.fWhyRejection;
168 fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
169 fUseMCVertex=source.fUseMCVertex;
170 fOptPileup=source.fOptPileup;
171 fMinContrPileup=source.fMinContrPileup;
172 fMinDzPileup=source.fMinDzPileup;
173 fUseCentrality=source.fUseCentrality;
174 fMinCentrality=source.fMinCentrality;
175 fMaxCentrality=source.fMaxCentrality;
176 fFixRefs=source.fFixRefs;
177 fIsSelectedCuts=source.fIsSelectedCuts;
178 fIsSelectedPID=source.fIsSelectedPID;
179 fMinPtCand=source.fMinPtCand;
180 fMaxPtCand=source.fMaxPtCand;
182 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
183 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
184 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
185 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
186 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
191 //--------------------------------------------------------------------------
192 AliRDHFCuts::~AliRDHFCuts() {
194 // Default Destructor
196 if(fPtBinLimits) {delete [] fPtBinLimits; fPtBinLimits=0;}
197 if(fVarNames) {delete [] fVarNames; fVarNames=0;}
198 if(fVarsForOpt) {delete [] fVarsForOpt; fVarsForOpt=0;}
203 if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
209 //---------------------------------------------------------------------------
210 Int_t AliRDHFCuts::IsEventSelectedInCentrality(AliVEvent *event) {
212 // Centrality selection
215 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid){
216 AliWarning("Centrality estimator not valid");
219 Float_t centvalue=GetCentrality((AliAODEvent*)event);
220 if (centvalue<-998.){//-999 if no centralityP
223 if (centvalue<fMinCentrality || centvalue>fMaxCentrality){
230 //---------------------------------------------------------------------------
231 Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
235 //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
241 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)event)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
242 if(mcArray) {isMC=kTRUE;fUseAOD049=kFALSE;}
244 // settings for the TPC dE/dx BB parameterization
245 if(fPidHF && fPidHF->GetOldPid()) {
246 // pp, from LHC10d onwards
247 if((event->GetRunNumber()>121693 && event->GetRunNumber()<136851) ||
248 event->GetRunNumber()>139517) fPidHF->SetOnePad(kTRUE);
250 if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517) fPidHF->SetPbPb(kTRUE);
252 if(isMC) fPidHF->SetMC(kTRUE);
253 if(isMC && (event->GetRunNumber()>=146686 && event->GetRunNumber()<=146860))
254 fPidHF->SetMClowenpp2011(kTRUE);
256 else if(fPidHF && !fPidHF->GetOldPid()) {
257 if(fPidHF->GetPidResponse()==0x0){
258 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
259 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
260 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
261 fPidHF->SetPidResponse(pidResp);
267 TString firedTriggerClasses=((AliAODEvent*)event)->GetFiredTriggerClasses();
268 // don't do for MC and for PbPb 2010 data
269 if(!isMC && (event->GetRunNumber()<136851 || event->GetRunNumber()>139517)) {
270 if(!firedTriggerClasses.Contains(fTriggerClass.Data())) {
276 // TEMPORARY FIX FOR REFERENCES
277 // Fix references to daughter tracks
279 // AliAnalysisVertexingHF *fixer = new AliAnalysisVertexingHF();
280 // fixer->FixReferences((AliAODEvent*)event);
287 // vertex requirements
289 const AliVVertex *vertex = event->GetPrimaryVertex();
291 if(!vertex) return kFALSE;
293 TString title=vertex->GetTitle();
294 if(title.Contains("Z") && fMinVtxType>1) return kFALSE;
295 if(title.Contains("3D") && fMinVtxType>2) return kFALSE;
297 if(vertex->GetNContributors()<fMinVtxContr) return kFALSE;
299 if(TMath::Abs(vertex->GetZ())>fMaxVtxZ) {
306 if(fOptPileup==kRejectPileupEvent){
307 Int_t cutc=(Int_t)fMinContrPileup;
308 Double_t cutz=(Double_t)fMinDzPileup;
309 if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
315 // centrality selection
316 if (fUseCentrality!=kCentOff) {
317 Int_t rejection=IsEventSelectedInCentrality(event);
319 fWhyRejection=rejection;
326 //---------------------------------------------------------------------------
327 Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
329 // Daughter tracks selection
331 if(!fTrackCuts) return kTRUE;
333 Int_t ndaughters = d->GetNDaughters();
334 AliAODVertex *vAOD = d->GetPrimaryVtx();
335 Double_t pos[3],cov[6];
337 vAOD->GetCovarianceMatrix(cov);
338 const AliESDVertex vESD(pos,cov,100.,100);
342 for(Int_t idg=0; idg<ndaughters; idg++) {
343 AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);
344 if(!dgTrack) {retval = kFALSE; continue;}
345 //printf("charge %d\n",dgTrack->Charge());
346 if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
348 if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
353 //---------------------------------------------------------------------------
354 Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
356 // Convert to ESDtrack, relate to vertex and check cuts
358 if(!cuts) return kTRUE;
362 // convert to ESD track here
363 AliESDtrack esdTrack(track);
364 // set the TPC cluster info
365 esdTrack.SetTPCClusterMap(track->GetTPCClusterMap());
366 esdTrack.SetTPCSharedMap(track->GetTPCSharedMap());
367 esdTrack.SetTPCPointsF(track->GetTPCNclsF());
368 // needed to calculate the impact parameters
369 esdTrack.RelateToVertex(primary,0.,3.);
371 if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
373 if(fOptPileup==kRejectTracksFromPileupVertex){
375 // we need either to have here the AOD Event,
376 // or to have the pileup vertex object
380 //---------------------------------------------------------------------------
381 void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
385 delete [] fPtBinLimits;
387 printf("Changing the pt bins\n");
390 if(nPtBinLimits != fnPtBins+1){
391 cout<<"Warning: ptBinLimits dimention "<<nPtBinLimits<<" != nPtBins+1 ("<<fnPtBins+1<<")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;
392 SetNPtBins(nPtBinLimits-1);
395 fnPtBinLimits = nPtBinLimits;
397 //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
398 fPtBinLimits = new Float_t[fnPtBinLimits];
399 for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
403 //---------------------------------------------------------------------------
404 void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){
405 // Set the variable names
410 //printf("Changing the variable names\n");
413 printf("Wrong number of variables: it has to be %d\n",fnVars);
417 fVarNames = new TString[nVars];
418 fIsUpperCut = new Bool_t[nVars];
419 for(Int_t iv=0; iv<nVars; iv++) {
420 fVarNames[iv] = varNames[iv];
421 fIsUpperCut[iv] = isUpperCut[iv];
426 //---------------------------------------------------------------------------
427 void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {
428 // Set the variables to be used for cuts optimization
431 delete [] fVarsForOpt;
433 //printf("Changing the variables for cut optimization\n");
436 if(nVars==0){//!=fnVars) {
437 printf("%d not accepted as number of variables: it has to be %d\n",nVars,fnVars);
442 fVarsForOpt = new Bool_t[fnVars];
443 for(Int_t iv=0; iv<fnVars; iv++) {
444 fVarsForOpt[iv]=forOpt[iv];
445 if(fVarsForOpt[iv]) fnVarsForOpt++;
451 //---------------------------------------------------------------------------
452 void AliRDHFCuts::SetUseCentrality(Int_t flag) {
454 // set centrality estimator
457 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid) AliWarning("Centrality estimator not valid");
463 //---------------------------------------------------------------------------
464 void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) {
469 printf("Wrong number of variables: it has to be %d\n",fnVars);
472 if(nPtBins!=fnPtBins) {
473 printf("Wrong number of pt bins: it has to be %d\n",fnPtBins);
477 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
480 for(Int_t iv=0; iv<fnVars; iv++) {
482 for(Int_t ib=0; ib<fnPtBins; ib++) {
485 if(GetGlobalIndex(iv,ib)>=fGlobalIndex) {
486 cout<<"Overflow, exit..."<<endl;
490 fCutsRD[GetGlobalIndex(iv,ib)] = cutsRD[iv][ib];
496 //---------------------------------------------------------------------------
497 void AliRDHFCuts::SetCuts(Int_t glIndex,Float_t* cutsRDGlob){
501 if(glIndex != fGlobalIndex){
502 cout<<"Wrong array size: it has to be "<<fGlobalIndex<<endl;
505 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
507 for(Int_t iGl=0;iGl<fGlobalIndex;iGl++){
508 fCutsRD[iGl] = cutsRDGlob[iGl];
512 //---------------------------------------------------------------------------
513 void AliRDHFCuts::PrintAll() const {
515 // print all cuts values
518 printf("Minimum vtx type %d\n",fMinVtxType);
519 printf("Minimum vtx contr %d\n",fMinVtxContr);
520 printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
521 printf("Min SPD mult %d\n",fMinSPDMultiplicity);
522 printf("Use PID %d\n",(Int_t)fUsePID);
523 printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
524 printf("Pileup rejection: %s\n",(fOptPileup > 0) ? "Yes" : "No");
525 if(fOptPileup==1) printf(" -- Reject pileup event");
526 if(fOptPileup==2) printf(" -- Reject tracks from pileup vtx");
527 if(fUseCentrality>0) {
528 TString estimator="";
529 if(fUseCentrality==1) estimator = "V0";
530 if(fUseCentrality==2) estimator = "Tracks";
531 if(fUseCentrality==3) estimator = "Tracklets";
532 if(fUseCentrality==4) estimator = "SPD clusters outer";
533 printf("Centrality class considered: %.1f-%.1f, estimated with %s",fMinCentrality,fMaxCentrality,estimator.Data());
537 cout<<"Array of variables"<<endl;
538 for(Int_t iv=0;iv<fnVars;iv++){
539 cout<<fVarNames[iv]<<"\t";
544 cout<<"Array of optimization"<<endl;
545 for(Int_t iv=0;iv<fnVars;iv++){
546 cout<<fVarsForOpt[iv]<<"\t";
551 cout<<"Array of upper/lower cut"<<endl;
552 for(Int_t iv=0;iv<fnVars;iv++){
553 cout<<fIsUpperCut[iv]<<"\t";
558 cout<<"Array of ptbin limits"<<endl;
559 for(Int_t ib=0;ib<fnPtBinLimits;ib++){
560 cout<<fPtBinLimits[ib]<<"\t";
565 cout<<"Matrix of cuts"<<endl;
566 for(Int_t iv=0;iv<fnVars;iv++){
567 for(Int_t ib=0;ib<fnPtBins;ib++){
568 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";
576 //---------------------------------------------------------------------------
577 void AliRDHFCuts::GetCuts(Float_t**& cutsRD) const{
582 //cout<<"Give back a "<<fnVars<<"x"<<fnPtBins<<" matrix."<<endl;
587 //cout<<"Initialization..."<<endl;
588 cutsRD=new Float_t*[fnVars];
589 for(iv=0; iv<fnVars; iv++) {
590 cutsRD[iv] = new Float_t[fnPtBins];
594 for(Int_t iGlobal=0; iGlobal<fGlobalIndex; iGlobal++) {
595 GetVarPtIndex(iGlobal,iv,ib);
596 cutsRD[iv][ib] = fCutsRD[iGlobal];
602 //---------------------------------------------------------------------------
603 Int_t AliRDHFCuts::GetGlobalIndex(Int_t iVar,Int_t iPtBin) const{
605 // give the global index from variable and pt bin
607 return iPtBin*fnVars+iVar;
610 //---------------------------------------------------------------------------
611 void AliRDHFCuts::GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const {
613 //give the index of the variable and of the pt bin from the global index
615 iPtBin=(Int_t)iGlob/fnVars;
621 //---------------------------------------------------------------------------
622 Int_t AliRDHFCuts::PtBin(Double_t pt) const {
624 //give the pt bin where the pt lies.
627 if(pt<fPtBinLimits[0])return ptbin;
628 for (Int_t i=0;i<fnPtBins;i++){
629 if(pt<fPtBinLimits[i+1]) {
636 //-------------------------------------------------------------------
637 Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {
639 // Give the value of cut set for the variable iVar and the pt bin iPtBin
642 cout<<"Cuts not iniziaisez yet"<<endl;
645 return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
647 //-------------------------------------------------------------------
648 Float_t AliRDHFCuts::GetCentrality(AliAODEvent* aodEvent,AliRDHFCuts::ECentrality estimator) {
650 // Get centrality percentile
653 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)aodEvent)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
654 if(mcArray) {fUseAOD049=kFALSE;}
656 AliAODHeader *header=aodEvent->GetHeader();
657 AliCentrality *centrality=header->GetCentralityP();
659 Bool_t isSelRun=kFALSE;
660 Int_t selRun[5]={138364, 138826, 138828, 138836, 138871};
661 if(!centrality) return cent;
663 if (estimator==kCentV0M){
664 cent=(Float_t)(centrality->GetCentralityPercentile("V0M"));
666 Int_t quality = centrality->GetQuality();
668 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("V0M");
670 Int_t runnum=aodEvent->GetRunNumber();
671 for(Int_t ir=0;ir<5;ir++){
672 if(runnum==selRun[ir]){
677 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("V0M");
681 //temporary fix for AOD049 outliers
682 if(fUseAOD049&¢>=0){
684 AliAODVZERO* aodV0 = aodEvent->GetVZEROData();
685 v0+=aodV0->GetMTotV0A();
686 v0+=aodV0->GetMTotV0C();
687 if(cent==0&&v0<19500)return -1;//filtering issue
688 Float_t tkl = (Float_t)(aodEvent->GetTracklets()->GetNumberOfTracklets());
689 Float_t val= 1.30552 + 0.147931 * v0;
690 Float_t tklSigma[101]={176.644, 156.401, 153.789, 153.015, 142.476, 137.951, 136.127, 129.852, 127.436, 124.86, 120.788, 115.611, 113.172, 110.496, 109.127, 104.421, 102.479, 99.9766, 97.5152, 94.0654, 92.4602, 89.3364, 87.1342, 83.3497, 82.6216, 81.1084, 78.0793, 76.1234, 72.9434, 72.1334, 68.0056, 68.2755, 66.0376, 62.9666, 62.4274, 59.65, 58.3776, 56.6361, 54.5184, 53.4224, 51.932, 50.8922, 48.2848, 47.912, 46.5717, 43.4114, 43.2083, 41.3065, 40.1863, 38.5255, 37.2851, 37.5396, 34.4949, 33.8366, 31.8043, 31.7412, 30.8392, 30.0274, 28.8793, 27.6398, 26.6488, 25.0183, 25.1489, 24.4185, 22.9107, 21.2002, 21.6977, 20.1242, 20.4963, 19.0235, 19.298, 17.4103, 16.868, 15.2939, 15.2939, 16.0295, 14.186, 14.186, 15.2173, 12.9504, 12.9504, 12.9504, 15.264, 12.3674, 12.3674, 12.3674, 12.3674, 12.3674, 18.3811, 13.7544, 13.7544, 13.7544, 13.7544, 13.7544, 13.7544, 13.7544, 13.7544, 13.7544, 13.7544, 13.7544, 13.7544};
691 if ( TMath::Abs(tkl-val) > 6.*tklSigma[(Int_t)cent] )return -1;//outlier
695 if (estimator==kCentTRK) {
696 cent=(Float_t)(centrality->GetCentralityPercentile("TRK"));
698 Int_t quality = centrality->GetQuality();
700 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TRK");
702 Int_t runnum=aodEvent->GetRunNumber();
703 for(Int_t ir=0;ir<5;ir++){
704 if(runnum==selRun[ir]){
709 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TRK");
714 if (estimator==kCentTKL){
715 cent=(Float_t)(centrality->GetCentralityPercentile("TKL"));
717 Int_t quality = centrality->GetQuality();
719 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TKL");
721 Int_t runnum=aodEvent->GetRunNumber();
722 for(Int_t ir=0;ir<5;ir++){
723 if(runnum==selRun[ir]){
728 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TKL");
733 if (estimator==kCentCL1){
734 cent=(Float_t)(centrality->GetCentralityPercentile("CL1"));
736 Int_t quality = centrality->GetQuality();
738 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("CL1");
740 Int_t runnum=aodEvent->GetRunNumber();
741 for(Int_t ir=0;ir<5;ir++){
742 if(runnum==selRun[ir]){
747 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("CL1");
752 AliWarning("Centrality estimator not valid");
761 //-------------------------------------------------------------------
762 Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
764 // Compare two cuts objects
767 Bool_t areEqual=kTRUE;
769 if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
771 if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
773 if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) { printf("Max vtx red chi2 %f %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
775 if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) { printf("Min SPD mult %d\n %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
777 if(fUsePID!=obj->fUsePID) { printf("Use PID %d %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
779 if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
781 if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
783 if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
785 if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
787 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;}
791 for(Int_t iv=0;iv<fnVars;iv++) {
792 for(Int_t ib=0;ib<fnPtBins;ib++) {
793 if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
794 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<" "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
803 //---------------------------------------------------------------------------
804 void AliRDHFCuts::MakeTable() const {
806 // print cuts values in table format
809 TString ptString = "pT range";
810 if(fVarNames && fPtBinLimits && fCutsRD){
811 TString firstLine(Form("* %-15s",ptString.Data()));
812 for (Int_t ivar=0; ivar<fnVars; ivar++){
813 firstLine+=Form("* %-15s ",fVarNames[ivar].Data());
818 Printf("%s",firstLine.Data());
820 for (Int_t ipt=0; ipt<fnPtBins; ipt++){
822 if (ipt==fnPtBins-1){
823 line=Form("* %5.1f < pt < inf ",fPtBinLimits[ipt]);
826 line=Form("* %5.1f < pt < %4.1f ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);
828 for (Int_t ivar=0; ivar<fnVars; ivar++){
829 line+=Form("* %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);
831 Printf("%s",line.Data());
839 //--------------------------------------------------------------------------
840 Bool_t AliRDHFCuts::RecalcOwnPrimaryVtx(AliAODRecoDecayHF *d,
841 AliAODEvent *aod) const
844 // Recalculate primary vertex without daughters
848 AliError("Can not remove daughters from vertex without AOD event");
852 AliAODVertex *recvtx=d->RemoveDaughtersFromPrimaryVtx(aod);
854 AliDebug(2,"Removal of daughter tracks failed");
859 //set recalculed primary vertex
860 d->SetOwnPrimaryVtx(recvtx);
865 //--------------------------------------------------------------------------
866 Bool_t AliRDHFCuts::SetMCPrimaryVtx(AliAODRecoDecayHF *d,AliAODEvent *aod) const
869 // Recalculate primary vertex without daughters
873 AliError("Can not get MC vertex without AOD event");
878 AliAODMCHeader *mcHeader =
879 (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
881 AliError("Can not get MC vertex without AODMCHeader event");
885 Double_t covmatrix[6]={0.,0.,0.,0.,0.,0.};
886 mcHeader->GetVertex(pos);
887 AliAODVertex *recvtx=new AliAODVertex(pos,covmatrix);
890 AliDebug(2,"Removal of daughter tracks failed");
894 //set recalculed primary vertex
895 d->SetOwnPrimaryVtx(recvtx);
897 d->RecalculateImpPars(recvtx,aod);
903 //--------------------------------------------------------------------------
904 void AliRDHFCuts::CleanOwnPrimaryVtx(AliAODRecoDecayHF *d,
906 AliAODVertex *origownvtx) const
909 // Clean-up own primary vertex if needed
912 if(fRemoveDaughtersFromPrimary || fUseMCVertex) {
913 d->UnsetOwnPrimaryVtx();
915 d->SetOwnPrimaryVtx(origownvtx);
916 delete origownvtx; origownvtx=NULL;
918 d->RecalculateImpPars(d->GetPrimaryVtx(),aod);
921 delete origownvtx; origownvtx=NULL;