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"
52 //--------------------------------------------------------------------------
53 AliRDHFCuts::AliRDHFCuts(const Char_t* name, const Char_t* title) :
54 AliAnalysisCuts(name,title),
59 fMinSPDMultiplicity(0),
60 fTriggerMask(AliVEvent::kAnyINT),
61 fUseOnlyOneTrigger(kFALSE),
78 fRemoveDaughtersFromPrimary(kFALSE),
79 fRecomputePrimVertex(kFALSE),
81 fUsePhysicsSelection(kTRUE),
93 fKeepSignalMC(kFALSE),
94 fIsCandTrackSPDFirst(kFALSE),
95 fMaxPtCandTrackSPDFirst(0.),
96 fApplySPDDeadPbPb2011(kFALSE),
97 fRemoveTrackletOutliers(kFALSE),
101 // Default Constructor
103 fTriggerClass[0]="CINT1"; fTriggerClass[1]="";
105 //--------------------------------------------------------------------------
106 AliRDHFCuts::AliRDHFCuts(const AliRDHFCuts &source) :
107 AliAnalysisCuts(source),
108 fMinVtxType(source.fMinVtxType),
109 fMinVtxContr(source.fMinVtxContr),
110 fMaxVtxRedChi2(source.fMaxVtxRedChi2),
111 fMaxVtxZ(source.fMaxVtxZ),
112 fMinSPDMultiplicity(source.fMinSPDMultiplicity),
113 fTriggerMask(source.fTriggerMask),
114 fUseOnlyOneTrigger(source.fUseOnlyOneTrigger),
117 fnPtBins(source.fnPtBins),
118 fnPtBinLimits(source.fnPtBinLimits),
120 fnVars(source.fnVars),
122 fnVarsForOpt(source.fnVarsForOpt),
124 fGlobalIndex(source.fGlobalIndex),
127 fUsePID(source.fUsePID),
128 fUseAOD049(source.fUseAOD049),
130 fWhyRejection(source.fWhyRejection),
131 fEvRejectionBits(source.fEvRejectionBits),
132 fRemoveDaughtersFromPrimary(source.fRemoveDaughtersFromPrimary),
133 fRecomputePrimVertex(source.fRecomputePrimVertex),
134 fUseMCVertex(source.fUseMCVertex),
135 fUsePhysicsSelection(source.fUsePhysicsSelection),
136 fOptPileup(source.fOptPileup),
137 fMinContrPileup(source.fMinContrPileup),
138 fMinDzPileup(source.fMinDzPileup),
139 fUseCentrality(source.fUseCentrality),
140 fMinCentrality(source.fMinCentrality),
141 fMaxCentrality(source.fMaxCentrality),
142 fFixRefs(source.fFixRefs),
143 fIsSelectedCuts(source.fIsSelectedCuts),
144 fIsSelectedPID(source.fIsSelectedPID),
145 fMinPtCand(source.fMinPtCand),
146 fMaxPtCand(source.fMaxPtCand),
147 fKeepSignalMC(source.fKeepSignalMC),
148 fIsCandTrackSPDFirst(source.fIsCandTrackSPDFirst),
149 fMaxPtCandTrackSPDFirst(source.fMaxPtCandTrackSPDFirst),
150 fApplySPDDeadPbPb2011(source.fApplySPDDeadPbPb2011),
151 fRemoveTrackletOutliers(source.fRemoveTrackletOutliers),
152 fKinkReject(source.fKinkReject)
157 cout<<"Copy constructor"<<endl;
158 fTriggerClass[0] = source.fTriggerClass[0];
159 fTriggerClass[1] = source.fTriggerClass[1];
160 if(source.GetTrackCuts()) AddTrackCuts(source.GetTrackCuts());
161 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
162 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
163 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
164 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
165 if(source.fPidHF) SetPidHF(source.fPidHF);
169 //--------------------------------------------------------------------------
170 AliRDHFCuts &AliRDHFCuts::operator=(const AliRDHFCuts &source)
173 // assignment operator
175 if(&source == this) return *this;
177 AliAnalysisCuts::operator=(source);
179 fMinVtxType=source.fMinVtxType;
180 fMinVtxContr=source.fMinVtxContr;
181 fMaxVtxRedChi2=source.fMaxVtxRedChi2;
182 fMaxVtxZ=source.fMaxVtxZ;
183 fMinSPDMultiplicity=source.fMinSPDMultiplicity;
184 fTriggerMask=source.fTriggerMask;
185 fUseOnlyOneTrigger=source.fUseOnlyOneTrigger;
186 fTriggerClass[0]=source.fTriggerClass[0];
187 fTriggerClass[1]=source.fTriggerClass[1];
188 fnPtBins=source.fnPtBins;
189 fnPtBinLimits=source.fnPtBinLimits;
190 fnVars=source.fnVars;
191 fGlobalIndex=source.fGlobalIndex;
192 fnVarsForOpt=source.fnVarsForOpt;
193 fUsePID=source.fUsePID;
194 fUseAOD049=source.fUseAOD049;
195 if(fPidHF) delete fPidHF;
196 fPidHF=new AliAODPidHF(*(source.GetPidHF()));
197 fWhyRejection=source.fWhyRejection;
198 fEvRejectionBits=source.fEvRejectionBits;
199 fRemoveDaughtersFromPrimary=source.fRemoveDaughtersFromPrimary;
200 fRecomputePrimVertex=source.fRecomputePrimVertex;
201 fUseMCVertex=source.fUseMCVertex;
202 fUsePhysicsSelection=source.fUsePhysicsSelection;
203 fOptPileup=source.fOptPileup;
204 fMinContrPileup=source.fMinContrPileup;
205 fMinDzPileup=source.fMinDzPileup;
206 fUseCentrality=source.fUseCentrality;
207 fMinCentrality=source.fMinCentrality;
208 fMaxCentrality=source.fMaxCentrality;
209 fFixRefs=source.fFixRefs;
210 fIsSelectedCuts=source.fIsSelectedCuts;
211 fIsSelectedPID=source.fIsSelectedPID;
212 fMinPtCand=source.fMinPtCand;
213 fMaxPtCand=source.fMaxPtCand;
214 fKeepSignalMC=source.fKeepSignalMC;
215 fIsCandTrackSPDFirst=source.fIsCandTrackSPDFirst;
216 fMaxPtCandTrackSPDFirst=source.fMaxPtCandTrackSPDFirst;
217 fApplySPDDeadPbPb2011=source.fApplySPDDeadPbPb2011;
218 fRemoveTrackletOutliers=source.fRemoveTrackletOutliers;
219 fKinkReject=source.fKinkReject;
221 if(source.GetTrackCuts()) {delete fTrackCuts; fTrackCuts=new AliESDtrackCuts(*(source.GetTrackCuts()));}
222 if(source.fPtBinLimits) SetPtBins(source.fnPtBinLimits,source.fPtBinLimits);
223 if(source.fVarNames) SetVarNames(source.fnVars,source.fVarNames,source.fIsUpperCut);
224 if(source.fCutsRD) SetCuts(source.fGlobalIndex,source.fCutsRD);
225 if(source.fVarsForOpt) SetVarsForOpt(source.fnVarsForOpt,source.fVarsForOpt);
230 //--------------------------------------------------------------------------
231 AliRDHFCuts::~AliRDHFCuts() {
233 // Default Destructor
235 if(fPtBinLimits) {delete [] fPtBinLimits; fPtBinLimits=0;}
236 if(fVarNames) {delete [] fVarNames; fVarNames=0;}
237 if(fVarsForOpt) {delete [] fVarsForOpt; fVarsForOpt=0;}
242 if(fIsUpperCut) {delete [] fIsUpperCut; fIsUpperCut=0;}
248 //---------------------------------------------------------------------------
249 Int_t AliRDHFCuts::IsEventSelectedInCentrality(AliVEvent *event) {
251 // Centrality selection
253 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid){
254 AliWarning("Centrality estimator not valid");
257 Float_t centvalue=GetCentrality((AliAODEvent*)event);
258 if (centvalue<-998.){//-999 if no centralityP
261 if (centvalue<fMinCentrality || centvalue>fMaxCentrality){
268 //---------------------------------------------------------------------------
269 Bool_t AliRDHFCuts::IsEventSelected(AliVEvent *event) {
273 //if(fTriggerMask && event->GetTriggerMask()!=fTriggerMask) return kFALSE;
279 if(fRecomputePrimVertex){
280 Bool_t vertOK= RecomputePrimaryVertex((AliAODEvent*)event);
289 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)event)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
290 if(mcArray) {isMC=kTRUE;fUseAOD049=kFALSE;}
292 // settings for the TPC dE/dx BB parameterization
294 if(fPidHF->GetPidResponse()==0x0){
295 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
296 AliInputEventHandler *inputHandler=(AliInputEventHandler*)mgr->GetInputEventHandler();
297 AliPIDResponse *pidResp=inputHandler->GetPIDResponse();
298 fPidHF->SetPidResponse(pidResp);
300 if(fPidHF->GetOldPid()) {
301 // pp, from LHC10d onwards
302 if((event->GetRunNumber()>121693 && event->GetRunNumber()<136851) ||
303 event->GetRunNumber()>139517) fPidHF->SetOnePad(kTRUE);
304 // pp, 2011 low energy run
305 if((event->GetRunNumber()>=146686 && event->GetRunNumber()<=146860)){
306 fPidHF->SetppLowEn2011(kTRUE);
307 fPidHF->SetOnePad(kFALSE);
310 if(event->GetRunNumber()>=136851 && event->GetRunNumber()<=139517) fPidHF->SetPbPb(kTRUE);
312 if(isMC) fPidHF->SetMC(kTRUE);
313 if(isMC && (event->GetRunNumber()>=146686 && event->GetRunNumber()<=146860))
314 fPidHF->SetMClowenpp2011(kTRUE);
315 fPidHF->SetBetheBloch();
317 // check that AliPIDResponse object was properly set in case of using OADB
318 if(fPidHF->GetPidResponse()==0x0) AliFatal("AliPIDResponse object not set");
324 TString firedTriggerClasses=((AliAODEvent*)event)->GetFiredTriggerClasses();
325 // don't do for MC and for PbPb 2010 data
326 if(!isMC && (event->GetRunNumber()<136851 || event->GetRunNumber()>139517)) {
327 if(!firedTriggerClasses.Contains(fTriggerClass[0].Data()) &&
328 (fTriggerClass[1].CompareTo("")==0 || !firedTriggerClasses.Contains(fTriggerClass[1].Data())) ) {
330 fEvRejectionBits+=1<<kNotSelTrigger;
335 // TEMPORARY FIX FOR REFERENCES
336 // Fix references to daughter tracks
338 // AliAnalysisVertexingHF *fixer = new AliAnalysisVertexingHF();
339 // fixer->FixReferences((AliAODEvent*)event);
345 // physics selection requirements
346 if(fUsePhysicsSelection){
347 Bool_t isSelected = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & fTriggerMask);
349 if(accept) fWhyRejection=7;
350 fEvRejectionBits+=1<<kPhysicsSelection;
353 if(fUseOnlyOneTrigger){
354 if(((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected()!=fTriggerMask){
355 if(accept) fWhyRejection=7;
356 fEvRejectionBits+=1<<kPhysicsSelection;
363 // vertex requirements
365 const AliVVertex *vertex = event->GetPrimaryVertex();
369 fEvRejectionBits+=1<<kNoVertex;
371 TString title=vertex->GetTitle();
372 if(title.Contains("Z") && fMinVtxType>1){
374 fEvRejectionBits+=1<<kNoVertex;
376 else if(title.Contains("3D") && fMinVtxType>2){
378 fEvRejectionBits+=1<<kNoVertex;
380 if(vertex->GetNContributors()<fMinVtxContr){
382 fEvRejectionBits+=1<<kTooFewVtxContrib;
384 if(TMath::Abs(vertex->GetZ())>fMaxVtxZ) {
385 fEvRejectionBits+=1<<kZVtxOutFid;
386 if(accept) fWhyRejection=6;
393 if(fOptPileup==kRejectPileupEvent){
394 Int_t cutc=(Int_t)fMinContrPileup;
395 Double_t cutz=(Double_t)fMinDzPileup;
396 if(event->IsPileupFromSPD(cutc,cutz,3.,2.,10.)) {
397 if(accept) fWhyRejection=1;
398 fEvRejectionBits+=1<<kPileupSPD;
403 // centrality selection
404 if (fUseCentrality!=kCentOff) {
405 Int_t rejection=IsEventSelectedInCentrality(event);
407 if(accept) fWhyRejection=rejection;
408 fEvRejectionBits+=1<<kOutsideCentrality;
413 // PbPb2011 outliers in tracklets vs. VZERO
414 if(!isMC && event->GetRunNumber()>=167693 && event->GetRunNumber()<=170593){
415 if(fRemoveTrackletOutliers){
416 Double_t v0cent=GetCentrality((AliAODEvent*)event,kCentV0M);
417 Double_t ntracklets=((AliAODEvent*)event)->GetTracklets()->GetNumberOfTracklets();
418 Double_t cutval=60.-0.08*ntracklets+1./50000.*ntracklets*ntracklets;
420 if(accept) fWhyRejection=2;
421 fEvRejectionBits+=1<<kOutsideCentrality;
429 //---------------------------------------------------------------------------
430 Bool_t AliRDHFCuts::AreDaughtersSelected(AliAODRecoDecayHF *d) const {
432 // Daughter tracks selection
434 if(!fTrackCuts) return kTRUE;
436 Int_t ndaughters = d->GetNDaughters();
437 AliAODVertex *vAOD = d->GetPrimaryVtx();
438 Double_t pos[3],cov[6];
440 vAOD->GetCovarianceMatrix(cov);
441 const AliESDVertex vESD(pos,cov,100.,100);
445 for(Int_t idg=0; idg<ndaughters; idg++) {
446 AliAODTrack *dgTrack = (AliAODTrack*)d->GetDaughter(idg);
447 if(!dgTrack) {retval = kFALSE; continue;}
448 //printf("charge %d\n",dgTrack->Charge());
449 if(dgTrack->Charge()==0) continue; // it's not a track, but a V0
451 if(fIsCandTrackSPDFirst && d->Pt()<fMaxPtCandTrackSPDFirst)
452 { if(!dgTrack->HasPointOnITSLayer(0)) { retval = kFALSE; continue; } }
454 if(!IsDaughterSelected(dgTrack,&vESD,fTrackCuts)) retval = kFALSE;
459 //---------------------------------------------------------------------------
460 Bool_t AliRDHFCuts::IsDaughterSelected(AliAODTrack *track,const AliESDVertex *primary,AliESDtrackCuts *cuts) const {
462 // Convert to ESDtrack, relate to vertex and check cuts
464 if(!cuts) return kTRUE;
466 if(cuts->GetFlagCutTOFdistance()) cuts->SetFlagCutTOFdistance(kFALSE);
470 // convert to ESD track here
471 AliESDtrack esdTrack(track);
472 // set the TPC cluster info
473 esdTrack.SetTPCClusterMap(track->GetTPCClusterMap());
474 esdTrack.SetTPCSharedMap(track->GetTPCSharedMap());
475 esdTrack.SetTPCPointsF(track->GetTPCNclsF());
476 // needed to calculate the impact parameters
477 esdTrack.RelateToVertex(primary,0.,3.);
479 if(!cuts->IsSelected(&esdTrack)) retval = kFALSE;
483 AliAODVertex *maybeKink=track->GetProdVertex();
484 if(maybeKink->GetType()==AliAODVertex::kKink) retval=kFALSE;
487 if(fOptPileup==kRejectTracksFromPileupVertex){
489 // we need either to have here the AOD Event,
490 // or to have the pileup vertex object
493 if(fApplySPDDeadPbPb2011){
494 Bool_t deadSPDLay1PbPb2011[20][4]={
495 {kTRUE,kTRUE,kTRUE,kTRUE},
496 {kTRUE,kTRUE,kTRUE,kTRUE},
497 {kTRUE,kTRUE,kTRUE,kTRUE},
498 {kTRUE,kTRUE,kTRUE,kTRUE},
499 {kTRUE,kTRUE,kTRUE,kTRUE},
500 {kFALSE,kFALSE,kTRUE,kTRUE},
501 {kTRUE,kTRUE,kFALSE,kFALSE},
502 {kTRUE,kTRUE,kTRUE,kTRUE},
503 {kFALSE,kFALSE,kTRUE,kTRUE},
504 {kTRUE,kTRUE,kTRUE,kTRUE},
505 {kTRUE,kTRUE,kFALSE,kFALSE},
506 {kTRUE,kTRUE,kTRUE,kTRUE},
507 {kFALSE,kFALSE,kFALSE,kFALSE},
508 {kFALSE,kFALSE,kTRUE,kTRUE},
509 {kFALSE,kFALSE,kFALSE,kFALSE},
510 {kFALSE,kFALSE,kFALSE,kFALSE},
511 {kTRUE,kTRUE,kTRUE,kTRUE},
512 {kTRUE,kTRUE,kFALSE,kFALSE},
513 {kFALSE,kFALSE,kFALSE,kFALSE},
514 {kFALSE,kFALSE,kFALSE,kFALSE}
516 Bool_t deadSPDLay2PbPb2011[40][4]={
517 {kTRUE,kTRUE,kTRUE,kTRUE},
518 {kTRUE,kTRUE,kTRUE,kTRUE},
519 {kTRUE,kTRUE,kTRUE,kTRUE},
520 {kTRUE,kTRUE,kTRUE,kTRUE},
521 {kTRUE,kTRUE,kTRUE,kTRUE},
522 {kTRUE,kTRUE,kTRUE,kTRUE},
523 {kTRUE,kTRUE,kTRUE,kTRUE},
524 {kTRUE,kTRUE,kTRUE,kTRUE},
525 {kTRUE,kTRUE,kTRUE,kTRUE},
526 {kTRUE,kTRUE,kTRUE,kTRUE},
527 {kTRUE,kTRUE,kTRUE,kTRUE},
528 {kTRUE,kTRUE,kTRUE,kTRUE},
529 {kFALSE,kFALSE,kFALSE,kFALSE},
530 {kFALSE,kFALSE,kTRUE,kTRUE},
531 {kTRUE,kTRUE,kTRUE,kTRUE},
532 {kTRUE,kTRUE,kTRUE,kTRUE},
533 {kTRUE,kTRUE,kFALSE,kFALSE},
534 {kTRUE,kTRUE,kTRUE,kTRUE},
535 {kTRUE,kTRUE,kTRUE,kTRUE},
536 {kTRUE,kTRUE,kTRUE,kTRUE},
537 {kFALSE,kFALSE,kFALSE,kFALSE},
538 {kFALSE,kFALSE,kFALSE,kFALSE},
539 {kTRUE,kTRUE,kTRUE,kTRUE},
540 {kTRUE,kTRUE,kTRUE,kTRUE},
541 {kFALSE,kFALSE,kFALSE,kFALSE},
542 {kFALSE,kFALSE,kFALSE,kFALSE},
543 {kTRUE,kTRUE,kTRUE,kTRUE},
544 {kTRUE,kTRUE,kTRUE,kTRUE},
545 {kFALSE,kFALSE,kFALSE,kFALSE},
546 {kFALSE,kFALSE,kFALSE,kFALSE},
547 {kFALSE,kFALSE,kFALSE,kFALSE},
548 {kFALSE,kFALSE,kFALSE,kFALSE},
549 {kTRUE,kTRUE,kTRUE,kTRUE},
550 {kTRUE,kTRUE,kTRUE,kTRUE},
551 {kTRUE,kTRUE,kFALSE,kFALSE},
552 {kTRUE,kTRUE,kTRUE,kTRUE},
553 {kFALSE,kFALSE,kFALSE,kFALSE},
554 {kFALSE,kFALSE,kFALSE,kFALSE},
555 {kFALSE,kFALSE,kFALSE,kFALSE},
556 {kFALSE,kFALSE,kFALSE,kFALSE}
558 Double_t xyz1[3],xyz2[3];
559 esdTrack.GetXYZAt(3.9,0.,xyz1);
560 esdTrack.GetXYZAt(7.6,0.,xyz2);
561 Double_t phi1=TMath::ATan2(xyz1[1],xyz1[0]);
562 if(phi1<0) phi1+=2*TMath::Pi();
563 Int_t lad1=(Int_t)(phi1/(2.*TMath::Pi()/20.));
564 Double_t phi2=TMath::ATan2(xyz2[1],xyz2[0]);
565 if(phi2<0) phi2+=2*TMath::Pi();
566 Int_t lad2=(Int_t)(phi2/(2.*TMath::Pi()/40.));
567 Int_t mod1=(Int_t)((xyz1[2]+14)/7.);
568 Int_t mod2=(Int_t)((xyz2[2]+14)/7.);
569 Bool_t lay1ok=kFALSE;
570 if(mod1>=0 && mod1<4 && lad1<20){
571 lay1ok=deadSPDLay1PbPb2011[lad1][mod1];
573 Bool_t lay2ok=kFALSE;
574 if(mod2>=0 && mod2<4 && lad2<40){
575 lay2ok=deadSPDLay2PbPb2011[lad2][mod2];
577 if(!lay1ok && !lay2ok) retval=kFALSE;
582 //---------------------------------------------------------------------------
583 void AliRDHFCuts::SetPtBins(Int_t nPtBinLimits,Float_t *ptBinLimits) {
587 delete [] fPtBinLimits;
589 printf("Changing the pt bins\n");
592 if(nPtBinLimits != fnPtBins+1){
593 cout<<"Warning: ptBinLimits dimention "<<nPtBinLimits<<" != nPtBins+1 ("<<fnPtBins+1<<")\nSetting nPtBins to "<<nPtBinLimits-1<<endl;
594 SetNPtBins(nPtBinLimits-1);
597 fnPtBinLimits = nPtBinLimits;
599 //cout<<"Changing also Global Index -> "<<fGlobalIndex<<endl;
600 fPtBinLimits = new Float_t[fnPtBinLimits];
601 for(Int_t ib=0; ib<nPtBinLimits; ib++) fPtBinLimits[ib]=ptBinLimits[ib];
605 //---------------------------------------------------------------------------
606 void AliRDHFCuts::SetVarNames(Int_t nVars,TString *varNames,Bool_t *isUpperCut){
607 // Set the variable names
612 //printf("Changing the variable names\n");
615 printf("Wrong number of variables: it has to be %d\n",fnVars);
619 fVarNames = new TString[nVars];
620 fIsUpperCut = new Bool_t[nVars];
621 for(Int_t iv=0; iv<nVars; iv++) {
622 fVarNames[iv] = varNames[iv];
623 fIsUpperCut[iv] = isUpperCut[iv];
628 //---------------------------------------------------------------------------
629 void AliRDHFCuts::SetVarsForOpt(Int_t nVars,Bool_t *forOpt) {
630 // Set the variables to be used for cuts optimization
633 delete [] fVarsForOpt;
635 //printf("Changing the variables for cut optimization\n");
638 if(nVars==0){//!=fnVars) {
639 printf("%d not accepted as number of variables: it has to be %d\n",nVars,fnVars);
644 fVarsForOpt = new Bool_t[fnVars];
645 for(Int_t iv=0; iv<fnVars; iv++) {
646 fVarsForOpt[iv]=forOpt[iv];
647 if(fVarsForOpt[iv]) fnVarsForOpt++;
653 //---------------------------------------------------------------------------
654 void AliRDHFCuts::SetUseCentrality(Int_t flag) {
656 // set centrality estimator
659 if(fUseCentrality<kCentOff||fUseCentrality>=kCentInvalid) AliWarning("Centrality estimator not valid");
665 //---------------------------------------------------------------------------
666 void AliRDHFCuts::SetCuts(Int_t nVars,Int_t nPtBins,Float_t **cutsRD) {
671 printf("Wrong number of variables: it has to be %d\n",fnVars);
674 if(nPtBins!=fnPtBins) {
675 printf("Wrong number of pt bins: it has to be %d\n",fnPtBins);
679 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
682 for(Int_t iv=0; iv<fnVars; iv++) {
684 for(Int_t ib=0; ib<fnPtBins; ib++) {
687 if(GetGlobalIndex(iv,ib)>=fGlobalIndex) {
688 cout<<"Overflow, exit..."<<endl;
692 fCutsRD[GetGlobalIndex(iv,ib)] = cutsRD[iv][ib];
698 //---------------------------------------------------------------------------
699 void AliRDHFCuts::SetCuts(Int_t glIndex,Float_t* cutsRDGlob){
703 if(glIndex != fGlobalIndex){
704 cout<<"Wrong array size: it has to be "<<fGlobalIndex<<endl;
707 if(!fCutsRD) fCutsRD = new Float_t[fGlobalIndex];
709 for(Int_t iGl=0;iGl<fGlobalIndex;iGl++){
710 fCutsRD[iGl] = cutsRDGlob[iGl];
714 //---------------------------------------------------------------------------
715 void AliRDHFCuts::PrintAll() const {
717 // print all cuts values
720 printf("Minimum vtx type %d\n",fMinVtxType);
721 printf("Minimum vtx contr %d\n",fMinVtxContr);
722 printf("Max vtx red chi2 %f\n",fMaxVtxRedChi2);
723 printf("Min SPD mult %d\n",fMinSPDMultiplicity);
724 printf("Use PID %d\n",(Int_t)fUsePID);
725 printf("Remove daughters from vtx %d\n",(Int_t)fRemoveDaughtersFromPrimary);
726 printf("Recompute primary vertex %d\n",(Int_t)fRecomputePrimVertex);
727 printf("Physics selection: %s\n",fUsePhysicsSelection ? "Yes" : "No");
728 printf("Pileup rejection: %s\n",(fOptPileup > 0) ? "Yes" : "No");
729 if(fOptPileup==1) printf(" -- Reject pileup event");
730 if(fOptPileup==2) printf(" -- Reject tracks from pileup vtx");
731 if(fUseCentrality>0) {
732 TString estimator="";
733 if(fUseCentrality==1) estimator = "V0";
734 if(fUseCentrality==2) estimator = "Tracks";
735 if(fUseCentrality==3) estimator = "Tracklets";
736 if(fUseCentrality==4) estimator = "SPD clusters outer";
737 printf("Centrality class considered: %.1f-%.1f, estimated with %s",fMinCentrality,fMaxCentrality,estimator.Data());
739 if(fIsCandTrackSPDFirst) printf("Check for candidates with pt < %2.2f, that daughters fullfill kFirst criteria\n",fMaxPtCandTrackSPDFirst);
742 cout<<"Array of variables"<<endl;
743 for(Int_t iv=0;iv<fnVars;iv++){
744 cout<<fVarNames[iv]<<"\t";
749 cout<<"Array of optimization"<<endl;
750 for(Int_t iv=0;iv<fnVars;iv++){
751 cout<<fVarsForOpt[iv]<<"\t";
756 cout<<"Array of upper/lower cut"<<endl;
757 for(Int_t iv=0;iv<fnVars;iv++){
758 cout<<fIsUpperCut[iv]<<"\t";
763 cout<<"Array of ptbin limits"<<endl;
764 for(Int_t ib=0;ib<fnPtBinLimits;ib++){
765 cout<<fPtBinLimits[ib]<<"\t";
770 cout<<"Matrix of cuts"<<endl;
771 for(Int_t iv=0;iv<fnVars;iv++){
772 for(Int_t ib=0;ib<fnPtBins;ib++){
773 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<"\t";
782 //--------------------------------------------------------------------------
783 void AliRDHFCuts::PrintTrigger() const{
784 // print the trigger selection
786 printf("Selected trigger classes: %s %s\n",fTriggerClass[0].Data(),fTriggerClass[1].Data());
788 cout<<" Trigger selection pattern: ";
789 if( fTriggerMask & AliVEvent::kAny ) cout<<" kAny ";
790 if( fTriggerMask & AliVEvent::kAnyINT ) cout<<" kAnyINT ";
791 if( fTriggerMask & AliVEvent::kINT7 ) cout<<" kINT7 ";
792 if( fTriggerMask & AliVEvent::kMB ) cout<<" kMB ";
793 if( fTriggerMask & AliVEvent::kCINT5 ) cout<<" kCINT5 ";
794 if( fTriggerMask & AliVEvent::kCentral ) cout<<" kCentral ";
795 if( fTriggerMask & AliVEvent::kSemiCentral ) cout<<" kSemiCentral ";
796 if( fTriggerMask & AliVEvent::kEMCEGA ) cout<<" kEMCEGA ";
797 if( fTriggerMask & AliVEvent::kHighMult ) cout<<" kHighMult ";
798 if( fTriggerMask & AliVEvent::kFastOnly ) cout<<" kFastOnly ";
803 //---------------------------------------------------------------------------
804 void AliRDHFCuts::GetCuts(Float_t**& cutsRD) const{
809 //cout<<"Give back a "<<fnVars<<"x"<<fnPtBins<<" matrix."<<endl;
814 //cout<<"Initialization..."<<endl;
815 cutsRD=new Float_t*[fnVars];
816 for(iv=0; iv<fnVars; iv++) {
817 cutsRD[iv] = new Float_t[fnPtBins];
821 for(Int_t iGlobal=0; iGlobal<fGlobalIndex; iGlobal++) {
822 GetVarPtIndex(iGlobal,iv,ib);
823 cutsRD[iv][ib] = fCutsRD[iGlobal];
829 //---------------------------------------------------------------------------
830 Int_t AliRDHFCuts::GetGlobalIndex(Int_t iVar,Int_t iPtBin) const{
832 // give the global index from variable and pt bin
834 return iPtBin*fnVars+iVar;
837 //---------------------------------------------------------------------------
838 void AliRDHFCuts::GetVarPtIndex(Int_t iGlob, Int_t& iVar, Int_t& iPtBin) const {
840 //give the index of the variable and of the pt bin from the global index
842 iPtBin=(Int_t)iGlob/fnVars;
848 //---------------------------------------------------------------------------
849 Int_t AliRDHFCuts::PtBin(Double_t pt) const {
851 //give the pt bin where the pt lies.
854 if(pt<fPtBinLimits[0])return ptbin;
855 for (Int_t i=0;i<fnPtBins;i++){
856 if(pt<fPtBinLimits[i+1]) {
863 //-------------------------------------------------------------------
864 Float_t AliRDHFCuts::GetCutValue(Int_t iVar,Int_t iPtBin) const {
866 // Give the value of cut set for the variable iVar and the pt bin iPtBin
869 cout<<"Cuts not iniziaisez yet"<<endl;
872 return fCutsRD[GetGlobalIndex(iVar,iPtBin)];
874 //-------------------------------------------------------------------
875 Float_t AliRDHFCuts::GetCentrality(AliAODEvent* aodEvent,AliRDHFCuts::ECentrality estimator) {
877 // Get centrality percentile
880 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)aodEvent)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
881 if(mcArray) {fUseAOD049=kFALSE;}
883 AliAODHeader *header=aodEvent->GetHeader();
884 AliCentrality *centrality=header->GetCentralityP();
886 Bool_t isSelRun=kFALSE;
887 Int_t selRun[5]={138364, 138826, 138828, 138836, 138871};
888 if(!centrality) return cent;
890 if (estimator==kCentV0M){
891 cent=(Float_t)(centrality->GetCentralityPercentile("V0M"));
893 Int_t quality = centrality->GetQuality();
895 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("V0M");
897 Int_t runnum=aodEvent->GetRunNumber();
898 for(Int_t ir=0;ir<5;ir++){
899 if(runnum==selRun[ir]){
904 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("V0M");
908 //temporary fix for AOD049 outliers
909 if(fUseAOD049&¢>=0){
911 AliAODVZERO* aodV0 = aodEvent->GetVZEROData();
912 v0+=aodV0->GetMTotV0A();
913 v0+=aodV0->GetMTotV0C();
914 if(cent==0&&v0<19500)return -1;//filtering issue
915 Float_t tkl = (Float_t)(aodEvent->GetTracklets()->GetNumberOfTracklets());
916 Float_t val= 1.30552 + 0.147931 * v0;
917 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};
918 if ( TMath::Abs(tkl-val) > 6.*tklSigma[(Int_t)cent] )return -1;//outlier
922 if (estimator==kCentTRK) {
923 cent=(Float_t)(centrality->GetCentralityPercentile("TRK"));
925 Int_t quality = centrality->GetQuality();
927 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TRK");
929 Int_t runnum=aodEvent->GetRunNumber();
930 for(Int_t ir=0;ir<5;ir++){
931 if(runnum==selRun[ir]){
936 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TRK");
941 if (estimator==kCentTKL){
942 cent=(Float_t)(centrality->GetCentralityPercentile("TKL"));
944 Int_t quality = centrality->GetQuality();
946 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TKL");
948 Int_t runnum=aodEvent->GetRunNumber();
949 for(Int_t ir=0;ir<5;ir++){
950 if(runnum==selRun[ir]){
955 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("TKL");
960 if (estimator==kCentCL1){
961 cent=(Float_t)(centrality->GetCentralityPercentile("CL1"));
963 Int_t quality = centrality->GetQuality();
965 cent=(Float_t)centrality->GetCentralityPercentileUnchecked("CL1");
967 Int_t runnum=aodEvent->GetRunNumber();
968 for(Int_t ir=0;ir<5;ir++){
969 if(runnum==selRun[ir]){
974 if((quality==8||quality==9)&&isSelRun)cent=(Float_t)centrality->GetCentralityPercentileUnchecked("CL1");
979 AliWarning("Centrality estimator not valid");
988 //-------------------------------------------------------------------
989 Bool_t AliRDHFCuts::CompareCuts(const AliRDHFCuts *obj) const {
991 // Compare two cuts objects
994 Bool_t areEqual=kTRUE;
996 if(fMinVtxType!=obj->fMinVtxType) { printf("Minimum vtx type %d %d\n",fMinVtxType,obj->fMinVtxType); areEqual=kFALSE;}
998 if(fMinVtxContr!=obj->fMinVtxContr) { printf("Minimum vtx contr %d %d\n",fMinVtxContr,obj->fMinVtxContr); areEqual=kFALSE;}
1000 if(TMath::Abs(fMaxVtxRedChi2-obj->fMaxVtxRedChi2)>1.e-10) { printf("Max vtx red chi2 %f %f\n",fMaxVtxRedChi2,obj->fMaxVtxRedChi2);areEqual=kFALSE;}
1002 if(fMinSPDMultiplicity!=obj->fMinSPDMultiplicity) { printf("Min SPD mult %d\n %d",fMinSPDMultiplicity,obj->fMinSPDMultiplicity);areEqual=kFALSE;}
1004 if(fUsePID!=obj->fUsePID) { printf("Use PID %d %d\n",(Int_t)fUsePID,(Int_t)obj->fUsePID); areEqual=kFALSE;}
1006 if(fRemoveDaughtersFromPrimary!=obj->fRemoveDaughtersFromPrimary) {printf("Remove daughters from vtx %d %d\n",(Int_t)fRemoveDaughtersFromPrimary,(Int_t)obj->fRemoveDaughtersFromPrimary); areEqual=kFALSE;}
1008 if(fTrackCuts->GetMinNClusterTPC()!=obj->fTrackCuts->GetMinNClusterTPC()) {printf("MinNClsTPC %d %d\n",fTrackCuts->GetMinNClusterTPC(),obj->fTrackCuts->GetMinNClusterTPC()); areEqual=kFALSE;}
1010 if(fTrackCuts->GetMinNClustersITS()!=obj->fTrackCuts->GetMinNClustersITS()) {printf("MinNClsITS %d %d\n",fTrackCuts->GetMinNClustersITS(),obj->fTrackCuts->GetMinNClustersITS()); areEqual=kFALSE;}
1012 if(TMath::Abs(fTrackCuts->GetMaxChi2PerClusterTPC()-obj->fTrackCuts->GetMaxChi2PerClusterTPC())>1.e-10) {printf("MaxChi2ClsTPC %f %f\n",fTrackCuts->GetMaxChi2PerClusterTPC(),obj->fTrackCuts->GetMaxChi2PerClusterTPC()); areEqual=kFALSE;}
1014 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;}
1018 for(Int_t iv=0;iv<fnVars;iv++) {
1019 for(Int_t ib=0;ib<fnPtBins;ib++) {
1020 if(TMath::Abs(fCutsRD[GetGlobalIndex(iv,ib)]-obj->fCutsRD[GetGlobalIndex(iv,ib)])>1.e-10) {
1021 cout<<"fCutsRD["<<iv<<"]["<<ib<<"] = "<<fCutsRD[GetGlobalIndex(iv,ib)]<<" "<<obj->fCutsRD[GetGlobalIndex(iv,ib)]<<"\n";
1030 //---------------------------------------------------------------------------
1031 void AliRDHFCuts::MakeTable() const {
1033 // print cuts values in table format
1036 TString ptString = "pT range";
1037 if(fVarNames && fPtBinLimits && fCutsRD){
1038 TString firstLine(Form("* %-15s",ptString.Data()));
1039 for (Int_t ivar=0; ivar<fnVars; ivar++){
1040 firstLine+=Form("* %-15s ",fVarNames[ivar].Data());
1041 if (ivar == fnVars){
1045 Printf("%s",firstLine.Data());
1047 for (Int_t ipt=0; ipt<fnPtBins; ipt++){
1049 if (ipt==fnPtBins-1){
1050 line=Form("* %5.1f < pt < inf ",fPtBinLimits[ipt]);
1053 line=Form("* %5.1f < pt < %4.1f ",fPtBinLimits[ipt],fPtBinLimits[ipt+1]);
1055 for (Int_t ivar=0; ivar<fnVars; ivar++){
1056 line+=Form("* %-15f ",fCutsRD[GetGlobalIndex(ivar,ipt)]);
1058 Printf("%s",line.Data());
1066 //--------------------------------------------------------------------------
1067 Bool_t AliRDHFCuts::RecalcOwnPrimaryVtx(AliAODRecoDecayHF *d,
1068 AliAODEvent *aod) const
1071 // Recalculate primary vertex without daughters
1075 AliError("Can not remove daughters from vertex without AOD event");
1079 AliAODVertex *recvtx=d->RemoveDaughtersFromPrimaryVtx(aod);
1081 AliDebug(2,"Removal of daughter tracks failed");
1086 //set recalculed primary vertex
1087 d->SetOwnPrimaryVtx(recvtx);
1092 //--------------------------------------------------------------------------
1093 Bool_t AliRDHFCuts::SetMCPrimaryVtx(AliAODRecoDecayHF *d,AliAODEvent *aod) const
1096 // Recalculate primary vertex without daughters
1100 AliError("Can not get MC vertex without AOD event");
1105 AliAODMCHeader *mcHeader =
1106 (AliAODMCHeader*)aod->GetList()->FindObject(AliAODMCHeader::StdBranchName());
1108 AliError("Can not get MC vertex without AODMCHeader event");
1112 Double_t covmatrix[6]={0.,0.,0.,0.,0.,0.};
1113 mcHeader->GetVertex(pos);
1114 AliAODVertex *recvtx=new AliAODVertex(pos,covmatrix);
1117 AliDebug(2,"Removal of daughter tracks failed");
1121 //set recalculed primary vertex
1122 d->SetOwnPrimaryVtx(recvtx);
1124 d->RecalculateImpPars(recvtx,aod);
1130 //--------------------------------------------------------------------------
1131 void AliRDHFCuts::CleanOwnPrimaryVtx(AliAODRecoDecayHF *d,
1133 AliAODVertex *origownvtx) const
1136 // Clean-up own primary vertex if needed
1139 if(fRemoveDaughtersFromPrimary || fUseMCVertex) {
1140 d->UnsetOwnPrimaryVtx();
1142 d->SetOwnPrimaryVtx(origownvtx);
1143 delete origownvtx; origownvtx=NULL;
1145 d->RecalculateImpPars(d->GetPrimaryVtx(),aod);
1148 delete origownvtx; origownvtx=NULL;
1153 //--------------------------------------------------------------------------
1154 Bool_t AliRDHFCuts::IsSignalMC(AliAODRecoDecay *d,AliAODEvent *aod,Int_t pdg) const
1157 // Checks if this candidate is matched to MC signal
1160 if(!aod) return kFALSE;
1163 TClonesArray *mcArray = (TClonesArray*)((AliAODEvent*)aod)->GetList()->FindObject(AliAODMCParticle::StdBranchName());
1165 if(!mcArray) return kFALSE;
1168 Int_t label = d->MatchToMC(pdg,mcArray);
1171 //printf("MATCH!\n");
1179 //--------------------------------------------------------------------------
1180 Bool_t AliRDHFCuts::RecomputePrimaryVertex(AliAODEvent* event) const{
1181 // recompute event primary vertex from AOD tracks
1183 AliVertexerTracks *vertexer = new AliVertexerTracks(event->GetMagneticField());
1184 vertexer->SetITSMode();
1185 vertexer->SetMinClusters(3);
1187 AliAODVertex* pvtx=event->GetPrimaryVertex();
1188 if(strstr(pvtx->GetTitle(),"VertexerTracksWithConstraint")) {
1189 Float_t diamondcovxy[3];
1190 event->GetDiamondCovXY(diamondcovxy);
1191 Double_t pos[3]={event->GetDiamondX(),event->GetDiamondY(),0.};
1192 Double_t cov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,10.*10.};
1193 AliESDVertex *diamond = new AliESDVertex(pos,cov,1.,1);
1194 vertexer->SetVtxStart(diamond);
1195 delete diamond; diamond=NULL;
1198 AliESDVertex* vertexESD = (AliESDVertex*)vertexer->FindPrimaryVertex(event);
1199 if(!vertexESD) return kFALSE;
1200 if(vertexESD->GetNContributors()<=0) {
1201 //AliDebug(2,"vertexing failed");
1202 delete vertexESD; vertexESD=NULL;
1205 delete vertexer; vertexer=NULL;
1207 // convert to AliAODVertex
1208 Double_t pos[3],cov[6],chi2perNDF;
1209 vertexESD->GetXYZ(pos); // position
1210 vertexESD->GetCovMatrix(cov); //covariance matrix
1211 chi2perNDF = vertexESD->GetChi2toNDF();
1212 delete vertexESD; vertexESD=NULL;
1214 pvtx->SetPosition(pos[0],pos[1],pos[2]);
1215 pvtx->SetChi2perNDF(chi2perNDF);
1216 pvtx->SetCovMatrix(cov);