1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Authors: Svein Lindal, Daniel Lohner *
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 **************************************************************************/
16 ////////////////////////////////////////////////
17 //---------------------------------------------
18 // Class handling all kinds of selection cuts for
19 // Gamma Conversion analysis
20 //---------------------------------------------
21 ////////////////////////////////////////////////
23 #include "AliConvEventCuts.h"
25 #include "AliAODTrack.h"
26 #include "AliESDtrack.h"
27 #include "AliAnalysisManager.h"
28 #include "AliInputEventHandler.h"
29 #include "AliMCEventHandler.h"
30 #include "AliAODHandler.h"
35 #include "TObjString.h"
36 #include "AliAODEvent.h"
37 #include "AliESDEvent.h"
38 #include "AliCentrality.h"
42 #include "AliGenCocktailEventHeader.h"
43 #include "AliGenDPMjetEventHeader.h"
44 #include "AliGenPythiaEventHeader.h"
45 #include "AliGenHijingEventHeader.h"
46 #include "AliTriggerAnalysis.h"
47 #include "AliV0ReaderV1.h"
48 #include "AliAODMCParticle.h"
49 #include "AliAODMCHeader.h"
55 ClassImp(AliConvEventCuts)
58 const char* AliConvEventCuts::fgkCutNames[AliConvEventCuts::kNCuts] = {
62 "SelectSpecialTrigger", //3
63 "SelectSpecialSubTriggerClass", //4
65 "RejectExtraSignals", //6
69 //________________________________________________________________________
70 AliConvEventCuts::AliConvEventCuts(const char *name,const char *title) :
71 AliAnalysisCuts(name,title),
76 fDetectorCentrality(0),
77 fModCentralityClass(0),
81 fMultiplicityMethod(0),
83 fSpecialSubTrigger(0),
84 fRemovePileUp(kFALSE),
85 fRejectExtraSignals(0),
86 fOfflineTriggerMask(0),
91 fNotRejectedStart(NULL),
92 fNotRejectedEnd(NULL),
93 fGeneratorNames(NULL),
98 fDoReweightHistoMCPi0(kFALSE),
99 fDoReweightHistoMCEta(kFALSE),
100 fDoReweightHistoMCK0s(kFALSE),
101 fPathTrFReweighting(""),
102 fNameHistoReweightingPi0(""),
103 fNameHistoReweightingEta(""),
104 fNameHistoReweightingK0s(""),
108 fHistoEventCuts(NULL),
110 hCentralityVsNumberOfPrimaryTracks(NULL),
113 hTriggerClassSelected(NULL),
114 hReweightMCHistPi0(NULL),
115 hReweightMCHistEta(NULL),
116 hReweightMCHistK0s(NULL),
120 fAddedSignalPDGCode(0),
122 fTriggerSelectedManually(kFALSE),
123 fSpecialTriggerName(""),
124 fSpecialSubTriggerName(""),
125 fNSpecialSubTriggerOptions(0),
129 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=0;}
130 fCutString=new TObjString((GetCutNumber()).Data());
132 fUtils = new AliAnalysisUtils();
133 //if you do not want to apply the cut on the distance between the SPD and TRK vertex:
134 //fUtils->SetCutOnZVertexSPD(kFALSE);
139 //________________________________________________________________________
140 AliConvEventCuts::AliConvEventCuts(const AliConvEventCuts &ref) :
141 AliAnalysisCuts(ref),
143 fHeaderList(ref.fHeaderList),
144 fEventQuality(ref.fEventQuality),
145 fIsHeavyIon(ref.fIsHeavyIon),
146 fDetectorCentrality(ref.fDetectorCentrality),
147 fModCentralityClass(ref.fModCentralityClass),
148 fMaxVertexZ(ref.fMaxVertexZ),
149 fCentralityMin(ref.fCentralityMin),
150 fCentralityMax(ref.fCentralityMax),
151 fMultiplicityMethod(ref.fMultiplicityMethod),
152 fSpecialTrigger(ref.fSpecialTrigger),
153 fSpecialSubTrigger(ref.fSpecialSubTrigger),
154 fRemovePileUp(ref.fRemovePileUp),
155 fRejectExtraSignals(ref.fRejectExtraSignals),
156 fOfflineTriggerMask(ref.fOfflineTriggerMask),
157 fHasV0AND(ref.fHasV0AND),
158 fIsSDDFired(ref.fIsSDDFired),
159 fRandom(ref.fRandom),
160 fnHeaders(ref.fnHeaders),
161 fNotRejectedStart(NULL),
162 fNotRejectedEnd(NULL),
163 fGeneratorNames(ref.fGeneratorNames),
166 fEtaShift(ref.fEtaShift),
167 fDoEtaShift(ref.fDoEtaShift),
168 fDoReweightHistoMCPi0(ref.fDoReweightHistoMCPi0),
169 fDoReweightHistoMCEta(ref.fDoReweightHistoMCEta),
170 fDoReweightHistoMCK0s(ref.fDoReweightHistoMCK0s),
171 fPathTrFReweighting(ref.fPathTrFReweighting),
172 fNameHistoReweightingPi0(ref.fNameHistoReweightingPi0),
173 fNameHistoReweightingEta(ref.fNameHistoReweightingEta),
174 fNameHistoReweightingK0s(ref.fNameHistoReweightingK0s),
175 fNameFitDataPi0(ref.fNameFitDataPi0),
176 fNameFitDataEta(ref.fNameFitDataEta),
177 fNameFitDataK0s(ref.fNameFitDataK0s),
178 fHistoEventCuts(NULL),
180 hCentralityVsNumberOfPrimaryTracks(NULL),
183 hTriggerClassSelected(NULL),
184 hReweightMCHistPi0(ref.hReweightMCHistPi0),
185 hReweightMCHistEta(ref.hReweightMCHistEta),
186 hReweightMCHistK0s(ref.hReweightMCHistK0s),
187 fFitDataPi0(ref.fFitDataPi0),
188 fFitDataEta(ref.fFitDataEta),
189 fFitDataK0s(ref.fFitDataK0s),
190 fAddedSignalPDGCode(ref.fAddedSignalPDGCode),
191 fPreSelCut(ref.fPreSelCut),
192 fTriggerSelectedManually(ref.fTriggerSelectedManually),
193 fSpecialTriggerName(ref.fSpecialTriggerName),
194 fSpecialSubTriggerName(ref.fSpecialSubTriggerName),
195 fNSpecialSubTriggerOptions(ref.fNSpecialSubTriggerOptions),
196 fV0ReaderName(ref.fV0ReaderName)
199 for(Int_t jj=0;jj<kNCuts;jj++){fCuts[jj]=ref.fCuts[jj];}
200 fCutString=new TObjString((GetCutNumber()).Data());
201 fUtils = new AliAnalysisUtils();
202 // dont copy histograms (if you like histograms, call InitCutHistograms())
207 //________________________________________________________________________
208 AliConvEventCuts::~AliConvEventCuts() {
210 //Deleting fHistograms leads to seg fault it it's added to output collection of a task
212 // delete fHistograms;
213 // fHistograms = NULL;
214 if(fCutString != NULL){
218 if(fNotRejectedStart){
219 delete[] fNotRejectedStart;
220 fNotRejectedStart = NULL;
223 delete[] fNotRejectedEnd;
224 fNotRejectedEnd = NULL;
227 delete[] fGeneratorNames;
228 fGeneratorNames = NULL;
237 //________________________________________________________________________
238 void AliConvEventCuts::InitCutHistograms(TString name, Bool_t preCut){
240 // Initialize Cut Histograms for QA (only initialized and filled if function is called)
241 TH1::AddDirectory(kFALSE);
243 if(fHistograms != NULL){
247 if(fHistograms==NULL){
248 fHistograms=new TList();
249 fHistograms->SetOwner(kTRUE);
250 if(name=="")fHistograms->SetName(Form("ConvEventCuts_%s",GetCutNumber().Data()));
251 else fHistograms->SetName(Form("%s_%s",name.Data(),GetCutNumber().Data()));
254 if (hReweightMCHistPi0){
255 hReweightMCHistPi0->SetName("MCInputForWeightingPi0");
256 fHistograms->Add(hReweightMCHistPi0);
258 if (hReweightMCHistEta){
259 hReweightMCHistEta->SetName("MCInputForWeightingEta");
260 fHistograms->Add(hReweightMCHistEta);
262 if (hReweightMCHistK0s){
263 hReweightMCHistK0s->SetName("MCInputForWeightingK0s");
264 fHistograms->Add(hReweightMCHistK0s);
267 hCentrality=new TH1F(Form("Centrality %s",GetCutNumber().Data()),"Centrality",100,0,100);
268 fHistograms->Add(hCentrality);
269 hCentralityVsNumberOfPrimaryTracks=new TH2F(Form("Centrality vs Primary Tracks %s",GetCutNumber().Data()),"Centrality vs Primary Tracks ",100,0,100,4000,0,4000);
270 fHistograms->Add(hCentralityVsNumberOfPrimaryTracks);
272 // Event Cuts and Info
274 fHistoEventCuts=new TH1F(Form("ESD_EventCuts %s",GetCutNumber().Data()),"Event Cuts",7,-0.5,6.5);
275 fHistoEventCuts->GetXaxis()->SetBinLabel(1,"in");
276 fHistoEventCuts->GetXaxis()->SetBinLabel(2,"OfflineTrigger");
277 fHistoEventCuts->GetXaxis()->SetBinLabel(3,"nvtxcontr");
278 fHistoEventCuts->GetXaxis()->SetBinLabel(4,"VertexZ");
279 fHistoEventCuts->GetXaxis()->SetBinLabel(5,"pileup");
280 fHistoEventCuts->GetXaxis()->SetBinLabel(6,"centrsel");
281 fHistoEventCuts->GetXaxis()->SetBinLabel(7,"out");
282 fHistograms->Add(fHistoEventCuts);
284 hVertexZ=new TH1F(Form("VertexZ %s",GetCutNumber().Data()),"VertexZ",1000,-50,50);
285 fHistograms->Add(hVertexZ);
287 hTriggerClass= new TH1F(Form("OfflineTrigger %s",GetCutNumber().Data()),"OfflineTrigger",35,-0.5,34.5);
288 hTriggerClass->GetXaxis()->SetBinLabel( 1,"kMB");
289 hTriggerClass->GetXaxis()->SetBinLabel( 2,"kINT7");
290 hTriggerClass->GetXaxis()->SetBinLabel( 3,"kMUON");
291 hTriggerClass->GetXaxis()->SetBinLabel( 4,"kHighMult");
292 hTriggerClass->GetXaxis()->SetBinLabel( 5,"kKEMC1");
293 hTriggerClass->GetXaxis()->SetBinLabel( 6,"kCINT5");
294 hTriggerClass->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
295 hTriggerClass->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
296 hTriggerClass->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
297 hTriggerClass->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
298 hTriggerClass->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
299 hTriggerClass->GetXaxis()->SetBinLabel(12,"kMUS7");
300 hTriggerClass->GetXaxis()->SetBinLabel(13,"kPHI1");
301 hTriggerClass->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
302 hTriggerClass->GetXaxis()->SetBinLabel(15,"kEMCEJE");
303 hTriggerClass->GetXaxis()->SetBinLabel(16,"kEMCEGA");
304 hTriggerClass->GetXaxis()->SetBinLabel(17,"kCentral");
305 hTriggerClass->GetXaxis()->SetBinLabel(18,"kSemiCentral");
306 hTriggerClass->GetXaxis()->SetBinLabel(19,"kDG5");
307 hTriggerClass->GetXaxis()->SetBinLabel(20,"kZED");
308 hTriggerClass->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
309 hTriggerClass->GetXaxis()->SetBinLabel(22,"kINT8");
310 hTriggerClass->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
311 hTriggerClass->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
312 hTriggerClass->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
313 hTriggerClass->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
314 hTriggerClass->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
315 hTriggerClass->GetXaxis()->SetBinLabel(28,"kUserDefined");
316 hTriggerClass->GetXaxis()->SetBinLabel(29,"kTRD");
317 hTriggerClass->GetXaxis()->SetBinLabel(30,"kFastOnly");
318 hTriggerClass->GetXaxis()->SetBinLabel(31,"kAnyINT");
319 hTriggerClass->GetXaxis()->SetBinLabel(32,"kAny");
320 hTriggerClass->GetXaxis()->SetBinLabel(33,"V0AND");
321 hTriggerClass->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
322 hTriggerClass->GetXaxis()->SetBinLabel(35,"failed Physics Selection");
323 fHistograms->Add(hTriggerClass);
326 hTriggerClassSelected= new TH1F(Form("OfflineTriggerSelected %s",GetCutNumber().Data()),"OfflineTriggerSelected",34,-0.5,33.5);
327 hTriggerClassSelected->GetXaxis()->SetBinLabel( 1,"kMB");
328 hTriggerClassSelected->GetXaxis()->SetBinLabel( 2,"kINT7");
329 hTriggerClassSelected->GetXaxis()->SetBinLabel( 3,"kMUON");
330 hTriggerClassSelected->GetXaxis()->SetBinLabel( 4,"kHighMult");
331 hTriggerClassSelected->GetXaxis()->SetBinLabel( 5,"kKEMC1");
332 hTriggerClassSelected->GetXaxis()->SetBinLabel( 6,"kCINT5");
333 hTriggerClassSelected->GetXaxis()->SetBinLabel( 7,"kCMUS5/kMUSPB");
334 hTriggerClassSelected->GetXaxis()->SetBinLabel( 8,"kMUSH7/kMUSHPB");
335 hTriggerClassSelected->GetXaxis()->SetBinLabel( 9,"kMUL7/kMuonLikePB");
336 hTriggerClassSelected->GetXaxis()->SetBinLabel(10,"kMUU7/kMuonUnlikePB");
337 hTriggerClassSelected->GetXaxis()->SetBinLabel(11,"kEMC7/kEMC8");
338 hTriggerClassSelected->GetXaxis()->SetBinLabel(12,"kMUS7");
339 hTriggerClassSelected->GetXaxis()->SetBinLabel(13,"kPHI1");
340 hTriggerClassSelected->GetXaxis()->SetBinLabel(14,"kPHI7/kPHI8/kPHOSPb");
341 hTriggerClassSelected->GetXaxis()->SetBinLabel(15,"kEMCEJE");
342 hTriggerClassSelected->GetXaxis()->SetBinLabel(16,"kEMCEGA");
343 hTriggerClassSelected->GetXaxis()->SetBinLabel(17,"kCentral");
344 hTriggerClassSelected->GetXaxis()->SetBinLabel(18,"kSemiCentral");
345 hTriggerClassSelected->GetXaxis()->SetBinLabel(19,"kDG5");
346 hTriggerClassSelected->GetXaxis()->SetBinLabel(20,"kZED");
347 hTriggerClassSelected->GetXaxis()->SetBinLabel(21,"kSPI7/kSPI");
348 hTriggerClassSelected->GetXaxis()->SetBinLabel(22,"kINT8");
349 hTriggerClassSelected->GetXaxis()->SetBinLabel(23,"kMuonSingleLowPt8");
350 hTriggerClassSelected->GetXaxis()->SetBinLabel(24,"kMuonSingleHighPt8");
351 hTriggerClassSelected->GetXaxis()->SetBinLabel(25,"kMuonLikeLowPt8");
352 hTriggerClassSelected->GetXaxis()->SetBinLabel(26,"kMuonUnlikeLowPt8");
353 hTriggerClassSelected->GetXaxis()->SetBinLabel(27,"kMuonUnlikeLowPt0");
354 hTriggerClassSelected->GetXaxis()->SetBinLabel(28,"kUserDefined");
355 hTriggerClassSelected->GetXaxis()->SetBinLabel(29,"kTRD");
356 hTriggerClassSelected->GetXaxis()->SetBinLabel(30,"kFastOnly");
357 hTriggerClassSelected->GetXaxis()->SetBinLabel(31,"kAnyINT");
358 hTriggerClassSelected->GetXaxis()->SetBinLabel(32,"kAny");
359 hTriggerClassSelected->GetXaxis()->SetBinLabel(33,"V0AND");
360 hTriggerClassSelected->GetXaxis()->SetBinLabel(34,"NOT kFastOnly");
361 fHistograms->Add(hTriggerClassSelected);
364 TH1::AddDirectory(kTRUE);
367 ///________________________________________________________________________
368 Bool_t AliConvEventCuts::EventIsSelected(AliVEvent *fInputEvent, AliVEvent *fMCEvent){
369 // Process Event Selection
372 if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
375 // Check for MC event
376 if(fMCEvent && fInputEvent->IsA()==AliESDEvent::Class()){
377 // Check if MC event is correctly loaded
378 AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
383 if (!mcHandler->InitOk() ){
387 if (!mcHandler->TreeK() ){
391 if (!mcHandler->TreeTR() ) {
398 // cout << "before event trigger" << endl;
399 if(!IsTriggerSelected(fInputEvent)){
400 if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
406 if(fInputEvent->IsA()==AliESDEvent::Class()){
407 AliTriggerAnalysis fTriggerAnalysis;// = new AliTriggerAnalysis;
408 fHasV0AND = fTriggerAnalysis.IsOfflineTriggerFired((AliESDEvent*)fInputEvent, AliTriggerAnalysis::kV0AND);
409 if(fHasV0AND&&hTriggerClass)hTriggerClass->Fill(32);
411 // cout << "event number " << ((AliESDEvent*)fInputEvent)->GetEventNumberInFile() << " entered"<< endl;
414 // Number of Contributors Cut
415 if(GetNumberOfContributorsVtx(fInputEvent)<=0) {
416 if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
422 // Z Vertex Position Cut
423 if(!VertexZCut(fInputEvent)){
424 if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
433 if(fInputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
434 if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
441 // Centrality Selection
442 if(!IsCentralitySelected(fInputEvent,fMCEvent)){
443 if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
449 // Fill Event Histograms
450 if(fHistoEventCuts)fHistoEventCuts->Fill(cutindex);
451 if(hVertexZ)hVertexZ->Fill(fInputEvent->GetPrimaryVertex()->GetZ());
452 if(hCentrality)hCentrality->Fill(GetCentrality(fInputEvent));
453 if(hCentralityVsNumberOfPrimaryTracks)
454 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(fInputEvent),
455 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
456 ->GetTask(fV0ReaderName.Data()))->GetNumberOfPrimaryTracks());
461 ///________________________________________________________________________
462 Bool_t AliConvEventCuts::UpdateCutString() {
463 ///Update the cut string (if it has been created yet)
465 if(fCutString && fCutString->GetString().Length() == kNCuts) {
466 fCutString->SetString(GetCutNumber());
473 ///________________________________________________________________________
474 void AliConvEventCuts::LoadReweightingHistosMCFromFile() {
476 AliInfo("Entering loading of histograms for weighting");
477 TFile *f = TFile::Open(fPathTrFReweighting.Data());
479 AliError(Form("file for weighting %s not found",fPathTrFReweighting.Data()));
482 if (fNameHistoReweightingPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
483 cout << "I have to find: " << fNameHistoReweightingPi0.Data() << endl;
484 TH1D *hReweightMCHistPi0temp = (TH1D*)f->Get(fNameHistoReweightingPi0.Data());
485 hReweightMCHistPi0 = new TH1D(*hReweightMCHistPi0temp);
486 if (hReweightMCHistPi0) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingPi0.Data(),fPathTrFReweighting.Data() ));
487 else AliWarning(Form("%s not found in %s", fNameHistoReweightingPi0.Data() ,fPathTrFReweighting.Data()));
488 hReweightMCHistPi0->SetDirectory(0);
490 if (fNameFitDataPi0.CompareTo("") != 0 && fDoReweightHistoMCPi0 ){
491 cout << "I have to find: " << fNameFitDataPi0.Data() << endl;
492 TF1 *fFitDataPi0temp = (TF1*)f->Get(fNameFitDataPi0.Data());
493 fFitDataPi0 = new TF1(*fFitDataPi0temp);
494 if (fFitDataPi0) AliInfo(Form("%s has been loaded from %s", fNameFitDataPi0.Data(),fPathTrFReweighting.Data() ));
495 else AliWarning(Form("%s not found in %s",fPathTrFReweighting.Data(), fNameFitDataPi0.Data() ));
498 if (fNameHistoReweightingEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
499 cout << "I have to find: " << fNameHistoReweightingEta.Data() << endl;
500 TH1D *hReweightMCHistEtatemp = (TH1D*)f->Get(fNameHistoReweightingEta.Data());
501 hReweightMCHistEta = new TH1D(*hReweightMCHistEtatemp);
502 if (hReweightMCHistEta) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
503 else AliWarning(Form("%s not found in %s", fNameHistoReweightingEta.Data(),fPathTrFReweighting.Data() ));
504 hReweightMCHistEta->SetDirectory(0);
507 if (fNameFitDataEta.CompareTo("") != 0 && fDoReweightHistoMCEta){
508 cout << "I have to find: " << fNameFitDataEta.Data() << endl;
509 TF1 *fFitDataEtatemp = (TF1*)f->Get(fNameFitDataEta.Data());
510 fFitDataEta = new TF1(*fFitDataEtatemp);
511 if (fFitDataEta) AliInfo(Form("%s has been loaded from %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
512 else AliWarning(Form("%s not found in %s", fNameFitDataEta.Data(),fPathTrFReweighting.Data() ));
515 if (fNameHistoReweightingK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
516 cout << "I have to find: " << fNameHistoReweightingK0s.Data() << endl;
517 TH1D *hReweightMCHistK0stemp = (TH1D*)f->Get(fNameHistoReweightingK0s.Data());
518 hReweightMCHistK0s = new TH1D(*hReweightMCHistK0stemp);
519 if (hReweightMCHistK0s) AliInfo(Form("%s has been loaded from %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
520 else AliWarning(Form("%s not found in %s", fNameHistoReweightingK0s.Data(),fPathTrFReweighting.Data() ));
521 hReweightMCHistK0s->SetDirectory(0);
524 if (fNameFitDataK0s.CompareTo("") != 0 && fDoReweightHistoMCK0s){
525 cout << "I have to find: " << fNameFitDataK0s.Data() << endl;
526 TF1 *fFitDataK0stemp = (TF1*)f->Get(fNameFitDataK0s.Data());
527 fFitDataK0s = new TF1(*fFitDataK0stemp);
528 if (fFitDataK0s) AliInfo(Form("%s has been loaded from %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
529 else AliWarning(Form("%s not found in %s", fNameFitDataK0s.Data(),fPathTrFReweighting.Data() ));
536 ///________________________________________________________________________
537 Bool_t AliConvEventCuts::InitializeCutsFromCutString(const TString analysisCutSelection ) {
538 // Initialize Cuts from a given Cut string
539 if(fDoReweightHistoMCPi0 || fDoReweightHistoMCEta || fDoReweightHistoMCK0s) {
540 AliInfo("Weighting was enabled");
541 LoadReweightingHistosMCFromFile();
544 AliInfo(Form("Set Event Cut Number: %s",analysisCutSelection.Data()));
545 if(analysisCutSelection.Length()!=kNCuts) {
546 AliError(Form("Cut selection has the wrong length! size is %d, number of cuts is %d", analysisCutSelection.Length(), kNCuts));
549 if(!analysisCutSelection.IsDigit()){
550 AliError("Cut selection contains characters");
554 if (fV0ReaderName.CompareTo("") == 0){
555 fV0ReaderName = "V0ReaderV1";
557 const char *cutSelection = analysisCutSelection.Data();
558 #define ASSIGNARRAY(i) fCuts[i] = cutSelection[i] - '0'
559 for(Int_t ii=0;ii<kNCuts;ii++){
563 // Set Individual Cuts
564 for(Int_t ii=0;ii<kNCuts;ii++){
565 if(!SetCut(cutIds(ii),fCuts[ii]))return kFALSE;
568 PrintCutsWithValues();
573 ///________________________________________________________________________
574 Bool_t AliConvEventCuts::SetCut(cutIds cutID, const Int_t value) {
575 ///Set individual cut ID
579 if( SetRemovePileUp(value)) {
580 fCuts[kremovePileUp] = value;
583 } else return kFALSE;
584 case kSelectSpecialTriggerAlias:
585 if( SetSelectSpecialTrigger(value)) {
586 fCuts[kSelectSpecialTriggerAlias] = value;
589 } else return kFALSE;
590 case kSelectSubTriggerClass:
591 if( SetSelectSubTriggerClass(value)) {
592 fCuts[kSelectSubTriggerClass] = value;
595 } else return kFALSE;
597 if( SetIsHeavyIon(value)) {
598 fCuts[kisHeavyIon] = value;
601 } else return kFALSE;
603 if( SetCentralityMin(value)) {
604 fCuts[kCentralityMin] = value;
607 } else return kFALSE;
609 if( SetCentralityMax(value)) {
610 fCuts[kCentralityMax] = value;
613 } else return kFALSE;
615 if( SetRejectExtraSignalsCut(value)) {
616 fCuts[kExtraSignals] = value;
619 } else return kFALSE;
621 AliError("Cut id out of range");
625 AliError("Cut id %d not recognized");
629 ///________________________________________________________________________
630 void AliConvEventCuts::PrintCuts() {
631 // Print out current Cut Selection
632 for(Int_t ic = 0; ic < kNCuts; ic++) {
633 printf("%-30s : %d \n", fgkCutNames[ic], fCuts[ic]);
637 void AliConvEventCuts::PrintCutsWithValues() {
638 // Print out current Cut Selection with value
639 printf("\nEvent cutnumber \n");
640 for(Int_t ic = 0; ic < kNCuts; ic++) {
641 printf("%d",fCuts[ic]);
645 if (fIsHeavyIon == 0) {
646 printf("Running in pp mode \n");
647 if (fSpecialTrigger == 0){
648 printf("\t only events triggered by V0OR will be analysed \n");
649 } else if (fSpecialTrigger == 1){
650 printf("\t only events triggered by V0AND will be analysed \n");
651 } else if (fSpecialTrigger == 2){
652 printf("\t only events where SDD was present will be analysed \n");
653 } else if (fSpecialTrigger == 3){
654 printf("\t only events where SDD was present will be analysed and triggered by VOAND\n");
655 } else if (fSpecialTrigger > 3){
656 printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
658 } else if (fIsHeavyIon == 1){
659 printf("Running in PbPb mode \n");
660 if (fDetectorCentrality == 0){
661 printf("\t centrality selection based on V0M \n");
662 } else if (fDetectorCentrality == 1){
663 printf("\t centrality selection based on Cl1 \n");
665 if (fModCentralityClass == 0){
666 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
667 } else if ( fModCentralityClass == 1){
668 printf("\t %d - %d \n", fCentralityMin*5, fCentralityMax*5);
669 } else if ( fModCentralityClass == 2){
670 printf("\t %d - %d \n", fCentralityMin*5+45, fCentralityMax*5+45);
671 } else if (fModCentralityClass == 3){
672 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*10, fCentralityMax*10);
673 } else if ( fModCentralityClass == 4){
674 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5, fCentralityMax*5);
675 } else if ( fModCentralityClass == 5){
676 printf("\t %d - %d, with Track mult in MC as data \n", fCentralityMin*5+45, fCentralityMax*5+45);
678 if (fSpecialTrigger == 0){
679 printf("\t only events triggered by kMB, kCentral, kSemiCentral will be analysed \n");
680 } else if (fSpecialTrigger > 4){
681 printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
683 } else if (fIsHeavyIon == 2){
684 printf("Running in pPb mode \n");
685 if (fDetectorCentrality == 0){
686 printf("\t centrality selection based on V0A \n");
687 } else if (fDetectorCentrality == 1){
688 printf("\t centrality selection based on Cl1 \n");
690 if (fModCentralityClass == 0){
691 printf("\t %d - %d \n", fCentralityMin*10, fCentralityMax*10);
693 if (fSpecialTrigger == 0){
694 printf("\t only events triggered by kINT7 will be analysed \n");
695 } else if (fSpecialTrigger > 4){
696 printf("\t only events triggered by %s %s\n", fSpecialTriggerName.Data(), fSpecialSubTriggerName.Data());
699 printf("MC event cuts: \n");
700 if (fRejectExtraSignals == 0) printf("\t no rejection was applied \n");
701 else if (fRejectExtraSignals == 1) printf("\t only MB header will be inspected \n");
702 else if (fRejectExtraSignals > 1) printf("\t special header have been selected \n");
705 ///________________________________________________________________________
706 Bool_t AliConvEventCuts::SetIsHeavyIon(Int_t isHeavyIon)
714 fDetectorCentrality=0;
718 fDetectorCentrality=1;
720 case 3: //allows to select centrality 0-45% in steps of 5% for V0 Multiplicity
722 fDetectorCentrality=0;
723 fModCentralityClass=1;
725 case 4: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
727 fDetectorCentrality=0;
728 fModCentralityClass=2;
730 case 5: //strict cut on v0 tracks for MC
732 fDetectorCentrality=0;
733 fModCentralityClass=3;
735 case 6: //allows to select centrality 0-45% in steps of 5% for track mult
736 //strict cut on v0 tracks for MC
738 fDetectorCentrality=0;
739 fModCentralityClass=4;
741 case 7: //allows to select centrality 45-90% in steps of 5% for V0 Multiplicity
742 //strict cut on v0 tracks for MC
744 fDetectorCentrality=0;
745 fModCentralityClass=5;
749 fDetectorCentrality=0;
753 fDetectorCentrality=1;
756 AliError(Form("SetHeavyIon not defined %d",isHeavyIon));
762 //___________________________________________________________________
763 Bool_t AliConvEventCuts::SetCentralityMin(Int_t minCentrality)
766 if(minCentrality<0||minCentrality>9){
767 AliError(Form("minCentrality not defined %d",minCentrality));
771 fCentralityMin=minCentrality;
775 //___________________________________________________________________
776 Bool_t AliConvEventCuts::SetCentralityMax(Int_t maxCentrality)
779 if(maxCentrality<0||maxCentrality>9){
780 AliError(Form("maxCentrality not defined %d",maxCentrality));
783 fCentralityMax=maxCentrality;
787 ///________________________________________________________________________
788 Bool_t AliConvEventCuts::SetSelectSpecialTrigger(Int_t selectSpecialTrigger)
791 switch(selectSpecialTrigger){
793 fSpecialTrigger=0; // dont care
796 fSpecialTrigger=1; // V0AND
799 fSpecialTrigger=2; // with SDD requested
802 fSpecialTrigger=3; // V0AND plus with SDD requested
804 // allows to run MB & 6 other different trigger classes in parallel with the same photon cut
806 fSpecialTrigger=4; // trigger alias kTRD
807 fOfflineTriggerMask=AliVEvent::kTRD;
808 fTriggerSelectedManually = kTRUE;
809 fSpecialTriggerName="AliVEvent::kTRD";
812 fSpecialTrigger=5; // trigger alias kEMC
813 fOfflineTriggerMask=AliVEvent::kEMC7 | AliVEvent::kEMC8 | AliVEvent::kEMC1 ;
814 fTriggerSelectedManually = kTRUE;
815 fSpecialTriggerName="AliVEvent::kEMC7/kEMC8/kEMC1";
818 fSpecialTrigger=6; // trigger alias kPHI
819 fOfflineTriggerMask=AliVEvent::kPHI7 | AliVEvent::kPHI1 | AliVEvent::kPHI8 | AliVEvent::kPHOSPb;
820 fTriggerSelectedManually = kTRUE;
821 fSpecialTriggerName="AliVEvent::kPHI7/kPHI1/kPHI8/kPHOSPb";
824 fSpecialTrigger=7; // trigger alias kHighMult
825 fOfflineTriggerMask=AliVEvent::kHighMult;
826 fTriggerSelectedManually = kTRUE;
827 fSpecialTriggerName="AliVEvent::kHighMult";
830 fSpecialTrigger=8; // trigger alias kEMCEGA
831 fOfflineTriggerMask=AliVEvent::kEMCEGA;
832 fTriggerSelectedManually = kTRUE;
833 fSpecialTriggerName="AliVEvent::kEMCEGA";
836 fSpecialTrigger=9; // trigger alias kEMCEJE
837 fOfflineTriggerMask=AliVEvent::kEMCEJE;
838 fTriggerSelectedManually = kTRUE;
839 fSpecialTriggerName="AliVEvent::kEMCEJE";
842 AliError("Warning: Special Trigger Not known");
848 ///________________________________________________________________________
849 Bool_t AliConvEventCuts::SetSelectSubTriggerClass(Int_t selectSpecialSubTriggerClass)
852 if (fSpecialTrigger == 1){ //V0AND with different detectors
853 switch(selectSpecialSubTriggerClass){
856 fSpecialSubTrigger=0;
857 // AliInfo("Info: Nothing to be done");
861 fSpecialSubTrigger=0;
862 fOfflineTriggerMask=AliVEvent::kINT8;
863 fTriggerSelectedManually = kTRUE;
864 fSpecialTriggerName="AliVEvent::kINT8";
867 AliError("Warning: Special Subtrigger Class Not known");
871 } else if (fSpecialTrigger == 4){ // Subdivision of TRD trigger classes
872 switch(selectSpecialSubTriggerClass){
873 case 0: // all together
874 fSpecialSubTrigger=0;
875 fSpecialSubTriggerName="";
876 // AliInfo("Info: Nothing to be done");
878 case 1: // 7WUHSH - V0AND with single electron in TRD & EMCAL
879 fSpecialSubTrigger=1;
880 fNSpecialSubTriggerOptions=1;
881 fSpecialSubTriggerName="7WUHEE";
883 case 2: // 8WUHSH - T0AND with single electron in TRD & EMCAL
884 fSpecialSubTrigger=1;
885 fNSpecialSubTriggerOptions=1;
886 fSpecialSubTriggerName="8WUHEE";
888 case 3: // 7WUHSE - V0AND with single high pt electron in TRD
889 fSpecialSubTrigger=1;
890 fNSpecialSubTriggerOptions=1;
891 fSpecialSubTriggerName="7WUHSE";
893 case 4: // 8WUHSE - T0AND with single high pt electron in TRD
894 fSpecialSubTrigger=1;
895 fNSpecialSubTriggerOptions=1;
896 fSpecialSubTriggerName="8WUHSE";
898 case 5: // 7WUHJE - V0AND with jet in TRD
899 fSpecialSubTrigger=1;
900 fNSpecialSubTriggerOptions=1;
901 fSpecialSubTriggerName="7WUHJT";
903 case 6: // 8WUHJE - T0AND with jet in TRD
904 fSpecialSubTrigger=1;
905 fNSpecialSubTriggerOptions=1;
906 fSpecialSubTriggerName="8WUHJT";
908 case 7: // 7WUHQU - V0AND with dielectron pair in TRD
909 fSpecialSubTrigger=1;
910 fNSpecialSubTriggerOptions=1;
911 fSpecialSubTriggerName="7WUHQU";
913 case 8: // 8WUHQU - T0AND with dielectron pair in TRD
914 fSpecialSubTrigger=1;
915 fNSpecialSubTriggerOptions=1;
916 fSpecialSubTriggerName="8WUHQU";
919 AliError("Warning: Special Subtrigger Class Not known");
922 } else if (fSpecialTrigger == 5){ // Subdivision of kEMC trigger classes
923 switch(selectSpecialSubTriggerClass){
924 case 0: // all together
925 fSpecialSubTrigger=0;
926 fSpecialSubTriggerName="";
927 // AliInfo("Info: Nothing to be done");
929 case 1: // CEMC1 - V0OR and EMCAL fired
930 fOfflineTriggerMask=AliVEvent::kEMC1;
931 fSpecialTriggerName="AliVEvent::kEMC1";
932 fSpecialSubTrigger=1;
933 fNSpecialSubTriggerOptions=1;
934 fSpecialSubTriggerName="CEMC1";
936 case 2: // CEMC7 - V0AND and EMCAL fired
937 fSpecialSubTrigger=1;
938 fOfflineTriggerMask=AliVEvent::kEMC7;
939 fSpecialTriggerName="AliVEvent::kEMC7";
940 fNSpecialSubTriggerOptions=1;
941 fSpecialSubTriggerName="CEMC7";
943 case 3: // CEMC8 - T0OR and EMCAL fired
944 fOfflineTriggerMask=AliVEvent::kEMC8;
945 fSpecialTriggerName="AliVEvent::kEMC8";
946 fSpecialSubTrigger=1;
947 fNSpecialSubTriggerOptions=1;
948 fSpecialSubTriggerName="CEMC8";
951 AliError("Warning: Special Subtrigger Class Not known");
954 } else if (fSpecialTrigger == 6){ // Subdivision of kPHI trigger classes
955 switch(selectSpecialSubTriggerClass){
956 case 0: // all together
957 fSpecialSubTrigger=0;
958 fSpecialSubTriggerName="";
959 // AliInfo("Info: Nothing to be done");
961 case 1: // CEMC1 - V0OR and EMCAL fired
962 fOfflineTriggerMask=AliVEvent::kPHI1;
963 fSpecialTriggerName="AliVEvent::kPHI1";
964 fSpecialSubTrigger=1;
965 fNSpecialSubTriggerOptions=1;
966 fSpecialSubTriggerName="CPHI1";
968 case 2: // CEMC7 - V0AND and EMCAL fired
969 fSpecialSubTrigger=1;
970 fOfflineTriggerMask=AliVEvent::kPHI7;
971 fSpecialTriggerName="AliVEvent::kPHI7";
972 fNSpecialSubTriggerOptions=1;
973 fSpecialSubTriggerName="CPHI7";
975 case 3: // CEMC8 - T0OR and EMCAL fired
976 fOfflineTriggerMask=AliVEvent::kPHI8;
977 fSpecialTriggerName="AliVEvent::kPHI8";
978 fSpecialSubTrigger=1;
979 fNSpecialSubTriggerOptions=1;
980 fSpecialSubTriggerName="CPHI8";
983 AliError("Warning: Special Subtrigger Class Not known");
986 } else if (fSpecialTrigger == 7){ // Subdivision of kHighMult trigger classes
987 switch(selectSpecialSubTriggerClass){
988 case 0: // all together
989 fSpecialSubTrigger=0;
990 fSpecialSubTriggerName="";
991 // AliInfo("Info: Nothing to be done");
993 case 1: // CSHM1 - V0OR and high mult fired
994 fSpecialSubTrigger=1;
995 fNSpecialSubTriggerOptions=1;
996 fSpecialSubTriggerName="CSHM1";
998 case 2: // CSHM7 - V0AND and high mult fired
999 fSpecialSubTrigger=1;
1000 fNSpecialSubTriggerOptions=1;
1001 fSpecialSubTriggerName="CSHM7";
1003 case 3: // CSHM8 - T0OR and high mult fired
1004 fSpecialSubTrigger=1;
1005 fNSpecialSubTriggerOptions=1;
1006 fSpecialSubTriggerName="CSHM8";
1009 AliError("Warning: Special Subtrigger Class Not known");
1012 } else if (fSpecialTrigger == 8){ // Subdivision of kEMCEGA trigger classes
1013 switch(selectSpecialSubTriggerClass){
1014 case 0: // all together
1015 fSpecialSubTrigger=0;
1016 fSpecialSubTriggerName="";
1017 // AliInfo("Info: Nothing to be done");
1019 case 1: // 7EGA - CINT7 EGA
1020 fSpecialSubTrigger=1;
1021 fNSpecialSubTriggerOptions=1;
1022 fSpecialSubTriggerName="7EGA";
1024 case 2: // 8EGA - CINT8 EGA
1025 fSpecialSubTrigger=1;
1026 fNSpecialSubTriggerOptions=1;
1027 fSpecialSubTriggerName="8EGA";
1029 case 3: // 7EG1 - CINT7 EG1
1030 fSpecialSubTrigger=1;
1031 fNSpecialSubTriggerOptions=1;
1032 fSpecialSubTriggerName="7EG1";
1034 case 4: // 8EG1 - CINT8 EG1
1035 fSpecialSubTrigger=1;
1036 fNSpecialSubTriggerOptions=1;
1037 fSpecialSubTriggerName="8EG1";
1039 case 5: // 7EG2 - CINT7 EG2
1040 fSpecialSubTrigger=1;
1041 fNSpecialSubTriggerOptions=1;
1042 fSpecialSubTriggerName="7EG2";
1044 case 6: // 8EG2 - CINT8 EG2
1045 fSpecialSubTrigger=1;
1046 fNSpecialSubTriggerOptions=1;
1047 fSpecialSubTriggerName="8EG2";
1050 AliError("Warning: Special Subtrigger Class Not known");
1053 } else if (fSpecialTrigger == 9){ // Subdivision of kEMCEGA trigger classes
1054 switch(selectSpecialSubTriggerClass){
1055 case 0: // all together
1056 fSpecialSubTrigger=0;
1057 fSpecialSubTriggerName="";
1058 // AliInfo("Info: Nothing to be done");
1060 case 1: // 7EJE - CINT7 EJE
1061 fSpecialSubTrigger=1;
1062 fNSpecialSubTriggerOptions=1;
1063 fSpecialSubTriggerName="7EJE";
1065 case 2: // 8EJE - CINT8 EJE
1066 fSpecialSubTrigger=1;
1067 fNSpecialSubTriggerOptions=1;
1068 fSpecialSubTriggerName="8EJE";
1070 case 3: // 7EJ1 - CINT7 EJ1
1071 fSpecialSubTrigger=1;
1072 fNSpecialSubTriggerOptions=1;
1073 fSpecialSubTriggerName="7EJ1";
1075 case 4: // 8EJ1 - CINT8 EJ1
1076 fSpecialSubTrigger=1;
1077 fNSpecialSubTriggerOptions=1;
1078 fSpecialSubTriggerName="8EJ1";
1080 case 5: // 7EJ2 - CINT7 EJ2
1081 fSpecialSubTrigger=1;
1082 fNSpecialSubTriggerOptions=1;
1083 fSpecialSubTriggerName="7EJ2";
1085 case 6: // 8EJ2 - CINT8 EJ2
1086 fSpecialSubTrigger=1;
1087 fNSpecialSubTriggerOptions=1;
1088 fSpecialSubTriggerName="8EJ2";
1091 AliError("Warning: Special Subtrigger Class Not known");
1098 ///________________________________________________________________________
1099 Bool_t AliConvEventCuts::SetMultiplicityMethod(Int_t multiplicityMethod)
1102 fMultiplicityMethod=multiplicityMethod;
1104 // 0 Photon Multiplicity
1105 // 1 TPC Track multiplicity
1112 ///________________________________________________________________________
1113 Bool_t AliConvEventCuts::SetRemovePileUp(Int_t removePileUp)
1115 switch(removePileUp){
1117 fRemovePileUp=kFALSE;
1120 fRemovePileUp=kTRUE;
1123 AliError("RemovePileUpCut not defined");
1129 ///________________________________________________________________________
1130 Bool_t AliConvEventCuts::SetRejectExtraSignalsCut(Int_t extraSignal) {
1132 switch(extraSignal){
1134 fRejectExtraSignals = 0;
1135 break; // No Rejection
1137 fRejectExtraSignals = 1;
1138 break; // MinBias Header
1140 fRejectExtraSignals = 2;
1141 break; // User String Array
1143 fRejectExtraSignals = 3;
1144 break; // Rejection for Gamma Correction only
1146 AliError(Form("Extra Signal Rejection not defined %d",extraSignal));
1152 //-------------------------------------------------------------
1153 Double_t AliConvEventCuts::GetCentrality(AliVEvent *event)
1154 { // Get Event Centrality
1156 AliESDEvent *esdEvent=dynamic_cast<AliESDEvent*>(event);
1158 AliCentrality *fESDCentrality=(AliCentrality*)esdEvent->GetCentrality();
1159 if(fDetectorCentrality==0){
1160 if (fIsHeavyIon==2){
1161 return fESDCentrality->GetCentralityPercentile("V0A"); // default for pPb
1163 return fESDCentrality->GetCentralityPercentile("V0M"); // default
1166 if(fDetectorCentrality==1){
1167 return fESDCentrality->GetCentralityPercentile("CL1");
1171 AliAODEvent *aodEvent=dynamic_cast<AliAODEvent*>(event);
1173 if(aodEvent->GetHeader()){return aodEvent->GetHeader()->GetCentrality();}
1179 //_____________________________________________________________________________________
1180 Bool_t AliConvEventCuts::IsCentralitySelected(AliVEvent *event, AliVEvent *fMCEvent)
1181 { // Centrality Selection
1182 if(!fIsHeavyIon)return kTRUE;
1184 if(fCentralityMin == fCentralityMax ) return kTRUE;//0-100%
1185 else if(fCentralityMax==0) fCentralityMax=10; //CentralityRange = fCentralityMin-100%
1187 Double_t centrality=GetCentrality(event);
1188 if(centrality<0)return kFALSE;
1190 Int_t centralityC=0;
1191 if (fModCentralityClass == 0){
1192 centralityC= Int_t(centrality/10);
1193 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
1197 else if (fModCentralityClass ==1){
1198 centralityC= Int_t(centrality);
1199 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
1201 } else return kFALSE;
1203 else if (fModCentralityClass ==2){
1204 centralityC= Int_t(centrality);
1205 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
1210 Int_t nprimaryTracks = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetNumberOfPrimaryTracks();
1211 Int_t PrimaryTracks10[10][2] =
1224 Int_t PrimaryTracks5a[10][2] =
1237 Int_t PrimaryTracks5b[10][2] =
1251 if(event->IsA()==AliESDEvent::Class()) column = 0;
1252 if(event->IsA()==AliAODEvent::Class()) column = 1;
1254 if (fModCentralityClass == 3){
1256 if(nprimaryTracks > PrimaryTracks10[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks10[fCentralityMin][column])
1261 centralityC= Int_t(centrality/10);
1262 if(centralityC >= fCentralityMin && centralityC < fCentralityMax)
1267 else if (fModCentralityClass ==4){
1269 if(nprimaryTracks > PrimaryTracks5a[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5a[fCentralityMin][column])
1274 centralityC= Int_t(centrality);
1275 if(centralityC >= fCentralityMin*5 && centralityC < fCentralityMax*5){
1277 } else return kFALSE;
1280 else if (fModCentralityClass ==5){
1282 if(nprimaryTracks > PrimaryTracks5b[fCentralityMax][column] && nprimaryTracks <= PrimaryTracks5b[fCentralityMin][column])
1287 centralityC= Int_t(centrality);
1288 if(centralityC >= ((fCentralityMin*5)+45) && centralityC < ((fCentralityMax*5)+45))
1297 ///________________________________________________________________________
1298 Bool_t AliConvEventCuts::VertexZCut(AliVEvent *event){
1299 // Cut on z position of primary vertex
1300 Double_t fVertexZ=event->GetPrimaryVertex()->GetZ();
1301 Double_t fVertexZSPD = 0;
1302 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
1304 fVertexZSPD = fESDEvent->GetPrimaryVertexSPD()->GetZ();
1306 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
1308 fVertexZSPD = fAODEvent->GetPrimaryVertexSPD()->GetZ();
1311 if(abs(fVertexZ)>fMaxVertexZ)return kFALSE;
1313 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
1314 ->GetTask(fV0ReaderName.Data()))->GetPeriodName();
1315 if (periodName.CompareTo("LHC11h")==0){
1316 if (abs(fVertexZ-fVertexZSPD) > 0.1) return kFALSE;
1318 if (fIsHeavyIon == 2){
1319 if(fUtils->IsFirstEventInChunk(event)) return kFALSE;
1320 if(!fUtils->IsVertexSelected2013pA(event)) return kFALSE;
1321 if(fUtils->IsPileUpEvent(event)) return kFALSE;
1327 ///________________________________________________________________________
1328 Int_t AliConvEventCuts::GetNumberOfContributorsVtx(AliVEvent *event){
1329 // returns number of contributors to the vertex
1331 AliESDEvent *fESDEvent=dynamic_cast<AliESDEvent*>(event);
1333 if (fESDEvent->GetPrimaryVertex() != NULL){
1334 if(fESDEvent->GetPrimaryVertex()->GetNContributors()>0) {
1335 // cout << "accepted global" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertex()->GetNContributors() << endl;
1336 return fESDEvent->GetPrimaryVertex()->GetNContributors();
1340 if(fESDEvent->GetPrimaryVertexSPD() !=NULL){
1341 if(fESDEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
1342 // cout << "accepted SPD" << fESDEvent->GetEventNumberInFile() << " with NCont: " << fESDEvent->GetPrimaryVertexSPD()->GetNContributors() << endl;
1343 return fESDEvent->GetPrimaryVertexSPD()->GetNContributors();
1345 AliWarning(Form("Number of contributors from bad vertex type:: %s",fESDEvent->GetPrimaryVertex()->GetName()));
1346 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
1352 AliAODEvent *fAODEvent=dynamic_cast<AliAODEvent*>(event);
1354 if (fAODEvent->GetPrimaryVertex() != NULL){
1355 if(fAODEvent->GetPrimaryVertex()->GetNContributors()>0) {
1356 return fAODEvent->GetPrimaryVertex()->GetNContributors();
1359 if(fAODEvent->GetPrimaryVertexSPD() !=NULL){
1360 if(fAODEvent->GetPrimaryVertexSPD()->GetNContributors()>0) {
1361 return fAODEvent->GetPrimaryVertexSPD()->GetNContributors();
1363 AliWarning(Form("Number of contributors from bad vertex type:: %s",fAODEvent->GetPrimaryVertex()->GetName()));
1368 // cout << "rejected " << fESDEvent->GetEventNumberInFile() << endl;
1373 ///________________________________________________________________________
1374 Bool_t AliConvEventCuts::IsTriggerSelected(AliVEvent *fInputEvent)
1377 AliInputEventHandler *fInputHandler=(AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
1379 UInt_t isSelected = AliVEvent::kAny;
1380 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetPeriodName();
1381 // cout << periodName.Data() << endl;
1383 if (fInputHandler==NULL) return kFALSE;
1384 if( fInputHandler->GetEventSelection() || fInputEvent->IsA()==AliAODEvent::Class()) {
1386 TString firedTrigClass = fInputEvent->GetFiredTriggerClasses();
1387 if (!fTriggerSelectedManually){
1388 if (fPreSelCut) fOfflineTriggerMask = AliVEvent::kAny;
1390 if (fIsHeavyIon == 1) fOfflineTriggerMask = AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral;
1391 else if (fIsHeavyIon == 2) fOfflineTriggerMask = AliVEvent::kINT7;
1392 else if (periodName.CompareTo("LHC11c") == 0 || periodName.CompareTo("LHC11d") == 0 || periodName.CompareTo("LHC11e") == 0 || periodName.CompareTo("LHC11f") == 0 || periodName.CompareTo("LHC11g") == 0 || periodName.CompareTo("LHC12a") == 0 || periodName.CompareTo("LHC12b") == 0 || periodName.CompareTo("LHC12c") == 0 || periodName.CompareTo("LHC12d") == 0 || periodName.CompareTo("LHC12f") == 0 || periodName.CompareTo("LHC12g") == 0 || periodName.CompareTo("LHC12h") == 0 || periodName.CompareTo("LHC12i") == 0 ||periodName.CompareTo("LHC13g") == 0 ) {
1393 fOfflineTriggerMask = AliVEvent::kINT7;
1394 // cout << "will take kINT7 as trigger mask" << endl;
1396 else fOfflineTriggerMask = AliVEvent::kMB;
1399 // Get the actual offline trigger mask for the event and AND it with the
1400 // requested mask. If no mask requested select by default the event.
1401 // if (fPreSelCut) cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask for Precut: " << fOfflineTriggerMask << endl;
1402 // else cout << "Trigger selected from outside: "<< fTriggerSelectedManually <<"\t Offline Trigger mask: " << fOfflineTriggerMask << endl;
1404 if (fOfflineTriggerMask){
1405 isSelected = fOfflineTriggerMask & fInputHandler->IsEventSelected();
1406 if (isSelected && !fPreSelCut){
1407 if (fSpecialSubTrigger>0){
1408 if (!firedTrigClass.Contains(fSpecialSubTriggerName.Data())) isSelected = 0;
1413 fIsSDDFired = !(fInputHandler->IsEventSelected() & AliVEvent::kFastOnly);
1417 if (fIsSDDFired) hTriggerClass->Fill(33);
1418 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClass->Fill(0);
1419 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClass->Fill(1);
1420 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClass->Fill(2);
1421 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClass->Fill(3);
1422 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClass->Fill(4);
1423 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClass->Fill(5);
1424 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClass->Fill(6);
1425 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClass->Fill(6);
1426 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClass->Fill(7);
1427 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClass->Fill(7);
1428 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClass->Fill(8);
1429 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClass->Fill(8);
1430 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClass->Fill(9);
1431 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClass->Fill(9);
1432 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClass->Fill(10);
1433 // if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClass->Fill(10);
1434 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClass->Fill(11);
1435 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClass->Fill(12);
1436 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClass->Fill(13);
1437 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClass->Fill(13);
1438 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClass->Fill(13);
1439 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClass->Fill(14);
1440 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClass->Fill(15);
1441 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClass->Fill(16);
1442 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClass->Fill(17);
1443 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClass->Fill(18);
1444 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClass->Fill(19);
1445 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClass->Fill(20);
1446 // if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClass->Fill(20);
1447 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClass->Fill(21);
1448 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClass->Fill(22);
1449 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClass->Fill(23);
1450 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClass->Fill(24);
1451 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClass->Fill(25);
1452 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClass->Fill(26);
1453 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClass->Fill(27);
1454 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClass->Fill(28);
1455 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClass->Fill(29);
1456 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClass->Fill(30);
1457 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClass->Fill(31);
1458 if (!fInputHandler->IsEventSelected()) hTriggerClass->Fill(34);
1461 if(hTriggerClassSelected && isSelected){
1462 if (!fIsSDDFired) hTriggerClassSelected->Fill(33);
1463 if (fInputHandler->IsEventSelected() & AliVEvent::kMB)hTriggerClassSelected->Fill(0);
1464 if (fInputHandler->IsEventSelected() & AliVEvent::kINT7)hTriggerClassSelected->Fill(1);
1465 if (fInputHandler->IsEventSelected() & AliVEvent::kMUON)hTriggerClassSelected->Fill(2);
1466 if (fInputHandler->IsEventSelected() & AliVEvent::kHighMult)hTriggerClassSelected->Fill(3);
1467 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC1)hTriggerClassSelected->Fill(4);
1468 if (fInputHandler->IsEventSelected() & AliVEvent::kCINT5)hTriggerClassSelected->Fill(5);
1469 if (fInputHandler->IsEventSelected() & AliVEvent::kCMUS5)hTriggerClassSelected->Fill(6);
1470 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSPB)hTriggerClassSelected->Fill(6);
1471 if (fInputHandler->IsEventSelected() & AliVEvent::kMUSH7)hTriggerClassSelected->Fill(7);
1472 // if (fInputHandler->IsEventSelected() & AliVEvent::kMUSHPB)hTriggerClassSelected->Fill(7);
1473 if (fInputHandler->IsEventSelected() & AliVEvent::kMUL7)hTriggerClassSelected->Fill(8);
1474 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikePB)hTriggerClassSelected->Fill(8);
1475 if (fInputHandler->IsEventSelected() & AliVEvent::kMUU7)hTriggerClassSelected->Fill(9);
1476 // if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikePB)hTriggerClassSelected->Fill(9);
1477 if (fInputHandler->IsEventSelected() & AliVEvent::kEMC7)hTriggerClassSelected->Fill(10);
1478 // if (fInputHandler->IsEventSelected() & AliVEvent::kEMC8)hTriggerClassSelected->Fill(10);
1479 if (fInputHandler->IsEventSelected() & AliVEvent::kMUS7)hTriggerClassSelected->Fill(11);
1480 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI1)hTriggerClassSelected->Fill(12);
1481 if (fInputHandler->IsEventSelected() & AliVEvent::kPHI7)hTriggerClassSelected->Fill(13);
1482 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHI8)hTriggerClassSelected->Fill(13);
1483 // if (fInputHandler->IsEventSelected() & AliVEvent::kPHOSPb)hTriggerClassSelected->Fill(13);
1484 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEJE)hTriggerClassSelected->Fill(14);
1485 if (fInputHandler->IsEventSelected() & AliVEvent::kEMCEGA)hTriggerClassSelected->Fill(15);
1486 if (fInputHandler->IsEventSelected() & AliVEvent::kCentral)hTriggerClassSelected->Fill(16);
1487 if (fInputHandler->IsEventSelected() & AliVEvent::kSemiCentral)hTriggerClassSelected->Fill(17);
1488 if (fInputHandler->IsEventSelected() & AliVEvent::kDG5)hTriggerClassSelected->Fill(18);
1489 if (fInputHandler->IsEventSelected() & AliVEvent::kZED)hTriggerClassSelected->Fill(19);
1490 if (fInputHandler->IsEventSelected() & AliVEvent::kSPI7)hTriggerClassSelected->Fill(20);
1491 // if (fInputHandler->IsEventSelected() & AliVEvent::kSPI)hTriggerClassSelected->Fill(20);
1492 if (fInputHandler->IsEventSelected() & AliVEvent::kINT8)hTriggerClassSelected->Fill(21);
1493 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleLowPt8)hTriggerClassSelected->Fill(22);
1494 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonSingleHighPt8)hTriggerClassSelected->Fill(23);
1495 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonLikeLowPt8)hTriggerClassSelected->Fill(24);
1496 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt8)hTriggerClassSelected->Fill(25);
1497 if (fInputHandler->IsEventSelected() & AliVEvent::kMuonUnlikeLowPt0)hTriggerClassSelected->Fill(26);
1498 if (fInputHandler->IsEventSelected() & AliVEvent::kUserDefined)hTriggerClassSelected->Fill(27);
1499 if (fInputHandler->IsEventSelected() & AliVEvent::kTRD)hTriggerClassSelected->Fill(28);
1500 if (fInputHandler->IsEventSelected() & AliVEvent::kFastOnly)hTriggerClassSelected->Fill(29);
1501 if (fInputHandler->IsEventSelected() & AliVEvent::kAnyINT)hTriggerClassSelected->Fill(30);
1502 if (fInputHandler->IsEventSelected() & AliVEvent::kAny)hTriggerClassSelected->Fill(31);
1505 if(!isSelected)return kFALSE;
1510 ///________________________________________________________________________
1511 TString AliConvEventCuts::GetCutNumber(){
1512 // returns TString with current cut number
1514 for(Int_t ii=0;ii<kNCuts;ii++){
1515 a.Append(Form("%d",fCuts[ii]));
1520 ///________________________________________________________________________
1521 void AliConvEventCuts::GetNotRejectedParticles(Int_t rejection, TList *HeaderList, AliVEvent *MCEvent){
1523 TString periodName = ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()->GetTask(fV0ReaderName.Data()))->GetPeriodName();
1526 if(fNotRejectedStart){
1527 delete[] fNotRejectedStart;
1528 fNotRejectedStart = NULL;
1530 if(fNotRejectedEnd){
1531 delete[] fNotRejectedEnd;
1532 fNotRejectedEnd = NULL;
1534 if(fGeneratorNames){
1535 delete[] fGeneratorNames;
1536 fGeneratorNames = NULL;
1539 if(rejection == 0) return; // No Rejection
1541 AliGenCocktailEventHeader *cHeader = 0x0;
1542 AliAODMCHeader *cHeaderAOD = 0x0;
1543 Bool_t headerFound = kFALSE;
1544 AliStack *fMCStack = 0x0;
1545 TClonesArray *fMCStackAOD = 0x0;
1546 if(MCEvent->IsA()==AliMCEvent::Class()){
1547 cHeader = dynamic_cast<AliGenCocktailEventHeader*>(dynamic_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
1548 if(cHeader) headerFound = kTRUE;
1549 if(dynamic_cast<AliMCEvent*>(MCEvent))fMCStack = dynamic_cast<AliStack*>(dynamic_cast<AliMCEvent*>(MCEvent)->Stack());
1551 if(MCEvent->IsA()==AliAODEvent::Class()){ // MCEvent is a AODEvent in case of AOD
1552 cHeaderAOD = dynamic_cast<AliAODMCHeader*>(MCEvent->FindListObject(AliAODMCHeader::StdBranchName()));
1553 fMCStackAOD = dynamic_cast<TClonesArray*>(MCEvent->FindListObject(AliAODMCParticle::StdBranchName()));
1556 if(cHeaderAOD) headerFound = kTRUE;
1560 TList *genHeaders = 0x0;
1561 if(cHeader) genHeaders = cHeader->GetHeaders();
1563 genHeaders = cHeaderAOD->GetCocktailHeaders();
1564 if(genHeaders->GetEntries()==1){
1565 SetRejectExtraSignalsCut(0);
1569 AliGenEventHeader* gh = 0;
1571 Int_t firstindexA = 0;
1572 Int_t lastindexA = -1;
1573 if(rejection == 1 || rejection == 3) fnHeaders = 1; // MinBiasHeader
1574 if(rejection == 2){ // TList of Headers Names
1575 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
1576 gh = (AliGenEventHeader*)genHeaders->At(i);
1577 TString GeneratorName = gh->GetName();
1578 lastindexA = lastindexA + gh->NProduced();
1579 // cout << i << "\t" << GeneratorName.Data() << endl;
1580 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
1581 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
1582 // cout << GeneratorInList.Data() << endl;
1583 if(GeneratorName.CompareTo(GeneratorInList) == 0){
1584 // cout << "accepted" << endl;
1585 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
1587 if (fMCStack->Particle(firstindexA)->GetPdgCode() == fAddedSignalPDGCode ) {
1588 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
1589 if (gh->NProduced() > 10 && fMCStack->Particle(firstindexA+10)->GetPdgCode() == fAddedSignalPDGCode ){
1590 // cout << "cond 1: "<< fnHeaders << endl;
1596 // cout << "cond 2: " << fnHeaders << endl;
1603 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA));
1604 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
1605 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
1606 if (gh->NProduced() > 10){
1607 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindexA+10));
1608 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
1609 // cout << "cond 1: " << fnHeaders << endl;
1616 // cout << "cond 2: " << fnHeaders << endl;
1624 // cout << "cond 3: "<< fnHeaders << endl;
1629 firstindexA = firstindexA + gh->NProduced();
1632 // cout << "number of headers: " <<fnHeaders << endl;
1634 fNotRejectedStart = new Int_t[fnHeaders];
1635 fNotRejectedEnd = new Int_t[fnHeaders];
1636 fGeneratorNames = new TString[fnHeaders];
1638 if(rejection == 1 || rejection == 3){
1639 fNotRejectedStart[0] = 0;
1640 fNotRejectedEnd[0] = ((AliGenEventHeader*)genHeaders->At(0))->NProduced()-1;
1641 fGeneratorNames[0] = ((AliGenEventHeader*)genHeaders->At(0))->GetName();
1645 Int_t firstindex = 0;
1646 Int_t lastindex = -1;
1649 for(Int_t i = 0; i<genHeaders->GetEntries();i++){
1650 gh = (AliGenEventHeader*)genHeaders->At(i);
1651 TString GeneratorName = gh->GetName();
1652 lastindex = lastindex + gh->NProduced();
1653 for(Int_t j = 0; j<HeaderList->GetEntries();j++){
1654 TString GeneratorInList = ((TObjString*)HeaderList->At(j))->GetString();
1655 // cout << i << "\t" << GeneratorName.Data() << endl;
1656 if(GeneratorName.CompareTo(GeneratorInList) == 0){
1657 if (GeneratorInList.CompareTo("PARAM") == 0 || GeneratorInList.CompareTo("BOX") == 0 ){
1659 if (fMCStack->Particle(firstindex)->GetPdgCode() == fAddedSignalPDGCode ) {
1660 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
1661 // cout << "produced " << gh->NProduced() << " with box generator" << endl;
1662 if (gh->NProduced() > 10 && fMCStack->Particle(firstindex+10)->GetPdgCode() == fAddedSignalPDGCode){
1663 // cout << "one of them was a pi0 or eta" << endl;
1664 fNotRejectedStart[number] = firstindex;
1665 fNotRejectedEnd[number] = lastindex;
1666 fGeneratorNames[number] = GeneratorName;
1668 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
1672 fNotRejectedStart[number] = firstindex;
1673 fNotRejectedEnd[number] = lastindex;
1674 fGeneratorNames[number] = GeneratorName;
1681 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex));
1682 if ( aodMCParticle->GetPdgCode() == fAddedSignalPDGCode ){
1683 if (periodName.CompareTo("LHC14a1b")==0 || periodName.CompareTo("LHC14a1c")==0 ){
1684 if (gh->NProduced() > 10) {
1685 AliAODMCParticle *aodMCParticle2 = static_cast<AliAODMCParticle*>(fMCStackAOD->At(firstindex+10));
1686 if ( aodMCParticle2->GetPdgCode() == fAddedSignalPDGCode ){
1687 fNotRejectedEnd[number] = lastindex;
1688 fNotRejectedStart[number] = firstindex;
1689 fGeneratorNames[number] = GeneratorName;
1695 fNotRejectedStart[number] = firstindex;
1696 fNotRejectedEnd[number] = lastindex;
1697 fGeneratorNames[number] = GeneratorName;
1705 fNotRejectedStart[number] = firstindex;
1706 fNotRejectedEnd[number] = lastindex;
1707 fGeneratorNames[number] = GeneratorName;
1708 // cout << "Number of particles produced for: " << i << "\t" << GeneratorName.Data() << "\t" << lastindex-firstindex+1 << endl;
1715 firstindex = firstindex + gh->NProduced();
1717 // for (Int_t i = 0; i < number; i++){
1718 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
1721 } else { // No Cocktail Header Found
1722 fNotRejectedStart = new Int_t[1];
1723 fNotRejectedEnd = new Int_t[1];
1726 fNotRejectedStart[0] = 0;
1727 fNotRejectedEnd[0] = static_cast<AliMCEvent*>(MCEvent)->Stack()->GetNprimary()-1;
1728 fGeneratorNames = new TString[1];
1729 fGeneratorNames[0] = "NoCocktailGeneratorFound";
1731 AliGenPythiaEventHeader *mcHeaderPythia = dynamic_cast<AliGenPythiaEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
1732 if (mcHeaderPythia) fGeneratorNames[0] = "NoCocktailGeneratorFound_Pythia";
1733 AliGenDPMjetEventHeader *mcHeaderPhojet = dynamic_cast<AliGenDPMjetEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
1734 if (mcHeaderPhojet) fGeneratorNames[0] = "NoCocktailGeneratorFound_Phojet";
1735 AliGenHijingEventHeader *mcHeaderHijing = dynamic_cast<AliGenHijingEventHeader*>(static_cast<AliMCEvent*>(MCEvent)->GenEventHeader());
1736 if (mcHeaderHijing) fGeneratorNames[0] = "NoCocktailGeneratorFound_Hijing";
1738 SetRejectExtraSignalsCut(0);
1743 //_________________________________________________________________________
1744 Int_t AliConvEventCuts::IsParticleFromBGEvent(Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
1746 // Not Accepted == kFALSE == 0
1747 // Accepted == kTRUE == 1
1748 // FirstHeader == kTRUE == 3
1749 if(index < 0) return 0; // No Particle
1751 // if (index == 100){
1752 // cout << "possible headers" << endl;
1753 // for(Int_t i = 0;i<fnHeaders;i++){
1754 // cout << i << "\t" <<fGeneratorNames[i] << "\t" << fNotRejectedStart[i] << "\t" <<fNotRejectedEnd[i] << endl;
1758 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
1759 if( index >= MCStack->GetNprimary()){ // Secondary Particle
1760 if( ((TParticle*)MCStack->Particle(index))->GetMother(0) < 0) return 1; // Secondary Particle without Mother??
1761 return IsParticleFromBGEvent(((TParticle*)MCStack->Particle(index))->GetMother(0),MCStack,InputEvent);
1763 for(Int_t i = 0;i<fnHeaders;i++){
1764 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
1766 if(i == 0) accepted = 2; // MB Header
1770 else if(InputEvent->IsA()==AliAODEvent::Class()){
1771 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
1772 if (AODMCTrackArray){
1773 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
1774 if(!aodMCParticle) return 1; // Photon Without a Mother ? --> Accepted
1775 if(!aodMCParticle->IsPrimary()){
1776 if( aodMCParticle->GetMother() < 0) return 1;// Secondary Particle without Mother??
1777 return IsParticleFromBGEvent(aodMCParticle->GetMother(),MCStack,InputEvent);
1779 index = abs(static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index))->GetLabel());
1780 for(Int_t i = 0;i<fnHeaders;i++){
1781 if(index >= fNotRejectedStart[i] && index <= fNotRejectedEnd[i]){
1783 if(i == 0) accepted = 2; // MB Header
1792 //_________________________________________________________________________
1793 Int_t AliConvEventCuts::IsEventAcceptedByCut(AliConvEventCuts *ReaderCuts, AliVEvent *InputEvent, AliMCEvent *MCEvent, Int_t isHeavyIon){
1795 if ( !IsTriggerSelected(InputEvent) )
1798 if(isHeavyIon != 0 && !(IsCentralitySelected(InputEvent,MCEvent)))
1799 return 1; // Check Centrality --> Not Accepted => eventQuality = 1
1801 if(isHeavyIon == 0 && GetIsFromPileup()){
1802 if(InputEvent->IsPileupFromSPD(3,0.8,3.,2.,5.)){
1803 return 6; // Check Pileup --> Not Accepted => eventQuality = 6
1807 Bool_t hasV0And = ReaderCuts->HasV0AND();
1808 Bool_t isSDDFired = ReaderCuts->IsSDDFired();
1809 if( (IsSpecialTrigger() == 2 || IsSpecialTrigger() == 3) && !isSDDFired && !MCEvent)
1810 return 7; // With SDD requested but no fired
1812 if( (IsSpecialTrigger() == 1 || IsSpecialTrigger() == 3) && !hasV0And)
1813 return 8; // V0AND requested but no fired
1815 if(hCentrality)hCentrality->Fill(GetCentrality(InputEvent));
1816 if(hCentralityVsNumberOfPrimaryTracks)
1817 hCentralityVsNumberOfPrimaryTracks->Fill(GetCentrality(InputEvent),
1818 ((AliV0ReaderV1*)AliAnalysisManager::GetAnalysisManager()
1819 ->GetTask(fV0ReaderName.Data()))->GetNumberOfPrimaryTracks());
1824 //_________________________________________________________________________
1825 Float_t AliConvEventCuts::GetWeightForMeson(TString period, Int_t index, AliStack *MCStack, AliVEvent *InputEvent){
1826 if (!(period.CompareTo("LHC12f1a") == 0 || period.CompareTo("LHC12f1b") == 0 || period.CompareTo("LHC12i3") == 0 || period.CompareTo("LHC11a10a") == 0 || period.CompareTo("LHC11a10b") == 0 || period.CompareTo("LHC11a10b_bis") == 0 || period.CompareTo("LHC11a10a_bis") == 0 || period.CompareTo("LHC11a10b_plus") == 0 || period.Contains("LHC13d2")|| period.Contains("LHC14a1") ||
1827 period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.CompareTo("LHC14b2") == 0 )) return 1.;
1830 for (Int_t i = 0; i < fnHeaders; i++){
1831 if (index >= fNotRejectedStart[i] && index < fNotRejectedEnd[i]+1){
1832 if (fGeneratorNames[i].CompareTo("Pythia") == 0){
1834 } else if (fGeneratorNames[i].CompareTo("DPMJET") == 0){
1836 } else if (fGeneratorNames[i].CompareTo("HIJING") == 0 ||
1837 fGeneratorNames[i].CompareTo("Hijing") == 0 ||
1838 fGeneratorNames[i].Contains("hijing")){
1840 } else if (fGeneratorNames[i].CompareTo("BOX") == 0){
1842 } else if (fGeneratorNames[i].CompareTo("PARAM") == 0){
1844 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound") == 0){
1846 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Pythia") == 0){
1848 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Phojet") == 0){
1850 } else if (fGeneratorNames[i].CompareTo("NoCocktailGeneratorFound_Hijing") == 0){
1853 if (period.Contains("LHC13d2") || period.CompareTo("LHC13e7") == 0 || period.Contains("LHC13b2_efix") || period.Contains("LHC14a1") || period.CompareTo("LHC14b2") == 0 ){
1858 if (kCaseGen == 0) return 1;
1861 Double_t mesonPt = 0;
1862 Double_t mesonMass = 0;
1864 if(!InputEvent || InputEvent->IsA()==AliESDEvent::Class()){
1865 mesonPt = ((TParticle*)MCStack->Particle(index))->Pt();
1866 mesonMass = ((TParticle*)MCStack->Particle(index))->GetCalcMass();
1867 PDGCode = ((TParticle*)MCStack->Particle(index))->GetPdgCode();
1869 else if(InputEvent->IsA()==AliAODEvent::Class()){
1870 TClonesArray *AODMCTrackArray = dynamic_cast<TClonesArray*>(InputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
1871 if (AODMCTrackArray){
1872 AliAODMCParticle *aodMCParticle = static_cast<AliAODMCParticle*>(AODMCTrackArray->At(index));
1873 mesonPt = aodMCParticle->Pt();
1874 mesonMass = aodMCParticle->GetCalcMass();
1875 PDGCode = aodMCParticle->GetPdgCode();
1881 Float_t functionResultMC = 1.;
1882 if (kCaseGen == 1){ // Pythia 6
1883 Float_t dNdyMC = 2.1462;
1884 Float_t nMC = 7.06055;
1885 Float_t tMC = 0.12533;
1886 if ( PDGCode == 111){
1890 } else if ( PDGCode == 221){
1895 functionResultMC = dNdyMC / ( 2 * TMath::Pi())*(nMC-1.)*(nMC-2.) / (nMC*tMC*(nMC*tMC+mesonMass*(nMC-2.))) * TMath::Power(1.+(TMath::Sqrt(mesonPt*mesonPt+mesonMass*mesonMass)-mesonMass)/(nMC*tMC), -nMC);
1896 } else if (kCaseGen == 2){ // Phojet
1897 Float_t dNdyMC = 2.35978;
1898 Float_t nMC = 6.81795;
1899 Float_t tMC = 0.11492;
1900 if ( PDGCode == 111){
1904 } else if ( PDGCode == 221){
1909 functionResultMC = dNdyMC / ( 2 * TMath::Pi())*(nMC-1.)*(nMC-2.) / (nMC*tMC*(nMC*tMC+mesonMass*(nMC-2.))) * TMath::Power(1.+(TMath::Sqrt(mesonPt*mesonPt+mesonMass*mesonMass)-mesonMass)/(nMC*tMC), -nMC);
1910 } else if (kCaseGen == 4){ // BOX generators pp
1911 // functionResultMC = 1./sqrt(1.-mesonMass*mesonMass/((mesonMass*mesonMass+mesonPt*mesonPt)*cosh(mesonY)*cosh(mesonY)));
1912 Float_t a = 0.23437;
1914 Float_t c = -1430.5863;
1915 Float_t d = -0.6966624;
1916 Float_t e = 252.3742;
1917 if ( PDGCode == 111){
1923 } else if ( PDGCode == 221){
1930 functionResultMC = a*TMath::Power(mesonPt,-1.*(b+c/(TMath::Power(mesonPt,d)+e)))*1./mesonPt *1./1.6 *1./(2.* TMath::Pi());
1931 // cout << functionResultMC << endl;
1932 } else if (kCaseGen == 3 ){ // HIJING
1933 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0){
1934 functionResultMC = hReweightMCHistPi0->Interpolate(mesonPt);
1936 if ( PDGCode == 221 && fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0){
1937 functionResultMC = hReweightMCHistEta->Interpolate(mesonPt);
1939 if ( PDGCode == 310 && fDoReweightHistoMCK0s && hReweightMCHistK0s!= 0x0){
1940 functionResultMC = hReweightMCHistK0s->Interpolate(mesonPt);
1944 Float_t functionResultData = 1;
1945 if (kCaseGen == 1 || kCaseGen == 2 || kCaseGen == 4 ){
1946 Float_t dNdyData = 2.2328;
1947 Float_t nData = 7.1473;
1948 Float_t tData = 0.1346;
1949 if ( PDGCode == 111){
1953 } else if ( PDGCode == 221){
1954 dNdyData = 0.38992; //be careful this fit is not optimal, eta in data still has problems
1958 functionResultData = dNdyData / ( 2 * TMath::Pi())*(nData-1.)*(nData-2.) / (nData*tData*(nData*tData+mesonMass*(nData-2.))) * TMath::Power(1.+(TMath::Sqrt(mesonPt*mesonPt+mesonMass*mesonMass)-mesonMass)/(nData*tData), -nData);
1959 // cout << functionResultData << endl;
1961 if ( PDGCode == 111 && fDoReweightHistoMCPi0 && fFitDataPi0!= 0x0){
1962 functionResultData = fFitDataPi0->Eval(mesonPt);
1964 if ( PDGCode == 221 && fDoReweightHistoMCEta && fFitDataEta!= 0x0){
1965 functionResultData = fFitDataEta->Eval(mesonPt);
1967 if ( PDGCode == 310 && fDoReweightHistoMCK0s && fFitDataK0s!= 0x0){
1968 functionResultData = fFitDataK0s->Eval(mesonPt);
1973 Double_t weight = 1;
1974 if (PDGCode == 111 || PDGCode == 221){
1975 if (functionResultData != 0. && functionResultMC != 0. && isfinite(functionResultData) && isfinite(functionResultMC)){
1976 weight = functionResultData/functionResultMC;
1977 if ( kCaseGen == 3){
1978 if (PDGCode == 111){
1979 if (!(fDoReweightHistoMCPi0 && hReweightMCHistPi0!= 0x0 && PDGCode == 111)){
1983 if (PDGCode == 221){
1984 if (!(fDoReweightHistoMCEta && hReweightMCHistEta!= 0x0 && PDGCode == 221)){
1989 if (!isfinite(functionResultData)) weight = 1.;
1990 if (!isfinite(weight)) weight = 1.;
1992 } else if (PDGCode == 310 && functionResultMC != 0 && isfinite(functionResultMC)){
1993 weight = functionResultMC;
1996 // if (fModCentralityClass == 0 && fCentralityMin == 4 && fCentralityMax == 6 && PDGCode == 111){
1997 // cout << period.Data() << "\t" << kCaseGen << "\t" <<fModCentralityClass<< "\t" <<fCentralityMin<< "\t" <<fCentralityMax << "\t" << mesonPt << "\t" <<mesonMass<< "\t"<<functionResultData << "\t"<< functionResultMC << "\t" << weight <<endl;
2003 ///________________________________________________________________________
2004 void AliConvEventCuts::GetCorrectEtaShiftFromPeriod(TString periodName){
2006 if(periodName.CompareTo("LHC12g") == 0 || //pilot run 2012
2007 periodName.CompareTo("LHC13b") == 0 || //mainly minimum bias
2008 periodName.CompareTo("LHC13c") == 0 || //mainly minimum bias
2009 periodName.CompareTo("LHC13d") == 0 || //mainly triggered
2010 periodName.CompareTo("LHC13e") == 0 || //mainly triggered
2011 periodName.CompareTo("LHC13c3") == 0 || //MC Starlight, anchor LHC13d+e
2012 periodName.CompareTo("LHC13c2") == 0 || //MC Starlight, coherent J/Psi, UPC muon anchor LHC13d+e
2013 periodName.CompareTo("LHC13b4") == 0 || //MC Pythia 6 (Jet-Jet), anchor LHC13b
2014 periodName.CompareTo("LHC13b2_fix_1") == 0 || //MC DPMJET, anchr LHC13b+c
2015 periodName.CompareTo("LHC13b2_efix_p1") == 0 || //MC DPMJET, anchr LHC13b+c
2016 periodName.CompareTo("LHC13b2_efix_p2") == 0 || //MC DPMJET, anchr LHC13b+c
2017 periodName.CompareTo("LHC13b2_efix_p3") == 0 || //MC DPMJET, anchr LHC13b+c
2018 periodName.CompareTo("LHC13b2_efix_p4") == 0 || //MC DPMJET, anchr LHC13b+c
2019 periodName.CompareTo("LHC13e7") == 0 || //MC DPMJET, anchr LHC13b+c
2020 periodName.CompareTo("LHC13b3") == 0 || //MC HIJING, weighted to number of events per run, anchor LHC13b
2021 periodName.CompareTo("LHC13b2") == 0 || // MC DPMJET, wrong energy, anchor LHC13b
2022 periodName.CompareTo("LHC13b2_plus") == 0 || // MC DPMJET, weighted to number event per run, anchor LHC13b
2023 periodName.CompareTo("LHC13c1_bis") == 0 || // MC AMPT fast generation, pT hardbin, anchor ?
2024 periodName.CompareTo("LHC13c1") == 0 || // MC AMPT fast generation, anchor ?
2025 periodName.CompareTo("LHC13b1") == 0 || // MC DPMJET, fragments, with fixed label 0, anchor LHC12g
2026 periodName.CompareTo("LHC12g4b_fix") == 0 || // MC DPMJET, with fixed label 0, anchor LHC12g
2027 periodName.CompareTo("LHC12g1_fix") == 0 || // MC ?, with fixed label 0, anchor LHC12g
2028 periodName.CompareTo("LHC12g4c") == 0 || // MC DPMJET, shifted vertex runs, anchor LHC12g
2029 periodName.CompareTo("LHC12h6") == 0 || // MC muon cocktail, anchor LHC12g
2030 periodName.CompareTo("LHC12g4b") == 0 || // MC DPMJET 3rd iteration, anchor LHC12g
2031 periodName.CompareTo("LHC12g4a") == 0 || // MC DPMJET improved, anchor LHC12g
2032 periodName.CompareTo("LHC12g4") == 0 || // MC DPMJET, anchor LHC12g
2033 periodName.CompareTo("LHC12g5") == 0 || // MC PHOJET, anchor LHC12g
2034 periodName.CompareTo("LHC12g2") == 0 || // MC Starlight background, anchor LHC12g
2035 periodName.CompareTo("LHC12g1") == 0 ) // MC ?, anchor LHC12g
2037 printf(" Gamma Conversion Cuts %s :: pPb Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),-0.465);
2038 SetEtaShift(-0.465);
2040 else if(periodName.CompareTo("LHC13f") == 0 ||
2041 periodName.CompareTo("LHC13c6b") == 0 ||// MC Jpsi -> mumu, anchor LHC13f
2042 periodName.CompareTo("LHC13c5") == 0 || //MC Starlight, gamma gamma UPC muon, anchor LHC13f
2043 periodName.CompareTo("LHC13c4") == 0 )//MC Starlight, coherent JPsi, UPC muon, anchor LHC13f
2045 printf(" Gamma Conversion Cuts %s :: Pbp Run doing Eta Shift of %f \n\n",(GetCutNumber()).Data(),0.465);
2046 SetEtaShift(+0.465);
2048 else printf(" Gamma Conversion Cuts %s :: Automatic Eta Shift requested but Period is not known -> No Shift \n\n",(GetCutNumber()).Data());