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 "AliVertexerTracks.h"
42 #include "AliRDHFCuts.h"
43 #include "AliAnalysisManager.h"
44 #include "AliInputEventHandler.h"
45 #include "AliPIDResponse.h"
49 //--------------------------------------------------------------------------
50 AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) :
51 AliAnalysisCuts(name,title),
56 fMinSPDMultiplicity(0),
57 fTriggerMask(AliVEvent::kAnyINT),
58 fUseOnlyOneTrigger(kFALSE),
59 fTriggerClass("CINT1"),
76 fRemoveDaughtersFromPrimary(kFALSE),
77 fRecomputePrimVertex(kFALSE),
79 fUsePhysicsSelection(kTRUE),
91 fKeepSignalMC(kFALSE),
92 fIsCandTrackSPDFirst(kFALSE),
93 fMaxPtCandTrackSPDFirst(0.)
96 // Default Constructor
99 //--------------------------------------------------------------------------
100 AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
101 AliAnalysisCuts(source),
102 fMinVtxType(source.fMinVtxType),
103 fMinVtxContr(source.fMinVtxContr),
104 fMaxVtxRedChi2(source.fMaxVtxRedChi2),
105 fMaxVtxZ(source.fMaxVtxZ),
106 fMinSPDMultiplicity(source.fMinSPDMultiplicity),
107 fTriggerMask(source.fTriggerMask),
108 fUseOnlyOneTrigger(source.fUseOnlyOneTrigger),
109 fTriggerClass(source.fTriggerClass),
111 fnPtBins(source.fnPtBins),
112 fnPtBinLimits(source.fnPtBinLimits),
114 fnVars(source.fnVars),
116 fnVarsForOpt(source.fnVarsForOpt),
118 fGlobalIndex(source.fGlobalIndex),
121 fUsePID(source.fUsePID),
122 fUseAOD049(source.fUseAOD049),
124 fWhyRejection(source.fWhyRejection),
125 fEvRejectionBits(source.fEvRejectionBits),
126 fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
127 fRecomputePrimVertex(source.fRecomputePrimVertex),
128 fUseMCVertex(source.fUseMCVertex),
129 fUsePhysicsSelection(source.fUsePhysicsSelection),
130 fOptPileup(source.fOptPileup),
131 fMinContrPileup(source.fMinContrPileup),
132 fMinDzPileup(source.fMinDzPileup),
133 fUseCentrality(source.fUseCentrality),
134 fMinCentrality(source.fMinCentrality),
135 fMaxCentrality(source.fMaxCentrality),
136 fFixRefs(source.fFixRefs),
137 fIsSelectedCuts(source.fIsSelectedCuts),
138 fIsSelectedPID(source.fIsSelectedPID),
139 fMinPtCand(source.fMinPtCand),
140 fMaxPtCand(source.fMaxPtCand),
141 fKeepSignalMC(source.fKeepSignalMC),
142 fIsCandTrackSPDFirst(source.fIsCandTrackSPDFirst),
143 fMaxPtCandTrackSPDFirst(source.fMaxPtCandTrackSPDFirst)
148 cout<<"Copy constructor"<<endl;
149 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
150 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
151 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
152 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
153 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
154 if(source.fPidHF) SetPidHF(source.fPidHF);
158 //--------------------------------------------------------------------------
159 AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
162 // assignment operator
164 if(&source == this) return *this;
166 AliAnalysisCuts::operator=(source);
168 fMinVtxType=source.fMinVtxType;
169 fMinVtxContr=source.fMinVtxContr;
170 fMaxVtxRedChi2=source.fMaxVtxRedChi2;
171 fMaxVtxZ=source.fMaxVtxZ;
172 fMinSPDMultiplicity=source.fMinSPDMultiplicity;
173 fTriggerMask=source.fTriggerMask;
174 fUseOnlyOneTrigger=source.fUseOnlyOneTrigger;
175 fTriggerClass=source.fTriggerClass;
176 fnPtBins=source.fnPtBins;
177 fnPtBinLimits=source.fnPtBinLimits;
178 fnVars=source.fnVars;
179 fGlobalIndex=source.fGlobalIndex;
180 fnVarsForOpt=source.fnVarsForOpt;
181 fUsePID=source.fUsePID;
182 fUseAOD049=source.fUseAOD049;
183 if(fPidHF) delete fPidHF;
184 fPidHF=new AliAODPidHF(*(source.GetPidHF()));
185 fWhyRejection=source.fWhyRejection;
186 fEvRejectionBits=source.fEvRejectionBits;
187 fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
188 fRecomputePrimVertex=source.fRecomputePrimVertex;
189 fUseMCVertex=source.fUseMCVertex;
190 fUsePhysicsSelection=source.fUsePhysicsSelection;
191 fOptPileup=source.fOptPileup;
192 fMinContrPileup=source.fMinContrPileup;
193 fMinDzPileup=source.fMinDzPileup;
194 fUseCentrality=source.fUseCentrality;
195 fMinCentrality=source.fMinCentrality;
196 fMaxCentrality=source.fMaxCentrality;
197 fFixRefs=source.fFixRefs;
198 fIsSelectedCuts=source.fIsSelectedCuts;
199 fIsSelectedPID=source.fIsSelectedPID;
200 fMinPtCand=source.fMinPtCand;
201 fMaxPtCand=source.fMaxPtCand;
202 fKeepSignalMC=source.fKeepSignalMC;
203 fIsCandTrackSPDFirst=source.fIsCandTrackSPDFirst;
204 fMaxPtCandTrackSPDFirst=source.fMaxPtCandTrackSPDFirst;
206 if(source.GetTrackCuts()) {delete fTrackCuts; fTrackCuts=new AliESDtrackCuts(*(source.GetTrackCuts()));}
207 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
208 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
209 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
210 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
215 //--------------------------------------------------------------------------
216 AliRDHFCuts::~AliRDHFCuts() {
218 // Default Destructor
220 if(fPtBinLimits) {delete [] fPtBinLimits; fPtBinLimits=0;}
221 if(fVarNames) {delete [] fVarNames; fVarNames=0;}
222 if(fVarsForOpt) {delete [] fVarsForOpt; fVarsForOpt=0;}
227 if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
233 //---------------------------------------------------------------------------
234 Int_t AliRDHFCuts::IsEventSelectedInCentrality(AliVEvent *event) {
236 // Centrality selection
238 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid){
239 AliWarning("Centrality estimator not valid");
242 Float_t centvalue=GetCentrality((AliAODEvent*)event);
243 if (centvalue<-998.){//-999 if no centralityP
246 if (centvalue<fMinCentrality || centvalue>fMaxCentrality){
253 //---------------------------------------------------------------------------
254 Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
258 //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
264 if(fRecomputePrimVertex){
265 Bool_t vertOK= RecomputePrimaryVertex((AliAODEvent*)event);
274 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)event)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
275 if(mcArray) {isMC=kTRUE;fUseAOD049=kFALSE;}
277 // settings for the TPC dE/dx BB parameterization
278 if(fPidHF && fPidHF->GetOldPid()) {
279 // pp, from LHC10d onwards
280 if((event->GetRunNumber()>121693 && event->GetRunNumber()<136851) ||
281 event->GetRunNumber()>139517) fPidHF->SetOnePad(kTRUE);
282 // pp, 2011 low energy run
283 if((event->GetRunNumber()>=146686 && event->GetRunNumber()<=146860)){
284 fPidHF->SetppLowEn2011(kTRUE);
285 fPidHF->SetOnePad(kFALSE);
288 if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517) fPidHF->SetPbPb(kTRUE);
290 if(isMC) fPidHF->SetMC(kTRUE);
291 if(isMC && (event->GetRunNumber()>=146686 && event->GetRunNumber()<=146860))
292 fPidHF->SetMClowenpp2011(kTRUE);
293 fPidHF->SetBetheBloch();
295 else if(fPidHF && !fPidHF->GetOldPid()) {
296 if(fPidHF->GetPidResponse()==0x0){
297 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
298 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
299 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
300 fPidHF->SetPidResponse(pidResp);
306 TString firedTriggerClasses=((AliAODEvent*)event)->GetFiredTriggerClasses();
307 // don't do for MC and for PbPb 2010 data
308 if(!isMC && (event->GetRunNumber()<136851 || event->GetRunNumber()>139517)) {
309 if(!firedTriggerClasses.Contains(fTriggerClass.Data())) {
311 fEvRejectionBits+=1<<kNotSelTrigger;
316 // TEMPORARY FIX FOR REFERENCES
317 // Fix references to daughter tracks
319 // AliAnalysisVertexingHF *fixer = new AliAnalysisVertexingHF();
320 // fixer->FixReferences((AliAODEvent*)event);
326 // physics selection requirements
327 if(fUsePhysicsSelection){
328 Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
330 if(accept) fWhyRejection=7;
331 fEvRejectionBits+=1<<kPhysicsSelection;
334 if(fUseOnlyOneTrigger){
335 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()!=fTriggerMask){
336 if(accept) fWhyRejection=7;
337 fEvRejectionBits+=1<<kPhysicsSelection;
344 // vertex requirements
346 const AliVVertex *vertex = event->GetPrimaryVertex();
350 fEvRejectionBits+=1<<kNoVertex;
352 TString title=vertex->GetTitle();
353 if(title.Contains("Z") && fMinVtxType>1){
355 fEvRejectionBits+=1<<kNoVertex;
357 else if(title.Contains("3D") && fMinVtxType>2){
359 fEvRejectionBits+=1<<kNoVertex;
361 if(vertex->GetNContributors()<fMinVtxContr){
363 fEvRejectionBits+=1<<kTooFewVtxContrib;
365 if(TMath::Abs(vertex->GetZ())>fMaxVtxZ) {
366 fEvRejectionBits+=1<<kZVtxOutFid;
367 if(accept) fWhyRejection=6;
374 if(fOptPileup==kRejectPileupEvent){
375 Int_t cutc=(Int_t)fMinContrPileup;
376 Double_t cutz=(Double_t)fMinDzPileup;
377 if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
378 if(accept) fWhyRejection=1;
379 fEvRejectionBits+=1<<kPileupSPD;
384 // centrality selection
385 if (fUseCentrality!=kCentOff) {
386 Int_t rejection=IsEventSelectedInCentrality(event);
388 if(accept) fWhyRejection=rejection;
389 fEvRejectionBits+=1<<kOutsideCentrality;
396 //---------------------------------------------------------------------------
397 Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
399 // Daughter tracks selection
401 if(!fTrackCuts) return kTRUE;
403 Int_t ndaughters = d->GetNDaughters();
404 AliAODVertex *vAOD = d->GetPrimaryVtx();
405 Double_t pos[3],cov[6];
407 vAOD->GetCovarianceMatrix(cov);
408 const AliESDVertex vESD(pos,cov,100.,100);
412 for(Int_t idg=0; idg<ndaughters; idg++) {
413 AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);
414 if(!dgTrack) {retval = kFALSE; continue;}
415 //printf("charge %d\n",dgTrack->Charge());
416 if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
418 if(fIsCandTrackSPDFirst && d->Pt()<fMaxPtCandTrackSPDFirst)
419 { if(!dgTrack->HasPointOnITSLayer(0)) { retval = kFALSE; continue; } }
421 if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
426 //---------------------------------------------------------------------------
427 Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
429 // Convert to ESDtrack, relate to vertex and check cuts
431 if(!cuts) return kTRUE;
433 if(cuts->GetFlagCutTOFdistance()) cuts->SetFlagCutTOFdistance(kFALSE);
437 // convert to ESD track here
438 AliESDtrack esdTrack(track);
439 // set the TPC cluster info
440 esdTrack.SetTPCClusterMap(track->GetTPCClusterMap());
441 esdTrack.SetTPCSharedMap(track->GetTPCSharedMap());
442 esdTrack.SetTPCPointsF(track->GetTPCNclsF());
443 // needed to calculate the impact parameters
444 esdTrack.RelateToVertex(primary,0.,3.);
446 if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
448 if(fOptPileup==kRejectTracksFromPileupVertex){
450 // we need either to have here the AOD Event,
451 // or to have the pileup vertex object
455 //---------------------------------------------------------------------------
456 void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
460 delete [] fPtBinLimits;
462 printf("Changing the pt bins\n");
465 if(nPtBinLimits != fnPtBins+1){
466 cout<<"Warning: ptBinLimits dimention "<<nPtBinLimits<<" != nPtBins+1 ("<<fnPtBins+1<<")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;
467 SetNPtBins(nPtBinLimits-1);
470 fnPtBinLimits = nPtBinLimits;
472 //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
473 fPtBinLimits = new Float_t[fnPtBinLimits];
474 for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
478 //---------------------------------------------------------------------------
479 void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){
480 // Set the variable names
485 //printf("Changing the variable names\n");
488 printf("Wrong number of variables: it has to be %d\n",fnVars);
492 fVarNames = new TString[nVars];
493 fIsUpperCut = new Bool_t[nVars];
494 for(Int_t iv=0; iv<nVars; iv++) {
495 fVarNames[iv] = varNames[iv];
496 fIsUpperCut[iv] = isUpperCut[iv];
501 //---------------------------------------------------------------------------
502 void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {
503 // Set the variables to be used for cuts optimization
506 delete [] fVarsForOpt;
508 //printf("Changing the variables for cut optimization\n");
511 if(nVars==0){//!=fnVars) {
512 printf("%d not accepted as number of variables: it has to be %d\n",nVars,fnVars);
517 fVarsForOpt = new Bool_t[fnVars];
518 for(Int_t iv=0; iv<fnVars; iv++) {
519 fVarsForOpt[iv]=forOpt[iv];
520 if(fVarsForOpt[iv]) fnVarsForOpt++;
526 //---------------------------------------------------------------------------
527 void AliRDHFCuts::SetUseCentrality(Int_t flag) {
529 // set centrality estimator
532 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid) AliWarning("Centrality estimator not valid");
538 //---------------------------------------------------------------------------
539 void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) {
544 printf("Wrong number of variables: it has to be %d\n",fnVars);
547 if(nPtBins!=fnPtBins) {
548 printf("Wrong number of pt bins: it has to be %d\n",fnPtBins);
552 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
555 for(Int_t iv=0; iv<fnVars; iv++) {
557 for(Int_t ib=0; ib<fnPtBins; ib++) {
560 if(GetGlobalIndex(iv,ib)>=fGlobalIndex) {
561 cout<<"Overflow, exit..."<<endl;
565 fCutsRD[GetGlobalIndex(iv,ib)] = cutsRD[iv][ib];
571 //---------------------------------------------------------------------------
572 void AliRDHFCuts::SetCuts(Int_t glIndex,Float_t* cutsRDGlob){
576 if(glIndex != fGlobalIndex){
577 cout<<"Wrong array size: it has to be "<<fGlobalIndex<<endl;
580 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
582 for(Int_t iGl=0;iGl<fGlobalIndex;iGl++){
583 fCutsRD[iGl] = cutsRDGlob[iGl];
587 //---------------------------------------------------------------------------
588 void AliRDHFCuts::PrintAll() const {
590 // print all cuts values
593 printf("Minimum vtx type %d\n",fMinVtxType);
594 printf("Minimum vtx contr %d\n",fMinVtxContr);
595 printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
596 printf("Min SPD mult %d\n",fMinSPDMultiplicity);
597 printf("Use PID %d\n",(Int_t)fUsePID);
598 printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
599 printf("Recompute primary vertex %d\n",(Int_t)fRecomputePrimVertex);
600 printf("Physics selection: %s\n",fUsePhysicsSelection ? "Yes" : "No");
601 printf("Pileup rejection: %s\n",(fOptPileup > 0) ? "Yes" : "No");
602 if(fOptPileup==1) printf(" -- Reject pileup event");
603 if(fOptPileup==2) printf(" -- Reject tracks from pileup vtx");
604 if(fUseCentrality>0) {
605 TString estimator="";
606 if(fUseCentrality==1) estimator = "V0";
607 if(fUseCentrality==2) estimator = "Tracks";
608 if(fUseCentrality==3) estimator = "Tracklets";
609 if(fUseCentrality==4) estimator = "SPD clusters outer";
610 printf("Centrality class considered: %.1f-%.1f, estimated with %s",fMinCentrality,fMaxCentrality,estimator.Data());
612 if(fIsCandTrackSPDFirst) printf("Check for candidates with pt < %2.2f, that daughters fullfill kFirst criteria\n",fMaxPtCandTrackSPDFirst);
615 cout<<"Array of variables"<<endl;
616 for(Int_t iv=0;iv<fnVars;iv++){
617 cout<<fVarNames[iv]<<"\t";
622 cout<<"Array of optimization"<<endl;
623 for(Int_t iv=0;iv<fnVars;iv++){
624 cout<<fVarsForOpt[iv]<<"\t";
629 cout<<"Array of upper/lower cut"<<endl;
630 for(Int_t iv=0;iv<fnVars;iv++){
631 cout<<fIsUpperCut[iv]<<"\t";
636 cout<<"Array of ptbin limits"<<endl;
637 for(Int_t ib=0;ib<fnPtBinLimits;ib++){
638 cout<<fPtBinLimits[ib]<<"\t";
643 cout<<"Matrix of cuts"<<endl;
644 for(Int_t iv=0;iv<fnVars;iv++){
645 for(Int_t ib=0;ib<fnPtBins;ib++){
646 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";
655 //--------------------------------------------------------------------------
656 void AliRDHFCuts::PrintTrigger() const{
658 cout<<" Trigger selection pattern: ";
659 if( fTriggerMask & AliVEvent::kAny ) cout<<" kAny ";
660 if( fTriggerMask & AliVEvent::kAnyINT ) cout<<" kAnyINT ";
661 if( fTriggerMask & AliVEvent::kINT7 ) cout<<" kINT7 ";
662 if( fTriggerMask & AliVEvent::kMB ) cout<<" kMB ";
663 if( fTriggerMask & AliVEvent::kCINT5 ) cout<<" kCINT5 ";
664 if( fTriggerMask & AliVEvent::kCentral ) cout<<" kCentral ";
665 if( fTriggerMask & AliVEvent::kSemiCentral ) cout<<" kSemiCentral ";
666 if( fTriggerMask & AliVEvent::kEMCEGA ) cout<<" kEMCEGA ";
667 if( fTriggerMask & AliVEvent::kHighMult ) cout<<" kHighMult ";
668 if( fTriggerMask & AliVEvent::kFastOnly ) cout<<" kFastOnly ";
673 //---------------------------------------------------------------------------
674 void AliRDHFCuts::GetCuts(Float_t**& cutsRD) const{
679 //cout<<"Give back a "<<fnVars<<"x"<<fnPtBins<<" matrix."<<endl;
684 //cout<<"Initialization..."<<endl;
685 cutsRD=new Float_t*[fnVars];
686 for(iv=0; iv<fnVars; iv++) {
687 cutsRD[iv] = new Float_t[fnPtBins];
691 for(Int_t iGlobal=0; iGlobal<fGlobalIndex; iGlobal++) {
692 GetVarPtIndex(iGlobal,iv,ib);
693 cutsRD[iv][ib] = fCutsRD[iGlobal];
699 //---------------------------------------------------------------------------
700 Int_t AliRDHFCuts::GetGlobalIndex(Int_t iVar,Int_t iPtBin) const{
702 // give the global index from variable and pt bin
704 return iPtBin*fnVars+iVar;
707 //---------------------------------------------------------------------------
708 void AliRDHFCuts::GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const {
710 //give the index of the variable and of the pt bin from the global index
712 iPtBin=(Int_t)iGlob/fnVars;
718 //---------------------------------------------------------------------------
719 Int_t AliRDHFCuts::PtBin(Double_t pt) const {
721 //give the pt bin where the pt lies.
724 if(pt<fPtBinLimits[0])return ptbin;
725 for (Int_t i=0;i<fnPtBins;i++){
726 if(pt<fPtBinLimits[i+1]) {
733 //-------------------------------------------------------------------
734 Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {
736 // Give the value of cut set for the variable iVar and the pt bin iPtBin
739 cout<<"Cuts not iniziaisez yet"<<endl;
742 return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
744 //-------------------------------------------------------------------
745 Float_t AliRDHFCuts::GetCentrality(AliAODEvent* aodEvent,AliRDHFCuts::ECentrality estimator) {
747 // Get centrality percentile
750 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)aodEvent)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
751 if(mcArray) {fUseAOD049=kFALSE;}
753 AliAODHeader *header=aodEvent->GetHeader();
754 AliCentrality *centrality=header->GetCentralityP();
756 Bool_t isSelRun=kFALSE;
757 Int_t selRun[5]={138364, 138826, 138828, 138836, 138871};
758 if(!centrality) return cent;
760 if (estimator==kCentV0M){
761 cent=(Float_t)(centrality->GetCentralityPercentile("V0M"));
763 Int_t quality = centrality->GetQuality();
765 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("V0M");
767 Int_t runnum=aodEvent->GetRunNumber();
768 for(Int_t ir=0;ir<5;ir++){
769 if(runnum==selRun[ir]){
774 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("V0M");
778 //temporary fix for AOD049 outliers
779 if(fUseAOD049&¢>=0){
781 AliAODVZERO* aodV0 = aodEvent->GetVZEROData();
782 v0+=aodV0->GetMTotV0A();
783 v0+=aodV0->GetMTotV0C();
784 if(cent==0&&v0<19500)return -1;//filtering issue
785 Float_t tkl = (Float_t)(aodEvent->GetTracklets()->GetNumberOfTracklets());
786 Float_t val= 1.30552 + 0.147931 * v0;
787 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};
788 if ( TMath::Abs(tkl-val) > 6.*tklSigma[(Int_t)cent] )return -1;//outlier
792 if (estimator==kCentTRK) {
793 cent=(Float_t)(centrality->GetCentralityPercentile("TRK"));
795 Int_t quality = centrality->GetQuality();
797 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TRK");
799 Int_t runnum=aodEvent->GetRunNumber();
800 for(Int_t ir=0;ir<5;ir++){
801 if(runnum==selRun[ir]){
806 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TRK");
811 if (estimator==kCentTKL){
812 cent=(Float_t)(centrality->GetCentralityPercentile("TKL"));
814 Int_t quality = centrality->GetQuality();
816 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TKL");
818 Int_t runnum=aodEvent->GetRunNumber();
819 for(Int_t ir=0;ir<5;ir++){
820 if(runnum==selRun[ir]){
825 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TKL");
830 if (estimator==kCentCL1){
831 cent=(Float_t)(centrality->GetCentralityPercentile("CL1"));
833 Int_t quality = centrality->GetQuality();
835 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("CL1");
837 Int_t runnum=aodEvent->GetRunNumber();
838 for(Int_t ir=0;ir<5;ir++){
839 if(runnum==selRun[ir]){
844 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("CL1");
849 AliWarning("Centrality estimator not valid");
858 //-------------------------------------------------------------------
859 Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
861 // Compare two cuts objects
864 Bool_t areEqual=kTRUE;
866 if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
868 if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
870 if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) { printf("Max vtx red chi2 %f %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
872 if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) { printf("Min SPD mult %d\n %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
874 if(fUsePID!=obj->fUsePID) { printf("Use PID %d %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
876 if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
878 if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
880 if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
882 if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
884 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;}
888 for(Int_t iv=0;iv<fnVars;iv++) {
889 for(Int_t ib=0;ib<fnPtBins;ib++) {
890 if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
891 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<" "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
900 //---------------------------------------------------------------------------
901 void AliRDHFCuts::MakeTable() const {
903 // print cuts values in table format
906 TString ptString = "pT range";
907 if(fVarNames && fPtBinLimits && fCutsRD){
908 TString firstLine(Form("* %-15s",ptString.Data()));
909 for (Int_t ivar=0; ivar<fnVars; ivar++){
910 firstLine+=Form("* %-15s ",fVarNames[ivar].Data());
915 Printf("%s",firstLine.Data());
917 for (Int_t ipt=0; ipt<fnPtBins; ipt++){
919 if (ipt==fnPtBins-1){
920 line=Form("* %5.1f < pt < inf ",fPtBinLimits[ipt]);
923 line=Form("* %5.1f < pt < %4.1f ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);
925 for (Int_t ivar=0; ivar<fnVars; ivar++){
926 line+=Form("* %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);
928 Printf("%s",line.Data());
936 //--------------------------------------------------------------------------
937 Bool_t AliRDHFCuts::RecalcOwnPrimaryVtx(AliAODRecoDecayHF *d,
938 AliAODEvent *aod) const
941 // Recalculate primary vertex without daughters
945 AliError("Can not remove daughters from vertex without AOD event");
949 AliAODVertex *recvtx=d->RemoveDaughtersFromPrimaryVtx(aod);
951 AliDebug(2,"Removal of daughter tracks failed");
956 //set recalculed primary vertex
957 d->SetOwnPrimaryVtx(recvtx);
962 //--------------------------------------------------------------------------
963 Bool_t AliRDHFCuts::SetMCPrimaryVtx(AliAODRecoDecayHF *d,AliAODEvent *aod) const
966 // Recalculate primary vertex without daughters
970 AliError("Can not get MC vertex without AOD event");
975 AliAODMCHeader *mcHeader =
976 (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
978 AliError("Can not get MC vertex without AODMCHeader event");
982 Double_t covmatrix[6]={0.,0.,0.,0.,0.,0.};
983 mcHeader->GetVertex(pos);
984 AliAODVertex *recvtx=new AliAODVertex(pos,covmatrix);
987 AliDebug(2,"Removal of daughter tracks failed");
991 //set recalculed primary vertex
992 d->SetOwnPrimaryVtx(recvtx);
994 d->RecalculateImpPars(recvtx,aod);
1000 //--------------------------------------------------------------------------
1001 void AliRDHFCuts::CleanOwnPrimaryVtx(AliAODRecoDecayHF *d,
1003 AliAODVertex *origownvtx) const
1006 // Clean-up own primary vertex if needed
1009 if(fRemoveDaughtersFromPrimary || fUseMCVertex) {
1010 d->UnsetOwnPrimaryVtx();
1012 d->SetOwnPrimaryVtx(origownvtx);
1013 delete origownvtx; origownvtx=NULL;
1015 d->RecalculateImpPars(d->GetPrimaryVtx(),aod);
1018 delete origownvtx; origownvtx=NULL;
1023 //--------------------------------------------------------------------------
1024 Bool_t AliRDHFCuts::IsSignalMC(AliAODRecoDecay *d,AliAODEvent *aod,Int_t pdg) const
1027 // Checks if this candidate is matched to MC signal
1030 if(!aod) return kFALSE;
1033 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)aod)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
1035 if(!mcArray) return kFALSE;
1038 Int_t label = d->MatchToMC(pdg,mcArray);
1041 //printf("MATCH!\n");
1049 //--------------------------------------------------------------------------
1050 Bool_t AliRDHFCuts::RecomputePrimaryVertex(AliAODEvent* event) const{
1051 // recompute event primary vertex from AOD tracks
1053 AliVertexerTracks *vertexer = new AliVertexerTracks(event->GetMagneticField());
1054 vertexer->SetITSMode();
1055 vertexer->SetMinClusters(3);
1057 AliAODVertex* pvtx=event->GetPrimaryVertex();
1058 if(strstr(pvtx->GetTitle(),"VertexerTracksWithConstraint")) {
1059 Float_t diamondcovxy[3];
1060 event->GetDiamondCovXY(diamondcovxy);
1061 Double_t pos[3]={event->GetDiamondX(),event->GetDiamondY(),0.};
1062 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
1063 AliESDVertex *diamond = new AliESDVertex(pos,cov,1.,1);
1064 vertexer->SetVtxStart(diamond);
1065 delete diamond; diamond=NULL;
1068 AliESDVertex* vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event);
1069 if(!vertexESD) return kFALSE;
1070 if(vertexESD->GetNContributors()<=0) {
1071 //AliDebug(2,"vertexing failed");
1072 delete vertexESD; vertexESD=NULL;
1075 delete vertexer; vertexer=NULL;
1077 // convert to AliAODVertex
1078 Double_t pos[3],cov[6],chi2perNDF;
1079 vertexESD->GetXYZ(pos); // position
1080 vertexESD->GetCovMatrix(cov); //covariance matrix
1081 chi2perNDF = vertexESD->GetChi2toNDF();
1082 delete vertexESD; vertexESD=NULL;
1084 pvtx->SetPosition(pos[0],pos[1],pos[2]);
1085 pvtx->SetChi2perNDF(chi2perNDF);
1086 pvtx->SetCovMatrix(cov);