AliPhysics  d0c3a41 (d0c3a41)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AliConvEventCuts.cxx
Go to the documentation of this file.
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Authors: Friederike Bock, Daniel Muehlheim *
5 * Version 1.0 *
6 * *
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 **************************************************************************/
15 
17 //---------------------------------------------
18 // Class handling all kinds of selection cuts for
19 // Gamma Conversion analysis
20 //---------------------------------------------
22 
23 #include "AliConvEventCuts.h"
24 
25 #include "AliAODTrack.h"
26 #include "AliESDtrack.h"
27 #include "AliAnalysisManager.h"
28 #include "AliInputEventHandler.h"
29 #include "AliMCEventHandler.h"
30 #include "AliAODHandler.h"
31 #include "TH1.h"
32 #include "TH2.h"
33 #include "TF1.h"
34 #include "TObjString.h"
35 #include "AliMCEvent.h"
36 #include "AliAODEvent.h"
37 #include "AliESDEvent.h"
38 #include "AliCentrality.h"
39 #include "AliMultSelection.h"
40 #include "TList.h"
41 #include "TFile.h"
42 #include "AliLog.h"
43 #include "AliGenCocktailEventHeader.h"
44 #include "AliGenDPMjetEventHeader.h"
45 #include "AliGenPythiaEventHeader.h"
46 #include "AliGenHijingEventHeader.h"
47 #include "AliTriggerAnalysis.h"
48 #include "AliV0ReaderV1.h"
49 #include "AliVCaloCells.h"
50 #include "AliAODMCParticle.h"
51 #include "AliAODMCHeader.h"
52 #include "AliEMCALTriggerPatchInfo.h"
53 
54 class iostream;
55 
56 using namespace std;
57 
59 ClassImp(AliConvEventCuts)
61 
62 
63 const char* AliConvEventCuts::fgkCutNames[AliConvEventCuts::kNCuts] = {
64  "HeavyIon", //0
65  "CentralityMin", //1
66  "CentralityMax", //2
67  "SelectSpecialTrigger", //3
68  "SelectSpecialSubTriggerClass", //4
69  "RemovePileUp", //5
70  "RejectExtraSignals", //6
71  "VertexCut", //7
72 };
73 
74 
75 //________________________________________________________________________
76 AliConvEventCuts::AliConvEventCuts(const char *name,const char *title) :
77  AliAnalysisCuts(name,title),
78  fHistograms(NULL),
79  fHeaderList(NULL),
80  fDoLightOutput(kFALSE),
81  fEventQuality(-1),
82  fIsHeavyIon(0),
83  fDetectorCentrality(0),
84  fModCentralityClass(0),
85  fEnableVertexCut(kTRUE),
86  fMaxVertexZ(10),
87  fCentralityMin(0),
88  fCentralityMax(0),
89  fMultiplicityMethod(0),
90  fSpecialTrigger(0),
91  fSpecialSubTrigger(0),
92  fRemovePileUp(kFALSE),
93  fPastFutureRejectionLow(0),
94  fPastFutureRejectionHigh(0),
95  fDoPileUpRejectV0MTPCout(0),
96  fFPileUpRejectV0MTPCout(0),
97  fRejectExtraSignals(0),
98  fOfflineTriggerMask(0),
99  fHasV0AND(kTRUE),
100  fIsSDDFired(kTRUE),
101  fRandom(0),
102  fnHeaders(0),
103  fNotRejectedStart(NULL),
104  fNotRejectedEnd(NULL),
105  fGeneratorNames(NULL),
106  fPeriodEnum(kNoPeriod),
107  fEnergyEnum(kUnset),
108  fCutString(NULL),
109  fCutStringRead(""),
110  fUtils(NULL),
111  fEtaShift(0.0),
112  fDoEtaShift(kFALSE),
113  fDoCentralityFlat(0),
114  fPathWeightsFlatCent(""),
115  fNameHistoNotFlatCentrality(""),
116  fDoReweightHistoMCPi0(kFALSE),
117  fDoReweightHistoMCEta(kFALSE),
118  fDoReweightHistoMCK0s(kFALSE),
119  fPathTrFReweighting(""),
120  fNameHistoReweightingPi0(""),
121  fNameHistoReweightingEta(""),
122  fNameHistoReweightingK0s(""),
123  fNameFitDataPi0(""),
124  fNameFitDataEta(""),
125  fNameFitDataK0s(""),
126  fHistoEventCuts(NULL),
127  fHistoPastFutureBits(NULL),
128  hCentrality(NULL),
129  hCentralityNotFlat(NULL),
130  //hCentralityVsNumberOfPrimaryTracks(NULL),
131  hVertexZ(NULL),
132  hNPileupVertices(NULL),
133  hPileupVertexToPrimZ(NULL),
134  hPileupVertexToPrimZSPDPileup(NULL),
135  hPileupVertexToPrimZTrackletvsHits(NULL),
136  hEventPlaneAngle(NULL),
137  fEventPlaneAngle(0),
138  hTriggerClass(NULL),
139  hTriggerClassSelected(NULL),
140  hTriggerClassesCorrelated(NULL),
141  hReweightMCHistPi0(NULL),
142  hReweightMCHistEta(NULL),
143  hReweightMCHistK0s(NULL),
144  fFitDataPi0(NULL),
145  fFitDataEta(NULL),
146  fFitDataK0s(NULL),
147  fAddedSignalPDGCode(0),
148  fPreSelCut(kFALSE),
149  fTriggerSelectedManually(kFALSE),
150  fSpecialTriggerName(""),
151  fSpecialSubTriggerName(""),
152  fNSpecialSubTriggerOptions(0),
153  hSPDClusterTrackletBackgroundBefore(NULL),
154  hSPDClusterTrackletBackground(NULL),
155  fV0ReaderName(""),
156  fCaloTriggers(NULL),
157  fTriggerPatchInfo(NULL),
158  fMainTriggerPatchEMCAL(NULL),
159  fCaloTriggersName(""),
160  fCaloTriggerPatchInfoName(""),
161  fTriggersEMCAL(0),
162  fTriggersEMCALSelected(-1),
163  fEMCALTrigInitialized(kFALSE),
164  fSecProdBoundary(1.0),
165  fMaxPtJetMC(0),
166  fMaxFacPtHard(2.5),
167  fMaxFacPtHardSingleParticle(1.5),
168  fMimicTrigger(kFALSE),
169  fRejectTriggerOverlap(kFALSE),
170  fDoMultiplicityWeighting(kFALSE),
171  fPathReweightingMult(""),
172  fNameHistoReweightingMultData(""),
173  fNameHistoReweightingMultMC(""),
174  hReweightMultData(NULL),
175  hReweightMultMC(NULL),
176  fDebugLevel(0)
177 {
178  for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
179  fCutString=new TObjString((GetCutNumber()).Data());
180 
181  fUtils = new AliAnalysisUtils();
182  //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
183  //fUtils->SetCutOnZVertexSPD(kFALSE);
184 
185 
186 }
187 
188 //________________________________________________________________________
190  AliAnalysisCuts(ref),
191  fHistograms(NULL),
192  fHeaderList(ref.fHeaderList),
193  fDoLightOutput(ref.fDoLightOutput),
194  fEventQuality(ref.fEventQuality),
195  fIsHeavyIon(ref.fIsHeavyIon),
196  fDetectorCentrality(ref.fDetectorCentrality),
197  fModCentralityClass(ref.fModCentralityClass),
198  fEnableVertexCut(ref.fEnableVertexCut),
199  fMaxVertexZ(ref.fMaxVertexZ),
200  fCentralityMin(ref.fCentralityMin),
201  fCentralityMax(ref.fCentralityMax),
202  fMultiplicityMethod(ref.fMultiplicityMethod),
203  fSpecialTrigger(ref.fSpecialTrigger),
204  fSpecialSubTrigger(ref.fSpecialSubTrigger),
205  fRemovePileUp(ref.fRemovePileUp),
206  fPastFutureRejectionLow(ref.fPastFutureRejectionLow),
207  fPastFutureRejectionHigh(ref.fPastFutureRejectionHigh),
208  fDoPileUpRejectV0MTPCout(ref.fDoPileUpRejectV0MTPCout),
209  fFPileUpRejectV0MTPCout(ref.fFPileUpRejectV0MTPCout),
210  fRejectExtraSignals(ref.fRejectExtraSignals),
211  fOfflineTriggerMask(ref.fOfflineTriggerMask),
212  fHasV0AND(ref.fHasV0AND),
213  fIsSDDFired(ref.fIsSDDFired),
214  fRandom(ref.fRandom),
215  fnHeaders(ref.fnHeaders),
216  fNotRejectedStart(NULL),
217  fNotRejectedEnd(NULL),
218  fGeneratorNames(ref.fGeneratorNames),
219  fPeriodEnum(ref.fPeriodEnum),
220  fEnergyEnum(kUnset),
221  fCutString(NULL),
222  fCutStringRead(""),
223  fUtils(NULL),
224  fEtaShift(ref.fEtaShift),
225  fDoEtaShift(ref.fDoEtaShift),
226  fDoCentralityFlat(ref.fDoCentralityFlat),
227  fPathWeightsFlatCent(ref.fPathWeightsFlatCent),
228  fNameHistoNotFlatCentrality(ref.fNameHistoNotFlatCentrality),
229  fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
230  fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
231  fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
232  fPathTrFReweighting(ref.fPathTrFReweighting),
233  fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
234  fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
235  fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
236  fNameFitDataPi0(ref.fNameFitDataPi0),
237  fNameFitDataEta(ref.fNameFitDataEta),
238  fNameFitDataK0s(ref.fNameFitDataK0s),
239  fHistoEventCuts(NULL),
240  fHistoPastFutureBits(NULL),
241  hCentrality(ref.hCentrality),
242  hCentralityNotFlat(ref.hCentralityNotFlat),
243  //hCentralityVsNumberOfPrimaryTracks(ref.hCentralityVsNumberOfPrimaryTracks),
244  hVertexZ(ref.hVertexZ),
245  hNPileupVertices(ref.hNPileupVertices),
246  hPileupVertexToPrimZ(ref.hPileupVertexToPrimZ),
247  hPileupVertexToPrimZSPDPileup(ref.hPileupVertexToPrimZSPDPileup),
248  hPileupVertexToPrimZTrackletvsHits(ref.hPileupVertexToPrimZTrackletvsHits),
249  hEventPlaneAngle(ref.hEventPlaneAngle),
250  fEventPlaneAngle(ref.fEventPlaneAngle),
251  hTriggerClass(NULL),
252  hTriggerClassSelected(NULL),
253  hTriggerClassesCorrelated(NULL),
254  hReweightMCHistPi0(ref.hReweightMCHistPi0),
255  hReweightMCHistEta(ref.hReweightMCHistEta),
256  hReweightMCHistK0s(ref.hReweightMCHistK0s),
257  fFitDataPi0(ref.fFitDataPi0),
258  fFitDataEta(ref.fFitDataEta),
259  fFitDataK0s(ref.fFitDataK0s),
260  fAddedSignalPDGCode(ref.fAddedSignalPDGCode),
261  fPreSelCut(ref.fPreSelCut),
262  fTriggerSelectedManually(ref.fTriggerSelectedManually),
263  fSpecialTriggerName(ref.fSpecialTriggerName),
264  fSpecialSubTriggerName(ref.fSpecialSubTriggerName),
265  fNSpecialSubTriggerOptions(ref.fNSpecialSubTriggerOptions),
266  hSPDClusterTrackletBackgroundBefore(NULL),
267  hSPDClusterTrackletBackground(NULL),
268  fV0ReaderName(ref.fV0ReaderName),
269  fCaloTriggers(NULL),
270  fTriggerPatchInfo(NULL),
271  fMainTriggerPatchEMCAL(NULL),
272  fCaloTriggersName(ref.fCaloTriggersName),
273  fCaloTriggerPatchInfoName(ref.fCaloTriggerPatchInfoName),
274  fTriggersEMCAL(ref.fTriggersEMCAL),
275  fTriggersEMCALSelected(ref.fTriggersEMCALSelected),
276  fEMCALTrigInitialized(kFALSE),
277  fSecProdBoundary(ref.fSecProdBoundary),
278  fMaxPtJetMC(ref.fMaxPtJetMC),
279  fMaxFacPtHard(ref.fMaxFacPtHard),
280  fMaxFacPtHardSingleParticle(ref.fMaxFacPtHardSingleParticle),
281  fMimicTrigger(ref.fMimicTrigger),
282  fRejectTriggerOverlap(ref.fRejectTriggerOverlap),
283  fDoMultiplicityWeighting(ref.fDoMultiplicityWeighting),
284  fPathReweightingMult(ref.fPathReweightingMult),
285  fNameHistoReweightingMultData(ref.fNameHistoReweightingMultData),
286  fNameHistoReweightingMultMC(ref.fNameHistoReweightingMultMC),
287  hReweightMultData(ref.hReweightMultData),
288  hReweightMultMC(ref.hReweightMultMC),
290 {
291  // Copy Constructor
292  for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
293  fCutString=new TObjString((GetCutNumber()).Data());
294  fUtils = new AliAnalysisUtils();
295  // dont copy histograms (if you like histograms, call InitCutHistograms())
296 
297 }
298 
299 
300 //________________________________________________________________________
302  // Destructor
303  //Deleting fHistograms leads to seg fault it it's added to output collection of a task
304  // if(fHistograms)
305  // delete fHistograms;
306  // fHistograms = NULL;
307  if(fCutString != NULL){
308  delete fCutString;
309  fCutString = NULL;
310  }
311  if(fNotRejectedStart){
312  delete[] fNotRejectedStart;
313  fNotRejectedStart = NULL;
314  }
315  if(fNotRejectedEnd){
316  delete[] fNotRejectedEnd;
317  fNotRejectedEnd = NULL;
318  }
319  if(fGeneratorNames){
320  delete[] fGeneratorNames;
321  fGeneratorNames = NULL;
322  }
323  if(fUtils){
324  delete fUtils;
325  fUtils = NULL;
326  }
327 
328 }
329 
330 //________________________________________________________________________
332 
333  // Initialize Cut Histograms for QA (only initialized and filled if function is called)
334  TH1::AddDirectory(kFALSE);
335 
336  if(fHistograms != NULL){
337  delete fHistograms;
338  fHistograms=NULL;
339  }
340  if(fHistograms==NULL){
341  fHistograms=new TList();
342  fHistograms->SetOwner(kTRUE);
343  if(name=="")fHistograms->SetName(Form("ConvEventCuts_%s",GetCutNumber().Data()));
344  else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
345  }
346 
347  if (hReweightMCHistPi0){
348  hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
350  }
351  if (hReweightMCHistEta){
352  hReweightMCHistEta->SetName("MCInputForWeightingEta");
354  }
355  if (hReweightMCHistK0s){
356  hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
358  }
359 
360  if (hReweightMultData){
361  hReweightMultData->SetName(Form("hReweightMultData_%s",GetCutNumber().Data()));
363  }
364  if (hReweightMultMC){
365  hReweightMultMC->SetName(Form("hReweightMultMC_%s",GetCutNumber().Data()));
367  }
368 
369  if(!fDoLightOutput){
370  hSPDClusterTrackletBackgroundBefore = new TH2F(Form("SPD tracklets vs SPD clusters %s before Pileup Cut",GetCutNumber().Data()),"SPD tracklets vs SPD clusters",100,0,200,250,0,1000);
372 
373  hSPDClusterTrackletBackground = new TH2F(Form("SPD tracklets vs SPD clusters %s",GetCutNumber().Data()),"SPD tracklets vs SPD clusters",100,0,200,250,0,1000);
375  }
376 
377  if(fIsHeavyIon > 0){
378  hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",400,0,100);
379  fHistograms->Add(hCentrality);
380  }
381 
382  //hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",400,0,100,4000,0,4000);
383  //fHistograms->Add(hCentralityVsNumberOfPrimaryTracks); commented on 3.3.2015 because it's in the main Task
384 
385  hVertexZ = new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
386  fHistograms->Add(hVertexZ);
387 
388  hNPileupVertices = new TH1F(Form("NPileupVertices %s",GetCutNumber().Data()),"NPileupVertices",30,-0.5,29.5);
390 
391  hPileupVertexToPrimZ = new TH1F(Form("PileupVertexDistance %s",GetCutNumber().Data()),"PileupVertexDistance",600,-15,15);
393  hPileupVertexToPrimZSPDPileup = new TH1F(Form("PileupVertexDistance_SPDPileup %s",GetCutNumber().Data()),"PileupVertexDistance_SPDPileup",600,-15,15);
395  hPileupVertexToPrimZTrackletvsHits = new TH1F(Form("PileupVertexDistance_TrackletvsHits %s",GetCutNumber().Data()),"PileupVertexDistance_TrackletvsHits",600,-15,15);
397 
398  if(fIsHeavyIon == 1){
399  hEventPlaneAngle = new TH1F(Form("EventPlaneAngle %s",GetCutNumber().Data()),"EventPlaneAngle",60, 0, TMath::Pi());
401  }
402  fHistoPastFutureBits=new TH1F(Form("PastFutureBits %s",GetCutNumber().Data()),"Past Future Bits",180,-90*25,90*25);
404 
405  // Event Cuts and Info
406  if(preCut){
407  fHistoEventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",8,-0.5,7.5);
408  fHistoEventCuts->GetXaxis()->SetBinLabel(1,"in");
409  fHistoEventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
410  fHistoEventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
411  fHistoEventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
412  fHistoEventCuts->GetXaxis()->SetBinLabel(5,"pileup");
413  fHistoEventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
414  fHistoEventCuts->GetXaxis()->SetBinLabel(7,"OOB-pileup");
415  fHistoEventCuts->GetXaxis()->SetBinLabel(8,"out");
417 
418  hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",36,-0.5,35.5);
419  hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
420  hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
421  hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
422  hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
423  hTriggerClass->GetXaxis()->SetBinLabel( 5,"kEMC1");
424  hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
425  hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
426  hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
427  hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
428  hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
429  hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
430  hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
431  hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
432  hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
433  hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
434  hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
435  hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
436  hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
437  hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
438  hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
439  hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
440  hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
441  hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
442  hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
443  hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
444  hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
445  hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
446  hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
447  hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
448  hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
449  hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
450  hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
451  hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
452  hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
453  hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
454  hTriggerClass->GetXaxis()->SetBinLabel(36,"mimickedTrigger");
456  }
457  if(!preCut){
458  hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",35,-0.5,34.5);
459  hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
460  hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
461  hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
462  hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
463  hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kEMC1");
464  hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
465  hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
466  hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
467  hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
468  hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
469  hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
470  hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
471  hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
472  hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
473  hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
474  hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
475  hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
476  hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
477  hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
478  hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
479  hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
480  hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
481  hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
482  hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
483  hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
484  hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
485  hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
486  hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
487  hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
488  hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
489  hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
490  hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
491  hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
492  hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
493  hTriggerClassSelected->GetXaxis()->SetBinLabel(35,"mimickedTrigger");
495 
496  if (fSpecialTrigger == 5 || fSpecialTrigger == 8 || fSpecialTrigger == 9){
497  hTriggerClassesCorrelated= new TH1F(Form("TriggerCorrelations %s",GetCutNumber().Data()),"Triggers Correlated with EMCal triggers",10,-0.5,9.5);
498  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 1,"kMB");
499  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 2,"kINT7");
500  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 3,"kEMC1");
501  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 4,"kEMC7");
502  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 5,"kEMCEJE");
503  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 6,"kEMCEJ1");
504  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 7,"kEMCEJ2");
505  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 8,"kEMCEGA");
506  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 9,"kEMCEG1");
507  hTriggerClassesCorrelated->GetXaxis()->SetBinLabel( 10,"kEMCEG2");
509  }
510 
511  }
512  TH1::AddDirectory(kTRUE);
513 }
514 
516 Bool_t AliConvEventCuts::EventIsSelected(AliVEvent *event, AliMCEvent *mcEvent){
517  // Process Event Selection
518 
519  Int_t cutindex=0;
520  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
521  cutindex++;
522 
523  // Check for MC event
524  Bool_t isMC = kFALSE;
525  if(mcEvent && event->IsA()==AliESDEvent::Class()){
526  // Check if MC event is correctly loaded
527  AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
528  if (!mcHandler){
529  fEventQuality = 2;
530  return kFALSE;
531  }
532  if (!mcHandler->InitOk() ){
533  fEventQuality = 2;
534  return kFALSE;
535  }
536  if (!mcHandler->TreeK() ){
537  fEventQuality = 2;
538  return kFALSE;
539  }
540  if (!mcHandler->TreeTR() ) {
541  fEventQuality = 2;
542  return kFALSE;
543  }
544  isMC = kTRUE;
545  }
546 
547 
548 
549  // Event Trigger
550  // cout << "before event trigger" << endl;
551  if(!IsTriggerSelected(event, isMC )){
552  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
553  fEventQuality = 3;
554  return kFALSE;
555  }
556  cutindex++;
557 
558  if(event->IsA()==AliESDEvent::Class()){
559  AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
560  fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)event, AliTriggerAnalysis::kV0AND);
561  if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
562  }
563  // cout << "event number " << ((AliESDEvent*)event)->GetEventNumberInFile() << " entered"<< endl;
564 
565 
566  // Number of Contributors Cut
567  if (fEnableVertexCut){
568  if(GetNumberOfContributorsVtx(event)<=0) {
569  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
570  fEventQuality = 5;
571  return kFALSE;
572  }
573  }
574  cutindex++;
575 
576  // Z Vertex Position Cut
577  if (fEnableVertexCut){
578  if(!VertexZCut(event)){
579  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
580  fEventQuality = 4;
581  return kFALSE;
582  }
583  }
584  cutindex++;
585 
586  // SPD clusters vs tracklets to check for pileup/background
587  Int_t nClustersLayer0 = event->GetNumberOfITSClusters(0);
588  Int_t nClustersLayer1 = event->GetNumberOfITSClusters(1);
589  Int_t nTracklets = event->GetMultiplicity()->GetNumberOfTracklets();
590  if(hSPDClusterTrackletBackgroundBefore) hSPDClusterTrackletBackgroundBefore->Fill(nTracklets, (nClustersLayer0 + nClustersLayer1));
591 
592 
593  Double_t distZMax = 0;
594  if(event->IsA()==AliESDEvent::Class()){
595  Int_t nPileVert = ((AliESDEvent*)event)->GetNumberOfPileupVerticesSPD();
596  if (hNPileupVertices) hNPileupVertices->Fill(nPileVert);
597  if (nPileVert > 0){
598  for(Int_t i=0; i<nPileVert;i++){
599  const AliESDVertex* pv = ((AliESDEvent*)event)->GetPileupVertexSPD(i);
600  Int_t nc2 = pv->GetNContributors();
601  if(nc2>=3){
602  Double_t z1 = ((AliESDEvent*)event)->GetPrimaryVertexSPD()->GetZ();
603  Double_t z2 = pv->GetZ();
604  Double_t distZ = z2-z1;
605  if (TMath::Abs(distZMax) < TMath::Abs(distZ) ){
606  distZMax = distZ;
607  }
608  }
609  }
610  if (hPileupVertexToPrimZ) hPileupVertexToPrimZ->Fill(distZMax);
611  }
612  }
613 
614  // Pile Up Rejection
615  if (fIsHeavyIon == 2){
616  if(GetUseNewMultiplicityFramework()){// for Run2 pPb
617  if(fUtils->IsPileUpMV(event)){
618  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
619  fEventQuality = 6;
620  return kFALSE;
621  }
622  } else{
623  if(fUtils->IsFirstEventInChunk(event)){
624  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
625  fEventQuality = 6;
626  return kFALSE;
627  }
628  if(fRemovePileUp){
629  if(fUtils->IsPileUpEvent(event)){
630  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
632  fEventQuality = 6;
633  return kFALSE;
634  }
635  if (fUtils->IsSPDClusterVsTrackletBG(event)){
636  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
638  fEventQuality = 11;
639  return kFALSE;
640  }
641  }
642  }
643  } else if(fRemovePileUp){
644  if(event->IsPileupFromSPD(3,0.8,3.,2.,5.) ){
645  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
647  fEventQuality = 6;
648  return kFALSE;
649  }
650  if (fUtils->IsSPDClusterVsTrackletBG(event)){
651  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
653  fEventQuality = 11;
654  return kFALSE;
655  }
656  }
657  cutindex++;
658 
659  // Centrality Selection
660  if(!IsCentralitySelected(event,mcEvent)){
661  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
662  fEventQuality = 1;
663  return kFALSE;
664  }
665  cutindex++;
666 
668  if(fHistoEventCuts) fHistoEventCuts->Fill(cutindex);
669  fEventQuality = 12;
670  return kFALSE;
671  }
672  cutindex++;
673  // Fill Event Histograms
674  if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
675  if(hCentrality)hCentrality->Fill(GetCentrality(event));
676  if(hVertexZ)hVertexZ->Fill(event->GetPrimaryVertex()->GetZ());
677  // if(hCentralityVsNumberOfPrimaryTracks)
678  // hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(event),
679  // ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
680  // ->GetTask(fV0ReaderName.Data()))->GetNumberOfPrimaryTracks());
681 
682  if(fIsHeavyIon == 1){
683  AliEventplane *EventPlane = event->GetEventplane();
684  fEventPlaneAngle = EventPlane->GetEventplane("V0",event,2);
685  if(hEventPlaneAngle)hEventPlaneAngle->Fill(TMath::Abs(fEventPlaneAngle));
686  }
687  if(hSPDClusterTrackletBackground) hSPDClusterTrackletBackground->Fill(nTracklets, (nClustersLayer0 + nClustersLayer1));
688 
689  fEventQuality = 0;
690  return kTRUE;
691 }
692 
696 
697  if(fCutString && fCutString->GetString().Length() == kNCuts) {
698  fCutString->SetString(GetCutNumber());
699  } else {
700  return kFALSE;
701  }
702  return kTRUE;
703 }
704 
707 
708  AliInfo("Entering loading of weights for centrality flattening");
709  TFile *w = TFile::Open(fPathWeightsFlatCent.Data());
710  if(!w){
711  AliError(Form("file for centrality flattening %s not found",fPathWeightsFlatCent.Data()));
712  return;
713  }
714 
715  if (fNameHistoNotFlatCentrality.CompareTo("") != 0 && (fDoCentralityFlat > 0)){
716  cout << "I have to find: " << fNameHistoNotFlatCentrality.Data() << endl;
717  TH1D *hCentralityNotFlattemp = (TH1D*)w->Get(fNameHistoNotFlatCentrality.Data());
718  hCentralityNotFlat = new TH1D(*hCentralityNotFlattemp);
719  if (hCentralityNotFlat) AliInfo(Form("%s has been loaded from %s", fNameHistoNotFlatCentrality.Data(),fPathWeightsFlatCent.Data() ));
720  else AliWarning(Form("%s not found in %s", fNameHistoNotFlatCentrality.Data() ,fPathWeightsFlatCent.Data()));
721  hCentralityNotFlat->SetDirectory(0);
722  }
723 
724  w->Close();
725  delete w;
726 }
727 
730 
731  AliInfo("Entering loading of weights for multiplicity weighting");
732  TFile *w = TFile::Open(fPathReweightingMult.Data());
733  if(!w){
734  AliError(Form("file for multiplicity reweighting %s not found",fPathReweightingMult.Data()));
735  return;
736  }
737 
738  if (fNameHistoReweightingMultData.CompareTo("") != 0 && (fDoMultiplicityWeighting > 0)){
739  cout << "I have to find: " << fNameHistoReweightingMultData.Data() << endl;
740  TH1D *hReweightMultDatatemp = (TH1D*)w->Get(fNameHistoReweightingMultData.Data());
741  if (hReweightMultDatatemp == NULL) AliError(Form("%s was not contained in %s", fNameHistoReweightingMultData.Data(),fPathReweightingMult.Data() ));
742  hReweightMultData = new TH1D(*hReweightMultDatatemp);
743  if (hReweightMultData) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingMultData.Data(),fPathReweightingMult.Data() ));
744  else AliWarning(Form("%s not found in %s", fNameHistoReweightingMultData.Data() ,fPathReweightingMult.Data()));
745  hReweightMultData->SetDirectory(0);
746  }
747  if (fNameHistoReweightingMultMC.CompareTo("") != 0 && (fDoMultiplicityWeighting > 0)){
748  cout << "I have to find: " << fNameHistoReweightingMultMC.Data() << endl;
749  TH1D *hReweightMultMCtemp = (TH1D*)w->Get(fNameHistoReweightingMultMC.Data());
750  if (hReweightMultMCtemp == NULL) AliError(Form("%s was not contained in %s", fNameHistoReweightingMultMC.Data(),fPathReweightingMult.Data() ));
751  hReweightMultMC = new TH1D(*hReweightMultMCtemp);
752  if (hReweightMultData) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingMultMC.Data(),fPathReweightingMult.Data() ));
753  else AliWarning(Form("%s not found in %s", fNameHistoReweightingMultMC.Data() ,fPathReweightingMult.Data()));
754  hReweightMultMC->SetDirectory(0);
755  }
756 
757  w->Close();
758  delete w;
759 }
760 
761 
764 
765  AliInfo("Entering loading of histograms for weighting");
766  TFile *f = TFile::Open(fPathTrFReweighting.Data());
767  if(!f){
768  AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
769  return;
770  }
771  if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
772  cout << "I have to find: " << fNameHistoReweightingPi0.Data() << endl;
773  TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
774  hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
775  if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
776  else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
777  hReweightMCHistPi0->SetDirectory(0);
778  }
779  if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
780  cout << "I have to find: " << fNameFitDataPi0.Data() << endl;
781  TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
782  fFitDataPi0 = new TF1(*fFitDataPi0temp);
783  if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
784  else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
785  }
786 
787  if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
788  cout << "I have to find: " << fNameHistoReweightingEta.Data() << endl;
789  TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
790  hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
791  if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
792  else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
793  hReweightMCHistEta->SetDirectory(0);
794  }
795 
796  if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
797  cout << "I have to find: " << fNameFitDataEta.Data() << endl;
798  TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
799  fFitDataEta = new TF1(*fFitDataEtatemp);
800  if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
801  else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
802 
803  }
804  if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
805  cout << "I have to find: " << fNameHistoReweightingK0s.Data() << endl;
806  TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
807  hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
808  if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
809  else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
810  hReweightMCHistK0s->SetDirectory(0);
811  }
812 
813  if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
814  cout << "I have to find: " << fNameFitDataK0s.Data() << endl;
815  TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
816  fFitDataK0s = new TF1(*fFitDataK0stemp);
817  if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
818  else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
819  }
820  f->Close();
821  delete f;
822 }
823 
824 
827  fCutStringRead = Form("%s",analysisCutSelection.Data());
828 
829  // Initialize Cuts from a given Cut string
830  if(fDoCentralityFlat > 0){
831  AliInfo("Centrality flattening was enabled");
833  }
834 
836  AliInfo("Multiplicity weighting was enabled");
838  }
840  AliInfo("Particle Weighting was enabled");
842  }
843 
844 
845  AliInfo(Form("Set Event Cut Number: %s",analysisCutSelection.Data()));
846  if(analysisCutSelection.Length()!=kNCuts) {
847  AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
848  return kFALSE;
849  }
850  if(!analysisCutSelection.IsAlnum()){
851  AliError("Cut selection is not alphanumeric");
852  return kFALSE;
853  }
854 
855  if (fV0ReaderName.CompareTo("") == 0){
856  fV0ReaderName = "V0ReaderV1";
857  }
858  TString analysisCutSelectionLowerCase = Form("%s",analysisCutSelection.Data());
859  analysisCutSelectionLowerCase.ToLower();
860  const char *cutSelection = analysisCutSelectionLowerCase.Data();
861  #define ASSIGNARRAY(i) fCuts[i] = ((int)cutSelection[i]>=(int)'a') ? cutSelection[i]-'a'+10 : cutSelection[i]-'0'
862  for(Int_t ii=0;ii<kNCuts;ii++){
863  ASSIGNARRAY(ii);
864  }
865 
866  // Set Individual Cuts
867  for(Int_t ii=0;ii<kNCuts;ii++){
868  if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
869  }
870 
872 
873  return kTRUE;
874 }
875 
879 // "HeavyIon", //0
880 // "CentralityMin", //1
881 // "CentralityMax", //2
882 // "SelectSpecialTrigger", //3
883 // "SelectSpecialSubTriggerClass", //4
884 // "RemovePileUp", //5
885 // "RejectExtraSignals", //6
886 // "VertexCut", //7
887 
888  switch (cutID) {
889  case kisHeavyIon:
890  if( SetIsHeavyIon(value)) {
891  fCuts[kisHeavyIon] = value;
892  UpdateCutString();
893  return kTRUE;
894  } else return kFALSE;
895  case kCentralityMin:
896  if( SetCentralityMin(value)) {
897  fCuts[kCentralityMin] = value;
898  UpdateCutString();
899  return kTRUE;
900  } else return kFALSE;
901  case kCentralityMax:
902  if( SetCentralityMax(value)) {
903  fCuts[kCentralityMax] = value;
904  UpdateCutString();
905  return kTRUE;
906  } else return kFALSE;
908  if( SetSelectSpecialTrigger(value)) {
910  UpdateCutString();
911  return kTRUE;
912  } else return kFALSE;
914  if( SetSelectSubTriggerClass(value)) {
915  fCuts[kSelectSubTriggerClass] = value;
916  UpdateCutString();
917  return kTRUE;
918  } else return kFALSE;
919  case kremovePileUp:
920  if( SetRemovePileUp(value)) {
921  fCuts[kremovePileUp] = value;
922  UpdateCutString();
923  return kTRUE;
924  } else return kFALSE;
925  case kExtraSignals:
926  if( SetRejectExtraSignalsCut(value)) {
927  fCuts[kExtraSignals] = value;
928  UpdateCutString();
929  return kTRUE;
930  } else return kFALSE;
931  case kVertex:
932  if( SetVertexCut(value)) {
933  fCuts[kVertex] = value;
934  UpdateCutString();
935  return kTRUE;
936  } else return kFALSE;
937 
938  case kNCuts:
939  AliError("Cut id out of range");
940  return kFALSE;
941  }
942 
943  AliError("Cut id %d not recognized");
944  return kFALSE;
945 }
946 
949  // Print out current Cut Selection
950  for(Int_t ic = 0; ic < kNCuts; ic++) {
951  printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
952  }
953 }
954 
956  // Print out current Cut Selection with value
957  printf("\nEvent cutnumber \n");
958  for(Int_t ic = 0; ic < kNCuts; ic++) {
959  printf("%d",fCuts[ic]);
960  }
961  printf("\n\n");
962  if (fIsHeavyIon == 0) {
963  printf("Running in pp mode \n");
964  if (fSpecialTrigger == 0){
965  if (fSpecialSubTrigger == 0){
966  printf("\t only events triggered by V0OR will be analysed \n");
967  } else if (fSpecialSubTrigger == 1){
968  printf("\t only events where SDD was present will be analysed \n");
969  }
970  } else if (fSpecialTrigger == 1){
971  if (fSpecialSubTrigger == 0){
972  printf("\t only events triggered by V0AND will be analysed \n");
973  } else if(fSpecialSubTrigger == 1){
974  printf("\t only events where SDD was present will be analysed and triggered by VOAND\n");
975  }
976  if (fRejectTriggerOverlap) printf("\t reject trigger overlaps");
977  } else if (fSpecialTrigger > 1){
978  printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
979  if (fRejectTriggerOverlap) printf("\t reject trigger overlaps\n\n");
980  }
981  if ( !(fCentralityMin == 0 && fCentralityMax == 0) && !(fCentralityMax < fCentralityMin) ){
982  printf("\t Multiplicity cut %d - %d \n", fCentralityMin, fCentralityMax);
983  }
984  } else if (fIsHeavyIon == 1){
985  printf("Running in PbPb mode \n");
986  if (fDetectorCentrality == 0){
987  printf("\t centrality selection based on V0M \n");
988  } else if (fDetectorCentrality == 1){
989  printf("\t centrality selection based on Cl1 \n");
990  }
991  if (fModCentralityClass == 0){
992  printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
993  } else if ( fModCentralityClass == 1){
994  printf("\t %d - %d \n", fCentralityMin*5, fCentralityMax*5);
995  } else if ( fModCentralityClass == 2){
996  printf("\t %d - %d \n", fCentralityMin*5+45, fCentralityMax*5+45);
997  } else if (fModCentralityClass == 3){
998  printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*10, fCentralityMax*10);
999  } else if ( fModCentralityClass == 4){
1000  printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5, fCentralityMax*5);
1001  } else if ( fModCentralityClass == 5){
1002  printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5+45, fCentralityMax*5+45);
1003  }
1004  if (fSpecialTrigger == 0){
1005  printf("\t only events triggered by kMB, kCentral, kSemiCentral will be analysed \n");
1006  } else if (fSpecialTrigger > 1){
1007  printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
1008  printf("\n\t SpecialTrigger is: %s\n", fSpecialTriggerName.Data());
1009  printf("\t SpecialSubTrigger is: %s\n", fSpecialSubTriggerName.Data());
1010  if (fRejectTriggerOverlap) printf("\t reject trigger overlaps\n\n");
1011  }
1012  } else if (fIsHeavyIon == 2){
1013  printf("Running in pPb mode \n");
1014  if (fDetectorCentrality == 0){
1015  printf("\t centrality selection based on V0A \n");
1016  } else if (fDetectorCentrality == 1){
1017  printf("\t centrality selection based on Cl1 \n");
1018  }
1019  if (fModCentralityClass == 0){
1020  printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
1021  }
1022  if (fSpecialTrigger == 0){
1023  printf("\t only events triggered by kINT7 will be analysed \n");
1024  } else if (fSpecialTrigger > 1){
1025  printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
1026  if (fRejectTriggerOverlap) printf("\t reject trigger overlaps\n\n");
1027  }
1028  }
1029  if (fEnableVertexCut) printf("\t Vertex cut with |Z_{vtx}| <%2.2f \n",fMaxVertexZ);
1030  else printf("\t No vertex cut \n");
1031 
1032  if (fRemovePileUp ==1 ) {
1033  printf("\t Doing pile up removal \n");
1034  if (fDoPileUpRejectV0MTPCout ==1 ){
1035  printf("\t Doing extra pile up removal V0M vs TPCout \n");
1036  }
1037  }
1038 
1039  printf("MC event cuts: \n");
1040  if (fRejectExtraSignals == 0) printf("\t no rejection was applied \n");
1041  else if (fRejectExtraSignals == 1) printf("\t only MB header will be inspected \n");
1042  else if (fRejectExtraSignals > 1) printf("\t special header have been selected \n");
1043  printf("\t maximum factor between jet and pt hard = %2.2f \n", fMaxFacPtHard);
1044 }
1045 
1048 { // Set Cut
1049  switch(isHeavyIon){
1050  case 0:
1051  fIsHeavyIon=0;
1052  break;
1053  case 1:
1054  fIsHeavyIon=1;
1056  break;
1057  case 2:
1058  fIsHeavyIon=1;
1060  break;
1061  case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
1062  fIsHeavyIon=1;
1065  break;
1066  case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
1067  fIsHeavyIon=1;
1070  break;
1071  case 5: //strict cut on v0 tracks for MC
1072  fIsHeavyIon=1;
1075  break;
1076  case 6: //allows to select centrality 0-45% in steps of 5% for track mult
1077  //strict cut on v0 tracks for MC
1078  fIsHeavyIon=1;
1081  break;
1082  case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
1083  //strict cut on v0 tracks for MC
1084  fIsHeavyIon=1;
1087  break;
1088  case 8:
1089  fIsHeavyIon=2;
1091  break;
1092  case 9:
1093  fIsHeavyIon=2;
1095  break;
1096  default:
1097  AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
1098  return kFALSE;
1099  }
1100  return kTRUE;
1101 }
1102 
1103 //___________________________________________________________________
1105 {
1106  // Set Cut
1107  if(minCentrality<0||minCentrality>9){
1108  AliError(Form("minCentrality not defined %d",minCentrality));
1109  return kFALSE;
1110  }
1111 
1112  fCentralityMin=minCentrality;
1113  return kTRUE;
1114 }
1115 
1116 //___________________________________________________________________
1118 {
1119  // Set Cut
1120  if(maxCentrality<0||maxCentrality>9){
1121  AliError(Form("maxCentrality not defined %d",maxCentrality));
1122  return kFALSE;
1123  }
1124  fCentralityMax=maxCentrality;
1125  return kTRUE;
1126 }
1127 
1130 {
1131  // Set Cut
1132  switch(selectSpecialTrigger){
1133  case 0:
1134  fSpecialTrigger=0; // V0OR
1135  break;
1136  case 1:
1137  fSpecialTrigger=1; // V0AND
1138  break;
1139 // case 2:
1140 // fSpecialTrigger=2; //
1141 // break;
1142  case 3:
1143  fSpecialTrigger=3; //specific centrality trigger selection
1144  fSpecialTriggerName="AliVEvent::kCentral/kSemiCentral/kMB";
1145  break;
1146  case 4:
1147  fSpecialTrigger=4; // trigger alias kTRD
1148  fOfflineTriggerMask=AliVEvent::kTRD;
1149  fTriggerSelectedManually = kTRUE;
1150  fSpecialTriggerName="AliVEvent::kTRD";
1151  break;
1152  case 5:
1153  fSpecialTrigger=5; // trigger alias kEMC
1154  fOfflineTriggerMask=AliVEvent::kEMC7 | AliVEvent::kEMC8 | AliVEvent::kEMC1 ;
1155  fTriggerSelectedManually = kTRUE;
1157  SETBIT(fTriggersEMCALSelected, kL0);
1158  fSpecialTriggerName="AliVEvent::kEMC7/kEMC8/kEMC1";
1159  break;
1160  case 6:
1161  fSpecialTrigger=6; // trigger alias kPHI
1162  fOfflineTriggerMask=AliVEvent::kPHI7 | AliVEvent::kPHI1 | AliVEvent::kPHI8 | AliVEvent::kPHOSPb;
1163  fTriggerSelectedManually = kTRUE;
1164  fSpecialTriggerName="AliVEvent::kPHI7/kPHI1/kPHI8/kPHOSPb";
1165  break;
1166  case 7:
1167  fSpecialTrigger=7; // trigger alias kHighMult
1168  fOfflineTriggerMask=AliVEvent::kHighMult;
1169  fTriggerSelectedManually = kTRUE;
1170  fSpecialTriggerName="AliVEvent::kHighMult";
1171  break;
1172  case 8:
1173  fSpecialTrigger=8; // trigger alias kEMCEGA
1174  fOfflineTriggerMask=AliVEvent::kEMCEGA;
1175  fTriggerSelectedManually = kTRUE;
1177  SETBIT(fTriggersEMCALSelected, kG2);
1178  fSpecialTriggerName="AliVEvent::kEMCEGA";
1179  break;
1180  case 9:
1181  fSpecialTrigger=9; // trigger alias kEMCEJE
1182  fOfflineTriggerMask=AliVEvent::kEMCEJE;
1183  fTriggerSelectedManually = kTRUE;
1185  SETBIT(fTriggersEMCALSelected, kJ2);
1186  fSpecialTriggerName="AliVEvent::kEMCEJE";
1187  break;
1188  default:
1189  AliError("Warning: Special Trigger Not known");
1190  return 0;
1191  }
1192  return 1;
1193 }
1194 
1197 {
1198  // Set Cut
1199  if (fSpecialTrigger == 0){ //OR
1200  switch(selectSpecialSubTriggerClass){
1201  case 0://with VZERO
1202  fSpecialTrigger=0;
1204 // AliInfo("Info: Nothing to be done");
1205  break;
1206  case 3: //V0OR with SDD requested (will only work with LHC11a dataset)
1208 // cout << "V0OR with SDD requested" << endl;
1209  break;
1210  default:
1211  AliError("Warning: Special Subtrigger Class Not known");
1212  return 0;
1213  }
1214  } else if (fSpecialTrigger == 1){ //AND with different detectors
1215  switch(selectSpecialSubTriggerClass){
1216  case 0: //with VZERO general implementation of V0AND (periods LHC11c onwards)
1217  fSpecialTrigger=0;
1219  fOfflineTriggerMask=AliVEvent::kINT7;
1220  fTriggerSelectedManually = kTRUE;
1221  fSpecialTriggerName="AliVEvent::kINT7";
1222  break;
1223  case 1: //with TZERO
1224  fSpecialTrigger=0;
1226  fOfflineTriggerMask=AliVEvent::kINT8;
1227  fTriggerSelectedManually = kTRUE;
1228  fSpecialTriggerName="AliVEvent::kINT8";
1229  break;
1230  case 2: //with VZERO (will only work with LHC11a dataset)
1231  fSpecialTrigger=1;
1233 // AliInfo("Info: Nothing to be done");
1234  break;
1235  case 3: //V0AND with SDD requested (will only work with LHC11a dataset)
1236  fSpecialTrigger=1;
1238  break;
1239  default:
1240  AliError("Warning: Special Subtrigger Class Not known");
1241  return 0;
1242  }
1243  } else if (fSpecialTrigger == 3){ // Selecting kCentral and kSemiCentral from trigger classes, not aliases
1244  switch(selectSpecialSubTriggerClass){
1245  case 0: // all together
1248 // AliInfo("Info: Nothing to be done");
1249  break;
1250  case 1: // kCentral - no vertex restriction
1253  fSpecialSubTriggerName="CVHN";
1254 // cout << "kCentralOpen" << endl;
1255  break;
1256  case 2: // kCentral - T00 +- 10 cm
1259  fSpecialSubTriggerName="CCENT";
1260 // cout << "kCentralVertex" << endl;
1261  break;
1262  case 3: // kCentral - both
1265  fSpecialSubTriggerName="CVHN|CCENT|CSEMI|CVLN";
1266 // cout << "kCentral both" << endl;
1267  break;
1268  case 4: // kSemiCentral - no vertex restriction
1271  fSpecialSubTriggerName="CVLN";
1272 // cout << "kSemiCentralOpen" << endl;
1273  break;
1274  case 5: // kSemiCentral - T00 +- 10 cm
1277  fSpecialSubTriggerName="CSEMI";
1278 // cout << "kSemiCentralVertex" << endl;
1279  break;
1280  case 6: // kSemiCentral - both
1283  fSpecialSubTriggerName="CSEMI%CVLN";
1284 // cout << "kSemiCentral both" << endl;
1285  break;
1286  case 7: // kMB
1289  fSpecialSubTriggerName="CPBI1_|CPBI1-";
1290 // cout << "kMB 1" << endl;
1291  break;
1292  case 8: // kMB
1295  fSpecialSubTriggerName="CPBI2_|CPBI2-";
1296 // cout << "kMB 2" << endl;
1297  break;
1298  case 9: // kMB
1301  fSpecialSubTriggerName="CPBI2_@CPBI2-@CPBI2_@CPBI2-";
1302 // cout << "kMB both" << endl;
1303  break;
1304  default:
1305  AliError("Warning: Special Subtrigger Class Not known");
1306  return 0;
1307  }
1308  } else if (fSpecialTrigger == 4){ // Subdivision of TRD trigger classes
1309  switch(selectSpecialSubTriggerClass){
1310  case 0: // all together
1313 // AliInfo("Info: Nothing to be done");
1314  break;
1315  case 1: // 7WUHSH - V0AND with single electron in TRD & EMCAL
1318  fSpecialSubTriggerName="7WUHEE";
1319  break;
1320  case 2: // 8WUHSH - T0AND with single electron in TRD & EMCAL
1323  fSpecialSubTriggerName="8WUHEE";
1324  break;
1325  case 3: // 7WUHSE - V0AND with single high pt electron in TRD
1328  fSpecialSubTriggerName="7WUHSE";
1329  break;
1330  case 4: // 8WUHSE - T0AND with single high pt electron in TRD
1333  fSpecialSubTriggerName="8WUHSE";
1334  break;
1335  case 5: // 7WUHJE - V0AND with jet in TRD
1338  fSpecialSubTriggerName="7WUHJT";
1339  break;
1340  case 6: // 8WUHJE - T0AND with jet in TRD
1343  fSpecialSubTriggerName="8WUHJT";
1344  break;
1345  case 7: // 7WUHQU - V0AND with dielectron pair in TRD
1348  fSpecialSubTriggerName="7WUHQU";
1349  break;
1350  case 8: // 8WUHQU - T0AND with dielectron pair in TRD
1353  fSpecialSubTriggerName="8WUHQU";
1354  break;
1355  default:
1356  AliError("Warning: Special Subtrigger Class Not known");
1357  return 0;
1358  }
1359  } else if (fSpecialTrigger == 5){ // Subdivision of kEMC trigger classes
1360  switch(selectSpecialSubTriggerClass){
1361  case 0: // all together
1364 // AliInfo("Info: Nothing to be done");
1365  break;
1366  case 1: // CEMC1 - V0OR and EMCAL fired
1367  fOfflineTriggerMask=AliVEvent::kEMC1;
1368  fSpecialTriggerName="AliVEvent::kEMC1";
1371  fSpecialSubTriggerName="CEMC1";
1372  break;
1373  case 2: // CEMC7 - V0AND and EMCAL fired
1375  fOfflineTriggerMask=AliVEvent::kEMC7;
1376  fSpecialTriggerName="AliVEvent::kEMC7";
1378  fSpecialSubTriggerName="CEMC7";
1379  break;
1380  case 3: // CEMC8 - T0OR and EMCAL fired
1381  fOfflineTriggerMask=AliVEvent::kEMC8;
1382  fSpecialTriggerName="AliVEvent::kEMC8";
1385  fSpecialSubTriggerName="CEMC8";
1386  break;
1387  case 4: // CDMC1 - V0OR and DCAL fired
1388  fOfflineTriggerMask=AliVEvent::kEMC1;
1389  fSpecialTriggerName="AliVEvent::kEMC1";
1392  fSpecialSubTriggerName="CDMC1";
1393  break;
1394  case 5: // CDMC7 - V0AND and DCAL fired
1396  fOfflineTriggerMask=AliVEvent::kEMC7;
1397  fSpecialTriggerName="AliVEvent::kEMC7";
1399  fSpecialSubTriggerName="CDMC7";
1400  break;
1401  case 6: // CDMC8 - T0OR and DCAL fired
1402  fOfflineTriggerMask=AliVEvent::kEMC8;
1403  fSpecialTriggerName="AliVEvent::kEMC8";
1406  fSpecialSubTriggerName="CDMC8";
1407  break;
1408  default:
1409  AliError("Warning: Special Subtrigger Class Not known");
1410  return 0;
1411  }
1412  }else if (fSpecialTrigger == 6){ // Subdivision of kPHI trigger classes
1413  switch(selectSpecialSubTriggerClass){
1414  case 0: // all together
1417 // AliInfo("Info: Nothing to be done");
1418  break;
1419  case 1: // CEMC1 - V0OR and EMCAL fired
1420  fOfflineTriggerMask=AliVEvent::kPHI1;
1421  fSpecialTriggerName="AliVEvent::kPHI1";
1424  fSpecialSubTriggerName="CPHI1";
1425  break;
1426  case 2: // CEMC7 - V0AND and EMCAL fired
1428  fOfflineTriggerMask=AliVEvent::kPHI7;
1429  fSpecialTriggerName="AliVEvent::kPHI7";
1431  fSpecialSubTriggerName="CPHI7";
1432  break;
1433  case 3: // CEMC8 - T0OR and EMCAL fired
1434  fOfflineTriggerMask=AliVEvent::kPHI8;
1435  fSpecialTriggerName="AliVEvent::kPHI8";
1438  fSpecialSubTriggerName="CPHI8";
1439  break;
1440  default:
1441  AliError("Warning: Special Subtrigger Class Not known");
1442  return 0;
1443  }
1444  } else if (fSpecialTrigger == 7){ // Subdivision of kHighMult trigger classes
1445  switch(selectSpecialSubTriggerClass){
1446  case 0: // all together
1449 // AliInfo("Info: Nothing to be done");
1450  break;
1451  case 1: // CSHM1 - V0OR and high mult fired
1454  fSpecialSubTriggerName="CSHM1";
1455  break;
1456  case 2: // CSHM7 - V0AND and high mult fired
1459  fSpecialSubTriggerName="CSHM7";
1460  break;
1461  case 3: // CSHM8 - T0OR and high mult fired
1464  fSpecialSubTriggerName="CSHM8";
1465  break;
1466  case 4: // V0 high mult trigger
1468  fOfflineTriggerMask=AliVEvent::kAny;
1469  fSpecialTriggerName="V0Mult";
1471  fSpecialSubTriggerName="CVHMV0M-B-";
1472  break;
1473  case 5: // SPD high mult trigger
1475  fOfflineTriggerMask=AliVEvent::kAny;
1476  fSpecialTriggerName="SPMult";
1478  fSpecialSubTriggerName="CVHMSH2-B-";
1479  break;
1480  case 6: // V0 high mult trigger with pileup condition on
1482  fOfflineTriggerMask=AliVEvent::kAny;
1483  fSpecialTriggerName="V0Mult";
1485  fSpecialSubTriggerName="CVHMV0M-B-SPD2";
1486  break;
1487 
1488  default:
1489  AliError("Warning: Special Subtrigger Class Not known");
1490  return 0;
1491  }
1492  }else if (fSpecialTrigger == 8){ // Subdivision of kEMCEGA trigger classes
1493  switch(selectSpecialSubTriggerClass){
1494  case 0: // all together
1497 // AliInfo("Info: Nothing to be done");
1498  break;
1499  case 1: // 7EGA - CINT7 EGA
1502  fSpecialSubTriggerName="7EGA";
1504  SETBIT(fTriggersEMCALSelected, kG2);
1505  break;
1506  case 2: // 8EGA - CINT8 EGA
1509  fSpecialSubTriggerName="8EGA";
1511  SETBIT(fTriggersEMCALSelected, kG2);
1512  break;
1513  case 3: // 7EG1 - CINT7 EG1
1516  fSpecialSubTriggerName="7EG1";
1518  SETBIT(fTriggersEMCALSelected, kG1);
1519  break;
1520  case 4: // 8EG1 - CINT8 EG1
1523  fSpecialSubTriggerName="8EG1";
1525  SETBIT(fTriggersEMCALSelected, kG1);
1526  break;
1527  case 5: // 7EG2 - CINT7 EG2
1530  fSpecialSubTriggerName="7EG2";
1532  SETBIT(fTriggersEMCALSelected, kG2);
1533  break;
1534  case 6: // 8EG2 - CINT8 EG2
1537  fSpecialSubTriggerName="8EG2";
1539  SETBIT(fTriggersEMCALSelected, kG2);
1540  break;
1541  case 7: // 7DGA - CINT7 DGA
1544  fSpecialSubTriggerName="7DGA";
1546  SETBIT(fTriggersEMCALSelected, kG2);
1547  break;
1548  case 8: // 8DGA - CINT8 DGA
1551  fSpecialSubTriggerName="8DGA";
1553  SETBIT(fTriggersEMCALSelected, kG2);
1554  break;
1555  case 9: // 7DG1 - CINT7 DG1
1558  fSpecialSubTriggerName="7DG1";
1560  SETBIT(fTriggersEMCALSelected, kG1);
1561  break;
1562  case 10: // 8DG1 - CINT8 DG1
1565  fSpecialSubTriggerName="8DG1";
1567  SETBIT(fTriggersEMCALSelected, kG1);
1568  break;
1569  case 11: // 7DG2 - CINT7 DG2
1572  fSpecialSubTriggerName="7DG2";
1574  SETBIT(fTriggersEMCALSelected, kG2);
1575  break;
1576  case 12: // 8DG2 - CINT8 DG2
1579  fSpecialSubTriggerName="8DG2";
1581  SETBIT(fTriggersEMCALSelected, kG2);
1582  break;
1583 
1584  default:
1585  AliError("Warning: Special Subtrigger Class Not known");
1586  return 0;
1587  }
1588  } else if (fSpecialTrigger == 9){ // Subdivision of kEMCEGA trigger classes
1589  switch(selectSpecialSubTriggerClass){
1590  case 0: // all together
1593 // AliInfo("Info: Nothing to be done");
1594  break;
1595  case 1: // 7EJE - CINT7 EJE
1598  fSpecialSubTriggerName="7EJE";
1600  SETBIT(fTriggersEMCALSelected, kJ2);
1601  break;
1602  case 2: // 8EJE - CINT8 EJE
1605  fSpecialSubTriggerName="8EJE";
1607  SETBIT(fTriggersEMCALSelected, kJ2);
1608  break;
1609  case 3: // 7EJ1 - CINT7 EJ1
1612  fSpecialSubTriggerName="7EJ1";
1614  SETBIT(fTriggersEMCALSelected, kJ1);
1615  break;
1616  case 4: // 8EJ1 - CINT8 EJ1
1619  fSpecialSubTriggerName="8EJ1";
1621  SETBIT(fTriggersEMCALSelected, kJ1);
1622  break;
1623  case 5: // 7EJ2 - CINT7 EJ2
1626  fSpecialSubTriggerName="7EJ2";
1628  SETBIT(fTriggersEMCALSelected, kJ2);
1629  break;
1630  case 6: // 8EJ2 - CINT8 EJ2
1633  fSpecialSubTriggerName="8EJ2";
1635  SETBIT(fTriggersEMCALSelected, kJ2);
1636  break;
1637  case 7: // 7DJ1 - CINT7 DJ1
1640  fSpecialSubTriggerName="7DJ1";
1642  SETBIT(fTriggersEMCALSelected, kJ1);
1643  break;
1644  case 8: // 8DJ1 - CINT8 DJ1
1647  fSpecialSubTriggerName="8DJ1";
1649  SETBIT(fTriggersEMCALSelected, kJ1);
1650  break;
1651  case 9: // 7DJ2 - CINT7 DJ2
1654  fSpecialSubTriggerName="7DJ2";
1656  SETBIT(fTriggersEMCALSelected, kJ2);
1657  break;
1658  case 10: // 8DJ2 - CINT8 DJ2
1661  fSpecialSubTriggerName="8DJ2";
1663  SETBIT(fTriggersEMCALSelected, kJ2);
1664  break;
1665 
1666  default:
1667  AliError("Warning: Special Subtrigger Class Not known");
1668  return 0;
1669  }
1670  }
1671  return 1;
1672 }
1673 
1674 //________________________________________________________________________
1676 {
1677  // Set Cut
1678  fMultiplicityMethod=multiplicityMethod;
1679 
1680  // 0 Photon Multiplicity
1681  // 1 TPC Track multiplicity
1682  // 2 V0 Mult
1683  // 3 SPD Mult
1684 
1685  return kTRUE;
1686 }
1687 
1688 //________________________________________________________________________
1690 {// Set Cut
1691  switch(removePileUp){
1692  case 0:
1693  fRemovePileUp = kFALSE;
1694  break;
1695  case 1:
1696  fRemovePileUp = kTRUE;
1697  break;
1698  case 2:
1699  fRemovePileUp = kTRUE;
1702  break;
1703  case 3:
1704  fRemovePileUp = kTRUE;
1707  break;
1708  case 4:
1709  fRemovePileUp = kTRUE;
1712  break;
1713  case 5:
1714  fRemovePileUp = kTRUE;
1717  break;
1718  case 6:
1719  fRemovePileUp = kTRUE;
1720  fDoPileUpRejectV0MTPCout = kTRUE;
1721  fFPileUpRejectV0MTPCout = new TF1("fFPileUpRejectV0MTPCout","[0] + [1]*x",0.,10000.);
1722  fFPileUpRejectV0MTPCout->SetParameter(0,0.);
1723  fFPileUpRejectV0MTPCout->SetParameter(1,0.);
1724  if (fIsHeavyIon==1){
1725  if(fPeriodEnum == kLHC15o){
1726  fFPileUpRejectV0MTPCout->SetParameter(0,-2500.);
1727  fFPileUpRejectV0MTPCout->SetParameter(1,5.0);
1728  break;
1729  }else{
1730  fFPileUpRejectV0MTPCout->SetParameter(0,-1500.);
1731  fFPileUpRejectV0MTPCout->SetParameter(1,3.0);
1732  break;
1733  }
1734  } else if(fIsHeavyIon == 2){
1735  fFPileUpRejectV0MTPCout->SetParameter(0,-200.);
1736  fFPileUpRejectV0MTPCout->SetParameter(1,2.0);
1737  break;
1738  }else{
1739  fFPileUpRejectV0MTPCout->SetParameter(0,-300.);
1740  fFPileUpRejectV0MTPCout->SetParameter(1,4.0);
1741  break;
1742  }
1743  break;
1744  case 7:
1745  fRemovePileUp = kTRUE;
1746  fDoPileUpRejectV0MTPCout = kTRUE;
1747  fFPileUpRejectV0MTPCout = new TF1("fFPileUpRejectV0MTPCout","[0] + [1]*x",0.,10000.);
1748  fFPileUpRejectV0MTPCout->SetParameter(0,0.);
1749  fFPileUpRejectV0MTPCout->SetParameter(1,0.);
1750  if (fIsHeavyIon==1){
1751  if(fPeriodEnum == kLHC15o){
1752  fFPileUpRejectV0MTPCout->SetParameter(0,-2500.);
1753  fFPileUpRejectV0MTPCout->SetParameter(1,5.0);
1754  break;
1755  }else{
1756  fFPileUpRejectV0MTPCout->SetParameter(0,-2500.);
1757  fFPileUpRejectV0MTPCout->SetParameter(1,3.0);
1758  break;
1759  }
1760  } else if(fIsHeavyIon == 2){
1761  fFPileUpRejectV0MTPCout->SetParameter(0,-300.);
1762  fFPileUpRejectV0MTPCout->SetParameter(1,1.5);
1763  break;
1764  }else{
1765  fFPileUpRejectV0MTPCout->SetParameter(0,-300.);
1766  fFPileUpRejectV0MTPCout->SetParameter(1,3.0);
1767  break;
1768  }
1769  break;
1770  case 8:
1771  fRemovePileUp = kTRUE;
1772  fDoPileUpRejectV0MTPCout = kTRUE;
1773  fFPileUpRejectV0MTPCout = new TF1("fFPileUpRejectV0MTPCout","[0] + [1]*x",0.,10000.);
1774  fFPileUpRejectV0MTPCout->SetParameter(0,0.);
1775  fFPileUpRejectV0MTPCout->SetParameter(1,0.);
1776  if (fIsHeavyIon==1){
1777  if(fPeriodEnum == kLHC15o){
1778  fFPileUpRejectV0MTPCout->SetParameter(0,-2500.);
1779  fFPileUpRejectV0MTPCout->SetParameter(1,5.0);
1780  break;
1781  }else{
1782  fFPileUpRejectV0MTPCout->SetParameter(0,-1500.);
1783  fFPileUpRejectV0MTPCout->SetParameter(1,3.0);
1784  break;
1785  }
1786  } else if(fIsHeavyIon == 2){
1787  fFPileUpRejectV0MTPCout->SetParameter(0,-200.);
1788  fFPileUpRejectV0MTPCout->SetParameter(1,1.5);
1789  break;
1790  }else{
1791  fFPileUpRejectV0MTPCout->SetParameter(0,-300.);
1792  fFPileUpRejectV0MTPCout->SetParameter(1,4.0);
1793  break;
1794  }
1795  break;
1796  case 9:
1797  fRemovePileUp = kTRUE;
1800  fDoPileUpRejectV0MTPCout = kTRUE;
1801  fFPileUpRejectV0MTPCout = new TF1("fFPileUpRejectV0MTPCout","[0] + [1]*x",0.,10000.);
1802  fFPileUpRejectV0MTPCout->SetParameter(0,0.);
1803  fFPileUpRejectV0MTPCout->SetParameter(1,0.);
1804  if (fIsHeavyIon==1){
1805  if(fPeriodEnum == kLHC15o){
1806  fFPileUpRejectV0MTPCout->SetParameter(0,-2500.);
1807  fFPileUpRejectV0MTPCout->SetParameter(1,5.0);
1808  break;
1809  }else{
1810  fFPileUpRejectV0MTPCout->SetParameter(0,-1500.);
1811  fFPileUpRejectV0MTPCout->SetParameter(1,3.0);
1812  break;
1813  }
1814  } else if(fIsHeavyIon == 2){
1815  fFPileUpRejectV0MTPCout->SetParameter(0,-200.);
1816  fFPileUpRejectV0MTPCout->SetParameter(1,1.5);
1817  break;
1818  }else{
1819  fFPileUpRejectV0MTPCout->SetParameter(0,-300.);
1820  fFPileUpRejectV0MTPCout->SetParameter(1,4.0);
1821  break;
1822  }
1823  break;
1824  default:
1825  AliError("RemovePileUpCut not defined");
1826  return kFALSE;
1827  }
1828  return kTRUE;
1829 }
1830 
1831 //________________________________________________________________________
1833 
1834  switch(extraSignal){
1835  case 0:
1836  fRejectExtraSignals = 0;
1837  break; // No Rejection
1838  case 1:
1839  fRejectExtraSignals = 1;
1840  break; // MinBias Header
1841  case 2:
1842  fRejectExtraSignals = 2;
1843  break; // User String Array
1844  case 3:
1845  fRejectExtraSignals = 3;
1846  break; // Rejection for Gamma Correction only
1847  default:
1848  AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
1849  return kFALSE;
1850  }
1851  return kTRUE;
1852 }
1853 
1854 //________________________________________________________________________
1856 
1857  switch(vertexCut){
1858  case 0: // no Vertex required // NOT fully working yet
1859  fEnableVertexCut = kFALSE;
1860  fMaxVertexZ = 1000;
1861  break;
1862  case 1: // vertex within +-15 cm
1863  fEnableVertexCut = kTRUE;
1864  fMaxVertexZ = 15;
1865  break;
1866  case 2: // vertex within +-12.5 cm
1867  fEnableVertexCut = kTRUE;
1868  fMaxVertexZ = 12.5;
1869  break;
1870  case 3: // vertex within +-10 cm
1871  fEnableVertexCut = kTRUE;
1872  fMaxVertexZ = 10.0;
1873  break;
1874  case 4: // vertex within +-7.5 cm
1875  fEnableVertexCut = kTRUE;
1876  fMaxVertexZ = 7.5;
1877  break;
1878  case 5: // vertex within +-5 cm
1879  fEnableVertexCut = kTRUE;
1880  fMaxVertexZ = 5.;
1881  break;
1882  default:
1883  AliError(Form("Vertex Cut not defined %d",vertexCut));
1884  return kFALSE;
1885  }
1886  return kTRUE;
1887 }
1888 
1889 //-------------------------------------------------------------
1891  if (fPeriodEnum == kLHC15n || // pp 5TeV
1892  fPeriodEnum == kLHC15o || // PbPb 5TeV
1893  fPeriodEnum == kLHC15k1a1 || fPeriodEnum == kLHC15k1a2 || fPeriodEnum == kLHC15k1a3 || fPeriodEnum == kLHC16j7 || // MC PbPb 5TeV LowIR
1894  fPeriodEnum == kLHC16h4 || // MC PbPb 5TeV added signals
1895  fPeriodEnum == kLHC16g1 || fPeriodEnum == kLHC16g1a || fPeriodEnum == kLHC16g1b || fPeriodEnum == kLHC16g1c || // MC PbPb 5TeV general purpose
1897  fPeriodEnum == kLHC16h2a || fPeriodEnum == kLHC16h2b || fPeriodEnum == kLHC16h2c || // MC PbPb 5TeV jet-jet
1898  fPeriodEnum == kLHC15fm || // pp 13TeV
1899  fPeriodEnum == kLHC15g3a3 || fPeriodEnum == kLHC15g3c3 || // MC pp 13TeV
1900  fPeriodEnum == kLHC16q || fPeriodEnum == kLHC16t || // pPb 5TeV LHC16qt
1901  fPeriodEnum == kLHC16r || fPeriodEnum == kLHC16s || // pPb 8TeV LHC16rs
1905  fPeriodEnum == kLHC17g8a_fast || fPeriodEnum == kLHC17g8a_cent_woSDD || // MC pPb 5TeV LHC16qt
1906  fPeriodEnum == kLHC17g8b || fPeriodEnum == kLHC17g8c // MC pPb 8TeV LHC16sr
1907 
1908  ){
1909  return kTRUE;
1910  } else {
1911  return kFALSE;
1912  }
1913 }
1914 
1915 //-------------------------------------------------------------
1917 { // Get Event Centrality
1918 
1919  AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
1920  if(esdEvent){
1922  AliMultSelection *MultSelection = (AliMultSelection*)event->FindListObject("MultSelection");
1923  if(!MultSelection){
1924  AliWarning ("AliMultSelection object not found !");
1925  return -1;
1926  }else{
1927  if(fDetectorCentrality==0){
1928  if(fIsHeavyIon==2) return MultSelection->GetMultiplicityPercentile("V0A");// default for pPb
1929  else return MultSelection->GetMultiplicityPercentile("V0M");// default
1930  }else if(fDetectorCentrality==1) return MultSelection->GetMultiplicityPercentile("CL1",kTRUE);
1931  }
1932  }else{
1933  AliCentrality *fESDCentrality = (AliCentrality*)esdEvent->GetCentrality();
1934  if(fDetectorCentrality==0){
1935  if(fIsHeavyIon==2) return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
1936  else return fESDCentrality->GetCentralityPercentile("V0M"); // default
1937  }else if(fDetectorCentrality==1) return fESDCentrality->GetCentralityPercentile("CL1");
1938  }
1939  }
1940 
1941  AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
1942  if(aodEvent){
1944  AliMultSelection *MultSelection = (AliMultSelection*)aodEvent->FindListObject("MultSelection");
1945  if(!MultSelection){
1946  AliWarning ("AliMultSelection object not found !");
1947  return -1;
1948  } else{
1949  if(fDetectorCentrality==0){
1950  if(fIsHeavyIon==2) return MultSelection->GetMultiplicityPercentile("V0A");// default for pPb
1951  else return MultSelection->GetMultiplicityPercentile("V0M",kTRUE);
1952  }else if(fDetectorCentrality==1) return MultSelection->GetMultiplicityPercentile("CL1",kTRUE);
1953  }
1954  }else{
1955  if(aodEvent->GetHeader()){return ((AliVAODHeader*)aodEvent->GetHeader())->GetCentrality();}
1956  }
1957  }
1958 
1959  return -1;
1960 }
1961 
1962 //_____________________________________________________________________________________
1963 Bool_t AliConvEventCuts::IsCentralitySelected(AliVEvent *event, AliMCEvent *mcEvent)
1964 { // Centrality Selection
1965  if(!fIsHeavyIon){
1966  if ((fCentralityMin == 0 && fCentralityMax == 0) || (fCentralityMin > fCentralityMax) ){
1967  return kTRUE;
1968  } else {
1969  Int_t primaryTracksPP[9] = { 0, 2, 5, 10, 15,
1970  30, 50, 100, 1000
1971  };
1972  Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetNumberOfPrimaryTracks();
1973  if ( nprimaryTracks >= primaryTracksPP[fCentralityMin] && nprimaryTracks < primaryTracksPP[fCentralityMax]){
1974  return kTRUE;
1975  } else {
1976  return kFALSE;
1977  }
1978  return kFALSE;
1979  }
1980  }
1981  if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
1982  else if ( fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-10*multfactor
1984  if(centrality<0)return kFALSE;
1985 
1986  Int_t centralityC=0;
1987  if (fModCentralityClass == 0){
1988  centralityC= Int_t(centrality/10);
1989  if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
1990  return kTRUE;
1991  else return kFALSE;
1992  }
1993  else if (fModCentralityClass ==1){
1994  centralityC= Int_t(centrality);
1995  if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
1996  return kTRUE;
1997  } else return kFALSE;
1998  }
1999  else if (fModCentralityClass ==2){
2000  centralityC= Int_t(centrality);
2001  if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
2002  return kTRUE;
2003  else return kFALSE;
2004  }
2005 
2006  Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetNumberOfPrimaryTracks();
2007  Int_t PrimaryTracks10[11][2] =
2008  {
2009  {9999,9999}, // 0 //1550 changed to 9999 on 9 Dec
2010  {1210, 928}, // 10
2011  { 817, 658}, // 20
2012  { 536, 435}, // 30
2013  { 337, 276}, // 40
2014  { 197, 162}, // 50
2015  { 106, 100}, // 60
2016  { 51, 44}, // 70
2017  { 21, 18}, // 80
2018  { 0, 0}, // 90
2019  { 0, 0}// 100 // only max accessible
2020  };
2021  Int_t PrimaryTracksLHC11h10[11][2] =
2022  {
2023  {9999,9999}, // 0 //1550 changed to 9999 on 9 Dec
2024  { 985, 928}, // 10
2025  { 661, 658}, // 20
2026  { 434, 435}, // 30
2027  { 275, 276}, // 40
2028  { 173, 162}, // 50
2029  { 100, 100}, // 60
2030  { 42, 44}, // 70
2031  { 19, 18}, // 80
2032  { 0, 0}, // 90
2033  { 0, 0}// 100 // only max accessible
2034  };
2035  Int_t PrimaryTracks5a[11][2] =
2036  {
2037  {9999,9999}, // 0 ///1550 changed to 9999 on 9 Dec
2038  {1485,1168}, // 5
2039  {1210, 928}, // 10
2040  { 995, 795}, // 15
2041  { 817, 658}, // 20
2042  { 666, 538}, // 25
2043  { 536, 435}, // 30
2044  { 428, 350}, // 35
2045  { 337, 276}, // 40
2046  { 260, 214}, // 45
2047  { 0, 162}// 50 only max accessible
2048  };
2049  Int_t PrimaryTracksLHC11h5a[11][2] =
2050  {
2051  {9999,9999}, // 0 ///1550 changed to 9999 on 9 Dec
2052  {1166,1168}, // 5
2053  { 953, 928}, // 10
2054  { 805, 795}, // 15
2055  { 655, 658}, // 20
2056  { 535, 538}, // 25
2057  { 435, 435}, // 30
2058  { 349, 350}, // 35
2059  { 275, 276}, // 40
2060  { 214, 214}, // 45
2061  { 165, 162}// 50 only max accessible
2062  };
2063  Int_t PrimaryTracks5b[11][2] =
2064  {
2065  { 260, 214}, // 45
2066  { 197, 162}, // 50
2067  { 147, 125}, // 55
2068  { 106, 100}, // 60
2069  { 75, 63}, // 65
2070  { 51, 44}, // 70
2071  { 34, 29}, // 75
2072  { 21, 18}, // 80
2073  { 13, 11}, // 85
2074  { 0, 0}, // 90
2075  { 0, 0}// 100 only max accessible
2076  };
2077  Int_t PrimaryTracksLHC11h5b[11][2] =
2078  {
2079  { 214, 214}, // 45
2080  { 165, 162}, // 50
2081  { 127, 125}, // 55
2082  { 93, 100}, // 60
2083  { 64, 63}, // 65
2084  { 44, 44}, // 70
2085  { 30, 29}, // 75
2086  { 18, 18}, // 80
2087  { 11, 11}, // 85
2088  { 0, 0}, // 90
2089  { 0, 0}// 100 only max accessible
2090  };
2091  Int_t column = 0;
2092  if(event->IsA()==AliESDEvent::Class()) column = 0;
2093  if(event->IsA()==AliAODEvent::Class()) column = 1;
2094 
2095  if (fModCentralityClass == 3){
2096  if(mcEvent){
2098  if(nprimaryTracks > PrimaryTracksLHC11h10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracksLHC11h10[fCentralityMin][column])
2099  return kTRUE;
2100  else return kFALSE;
2101  } else {
2102  if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
2103  return kTRUE;
2104  else return kFALSE;
2105  }
2106  }
2107  else{
2108  centralityC= Int_t(centrality/10);
2109  if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
2110  return kTRUE;
2111  else return kFALSE;
2112  }
2113  }
2114  else if (fModCentralityClass ==4){
2115  if(mcEvent){
2117  if(nprimaryTracks > PrimaryTracksLHC11h5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracksLHC11h5a[fCentralityMin][column])
2118  return kTRUE;
2119  else return kFALSE;
2120  } else {
2121  if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
2122  return kTRUE;
2123  else return kFALSE;
2124  }
2125  }
2126  else{
2127  centralityC= Int_t(centrality);
2128  if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
2129  return kTRUE;
2130  } else return kFALSE;
2131  }
2132  }
2133  else if (fModCentralityClass ==5){
2134  if(mcEvent){
2136  if(nprimaryTracks > PrimaryTracksLHC11h5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracksLHC11h5b[fCentralityMin][column])
2137  return kTRUE;
2138  else return kFALSE;
2139  } else {
2140  if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
2141  return kTRUE;
2142  else return kFALSE;
2143  }
2144  }
2145  else{
2146  centralityC= Int_t(centrality);
2147  if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
2148  return kTRUE;
2149  else return kFALSE;
2150  }
2151  }
2152 
2153  return kFALSE;
2154 }
2155 
2156 //________________________________________________________________________
2158  // Cut on z position of primary vertex
2159  Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
2160  Double_t fVertexZSPD = 0;
2161  AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
2162  if(fESDEvent){
2163  fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
2164  }
2165  AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
2166  if(fAODEvent){
2167  fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
2168  }
2169 
2170  if(TMath::Abs(fVertexZ)>fMaxVertexZ)return kFALSE;
2171 
2172 
2173  if (fPeriodEnum == kLHC11h){
2174  if (TMath::Abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
2175  }
2176  if (fIsHeavyIon == 2){
2177  if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
2178  }
2179 
2180  return kTRUE;
2181 }
2182 
2183 //________________________________________________________________________
2185 {
2187  return kFALSE;
2188  TBits fIR1 = event->GetHeader()->GetIRInt1InteractionMap(); // IR1 contains V0 information (VIR)
2189  TBits fIR2 = event->GetHeader()->GetIRInt2InteractionMap(); // IR2 contains T0 information
2190  UShort_t bunchCrossings = event->GetBunchCrossNumber();
2192  for(Int_t i = 0; i<180;i++){
2193  if(fIR1.TestBitNumber(i))
2194  fHistoPastFutureBits->Fill((i*25)-90*25);
2195  }
2196  }
2197 
2198  Bool_t isOutOfBunchPileup = 0;
2199  Int_t pf1 = fPastFutureRejectionLow +bunchCrossings%4;
2200  Int_t pf2 = fPastFutureRejectionHigh+bunchCrossings%4;
2201  if(pf1 < -89) pf1 = -89;
2202  if(pf2 > 89) pf2 = 89;
2203  Int_t pf2maxForT0 = pf2;
2204  Int_t ir1skip = 0;
2205  for (Int_t i=pf1;i<=pf2;i++) {
2206  if (i==0) continue;
2207  if (i<=pf2maxForT0) isOutOfBunchPileup|=fIR2.TestBitNumber(90+i); // T0-based clean-up
2208  if (i>0 && i<=ir1skip) continue; // skip next 2 for old IR definitions
2209  isOutOfBunchPileup|=fIR1.TestBitNumber(90+i); // V0-based clean-up
2210  }
2211  return isOutOfBunchPileup;
2212 }
2213 //________________________________________________________________________
2214 
2216 {
2217  Bool_t isPileUpV0MTPCout=0;
2218 
2219  Double_t multV0M;
2220  Double_t valFunc;
2221  if (fIsHeavyIon==2){
2222  multV0M = event->GetVZEROData()->GetMTotV0A();
2223  }else{
2224  multV0M = event->GetVZEROData()->GetMTotV0A() + event->GetVZEROData()->GetMTotV0C() ;
2225  }
2226 
2227  if ( fFPileUpRejectV0MTPCout != 0x0 ){
2228  valFunc= fFPileUpRejectV0MTPCout->Eval(((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetNumberOfTPCoutTracks());
2229  if (multV0M < valFunc ) isPileUpV0MTPCout=1;
2230  }
2231 
2232  return isPileUpV0MTPCout;
2233 
2234 }
2235 //________________________________________________________________________
2237  // returns number of contributors to the vertex
2238 
2239  AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
2240  if(fESDEvent){
2241  if (fESDEvent->GetPrimaryVertex() != NULL){
2242  if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
2243  // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
2244  return fESDEvent->GetPrimaryVertex()->GetNContributors();
2245  }
2246  }
2247 
2248  if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
2249  if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2250  // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
2251  return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
2252  }else {
2253  AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
2254  // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
2255  return 0;
2256  }
2257  }
2258  }
2259 
2260  AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
2261  if(fAODEvent){
2262  if (fAODEvent->GetPrimaryVertex() != NULL){
2263  if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
2264  return fAODEvent->GetPrimaryVertex()->GetNContributors();
2265  }
2266  }
2267  if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
2268  if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
2269  return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
2270  } else {
2271  AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
2272  return 0;
2273  }
2274  }
2275  }
2276  // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
2277  return 0;
2278 }
2279 
2280 //________________________________________________________________________
2281 // Analysing Jet-Jet MC's
2282 //________________________________________________________________________
2284  AliGenCocktailEventHeader *cHeader = 0x0;
2285  Bool_t headerFound = kFALSE;
2286  weight = -1;
2287  fMaxPtJetMC = 0;
2288 
2289  if ( fPeriodEnum != kLHC17g8a_fast && fPeriodEnum != kLHC17g8a_cent_woSDD && // LHC16qt pPb 5TeV JetJet MC's
2290  fPeriodEnum != kLHC17g8b && fPeriodEnum != kLHC17g8c && // LHC16sr pPb 8TeV JetJet MC's
2291  fPeriodEnum != kLHC17f8a && fPeriodEnum != kLHC17f8b && fPeriodEnum != kLHC17f8c && // LHC16X Jet Jet MC's
2293  fPeriodEnum != kLHC16h3 && // LHC15n Jet Jet MC's
2294  fPeriodEnum != kLHC15a3a && fPeriodEnum != kLHC15a3a_plus && fPeriodEnum != kLHC15a3b && // LHC13g Jet Jet MC's
2295  fPeriodEnum != kLHC15g1a && fPeriodEnum != kLHC15g1b && // LHC11a Jet Jet MC's
2296  fPeriodEnum != kLHC13b4_fix && fPeriodEnum != kLHC13b4_plus && // LHC13 pPb Jet Jet MC's
2297  fPeriodEnum != kLHC16c3a && fPeriodEnum != kLHC16c3b && fPeriodEnum != kLHC16c3c && // LHC13 pPb Jet Jet MC's
2298  fPeriodEnum != kLHC16c2 && fPeriodEnum != kLHC16c2_plus // LHC12 JetJet MC
2299  ){
2300 
2301  weight = 1;
2302  return kTRUE;
2303  }
2304 
2305  if(mcEvent){
2306  cHeader = dynamic_cast<AliGenCocktailEventHeader*>(mcEvent->GenEventHeader());
2307  if(cHeader) headerFound = kTRUE;
2308  }else{
2309  //no mcEvent available -> not running on MC
2310  weight = 1;
2311  return kTRUE;
2312  }
2313 
2314  if(headerFound){
2315  TList *genHeaders = 0x0;
2316  if(cHeader) genHeaders = cHeader->GetHeaders();
2317  AliGenEventHeader* gh = 0;
2318  for(Int_t i = 0; i<genHeaders->GetEntries();i++){
2319  gh = (AliGenEventHeader*)genHeaders->At(i);
2320  TString GeneratorName = gh->GetName();
2321  if (GeneratorName.CompareTo("AliGenPythiaEventHeader") == 0){
2322  Bool_t eventAccepted = kTRUE;
2323  TParticle * jet = 0;
2324  Int_t nTriggerJets = dynamic_cast<AliGenPythiaEventHeader*>(gh)->NTriggerJets();
2325  Float_t ptHard = dynamic_cast<AliGenPythiaEventHeader*>(gh)->GetPtHard();
2326  Float_t tmpjet[]={0,0,0,0};
2327  for(Int_t ijet = 0; ijet< nTriggerJets; ijet++){
2328  dynamic_cast<AliGenPythiaEventHeader*>(gh)->TriggerJet(ijet, tmpjet);
2329  jet = new TParticle(94, 21, -1, -1, -1, -1, tmpjet[0],tmpjet[1],tmpjet[2],tmpjet[3], 0,0,0,0);
2330  //Compare jet pT and pt Hard
2331  if(jet->Pt() > fMaxFacPtHard * ptHard){
2332  eventAccepted= kFALSE;
2333  }
2334  if (jet->Pt() > fMaxPtJetMC) fMaxPtJetMC = jet->Pt();
2335  }
2336  if (jet) delete jet;
2337  if (mcEvent){
2338  for(Long_t i = 0; i < mcEvent->GetNumberOfPrimaries(); i++) {
2339  TParticle* particle = (TParticle *)mcEvent->Particle(i);
2340  if (!particle) continue;
2341  if (TMath::Abs(particle->GetPdgCode()) == 111 || TMath::Abs(particle->GetPdgCode()) == 221){
2342  if (particle->Pt() > fMaxFacPtHardSingleParticle*ptHard){
2343  eventAccepted= kFALSE;
2344  }
2345  }
2346 
2347  }
2348  }
2349 
2350  if ( fPeriodEnum == kLHC17f8b) {
2351  Double_t ptHardBinRanges[21] = { 5, 7, 9, 12, 16,
2352  21, 28, 36, 45, 57,
2353  70, 85, 99, 115, 132,
2354  150, 169, 190, 212, 235,
2355  1000000};
2356  Double_t weightsBins[20] = { 43.7553, 13.5848, 6.788, 2.67826, 0.975255,
2357  0.39069, 0.127342, 0.0465597, 0.0206539, 0.00750243,
2358  0.00319118, 0.00122291, 0.000641232, 0.000321437, 0.000168273,
2359  9.17033e-05, 5.34755e-05, 3.01354e-05, 1.74518e-05, 2.8004e-05};
2360 
2361  Int_t bin = 0;
2362  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2363  if (bin < 20) weight = weightsBins[bin];
2364 
2365  } else if ( fPeriodEnum == kLHC17f8c ){
2366  Double_t ptHardBinRanges[21] = { 5, 7, 9, 12, 16,
2367  21, 28, 36, 45, 57,
2368  70, 85, 99, 115, 132,
2369  150, 169, 190, 212, 235,
2370  1000000};
2371  Double_t weightsBins[20] = { 43.8654, 13.6215, 6.79856, 2.67526, 0.978794,
2372  0.390797, 0.127769, 0.0465714, 0.0206173, 0.00750282,
2373  0.00318773, 0.00122533, 0.000644385, 0.000321225, 0.00016846,
2374  9.18305e-05, 5.33507e-05, 3.00677e-05, 1.74608e-05, 2.80823e-05};
2375 
2376  Int_t bin = 0;
2377  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2378  if (bin < 20) weight = weightsBins[bin];
2379 
2380  } else if ( fPeriodEnum == kLHC16h3 ){
2381  Double_t ptHardBinRanges[21] = { 5, 7, 9, 12, 16,
2382  21, 28, 36, 45, 57,
2383  70, 85, 99, 115, 132,
2384  150, 169, 190, 212, 235,
2385  1000000};
2386  Double_t weightsBins[20] = {16.0869, 4.61169, 2.14976, 0.782544, 0.264854,
2387  9.7619E-02, 2.92747E-02, 9.89515E-03, 4.05152E-03, 1.35393E-03,
2388  5.29864E-04, 1.88317E-04, 9.23E-05, 4.29E-05, 2.09E-05,
2389  1.06E-05, 5.76E-06, 3.00E-06, 1.62E-06, 2.10E-06 };
2390  Int_t bin = 0;
2391  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2392  if (bin < 20) weight = weightsBins[bin];
2393 
2394 
2395  } else if ( fPeriodEnum == kLHC15a3b || fPeriodEnum == kLHC15g1b ){
2396  Double_t ptHardBinRanges[13] = { 5, 7, 9, 12, 16,
2397  21, 28, 36, 45, 57,
2398  70, 85, 1000};
2399  Double_t weightsBins[12] = { 7.858393e-03, 4.718691e-03, 4.077575e-03, 2.814527e-03, 1.669625e-03,
2400  1.007535e-03, 4.536554e-04, 2.111041e-04, 1.094840e-04, 4.404973e-05,
2401  1.933238e-05, 1.562895e-05};
2402  Int_t bin = 0;
2403  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2404  if (bin < 12) weight = weightsBins[bin];
2405 
2406  } else if ( fPeriodEnum == kLHC15g1a ){
2407  Double_t ptHardBinRanges[20] = { 5, 11, 21, 36, 57,
2408  84, 117, 152, 191, 1000000,
2409  5, 7, 9, 12, 16,
2410  21, 28, 36, 45, 57 };
2411  // Double_t weightsBins[19] = { 4.407782 , 4.946649e-01, 3.890474e-02, 3.826300e-03, 4.429376e-04,
2412  // 6.306745e-05, 1.031527e-05, 2.267429e-06, 7.552074e-07, 0,
2413  // 2.4635e+00, 1.1483e+00, 6.5069e-01, 2.7130e-01, 8.1947e-02,
2414  // 3.1536e-02, 9.3139e-03, 2.9779e-03, 1.1252e-03};
2415  // LHC15g1a
2416  Double_t weightsBins[19] = { 4.43629 , 0.49523, 0.0394921, 0.00383174, 0.000446559,
2417  6.37374e-05, 1.03134e-05, 2.27012e-06, 7.59281e-07, 0,
2418  2.62906, 1.12884, 0.656873, 0.262822, 0.0876732,
2419  0.0307759, 0.0087083, 0.0027664, 0.00106203};
2420 
2421  Int_t bin = 0;
2422  Int_t binFromFile = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetPtHardFromFile();
2423  if (binFromFile != -1 && binFromFile >9 && ptHard < 57) bin = 9;
2424  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2425  if (bin < 19) weight = weightsBins[bin];
2426 
2427  } else if ( fPeriodEnum == kLHC15a3a || fPeriodEnum == kLHC15a3a_plus ) {
2428  Double_t ptHardBinRanges[20] = { 5, 11, 21, 36, 57,
2429  84, 117, 152, 191, 1000000,
2430  5, 7, 9, 12, 16,
2431  21, 28, 36, 45, 57 };
2432  // LHC15a3a
2433  Double_t weightsBins[19] = { 4.43897 , 0.495766, 0.039486, 0.00383011, 0.000447104,
2434  6.37277e-05, 1.03166e-05, 2.26971e-06, 7.59023e-07, 0,
2435  2.63331, 1.12815, 0.657034, 0.262756, 0.0877227,
2436  0.0307638, 0.00870635, 0.00276658, 0.00106229};
2437  Int_t bin = 0;
2438  Int_t binFromFile = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetPtHardFromFile();
2439  if (binFromFile != -1 && binFromFile >9 && ptHard < 57) bin = 9;
2440  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2441  if (bin < 19) weight = weightsBins[bin];
2442 
2443  } else if ( fPeriodEnum == kLHC16c2 || fPeriodEnum == kLHC16c2_plus ){
2444  Double_t ptHardBinRanges[21] = { 5, 7, 9, 12, 16,
2445  21, 28, 36, 45, 57,
2446  70, 85, 99, 115, 132,
2447  150, 169, 190, 212, 235,
2448  1000000};
2449  Double_t weightsBins[20] = { 28.3084, 8.43277, 4.07753, 1.54359, 0.543318,
2450  0.208394, 0.0652349, 0.0186904, 0.00834528, 0.00301414,
2451  0.00125939, 0.000474403, 0.000244052, 0.00011924, 6.09838e-05,
2452  3.24148e-05, 1.84314e-05, 1.00926e-05, 5.68632e-06, 8.38092e-06};
2453  Int_t bin = 0;
2454  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2455  if (bin < 20) weight = weightsBins[bin];
2456 
2457  } else if ( fPeriodEnum == kLHC16c3a ){
2458  Double_t ptHardBinRanges[6] = { 7, 9, 12, 16, 21, 1000};
2459  Double_t weightsBins[5] = { 0.00672445, 0.00799158, 0.00678934, 0.00463908, 0.00600068}; //preliminary estimates
2460  Int_t bin = 0;
2461  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2462  if (bin < 5) weight = weightsBins[bin];
2463 
2464  } else if (fPeriodEnum == kLHC16c3b ){
2465  Double_t ptHardBinRanges[7] = { 14, 19, 26, 35, 48, 66, 1000};
2466  Double_t weightsBins[6] = { 0.00608281, 0.00393646, 0.00200138, 0.000986267, 0.000389051, 0.0001863}; //preliminary estimates
2467  Int_t bin = 0;
2468  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2469  if (bin < 6) weight = weightsBins[bin];
2470 
2471  } else if (fPeriodEnum == kLHC16c3c ){
2472  Double_t ptHardBinRanges[8] = { 0, 5, 11, 21, 36, 57, 84, 1000};
2473  Double_t weightsBins[7] = { 0.00151999, 0.000100346, 1.27688e-05, 1.82388e-06, 3.08506e-07, 6.00308e-08, 1.88414e-08}; //preliminary estimates
2474  Int_t bin = 0;
2475  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2476  if (bin < 7) weight = weightsBins[bin];
2477 
2478  } else if ( fPeriodEnum == kLHC13b4_fix || fPeriodEnum == kLHC13b4_plus ){
2479  Double_t ptHardBinRanges[11] = { 5, 11, 21, 36, 57,
2480  84, 117, 152, 191, 234,
2481  1000};
2482  Double_t weightsBins[10] = { 2.24185e-6 , 2.48463e-7, 2.23171e-8, 2.43667e-9, 3.29934e-10,
2483  5.34592e-11, 1.00937e-11, 2.6493e-12, 8.53912e-13, 5.43077e-13};
2484  Int_t bin = 0;
2485  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2486  if (bin < 10) weight = weightsBins[bin];
2487 
2488  } else {
2489  weight = 1;
2490  }
2491 
2492  if (weight == -1) return kFALSE;
2493  else return eventAccepted;
2494 
2495  }
2496  }
2497  } else {
2498  AliGenEventHeader * eventHeader = mcEvent->GenEventHeader();
2499  TString eventHeaderName = eventHeader->ClassName();
2500  if (eventHeaderName.CompareTo("AliGenPythiaEventHeader") == 0){
2501  Bool_t eventAccepted = kTRUE;
2502  TParticle * jet = 0;
2503  Int_t nTriggerJets = dynamic_cast<AliGenPythiaEventHeader*>(eventHeader)->NTriggerJets();
2504  Float_t ptHard = dynamic_cast<AliGenPythiaEventHeader*>(eventHeader)->GetPtHard();
2505  Float_t tmpjet[]={0,0,0,0};
2506  for(Int_t ijet = 0; ijet< nTriggerJets; ijet++){
2507  dynamic_cast<AliGenPythiaEventHeader*>(eventHeader)->TriggerJet(ijet, tmpjet);
2508  jet = new TParticle(94, 21, -1, -1, -1, -1, tmpjet[0],tmpjet[1],tmpjet[2],tmpjet[3], 0,0,0,0);
2509  //Compare jet pT and pt Hard
2510  if(jet->Pt() > fMaxFacPtHard * ptHard){
2511  eventAccepted= kFALSE;
2512  }
2513  if (jet->Pt() > fMaxPtJetMC) fMaxPtJetMC = jet->Pt();
2514  }
2515  if (mcEvent){
2516  for(Long_t i = 0; i < mcEvent->GetNumberOfPrimaries(); i++) {
2517  TParticle* particle = (TParticle *)mcEvent->Particle(i);
2518  if (!particle) continue;
2519  if (TMath::Abs(particle->GetPdgCode()) == 111 || TMath::Abs(particle->GetPdgCode()) == 221){
2520  if (particle->Pt() > fMaxFacPtHardSingleParticle*ptHard){
2521  eventAccepted= kFALSE;
2522  }
2523  }
2524 
2525  }
2526  }
2527 
2528  if ( fPeriodEnum == kLHC16h3 ){
2529  Double_t ptHardBinRanges[21] = { 5, 7, 9, 12, 16,
2530  21, 28, 36, 45, 57,
2531  70, 85, 99, 115, 132,
2532  150, 169, 190, 212, 235,
2533  1000000};
2534  Double_t weightsBins[20] = {16.0869, 4.61169, 2.14976, 0.782544, 0.264854,
2535  9.7619E-02, 2.92747E-02, 9.89515E-03, 4.05152E-03, 1.35393E-03,
2536  5.29864E-04, 1.88317E-04, 9.23E-05, 4.29E-05, 2.09E-05,
2537  1.06E-05, 5.76E-06, 3.00E-06, 1.62E-06, 2.10E-06 };
2538  Int_t bin = 0;
2539  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2540  if (bin < 20) weight = weightsBins[bin];
2541 
2542  } else if ( fPeriodEnum == kLHC15a3b || fPeriodEnum == kLHC15g1b ){
2543  Double_t ptHardBinRanges[13] = { 5, 7, 9, 12, 16,
2544  21, 28, 36, 45, 57,
2545  70, 85, 1000};
2546  Double_t weightsBins[12] = { 7.858393e-03, 4.718691e-03, 4.077575e-03, 2.814527e-03, 1.669625e-03,
2547  1.007535e-03, 4.536554e-04, 2.111041e-04, 1.094840e-04, 4.404973e-05,
2548  1.933238e-05, 1.562895e-05};
2549  Int_t bin = 0;
2550  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2551  if (bin < 12) weight = weightsBins[bin];
2552 
2553  } else if ( fPeriodEnum == kLHC15g1a ){
2554  Double_t ptHardBinRanges[20] = { 5, 11, 21, 36, 57,
2555  84, 117, 152, 191, 1000000,
2556  5, 7, 9, 12, 16,
2557  21, 28, 36, 45, 57 };
2558 // Double_t weightsBins[19] = { 4.407782 , 4.946649e-01, 3.890474e-02, 3.826300e-03, 4.429376e-04,
2559 // 6.306745e-05, 1.031527e-05, 2.267429e-06, 7.552074e-07, 0,
2560 // 2.4635e+00, 1.1483e+00, 6.5069e-01, 2.7130e-01, 8.1947e-02,
2561 // 3.1536e-02, 9.3139e-03, 2.9779e-03, 1.1252e-03};
2562  // LHC15g1a
2563  Double_t weightsBins[19] = { 4.43629 , 0.49523, 0.0394921, 0.00383174, 0.000446559,
2564  6.37374e-05, 1.03134e-05, 2.27012e-06, 7.59281e-07, 0,
2565  2.62906, 1.12884, 0.656873, 0.262822, 0.0876732,
2566  0.0307759, 0.0087083, 0.0027664, 0.00106203};
2567 
2568  Int_t bin = 0;
2569  Int_t binFromFile = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetPtHardFromFile();
2570  if (binFromFile != -1 && binFromFile >9 && ptHard < 57) bin = 9;
2571  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2572  if (bin < 19) weight = weightsBins[bin];
2573 
2574  } else if (fPeriodEnum == kLHC15a3a || fPeriodEnum == kLHC15a3a_plus ) {
2575  Double_t ptHardBinRanges[20] = { 5, 11, 21, 36, 57,
2576  84, 117, 152, 191, 1000000,
2577  5, 7, 9, 12, 16,
2578  21, 28, 36, 45, 57 };
2579  // LHC15a3a
2580  Double_t weightsBins[19] = { 4.43897 , 0.495766, 0.039486, 0.00383011, 0.000447104,
2581  6.37277e-05, 1.03166e-05, 2.26971e-06, 7.59023e-07, 0,
2582  2.63331, 1.12815, 0.657034, 0.262756, 0.0877227,
2583  0.0307638, 0.00870635, 0.00276658, 0.00106229};
2584  Int_t bin = 0;
2585  Int_t binFromFile = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetPtHardFromFile();
2586  if (binFromFile != -1 && binFromFile >9 && ptHard < 57) bin = 9;
2587  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2588  if (bin < 19) weight = weightsBins[bin];
2589 
2590  } else if ( fPeriodEnum == kLHC16c2 || fPeriodEnum == kLHC16c2_plus ){
2591  Double_t ptHardBinRanges[21] = { 5, 7, 9, 12, 16,
2592  21, 28, 36, 45, 57,
2593  70, 85, 99, 115, 132,
2594  150, 169, 190, 212, 235,
2595  1000000};
2596  Double_t weightsBins[20] = { 28.3084, 8.43277, 4.07753, 1.54359, 0.543318,
2597  0.208394, 0.0652349, 0.0186904, 0.00834528, 0.00301414,
2598  0.00125939, 0.000474403, 0.000244052, 0.00011924, 6.09838e-05,
2599  3.24148e-05, 1.84314e-05, 1.00926e-05, 5.68632e-06, 8.38092e-06};
2600  Int_t bin = 0;
2601  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2602  if (bin < 20) weight = weightsBins[bin];
2603 
2604  } else if ( fPeriodEnum == kLHC16c3a ){
2605  Double_t ptHardBinRanges[6] = { 7, 9, 12, 16, 21, 1000};
2606  Double_t weightsBins[5] = { 0.00672445, 0.00799158, 0.00678934, 0.00463908, 0.00600068}; //preliminary estimates
2607  Int_t bin = 0;
2608  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2609  if (bin < 5) weight = weightsBins[bin];
2610 
2611  } else if ( fPeriodEnum == kLHC16c3b ){
2612  Double_t ptHardBinRanges[7] = { 14, 19, 26, 35, 48, 66, 1000};
2613  Double_t weightsBins[6] = { 0.00608281, 0.00393646, 0.00200138, 0.000986267, 0.000389051, 0.0001863}; //preliminary estimates
2614  Int_t bin = 0;
2615  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2616  if (bin < 6) weight = weightsBins[bin];
2617 
2618  } else if ( fPeriodEnum == kLHC16c3c ){
2619  Double_t ptHardBinRanges[8] = { 0, 5, 11, 21, 36, 57, 84, 1000};
2620  Double_t weightsBins[7] = { 0.00151999, 0.000100346, 1.27688e-05, 1.82388e-06, 3.08506e-07, 6.00308e-08, 1.88414e-08}; //preliminary estimates
2621  Int_t bin = 0;
2622  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2623  if (bin < 7) weight = weightsBins[bin];
2624 
2625  } else if ( fPeriodEnum == kLHC13b4_plus || fPeriodEnum == kLHC13b4_fix ){
2626  Double_t ptHardBinRanges[11] = { 5, 11, 21, 36, 57,
2627  84, 117, 152, 191, 234,
2628  1000};
2629  Double_t weightsBins[10] = { 2.24185e-6 , 2.48463e-7, 2.23171e-8, 2.43667e-9, 3.29934e-10,
2630  5.34592e-11, 1.00937e-11, 2.6493e-12, 8.53912e-13, 5.43077e-13};
2631  Int_t bin = 0;
2632  while (!((ptHard< ptHardBinRanges[bin+1] && ptHard > ptHardBinRanges[bin]) || (ptHard == ptHardBinRanges[bin]) ) )bin++;
2633  if (bin < 10) weight = weightsBins[bin];
2634  } else {
2635  weight = 1;
2636  }
2637 
2638  if (weight == -1) return kFALSE;
2639  else return eventAccepted;
2640 
2641  } else {
2642  return kFALSE;
2643  }
2644  }
2645 
2646  return kFALSE;
2647 }
2648 
2649 //________________________________________________________________________
2650 // Analysing Jet-Jet MC's
2651 //________________________________________________________________________
2652 void AliConvEventCuts::GetXSectionAndNTrials(AliMCEvent *mcEvent, Float_t &XSection, Float_t &NTrials){
2653 
2654  AliGenCocktailEventHeader *cHeader = 0x0;
2655  Bool_t headerFound = kFALSE;
2656 
2657  if ( fPeriodEnum != kLHC17g8a_fast && fPeriodEnum != kLHC17g8a_cent_woSDD && // LHC16qt pPb 5TeV JetJet MC's
2658  fPeriodEnum != kLHC17g8b && fPeriodEnum != kLHC17g8c && // LHC16sr pPb 8TeV JetJet MC's
2659  fPeriodEnum != kLHC17f8a && fPeriodEnum != kLHC17f8b && fPeriodEnum != kLHC17f8c && // LHC16X Jet Jet MC's
2661  fPeriodEnum != kLHC16h3 && // LHC15n Jet Jet MC's
2662  fPeriodEnum != kLHC15a3a && fPeriodEnum != kLHC15a3a_plus && fPeriodEnum != kLHC15a3b && // LHC13g Jet Jet MC's
2663  fPeriodEnum != kLHC15g1a && fPeriodEnum != kLHC15g1b && // LHC11a Jet Jet MC's
2664  fPeriodEnum != kLHC13b4_fix && fPeriodEnum != kLHC13b4_plus && // LHC13 pPb Jet Jet MC's
2665  fPeriodEnum != kLHC16c3a && fPeriodEnum != kLHC16c3b && fPeriodEnum != kLHC16c3c && // LHC13 pPb Jet Jet MC's
2666  fPeriodEnum != kLHC16c2 && fPeriodEnum != kLHC16c2_plus // LHC12 JetJet MC
2667  ){
2668  NTrials = -1;
2669  XSection = -1;
2670  return;
2671  }
2672 
2673  if(mcEvent){
2674  cHeader = dynamic_cast<AliGenCocktailEventHeader*>(mcEvent->GenEventHeader());
2675  if(cHeader) headerFound = kTRUE;
2676  }else{
2677  //no mcEvent available -> not running on MC
2678  NTrials = -1;
2679  XSection = -1;
2680  return;
2681  }
2682 
2683  if(headerFound){
2684  TList *genHeaders = 0x0;
2685  if(cHeader) genHeaders = cHeader->GetHeaders();
2686  AliGenEventHeader* gh = 0;
2687  for(Int_t i = 0; i<genHeaders->GetEntries();i++){
2688  gh = (AliGenEventHeader*)genHeaders->At(i);
2689  TString GeneratorName = gh->GetName();
2690  if (GeneratorName.CompareTo("AliGenPythiaEventHeader") == 0){
2691  AliGenPythiaEventHeader* gPythia = dynamic_cast<AliGenPythiaEventHeader*>(gh);
2692  NTrials = gPythia->Trials();
2693  XSection = gPythia->GetXsection();
2694  return;
2695  }
2696  }
2697  } else {
2698  AliGenEventHeader * eventHeader = mcEvent->GenEventHeader();
2699  if(eventHeader){
2700  TString eventHeaderName = eventHeader->ClassName();
2701  if (eventHeaderName.CompareTo("AliGenPythiaEventHeader") == 0){
2702  AliGenPythiaEventHeader* gPythia = dynamic_cast<AliGenPythiaEventHeader*>(eventHeader);
2703  NTrials = gPythia->Trials();
2704  XSection = gPythia->GetXsection();
2705  return;
2706  }
2707  }
2708  }
2709 
2710  NTrials = -1;
2711  XSection = -1;
2712  return;
2713 }
2714 
2715 
2716 //________________________________________________________________________
2717 // Analysing Jet-Jet MC's
2718 //________________________________________________________________________
2720  AliGenCocktailEventHeader *cHeader = 0x0;
2721  Bool_t headerFound = kFALSE;
2722 
2723  if ( fPeriodEnum != kLHC17g8a_fast && fPeriodEnum != kLHC17g8a_cent_woSDD && // LHC16qt pPb 5TeV JetJet MC's
2724  fPeriodEnum != kLHC17g8b && fPeriodEnum != kLHC17g8c && // LHC16sr pPb 8TeV JetJet MC's
2725  fPeriodEnum != kLHC17f8a && fPeriodEnum != kLHC17f8b && fPeriodEnum != kLHC17f8c && // LHC16X Jet Jet MC's
2727  fPeriodEnum != kLHC16h3 && // LHC15n Jet Jet MC's
2728  fPeriodEnum != kLHC15a3a && fPeriodEnum != kLHC15a3a_plus && fPeriodEnum != kLHC15a3b && // LHC13g Jet Jet MC's
2729  fPeriodEnum != kLHC15g1a && fPeriodEnum != kLHC15g1b && // LHC11a Jet Jet MC's
2730  fPeriodEnum != kLHC13b4_fix && fPeriodEnum != kLHC13b4_plus && // LHC13 pPb Jet Jet MC's
2731  fPeriodEnum != kLHC16c3a && fPeriodEnum != kLHC16c3b && fPeriodEnum != kLHC16c3c && // LHC13 pPb Jet Jet MC's
2732  fPeriodEnum != kLHC16c2 && fPeriodEnum != kLHC16c2_plus // LHC12 JetJet MC
2733  ) return -1;
2734 
2735  if(mcEvent){
2736  cHeader = dynamic_cast<AliGenCocktailEventHeader*>(mcEvent->GenEventHeader());
2737  if(cHeader) headerFound = kTRUE;
2738  }else{
2739  //no mcEvent available -> not running on MC
2740  return -1;
2741  }
2742 
2743  if(headerFound){
2744  TList *genHeaders = 0x0;
2745  if(cHeader) genHeaders = cHeader->GetHeaders();
2746  AliGenEventHeader* gh = 0;
2747  for(Int_t i = 0; i<genHeaders->GetEntries();i++){
2748  gh = (AliGenEventHeader*)genHeaders->At(i);
2749  TString GeneratorName = gh->GetName();
2750  if (GeneratorName.CompareTo("AliGenPythiaEventHeader") == 0){
2751  return dynamic_cast<AliGenPythiaEventHeader*>(gh)->GetPtHard();
2752  }
2753  }
2754  } else {
2755  AliGenEventHeader * eventHeader = mcEvent->GenEventHeader();
2756  if(eventHeader){
2757  TString eventHeaderName = eventHeader->ClassName();
2758  if (eventHeaderName.CompareTo("AliGenPythiaEventHeader") == 0){
2759  return dynamic_cast<AliGenPythiaEventHeader*>(eventHeader)->GetPtHard();
2760  }
2761  }
2762  }
2763 
2764  return -1;
2765 }
2766 
2767 
2768 //________________________________________________________________________
2770  // abort if mimicing not enabled
2771 
2772  if (!fMimicTrigger) return kTRUE;
2773 
2774  Int_t runRangesEMCalL0 [35] = { 144871, 145288, 146375, 146382, // LHC11a
2775  146502, 148522, // LHC11a
2776  150209, 153056, 153911, 153915, // LHC11b,c,d
2777  158135, 158136, 158178, 158182, 160683,
2778  160764, 161139, 161256, 161379, 161457,
2779  161525, 161556, 161558, 161609, 161630,
2780  161724, // LHC11d,e
2781  173731, 177144, 177147, 177653, 177724, 178327,
2782  195180, // LHC13b-f
2783  197469, 197692 // LHC13g
2784  };
2785 
2786  Double_t thresholdEMCalL0[34] = { 2.11, 3.43, 1.71, 2.05, // LHC11a 7 TeV
2787  3.43, // LHC11a 2.76TeV
2788  1.94, 3.39, 4.01, 5.25, 5.5, // LHC11b, LHC11c, LHC11d
2789  2.05, 5.50, 2.05, 5.50, 2.05, 1.71, 5.50, 1.71, 5.50, 1.71, 5.50, 1.71, 5.50, 1.71, 5.50, 1.71,
2790  2.01, 1.75, 1.52, 2.01, 1.52, 1.85,
2791  3.2,
2792  /*2.01*/1.8
2793  };
2794  Double_t spreadEMCalL0[34] = { 0., 0., 0, 0, // LHC11a 7TeV
2795  /*0.7*/0.65, // LHC11a 2.76TeV
2796  0., 0., 0., 0., 0., // LHC11b, LHC11c, LHC11d
2797  0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
2798  0., 0., 0., 0., 0.2, 0.2,/*0.,0.,*/
2799  0.1,
2800  /*0.1*/0.12
2801  };
2802 
2803  Int_t runRangesEMCalL1[4] = { 179796, // LHC12c-i
2804  195180, // LHC13b-f
2805  197469, 197692 // LHC13g
2806  };
2807 
2808  Double_t thresholdEMCalL1[3] = { 9.5/*8.398*/, 11.5, /*6.*/5.5};
2809  Double_t spreadEMCalL1[3] = { 1.0/*0.*/, 0.5, /*0.4*/0.6};
2810 
2811  Int_t runRangesEMCalL1G2[3] = { 195180, // LHC13b-f
2812  197469, 197692 // LHC13g
2813  };
2814 
2815  Double_t thresholdEMCalL1G2[2] = { 7.2, /*3.9*/3.75};
2816  Double_t spreadEMCalL1G2[2] = { 0.3, /*0.2*/0.25};
2817 
2818  Int_t runnumber = event->GetRunNumber();
2819 
2820  if (fSpecialTrigger == 5 ){
2821  if (runnumber < runRangesEMCalL0[0]) return kTRUE;
2822  Int_t binRun = 0;
2823  while (!(runnumber >= runRangesEMCalL0[binRun] && runnumber < runRangesEMCalL0[binRun+1] ) && binRun < 34 ){
2824 // cout << runnumber << "\t" << binRun << "\t" << runRangesEMCalL0[binRun] << "\t" << runRangesEMCalL0[binRun+1] << endl;
2825  binRun++;
2826  }
2827  if (binRun==34) return kFALSE;
2828  Double_t threshold = thresholdEMCalL0[binRun];
2829 
2830  if (isMC && spreadEMCalL0[binRun] != 0.){
2831  TF1* triggerSmearing = new TF1("triggerSmearing","[0]*exp(-0.5*((x-[1])/[2])**2)",0,15);
2832  triggerSmearing->SetParameter(0, 1/(spreadEMCalL0[binRun]*TMath::Sqrt(TMath::Pi()*2)));
2833  triggerSmearing->SetParameter(1, thresholdEMCalL0[binRun]);
2834  triggerSmearing->SetParameter(2, spreadEMCalL0[binRun]);
2835  threshold = triggerSmearing->GetRandom();
2836  delete triggerSmearing;
2837  }
2838 
2839 // cout << runnumber << "\t"<< binRun << "\t"<< threshold << endl;
2840 
2841  Int_t nclus = 0;
2842  nclus = event->GetNumberOfCaloClusters();
2843 
2844  if(nclus == 0) return kFALSE;
2845 
2846  // Loop over EMCal clusters
2847  Bool_t eventIsAccepted = kFALSE;
2848  for(Int_t i = 0; i < nclus; i++){
2849  AliVCluster* clus = NULL;
2850  clus = event->GetCaloCluster(i);
2851  if (!clus) continue;
2852  if (!clus->IsEMCAL()) continue;
2853  if (clus->GetM02()<0.1) continue;
2854  if (clus->GetNCells()<2) continue;
2855  if (clus->E() > threshold ){
2856 // cout << "found L0" << endl;
2857  eventIsAccepted = kTRUE;
2858  }
2859  }
2860  return eventIsAccepted;
2861 
2862  } else if (fSpecialTrigger == 6 ) {
2863 
2864  return kTRUE;
2865  } else if (fSpecialTrigger == 8 ) {
2866  if (fSpecialSubTriggerName.CompareTo("7EGA")==0 || fSpecialSubTriggerName.CompareTo("8EGA")==0 || fSpecialSubTriggerName.CompareTo("7EG1")==0 ||fSpecialSubTriggerName.CompareTo("8EG1")==0 ){
2867  if (runnumber < runRangesEMCalL1[0]) return kTRUE;
2868  Int_t binRun = 0;
2869  while (!(runnumber >= runRangesEMCalL1[binRun] && runnumber < runRangesEMCalL1[binRun+1] ) && binRun < 3 ){
2870  // cout << runnumber << "\t" << binRun << "\t" << runRangesEMCalL0[binRun] << "\t" << runRangesEMCalL0[binRun+1] << endl;
2871  binRun++;
2872  }
2873  if (binRun==3) return kFALSE;
2874  Double_t threshold = thresholdEMCalL1[binRun];
2875 
2876  if (isMC && spreadEMCalL1[binRun] != 0.){
2877  TF1* triggerSmearing = new TF1("triggerSmearing","[0]*exp(-0.5*((x-[1])/[2])**2)",0,15);
2878  triggerSmearing->SetParameter(0, 1/(spreadEMCalL1[binRun]*TMath::Sqrt(TMath::Pi()*2)));
2879  triggerSmearing->SetParameter(1, thresholdEMCalL1[binRun]);
2880  triggerSmearing->SetParameter(2, spreadEMCalL1[binRun]);
2881  threshold = triggerSmearing->GetRandom();
2882  delete triggerSmearing;
2883  }
2884 
2885 // cout << runnumber << "\t"<< binRun << "\t L1 \t"<< threshold << endl;
2886 
2887  Int_t nclus = 0;
2888  nclus = event->GetNumberOfCaloClusters();
2889 
2890  if(nclus == 0) return kFALSE;
2891 
2892  // Loop over EMCal clusters
2893  Bool_t eventIsAccepted = kFALSE;
2894  for(Int_t i = 0; i < nclus; i++){
2895  AliVCluster* clus = NULL;
2896  clus = event->GetCaloCluster(i);
2897  if (!clus) continue;
2898  if (!clus->IsEMCAL()) continue;
2899  if (clus->GetM02()<0.1) continue;
2900  if (clus->GetNCells()<2) continue;
2901  if (clus->E() > threshold ){
2902 // cout << "found L1G1" << endl;
2903  eventIsAccepted = kTRUE;
2904  }
2905  }
2906  return eventIsAccepted;
2907  } else if ( fSpecialSubTriggerName.CompareTo("7EG2")==0 ||fSpecialSubTriggerName.CompareTo("8EG2")==0 ){
2908  if (runnumber < runRangesEMCalL1G2[0]) return kTRUE;
2909  Int_t binRun = 0;
2910  while (!(runnumber >= runRangesEMCalL1G2[binRun] && runnumber < runRangesEMCalL1G2[binRun+1] ) && binRun < 2 ){
2911  // cout << runnumber << "\t" << binRun << "\t" << runRangesEMCalL0[binRun] << "\t" << runRangesEMCalL0[binRun+1] << endl;
2912  binRun++;
2913  }
2914  if (binRun==2) return kFALSE;
2915  Double_t threshold = thresholdEMCalL1G2[binRun];
2916  if (isMC && spreadEMCalL1G2[binRun] != 0.){
2917  TF1* triggerSmearing = new TF1("triggerSmearing","[0]*exp(-0.5*((x-[1])/[2])**2)",0,15);
2918  triggerSmearing->SetParameter(0, 1/(spreadEMCalL1G2[binRun]*TMath::Sqrt(TMath::Pi()*2)));
2919  triggerSmearing->SetParameter(1, thresholdEMCalL1G2[binRun]);
2920  triggerSmearing->SetParameter(2, spreadEMCalL1G2[binRun]);
2921  threshold = triggerSmearing->GetRandom();
2922  delete triggerSmearing;
2923  }
2924 // cout << runnumber << "\t"<< binRun << "\t L2 \t"<< threshold << endl;
2925 
2926  Int_t nclus = 0;
2927  nclus = event->GetNumberOfCaloClusters();
2928 
2929  if(nclus == 0) return kFALSE;
2930 
2931  // Loop over EMCal clusters
2932  Bool_t eventIsAccepted = kFALSE;
2933  for(Int_t i = 0; i < nclus; i++){
2934  AliVCluster* clus = NULL;
2935  clus = event->GetCaloCluster(i);
2936  if (!clus) continue;
2937  if (!clus->IsEMCAL()) continue;
2938  if (clus->GetM02()<0.1) continue;
2939  if (clus->GetNCells()<2) continue;
2940  if (clus->E() > threshold ){
2941 // cout << "found L1G2" << endl;
2942  eventIsAccepted = kTRUE;
2943  }
2944  }
2945  return eventIsAccepted;
2946  }
2947  return kTRUE;
2948  } else if (fSpecialTrigger == 9 ) {
2949  return kTRUE;
2950  } else {
2951  return kTRUE;
2952  }
2953 
2954  return kTRUE;
2955 }
2956 
2957 
2958 //________________________________________________________________________
2960 {
2961 
2962  AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
2963 
2964 
2965  UInt_t isSelected = AliVEvent::kAny;
2966 
2967  if (fInputHandler==NULL) return kFALSE;
2968  if( fInputHandler->GetEventSelection() || event->IsA()==AliAODEvent::Class()) {
2969 
2970  TString firedTrigClass = event->GetFiredTriggerClasses();
2971  // if no trigger has been selected manually, select kAny in case of presel (also important for AOD filtering!)
2972  // in other cases select standards depending on system
2974  if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
2975  else {
2976  if (fIsHeavyIon == 1){
2977  fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
2978  } else if (fIsHeavyIon == 2){
2979  fOfflineTriggerMask = AliVEvent::kINT7;
2980  } else {
2981  fOfflineTriggerMask = AliVEvent::kMB;
2982  }
2983  }
2984  }
2985 
2986  // in case of MC switch to kAny if no MB/INT7/INT8 has been selected
2987  if(isMC){
2988  if( fIsHeavyIon == 0){
2989  if( fOfflineTriggerMask != AliVEvent::kMB && fOfflineTriggerMask != AliVEvent::kINT7 && fOfflineTriggerMask != AliVEvent::kINT8 ){
2990  fOfflineTriggerMask = AliVEvent::kAny;
2991  }
2992  }else{
2993  fOfflineTriggerMask = AliVEvent::kAny;
2994  }
2995  }
2996 
2997  if (fOfflineTriggerMask){
2998  isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
2999  if (isSelected && !fPreSelCut){
3000 // cout << firedTrigClass.Data() << endl;
3001 // cout << "Special trigger: "<< fSpecialTrigger << " initialized " << fEMCALTrigInitialized << endl;
3002 // if (fSpecialTrigger == 5 || fSpecialTrigger == 8 || fSpecialTrigger == 9){ // EMCAL triggers
3003 // if (!fEMCALTrigInitialized ) InitializeEMCALTrigger(event);
3004 // fTriggersEMCAL= GetTriggerList();
3005 // }
3006  if (fSpecialSubTrigger>0 && !isMC){
3007  if (!firedTrigClass.Contains(fSpecialSubTriggerName.Data())) isSelected = 0;
3008  if (fRejectTriggerOverlap){
3009  // trigger rejection EMC1,7,8
3010  if (fSpecialTrigger == 5 && fSpecialSubTriggerName.CompareTo("CEMC7") == 0){
3011  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7) isSelected = 0;
3012  } else if (fSpecialTrigger == 5 && fSpecialSubTriggerName.CompareTo("CEMC1") == 0){
3013  if (fInputHandler->IsEventSelected() & AliVEvent::kMB) isSelected = 0;
3014  } else if (fSpecialTrigger == 5 && fSpecialSubTriggerName.CompareTo("CEMC8") == 0){
3015  if (fInputHandler->IsEventSelected() & AliVEvent::kINT8) isSelected = 0;
3016  }
3017  // trigger rejection EGA
3018  if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("7EGA") == 0){
3019  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7) isSelected = 0;
3020  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3021  } else if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("8EGA") == 0){
3022  if (fInputHandler->IsEventSelected() & AliVEvent::kINT8) isSelected = 0;
3023  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3024  }
3025  // trigger rejection EG1 & EG2
3026  if (fPeriodEnum == kLHC13g){
3027  // EG1 is the trigger with the highest threshold
3028  if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("7EG1") == 0){
3029 // cout << firedTrigClass.Data() << endl;
3030  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7) isSelected = 0;
3031 // cout << "INT7? " << isSelected << endl;
3032  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3033 // cout << "CEM7? " << isSelected << endl;
3034  if (firedTrigClass.Contains("7EG2")) isSelected = 0;
3035 // cout << "7EG2? " << isSelected << endl;
3036  } else if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("8EG1") == 0){
3037  if (fInputHandler->IsEventSelected() & AliVEvent::kINT8) isSelected = 0;
3038  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3039  if (firedTrigClass.Contains("8EG2")) isSelected = 0;
3040  } else if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("7EG2") == 0){
3041 // cout << firedTrigClass.Data() << endl;
3042  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7) isSelected = 0;
3043 // cout << "INT7? " << isSelected << endl;
3044  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3045 // cout << "CEM7? " << isSelected << endl;
3046  } else if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("8EG2") == 0){
3047  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7) isSelected = 0;
3048  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3049  }
3050  } else {
3051  // EG2 is the trigger with the highest threshold
3052  if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("7EG2") == 0){
3053  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7) isSelected = 0;
3054  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3055  if (firedTrigClass.Contains("7EG1")) isSelected = 0;
3056  } else if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("8EG2") == 0){
3057  if (fInputHandler->IsEventSelected() & AliVEvent::kINT8) isSelected = 0;
3058  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3059  if (firedTrigClass.Contains("8EG1")) isSelected = 0;
3060  } else if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("7EG1") == 0){
3061  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7) isSelected = 0;
3062  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3063  } else if (fSpecialTrigger == 8 && fSpecialSubTriggerName.CompareTo("8EG1") == 0){
3064  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7) isSelected = 0;
3065  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7) isSelected = 0;
3066  }
3067  }
3068  }
3069  if (isSelected != 0 ){
3070 // cout << "I am here" << " :" << fSpecialSubTriggerName.Data() <<endl;
3071  if (fSpecialTrigger == 5 || fSpecialTrigger == 8 || fSpecialTrigger == 9 ){
3073  if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassesCorrelated->Fill(0);
3074  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassesCorrelated->Fill(1);
3075  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassesCorrelated->Fill(2);
3076  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassesCorrelated->Fill(3);
3077  if (firedTrigClass.Contains("7EJE") || firedTrigClass.Contains("8EJE")) hTriggerClassesCorrelated->Fill(4);
3078  if (firedTrigClass.Contains("7EJ1") || firedTrigClass.Contains("8EJ1")) hTriggerClassesCorrelated->Fill(5);
3079  if (firedTrigClass.Contains("7EJ2") || firedTrigClass.Contains("8EJ2")) hTriggerClassesCorrelated->Fill(6);
3080  if (firedTrigClass.Contains("7EGA") || firedTrigClass.Contains("8EGA")) hTriggerClassesCorrelated->Fill(7);
3081  if (firedTrigClass.Contains("7EG1") || firedTrigClass.Contains("8EG1")) hTriggerClassesCorrelated->Fill(8);
3082  if (firedTrigClass.Contains("7EG2") || firedTrigClass.Contains("8EG2")) hTriggerClassesCorrelated->Fill(9);
3083  }
3084  }
3085  }
3086 
3087  } else if (isMC){
3088  if (fSpecialTrigger == 5 || fSpecialTrigger == 8 || fSpecialTrigger == 9){ // EMCAL triggers
3089 // isSelected = 0;
3090 // if (fTriggersEMCAL > 0)cout << "Special Trigger " << fSpecialTrigger << " triggers: " << fTriggersEMCAL << " selected triggers: " << fTriggersEMCALSelected << " run number: " <<event->GetRunNumber()<<endl;
3091 // if (fTriggersEMCAL&fTriggersEMCALSelected){
3092 // cout << "accepted ++++++++++++++++++++" << endl;
3093  isSelected = 1;
3094 // }
3095  }
3096  }
3097  //if for specific centrality trigger selection
3098  if(fSpecialSubTrigger == 1){
3099  if(fSpecialSubTriggerName.Contains("|") && GetCentrality(event) <= 10.){
3100  TObjArray *ClassesList = fSpecialSubTriggerName.Tokenize("|");
3101  for (Int_t i=0; i<ClassesList->GetEntriesFast();++i){
3102  TObjString *NameClass = (TObjString*)ClassesList->At(i);
3103  if (firedTrigClass.Contains(NameClass->GetString())) isSelected = 1;
3104  }
3105  } else if(fSpecialSubTriggerName.Contains("%")){
3106  TObjArray *ClassesList = fSpecialSubTriggerName.Tokenize("%");
3107  for (Int_t i=0; i<ClassesList->GetEntriesFast();++i){
3108  TObjString *NameClass = (TObjString*)ClassesList->At(i);
3109  if (firedTrigClass.Contains(NameClass->GetString())) isSelected = 1;
3110  }
3111  } else if(fSpecialSubTriggerName.Contains("@")){
3112  TObjArray *ClassesList = fSpecialSubTriggerName.Tokenize("@");
3113  for (Int_t i=0; i<ClassesList->GetEntriesFast();++i){
3114  TObjString *NameClass = (TObjString*)ClassesList->At(i);
3115  if (firedTrigClass.Contains(NameClass->GetString())) isSelected = 1;
3116  }
3117  } else if(fSpecialSubTriggerName.Contains("&")){ //logic AND of two classes
3118  TObjArray *ClassesList = fSpecialSubTriggerName.Tokenize("&");
3119  TString CheckClass = "";
3120  for (Int_t i=0; i<ClassesList->GetEntriesFast(); i++){
3121  TObjString *NameClass = (TObjString*)ClassesList->At(i);
3122  if (firedTrigClass.Contains(NameClass->GetString())) CheckClass+="1";
3123  else CheckClass+="0";
3124  }
3125  if(CheckClass.Contains("0")) isSelected = 0;
3126  }
3127  else if(firedTrigClass.Contains(fSpecialSubTriggerName.Data())) isSelected = 1;
3128  }
3129  }
3130  }
3131  }
3132  fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
3133 
3134  Bool_t mimickedTrigger = kTRUE;
3135  if (fMimicTrigger) mimickedTrigger = MimicTrigger(event, isMC);
3136 // cout << "mimicked decision \t" << mimickedTrigger << "expect decision? "<< fMimicTrigger<< endl;
3137 
3138  // Fill Histogram
3139  if(hTriggerClass){
3140  if (fIsSDDFired) hTriggerClass->Fill(33);
3141  if (mimickedTrigger){
3142  if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
3143  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
3144  if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
3145  if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
3146  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
3147  if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
3148  if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
3149  // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
3150  if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
3151  // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
3152  if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
3153  // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
3154  if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
3155  // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
3156  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
3157  // if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
3158  if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
3159  if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
3160  if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
3161  // if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
3162  // if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
3163  if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
3164  if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
3165  if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
3166  if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
3167  if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
3168  if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
3169  if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
3170  // if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
3171  if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
3172  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
3173  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
3174  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
3175  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
3176  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
3177  if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
3178  if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
3179  if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
3180  if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
3181  if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
3182  if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
3183  }
3184  if (mimickedTrigger && fMimicTrigger) hTriggerClass->Fill(35);
3185  }
3186 
3187  if(hTriggerClassSelected && isSelected){
3188  if (mimickedTrigger){
3189  if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
3190  if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
3191  if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
3192  if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
3193  if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
3194  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
3195  if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
3196  if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
3197  // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
3198  if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
3199  // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
3200  if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
3201  // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
3202  if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
3203  // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
3204  if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
3205  // if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
3206  if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
3207  if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
3208  if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
3209  // if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
3210  // if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
3211  if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
3212  if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
3213  if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
3214  if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
3215  if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
3216  if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
3217  if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
3218  // if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
3219  if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
3220  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
3221  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
3222  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
3223  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
3224  if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
3225  if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
3226  if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
3227  if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
3228  if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
3229  if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
3230  }
3231  if (mimickedTrigger && fMimicTrigger) hTriggerClassSelected->Fill(34);
3232  }
3233 
3234  if(!isSelected)return kFALSE;
3235  if (fMimicTrigger)
3236  if (!mimickedTrigger ) return kFALSE;
3237  return kTRUE;
3238 
3239 }
3240 
3241 //________________________________________________________________________
3243  // returns TString with current cut number
3244  return fCutStringRead;
3245 }
3246 
3247 //________________________________________________________________________
3248 void AliConvEventCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *event){
3249 
3250  if(fNotRejectedStart){
3251  delete[] fNotRejectedStart;
3252  fNotRejectedStart = NULL;
3253  }
3254  if(fNotRejectedEnd){
3255  delete[] fNotRejectedEnd;
3256  fNotRejectedEnd = NULL;
3257  }
3258  if(fGeneratorNames){
3259  delete[] fGeneratorNames;
3260  fGeneratorNames = NULL;
3261  }
3262 
3263  if(rejection == 0) return; // No Rejection
3264 
3265  AliGenCocktailEventHeader *cHeader = 0x0;
3266  AliAODMCHeader *cHeaderAOD = 0x0;
3267  Bool_t headerFound = kFALSE;
3268  AliMCEvent *fMCEvent = 0x0;
3269  TClonesArray *fMCEventAOD = 0x0;
3270  if(event->IsA()==AliMCEvent::Class()){
3271  if(dynamic_cast<AliMCEvent*>(event)){
3272  cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(event)->GenEventHeader());
3273  fMCEvent = dynamic_cast<AliMCEvent*>(event);
3274  if(cHeader) headerFound = kTRUE;
3275  }
3276  }
3277  if(event->IsA()==AliAODEvent::Class()){ // event is a AODEvent in case of AOD
3278  cHeaderAOD = dynamic_cast<AliAODMCHeader*>(event->FindListObject(AliAODMCHeader::StdBranchName()));
3279  fMCEventAOD = dynamic_cast<TClonesArray*>(event->FindListObject(AliAODMCParticle::StdBranchName()));
3280  if(cHeaderAOD) headerFound = kTRUE;
3281  }
3282 
3283  if (fDebugLevel > 0 ) cout << "event starts here" << endl;
3284  if(headerFound){
3285  TList *genHeaders = 0x0;
3286  if(cHeader) genHeaders = cHeader->GetHeaders();
3287  if(cHeaderAOD){
3288  genHeaders = cHeaderAOD->GetCocktailHeaders();
3289  if(genHeaders->GetEntries()==1){
3291  return;
3292  }
3293  }
3294  AliGenEventHeader* gh = 0;
3295  fnHeaders = 0;
3296  Int_t firstindexA = 0;
3297  Int_t lastindexA = -1;
3298  if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
3299  if(rejection == 2){ // TList of Headers Names
3300  for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3301  gh = (AliGenEventHeader*)genHeaders->At(i);
3302  TString GeneratorName = gh->GetName();
3303  lastindexA = lastindexA + gh->NProduced();
3304  if (fDebugLevel > 0 ) cout << i << "\t" << GeneratorName.Data() << endl;
3305  for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3306  TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3307  if (fDebugLevel > 0 ) cout << GeneratorInList.Data() << endl;
3308  if(GeneratorName.CompareTo(GeneratorInList) == 0){
3309  if (fDebugLevel > 0 ) cout << "accepted" << endl;
3310  if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3311  if(fMCEvent){
3312  if (fPeriodEnum == kLHC14a1b || fPeriodEnum == kLHC14a1c ){
3313  if (fMCEvent->Particle(firstindexA)->GetPdgCode() == fAddedSignalPDGCode ) {
3314  if (gh->NProduced() > 10 && fMCEvent->Particle(firstindexA+10)->GetPdgCode() == fAddedSignalPDGCode ){
3315  if (fDebugLevel > 0 ) cout << "cond 1: "<< fnHeaders << endl;
3316  fnHeaders++;
3317  continue;
3318  }
3319  continue;
3320  }
3321  } else {
3322  if (fDebugLevel > 0 ) cout << "cond 2: " << fnHeaders << endl;
3323  fnHeaders++;
3324  continue;
3325 
3326  }
3327  }
3328  if ( fMCEventAOD){
3329  AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCEventAOD->At(firstindexA));
3330  if (aodMCParticle && (fPeriodEnum == kLHC14a1b || fPeriodEnum == kLHC14a1c) ){
3331  if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
3332  if (gh->NProduced() > 10){
3333  AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCEventAOD->At(firstindexA+10));
3334  if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
3335  if (fDebugLevel > 0 ) cout << "cond 1: " << fnHeaders << endl;
3336  fnHeaders++;
3337  continue;
3338  }
3339  }
3340  continue;
3341  }
3342  } else {
3343  if (fDebugLevel > 0 ) cout << "cond 2: " << fnHeaders << endl;
3344  fnHeaders++;
3345  continue;
3346  }
3347  }
3348  continue;
3349  }
3350  if (fDebugLevel > 0 ) cout << "cond 3: "<< fnHeaders << endl;
3351  fnHeaders++;
3352  continue;
3353  }
3354  }
3355  firstindexA = firstindexA + gh->NProduced();
3356  }
3357  }
3358  if (fDebugLevel > 0 ) cout << "number of headers: " <<fnHeaders << endl;
3359 
3363 
3364  if(rejection == 1 || rejection == 3){
3365  fNotRejectedStart[0] = 0;
3366  fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
3367  fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
3368  if (fDebugLevel > 0 ) cout << 0 << "\t" <<fGeneratorNames[0] << "\t" << fNotRejectedStart[0] << "\t" <<fNotRejectedEnd[0] << endl;
3369  return;
3370  }
3371 
3372  Int_t firstindex = 0;
3373  Int_t lastindex = -1;
3374  Int_t number = 0;
3375 
3376  for(Int_t i = 0; i<genHeaders->GetEntries();i++){
3377  gh = (AliGenEventHeader*)genHeaders->At(i);
3378  TString GeneratorName = gh->GetName();
3379  lastindex = lastindex + gh->NProduced();
3380  for(Int_t j = 0; j<HeaderList->GetEntries();j++){
3381  TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
3382  if (fDebugLevel > 0 ) cout << i << "\t" << GeneratorName.Data() << endl;
3383  if(GeneratorName.CompareTo(GeneratorInList) == 0){
3384  if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
3385  if(fMCEvent){
3386  if (fPeriodEnum == kLHC14a1b || fPeriodEnum == kLHC14a1c ){
3387  if (fMCEvent->Particle(firstindex)->GetPdgCode() == fAddedSignalPDGCode ) {
3388  if (fDebugLevel > 0 ) cout << "produced " << gh->NProduced() << " with box generator" << endl;
3389  if (gh->NProduced() > 10 && fMCEvent->Particle(firstindex+10)->GetPdgCode() == fAddedSignalPDGCode){
3390  if (fDebugLevel > 0 ) cout << "one of them was a pi0 or eta" << endl;
3391  fNotRejectedStart[number] = firstindex;
3392  fNotRejectedEnd[number] = lastindex;
3393  fGeneratorNames[number] = GeneratorName;
3394  number++;
3395  if (fDebugLevel > 0 ) cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3396  continue;
3397  }
3398  }
3399  } else {
3400  fNotRejectedStart[number] = firstindex;
3401  fNotRejectedEnd[number] = lastindex;
3402  fGeneratorNames[number] = GeneratorName;
3403  number++;
3404  continue;
3405  }
3406  }
3407  if ( fMCEventAOD){
3408  AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCEventAOD->At(firstindex));
3409  if (fPeriodEnum == kLHC14a1b || fPeriodEnum == kLHC14a1c ){
3410  if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
3411  if (gh->NProduced() > 10) {
3412  AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCEventAOD->At(firstindex+10));
3413  if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
3414  fNotRejectedEnd[number] = lastindex;
3415  fNotRejectedStart[number] = firstindex;
3416  fGeneratorNames[number] = GeneratorName;
3417  number++;
3418  }
3419  continue;
3420  }
3421  }
3422  } else {
3423  fNotRejectedStart[number] = firstindex;
3424  fNotRejectedEnd[number] = lastindex;
3425  fGeneratorNames[number] = GeneratorName;
3426  number++;
3427  continue;
3428  }
3429  }
3430  continue;
3431  } else {
3432  fNotRejectedStart[number] = firstindex;
3433  fNotRejectedEnd[number] = lastindex;
3434  fGeneratorNames[number] = GeneratorName;
3435  if (fDebugLevel > 0 ) cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
3436  number++;
3437  continue;
3438  }
3439 
3440  }
3441  }
3442  firstindex = firstindex + gh->NProduced();
3443  }
3444  if (fDebugLevel > 0 ) {
3445  for (Int_t i = 0; i < number; i++){
3446  cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
3447  }
3448  }
3449  } else { // No Cocktail Header Found
3450  fNotRejectedStart = new Int_t[1];
3451  fNotRejectedEnd = new Int_t[1];
3452 
3453  fnHeaders = 1;
3454  fNotRejectedStart[0] = 0;
3455  fNotRejectedEnd[0] = static_cast<AliMCEvent*>(event)->GetNumberOfPrimaries()-1;
3456  if (rejection > 1){
3457  fNotRejectedStart[0] = -1;
3458  fNotRejectedEnd[0] = -1;
3459  }
3460 
3461  fGeneratorNames = new TString[1];
3462  fGeneratorNames[0] = "NoCocktailGeneratorFound";
3463 // SetRejectExtraSignalsCut(0);
3464  }
3465 
3466 }
3467 
3468 //_________________________________________________________________________
3469 Int_t AliConvEventCuts::IsParticleFromBGEvent(Int_t index, AliMCEvent *mcEvent, AliVEvent *InputEvent){
3470 
3471  if (fDebugLevel > 2 ) cout << index << endl;
3472  if(index < 0) return 0; // No Particle
3473 
3474  Int_t accepted = 0;
3475  if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
3476  if(!mcEvent) return 0; // no mcEvent available, return 0
3477  if(index >= mcEvent->GetNumberOfPrimaries()){ // initial particle is secondary particle
3478  if( ((TParticle*)mcEvent->Particle(index))->GetMother(0) < 0) return 0; // material particle, return 0
3479  return IsParticleFromBGEvent(((TParticle*)mcEvent->Particle(index))->GetMother(0),mcEvent,InputEvent);
3480  }
3481  for(Int_t i = 0;i<fnHeaders;i++){
3482  if (fDebugLevel > 2 ) cout << "header " << i << ":"<< fNotRejectedStart[i] << "\t" << fNotRejectedEnd[i] << endl;
3483  if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3484  if (fDebugLevel > 1 ) cout << "accepted:" << index << "\t header " << i << ": "<< fNotRejectedStart[i] << "\t" << fNotRejectedEnd[i] << endl;
3485  accepted = 1;
3486  if(i == 0) accepted = 2; // MB Header
3487  }
3488  }
3489  }
3490  else if(InputEvent->IsA()==AliAODEvent::Class()){
3491  TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
3492  if (AODMCTrackArray){
3493  AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3494  if(!aodMCParticle) return 0; // no particle
3495  if(!aodMCParticle->IsPrimary()){
3496  if( aodMCParticle->GetMother() < 0) return 0;// material particle, return 0
3497  return IsParticleFromBGEvent(aodMCParticle->GetMother(),mcEvent,InputEvent);
3498  }
3499  index = TMath::Abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
3500  for(Int_t i = 0;i<fnHeaders;i++){
3501  if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
3502  accepted = 1;
3503  if(i == 0) accepted = 2; // MB Header
3504  }
3505  }
3506  }
3507  }
3508 
3509  return accepted;
3510 }
3511 
3512 //_________________________________________________________________________
3513 Int_t AliConvEventCuts::IsEventAcceptedByCut(AliConvEventCuts *ReaderCuts, AliVEvent *event, AliMCEvent *mcEvent, Int_t isHeavyIon, Bool_t isEMCALAnalysis){
3514 
3515  Bool_t isMC = kFALSE;
3516  if (mcEvent){isMC = kTRUE;}
3517 
3518  if ( !IsTriggerSelected(event, isMC) )
3519  return 3;
3520 
3521  if( !(IsCentralitySelected(event,mcEvent)))
3522  return 1; // Check Centrality --> Not Accepted => eventQuality = 1
3523 
3524  Bool_t hasV0And = ReaderCuts->HasV0AND();
3525  Bool_t isSDDFired = ReaderCuts->IsSDDFired();
3526 
3527  if( ( (IsSpecialTrigger() == 0 && IsSpecialSubTrigger() == 1) || (IsSpecialTrigger() == 1 && IsSpecialSubTrigger() == 1) ) && !isSDDFired && !mcEvent)
3528  //if V0OR with SDD requested or V0AND with SDD request but the SDD has not fired
3529  return 7; // V0 with SDD requested but no fired
3530 
3531  if( ( (IsSpecialTrigger() == 1 && IsSpecialSubTrigger() == 0) || (IsSpecialTrigger() == 1 && IsSpecialSubTrigger() == 1) ) && !hasV0And)
3532  //if V0AND (only) or V0AND with SDD requested but V0AND requested but no fired
3533  return 8; // V0AND requested but no fired
3534 
3535 
3536  if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !mcEvent)
3537  return 7; // With SDD requested but no fired
3538 
3539  if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
3540  return 8; // V0AND requested but no fired
3541 
3542  // Special EMCAL checks due to hardware issues in LHC11a
3543  if (isEMCALAnalysis || IsSpecialTrigger() == 5 || IsSpecialTrigger() == 8 || IsSpecialTrigger() == 9 ){
3544  Int_t runnumber = event->GetRunNumber();
3545  if ((runnumber>=144871) && (runnumber<=146860)) {
3546 
3547  AliVCaloCells *cells = event->GetEMCALCells();
3548  const Short_t nCells = cells->GetNumberOfCells();
3549 
3550  if (event->IsA()==AliESDEvent::Class()) AliAnalysisManager::GetAnalysisManager()->LoadBranch("EMCALCells.");
3551 
3552  AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
3553  if (!fInputHandler) return 3;
3554 
3555  // count cells above threshold
3556  Int_t nCellCount[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
3557  for(Int_t iCell=0; iCell<nCells; ++iCell) {
3558  Short_t cellId = cells->GetCellNumber(iCell);
3559  Double_t cellE = cells->GetCellAmplitude(cellId);
3560  Int_t sm = cellId / (24*48);
3561  if (cellE>0.1) ++nCellCount[sm];
3562  }
3563 
3564  Bool_t fIsLedEvent = kFALSE;
3565  if (nCellCount[4] > 100) {
3566  fIsLedEvent = kTRUE;
3567  } else {
3568  if ((runnumber>=146858) && (runnumber<=146860)) {
3569  if ((fInputHandler->IsEventSelected() & AliVEvent::kMB) && (nCellCount[3]>=21))
3570  fIsLedEvent = kTRUE;
3571  else if ((fInputHandler->IsEventSelected() & AliVEvent::kEMC1) && (nCellCount[3]>=35))
3572  fIsLedEvent = kTRUE;
3573  }
3574  }
3575  if (fIsLedEvent) {
3576  return 9;
3577  }
3578  }
3579  }
3580 
3581  // SPD clusters vs tracklets to check for pileup/background
3582  Int_t nClustersLayer0 = event->GetNumberOfITSClusters(0);
3583  Int_t nClustersLayer1 = event->GetNumberOfITSClusters(1);
3584  Int_t nTracklets = event->GetMultiplicity()->GetNumberOfTracklets();
3585  if(hSPDClusterTrackletBackgroundBefore) hSPDClusterTrackletBackgroundBefore->Fill(nTracklets, (nClustersLayer0 + nClustersLayer1));
3586 
3587 
3588  Double_t distZMax = 0;
3589  if(event->IsA()==AliESDEvent::Class()){
3590  Int_t nPileVert = ((AliESDEvent*)event)->GetNumberOfPileupVerticesSPD();
3591  if (hNPileupVertices) hNPileupVertices->Fill(nPileVert);
3592  if (nPileVert > 0){
3593  for(Int_t i=0; i<nPileVert;i++){
3594  const AliESDVertex* pv= ((AliESDEvent*)event)->GetPileupVertexSPD(i);
3595  Int_t nc2 = pv->GetNContributors();
3596  if(nc2>=3){
3597  Double_t z1 = ((AliESDEvent*)event)->GetPrimaryVertexSPD()->GetZ();
3598  Double_t z2 = pv->GetZ();
3599  Double_t distZ = z2-z1;
3600  if (TMath::Abs(distZMax) < TMath::Abs(distZ) ){
3601  distZMax = distZ;
3602  }
3603  }
3604  }
3605  if (hPileupVertexToPrimZ) hPileupVertexToPrimZ->Fill(distZMax);
3606  }
3607  }
3608  if(GetPastFutureLowBC()!=0 && GetPastFutureHighBC()!=0 ){
3609  if(IsOutOfBunchPileupPastFuture(event))
3610  return 12;
3611  }
3612 
3613  if( isHeavyIon != 2 && GetIsFromPileup()){
3614  if(event->IsPileupFromSPD(3,0.8,3.,2.,5.) ){
3616  return 6; // Check Pileup --> Not Accepted => eventQuality = 6
3617  }
3618  if (fUtils->IsSPDClusterVsTrackletBG(event)){
3620  return 11; // Check Pileup --> Not Accepted => eventQuality = 11
3621  }
3622  }
3623  if(isHeavyIon == 2 && GetIsFromPileup()){
3624  if(fUtils->IsPileUpEvent(event) ){
3626  return 6; // Check Pileup --> Not Accepted => eventQuality = 6
3627  }
3628  if (fUtils->IsSPDClusterVsTrackletBG(event)){
3630  return 11; // Check Pileup --> Not Accepted => eventQuality = 11
3631  }
3632  }
3633 
3635  if( IsPileUpV0MTPCout(event) ){
3636  return 13;
3637  }
3638  }
3639 
3640  if(hCentrality)hCentrality->Fill(GetCentrality(event));
3641 
3642  if(hVertexZ)hVertexZ->Fill(event->GetPrimaryVertex()->GetZ());
3643 // if(hCentralityVsNumberOfPrimaryTracks)
3644 // hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(event),
3645 // ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
3646 // ->GetTask(fV0ReaderName.Data()))->GetNumberOfPrimaryTracks());
3647 
3648  if(fIsHeavyIon == 1){
3649  AliEventplane *EventPlane = event->GetEventplane();
3650  fEventPlaneAngle = EventPlane->GetEventplane("V0",event,2);
3651  if(hEventPlaneAngle)hEventPlaneAngle->Fill(TMath::Abs(fEventPlaneAngle));
3652  }
3653  if(hSPDClusterTrackletBackground) hSPDClusterTrackletBackground->Fill(nTracklets, (nClustersLayer0 + nClustersLayer1));
3654 
3655  return 0;
3656 }
3657 
3658 
3659 //_________________________________________________________________________
3661 
3662  AliInfo("Inside the GetWeightForCentralityFlattening function");
3663  Double_t centrality = 0.;
3664  //obtain centrality for ESD or AOD
3665  if(!event || event->IsA()==AliESDEvent::Class()){
3666  AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
3667  if(esdEvent){
3668  AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
3669  if(fDetectorCentrality==0 && fIsHeavyIon==1){
3670  centrality = fESDCentrality->GetCentralityPercentile("V0M"); // default for PbPb
3671  }
3672  }
3673  } else if(event->IsA()==AliAODEvent::Class()){
3674  AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
3675  if(aodEvent){
3676  if(aodEvent->GetHeader()){
3677  centrality = ((AliVAODHeader*)aodEvent->GetHeader())->GetCentrality();
3678  }
3679  }
3680  }
3681 
3682  //Get the maximum vlaue from the reference distribution and interpolated value
3683  Float_t GetValueForWeight = 1.;
3684  Float_t maximum = 1.;
3685  Double_t weightCentrality = 1.;
3686  Bool_t CorrCentrLoop = kFALSE;
3687 
3688  //depending on the value of the flag, flattening in different cent. range
3689  if ( fDoCentralityFlat == 1 && (centrality >= 0. && centrality <= 10.) ){
3690  GetValueForWeight = hCentralityNotFlat->Interpolate(centrality);
3691  maximum = hCentralityNotFlat->GetMaximum();
3692  CorrCentrLoop = kTRUE;
3693  } else if ( fDoCentralityFlat == 2 && (centrality >=10. && centrality <= 20.) ){
3694  GetValueForWeight = hCentralityNotFlat->Interpolate(centrality);
3695  maximum = hCentralityNotFlat->GetMaximum();
3696  CorrCentrLoop = kTRUE;
3697  } else if ( fDoCentralityFlat == 8 ){
3698  GetValueForWeight = hCentralityNotFlat->Interpolate(centrality);
3699  maximum = hCentralityNotFlat->GetMaximum();
3700  CorrCentrLoop = kTRUE;
3701  } else {
3702  CorrCentrLoop = kFALSE;
3703  }
3704 
3705  if (CorrCentrLoop && GetValueForWeight != 0. && maximum !=0. && isfinite(GetValueForWeight) && isfinite(maximum) ){
3706  weightCentrality = maximum/GetValueForWeight;
3707  if (!isfinite(GetValueForWeight)) weightCentrality = 1.;
3708  if (!isfinite(weightCentrality)) weightCentrality = 1.;
3709  }
3710 
3711  return weightCentrality;
3712 }
3713 
3714 //_________________________________________________________________________
3716 
3717  Double_t weightMult = 1.;
3718 
3719  Float_t valueMultData = -1.;
3720  Float_t valueMultMC = -1.;
3721 
3722  if (hReweightMultData == NULL || hReweightMultMC == NULL ) return weightMult;
3723 
3724  valueMultData = hReweightMultData->Interpolate(mult);
3725  valueMultMC = hReweightMultMC->Interpolate(mult);
3726 
3727  Float_t relativeErrorMC = hReweightMultMC->GetBinError(hReweightMultMC->FindBin(mult))/hReweightMultMC->GetBinContent(hReweightMultMC->FindBin(mult));
3728  Float_t relativeErrorData = hReweightMultData->GetBinError(hReweightMultData->FindBin(mult))/hReweightMultData->GetBinContent(hReweightMultData->FindBin(mult));
3729 
3730  if (relativeErrorData < 0.2 && relativeErrorMC < 0.2 ){
3731  if (isfinite(valueMultData) && isfinite(valueMultMC) ){
3732  weightMult = valueMultData/valueMultMC;
3733  }
3734  }
3735 
3736  return weightMult;
3737 }
3738 
3739 
3740 
3741 //_________________________________________________________________________
3742 Float_t AliConvEventCuts::GetWeightForMeson(Int_t index, AliMCEvent *mcEvent, AliVEvent *event){
3743  if (!( fPeriodEnum == kLHC13d2 || fPeriodEnum == kLHC13d2b || // LHC10h MCs
3744  fPeriodEnum == kLHC14a1a || fPeriodEnum == kLHC14a1b || fPeriodEnum == kLHC14a1c || // LHC11h MCs
3745  fPeriodEnum == kLHC13e7 || fPeriodEnum == kLHC13b2_efix || fPeriodEnum == kLHC14b2 || // LHC13bc MCs
3746  fPeriodEnum == kLHC14e2a || fPeriodEnum == kLHC14e2b || fPeriodEnum == kLHC14e2c || // LHC12[a-i] pass 1 MCs
3747  fPeriodEnum == kLHC12f1a || fPeriodEnum == kLHC12f1b || fPeriodEnum == kLHC12i3 // LHC11a MCs
3748  ) ) return 1.;
3749  Int_t kCaseGen = 0;
3750 
3751  if(index < 0) return 0; // No Particle
3752 
3753  if (IsParticleFromBGEvent(index, mcEvent, event)){
3756  kCaseGen = 1;
3757  }
3758  }
3759  if (kCaseGen == 0) return 1;
3760 
3761  Double_t mesonPt = 0;
3762  //Double_t mesonMass = 0;
3763  Int_t PDGCode = 0;
3764  if(!event || event->IsA()==AliESDEvent::Class()){
3765  mesonPt = ((TParticle*)mcEvent->Particle(index))->Pt();
3766  //mesonMass = ((TParticle*)mcEvent->Particle(index))->GetCalcMass();
3767  PDGCode = ((TParticle*)mcEvent->Particle(index))->GetPdgCode();
3768  } else if(event->IsA()==AliAODEvent::Class()){
3769  TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(event->FindListObject(AliAODMCParticle::StdBranchName()));
3770  if (AODMCTrackArray){
3771  AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
3772  mesonPt = aodMCParticle->Pt();
3773  //mesonMass = aodMCParticle->GetCalcMass();
3774  PDGCode = aodMCParticle->GetPdgCode();
3775  } else {
3776  return 1;
3777  }
3778  }
3779 
3780  Float_t functionResultMC = 1.;
3781  if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
3782  functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
3783  }
3784  if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
3785  functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
3786  }
3787  if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
3788  functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
3789  }
3790 
3791  Float_t functionResultData = 1;
3792  if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
3793  functionResultData = fFitDataPi0->Eval(mesonPt);
3794  }
3795  if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
3796  functionResultData = fFitDataEta->Eval(mesonPt);
3797  }
3798  if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
3799  functionResultData = fFitDataK0s->Eval(mesonPt);
3800  }
3801 
3802  Double_t weight = 1;
3803  if (PDGCode == 111 || PDGCode == 221){
3804  if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
3805  weight = functionResultData/functionResultMC;
3806  if ( kCaseGen == 3){
3807  if (PDGCode == 111){
3808  if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
3809  weight = 1.;
3810  }
3811  }
3812  if (PDGCode == 221){
3813  if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
3814  weight = 1.;
3815  }
3816  }
3817  }
3818  if (!isfinite(functionResultData)) weight = 1.;
3819  if (!isfinite(weight)) weight = 1.;
3820  }
3821  } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
3822  weight = functionResultMC;
3823  }
3824  return weight;
3825 }
3826 
3827 
3830 
3831  if( fPeriodEnum == kLHC13bc || // mainly minimum bias
3832  fPeriodEnum == kLHC13de || // mainly triggered
3833  fPeriodEnum == kLHC13b4_fix || fPeriodEnum == kLHC13b4_plus || // MC Pythia 6 (Jet-Jet), anchor LHC13b-e
3834  fPeriodEnum == kLHC13b2_efix || //MC DPMJET, anchr LHC13b+c
3835  fPeriodEnum == kLHC13e7 || //MC HIJING, anchr LHC13b+c
3836  fPeriodEnum == kLHC14b2 //MC HIJING, anchr LHC13b+c
3837  ){
3838  printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
3839  SetEtaShift(-0.465);
3840  } else if( fPeriodEnum == kLHC13f ) {
3841  printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
3842  SetEtaShift(+0.465);
3843  }
3844  else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());
3845 }
3846 
3847 //________________________________________________________________________
3848 AliEMCALTriggerPatchInfo* AliConvEventCuts::GetMainTriggerPatch()
3849 {
3850  //get main trigger match; if not known yet, look for it and cache
3851 
3853  return fMainTriggerPatchEMCAL;
3854 
3855  if (!fTriggerPatchInfo) {
3856  AliError(Form("%s: fTriggerPatchInfo not available",GetName()));
3857  return 0;
3858  }
3859 
3860  //number of patches in event
3861  Int_t nPatch = fTriggerPatchInfo->GetEntries();
3862 
3863  //extract main trigger patch
3864  AliEMCALTriggerPatchInfo *patch;
3865  for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
3866  patch = (AliEMCALTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
3867  if (patch->IsMainTrigger()) {
3868  fMainTriggerPatchEMCAL = patch;
3869  break;
3870  }
3871  }
3872 
3873  return fMainTriggerPatchEMCAL;
3874 }
3875 
3876 
3877 //________________________________________________________________________
3879 {
3880 // cout << "entered EMCAL trigger initialization" << endl;
3881 
3882  // Init the analysis.
3883  if (fCaloTriggersName.IsNull()){
3884  if (event->IsA()==AliESDEvent::Class()){
3885  fCaloTriggersName = "EMCALTrigger";
3886  } else {
3887  fCaloTriggersName = "emcalTrigger";
3888  }
3889  }
3890 
3891  if (!fCaloTriggersName.IsNull() && !fCaloTriggers) {
3892  fCaloTriggers = dynamic_cast<AliVCaloTrigger*>(event->FindListObject(fCaloTriggersName));
3893  if (!fCaloTriggers) {
3894  AliError(Form("%s: Could not retrieve calo triggers %s!", GetName(), fCaloTriggersName.Data()));
3895  return;
3896  }
3897  }
3898 
3899  if (fCaloTriggerPatchInfoName.IsNull()){
3900  if (event->IsA()==AliESDEvent::Class()){
3901  fCaloTriggerPatchInfoName = "EmcalTriggers";
3902  } else {
3903  fCaloTriggerPatchInfoName = "EmcalTriggers";
3904  }
3905  }
3906 
3907  if (!fCaloTriggerPatchInfoName.IsNull() && !fTriggerPatchInfo) {
3908  fTriggerPatchInfo = GetArrayFromEvent(event, fCaloTriggerPatchInfoName.Data(), "AliEMCALTriggerPatchInfo");
3909  if (!fTriggerPatchInfo) {
3910  AliError(Form("%s: Could not retrieve calo trigger patch info %s!", GetName(), fCaloTriggerPatchInfoName.Data()));
3911  return;
3912  }
3913 
3914  }
3915 
3916  fEMCALTrigInitialized = kTRUE;
3917 }
3918 
3919 //________________________________________________________________________
3921  if (!fTriggerPatchInfo)
3922  return 0;
3923  //number of patches in event
3924  Int_t nPatch = fTriggerPatchInfo->GetEntries();
3925 
3926  //loop over patches to define trigger type of event
3927  Int_t nG1 = 0;
3928  Int_t nG2 = 0;
3929  Int_t nJ1 = 0;
3930  Int_t nJ2 = 0;
3931  Int_t nL0 = 0;
3932  AliEMCALTriggerPatchInfo *patch;
3933 // if (nPatch> 0) {cout << "NEW Triggers in this event*********************************" << endl;}
3934  for (Int_t iPatch = 0; iPatch < nPatch; iPatch++) {
3935  patch = (AliEMCALTriggerPatchInfo*)fTriggerPatchInfo->At( iPatch );
3936 // cout << "Patch energy: "<<patch->GetPatchE() << "\t ADC counts: " << patch->GetADCAmp() << endl;
3937 // cout << "Phi: " << patch->GetPhiMin() << " - " << patch->GetPhiMax() << " delta phi: " <<TMath::Abs(patch->GetPhiMin()-patch->GetPhiMax())<< endl;
3938 // cout << "Eta: " << patch->GetEtaMin() << " - " << patch->GetEtaMax() << " delta eta: " <<TMath::Abs(patch->GetEtaMin()-patch->GetEtaMax())<< endl;
3939  if (patch->IsGammaHigh()){
3940 // cout << "fired L1GA high" << endl;
3941  nG1++;
3942  }
3943  if (patch->IsGammaLow()){
3944 // cout << "fired L1GA low" << endl;
3945  nG2++;
3946  }
3947  if (patch->IsJetHigh()){
3948 // cout << "fired L1JE high" << endl;
3949  nJ1++;
3950  }
3951  if (patch->IsJetLow()){
3952 // cout << "fired L1JE low" << endl;
3953  nJ2++;
3954  }
3955  if (patch->IsLevel0()){
3956 // cout << "fired L0" << endl;
3957  nL0++;
3958  }
3959 // cout << patch->GetPatchE() << "\t" << patch->GetADCAmp() << "\t" << patch->IsGammaHigh() << "\t" << patch->IsGammaLow()
3960 // << "\t" << patch->IsJetHigh() << "\t" << patch->IsJetLow() << "\t" << patch->IsLevel0()
3961 // << "\t" << patch->GetPhiMin() << "\t" << patch->GetPhiMax() << "\t" << TMath::Abs(patch->GetPhiMin()-patch->GetPhiMax())
3962 // << "\t" << patch->GetEtaMin() << "\t" << patch->GetEtaMax() << "\t" << TMath::Abs(patch->GetEtaMin()-patch->GetEtaMax()) << endl;
3963  }
3964 
3965  if (nPatch > 0){
3966  AliDebug(2, "Patch summary: ");
3967  AliDebug(2, Form("Number of patches: %d", nPatch));
3968  AliDebug(2, Form("Level0: [%d]" ,nL0));
3969  AliDebug(2, Form("Jet: low[%d], high[%d]" ,nJ2, nJ1));
3970  AliDebug(2, Form("Gamma: low[%d], high[%d]" ,nG2, nG1));
3971  }
3972 
3973 // if (nPatch > 0){
3974 // cout << Form("Number of patches: %d", nPatch) << endl;
3975 // cout << Form("Level0: [%d]" ,nL0) << endl;
3976 // cout << Form("Jet: low[%d], high[%d]" ,nJ2, nJ1) << endl;
3977 // cout << Form("Gamma: low[%d], high[%d]" ,nG2, nG1) << endl;
3978 // }
3979 
3980  ULong_t triggers(0);
3981  if (nG1>0)
3982  SETBIT(triggers, kG1);
3983  if (nG2>0)
3984  SETBIT(triggers, kG2);
3985  if (nJ1>0)
3986  SETBIT(triggers, kJ1);
3987  if (nJ2>0)
3988  SETBIT(triggers, kJ2);
3989  if (nL0>0)
3990  SETBIT(triggers, kL0);
3991  return triggers;
3992 }
3993 
3994 //________________________________________________________________________
3996  // Check if event has a given trigger type
3997  if(t == kND){
3998  return fTriggersEMCAL == 0;
3999  }
4000  return TESTBIT(fTriggersEMCAL, int(t));
4001 }
4002 
4003 
4004 //________________________________________________________________________
4005 TClonesArray *AliConvEventCuts::GetArrayFromEvent(AliVEvent* event, const char *name, const char *clname)
4006 {
4007  // Get array from event.
4008 
4009  TClonesArray *arr = 0;
4010  TString sname(name);
4011  if (!sname.IsNull()) {
4012  arr = dynamic_cast<TClonesArray*>(event->FindListObject(sname));
4013  if (!arr) {
4014  AliWarning(Form("%s: Could not retrieve array with name %s!", GetName(), name));
4015  return 0;
4016  }
4017  } else {
4018  return 0;
4019  }
4020 
4021  if (!clname)
4022  return arr;
4023 
4024  TString objname(arr->GetClass()->GetName());
4025  TClass cls(objname);
4026  if (!cls.InheritsFrom(clname)) {
4027  AliWarning(Form("%s: Objects of type %s in %s are not inherited from %s!",
4028  GetName(), cls.GetName(), name, clname));
4029  return 0;
4030  }
4031  return arr;
4032 }
4033 
4034 //_________________________________________________________________________
4035 Bool_t AliConvEventCuts::IsConversionPrimaryESD( AliMCEvent *mcEvent, Long_t eventpos, Double_t prodVtxX, Double_t prodVtxY, Double_t prodVtxZ){
4036 
4037  if (eventpos < 0) return kFALSE;
4038  TParticle* particle = (TParticle *)mcEvent->Particle(eventpos);
4039  if (!particle) return kFALSE;
4040  if (TMath::Abs(particle->GetPdgCode()) == 11 ){
4041  if (particle->GetMother(0) != -1){
4042  TParticle* particleMother = (TParticle *)mcEvent->Particle(particle->GetMother(0));
4043  if (particleMother){
4044  if (TMath::Abs(particleMother->GetPdgCode()) == 22)
4045  particle = particleMother;
4046  }
4047  }
4048  }
4049  if (particle->GetMother(0) != -1){
4050  Double_t deltaX = particle->Vx() - prodVtxX;
4051  Double_t deltaY = particle->Vy() - prodVtxY;
4052  Double_t deltaZ = particle->Vz() - prodVtxZ;
4053 
4054  //Double_t realRadius2D = TMath::Sqrt(deltaX*deltaX+deltaY*deltaY);
4055  Double_t realRadius3D = TMath::Sqrt(deltaX*deltaX+deltaY*deltaY+deltaZ*deltaZ);
4056 
4057 
4058  Bool_t dalitzCand = kFALSE;
4059 
4060  TParticle* firstmother = (TParticle *)mcEvent->Particle(particle->GetMother(0));
4061  if (!firstmother) return kFALSE;
4062  Int_t pdgCodeFirstMother = firstmother->GetPdgCode();
4063  Bool_t intDecay = kFALSE;
4064  if ( pdgCodeFirstMother == 111 || pdgCodeFirstMother == 221 ) intDecay = kTRUE;
4065  if ( intDecay && TMath::Abs(particle->GetPdgCode()) == 11 ){
4066  dalitzCand = kTRUE;
4067 // cout << "dalitz candidate found" << endl;
4068  }
4069 
4070  Long_t source = particle->GetMother(0);
4071  Bool_t foundExcludedPart = kFALSE;
4072  Bool_t foundShower = kFALSE;
4073  Int_t pdgCodeMotherPrev = 0;
4074  Int_t pdgCodeMotherPPrevMother = 0;
4075  Int_t depth = 0;
4076  if (dalitzCand || realRadius3D < fSecProdBoundary ){
4077 // if (particle->GetPdgCode() == 22){
4078 // cout << endl << endl << "new particle: " << eventpos <<endl;
4079 // cout << particle->GetPdgCode() << "\t" << particle->R() << "\t" << realRadius2D << "\t" << realRadius3D << endl;
4080 // }
4081  while (depth < 20){
4082  TParticle* mother = (TParticle *)mcEvent->Particle(source);
4083  source = mother->GetMother(0);
4084 // if (particle->GetPdgCode() == 22)cout << "eventposition: "<< source << endl;
4085  Int_t pdgCodeMother = mother->GetPdgCode();
4086 // if (particle->GetPdgCode() == 22)cout << "Previous mothers: " << pdgCodeMother << "\t"<< pdgCodeMotherPrev<< "\t" << pdgCodeMotherPPrevMother << endl;
4087  if (pdgCodeMother == pdgCodeMotherPrev && pdgCodeMother == pdgCodeMotherPPrevMother) depth = 20;
4088  if (TMath::Abs(pdgCodeMother) == 11 && TMath::Abs(pdgCodeMotherPrev) == 22 && TMath::Abs(pdgCodeMotherPPrevMother) == 11 ){
4089  foundShower = kTRUE;
4090  depth =20;
4091  }
4092  if (TMath::Abs(pdgCodeMother) == 22 && TMath::Abs(pdgCodeMotherPrev) == 11 && TMath::Abs(pdgCodeMotherPPrevMother) == 22 ){
4093  foundShower = kTRUE;
4094  depth =20;
4095  }
4096 
4097  // particles to be excluded:
4098  // K0s - 310
4099  // K0l - 130
4100  // K+/- - 321
4101  // Lambda - 3122
4102  // Sigma0 - 3212
4103  // Sigma+/- - 3222, 3112
4104  // Cascades - 3322, 3312
4105  if (TMath::Abs(pdgCodeMother) == 310 || TMath::Abs(pdgCodeMother) == 130 || TMath::Abs(pdgCodeMother) == 321 ||
4106  TMath::Abs(pdgCodeMother) == 3122 || TMath::Abs(pdgCodeMother) == 3212 || TMath::Abs(pdgCodeMother) == 3222 ||
4107  TMath::Abs(pdgCodeMother) == 3112 || TMath::Abs(pdgCodeMother) == 3322 || TMath::Abs(pdgCodeMother) == 3312
4108  ) {
4109  foundExcludedPart = kTRUE;
4110  }
4111 // if (particle->GetPdgCode() == 22)cout << mother->GetPdgCode() << "\t" << source << "\t" << foundExcludedPart<< endl;
4112  pdgCodeMotherPPrevMother = pdgCodeMotherPrev;
4113  pdgCodeMotherPrev = pdgCodeMother;
4114  if (source == -1) depth = 20;
4115 
4116 // if (particle->GetPdgCode() == 22)cout << depth << endl;
4117  depth++;
4118  }
4119  }
4120  if (foundExcludedPart){
4121 // if (particle->GetPdgCode() == 22)cout << "This is definitely a secondary, manually excluded" << endl;
4122  return kFALSE;
4123  } else if (dalitzCand && realRadius3D < fSecProdBoundary ){
4124 // if (particle->GetPdgCode() == 22)cout << "This was a decay via a virtual photon" << endl;
4125  return kTRUE;
4126  } else if (foundShower){
4127 // if (particle->GetPdgCode() == 22)cout << "This is a shower" << endl;
4128  return kFALSE;
4129  } else if (realRadius3D >= fSecProdBoundary){
4130 // cout << "This is a secondary, to large production radius" << endl;
4131  return kFALSE;
4132  }
4133  }
4134 
4135  return kTRUE;
4136 }
4137 
4138 //_________________________________________________________________________
4139 Bool_t AliConvEventCuts::IsConversionPrimaryAOD(AliVEvent *event, AliAODMCParticle* AODMCParticle, Double_t prodVtxX, Double_t prodVtxY, Double_t prodVtxZ){
4140 
4141  TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(event->FindListObject(AliAODMCParticle::StdBranchName()));
4142  if (AODMCTrackArray == NULL) return kFALSE;
4143  AliAODMCParticle* currentParticle = AODMCParticle;
4144  if (TMath::Abs(currentParticle->GetPdgCode()) == 11 ){
4145  if (currentParticle->GetMother() != -1){
4146  AliAODMCParticle* particleMother = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(currentParticle->GetMother()));
4147  if (particleMother){
4148  if (TMath::Abs(particleMother->GetPdgCode()) == 22)
4149  currentParticle = particleMother;
4150  }
4151  }
4152  }
4153  if (currentParticle->GetMother() > -1){
4154  Double_t deltaX = currentParticle->Xv() - prodVtxX;
4155  Double_t deltaY = currentParticle->Yv() - prodVtxY;
4156  Double_t deltaZ = currentParticle->Zv() - prodVtxZ;
4157 
4158  //Double_t realRadius2D = TMath::Sqrt(deltaX*deltaX+deltaY*deltaY);
4159  Double_t realRadius3D = TMath::Sqrt(deltaX*deltaX+deltaY*deltaY+deltaZ*deltaZ);
4160 
4161  Bool_t dalitzCand = kFALSE;
4162 
4163  AliAODMCParticle* firstmother = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(currentParticle->GetMother()));
4164  if (!firstmother) return kFALSE;
4165  Int_t pdgCodeFirstMother = firstmother->GetPdgCode();
4166  Bool_t intDecay = kFALSE;
4167  if ( pdgCodeFirstMother == 111 || pdgCodeFirstMother == 221 ) intDecay = kTRUE;
4168  if ( intDecay && TMath::Abs(currentParticle->GetPdgCode()) == 11 ){
4169  dalitzCand = kTRUE;
4170 // cout << "dalitz candidate found" << endl;
4171  }
4172 
4173  Long_t source = currentParticle->GetMother();
4174  Bool_t foundExcludedPart = kFALSE;
4175  Bool_t foundShower = kFALSE;
4176  Int_t pdgCodeMotherPrev = 0;
4177  Int_t pdgCodeMotherPPrevMother = 0;
4178  Int_t depth = 0;
4179  if (dalitzCand || realRadius3D < fSecProdBoundary ){
4180 // if (currentParticle->GetPdgCode() == 22){
4181 // cout << endl << endl << "new particle: " << eventpos <<endl;
4182 // cout << currentParticle->GetPdgCode() << "\t" << currentParticle->R() << "\t" << realRadius2D << "\t" << realRadius3D << endl;
4183 // }
4184  while (depth < 20){
4185  AliAODMCParticle* mother = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(source));
4186  source = mother->GetMother();
4187 // if (currentParticle->GetPdgCode() == 22)cout << "eventposition: "<< source << endl;
4188  Int_t pdgCodeMother = mother->GetPdgCode();
4189 // if (currentParticle->GetPdgCode() == 22)cout << "Previous mothers: " << pdgCodeMother << "\t"<< pdgCodeMotherPrev<< "\t" << pdgCodeMotherPPrevMother << endl;
4190  if (pdgCodeMother == pdgCodeMotherPrev && pdgCodeMother == pdgCodeMotherPPrevMother) depth = 20;
4191  if (TMath::Abs(pdgCodeMother) == 11 && TMath::Abs(pdgCodeMotherPrev) == 22 && TMath::Abs(pdgCodeMotherPPrevMother) == 11 ){
4192  foundShower = kTRUE;
4193  depth =20;
4194  }
4195  if (TMath::Abs(pdgCodeMother) == 22 && TMath::Abs(pdgCodeMotherPrev) == 11 && TMath::Abs(pdgCodeMotherPPrevMother) == 22 ){
4196  foundShower = kTRUE;
4197  depth =20;
4198  }
4199 
4200  // particles to be excluded:
4201  // K0s - 310
4202  // K0l - 130
4203  // K+/- - 321
4204  // Lambda - 3122
4205  // Sigma0 - 3212
4206  // Sigma+/- - 3222, 3112
4207  // Cascades - 3322, 3312
4208  if (TMath::Abs(pdgCodeMother) == 310 || TMath::Abs(pdgCodeMother) == 130 || TMath::Abs(pdgCodeMother) == 321 ||
4209  TMath::Abs(pdgCodeMother) == 3122 || TMath::Abs(pdgCodeMother) == 3212 || TMath::Abs(pdgCodeMother) == 3222 ||
4210  TMath::Abs(pdgCodeMother) == 3112 || TMath::Abs(pdgCodeMother) == 3322 || TMath::Abs(pdgCodeMother) == 3312)
4211  {
4212  foundExcludedPart = kTRUE;
4213  }
4214 // if (currentParticle->GetPdgCode() == 22)cout << mother->GetPdgCode() << "\t" << source << "\t" << foundExcludedPart<< endl;
4215  pdgCodeMotherPPrevMother = pdgCodeMotherPrev;
4216  pdgCodeMotherPrev = pdgCodeMother;
4217  if (source == -1) depth = 20;
4218 
4219 // if (currentParticle->GetPdgCode() == 22)cout << depth << endl;
4220  depth++;
4221  }
4222  }
4223  if (foundExcludedPart){
4224 // if (currentParticle->GetPdgCode() == 22)cout << "This is definitely a secondary, manually excluded" << endl;
4225  return kFALSE;
4226  } else if (dalitzCand && realRadius3D < fSecProdBoundary ){
4227 // if (currentParticle->GetPdgCode() == 22)cout << "This was a decay via a virtual photon" << endl;
4228  return kTRUE;
4229  } else if (foundShower){
4230 // if (currentParticle->GetPdgCode() == 22)cout << "This is a shower" << endl;
4231  return kFALSE;
4232  } else if (realRadius3D >= fSecProdBoundary){
4233 // cout << "This is a secondary, too large production radius" << endl;
4234  return kFALSE;
4235  }
4236  }
4237 
4238  return kTRUE;
4239 }
4240 
4241 
4242 //________________________________________________________________________
4243 Int_t AliConvEventCuts::SecondaryClassificationPhoton( TParticle *particle, AliMCEvent* mcEvent, Bool_t isConversion ){
4244  if (particle != NULL && mcEvent != NULL){
4245  Int_t pdgSecondary = 0;
4246  if (!isConversion){
4247  //Bool_t hasMother = kFALSE;
4248  //Bool_t hasGrandMother = kFALSE;
4249  Long_t motherID = particle->GetMother(0);
4250  Long_t grandMotherID = -1;
4251  // is the photon a direct photons, without a mother?
4252  if (motherID > -1){
4253  //hasMother = kTRUE;
4254  grandMotherID = mcEvent->Particle(motherID)->GetMother(0);
4255  // is the meson a primary?
4256  if (grandMotherID > -1){
4257  //hasGrandMother = kTRUE;
4258  pdgSecondary = mcEvent->Particle(grandMotherID)->GetPdgCode();
4259  }
4260  }
4261  } else {
4262  //Bool_t hasMother = kFALSE;
4263  //Bool_t hasGrandMother = kFALSE;
4264  //Bool_t hasGreatGrandMother = kFALSE;
4265  Long_t motherID = particle->GetMother(0);
4266  Long_t grandMotherID = -1;
4267  Long_t greatGrandMotherID = -1;
4268  // is the electron a direct electron, without a mother?
4269  if (motherID > -1){
4270  //hasMother = kTRUE;
4271  grandMotherID = mcEvent->Particle(motherID)->GetMother(0);
4272  // is the photon a direct photons, without a mother?
4273  if (grandMotherID > -1){
4274  //hasGrandMother = kTRUE;
4275  greatGrandMotherID = mcEvent->Particle(grandMotherID)->GetMother(0);
4276  // is the meson a primary?
4277  if (greatGrandMotherID > -1){
4278  //hasGreatGrandMother = kTRUE;
4279  pdgSecondary = mcEvent->Particle(greatGrandMotherID)->GetPdgCode();
4280  }
4281  }
4282  }
4283  }
4284  // is the secondary photon from a lambda
4285  if (TMath::Abs(pdgSecondary) == 3122 )
4286  return 3;
4287  // is the secondary photon from a K0s
4288  else if ( TMath::Abs(pdgSecondary) == 310 )
4289  return 2;
4290  // is the secondary photon from a K0l
4291  else if ( TMath::Abs(pdgSecondary) == 130 )
4292  return 5;
4293  // is the secondary photon from a eta
4294  else if ( TMath::Abs(pdgSecondary) == 221 )
4295  return 4;
4296  // is the secondary photon from something else
4297  else if ( TMath::Abs(pdgSecondary) != 0 )
4298  return 1;
4299 
4300  }
4301 
4302  return 0;
4303 }
4304 
4305 //________________________________________________________________________
4306 Int_t AliConvEventCuts::SecondaryClassificationPhotonAOD( AliAODMCParticle *particle, TClonesArray *aodmcArray, Bool_t isConversion ){
4307  if (particle != NULL && aodmcArray != NULL){
4308  Int_t pdgSecondary = 0;
4309  if (!isConversion){
4310  //Bool_t hasMother = kFALSE;
4311  //Bool_t hasGrandMother = kFALSE;
4312  Long_t motherID = particle->GetMother();
4313  Long_t grandMotherID = -1;
4314  // is the photon a direct photons, without a mother?
4315  if (motherID > -1){
4316  //hasMother = kTRUE;
4317  grandMotherID = ((AliAODMCParticle*)aodmcArray->At(motherID))->GetMother();
4318  // is the meson a primary?
4319  if (grandMotherID > -1){
4320  //hasGrandMother = kTRUE;
4321  pdgSecondary = ((AliAODMCParticle*)aodmcArray->At(grandMotherID))->GetPdgCode();
4322  }
4323  }
4324  } else {
4325  //Bool_t hasMother = kFALSE;
4326  //Bool_t hasGrandMother = kFALSE;
4327  //Bool_t hasGreatGrandMother = kFALSE;
4328  Long_t motherID = particle->GetMother();
4329  Long_t grandMotherID = -1;
4330  Long_t greatGrandMotherID = -1;
4331  // is the electron a direct electron, without a mother?
4332  if (motherID > -1){
4333  //hasMother = kTRUE;
4334  grandMotherID = ((AliAODMCParticle*)aodmcArray->At(motherID))->GetMother();
4335  // is the photon a direct photons, without a mother?
4336  if (grandMotherID > -1){
4337  //hasGrandMother = kTRUE;
4338  greatGrandMotherID = ((AliAODMCParticle*)aodmcArray->At(grandMotherID))->GetMother();
4339  // is the meson a primary?
4340  if (greatGrandMotherID > -1){
4341  //hasGreatGrandMother = kTRUE;
4342  pdgSecondary = ((AliAODMCParticle*)aodmcArray->At(greatGrandMotherID))->GetPdgCode();
4343  }
4344  }
4345  }
4346  }
4347  // is the secondary photon from a lambda
4348  if (TMath::Abs(pdgSecondary) == 3122 )
4349  return 3;
4350  // is the secondary photon from a K0s
4351  else if ( TMath::Abs(pdgSecondary) == 310 )
4352  return 2;
4353  // is the secondary photon from a K0l
4354  else if ( TMath::Abs(pdgSecondary) == 130 )
4355  return 5;
4356  // is the secondary photon from a eta
4357  else if ( TMath::Abs(pdgSecondary) == 221 )
4358  return 4;
4359  // is the secondary photon from something else
4360  else if ( TMath::Abs(pdgSecondary) != 0 )
4361  return 1;
4362 
4363  }
4364 
4365  return 0;
4366 }
4367 
4369 
4370  if (periodName.CompareTo("") == 0){
4371  periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetPeriodName();
4372  }
4373 
4374  if (periodName.CompareTo("") == 0) {
4376  fEnergyEnum = kUnset;
4377  AliError("No correct period could be set, periodName string empty");
4378  return;
4379  }
4380 
4381  // Data
4382  if (periodName.CompareTo("LHC10b") == 0 || periodName.CompareTo("LHC10c") == 0 || periodName.CompareTo("LHC10d") == 0 || periodName.CompareTo("LHC10e") == 0 ||
4383  periodName.CompareTo("LHC10f") == 0 || periodName.CompareTo("LHC10g") == 0 || periodName.CompareTo("LHC10bg") == 0
4384  ){
4386  fEnergyEnum = k7TeV;
4387  } else if (periodName.CompareTo("LHC10h") == 0) {
4388  fPeriodEnum = kLHC10h;
4390  } else if (periodName.CompareTo("LHC11a") == 0) {
4391  fPeriodEnum = kLHC11a;
4393  } else if (periodName.CompareTo("LHC11b") == 0) {
4394  fPeriodEnum = kLHC11b;
4395  fEnergyEnum = k7TeV;
4396  } else if (periodName.CompareTo("LHC11c") == 0 || periodName.CompareTo("LHC11d") == 0 || periodName.CompareTo("LHC11e") == 0 || periodName.CompareTo("LHC11f") == 0 ||
4397  periodName.CompareTo("LHC11g") == 0
4398  ) {
4400  fEnergyEnum = k7TeV;
4401  } else if (periodName.CompareTo("LHC11h") == 0) {
4402  fPeriodEnum = kLHC11h;
4404  } else if (periodName.CompareTo("LHC12a") == 0 || periodName.CompareTo("LHC12b") == 0 || periodName.CompareTo("LHC12c") == 0 || periodName.CompareTo("LHC12d") == 0 ||
4405  periodName.CompareTo("LHC12e") == 0 || periodName.CompareTo("LHC12f") == 0 || periodName.CompareTo("LHC12g") == 0 || periodName.CompareTo("LHC12h") == 0 ||
4406  periodName.CompareTo("LHC12i") == 0 || periodName.CompareTo("LHC12ai") == 0
4407  ) {
4408  fPeriodEnum = kLHC12;
4409  fEnergyEnum = k8TeV;
4410  } else if (periodName.CompareTo("LHC13b") == 0 || periodName.CompareTo("LHC13c") == 0 || periodName.CompareTo("LHC13bc") == 0){
4413  } else if (periodName.CompareTo("LHC13d") == 0 || periodName.CompareTo("LHC13e") == 0 || periodName.CompareTo("LHC13de") == 0){
4416  } else if (periodName.CompareTo("LHC13f") == 0 ){
4417  fPeriodEnum = kLHC13f;
4419  } else if (periodName.CompareTo("LHC13g") == 0 ){
4420  fPeriodEnum = kLHC13g;
4422  } else if ( periodName.CompareTo("LHC15f") == 0 || periodName.CompareTo("LHC15g") == 0 || periodName.CompareTo("LHC15h") == 0 || periodName.CompareTo("LHC15i") == 0 ||
4423  periodName.CompareTo("LHC15j") == 0 || periodName.CompareTo("LHC15k") == 0 || periodName.CompareTo("LHC15l") == 0 || periodName.CompareTo("LHC15m") == 0 ||
4424  periodName.CompareTo("LHC15fm") == 0
4425  ) {
4427  fEnergyEnum = k13TeV;
4428  } else if (periodName.CompareTo("LHC15n") == 0 ){
4429  fPeriodEnum = kLHC15n;
4430  fEnergyEnum = k5TeV;
4431  } else if (periodName.CompareTo("LHC15o") == 0 ){
4432  fPeriodEnum = kLHC15o;
4434  } else if (periodName.CompareTo("LHC16k") == 0 || periodName.CompareTo("LHC16l") == 0 ){
4436  fEnergyEnum = k13TeV;
4437  } else if (periodName.CompareTo("LHC16d") == 0 ){
4438  fPeriodEnum = kLHC16d;
4439  fEnergyEnum = k13TeV;
4440  } else if (periodName.CompareTo("LHC16e") == 0 ){
4441  fPeriodEnum = kLHC16e;
4442  fEnergyEnum = k13TeV;
4443  } else if (periodName.CompareTo("LHC16f") == 0 ){
4444  fPeriodEnum = kLHC16f;
4445  fEnergyEnum = k13TeV;
4446  } else if (periodName.CompareTo("LHC16g") == 0 ){
4447  fPeriodEnum = kLHC16g;
4448  fEnergyEnum = k13TeV;
4449  } else if (periodName.CompareTo("LHC16h") == 0 ){
4450  fPeriodEnum = kLHC16h;
4451  fEnergyEnum = k13TeV;
4452  } else if (periodName.CompareTo("LHC16i") == 0 ){
4453  fPeriodEnum = kLHC16i;
4454  fEnergyEnum = k13TeV;
4455  } else if (periodName.CompareTo("LHC16j") == 0 ){
4456  fPeriodEnum = kLHC16j;
4457  fEnergyEnum = k13TeV;
4458  } else if (periodName.CompareTo("LHC16o") == 0 ){
4459  fPeriodEnum = kLHC16o;
4460  fEnergyEnum = k13TeV;
4461  } else if (periodName.CompareTo("LHC16p") == 0 ){
4462  fPeriodEnum = kLHC16p;
4463  fEnergyEnum = k13TeV;
4464  } else if (periodName.CompareTo("LHC16q") == 0 ){
4465  fPeriodEnum = kLHC16q;
4467  } else if (periodName.CompareTo("LHC16r") == 0 ){
4468  fPeriodEnum = kLHC16r;
4470  } else if (periodName.CompareTo("LHC16s") == 0 ){
4471  fPeriodEnum = kLHC16s;
4473  } else if (periodName.CompareTo("LHC16t") == 0 ){
4474  fPeriodEnum = kLHC16t;
4476 
4477  // LHC10x anchored MCs
4478  } else if (periodName.CompareTo("LHC10d1") == 0){
4480  fEnergyEnum = k7TeV;
4481  } else if (periodName.CompareTo("LHC10d2") == 0){
4483  fEnergyEnum = k7TeV;
4484  } else if (periodName.CompareTo("LHC10d4a") == 0){
4486  fEnergyEnum = k7TeV;
4487  } else if (periodName.CompareTo("LHC10d4") == 0){
4489  fEnergyEnum = k7TeV;
4490  } else if (periodName.CompareTo("LHC10e12") == 0){
4492  fEnergyEnum = k900GeV;
4493  } else if (periodName.CompareTo("LHC10e13") == 0){
4495  fEnergyEnum = k900GeV;
4496  } else if (periodName.CompareTo("LHC10e20") == 0){
4498  fEnergyEnum = k7TeV;
4499  } else if (periodName.CompareTo("LHC10e21") == 0){
4501  fEnergyEnum = k7TeV;
4502  } else if (periodName.CompareTo("LHC10f6a") == 0){
4504  fEnergyEnum = k7TeV;
4505  } else if (periodName.CompareTo("LHC10f6") == 0){
4507  fEnergyEnum = k7TeV;
4508  } else if (periodName.Contains("LHC14j4")){
4510  fEnergyEnum = k7TeV;
4511  } else if (periodName.CompareTo("LHC13d2") == 0){
4514  } else if (periodName.CompareTo("LHC13d2b") == 0){
4517  } else if (periodName.CompareTo("LHC12a11a") == 0){
4520  } else if (periodName.CompareTo("LHC12a11b") == 0){
4523  } else if (periodName.CompareTo("LHC12a11c") == 0){
4526  } else if (periodName.CompareTo("LHC12a11d") == 0){
4529  } else if (periodName.CompareTo("LHC12a11e") == 0){
4532  } else if (periodName.CompareTo("LHC12a11f") == 0){
4535  // LHC11x anchored MCs
4536  } else if (periodName.CompareTo("LHC12a15c") == 0){
4539  } else if (periodName.Contains("LHC12f1a") ){
4542  } else if (periodName.Contains("LHC12f1b") ){
4545  } else if (periodName.Contains("LHC12i3") ){
4548  } else if (periodName.CompareTo("LHC15g1a") == 0){
4551  } else if (periodName.CompareTo("LHC15g1b") == 0){
4554  } else if (periodName.CompareTo("LHC13e4") == 0){
4556  fEnergyEnum = k7TeV;
4557  } else if (periodName.CompareTo("LHC13e5") == 0){
4559  fEnergyEnum = k7TeV;
4560  } else if (periodName.CompareTo("LHC14k1a") == 0){
4562  fEnergyEnum = k7TeV;
4563  } else if (periodName.CompareTo("LHC14k1b") == 0){
4565  fEnergyEnum = k7TeV;
4566  } else if (periodName.CompareTo("LHC12a15f") == 0){
4568  fEnergyEnum = k7TeV;
4569  } else if (periodName.CompareTo("LHC12a15g") == 0){
4571  fEnergyEnum = k7TeV;
4572  } else if (periodName.CompareTo("LHC12f2a") == 0){
4574  fEnergyEnum = k7TeV;
4575  } else if (periodName.CompareTo("LHC14a1a") == 0){
4578  } else if (periodName.CompareTo("LHC14a1b") == 0){
4581  } else if (periodName.CompareTo("LHC14a1c") == 0){
4584  // LHC12x anchored MCs
4585  } else if (periodName.CompareTo("LHC14e2a") == 0){
4587  fEnergyEnum = k8TeV;
4588  } else if (periodName.CompareTo("LHC14e2b") == 0){
4590  fEnergyEnum = k8TeV;
4591  } else if (periodName.CompareTo("LHC14e2c") == 0){
4593  fEnergyEnum = k8TeV;
4594  } else if (periodName.Contains("LHC15h1")){
4596  fEnergyEnum = k8TeV;
4597  } else if (periodName.Contains("LHC15h2")){
4599  fEnergyEnum = k8TeV;
4600  } else if (periodName.CompareTo("LHC16c2") == 0){
4602  fEnergyEnum = k8TeV;
4603  } else if (periodName.CompareTo("LHC16c2_plus") == 0){
4605  fEnergyEnum = k8TeV;
4606  // LHC13x anchored MCs
4607  } else if (periodName.Contains("LHC13b2_efix")){
4610  } else if (periodName.CompareTo("LHC13e7") == 0){
4613  } else if (periodName.CompareTo("LHC14b2") == 0){
4616  } else if (periodName.CompareTo("LHC13b4_fix") == 0){
4619  } else if (periodName.CompareTo("LHC13b4_plus") == 0){
4622  } else if (periodName.CompareTo("LHC16c3a") == 0){
4625  } else if (periodName.CompareTo("LHC16c3b") == 0){
4628  } else if (periodName.CompareTo("LHC16c3c") == 0){
4631  } else if (periodName.CompareTo("LHC15g2") == 0){
4634  } else if (periodName.CompareTo("LHC15a3a") == 0){
4637  } else if (periodName.CompareTo("LHC15a3a_plus") == 0){
4640  } else if (periodName.CompareTo("LHC15a3b") == 0){
4643  } else if (periodName.CompareTo("LHC15d3a") == 0){
4646  } else if (periodName.CompareTo("LHC15d3b") == 0){
4649  // LHC15x anchored MCs
4650  } else if (periodName.CompareTo("LHC15g3a3") == 0){
4652  fEnergyEnum = k13TeV;
4653  } else if (periodName.CompareTo("LHC15g3a") == 0){
4655  fEnergyEnum = k13TeV;
4656  } else if (periodName.CompareTo("LHC15g3c2") == 0){
4658  fEnergyEnum = k13TeV;
4659  } else if (periodName.CompareTo("LHC15g3c3") == 0){
4661  fEnergyEnum = k13TeV;
4662  } else if (periodName.CompareTo("LHC15g3") == 0){
4664  fEnergyEnum = k13TeV;
4665  } else if (periodName.CompareTo("LHC16a2a") == 0){
4667  fEnergyEnum = k13TeV;
4668  } else if (periodName.CompareTo("LHC16a2b") == 0){
4670  fEnergyEnum = k13TeV;
4671  } else if (periodName.CompareTo("LHC16a2c") == 0){
4673  fEnergyEnum = k13TeV;
4674  } else if (periodName.CompareTo("LHC15l1a2") == 0){
4676  fEnergyEnum = k5TeV;
4677  } else if (periodName.CompareTo("LHC15l1b2") == 0){
4679  fEnergyEnum = k5TeV;
4680  } else if (periodName.CompareTo("LHC16h3") == 0){
4682  fEnergyEnum = k5TeV;
4683  } else if (periodName.CompareTo("LHC16h8a") == 0){
4685  fEnergyEnum = k5TeV;
4686  } else if (periodName.CompareTo("LHC16h8b") == 0){
4688  fEnergyEnum = k5TeV;
4689  } else if (periodName.CompareTo("LHC16k5a") == 0){
4691  fEnergyEnum = k5TeV;
4692  } else if (periodName.CompareTo("LHC16k5b") == 0){
4694  fEnergyEnum = k5TeV;
4695  } else if (periodName.CompareTo("LHC16k3a") == 0){
4697  fEnergyEnum = k5TeV;
4698  } else if (periodName.CompareTo("LHC16k3a2") == 0){
4700  fEnergyEnum = k5TeV;
4701  } else if (periodName.CompareTo("LHC17e2") == 0){
4703  fEnergyEnum = k5TeV;
4704  } else if (periodName.Contains("LHC15k1a1")){
4707  } else if (periodName.Contains("LHC15k1a2")){
4710  } else if (periodName.Contains("LHC15k1a3")){
4713  } else if (periodName.Contains("LHC16j7")){
4716  } else if (periodName.Contains("LHC16h4")){
4719  } else if (periodName.Contains("LHC16g1")){
4722  } else if (periodName.Contains("LHC16g1a")){
4725  } else if (periodName.Contains("LHC16g1b")){
4728  } else if (periodName.Contains("LHC16g1c")){
4731  } else if (periodName.Contains("LHC16g2")){
4734  } else if (periodName.Contains("LHC16g3")){
4737  } else if (periodName.Contains("LHC16h2a")){
4740  } else if (periodName.Contains("LHC16h2b")){
4743  } else if (periodName.Contains("LHC16h2c")){
4746  } else if (periodName.CompareTo("LHC16k3b") == 0){
4749  } else if (periodName.CompareTo("LHC16k3b2") == 0){
4752  // LHC16x anchored MCs
4753  } else if (periodName.CompareTo("LHC16j2a1") == 0){
4755  fEnergyEnum = k13TeV;
4756  } else if (periodName.CompareTo("LHC16j2b1") == 0){
4758  fEnergyEnum = k13TeV;
4759  } else if (periodName.CompareTo("LHC16j2a2") == 0){
4761  fEnergyEnum = k13TeV;
4762  } else if (periodName.CompareTo("LHC16j2b2") == 0){
4764  fEnergyEnum = k13TeV;
4765 
4766  } else if (periodName.CompareTo("LHC17f6") == 0){
4768  fEnergyEnum = k13TeV;
4769  } else if (periodName.CompareTo("LHC17f9") == 0){
4771  fEnergyEnum = k13TeV;
4772  } else if (periodName.CompareTo("LHC17d1") == 0){
4774  fEnergyEnum = k13TeV;
4775  } else if (periodName.CompareTo("LHC17d17") == 0){
4777  fEnergyEnum = k13TeV;
4778  } else if (periodName.CompareTo("LHC17f5") == 0){
4780  fEnergyEnum = k13TeV;
4781  } else if (periodName.CompareTo("LHC17d3") == 0){
4783  fEnergyEnum = k13TeV;
4784  } else if (periodName.CompareTo("LHC17e5") == 0){
4786  fEnergyEnum = k13TeV;
4787  } else if (periodName.CompareTo("LHC17d20a1") == 0){
4789  fEnergyEnum = k13TeV;
4790  } else if (periodName.CompareTo("LHC17d20a1_extra") == 0){
4792  fEnergyEnum = k13TeV;
4793  } else if (periodName.CompareTo("LHC17d20a2") == 0){
4795  fEnergyEnum = k13TeV;
4796  } else if (periodName.CompareTo("LHC17d20a2_extra") == 0){
4798  fEnergyEnum = k13TeV;
4799  } else if (periodName.CompareTo("LHC17d16") == 0){
4801  fEnergyEnum = k13TeV;
4802  } else if (periodName.CompareTo("LHC17d18") == 0){
4804  fEnergyEnum = k13TeV;
4805  } else if (periodName.CompareTo("LHC17f8a") == 0){
4807  fEnergyEnum = k13TeV;
4808  } else if (periodName.CompareTo("LHC17f8b") == 0){
4810  fEnergyEnum = k13TeV;
4811  } else if (periodName.CompareTo("LHC17f8c") == 0){
4813  fEnergyEnum = k13TeV;
4814  } else if (periodName.CompareTo("LHC17f8d") == 0){
4816  fEnergyEnum = k13TeV;
4817  } else if (periodName.CompareTo("LHC17f8e") == 0){
4819  fEnergyEnum = k13TeV;
4820  // LHC16qt anchored MCs
4821  } else if (periodName.CompareTo("LHC17f2a") == 0){
4824  } else if (periodName.CompareTo("LHC17f2a_fast") == 0){
4827  } else if (periodName.CompareTo("LHC17f2a_cent") == 0){
4830  } else if (periodName.CompareTo("LHC17f2a_cent_woSDD") == 0){
4833  } else if (periodName.CompareTo("LHC17f2a_fast_fix") == 0){
4836  } else if (periodName.CompareTo("LHC17f2a_cent_fix") == 0){
4839  } else if (periodName.CompareTo("LHC17f2a_cent_woSDD_fix") == 0){
4842  } else if (periodName.CompareTo("LHC17f2b") == 0){
4845  } else if (periodName.CompareTo("LHC17f2b_fast") == 0){
4848  } else if (periodName.CompareTo("LHC17f2b_cent") == 0){
4851  } else if (periodName.CompareTo("LHC17f2b_cent_woSDD") == 0){
4854  } else if (periodName.CompareTo("LHC17g8a_fast") == 0){
4857  } else if (periodName.CompareTo("LHC17g8a_cent_woSDD") == 0){
4860  // LHC16r anchored MCs
4861  } else if (periodName.CompareTo("LHC17a3a") == 0){
4864  } else if (periodName.CompareTo("LHC17a3a_fast") == 0){
4867  } else if (periodName.CompareTo("LHC17a3a_cent") == 0){
4870  } else if (periodName.CompareTo("LHC17a3a_cent_woSDD") == 0){
4873  } else if (periodName.CompareTo("LHC17a3b") == 0){
4876  } else if (periodName.CompareTo("LHC17a3b_fast") == 0){
4879  } else if (periodName.CompareTo("LHC17a3b_cent") == 0){
4882  } else if (periodName.CompareTo("LHC17a3b_cent_woSDD") == 0){
4885  } else