1 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * Author: The ALICE Off-line Project. *
4 * Contributors are mentioned in the code where appropriate. *
6 * Permission to use, copy, modify and distribute this software and its *
7 * documentation strictly for non-commercial purposes is hereby granted *
8 * without fee, provided that the above copyright notice appears in all *
9 * copies and that both the copyright notice and this permission notice *
10 * appear in the supporting documentation. The authors make no claims *
11 * about the suitability of this software for any purpose. It is *
12 * provided "as is" without express or implied warranty. *
13 **************************************************************************/
18 // An event cut class for the flow framework
20 // origin: Mikolaj Krzewicki (mikolaj.krzewicki@cern.ch)
30 #include "AliVVertex.h"
31 #include "AliVEvent.h"
32 #include "AliESDEvent.h"
33 #include "AliAODEvent.h"
34 #include "AliAODHeader.h"
35 #include "AliCentrality.h"
36 #include "AliESDVZERO.h"
37 #include "AliMultiplicity.h"
38 #include "AliMCEvent.h"
39 #include "AliFlowEventCuts.h"
40 #include "AliFlowTrackCuts.h"
41 #include "AliTriggerAnalysis.h"
42 #include "AliCollisionGeometry.h"
43 #include "AliGenEventHeader.h"
47 ClassImp(AliFlowEventCuts)
49 //-----------------------------------------------------------------------
50 AliFlowEventCuts::AliFlowEventCuts():
51 AliFlowEventSimpleCuts(),
53 fCutNumberOfTracks(kFALSE),
54 fNumberOfTracksMax(INT_MAX),
55 fNumberOfTracksMin(INT_MIN),
57 fRefMultMethod(kTPConly),
58 fUseAliESDtrackCutsRefMult(kFALSE),
59 fRefMultMethodAliESDtrackCuts(AliESDtrackCuts::kTrackletsITSTPC),
64 fStandardTPCcuts(NULL),
65 fStandardGlobalCuts(NULL),
66 fCutPrimaryVertexX(kFALSE),
67 fPrimaryVertexXmax(INT_MAX),
68 fPrimaryVertexXmin(INT_MIN),
69 fCutPrimaryVertexY(kFALSE),
70 fPrimaryVertexYmax(INT_MAX),
71 fPrimaryVertexYmin(INT_MIN),
72 fCutPrimaryVertexZ(kFALSE),
73 fPrimaryVertexZmax(INT_MAX),
74 fPrimaryVertexZmin(INT_MIN),
75 fCutNContributors(kFALSE),
76 fNContributorsMax(INT_MAX),
77 fNContributorsMin(INT_MIN),
81 fCutSPDvertexerAnomaly(kFALSE),
82 fCutSPDTRKVtxZ(kFALSE),
83 fCutTPCmultiplicityOutliers(kFALSE),
84 fUseCentralityUnchecked(kFALSE),
85 fCentralityPercentileMethod(kTPConly),
86 fCutZDCtiming(kFALSE),
88 fCutImpactParameter(kFALSE),
89 fImpactParameterMin(0.0),
90 fImpactParameterMax(100.0),
91 fhistTPCvsGlobalMult(0),
97 //-----------------------------------------------------------------------
98 AliFlowEventCuts::AliFlowEventCuts(const char* name, const char* title):
99 AliFlowEventSimpleCuts(name, title),
101 fCutNumberOfTracks(kFALSE),
102 fNumberOfTracksMax(INT_MAX),
103 fNumberOfTracksMin(INT_MIN),
105 fRefMultMethod(kTPConly),
106 fUseAliESDtrackCutsRefMult(kFALSE),
107 fRefMultMethodAliESDtrackCuts(AliESDtrackCuts::kTrackletsITSTPC),
108 fRefMultMax(INT_MAX),
109 fRefMultMin(INT_MIN),
112 fStandardTPCcuts(AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010()),
113 fStandardGlobalCuts(AliFlowTrackCuts::GetStandardGlobalTrackCuts2010()),
114 fCutPrimaryVertexX(kFALSE),
115 fPrimaryVertexXmax(INT_MAX),
116 fPrimaryVertexXmin(INT_MIN),
117 fCutPrimaryVertexY(kFALSE),
118 fPrimaryVertexYmax(INT_MAX),
119 fPrimaryVertexYmin(INT_MIN),
120 fCutPrimaryVertexZ(kFALSE),
121 fPrimaryVertexZmax(INT_MAX),
122 fPrimaryVertexZmin(INT_MIN),
123 fCutNContributors(kFALSE),
124 fNContributorsMax(INT_MAX),
125 fNContributorsMin(INT_MIN),
127 fMeanPtMax(-DBL_MAX),
129 fCutSPDvertexerAnomaly(kFALSE),
130 fCutSPDTRKVtxZ(kFALSE),
131 fCutTPCmultiplicityOutliers(kFALSE),
132 fUseCentralityUnchecked(kFALSE),
133 fCentralityPercentileMethod(kTPConly),
134 fCutZDCtiming(kFALSE),
136 fCutImpactParameter(kFALSE),
137 fImpactParameterMin(0.0),
138 fImpactParameterMax(100.0),
139 fhistTPCvsGlobalMult(0),
145 ////-----------------------------------------------------------------------
146 AliFlowEventCuts::AliFlowEventCuts(const AliFlowEventCuts& that):
147 AliFlowEventSimpleCuts(that),
149 fCutNumberOfTracks(that.fCutNumberOfTracks),
150 fNumberOfTracksMax(that.fNumberOfTracksMax),
151 fNumberOfTracksMin(that.fNumberOfTracksMin),
152 fCutRefMult(that.fCutRefMult),
153 fRefMultMethod(that.fRefMultMethod),
154 fUseAliESDtrackCutsRefMult(that.fUseAliESDtrackCutsRefMult),
155 fRefMultMethodAliESDtrackCuts(that.fRefMultMethodAliESDtrackCuts),
156 fRefMultMax(that.fRefMultMax),
157 fRefMultMin(that.fRefMultMin),
160 fStandardTPCcuts(NULL),
161 fStandardGlobalCuts(NULL),
162 fCutPrimaryVertexX(that.fCutPrimaryVertexX),
163 fPrimaryVertexXmax(that.fPrimaryVertexXmax),
164 fPrimaryVertexXmin(that.fPrimaryVertexXmin),
165 fCutPrimaryVertexY(that.fCutPrimaryVertexX),
166 fPrimaryVertexYmax(that.fPrimaryVertexYmax),
167 fPrimaryVertexYmin(that.fPrimaryVertexYmin),
168 fCutPrimaryVertexZ(that.fCutPrimaryVertexX),
169 fPrimaryVertexZmax(that.fPrimaryVertexZmax),
170 fPrimaryVertexZmin(that.fPrimaryVertexZmin),
171 fCutNContributors(that.fCutNContributors),
172 fNContributorsMax(that.fNContributorsMax),
173 fNContributorsMin(that.fNContributorsMin),
174 fCutMeanPt(that.fCutMeanPt),
175 fMeanPtMax(that.fMeanPtMax),
176 fMeanPtMin(that.fMeanPtMin),
177 fCutSPDvertexerAnomaly(that.fCutSPDvertexerAnomaly),
178 fCutSPDTRKVtxZ(that.fCutSPDTRKVtxZ),
179 fCutTPCmultiplicityOutliers(that.fCutTPCmultiplicityOutliers),
180 fUseCentralityUnchecked(that.fUseCentralityUnchecked),
181 fCentralityPercentileMethod(that.fCentralityPercentileMethod),
182 fCutZDCtiming(that.fCutZDCtiming),
184 fCutImpactParameter(that.fCutImpactParameter),
185 fImpactParameterMin(that.fImpactParameterMin),
186 fImpactParameterMax(that.fImpactParameterMax),
187 fhistTPCvsGlobalMult(that.fhistTPCvsGlobalMult),
188 fData2011(that.fData2011)
190 if (that.fQA) DefineHistograms();
192 if (that.fRefMultCuts)
193 fRefMultCuts = new AliFlowTrackCuts(*(that.fRefMultCuts));
194 if (that.fMeanPtCuts)
195 fMeanPtCuts = new AliFlowTrackCuts(*(that.fMeanPtCuts));
196 fStandardTPCcuts = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010();
197 fStandardGlobalCuts = AliFlowTrackCuts::GetStandardGlobalTrackCuts2010();
200 ////-----------------------------------------------------------------------
201 AliFlowEventCuts::~AliFlowEventCuts()
206 delete fStandardGlobalCuts;
207 delete fStandardTPCcuts;
208 if (fQA) { fQA->SetOwner(); fQA->Delete(); delete fQA; }
211 ////-----------------------------------------------------------------------
212 AliFlowEventCuts& AliFlowEventCuts::operator=(const AliFlowEventCuts& that)
215 if (this==&that) return *this;
224 fQA = static_cast<TList*>(that.fQA->Clone());
233 fCutNumberOfTracks=that.fCutNumberOfTracks;
234 fNumberOfTracksMax=that.fNumberOfTracksMax;
235 fNumberOfTracksMin=that.fNumberOfTracksMin;
236 fCutRefMult=that.fCutRefMult;
237 fRefMultMethod=that.fRefMultMethod;
238 fUseAliESDtrackCutsRefMult=that.fUseAliESDtrackCutsRefMult;
239 fRefMultMethodAliESDtrackCuts=that.fRefMultMethodAliESDtrackCuts;
240 fRefMultMax=that.fRefMultMax;
241 fRefMultMin=that.fRefMultMin;
242 if (that.fRefMultCuts) *fRefMultCuts=*(that.fRefMultCuts);
243 if (that.fMeanPtCuts) *fMeanPtCuts=*(that.fMeanPtCuts);
244 fStandardTPCcuts = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010();
245 fStandardGlobalCuts = AliFlowTrackCuts::GetStandardGlobalTrackCuts2010();
246 fCutPrimaryVertexX=that.fCutPrimaryVertexX;
247 fPrimaryVertexXmax=that.fPrimaryVertexXmax;
248 fPrimaryVertexXmin=that.fPrimaryVertexXmin;
249 fCutPrimaryVertexY=that.fCutPrimaryVertexY;
250 fPrimaryVertexYmax=that.fPrimaryVertexYmax;
251 fPrimaryVertexYmin=that.fPrimaryVertexYmin;
252 fCutPrimaryVertexZ=that.fCutPrimaryVertexZ;
253 fPrimaryVertexZmax=that.fPrimaryVertexZmax;
254 fPrimaryVertexZmin=that.fPrimaryVertexZmin;
255 fCutNContributors=that.fCutNContributors;
256 fNContributorsMax=that.fNContributorsMax;
257 fNContributorsMin=that.fNContributorsMin;
258 fCutMeanPt=that.fCutMeanPt;
259 fMeanPtMax=that.fMeanPtMax;
260 fMeanPtMin=that.fMeanPtMin;
261 fCutSPDvertexerAnomaly=that.fCutSPDvertexerAnomaly;
262 fCutSPDTRKVtxZ=that.fCutSPDTRKVtxZ;
263 fCutTPCmultiplicityOutliers=that.fCutTPCmultiplicityOutliers;
264 fUseCentralityUnchecked=that.fUseCentralityUnchecked;
265 fCentralityPercentileMethod=that.fCentralityPercentileMethod;
266 fCutZDCtiming=that.fCutZDCtiming;
267 fhistTPCvsGlobalMult=that.fhistTPCvsGlobalMult;
268 fData2011=that.fData2011;
272 //-----------------------------------------------------------------------
273 Bool_t AliFlowEventCuts::IsSelected(TObject* obj, TObject* objmc)
276 AliVEvent* vevent = dynamic_cast<AliVEvent*>(obj);
277 AliMCEvent* mcevent = dynamic_cast<AliMCEvent*>(objmc);
278 if (vevent) return PassesCuts(vevent,mcevent);;
279 return kFALSE; //when passed wrong type of object
281 //-----------------------------------------------------------------------
282 Bool_t AliFlowEventCuts::PassesCuts(AliVEvent *event, AliMCEvent *mcevent)
284 ///check if event passes cuts
285 const AliVVertex* pvtx=event->GetPrimaryVertex();
286 Double_t pvtxx = pvtx->GetX();
287 Double_t pvtxy = pvtx->GetY();
288 Double_t pvtxz = pvtx->GetZ();
289 Int_t ncontrib = pvtx->GetNContributors();
291 AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
292 AliAODEvent* aodevent = dynamic_cast<AliAODEvent*>(event);
294 Int_t multGlobal = 0;
295 multTPC = fStandardTPCcuts->Count(event);
296 multGlobal = fStandardGlobalCuts->Count(event);
299 QAbefore(0)->Fill(pvtxz);
300 QAbefore(1)->Fill(multGlobal,multTPC);
302 if ( (fCutTPCmultiplicityOutliers && esdevent) || (fCutTPCmultiplicityOutliers && aodevent) )
304 //this is pretty slow as we check the event track by track twice
305 //this cut will work for 2010 PbPb data and is dependent on
306 //TPC and ITS reco efficiency (e.g. geometry, calibration etc)
308 if (multTPC > ( 23+1.216*multGlobal)) {pass=kFALSE;}
309 if (multTPC < (-20+1.087*multGlobal)) {pass=kFALSE;}
311 if(aodevent && fData2011){
312 if (multTPC > ( 62.87+1.78*multGlobal)) {pass=kFALSE;}
313 if (multTPC < (-36.73+1.48*multGlobal)) {pass=kFALSE;}
315 /* commenting conflicting code
316 if(aodevent && !fData2011){
317 if (multTPC > ( 32.1+1.59*multGlobal)) {pass=kFALSE;}
318 if (multTPC < (-40.3+1.22*multGlobal)) {pass=kFALSE;}
322 if (fCutNContributors)
324 if (ncontrib < fNContributorsMin || ncontrib >= fNContributorsMax) pass=kFALSE;
326 if (fCutPrimaryVertexX)
328 if (pvtxx < fPrimaryVertexXmin || pvtxx >= fPrimaryVertexXmax) pass=kFALSE;
330 if (fCutPrimaryVertexY)
332 if (pvtxy < fPrimaryVertexYmin || pvtxy >= fPrimaryVertexYmax) pass=kFALSE;
334 if (fCutPrimaryVertexZ)
336 if (pvtxz < fPrimaryVertexZmin || pvtxz >= fPrimaryVertexZmax)
339 if (fCutCentralityPercentile&&esdevent)
341 AliCentrality* centr = esdevent->GetCentrality();
342 if (fUseCentralityUnchecked)
344 if (!centr->IsEventInCentralityClassUnchecked( fCentralityPercentileMin,
345 fCentralityPercentileMax,
346 CentrMethName(fCentralityPercentileMethod) ))
353 if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
354 fCentralityPercentileMax,
355 CentrMethName(fCentralityPercentileMethod) ))
361 if (fCutSPDvertexerAnomaly&&esdevent)
363 const AliESDVertex* sdpvertex = esdevent->GetPrimaryVertexSPD();
364 if (sdpvertex->GetNContributors()<1) pass=kFALSE;
365 if (sdpvertex->GetDispersion()>0.04) pass=kFALSE;
366 if (sdpvertex->GetZRes()>0.25) pass=kFALSE;
367 const AliESDVertex* tpcvertex = esdevent->GetPrimaryVertexTPC();
368 if (tpcvertex->GetNContributors()<1) pass=kFALSE;
369 const AliMultiplicity* tracklets = esdevent->GetMultiplicity();
370 if (tpcvertex->GetNContributors()<(-10.0+0.25*tracklets->GetNumberOfITSClusters(0)))
375 if (fCutZDCtiming&&esdevent)
377 if (!fTrigAna.ZDCTimeTrigger(esdevent))
382 if(fCutNumberOfTracks) {if ( event->GetNumberOfTracks() < fNumberOfTracksMin ||
383 event->GetNumberOfTracks() >= fNumberOfTracksMax ) pass=kFALSE;}
384 if((fCutRefMult&&mcevent)||(fCutRefMult&&esdevent))
386 //reference multiplicity still to be defined
387 Double_t refMult = RefMult(event,mcevent);
388 if (refMult < fRefMultMin || refMult >= fRefMultMax )
397 Double_t tVtxZ = aodevent->GetPrimaryVertex()->GetZ();
398 Double_t tSPDVtxZ = aodevent->GetPrimaryVertexSPD()->GetZ();
399 if( TMath::Abs(tVtxZ-tSPDVtxZ) > 0.5 ) pass = kFALSE;
401 AliCentrality* centr = aodevent->GetHeader()->GetCentralityP();
402 if(fCutTPCmultiplicityOutliers){
403 Double_t v0Centr = centr->GetCentralityPercentile("V0M");
404 Double_t trkCentr = centr->GetCentralityPercentile("TRK");
405 if(TMath::Abs(v0Centr-trkCentr) > 5) pass = kFALSE;
407 if (fCutCentralityPercentile) {
408 if (fUseCentralityUnchecked) {
409 if (!centr->IsEventInCentralityClassUnchecked( fCentralityPercentileMin,
410 fCentralityPercentileMax,
411 CentrMethName(fCentralityPercentileMethod) )) {
415 if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
416 fCentralityPercentileMax,
417 CentrMethName(fCentralityPercentileMethod) )) {
427 Int_t ntracks=event->GetNumberOfTracks();
429 for (Int_t i=0; i<ntracks; i++)
431 AliVParticle* track = event->GetTrack(i);
432 if (!track) continue;
433 Bool_t localpass=kTRUE;
434 if (fMeanPtCuts) localpass=fMeanPtCuts->IsSelected(track);
437 meanpt += track->Pt();
441 if (nselected) meanpt=meanpt/nselected;
442 if (meanpt<fMeanPtMin || meanpt >= fMeanPtMax) pass=kFALSE;
445 //impact parameter cut
446 if(fCutImpactParameter) {
447 Double_t gImpactParameter = 0.;
449 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(mcevent)->GenEventHeader());
451 gImpactParameter = headerH->ImpactParameter();
453 if ((gImpactParameter < fImpactParameterMin) || (gImpactParameter >= fImpactParameterMax ))
459 QAafter(1)->Fill(multGlobal,multTPC);
460 QAafter(0)->Fill(pvtxz);
465 //-----------------------------------------------------------------------
466 Float_t AliFlowEventCuts::GetCentrality(AliVEvent* event, AliMCEvent* /*mcEvent*/)
468 //get the centrality percentile of the event
469 AliESDEvent* esdEvent = dynamic_cast<AliESDEvent*>(event);
470 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(event);
472 Float_t centrality=-1.;
474 AliCentrality* centr = NULL;
476 centr = esdEvent->GetCentrality();
478 centr = aodEvent->GetHeader()->GetCentralityP();
480 if (!centr) return -1.;
482 if (fUseCentralityUnchecked)
483 centrality=centr->GetCentralityPercentileUnchecked(CentrMethName(fCentralityPercentileMethod));
485 centrality=centr->GetCentralityPercentile(CentrMethName(fCentralityPercentileMethod));
490 //-----------------------------------------------------------------------
491 const char* AliFlowEventCuts::CentrMethName(refMultMethod method) const
493 //get the string for refmultmethod, for use with AliCentrality in
494 //the cut on centrality percentile
509 //-----------------------------------------------------------------------
510 AliFlowEventCuts* AliFlowEventCuts::StandardCuts()
512 //make a set of standard event cuts, caller becomes owner
513 AliFlowEventCuts* cuts = new AliFlowEventCuts();
517 //-----------------------------------------------------------------------
518 Int_t AliFlowEventCuts::RefMult(AliVEvent* event, AliMCEvent *mcEvent)
520 //calculate the reference multiplicity, if all fails return 0
521 AliESDVZERO* vzero = NULL;
522 AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
524 if (fUseAliESDtrackCutsRefMult && esdevent)
526 //use the standard ALICE reference multiplicity with the default eta range
527 return AliESDtrackCuts::GetReferenceMultiplicity(esdevent, fRefMultMethodAliESDtrackCuts);
530 if (fRefMultMethod==kTPConly && !fRefMultCuts)
532 fRefMultCuts = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts();
533 fRefMultCuts->SetEtaRange(-0.8,0.8);
534 fRefMultCuts->SetPtMin(0.15);
536 else if (fRefMultMethod==kSPDtracklets && !fRefMultCuts)
538 fRefMultCuts = new AliFlowTrackCuts("tracklet refmult cuts");
539 fRefMultCuts->SetParamType(AliFlowTrackCuts::kSPDtracklet);
540 fRefMultCuts->SetEtaRange(-0.8,0.8);
542 else if (fRefMultMethod==kVZERO)
544 if (!esdevent) return 0;
545 vzero=esdevent->GetVZEROData();
546 if (!vzero) return 0;
547 return TMath::Nint(vzero->GetMTotV0A()+vzero->GetMTotV0C());
549 else if (fRefMultMethod==kSPD1clusters)
551 if (!esdevent) return 0;
552 const AliMultiplicity* mult = esdevent->GetMultiplicity();
554 return mult->GetNumberOfITSClusters(1);
558 fRefMultCuts->SetEvent(event,mcEvent);
559 Int_t numberOfInputObjects = fRefMultCuts->GetNumberOfInputObjects();
560 for (Int_t i=0; i<numberOfInputObjects; i++) {
561 if (fRefMultCuts->IsSelected(fRefMultCuts->GetInputObject(i),i))
566 //_____________________________________________________________________________
567 void AliFlowEventCuts::DefineHistograms()
572 Bool_t adddirstatus = TH1::AddDirectoryStatus();
573 TH1::AddDirectory(kFALSE);
574 fQA = new TList(); fQA->SetOwner();
575 fQA->SetName(Form("%s QA",GetName()));
576 TList* before = new TList(); before->SetOwner();
577 before->SetName("before");
578 TList* after = new TList(); after->SetOwner();
579 after->SetName("after");
582 before->Add(new TH1F("zvertex",";z;event cout",500,-15.,15.)); //0
583 after->Add(new TH1F("zvertex",";z;event cout",500,-15.,15.)); //0
584 before->Add(new TH2F("fTPCvsGlobalMult","TPC only vs Global track multiplicity;global;TPC only",500,0,2500,500,0,3500));//1
585 after->Add(new TH2F("fTPCvsGlobalMult","TPC only vs Global track multiplicity;global;TPC only",500,0,2500,500,0,3500));//1
586 TH1::AddDirectory(adddirstatus);
589 //---------------------------------------------------------------//
590 void AliFlowEventCuts::Browse(TBrowser* b)
592 //some browsing capabilities
593 if (fQA) b->Add(fQA);
596 //---------------------------------------------------------------//
597 Long64_t AliFlowEventCuts::Merge(TCollection* list)
601 AliFlowEventCuts* obj;
603 if (list->GetEntries()<1) return 0;
605 while ( (obj = dynamic_cast<AliFlowEventCuts*>(next())) )
607 if (obj==this) continue;
609 listwrapper.Add(obj->GetQA());
610 fQA->Merge(&listwrapper);