]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/FLOW/Tasks/AliFlowEventCuts.cxx
only check correlation of global track and tpc only track multipliicty when running...
[u/mrichter/AliRoot.git] / PWG / FLOW / Tasks / AliFlowEventCuts.cxx
CommitLineData
97c3cecc 1 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
daf66719 2 * *
3 * Author: The ALICE Off-line Project. *
4 * Contributors are mentioned in the code where appropriate. *
5 * *
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 **************************************************************************/
14
15/* $Id$ */
16
17// AliFlowEventCuts:
18// An event cut class for the flow framework
19//
20// origin: Mikolaj Krzewicki (mikolaj.krzewicki@cern.ch)
21
22#include <limits.h>
23#include <float.h>
499fe731 24#include <TList.h>
25#include <TH1F.h>
a14b8f3c 26#include <TH2F.h>
499fe731 27#include <TBrowser.h>
1c4a5bf7 28#include "TMath.h"
daf66719 29#include "TNamed.h"
ee242db3 30#include "AliVVertex.h"
daf66719 31#include "AliVEvent.h"
333ce021 32#include "AliESDEvent.h"
60875c3c 33#include "AliAODEvent.h"
34#include "AliAODHeader.h"
23b09634 35#include "AliCentrality.h"
1c4a5bf7 36#include "AliESDVZERO.h"
9a0783cc 37#include "AliMultiplicity.h"
333ce021 38#include "AliMCEvent.h"
daf66719 39#include "AliFlowEventCuts.h"
9a0783cc 40#include "AliFlowTrackCuts.h"
e7b9ed1d 41#include "AliTriggerAnalysis.h"
e821bc8b 42#include "AliCollisionGeometry.h"
43#include "AliGenEventHeader.h"
97c3cecc 44#include <iostream>
45using namespace std;
daf66719 46
47ClassImp(AliFlowEventCuts)
48
49//-----------------------------------------------------------------------
50AliFlowEventCuts::AliFlowEventCuts():
8fa6a5fa 51 AliFlowEventSimpleCuts(),
499fe731 52 fQA(NULL),
daf66719 53 fCutNumberOfTracks(kFALSE),
54 fNumberOfTracksMax(INT_MAX),
5559ce24 55 fNumberOfTracksMin(INT_MIN),
56 fCutRefMult(kFALSE),
9a0783cc 57 fRefMultMethod(kTPConly),
0249320d 58 fUseAliESDtrackCutsRefMult(kFALSE),
59 fRefMultMethodAliESDtrackCuts(AliESDtrackCuts::kTrackletsITSTPC),
5559ce24 60 fRefMultMax(INT_MAX),
333ce021 61 fRefMultMin(INT_MIN),
ee242db3 62 fRefMultCuts(NULL),
2279052e 63 fMeanPtCuts(NULL),
4099bcf0 64 fStandardTPCcuts(NULL),
65 fStandardGlobalCuts(NULL),
ee242db3 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),
d32716f4 77 fNContributorsMin(INT_MIN),
78 fCutMeanPt(kFALSE),
e90a4b03 79 fMeanPtMax(-DBL_MAX),
d7e66a39 80 fMeanPtMin(DBL_MAX),
441ea1cf 81 fCutSPDvertexerAnomaly(kFALSE),
392bb597 82 fCutSPDTRKVtxZ(kFALSE),
4099bcf0 83 fCutTPCmultiplicityOutliers(kFALSE),
9e44ab87 84 fCutTPCmultiplicityOutliersAOD(kFALSE),
8f861a97 85 fUseCentralityUnchecked(kFALSE),
7d9ab4fb 86 fCentralityPercentileMethod(kTPConly),
441ea1cf 87 fCutZDCtiming(kFALSE),
e821bc8b 88 fTrigAna(),
89 fCutImpactParameter(kFALSE),
90 fImpactParameterMin(0.0),
97c3cecc 91 fImpactParameterMax(100.0),
92 fhistTPCvsGlobalMult(0),
93 fData2011(kFALSE)
daf66719 94{
95 //constructor
96}
97
957517fa 98//-----------------------------------------------------------------------
99AliFlowEventCuts::AliFlowEventCuts(const char* name, const char* title):
8fa6a5fa 100 AliFlowEventSimpleCuts(name, title),
499fe731 101 fQA(NULL),
957517fa 102 fCutNumberOfTracks(kFALSE),
103 fNumberOfTracksMax(INT_MAX),
104 fNumberOfTracksMin(INT_MIN),
105 fCutRefMult(kFALSE),
9a0783cc 106 fRefMultMethod(kTPConly),
0249320d 107 fUseAliESDtrackCutsRefMult(kFALSE),
108 fRefMultMethodAliESDtrackCuts(AliESDtrackCuts::kTrackletsITSTPC),
957517fa 109 fRefMultMax(INT_MAX),
333ce021 110 fRefMultMin(INT_MIN),
ee242db3 111 fRefMultCuts(NULL),
2279052e 112 fMeanPtCuts(NULL),
1a80f9f6 113 fStandardTPCcuts(AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010()),
4099bcf0 114 fStandardGlobalCuts(AliFlowTrackCuts::GetStandardGlobalTrackCuts2010()),
ee242db3 115 fCutPrimaryVertexX(kFALSE),
116 fPrimaryVertexXmax(INT_MAX),
117 fPrimaryVertexXmin(INT_MIN),
118 fCutPrimaryVertexY(kFALSE),
119 fPrimaryVertexYmax(INT_MAX),
120 fPrimaryVertexYmin(INT_MIN),
121 fCutPrimaryVertexZ(kFALSE),
122 fPrimaryVertexZmax(INT_MAX),
123 fPrimaryVertexZmin(INT_MIN),
124 fCutNContributors(kFALSE),
125 fNContributorsMax(INT_MAX),
d32716f4 126 fNContributorsMin(INT_MIN),
127 fCutMeanPt(kFALSE),
e90a4b03 128 fMeanPtMax(-DBL_MAX),
d7e66a39 129 fMeanPtMin(DBL_MAX),
2db2db0e 130 fCutSPDvertexerAnomaly(kFALSE),
392bb597 131 fCutSPDTRKVtxZ(kFALSE),
4099bcf0 132 fCutTPCmultiplicityOutliers(kFALSE),
9e44ab87 133 fCutTPCmultiplicityOutliersAOD(kFALSE),
8f861a97 134 fUseCentralityUnchecked(kFALSE),
7d9ab4fb 135 fCentralityPercentileMethod(kTPConly),
441ea1cf 136 fCutZDCtiming(kFALSE),
e821bc8b 137 fTrigAna(),
138 fCutImpactParameter(kFALSE),
139 fImpactParameterMin(0.0),
97c3cecc 140 fImpactParameterMax(100.0),
141 fhistTPCvsGlobalMult(0),
142 fData2011(kFALSE)
957517fa 143{
144 //constructor
145}
146
daf66719 147////-----------------------------------------------------------------------
03d364db 148AliFlowEventCuts::AliFlowEventCuts(const AliFlowEventCuts& that):
8fa6a5fa 149 AliFlowEventSimpleCuts(that),
499fe731 150 fQA(NULL),
03d364db 151 fCutNumberOfTracks(that.fCutNumberOfTracks),
152 fNumberOfTracksMax(that.fNumberOfTracksMax),
153 fNumberOfTracksMin(that.fNumberOfTracksMin),
154 fCutRefMult(that.fCutRefMult),
155 fRefMultMethod(that.fRefMultMethod),
0249320d 156 fUseAliESDtrackCutsRefMult(that.fUseAliESDtrackCutsRefMult),
157 fRefMultMethodAliESDtrackCuts(that.fRefMultMethodAliESDtrackCuts),
03d364db 158 fRefMultMax(that.fRefMultMax),
159 fRefMultMin(that.fRefMultMin),
ee242db3 160 fRefMultCuts(NULL),
2279052e 161 fMeanPtCuts(NULL),
4099bcf0 162 fStandardTPCcuts(NULL),
163 fStandardGlobalCuts(NULL),
ee242db3 164 fCutPrimaryVertexX(that.fCutPrimaryVertexX),
165 fPrimaryVertexXmax(that.fPrimaryVertexXmax),
166 fPrimaryVertexXmin(that.fPrimaryVertexXmin),
167 fCutPrimaryVertexY(that.fCutPrimaryVertexX),
168 fPrimaryVertexYmax(that.fPrimaryVertexYmax),
169 fPrimaryVertexYmin(that.fPrimaryVertexYmin),
170 fCutPrimaryVertexZ(that.fCutPrimaryVertexX),
171 fPrimaryVertexZmax(that.fPrimaryVertexZmax),
172 fPrimaryVertexZmin(that.fPrimaryVertexZmin),
173 fCutNContributors(that.fCutNContributors),
174 fNContributorsMax(that.fNContributorsMax),
d32716f4 175 fNContributorsMin(that.fNContributorsMin),
176 fCutMeanPt(that.fCutMeanPt),
177 fMeanPtMax(that.fMeanPtMax),
d7e66a39 178 fMeanPtMin(that.fMeanPtMin),
7d9ab4fb 179 fCutSPDvertexerAnomaly(that.fCutSPDvertexerAnomaly),
392bb597 180 fCutSPDTRKVtxZ(that.fCutSPDTRKVtxZ),
4099bcf0 181 fCutTPCmultiplicityOutliers(that.fCutTPCmultiplicityOutliers),
9e44ab87 182 fCutTPCmultiplicityOutliersAOD(that.fCutTPCmultiplicityOutliersAOD),
8f861a97 183 fUseCentralityUnchecked(that.fUseCentralityUnchecked),
7d9ab4fb 184 fCentralityPercentileMethod(that.fCentralityPercentileMethod),
e7b9ed1d 185 fCutZDCtiming(that.fCutZDCtiming),
e821bc8b 186 fTrigAna(),
187 fCutImpactParameter(that.fCutImpactParameter),
188 fImpactParameterMin(that.fImpactParameterMin),
f4429386 189 fImpactParameterMax(that.fImpactParameterMax),
190 fhistTPCvsGlobalMult(that.fhistTPCvsGlobalMult),
191 fData2011(that.fData2011)
03d364db 192{
499fe731 193 if (that.fQA) DefineHistograms();
03d364db 194 //copy constructor
ee242db3 195 if (that.fRefMultCuts)
196 fRefMultCuts = new AliFlowTrackCuts(*(that.fRefMultCuts));
2279052e 197 if (that.fMeanPtCuts)
198 fMeanPtCuts = new AliFlowTrackCuts(*(that.fMeanPtCuts));
cd62a2a8 199 fStandardTPCcuts = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010();
200 fStandardGlobalCuts = AliFlowTrackCuts::GetStandardGlobalTrackCuts2010();
2279052e 201}
202
203////-----------------------------------------------------------------------
204AliFlowEventCuts::~AliFlowEventCuts()
205{
206 //dtor
207 delete fMeanPtCuts;
208 delete fRefMultCuts;
cd62a2a8 209 delete fStandardGlobalCuts;
210 delete fStandardTPCcuts;
499fe731 211 if (fQA) { fQA->SetOwner(); fQA->Delete(); delete fQA; }
03d364db 212}
213
daf66719 214////-----------------------------------------------------------------------
03d364db 215AliFlowEventCuts& AliFlowEventCuts::operator=(const AliFlowEventCuts& that)
216{
217 //assignment
cdc20344 218 if (this==&that) return *this;
219
499fe731 220 if (that.fQA)
221 {
222 if (fQA)
223 {
224 fQA->Delete();
225 delete fQA;
226 }
227 fQA = static_cast<TList*>(that.fQA->Clone());
228 }
229 else
230 {
231 fQA->Delete();
232 delete fQA;
233 fQA=NULL;
234 }
235
03d364db 236 fCutNumberOfTracks=that.fCutNumberOfTracks;
237 fNumberOfTracksMax=that.fNumberOfTracksMax;
238 fNumberOfTracksMin=that.fNumberOfTracksMin;
239 fCutRefMult=that.fCutRefMult;
240 fRefMultMethod=that.fRefMultMethod;
0249320d 241 fUseAliESDtrackCutsRefMult=that.fUseAliESDtrackCutsRefMult;
242 fRefMultMethodAliESDtrackCuts=that.fRefMultMethodAliESDtrackCuts;
03d364db 243 fRefMultMax=that.fRefMultMax;
244 fRefMultMin=that.fRefMultMin;
ee242db3 245 if (that.fRefMultCuts) *fRefMultCuts=*(that.fRefMultCuts);
2279052e 246 if (that.fMeanPtCuts) *fMeanPtCuts=*(that.fMeanPtCuts);
cd62a2a8 247 fStandardTPCcuts = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts2010();
248 fStandardGlobalCuts = AliFlowTrackCuts::GetStandardGlobalTrackCuts2010();
ee242db3 249 fCutPrimaryVertexX=that.fCutPrimaryVertexX;
ee242db3 250 fPrimaryVertexXmax=that.fPrimaryVertexXmax;
cdc20344 251 fPrimaryVertexXmin=that.fPrimaryVertexXmin;
252 fCutPrimaryVertexY=that.fCutPrimaryVertexY;
ee242db3 253 fPrimaryVertexYmax=that.fPrimaryVertexYmax;
cdc20344 254 fPrimaryVertexYmin=that.fPrimaryVertexYmin;
255 fCutPrimaryVertexZ=that.fCutPrimaryVertexZ;
ee242db3 256 fPrimaryVertexZmax=that.fPrimaryVertexZmax;
cdc20344 257 fPrimaryVertexZmin=that.fPrimaryVertexZmin;
ee242db3 258 fCutNContributors=that.fCutNContributors;
259 fNContributorsMax=that.fNContributorsMax;
260 fNContributorsMin=that.fNContributorsMin;
d32716f4 261 fCutMeanPt=that.fCutMeanPt;
262 fMeanPtMax=that.fMeanPtMax;
263 fMeanPtMin=that.fMeanPtMin;
d7e66a39 264 fCutSPDvertexerAnomaly=that.fCutSPDvertexerAnomaly;
392bb597 265 fCutSPDTRKVtxZ=that.fCutSPDTRKVtxZ;
4099bcf0 266 fCutTPCmultiplicityOutliers=that.fCutTPCmultiplicityOutliers;
9e44ab87 267 fCutTPCmultiplicityOutliersAOD=that.fCutTPCmultiplicityOutliersAOD;
8f861a97 268 fUseCentralityUnchecked=that.fUseCentralityUnchecked;
7d9ab4fb 269 fCentralityPercentileMethod=that.fCentralityPercentileMethod;
cdc20344 270 fCutZDCtiming=that.fCutZDCtiming;
97c3cecc 271 fhistTPCvsGlobalMult=that.fhistTPCvsGlobalMult;
272 fData2011=that.fData2011;
03d364db 273 return *this;
274}
daf66719 275
276//-----------------------------------------------------------------------
e821bc8b 277Bool_t AliFlowEventCuts::IsSelected(TObject* obj, TObject* objmc)
daf66719 278{
279 //check cuts
7d9ab4fb 280 AliVEvent* vevent = dynamic_cast<AliVEvent*>(obj);
e821bc8b 281 AliMCEvent* mcevent = dynamic_cast<AliMCEvent*>(objmc);
282 if (vevent) return PassesCuts(vevent,mcevent);;
daf66719 283 return kFALSE; //when passed wrong type of object
284}
285//-----------------------------------------------------------------------
e821bc8b 286Bool_t AliFlowEventCuts::PassesCuts(AliVEvent *event, AliMCEvent *mcevent)
daf66719 287{
288 ///check if event passes cuts
cd62a2a8 289 const AliVVertex* pvtx=event->GetPrimaryVertex();
290 Double_t pvtxx = pvtx->GetX();
291 Double_t pvtxy = pvtx->GetY();
292 Double_t pvtxz = pvtx->GetZ();
293 Int_t ncontrib = pvtx->GetNContributors();
a14b8f3c 294 Bool_t pass=kTRUE;
7d9ab4fb 295 AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
60875c3c 296 AliAODEvent* aodevent = dynamic_cast<AliAODEvent*>(event);
a14b8f3c 297 Int_t multTPC = 0;
298 Int_t multGlobal = 0;
750bce51 299
819dadc0 300 // to remove multiplicity outliers, an explicit cut on the correlation
301 // between global and tpc only tracks can be made by counting the two
302 // sets. as counting is expensive, only count when qa is requested or cut is enabeled
303 // the cut criteria are different for different data takign periods
304 // and (of course) cut criteria, specific routines exist for 10h, 11h data
305 // and esds (by calling AliFlowTrackCuts) or aods (evaluated here explicitely)
306 if(esdevent && (fQA || fCutTPCmultiplicityOutliers))
a14b8f3c 307 {
a14b8f3c 308 //this is pretty slow as we check the event track by track twice
309 //this cut will work for 2010 PbPb data and is dependent on
310 //TPC and ITS reco efficiency (e.g. geometry, calibration etc)
819dadc0 311 multTPC = fStandardTPCcuts->Count(event);
312 multGlobal = fStandardGlobalCuts->Count(event);
313 if(fCutTPCmultiplicityOutliers) {
314 if (multTPC > ( 23+1.216*multGlobal)) pass = kFALSE;
315 if (multTPC < (-20+1.087*multGlobal)) pass = kFALSE;
316 }
9e44ab87 317 }
819dadc0 318 if(aodevent && (fQA || fCutTPCmultiplicityOutliersAOD))
319 {
320 //similar (slow) cut for aod's. will work for both 2010 and 2010 pbpb data
321 //but the user is responsible that this object is configured
322 //correctly to select the dataset
323 //FIXME data could dynamically be determined by this class via the
324 //runnumber
750bce51 325 Int_t nTracks(aodevent->GetNumberOfTracks());
326 for(Int_t iTracks = 0; iTracks < nTracks; iTracks++) {
819dadc0 327 AliAODTrack* track = aodevent->GetTrack(iTracks);
328 if(!track) continue;
329 if (!track || track->Pt() < .2 || track->Pt() > 5.0 || TMath::Abs(track->Eta()) > .8 || track->GetTPCNcls() < 70 || !track->GetDetPid() || track->GetDetPid()->GetTPCsignal() < 10.0) continue; // general quality cut
330 if (track->TestFilterBit(1) && track->Chi2perNDF() > 0.2) multTPC++;
331 if (!track->TestFilterBit(16) || track->Chi2perNDF() < 0.1) continue;
332 Double_t b[2] = {-99., -99.};
333 Double_t bCov[3] = {-99., -99., -99.};
334 AliAODTrack copy(*track);
335 if (copy.PropagateToDCA(event->GetPrimaryVertex(), event->GetMagneticField(), 100., b, bCov) && TMath::Abs(b[0]) < 0.3 && TMath::Abs(b[1]) < 0.3) multGlobal++;
336 }
337 if(fCutTPCmultiplicityOutliersAOD)
338 {
339 if(!fData2011 && (multTPC < (-40.3+1.22*multGlobal) || multTPC > (32.1+1.59*multGlobal))) pass = kFALSE;
340 else if(fData2011 && (multTPC < (-36.73 + 1.48*multGlobal) || multTPC > (62.87 + 1.78*multGlobal))) pass = kFALSE;
750bce51 341 }
a14b8f3c 342 }
9e44ab87 343
750bce51 344 if (fQA)
345 {
346 QAbefore(0)->Fill(pvtxz);
347 QAbefore(1)->Fill(multGlobal,multTPC);
348 }
349
a14b8f3c 350 if (fCutNContributors)
351 {
352 if (ncontrib < fNContributorsMin || ncontrib >= fNContributorsMax) pass=kFALSE;
353 }
354 if (fCutPrimaryVertexX)
355 {
356 if (pvtxx < fPrimaryVertexXmin || pvtxx >= fPrimaryVertexXmax) pass=kFALSE;
357 }
358 if (fCutPrimaryVertexY)
359 {
360 if (pvtxy < fPrimaryVertexYmin || pvtxy >= fPrimaryVertexYmax) pass=kFALSE;
361 }
a14b8f3c 362 if (fCutPrimaryVertexZ)
363 {
a14b8f3c 364 if (pvtxz < fPrimaryVertexZmin || pvtxz >= fPrimaryVertexZmax)
a14b8f3c 365 pass=kFALSE;
a14b8f3c 366 }
441ea1cf 367 if (fCutCentralityPercentile&&esdevent)
7d9ab4fb 368 {
23b09634 369 AliCentrality* centr = esdevent->GetCentrality();
8f861a97 370 if (fUseCentralityUnchecked)
441ea1cf 371 {
8f861a97 372 if (!centr->IsEventInCentralityClassUnchecked( fCentralityPercentileMin,
373 fCentralityPercentileMax,
374 CentrMethName(fCentralityPercentileMethod) ))
375 {
cd62a2a8 376 pass=kFALSE;
8f861a97 377 }
378 }
379 else
380 {
381 if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
382 fCentralityPercentileMax,
383 CentrMethName(fCentralityPercentileMethod) ))
384 {
cd62a2a8 385 pass=kFALSE;
8f861a97 386 }
441ea1cf 387 }
7d9ab4fb 388 }
389 if (fCutSPDvertexerAnomaly&&esdevent)
390 {
391 const AliESDVertex* sdpvertex = esdevent->GetPrimaryVertexSPD();
cd62a2a8 392 if (sdpvertex->GetNContributors()<1) pass=kFALSE;
393 if (sdpvertex->GetDispersion()>0.04) pass=kFALSE;
394 if (sdpvertex->GetZRes()>0.25) pass=kFALSE;
7d9ab4fb 395 const AliESDVertex* tpcvertex = esdevent->GetPrimaryVertexTPC();
cd62a2a8 396 if (tpcvertex->GetNContributors()<1) pass=kFALSE;
7d9ab4fb 397 const AliMultiplicity* tracklets = esdevent->GetMultiplicity();
398 if (tpcvertex->GetNContributors()<(-10.0+0.25*tracklets->GetNumberOfITSClusters(0)))
441ea1cf 399 {
cd62a2a8 400 pass=kFALSE;
441ea1cf 401 }
7d9ab4fb 402 }
441ea1cf 403 if (fCutZDCtiming&&esdevent)
e7b9ed1d 404 {
441ea1cf 405 if (!fTrigAna.ZDCTimeTrigger(esdevent))
406 {
cd62a2a8 407 pass=kFALSE;
441ea1cf 408 }
e7b9ed1d 409 }
7d9ab4fb 410 if(fCutNumberOfTracks) {if ( event->GetNumberOfTracks() < fNumberOfTracksMin ||
cd62a2a8 411 event->GetNumberOfTracks() >= fNumberOfTracksMax ) pass=kFALSE;}
e821bc8b 412 if((fCutRefMult&&mcevent)||(fCutRefMult&&esdevent))
5559ce24 413 {
414 //reference multiplicity still to be defined
e821bc8b 415 Double_t refMult = RefMult(event,mcevent);
03d364db 416 if (refMult < fRefMultMin || refMult >= fRefMultMax )
441ea1cf 417 {
cd62a2a8 418 pass=kFALSE;
441ea1cf 419 }
5559ce24 420 }
60875c3c 421
422 // Handles AOD event
423 if(aodevent) {
392bb597 424 if(fCutSPDTRKVtxZ) {
425 Double_t tVtxZ = aodevent->GetPrimaryVertex()->GetZ();
426 Double_t tSPDVtxZ = aodevent->GetPrimaryVertexSPD()->GetZ();
427 if( TMath::Abs(tVtxZ-tSPDVtxZ) > 0.5 ) pass = kFALSE;
428 }
35de36b0 429 AliCentrality* centr = aodevent->GetHeader()->GetCentralityP();
8e4cd3ab 430 if(fCutTPCmultiplicityOutliers || fCutTPCmultiplicityOutliersAOD){
35de36b0 431 Double_t v0Centr = centr->GetCentralityPercentile("V0M");
432 Double_t trkCentr = centr->GetCentralityPercentile("TRK");
433 if(TMath::Abs(v0Centr-trkCentr) > 5) pass = kFALSE;
434 }
60875c3c 435 if (fCutCentralityPercentile) {
60875c3c 436 if (fUseCentralityUnchecked) {
437 if (!centr->IsEventInCentralityClassUnchecked( fCentralityPercentileMin,
438 fCentralityPercentileMax,
439 CentrMethName(fCentralityPercentileMethod) )) {
440 pass = kFALSE;
441 }
442 } else {
443 if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
444 fCentralityPercentileMax,
445 CentrMethName(fCentralityPercentileMethod) )) {
446 pass = kFALSE;
447 }
448 }
449 }
450 }
451
d32716f4 452 if (fCutMeanPt)
453 {
454 Float_t meanpt=0.0;
455 Int_t ntracks=event->GetNumberOfTracks();
f33c7420 456 Int_t nselected=0;
d32716f4 457 for (Int_t i=0; i<ntracks; i++)
458 {
459 AliVParticle* track = event->GetTrack(i);
460 if (!track) continue;
a14b8f3c 461 Bool_t localpass=kTRUE;
462 if (fMeanPtCuts) localpass=fMeanPtCuts->IsSelected(track);
463 if (localpass)
f33c7420 464 {
465 meanpt += track->Pt();
466 nselected++;
467 }
d32716f4 468 }
2047680a 469 if (nselected) meanpt=meanpt/nselected;
cd62a2a8 470 if (meanpt<fMeanPtMin || meanpt >= fMeanPtMax) pass=kFALSE;
471 }
e821bc8b 472
473 //impact parameter cut
474 if(fCutImpactParameter) {
475 Double_t gImpactParameter = 0.;
476 if(mcevent) {
477 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(mcevent)->GenEventHeader());
478 if(headerH)
479 gImpactParameter = headerH->ImpactParameter();
480 }
481 if ((gImpactParameter < fImpactParameterMin) || (gImpactParameter >= fImpactParameterMax ))
482 pass=kFALSE;
483 }
484
cd62a2a8 485 if (fQA&&pass)
486 {
487 QAafter(1)->Fill(multGlobal,multTPC);
488 QAafter(0)->Fill(pvtxz);
d32716f4 489 }
a14b8f3c 490 return pass;
daf66719 491}
492
8fa6a5fa
MK
493//-----------------------------------------------------------------------
494Float_t AliFlowEventCuts::GetCentrality(AliVEvent* event, AliMCEvent* /*mcEvent*/)
495{
496 //get the centrality percentile of the event
497 AliESDEvent* esdEvent = dynamic_cast<AliESDEvent*>(event);
498 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(event);
499
500 Float_t centrality=-1.;
501
502 AliCentrality* centr = NULL;
503 if (esdEvent)
504 centr = esdEvent->GetCentrality();
505 if (aodEvent)
506 centr = aodEvent->GetHeader()->GetCentralityP();
507
508 if (!centr) return -1.;
509
510 if (fUseCentralityUnchecked)
511 centrality=centr->GetCentralityPercentileUnchecked(CentrMethName(fCentralityPercentileMethod));
512 else
513 centrality=centr->GetCentralityPercentile(CentrMethName(fCentralityPercentileMethod));
514
515 return centrality;
516}
517
7d9ab4fb 518//-----------------------------------------------------------------------
519const char* AliFlowEventCuts::CentrMethName(refMultMethod method) const
520{
23b09634 521 //get the string for refmultmethod, for use with AliCentrality in
7d9ab4fb 522 //the cut on centrality percentile
523 switch (method)
524 {
525 case kSPDtracklets:
526 return "TKL";
527 case kSPD1clusters:
528 return "CL1";
529 case kTPConly:
530 return "TRK";
8fa6a5fa 531 case kVZERO:
7d9ab4fb 532 return "V0M";
533 default:
534 return "";
535 }
536}
daf66719 537//-----------------------------------------------------------------------
538AliFlowEventCuts* AliFlowEventCuts::StandardCuts()
539{
540 //make a set of standard event cuts, caller becomes owner
541 AliFlowEventCuts* cuts = new AliFlowEventCuts();
542 return cuts;
543}
333ce021 544
545//-----------------------------------------------------------------------
4aae2a93 546Int_t AliFlowEventCuts::RefMult(AliVEvent* event, AliMCEvent *mcEvent)
333ce021 547{
9a0783cc 548 //calculate the reference multiplicity, if all fails return 0
1c4a5bf7 549 AliESDVZERO* vzero = NULL;
7d9ab4fb 550 AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
32b846cd 551
0249320d 552 if (fUseAliESDtrackCutsRefMult && esdevent)
553 {
554 //use the standard ALICE reference multiplicity with the default eta range
555 return AliESDtrackCuts::GetReferenceMultiplicity(esdevent, fRefMultMethodAliESDtrackCuts);
556 }
557
2a745a5f 558 if (fRefMultMethod==kTPConly && !fRefMultCuts)
9a0783cc 559 {
1a80f9f6 560 fRefMultCuts = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts();
2a745a5f 561 fRefMultCuts->SetEtaRange(-0.8,0.8);
562 fRefMultCuts->SetPtMin(0.15);
563 }
564 else if (fRefMultMethod==kSPDtracklets && !fRefMultCuts)
565 {
566 fRefMultCuts = new AliFlowTrackCuts("tracklet refmult cuts");
1a80f9f6 567 fRefMultCuts->SetParamType(AliFlowTrackCuts::kSPDtracklet);
2a745a5f 568 fRefMultCuts->SetEtaRange(-0.8,0.8);
569 }
8fa6a5fa 570 else if (fRefMultMethod==kVZERO)
2a745a5f 571 {
572 if (!esdevent) return 0;
573 vzero=esdevent->GetVZEROData();
574 if (!vzero) return 0;
575 return TMath::Nint(vzero->GetMTotV0A()+vzero->GetMTotV0C());
576 }
577 else if (fRefMultMethod==kSPD1clusters)
578 {
579 if (!esdevent) return 0;
580 const AliMultiplicity* mult = esdevent->GetMultiplicity();
581 if (!mult) return 0;
582 return mult->GetNumberOfITSClusters(1);
9a0783cc 583 }
584
2a745a5f 585 Int_t refmult=0;
4aae2a93 586 fRefMultCuts->SetEvent(event,mcEvent);
587 Int_t numberOfInputObjects = fRefMultCuts->GetNumberOfInputObjects();
588 for (Int_t i=0; i<numberOfInputObjects; i++) {
2948ac5a 589 if (fRefMultCuts->IsSelected(fRefMultCuts->GetInputObject(i),i))
590 refmult++;
591 }
592 return refmult;
333ce021 593}
499fe731 594//_____________________________________________________________________________
595void AliFlowEventCuts::DefineHistograms()
596{
a14b8f3c 597 //define QA histos
598 if (fQA) return;
599
499fe731 600 Bool_t adddirstatus = TH1::AddDirectoryStatus();
601 TH1::AddDirectory(kFALSE);
a14b8f3c 602 fQA = new TList(); fQA->SetOwner();
499fe731 603 fQA->SetName(Form("%s QA",GetName()));
a14b8f3c 604 TList* before = new TList(); before->SetOwner();
499fe731 605 before->SetName("before");
a14b8f3c 606 TList* after = new TList(); after->SetOwner();
499fe731 607 after->SetName("after");
608 fQA->Add(before);
609 fQA->Add(after);
a14b8f3c 610 before->Add(new TH1F("zvertex",";z;event cout",500,-15.,15.)); //0
611 after->Add(new TH1F("zvertex",";z;event cout",500,-15.,15.)); //0
612 before->Add(new TH2F("fTPCvsGlobalMult","TPC only vs Global track multiplicity;global;TPC only",500,0,2500,500,0,3500));//1
613 after->Add(new TH2F("fTPCvsGlobalMult","TPC only vs Global track multiplicity;global;TPC only",500,0,2500,500,0,3500));//1
499fe731 614 TH1::AddDirectory(adddirstatus);
615}
616
617//---------------------------------------------------------------//
618void AliFlowEventCuts::Browse(TBrowser* b)
619{
620 //some browsing capabilities
621 if (fQA) b->Add(fQA);
622}
623
624//---------------------------------------------------------------//
625Long64_t AliFlowEventCuts::Merge(TCollection* list)
626{
627 //merge
628 Int_t number=0;
629 AliFlowEventCuts* obj;
630 if (!list) return 0;
631 if (list->GetEntries()<1) return 0;
632 TIter next(list);
633 while ( (obj = dynamic_cast<AliFlowEventCuts*>(next())) )
634 {
635 if (obj==this) continue;
636 TList listwrapper;
637 listwrapper.Add(obj->GetQA());
638 fQA->Merge(&listwrapper);
639 number++;
640 }
641 return number;
642}
643
97c3cecc 644