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;}
312 /* commenting conflicting code, fix is pending
313 if(aodevent && fData2011){
314 if (multTPC > ( 62.87+1.78*multGlobal)) {pass=kFALSE;}
315 if (multTPC < (-36.73+1.48*multGlobal)) {pass=kFALSE;}
317 if(aodevent && !fData2011){
318 if (multTPC > ( 32.1+1.59*multGlobal)) {pass=kFALSE;}
319 if (multTPC < (-40.3+1.22*multGlobal)) {pass=kFALSE;}
323 if (fCutNContributors)
325 if (ncontrib < fNContributorsMin || ncontrib >= fNContributorsMax) pass=kFALSE;
327 if (fCutPrimaryVertexX)
329 if (pvtxx < fPrimaryVertexXmin || pvtxx >= fPrimaryVertexXmax) pass=kFALSE;
331 if (fCutPrimaryVertexY)
333 if (pvtxy < fPrimaryVertexYmin || pvtxy >= fPrimaryVertexYmax) pass=kFALSE;
335 if (fCutPrimaryVertexZ)
337 if (pvtxz < fPrimaryVertexZmin || pvtxz >= fPrimaryVertexZmax)
340 if (fCutCentralityPercentile&&esdevent)
342 AliCentrality* centr = esdevent->GetCentrality();
343 if (fUseCentralityUnchecked)
345 if (!centr->IsEventInCentralityClassUnchecked( fCentralityPercentileMin,
346 fCentralityPercentileMax,
347 CentrMethName(fCentralityPercentileMethod) ))
354 if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
355 fCentralityPercentileMax,
356 CentrMethName(fCentralityPercentileMethod) ))
362 if (fCutSPDvertexerAnomaly&&esdevent)
364 const AliESDVertex* sdpvertex = esdevent->GetPrimaryVertexSPD();
365 if (sdpvertex->GetNContributors()<1) pass=kFALSE;
366 if (sdpvertex->GetDispersion()>0.04) pass=kFALSE;
367 if (sdpvertex->GetZRes()>0.25) pass=kFALSE;
368 const AliESDVertex* tpcvertex = esdevent->GetPrimaryVertexTPC();
369 if (tpcvertex->GetNContributors()<1) pass=kFALSE;
370 const AliMultiplicity* tracklets = esdevent->GetMultiplicity();
371 if (tpcvertex->GetNContributors()<(-10.0+0.25*tracklets->GetNumberOfITSClusters(0)))
376 if (fCutZDCtiming&&esdevent)
378 if (!fTrigAna.ZDCTimeTrigger(esdevent))
383 if(fCutNumberOfTracks) {if ( event->GetNumberOfTracks() < fNumberOfTracksMin ||
384 event->GetNumberOfTracks() >= fNumberOfTracksMax ) pass=kFALSE;}
385 if((fCutRefMult&&mcevent)||(fCutRefMult&&esdevent))
387 //reference multiplicity still to be defined
388 Double_t refMult = RefMult(event,mcevent);
389 if (refMult < fRefMultMin || refMult >= fRefMultMax )
398 Double_t tVtxZ = aodevent->GetPrimaryVertex()->GetZ();
399 Double_t tSPDVtxZ = aodevent->GetPrimaryVertexSPD()->GetZ();
400 if( TMath::Abs(tVtxZ-tSPDVtxZ) > 0.5 ) pass = kFALSE;
402 AliCentrality* centr = aodevent->GetHeader()->GetCentralityP();
403 if(fCutTPCmultiplicityOutliers){
404 Double_t v0Centr = centr->GetCentralityPercentile("V0M");
405 Double_t trkCentr = centr->GetCentralityPercentile("TRK");
406 if(TMath::Abs(v0Centr-trkCentr) > 5) pass = kFALSE;
408 if (fCutCentralityPercentile) {
409 if (fUseCentralityUnchecked) {
410 if (!centr->IsEventInCentralityClassUnchecked( fCentralityPercentileMin,
411 fCentralityPercentileMax,
412 CentrMethName(fCentralityPercentileMethod) )) {
416 if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
417 fCentralityPercentileMax,
418 CentrMethName(fCentralityPercentileMethod) )) {
428 Int_t ntracks=event->GetNumberOfTracks();
430 for (Int_t i=0; i<ntracks; i++)
432 AliVParticle* track = event->GetTrack(i);
433 if (!track) continue;
434 Bool_t localpass=kTRUE;
435 if (fMeanPtCuts) localpass=fMeanPtCuts->IsSelected(track);
438 meanpt += track->Pt();
442 if (nselected) meanpt=meanpt/nselected;
443 if (meanpt<fMeanPtMin || meanpt >= fMeanPtMax) pass=kFALSE;
446 //impact parameter cut
447 if(fCutImpactParameter) {
448 Double_t gImpactParameter = 0.;
450 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(mcevent)->GenEventHeader());
452 gImpactParameter = headerH->ImpactParameter();
454 if ((gImpactParameter < fImpactParameterMin) || (gImpactParameter >= fImpactParameterMax ))
460 QAafter(1)->Fill(multGlobal,multTPC);
461 QAafter(0)->Fill(pvtxz);
466 //-----------------------------------------------------------------------
467 Float_t AliFlowEventCuts::GetCentrality(AliVEvent* event, AliMCEvent* /*mcEvent*/)
469 //get the centrality percentile of the event
470 AliESDEvent* esdEvent = dynamic_cast<AliESDEvent*>(event);
471 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(event);
473 Float_t centrality=-1.;
475 AliCentrality* centr = NULL;
477 centr = esdEvent->GetCentrality();
479 centr = aodEvent->GetHeader()->GetCentralityP();
481 if (!centr) return -1.;
483 if (fUseCentralityUnchecked)
484 centrality=centr->GetCentralityPercentileUnchecked(CentrMethName(fCentralityPercentileMethod));
486 centrality=centr->GetCentralityPercentile(CentrMethName(fCentralityPercentileMethod));
491 //-----------------------------------------------------------------------
492 const char* AliFlowEventCuts::CentrMethName(refMultMethod method) const
494 //get the string for refmultmethod, for use with AliCentrality in
495 //the cut on centrality percentile
510 //-----------------------------------------------------------------------
511 AliFlowEventCuts* AliFlowEventCuts::StandardCuts()
513 //make a set of standard event cuts, caller becomes owner
514 AliFlowEventCuts* cuts = new AliFlowEventCuts();
518 //-----------------------------------------------------------------------
519 Int_t AliFlowEventCuts::RefMult(AliVEvent* event, AliMCEvent *mcEvent)
521 //calculate the reference multiplicity, if all fails return 0
522 AliESDVZERO* vzero = NULL;
523 AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
525 if (fUseAliESDtrackCutsRefMult && esdevent)
527 //use the standard ALICE reference multiplicity with the default eta range
528 return AliESDtrackCuts::GetReferenceMultiplicity(esdevent, fRefMultMethodAliESDtrackCuts);
531 if (fRefMultMethod==kTPConly && !fRefMultCuts)
533 fRefMultCuts = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts();
534 fRefMultCuts->SetEtaRange(-0.8,0.8);
535 fRefMultCuts->SetPtMin(0.15);
537 else if (fRefMultMethod==kSPDtracklets && !fRefMultCuts)
539 fRefMultCuts = new AliFlowTrackCuts("tracklet refmult cuts");
540 fRefMultCuts->SetParamType(AliFlowTrackCuts::kSPDtracklet);
541 fRefMultCuts->SetEtaRange(-0.8,0.8);
543 else if (fRefMultMethod==kVZERO)
545 if (!esdevent) return 0;
546 vzero=esdevent->GetVZEROData();
547 if (!vzero) return 0;
548 return TMath::Nint(vzero->GetMTotV0A()+vzero->GetMTotV0C());
550 else if (fRefMultMethod==kSPD1clusters)
552 if (!esdevent) return 0;
553 const AliMultiplicity* mult = esdevent->GetMultiplicity();
555 return mult->GetNumberOfITSClusters(1);
559 fRefMultCuts->SetEvent(event,mcEvent);
560 Int_t numberOfInputObjects = fRefMultCuts->GetNumberOfInputObjects();
561 for (Int_t i=0; i<numberOfInputObjects; i++) {
562 if (fRefMultCuts->IsSelected(fRefMultCuts->GetInputObject(i),i))
567 //_____________________________________________________________________________
568 void AliFlowEventCuts::DefineHistograms()
573 Bool_t adddirstatus = TH1::AddDirectoryStatus();
574 TH1::AddDirectory(kFALSE);
575 fQA = new TList(); fQA->SetOwner();
576 fQA->SetName(Form("%s QA",GetName()));
577 TList* before = new TList(); before->SetOwner();
578 before->SetName("before");
579 TList* after = new TList(); after->SetOwner();
580 after->SetName("after");
583 before->Add(new TH1F("zvertex",";z;event cout",500,-15.,15.)); //0
584 after->Add(new TH1F("zvertex",";z;event cout",500,-15.,15.)); //0
585 before->Add(new TH2F("fTPCvsGlobalMult","TPC only vs Global track multiplicity;global;TPC only",500,0,2500,500,0,3500));//1
586 after->Add(new TH2F("fTPCvsGlobalMult","TPC only vs Global track multiplicity;global;TPC only",500,0,2500,500,0,3500));//1
587 TH1::AddDirectory(adddirstatus);
590 //---------------------------------------------------------------//
591 void AliFlowEventCuts::Browse(TBrowser* b)
593 //some browsing capabilities
594 if (fQA) b->Add(fQA);
597 //---------------------------------------------------------------//
598 Long64_t AliFlowEventCuts::Merge(TCollection* list)
602 AliFlowEventCuts* obj;
604 if (list->GetEntries()<1) return 0;
606 while ( (obj = dynamic_cast<AliFlowEventCuts*>(next())) )
608 if (obj==this) continue;
610 listwrapper.Add(obj->GetQA());
611 fQA->Merge(&listwrapper);