]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - PWG/FLOW/Tasks/AliFlowEventCuts.cxx
from Ante Bilandzic:
[u/mrichter/AliRoot.git] / PWG / FLOW / Tasks / AliFlowEventCuts.cxx
... / ...
CommitLineData
1 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
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>
24#include <TList.h>
25#include <TH1F.h>
26#include <TH2F.h>
27#include <TBrowser.h>
28#include "TMath.h"
29#include "TNamed.h"
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"
44#include <iostream>
45using namespace std;
46
47ClassImp(AliFlowEventCuts)
48
49//-----------------------------------------------------------------------
50AliFlowEventCuts::AliFlowEventCuts():
51 AliFlowEventSimpleCuts(),
52 fQA(NULL),
53 fCutNumberOfTracks(kFALSE),
54 fNumberOfTracksMax(INT_MAX),
55 fNumberOfTracksMin(INT_MIN),
56 fCutRefMult(kFALSE),
57 fRefMultMethod(kTPConly),
58 fUseAliESDtrackCutsRefMult(kFALSE),
59 fRefMultMethodAliESDtrackCuts(AliESDtrackCuts::kTrackletsITSTPC),
60 fRefMultMax(INT_MAX),
61 fRefMultMin(INT_MIN),
62 fRefMultCuts(NULL),
63 fMeanPtCuts(NULL),
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),
78 fCutMeanPt(kFALSE),
79 fMeanPtMax(-DBL_MAX),
80 fMeanPtMin(DBL_MAX),
81 fCutSPDvertexerAnomaly(kFALSE),
82 fCutSPDTRKVtxZ(kFALSE),
83 fCutTPCmultiplicityOutliers(kFALSE),
84 fUseCentralityUnchecked(kFALSE),
85 fCentralityPercentileMethod(kTPConly),
86 fCutZDCtiming(kFALSE),
87 fTrigAna(),
88 fCutImpactParameter(kFALSE),
89 fImpactParameterMin(0.0),
90 fImpactParameterMax(100.0),
91 fhistTPCvsGlobalMult(0),
92 fData2011(kFALSE)
93{
94 //constructor
95}
96
97//-----------------------------------------------------------------------
98AliFlowEventCuts::AliFlowEventCuts(const char* name, const char* title):
99 AliFlowEventSimpleCuts(name, title),
100 fQA(NULL),
101 fCutNumberOfTracks(kFALSE),
102 fNumberOfTracksMax(INT_MAX),
103 fNumberOfTracksMin(INT_MIN),
104 fCutRefMult(kFALSE),
105 fRefMultMethod(kTPConly),
106 fUseAliESDtrackCutsRefMult(kFALSE),
107 fRefMultMethodAliESDtrackCuts(AliESDtrackCuts::kTrackletsITSTPC),
108 fRefMultMax(INT_MAX),
109 fRefMultMin(INT_MIN),
110 fRefMultCuts(NULL),
111 fMeanPtCuts(NULL),
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),
126 fCutMeanPt(kFALSE),
127 fMeanPtMax(-DBL_MAX),
128 fMeanPtMin(DBL_MAX),
129 fCutSPDvertexerAnomaly(kFALSE),
130 fCutSPDTRKVtxZ(kFALSE),
131 fCutTPCmultiplicityOutliers(kFALSE),
132 fUseCentralityUnchecked(kFALSE),
133 fCentralityPercentileMethod(kTPConly),
134 fCutZDCtiming(kFALSE),
135 fTrigAna(),
136 fCutImpactParameter(kFALSE),
137 fImpactParameterMin(0.0),
138 fImpactParameterMax(100.0),
139 fhistTPCvsGlobalMult(0),
140 fData2011(kFALSE)
141{
142 //constructor
143}
144
145////-----------------------------------------------------------------------
146AliFlowEventCuts::AliFlowEventCuts(const AliFlowEventCuts& that):
147 AliFlowEventSimpleCuts(that),
148 fQA(NULL),
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),
158 fRefMultCuts(NULL),
159 fMeanPtCuts(NULL),
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),
183 fTrigAna(),
184 fCutImpactParameter(that.fCutImpactParameter),
185 fImpactParameterMin(that.fImpactParameterMin),
186 fImpactParameterMax(that.fImpactParameterMax),
187 fhistTPCvsGlobalMult(that.fhistTPCvsGlobalMult),
188 fData2011(that.fData2011)
189{
190 if (that.fQA) DefineHistograms();
191 //copy constructor
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();
198}
199
200////-----------------------------------------------------------------------
201AliFlowEventCuts::~AliFlowEventCuts()
202{
203 //dtor
204 delete fMeanPtCuts;
205 delete fRefMultCuts;
206 delete fStandardGlobalCuts;
207 delete fStandardTPCcuts;
208 if (fQA) { fQA->SetOwner(); fQA->Delete(); delete fQA; }
209}
210
211////-----------------------------------------------------------------------
212AliFlowEventCuts& AliFlowEventCuts::operator=(const AliFlowEventCuts& that)
213{
214 //assignment
215 if (this==&that) return *this;
216
217 if (that.fQA)
218 {
219 if (fQA)
220 {
221 fQA->Delete();
222 delete fQA;
223 }
224 fQA = static_cast<TList*>(that.fQA->Clone());
225 }
226 else
227 {
228 fQA->Delete();
229 delete fQA;
230 fQA=NULL;
231 }
232
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;
269 return *this;
270}
271
272//-----------------------------------------------------------------------
273Bool_t AliFlowEventCuts::IsSelected(TObject* obj, TObject* objmc)
274{
275 //check cuts
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
280}
281//-----------------------------------------------------------------------
282Bool_t AliFlowEventCuts::PassesCuts(AliVEvent *event, AliMCEvent *mcevent)
283{
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();
290 Bool_t pass=kTRUE;
291 AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
292 AliAODEvent* aodevent = dynamic_cast<AliAODEvent*>(event);
293 Int_t multTPC = 0;
294 Int_t multGlobal = 0;
295 multTPC = fStandardTPCcuts->Count(event);
296 multGlobal = fStandardGlobalCuts->Count(event);
297 if (fQA)
298 {
299 QAbefore(0)->Fill(pvtxz);
300 QAbefore(1)->Fill(multGlobal,multTPC);
301 }
302 if ( (fCutTPCmultiplicityOutliers && esdevent) || (fCutTPCmultiplicityOutliers && aodevent) )
303 {
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)
307 if(esdevent){
308 if (multTPC > ( 23+1.216*multGlobal)) {pass=kFALSE;}
309 if (multTPC < (-20+1.087*multGlobal)) {pass=kFALSE;}
310 }
311
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;}
316 }
317 if(aodevent && !fData2011){
318 if (multTPC > ( 32.1+1.59*multGlobal)) {pass=kFALSE;}
319 if (multTPC < (-40.3+1.22*multGlobal)) {pass=kFALSE;}
320 }
321 */
322 }
323 if (fCutNContributors)
324 {
325 if (ncontrib < fNContributorsMin || ncontrib >= fNContributorsMax) pass=kFALSE;
326 }
327 if (fCutPrimaryVertexX)
328 {
329 if (pvtxx < fPrimaryVertexXmin || pvtxx >= fPrimaryVertexXmax) pass=kFALSE;
330 }
331 if (fCutPrimaryVertexY)
332 {
333 if (pvtxy < fPrimaryVertexYmin || pvtxy >= fPrimaryVertexYmax) pass=kFALSE;
334 }
335 if (fCutPrimaryVertexZ)
336 {
337 if (pvtxz < fPrimaryVertexZmin || pvtxz >= fPrimaryVertexZmax)
338 pass=kFALSE;
339 }
340 if (fCutCentralityPercentile&&esdevent)
341 {
342 AliCentrality* centr = esdevent->GetCentrality();
343 if (fUseCentralityUnchecked)
344 {
345 if (!centr->IsEventInCentralityClassUnchecked( fCentralityPercentileMin,
346 fCentralityPercentileMax,
347 CentrMethName(fCentralityPercentileMethod) ))
348 {
349 pass=kFALSE;
350 }
351 }
352 else
353 {
354 if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
355 fCentralityPercentileMax,
356 CentrMethName(fCentralityPercentileMethod) ))
357 {
358 pass=kFALSE;
359 }
360 }
361 }
362 if (fCutSPDvertexerAnomaly&&esdevent)
363 {
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)))
372 {
373 pass=kFALSE;
374 }
375 }
376 if (fCutZDCtiming&&esdevent)
377 {
378 if (!fTrigAna.ZDCTimeTrigger(esdevent))
379 {
380 pass=kFALSE;
381 }
382 }
383 if(fCutNumberOfTracks) {if ( event->GetNumberOfTracks() < fNumberOfTracksMin ||
384 event->GetNumberOfTracks() >= fNumberOfTracksMax ) pass=kFALSE;}
385 if((fCutRefMult&&mcevent)||(fCutRefMult&&esdevent))
386 {
387 //reference multiplicity still to be defined
388 Double_t refMult = RefMult(event,mcevent);
389 if (refMult < fRefMultMin || refMult >= fRefMultMax )
390 {
391 pass=kFALSE;
392 }
393 }
394
395 // Handles AOD event
396 if(aodevent) {
397 if(fCutSPDTRKVtxZ) {
398 Double_t tVtxZ = aodevent->GetPrimaryVertex()->GetZ();
399 Double_t tSPDVtxZ = aodevent->GetPrimaryVertexSPD()->GetZ();
400 if( TMath::Abs(tVtxZ-tSPDVtxZ) > 0.5 ) pass = kFALSE;
401 }
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;
407 }
408 if (fCutCentralityPercentile) {
409 if (fUseCentralityUnchecked) {
410 if (!centr->IsEventInCentralityClassUnchecked( fCentralityPercentileMin,
411 fCentralityPercentileMax,
412 CentrMethName(fCentralityPercentileMethod) )) {
413 pass = kFALSE;
414 }
415 } else {
416 if (!centr->IsEventInCentralityClass( fCentralityPercentileMin,
417 fCentralityPercentileMax,
418 CentrMethName(fCentralityPercentileMethod) )) {
419 pass = kFALSE;
420 }
421 }
422 }
423 }
424
425 if (fCutMeanPt)
426 {
427 Float_t meanpt=0.0;
428 Int_t ntracks=event->GetNumberOfTracks();
429 Int_t nselected=0;
430 for (Int_t i=0; i<ntracks; i++)
431 {
432 AliVParticle* track = event->GetTrack(i);
433 if (!track) continue;
434 Bool_t localpass=kTRUE;
435 if (fMeanPtCuts) localpass=fMeanPtCuts->IsSelected(track);
436 if (localpass)
437 {
438 meanpt += track->Pt();
439 nselected++;
440 }
441 }
442 if (nselected) meanpt=meanpt/nselected;
443 if (meanpt<fMeanPtMin || meanpt >= fMeanPtMax) pass=kFALSE;
444 }
445
446 //impact parameter cut
447 if(fCutImpactParameter) {
448 Double_t gImpactParameter = 0.;
449 if(mcevent) {
450 AliCollisionGeometry* headerH = dynamic_cast<AliCollisionGeometry*>(dynamic_cast<AliMCEvent*>(mcevent)->GenEventHeader());
451 if(headerH)
452 gImpactParameter = headerH->ImpactParameter();
453 }
454 if ((gImpactParameter < fImpactParameterMin) || (gImpactParameter >= fImpactParameterMax ))
455 pass=kFALSE;
456 }
457
458 if (fQA&&pass)
459 {
460 QAafter(1)->Fill(multGlobal,multTPC);
461 QAafter(0)->Fill(pvtxz);
462 }
463 return pass;
464}
465
466//-----------------------------------------------------------------------
467Float_t AliFlowEventCuts::GetCentrality(AliVEvent* event, AliMCEvent* /*mcEvent*/)
468{
469 //get the centrality percentile of the event
470 AliESDEvent* esdEvent = dynamic_cast<AliESDEvent*>(event);
471 AliAODEvent* aodEvent = dynamic_cast<AliAODEvent*>(event);
472
473 Float_t centrality=-1.;
474
475 AliCentrality* centr = NULL;
476 if (esdEvent)
477 centr = esdEvent->GetCentrality();
478 if (aodEvent)
479 centr = aodEvent->GetHeader()->GetCentralityP();
480
481 if (!centr) return -1.;
482
483 if (fUseCentralityUnchecked)
484 centrality=centr->GetCentralityPercentileUnchecked(CentrMethName(fCentralityPercentileMethod));
485 else
486 centrality=centr->GetCentralityPercentile(CentrMethName(fCentralityPercentileMethod));
487
488 return centrality;
489}
490
491//-----------------------------------------------------------------------
492const char* AliFlowEventCuts::CentrMethName(refMultMethod method) const
493{
494 //get the string for refmultmethod, for use with AliCentrality in
495 //the cut on centrality percentile
496 switch (method)
497 {
498 case kSPDtracklets:
499 return "TKL";
500 case kSPD1clusters:
501 return "CL1";
502 case kTPConly:
503 return "TRK";
504 case kVZERO:
505 return "V0M";
506 default:
507 return "";
508 }
509}
510//-----------------------------------------------------------------------
511AliFlowEventCuts* AliFlowEventCuts::StandardCuts()
512{
513 //make a set of standard event cuts, caller becomes owner
514 AliFlowEventCuts* cuts = new AliFlowEventCuts();
515 return cuts;
516}
517
518//-----------------------------------------------------------------------
519Int_t AliFlowEventCuts::RefMult(AliVEvent* event, AliMCEvent *mcEvent)
520{
521 //calculate the reference multiplicity, if all fails return 0
522 AliESDVZERO* vzero = NULL;
523 AliESDEvent* esdevent = dynamic_cast<AliESDEvent*>(event);
524
525 if (fUseAliESDtrackCutsRefMult && esdevent)
526 {
527 //use the standard ALICE reference multiplicity with the default eta range
528 return AliESDtrackCuts::GetReferenceMultiplicity(esdevent, fRefMultMethodAliESDtrackCuts);
529 }
530
531 if (fRefMultMethod==kTPConly && !fRefMultCuts)
532 {
533 fRefMultCuts = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts();
534 fRefMultCuts->SetEtaRange(-0.8,0.8);
535 fRefMultCuts->SetPtMin(0.15);
536 }
537 else if (fRefMultMethod==kSPDtracklets && !fRefMultCuts)
538 {
539 fRefMultCuts = new AliFlowTrackCuts("tracklet refmult cuts");
540 fRefMultCuts->SetParamType(AliFlowTrackCuts::kSPDtracklet);
541 fRefMultCuts->SetEtaRange(-0.8,0.8);
542 }
543 else if (fRefMultMethod==kVZERO)
544 {
545 if (!esdevent) return 0;
546 vzero=esdevent->GetVZEROData();
547 if (!vzero) return 0;
548 return TMath::Nint(vzero->GetMTotV0A()+vzero->GetMTotV0C());
549 }
550 else if (fRefMultMethod==kSPD1clusters)
551 {
552 if (!esdevent) return 0;
553 const AliMultiplicity* mult = esdevent->GetMultiplicity();
554 if (!mult) return 0;
555 return mult->GetNumberOfITSClusters(1);
556 }
557
558 Int_t refmult=0;
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))
563 refmult++;
564 }
565 return refmult;
566}
567//_____________________________________________________________________________
568void AliFlowEventCuts::DefineHistograms()
569{
570 //define QA histos
571 if (fQA) return;
572
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");
581 fQA->Add(before);
582 fQA->Add(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);
588}
589
590//---------------------------------------------------------------//
591void AliFlowEventCuts::Browse(TBrowser* b)
592{
593 //some browsing capabilities
594 if (fQA) b->Add(fQA);
595}
596
597//---------------------------------------------------------------//
598Long64_t AliFlowEventCuts::Merge(TCollection* list)
599{
600 //merge
601 Int_t number=0;
602 AliFlowEventCuts* obj;
603 if (!list) return 0;
604 if (list->GetEntries()<1) return 0;
605 TIter next(list);
606 while ( (obj = dynamic_cast<AliFlowEventCuts*>(next())) )
607 {
608 if (obj==this) continue;
609 TList listwrapper;
610 listwrapper.Add(obj->GetQA());
611 fQA->Merge(&listwrapper);
612 number++;
613 }
614 return number;
615}
616
617