1 /**************************************************************************
\r
2 * Copyright(c) 1998-2010, ALICE Experiment at CERN, All rights reserved. *
\r
4 * Author: The ALICE Off-line Project. *
\r
5 * Contributors are mentioned in the code where appropriate. *
\r
7 * Permission to use, copy, modify and distribute this software and its *
\r
8 * documentation strictly for non-commercial purposes is hereby granted *
\r
9 * without fee, provided that the above copyright notice appears in all *
\r
10 * copies and that both the copyright notice and this permission notice *
\r
11 * appear in the supporting documentation. The authors make no claims *
\r
12 * about the suitability of this software for any purpose. It is *
\r
13 * provided "as is" without express or implied warranty. *
\r
14 **************************************************************************/
\r
18 /////////////////////////////////////////////////////////////
\r
20 // Base class for cuts on AOD reconstructed heavy-flavour decay
\r
22 // Author: A.Dainese, andrea.dainese@pd.infn.it
\r
23 /////////////////////////////////////////////////////////////
\r
24 #include <Riostream.h>
\r
26 #include "AliVEvent.h"
\r
27 #include "AliESDEvent.h"
\r
28 #include "AliAODEvent.h"
\r
29 #include "AliVVertex.h"
\r
30 #include "AliESDVertex.h"
\r
32 #include "AliAODVertex.h"
\r
33 #include "AliESDtrack.h"
\r
34 #include "AliAODTrack.h"
\r
35 #include "AliESDtrackCuts.h"
\r
36 #include "AliCentrality.h"
\r
37 #include "AliAODRecoDecayHF.h"
\r
38 #include "AliAnalysisVertexingHF.h"
\r
39 #include "AliAODMCHeader.h"
\r
40 #include "AliAODMCParticle.h"
\r
41 #include "AliRDHFCuts.h"
\r
42 #include "AliAnalysisManager.h"
\r
43 #include "AliInputEventHandler.h"
\r
44 #include "AliPIDResponse.h"
\r
46 ClassImp(AliRDHFCuts)
\r
48 //--------------------------------------------------------------------------
\r
49 AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) :
\r
50 AliAnalysisCuts(name,title),
\r
53 fMaxVtxRedChi2(1e6),
\r
55 fMinSPDMultiplicity(0),
\r
56 fTriggerMask(AliVEvent::kAnyINT),
\r
57 fUseOnlyOneTrigger(kFALSE),
\r
58 fTriggerClass("CINT1"),
\r
74 fEvRejectionBits(0),
\r
75 fRemoveDaughtersFromPrimary(kFALSE),
\r
76 fUseMCVertex(kFALSE),
\r
77 fUsePhysicsSelection(kTRUE),
\r
83 fMaxCentrality(100.),
\r
88 fMaxPtCand(100000.),
\r
89 fKeepSignalMC(kFALSE),
\r
90 fIsCandTrackSPDFirst(kFALSE),
\r
91 fMaxPtCandTrackSPDFirst(0.)
\r
94 // Default Constructor
\r
97 //--------------------------------------------------------------------------
\r
98 AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
\r
99 AliAnalysisCuts(source),
\r
100 fMinVtxType(source.fMinVtxType),
\r
101 fMinVtxContr(source.fMinVtxContr),
\r
102 fMaxVtxRedChi2(source.fMaxVtxRedChi2),
\r
103 fMaxVtxZ(source.fMaxVtxZ),
\r
104 fMinSPDMultiplicity(source.fMinSPDMultiplicity),
\r
105 fTriggerMask(source.fTriggerMask),
\r
106 fUseOnlyOneTrigger(source.fUseOnlyOneTrigger),
\r
107 fTriggerClass(source.fTriggerClass),
\r
109 fnPtBins(source.fnPtBins),
\r
110 fnPtBinLimits(source.fnPtBinLimits),
\r
112 fnVars(source.fnVars),
\r
114 fnVarsForOpt(source.fnVarsForOpt),
\r
116 fGlobalIndex(source.fGlobalIndex),
\r
119 fUsePID(source.fUsePID),
\r
120 fUseAOD049(source.fUseAOD049),
\r
122 fWhyRejection(source.fWhyRejection),
\r
123 fEvRejectionBits(source.fEvRejectionBits),
\r
124 fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
\r
125 fUseMCVertex(source.fUseMCVertex),
\r
126 fUsePhysicsSelection(source.fUsePhysicsSelection),
\r
127 fOptPileup(source.fOptPileup),
\r
128 fMinContrPileup(source.fMinContrPileup),
\r
129 fMinDzPileup(source.fMinDzPileup),
\r
130 fUseCentrality(source.fUseCentrality),
\r
131 fMinCentrality(source.fMinCentrality),
\r
132 fMaxCentrality(source.fMaxCentrality),
\r
133 fFixRefs(source.fFixRefs),
\r
134 fIsSelectedCuts(source.fIsSelectedCuts),
\r
135 fIsSelectedPID(source.fIsSelectedPID),
\r
136 fMinPtCand(source.fMinPtCand),
\r
137 fMaxPtCand(source.fMaxPtCand),
\r
138 fKeepSignalMC(source.fKeepSignalMC),
\r
139 fIsCandTrackSPDFirst(source.fIsCandTrackSPDFirst),
\r
140 fMaxPtCandTrackSPDFirst(source.fMaxPtCandTrackSPDFirst)
\r
143 // Copy constructor
\r
145 cout<<"Copy constructor"<<endl;
\r
146 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
\r
147 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
\r
148 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
\r
149 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
\r
150 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
\r
151 if(source.fPidHF) SetPidHF(source.fPidHF);
\r
155 //--------------------------------------------------------------------------
\r
156 AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
\r
159 // assignment operator
\r
161 if(&source == this) return *this;
\r
163 AliAnalysisCuts::operator=(source);
\r
165 fMinVtxType=source.fMinVtxType;
\r
166 fMinVtxContr=source.fMinVtxContr;
\r
167 fMaxVtxRedChi2=source.fMaxVtxRedChi2;
\r
168 fMaxVtxZ=source.fMaxVtxZ;
\r
169 fMinSPDMultiplicity=source.fMinSPDMultiplicity;
\r
170 fTriggerMask=source.fTriggerMask;
\r
171 fUseOnlyOneTrigger=source.fUseOnlyOneTrigger;
\r
172 fTriggerClass=source.fTriggerClass;
\r
173 fnPtBins=source.fnPtBins;
\r
174 fnPtBinLimits=source.fnPtBinLimits;
\r
175 fnVars=source.fnVars;
\r
176 fGlobalIndex=source.fGlobalIndex;
\r
177 fnVarsForOpt=source.fnVarsForOpt;
\r
178 fUsePID=source.fUsePID;
\r
179 fUseAOD049=source.fUseAOD049;
\r
180 if(fPidHF) delete fPidHF;
\r
181 fPidHF=new AliAODPidHF(*(source.GetPidHF()));
\r
182 fWhyRejection=source.fWhyRejection;
\r
183 fEvRejectionBits=source.fEvRejectionBits;
\r
184 fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
\r
185 fUseMCVertex=source.fUseMCVertex;
\r
186 fUsePhysicsSelection=source.fUsePhysicsSelection;
\r
187 fOptPileup=source.fOptPileup;
\r
188 fMinContrPileup=source.fMinContrPileup;
\r
189 fMinDzPileup=source.fMinDzPileup;
\r
190 fUseCentrality=source.fUseCentrality;
\r
191 fMinCentrality=source.fMinCentrality;
\r
192 fMaxCentrality=source.fMaxCentrality;
\r
193 fFixRefs=source.fFixRefs;
\r
194 fIsSelectedCuts=source.fIsSelectedCuts;
\r
195 fIsSelectedPID=source.fIsSelectedPID;
\r
196 fMinPtCand=source.fMinPtCand;
\r
197 fMaxPtCand=source.fMaxPtCand;
\r
198 fKeepSignalMC=source.fKeepSignalMC;
\r
199 fIsCandTrackSPDFirst=source.fIsCandTrackSPDFirst;
\r
200 fMaxPtCandTrackSPDFirst=source.fMaxPtCandTrackSPDFirst;
\r
202 if(source.GetTrackCuts()) {delete fTrackCuts; fTrackCuts=new AliESDtrackCuts(*(source.GetTrackCuts()));}
\r
203 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
\r
204 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
\r
205 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
\r
206 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
\r
211 //--------------------------------------------------------------------------
\r
212 AliRDHFCuts::~AliRDHFCuts() {
\r
214 // Default Destructor
\r
216 if(fPtBinLimits) {delete [] fPtBinLimits; fPtBinLimits=0;}
\r
217 if(fVarNames) {delete [] fVarNames; fVarNames=0;}
\r
218 if(fVarsForOpt) {delete [] fVarsForOpt; fVarsForOpt=0;}
\r
223 if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
\r
229 //---------------------------------------------------------------------------
\r
230 Int_t AliRDHFCuts::IsEventSelectedInCentrality(AliVEvent *event) {
\r
232 // Centrality selection
\r
234 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid){
\r
235 AliWarning("Centrality estimator not valid");
\r
238 Float_t centvalue=GetCentrality((AliAODEvent*)event);
\r
239 if (centvalue<-998.){//-999 if no centralityP
\r
242 if (centvalue<fMinCentrality || centvalue>fMaxCentrality){
\r
249 //---------------------------------------------------------------------------
\r
250 Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
\r
254 //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
\r
257 fEvRejectionBits=0;
\r
258 Bool_t accept=kTRUE;
\r
260 // check if it's MC
\r
261 Bool_t isMC=kFALSE;
\r
262 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)event)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
\r
263 if(mcArray) {isMC=kTRUE;fUseAOD049=kFALSE;}
\r
265 // settings for the TPC dE/dx BB parameterization
\r
266 if(fPidHF && fPidHF->GetOldPid()) {
\r
267 // pp, from LHC10d onwards
\r
268 if((event->GetRunNumber()>121693 && event->GetRunNumber()<136851) ||
\r
269 event->GetRunNumber()>139517) fPidHF->SetOnePad(kTRUE);
\r
270 // pp, 2011 low energy run
\r
271 if((event->GetRunNumber()>=146686 && event->GetRunNumber()<=146860)){
\r
272 fPidHF->SetppLowEn2011(kTRUE);
\r
273 fPidHF->SetOnePad(kFALSE);
\r
276 if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517) fPidHF->SetPbPb(kTRUE);
\r
278 if(isMC) fPidHF->SetMC(kTRUE);
\r
279 if(isMC && (event->GetRunNumber()>=146686 && event->GetRunNumber()<=146860))
\r
280 fPidHF->SetMClowenpp2011(kTRUE);
\r
282 else if(fPidHF && !fPidHF->GetOldPid()) {
\r
283 if(fPidHF->GetPidResponse()==0x0){
\r
284 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
\r
285 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
\r
286 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
\r
287 fPidHF->SetPidResponse(pidResp);
\r
293 TString firedTriggerClasses=((AliAODEvent*)event)->GetFiredTriggerClasses();
\r
294 // don't do for MC and for PbPb 2010 data
\r
295 if(!isMC && (event->GetRunNumber()<136851 || event->GetRunNumber()>139517)) {
\r
296 if(!firedTriggerClasses.Contains(fTriggerClass.Data())) {
\r
298 fEvRejectionBits+=1<<kNotSelTrigger;
\r
303 // TEMPORARY FIX FOR REFERENCES
\r
304 // Fix references to daughter tracks
\r
306 // AliAnalysisVertexingHF *fixer = new AliAnalysisVertexingHF();
\r
307 // fixer->FixReferences((AliAODEvent*)event);
\r
313 // physics selection requirements
\r
314 if(fUsePhysicsSelection){
\r
315 Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
\r
317 if(accept) fWhyRejection=7;
\r
318 fEvRejectionBits+=1<<kPhysicsSelection;
\r
321 if(fUseOnlyOneTrigger){
\r
322 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()!=fTriggerMask){
\r
323 if(accept) fWhyRejection=7;
\r
324 fEvRejectionBits+=1<<kPhysicsSelection;
\r
331 // vertex requirements
\r
333 const AliVVertex *vertex = event->GetPrimaryVertex();
\r
337 fEvRejectionBits+=1<<kNoVertex;
\r
339 TString title=vertex->GetTitle();
\r
340 if(title.Contains("Z") && fMinVtxType>1){
\r
342 fEvRejectionBits+=1<<kNoVertex;
\r
344 else if(title.Contains("3D") && fMinVtxType>2){
\r
346 fEvRejectionBits+=1<<kNoVertex;
\r
348 if(vertex->GetNContributors()<fMinVtxContr){
\r
350 fEvRejectionBits+=1<<kTooFewVtxContrib;
\r
352 if(TMath::Abs(vertex->GetZ())>fMaxVtxZ) {
\r
353 fEvRejectionBits+=1<<kZVtxOutFid;
\r
354 if(accept) fWhyRejection=6;
\r
360 // pile-up rejection
\r
361 if(fOptPileup==kRejectPileupEvent){
\r
362 Int_t cutc=(Int_t)fMinContrPileup;
\r
363 Double_t cutz=(Double_t)fMinDzPileup;
\r
364 if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
\r
365 if(accept) fWhyRejection=1;
\r
366 fEvRejectionBits+=1<<kPileupSPD;
\r
371 // centrality selection
\r
372 if (fUseCentrality!=kCentOff) {
\r
373 Int_t rejection=IsEventSelectedInCentrality(event);
\r
375 if(accept) fWhyRejection=rejection;
\r
376 fEvRejectionBits+=1<<kOutsideCentrality;
\r
383 //---------------------------------------------------------------------------
\r
384 Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
\r
386 // Daughter tracks selection
\r
388 if(!fTrackCuts) return kTRUE;
\r
390 Int_t ndaughters = d->GetNDaughters();
\r
391 AliAODVertex *vAOD = d->GetPrimaryVtx();
\r
392 Double_t pos[3],cov[6];
\r
394 vAOD->GetCovarianceMatrix(cov);
\r
395 const AliESDVertex vESD(pos,cov,100.,100);
\r
397 Bool_t retval=kTRUE;
\r
399 for(Int_t idg=0; idg<ndaughters; idg++) {
\r
400 AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);
\r
401 if(!dgTrack) {retval = kFALSE; continue;}
\r
402 //printf("charge %d\n",dgTrack->Charge());
\r
403 if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
\r
405 if(fIsCandTrackSPDFirst && d->Pt()<fMaxPtCandTrackSPDFirst)
\r
406 { if(!dgTrack->HasPointOnITSLayer(0)) { retval = kFALSE; continue; } }
\r
408 if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
\r
413 //---------------------------------------------------------------------------
\r
414 Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
\r
416 // Convert to ESDtrack, relate to vertex and check cuts
\r
418 if(!cuts) return kTRUE;
\r
420 Bool_t retval=kTRUE;
\r
422 // convert to ESD track here
\r
423 AliESDtrack esdTrack(track);
\r
424 // set the TPC cluster info
\r
425 esdTrack.SetTPCClusterMap(track->GetTPCClusterMap());
\r
426 esdTrack.SetTPCSharedMap(track->GetTPCSharedMap());
\r
427 esdTrack.SetTPCPointsF(track->GetTPCNclsF());
\r
428 // needed to calculate the impact parameters
\r
429 esdTrack.RelateToVertex(primary,0.,3.);
\r
431 if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
\r
433 if(fOptPileup==kRejectTracksFromPileupVertex){
\r
434 // to be implemented
\r
435 // we need either to have here the AOD Event,
\r
436 // or to have the pileup vertex object
\r
440 //---------------------------------------------------------------------------
\r
441 void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
\r
445 delete [] fPtBinLimits;
\r
446 fPtBinLimits = NULL;
\r
447 printf("Changing the pt bins\n");
\r
450 if(nPtBinLimits != fnPtBins+1){
\r
451 cout<<"Warning: ptBinLimits dimention "<<nPtBinLimits<<" != nPtBins+1 ("<<fnPtBins+1<<")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;
\r
452 SetNPtBins(nPtBinLimits-1);
\r
455 fnPtBinLimits = nPtBinLimits;
\r
457 //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
\r
458 fPtBinLimits = new Float_t[fnPtBinLimits];
\r
459 for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
\r
463 //---------------------------------------------------------------------------
\r
464 void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){
\r
465 // Set the variable names
\r
468 delete [] fVarNames;
\r
470 //printf("Changing the variable names\n");
\r
473 printf("Wrong number of variables: it has to be %d\n",fnVars);
\r
477 fVarNames = new TString[nVars];
\r
478 fIsUpperCut = new Bool_t[nVars];
\r
479 for(Int_t iv=0; iv<nVars; iv++) {
\r
480 fVarNames[iv] = varNames[iv];
\r
481 fIsUpperCut[iv] = isUpperCut[iv];
\r
486 //---------------------------------------------------------------------------
\r
487 void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {
\r
488 // Set the variables to be used for cuts optimization
\r
491 delete [] fVarsForOpt;
\r
492 fVarsForOpt = NULL;
\r
493 //printf("Changing the variables for cut optimization\n");
\r
496 if(nVars==0){//!=fnVars) {
\r
497 printf("%d not accepted as number of variables: it has to be %d\n",nVars,fnVars);
\r
502 fVarsForOpt = new Bool_t[fnVars];
\r
503 for(Int_t iv=0; iv<fnVars; iv++) {
\r
504 fVarsForOpt[iv]=forOpt[iv];
\r
505 if(fVarsForOpt[iv]) fnVarsForOpt++;
\r
511 //---------------------------------------------------------------------------
\r
512 void AliRDHFCuts::SetUseCentrality(Int_t flag) {
\r
514 // set centrality estimator
\r
516 fUseCentrality=flag;
\r
517 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid) AliWarning("Centrality estimator not valid");
\r
523 //---------------------------------------------------------------------------
\r
524 void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) {
\r
528 if(nVars!=fnVars) {
\r
529 printf("Wrong number of variables: it has to be %d\n",fnVars);
\r
530 AliFatal("exiting");
\r
532 if(nPtBins!=fnPtBins) {
\r
533 printf("Wrong number of pt bins: it has to be %d\n",fnPtBins);
\r
534 AliFatal("exiting");
\r
537 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
\r
540 for(Int_t iv=0; iv<fnVars; iv++) {
\r
542 for(Int_t ib=0; ib<fnPtBins; ib++) {
\r
545 if(GetGlobalIndex(iv,ib)>=fGlobalIndex) {
\r
546 cout<<"Overflow, exit..."<<endl;
\r
550 fCutsRD[GetGlobalIndex(iv,ib)] = cutsRD[iv][ib];
\r
556 //---------------------------------------------------------------------------
\r
557 void AliRDHFCuts::SetCuts(Int_t glIndex,Float_t* cutsRDGlob){
\r
561 if(glIndex != fGlobalIndex){
\r
562 cout<<"Wrong array size: it has to be "<<fGlobalIndex<<endl;
\r
563 AliFatal("exiting");
\r
565 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
\r
567 for(Int_t iGl=0;iGl<fGlobalIndex;iGl++){
\r
568 fCutsRD[iGl] = cutsRDGlob[iGl];
\r
572 //---------------------------------------------------------------------------
\r
573 void AliRDHFCuts::PrintAll() const {
\r
575 // print all cuts values
\r
578 printf("Minimum vtx type %d\n",fMinVtxType);
\r
579 printf("Minimum vtx contr %d\n",fMinVtxContr);
\r
580 printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
\r
581 printf("Min SPD mult %d\n",fMinSPDMultiplicity);
\r
582 printf("Use PID %d\n",(Int_t)fUsePID);
\r
583 printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
\r
584 printf("Physics selection: %s\n",fUsePhysicsSelection ? "Yes" : "No");
\r
585 printf("Pileup rejection: %s\n",(fOptPileup > 0) ? "Yes" : "No");
\r
586 if(fOptPileup==1) printf(" -- Reject pileup event");
\r
587 if(fOptPileup==2) printf(" -- Reject tracks from pileup vtx");
\r
588 if(fUseCentrality>0) {
\r
589 TString estimator="";
\r
590 if(fUseCentrality==1) estimator = "V0";
\r
591 if(fUseCentrality==2) estimator = "Tracks";
\r
592 if(fUseCentrality==3) estimator = "Tracklets";
\r
593 if(fUseCentrality==4) estimator = "SPD clusters outer";
\r
594 printf("Centrality class considered: %.1f-%.1f, estimated with %s",fMinCentrality,fMaxCentrality,estimator.Data());
\r
596 if(fIsCandTrackSPDFirst) printf("Check for candidates with pt < %2.2f, that daughters fullfill kFirst criteria\n",fMaxPtCandTrackSPDFirst);
\r
599 cout<<"Array of variables"<<endl;
\r
600 for(Int_t iv=0;iv<fnVars;iv++){
\r
601 cout<<fVarNames[iv]<<"\t";
\r
606 cout<<"Array of optimization"<<endl;
\r
607 for(Int_t iv=0;iv<fnVars;iv++){
\r
608 cout<<fVarsForOpt[iv]<<"\t";
\r
613 cout<<"Array of upper/lower cut"<<endl;
\r
614 for(Int_t iv=0;iv<fnVars;iv++){
\r
615 cout<<fIsUpperCut[iv]<<"\t";
\r
620 cout<<"Array of ptbin limits"<<endl;
\r
621 for(Int_t ib=0;ib<fnPtBinLimits;ib++){
\r
622 cout<<fPtBinLimits[ib]<<"\t";
\r
627 cout<<"Matrix of cuts"<<endl;
\r
628 for(Int_t iv=0;iv<fnVars;iv++){
\r
629 for(Int_t ib=0;ib<fnPtBins;ib++){
\r
630 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";
\r
638 //---------------------------------------------------------------------------
\r
639 void AliRDHFCuts::GetCuts(Float_t**& cutsRD) const{
\r
644 //cout<<"Give back a "<<fnVars<<"x"<<fnPtBins<<" matrix."<<endl;
\r
649 //cout<<"Initialization..."<<endl;
\r
650 cutsRD=new Float_t*[fnVars];
\r
651 for(iv=0; iv<fnVars; iv++) {
\r
652 cutsRD[iv] = new Float_t[fnPtBins];
\r
656 for(Int_t iGlobal=0; iGlobal<fGlobalIndex; iGlobal++) {
\r
657 GetVarPtIndex(iGlobal,iv,ib);
\r
658 cutsRD[iv][ib] = fCutsRD[iGlobal];
\r
664 //---------------------------------------------------------------------------
\r
665 Int_t AliRDHFCuts::GetGlobalIndex(Int_t iVar,Int_t iPtBin) const{
\r
667 // give the global index from variable and pt bin
\r
669 return iPtBin*fnVars+iVar;
\r
672 //---------------------------------------------------------------------------
\r
673 void AliRDHFCuts::GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const {
\r
675 //give the index of the variable and of the pt bin from the global index
\r
677 iPtBin=(Int_t)iGlob/fnVars;
\r
683 //---------------------------------------------------------------------------
\r
684 Int_t AliRDHFCuts::PtBin(Double_t pt) const {
\r
686 //give the pt bin where the pt lies.
\r
689 if(pt<fPtBinLimits[0])return ptbin;
\r
690 for (Int_t i=0;i<fnPtBins;i++){
\r
691 if(pt<fPtBinLimits[i+1]) {
\r
698 //-------------------------------------------------------------------
\r
699 Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {
\r
701 // Give the value of cut set for the variable iVar and the pt bin iPtBin
\r
704 cout<<"Cuts not iniziaisez yet"<<endl;
\r
707 return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
\r
709 //-------------------------------------------------------------------
\r
710 Float_t AliRDHFCuts::GetCentrality(AliAODEvent* aodEvent,AliRDHFCuts::ECentrality estimator) {
\r
712 // Get centrality percentile
\r
715 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)aodEvent)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
\r
716 if(mcArray) {fUseAOD049=kFALSE;}
\r
718 AliAODHeader *header=aodEvent->GetHeader();
\r
719 AliCentrality *centrality=header->GetCentralityP();
\r
720 Float_t cent=-999.;
\r
721 Bool_t isSelRun=kFALSE;
\r
722 Int_t selRun[5]={138364, 138826, 138828, 138836, 138871};
\r
723 if(!centrality) return cent;
\r
725 if (estimator==kCentV0M){
\r
726 cent=(Float_t)(centrality->GetCentralityPercentile("V0M"));
\r
728 Int_t quality = centrality->GetQuality();
\r
730 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("V0M");
\r
732 Int_t runnum=aodEvent->GetRunNumber();
\r
733 for(Int_t ir=0;ir<5;ir++){
\r
734 if(runnum==selRun[ir]){
\r
739 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("V0M");
\r
743 //temporary fix for AOD049 outliers
\r
744 if(fUseAOD049&¢>=0){
\r
746 AliAODVZERO* aodV0 = aodEvent->GetVZEROData();
\r
747 v0+=aodV0->GetMTotV0A();
\r
748 v0+=aodV0->GetMTotV0C();
\r
749 if(cent==0&&v0<19500)return -1;//filtering issue
\r
750 Float_t tkl = (Float_t)(aodEvent->GetTracklets()->GetNumberOfTracklets());
\r
751 Float_t val= 1.30552 + 0.147931 * v0;
\r
752 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};
\r
753 if ( TMath::Abs(tkl-val) > 6.*tklSigma[(Int_t)cent] )return -1;//outlier
\r
757 if (estimator==kCentTRK) {
\r
758 cent=(Float_t)(centrality->GetCentralityPercentile("TRK"));
\r
760 Int_t quality = centrality->GetQuality();
\r
762 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TRK");
\r
764 Int_t runnum=aodEvent->GetRunNumber();
\r
765 for(Int_t ir=0;ir<5;ir++){
\r
766 if(runnum==selRun[ir]){
\r
771 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TRK");
\r
776 if (estimator==kCentTKL){
\r
777 cent=(Float_t)(centrality->GetCentralityPercentile("TKL"));
\r
779 Int_t quality = centrality->GetQuality();
\r
781 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TKL");
\r
783 Int_t runnum=aodEvent->GetRunNumber();
\r
784 for(Int_t ir=0;ir<5;ir++){
\r
785 if(runnum==selRun[ir]){
\r
790 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TKL");
\r
795 if (estimator==kCentCL1){
\r
796 cent=(Float_t)(centrality->GetCentralityPercentile("CL1"));
\r
798 Int_t quality = centrality->GetQuality();
\r
800 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("CL1");
\r
802 Int_t runnum=aodEvent->GetRunNumber();
\r
803 for(Int_t ir=0;ir<5;ir++){
\r
804 if(runnum==selRun[ir]){
\r
809 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("CL1");
\r
814 AliWarning("Centrality estimator not valid");
\r
823 //-------------------------------------------------------------------
\r
824 Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
\r
826 // Compare two cuts objects
\r
829 Bool_t areEqual=kTRUE;
\r
831 if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
\r
833 if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
\r
835 if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) { printf("Max vtx red chi2 %f %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
\r
837 if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) { printf("Min SPD mult %d\n %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
\r
839 if(fUsePID!=obj->fUsePID) { printf("Use PID %d %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
\r
841 if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
\r
843 if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
\r
845 if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
\r
847 if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
\r
849 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;}
\r
853 for(Int_t iv=0;iv<fnVars;iv++) {
\r
854 for(Int_t ib=0;ib<fnPtBins;ib++) {
\r
855 if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
\r
856 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<" "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
\r
865 //---------------------------------------------------------------------------
\r
866 void AliRDHFCuts::MakeTable() const {
\r
868 // print cuts values in table format
\r
871 TString ptString = "pT range";
\r
872 if(fVarNames && fPtBinLimits && fCutsRD){
\r
873 TString firstLine(Form("* %-15s",ptString.Data()));
\r
874 for (Int_t ivar=0; ivar<fnVars; ivar++){
\r
875 firstLine+=Form("* %-15s ",fVarNames[ivar].Data());
\r
876 if (ivar == fnVars){
\r
880 Printf("%s",firstLine.Data());
\r
882 for (Int_t ipt=0; ipt<fnPtBins; ipt++){
\r
884 if (ipt==fnPtBins-1){
\r
885 line=Form("* %5.1f < pt < inf ",fPtBinLimits[ipt]);
\r
888 line=Form("* %5.1f < pt < %4.1f ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);
\r
890 for (Int_t ivar=0; ivar<fnVars; ivar++){
\r
891 line+=Form("* %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);
\r
893 Printf("%s",line.Data());
\r
901 //--------------------------------------------------------------------------
\r
902 Bool_t AliRDHFCuts::RecalcOwnPrimaryVtx(AliAODRecoDecayHF *d,
\r
903 AliAODEvent *aod) const
\r
906 // Recalculate primary vertex without daughters
\r
910 AliError("Can not remove daughters from vertex without AOD event");
\r
914 AliAODVertex *recvtx=d->RemoveDaughtersFromPrimaryVtx(aod);
\r
916 AliDebug(2,"Removal of daughter tracks failed");
\r
921 //set recalculed primary vertex
\r
922 d->SetOwnPrimaryVtx(recvtx);
\r
927 //--------------------------------------------------------------------------
\r
928 Bool_t AliRDHFCuts::SetMCPrimaryVtx(AliAODRecoDecayHF *d,AliAODEvent *aod) const
\r
931 // Recalculate primary vertex without daughters
\r
935 AliError("Can not get MC vertex without AOD event");
\r
940 AliAODMCHeader *mcHeader =
\r
941 (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
\r
943 AliError("Can not get MC vertex without AODMCHeader event");
\r
947 Double_t covmatrix[6]={0.,0.,0.,0.,0.,0.};
\r
948 mcHeader->GetVertex(pos);
\r
949 AliAODVertex *recvtx=new AliAODVertex(pos,covmatrix);
\r
952 AliDebug(2,"Removal of daughter tracks failed");
\r
956 //set recalculed primary vertex
\r
957 d->SetOwnPrimaryVtx(recvtx);
\r
959 d->RecalculateImpPars(recvtx,aod);
\r
965 //--------------------------------------------------------------------------
\r
966 void AliRDHFCuts::CleanOwnPrimaryVtx(AliAODRecoDecayHF *d,
\r
968 AliAODVertex *origownvtx) const
\r
971 // Clean-up own primary vertex if needed
\r
974 if(fRemoveDaughtersFromPrimary || fUseMCVertex) {
\r
975 d->UnsetOwnPrimaryVtx();
\r
977 d->SetOwnPrimaryVtx(origownvtx);
\r
978 delete origownvtx; origownvtx=NULL;
\r
980 d->RecalculateImpPars(d->GetPrimaryVtx(),aod);
\r
983 delete origownvtx; origownvtx=NULL;
\r
988 //--------------------------------------------------------------------------
\r
989 Bool_t AliRDHFCuts::IsSignalMC(AliAODRecoDecay *d,AliAODEvent *aod,Int_t pdg) const
\r
992 // Checks if this candidate is matched to MC signal
\r
995 if(!aod) return kFALSE;
\r
997 // get the MC array
\r
998 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)aod)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
\r
1000 if(!mcArray) return kFALSE;
\r
1003 Int_t label = d->MatchToMC(pdg,mcArray);
\r
1006 //printf("MATCH!\n");
\r