1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 // Filling an AliCFContainer with the quantities pt, eta and phi
18 // for tracks which survivied the particle cuts (MC resp. ESD tracks)
19 // Track selection is done using the AliHFE package
22 // Raphaelle Bailhache <R.Bailhache@gsi.de>
23 // Markus Fasel <M.Fasel@gsi.de>
24 // Matus Kalisky <matus.kalisky@cern.ch>
25 // MinJung Kweon <minjung@physi.uni-heidelberg.de>
31 #include <TDirectory.h>
34 #include <TIterator.h>
38 #include <TObjArray.h>
39 #include <TObjString.h>
40 #include <TParticle.h>
46 #include "AliESDtrackCuts.h"
47 #include "AliAnalysisManager.h"
48 #include "AliAnalysisUtils.h"
49 #include "AliAODInputHandler.h"
50 #include "AliAODMCParticle.h"
51 #include "AliAODTrack.h"
52 #include "AliAODVertex.h"
53 #include "AliCentrality.h"
54 #include "AliCFContainer.h"
55 #include "AliCFManager.h"
56 #include "AliESDEvent.h"
57 #include "AliESDInputHandler.h"
58 #include "AliESDtrack.h"
60 #include "AliMCEvent.h"
61 #include "AliMCEventHandler.h"
62 #include "AliMCParticle.h"
63 #include "AliMultiplicity.h"
65 #include "AliPIDResponse.h"
66 #include "AliOADBContainer.h"
68 #include "AliTriggerAnalysis.h"
69 #include "AliTRDTriggerAnalysis.h"
70 #include "AliVVertex.h"
72 #include "AliHFEcollection.h"
73 #include "AliHFEcontainer.h"
74 #include "AliHFEcuts.h"
75 #include "AliHFEelecbackground.h"
76 #include "AliHFENonPhotonicElectron.h"
77 #include "AliHFEmcQA.h"
78 #include "AliHFEpairs.h"
79 #include "AliHFEpid.h"
80 #include "AliHFEpidQAmanager.h"
81 #include "AliHFEsecVtxs.h"
82 #include "AliHFEsecVtx.h"
83 #include "AliHFEsignalCuts.h"
84 #include "AliHFEtaggedTrackAnalysis.h"
85 #include "AliHFEtools.h"
86 #include "AliHFEV0taginfo.h"
87 #include "AliHFEvarManager.h"
88 #include "AliAnalysisTaskHFE.h"
89 #include "AliAODMCHeader.h"
90 #include "TClonesArray.h"
92 ClassImp(AliAnalysisTaskHFE)
94 //____________________________________________________________
95 AliAnalysisTaskHFE::AliAnalysisTaskHFE():
96 AliAnalysisTaskSE("PID efficiency Analysis")
98 , fAODArrayMCInfo(NULL)
101 , fCollisionSystem(3)
102 , fFillSignalOnly(kTRUE)
103 , fRejectMCFakeTracks(kFALSE)
104 , fFillNoCuts(kFALSE)
105 , fBackGroundFactorApply(kFALSE)
106 , fRemovePileUp(kFALSE)
107 , fIdentifiedAsPileUp(kFALSE)
108 , fIdentifiedAsOutInz(kFALSE)
109 , fPassTheEventCut(kFALSE)
110 , fRejectKinkMother(kTRUE)
111 , fisppMultiBin(kFALSE)
112 , fPbPbUserCentralityBinning(kFALSE)
113 , fRemoveFirstEvent(kFALSE)
114 , fisNonHFEsystematics(kFALSE)
115 , fSpecialTrigger(NULL)
117 , fCentralityPercent(-1)
118 , fCentralityEstimator("V0M")
120 , fWeightBackGround(0.)
126 , fTriggerAnalysis(NULL)
129 , fTRDTriggerAnalysis(NULL)
130 , fPIDpreselect(NULL)
132 , fTaggedTrackCuts(NULL)
133 , fCleanTaggedTrack(kFALSE)
134 , fVariablesTRDTaggedTrack(kFALSE)
135 , fAnalysisUtils(NULL)
136 , fCutspreselect(NULL)
138 , fElecBackGround(NULL)
140 , fTaggedTrackAnalysis(NULL)
142 , fBackgroundSubtraction(NULL)
143 , fTRDTrigger(kFALSE)
144 , fWhichTRDTrigger(0)
150 , fHistELECBACKGROUND(NULL)
151 , fQACollection(NULL)
156 memset(fElecBackgroundFactor, 0, sizeof(Double_t) * kElecBgSpecies * kBgPtBins * kCentBins * kBgLevels);
157 memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);
158 memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));
159 memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));
160 memset(fCentralityLimits, 0, sizeof(Float_t) * 12);
165 //____________________________________________________________
166 AliAnalysisTaskHFE::AliAnalysisTaskHFE(const char * name):
167 AliAnalysisTaskSE(name)
169 , fAODArrayMCInfo(NULL)
172 , fCollisionSystem(3)
173 , fFillSignalOnly(kTRUE)
174 , fRejectMCFakeTracks(kFALSE)
175 , fFillNoCuts(kFALSE)
176 , fBackGroundFactorApply(kFALSE)
177 , fRemovePileUp(kFALSE)
178 , fIdentifiedAsPileUp(kFALSE)
179 , fIdentifiedAsOutInz(kFALSE)
180 , fPassTheEventCut(kFALSE)
181 , fRejectKinkMother(kTRUE)
182 , fisppMultiBin(kFALSE)
183 , fPbPbUserCentralityBinning(kFALSE)
184 , fRemoveFirstEvent(kFALSE)
185 , fisNonHFEsystematics(kFALSE)
186 , fSpecialTrigger(NULL)
188 , fCentralityPercent(-1)
189 , fCentralityEstimator("V0M")
191 , fWeightBackGround(0.)
197 , fTriggerAnalysis(NULL)
200 , fTRDTriggerAnalysis(NULL)
201 , fPIDpreselect(NULL)
203 , fTaggedTrackCuts(NULL)
204 , fCleanTaggedTrack(kFALSE)
205 , fVariablesTRDTaggedTrack(kFALSE)
206 , fAnalysisUtils(NULL)
207 , fCutspreselect(NULL)
209 , fElecBackGround(NULL)
211 , fTaggedTrackAnalysis(NULL)
213 , fBackgroundSubtraction(NULL)
214 , fTRDTrigger(kFALSE)
215 , fWhichTRDTrigger(0)
221 , fHistELECBACKGROUND(NULL)
225 // Default constructor
227 DefineOutput(1, TList::Class());
228 DefineOutput(2, TList::Class());
230 fV0Tagger = new AliHFEV0taginfo("Tagger");
231 fPID = new AliHFEpid("hfePid");
232 fPIDqa = new AliHFEpidQAmanager;
233 fVarManager = new AliHFEvarManager("hfeVarManager");
234 fAnalysisUtils = new AliAnalysisUtils;
235 fTRDTriggerAnalysis = new AliTRDTriggerAnalysis();
237 memset(fElecBackgroundFactor, 0, sizeof(Double_t) * kElecBgSpecies * kBgPtBins * kCentBins * kBgLevels);
238 memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);
239 memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));
240 memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));
241 memset(fCentralityLimits, 0, sizeof(Float_t) * 12);
246 //____________________________________________________________
247 AliAnalysisTaskHFE::AliAnalysisTaskHFE(const AliAnalysisTaskHFE &ref):
248 AliAnalysisTaskSE(ref)
250 , fAODArrayMCInfo(NULL)
253 , fCollisionSystem(ref.fCollisionSystem)
254 , fFillSignalOnly(ref.fFillSignalOnly)
255 , fRejectMCFakeTracks(ref.fRejectMCFakeTracks)
256 , fFillNoCuts(ref.fFillNoCuts)
257 , fBackGroundFactorApply(ref.fBackGroundFactorApply)
258 , fRemovePileUp(ref.fRemovePileUp)
259 , fIdentifiedAsPileUp(ref.fIdentifiedAsPileUp)
260 , fIdentifiedAsOutInz(ref.fIdentifiedAsOutInz)
261 , fPassTheEventCut(ref.fPassTheEventCut)
262 , fRejectKinkMother(ref.fRejectKinkMother)
263 , fisppMultiBin(ref.fisppMultiBin)
264 , fPbPbUserCentralityBinning(ref.fPbPbUserCentralityBinning)
265 , fRemoveFirstEvent(ref.fRemoveFirstEvent)
266 , fisNonHFEsystematics(ref.fisNonHFEsystematics)
267 , fSpecialTrigger(ref.fSpecialTrigger)
268 , fCentralityF(ref.fCentralityF)
269 , fCentralityPercent(ref.fCentralityPercent)
270 , fCentralityEstimator(ref.fCentralityEstimator)
271 , fContributors(ref.fContributors)
272 , fWeightBackGround(ref.fWeightBackGround)
278 , fTriggerAnalysis(NULL)
281 , fTRDTriggerAnalysis(NULL)
282 , fPIDpreselect(NULL)
284 , fTaggedTrackCuts(NULL)
285 , fCleanTaggedTrack(ref.fCleanTaggedTrack)
286 , fVariablesTRDTaggedTrack(ref.fVariablesTRDTaggedTrack)
287 , fAnalysisUtils(NULL)
288 , fCutspreselect(NULL)
290 , fElecBackGround(NULL)
292 , fTaggedTrackAnalysis(NULL)
294 , fBackgroundSubtraction(NULL)
295 , fTRDTrigger(ref.fTRDTrigger)
296 , fWhichTRDTrigger(ref.fWhichTRDTrigger)
302 , fHistELECBACKGROUND(NULL)
303 , fQACollection(NULL)
311 //____________________________________________________________
312 AliAnalysisTaskHFE &AliAnalysisTaskHFE::operator=(const AliAnalysisTaskHFE &ref){
314 // Assignment operator
321 //____________________________________________________________
322 void AliAnalysisTaskHFE::Copy(TObject &o) const {
324 // Copy into object o
326 AliAnalysisTaskHFE &target = dynamic_cast<AliAnalysisTaskHFE &>(o);
327 target.fAODMCHeader = fAODMCHeader;
328 target.fAODArrayMCInfo = fAODArrayMCInfo;
329 target.fQAlevel = fQAlevel;
330 target.fPlugins = fPlugins;
331 target.fCollisionSystem = fCollisionSystem;
332 target.fFillSignalOnly = fFillSignalOnly;
333 target.fRejectMCFakeTracks = fRejectMCFakeTracks;
334 target.fFillNoCuts = fFillNoCuts;
335 target.fBackGroundFactorApply = fBackGroundFactorApply;
336 target.fRemovePileUp = fRemovePileUp;
337 target.fIdentifiedAsPileUp = fIdentifiedAsPileUp;
338 target.fIdentifiedAsOutInz = fIdentifiedAsOutInz;
339 target.fPassTheEventCut = fPassTheEventCut;
340 target.fRejectKinkMother = fRejectKinkMother;
341 target.fisppMultiBin = fisppMultiBin;
342 target.fPbPbUserCentralityBinning = fPbPbUserCentralityBinning;
343 target.fRemoveFirstEvent = fRemoveFirstEvent;
344 target.fisNonHFEsystematics = fisNonHFEsystematics;
345 target.fSpecialTrigger = fSpecialTrigger;
346 target.fCentralityF = fCentralityF;
347 target.fCentralityPercent = fCentralityPercent;
348 target.fCentralityEstimator = fCentralityEstimator;
349 target.fContributors = fContributors;
350 target.fWeightBackGround = fWeightBackGround;
352 target.fContainer = fContainer;
353 target.fVarManager = fVarManager;
354 target.fSignalCuts = fSignalCuts;
356 target.fTriggerAnalysis = fTriggerAnalysis;
358 target.fPIDqa = fPIDqa;
359 target.fTRDTriggerAnalysis = fTRDTriggerAnalysis;
360 target.fPIDpreselect = fPIDpreselect;
361 target.fCuts = fCuts;
362 target.fTaggedTrackCuts = fTaggedTrackCuts;
363 target.fCleanTaggedTrack = fCleanTaggedTrack;
364 target.fVariablesTRDTaggedTrack = fVariablesTRDTaggedTrack;
365 target.fAnalysisUtils = fAnalysisUtils;
366 target.fCutspreselect = fCutspreselect;
367 target.fSecVtx = fSecVtx;
368 target.fElecBackGround = fElecBackGround;
369 target.fMCQA = fMCQA;
370 target.fTaggedTrackAnalysis = fTaggedTrackAnalysis;
371 target.fExtraCuts = fExtraCuts;
372 target.fBackgroundSubtraction = fBackgroundSubtraction;
373 target.fTRDTrigger = fTRDTrigger;
374 target.fWhichTRDTrigger = fWhichTRDTrigger;
375 target.fV0Tagger = fV0Tagger;
377 target.fOutput = fOutput;
378 target.fHistMCQA = fHistMCQA;
379 target.fHistSECVTX = fHistSECVTX;
380 target.fHistELECBACKGROUND = fHistELECBACKGROUND;
381 target.fQACollection = fQACollection;
384 //____________________________________________________________
385 AliAnalysisTaskHFE::~AliAnalysisTaskHFE(){
389 if(fPID) delete fPID;
390 if(fPIDpreselect) delete fPIDpreselect;
391 if(fVarManager) delete fVarManager;
392 if(fTRDTriggerAnalysis) delete fTRDTriggerAnalysis;
393 if(fCFM) delete fCFM;
394 if(fTriggerAnalysis) delete fTriggerAnalysis;
395 if(fSignalCuts) delete fSignalCuts;
396 if(fSecVtx) delete fSecVtx;
397 if(fMCQA) delete fMCQA;
398 if(fElecBackGround) delete fElecBackGround;
399 if(fBackgroundSubtraction) delete fBackgroundSubtraction;
400 if(fSpecialTrigger) delete fSpecialTrigger;
401 if(fAnalysisUtils) delete fAnalysisUtils;
402 if(fV0Tagger) delete fV0Tagger;
403 // Delete output objects only if we are not running in PROOF mode because otherwise this produces a crash during merging
404 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
405 if(mgr && mgr->GetAnalysisType() != AliAnalysisManager::kProofAnalysis){
406 if(fPIDqa) delete fPIDqa;
407 if(fOutput) delete fOutput;
412 //____________________________________________________________
413 void AliAnalysisTaskHFE::UserCreateOutputObjects(){
415 // Creating output container and output objects
416 // Here we also Initialize the correction framework container and
421 // QA histograms are created if requested
422 // Called once per worker
424 AliDebug(3, "Creating Output Objects");
426 // Make lists for Output
427 if(!fQA) fQA = new TList;
429 if(!fOutput) fOutput = new TList;
432 // Automatic determination of the analysis mode
433 AliVEventHandler *inputHandler = dynamic_cast<AliVEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
434 if(!TString(inputHandler->IsA()->GetName()).CompareTo("AliAODInputHandler")){
438 if(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler())
441 printf("Analysis Mode: %s Analysis\n", IsAODanalysis() ? "AOD" : "ESD");
442 printf("MC Data available %s\n", HasMCData() ? "Yes" : "No");
444 // Enable Trigger Analysis
445 fTriggerAnalysis = new AliTriggerAnalysis;
446 fTriggerAnalysis->EnableHistograms();
447 fTriggerAnalysis->SetAnalyzeMC(HasMCData());
449 // First Part: Make QA histograms
450 fQACollection = new AliHFEcollection("TaskQA", "QA histos from the Electron Task");
451 fQACollection->CreateTH1F("nElectronTracksEvent", "Number of Electron Candidates", 100, 0, 100);
452 fQACollection->CreateTH1F("nElectron", "Number of electrons", 100, 0, 100);
453 fQACollection->CreateTH2F("radius", "Production Vertex", 100, 0.0, 5.0, 100, 0.0, 5.0);
454 fQACollection->CreateTH1F("nTriggerBit", "Histo Trigger Bit", 22, 0, 22);
455 fQACollection->CreateTH1F("Filterbegin", "AOD filter of tracks after all cuts", 21, -1, 20);
456 fQACollection->CreateTH1F("Filterend", "AOD filter of tracks after all cuts", 21, -1, 20);
457 fQACollection->CreateTH2F("Kinkbefore", "Kink status before filter; p_{T} (GeV/c); kink status", 100, 0., 20., 3, -0.5, 2.5);
458 fQACollection->CreateTH2F("Kinkafter", "Kink status after filter; p_{T} (GeV/c); kink status", 100, 0., 20., 3, -0.5, 2.5);
459 fQACollection->CreateTH1F("HFPuzzle", "Source definition for electrons from HF", 11, -0.5, 10.5);
461 InitHistoITScluster();
462 InitContaminationQA();
463 fQA->Add(fQACollection);
466 fPID->SetHasMCData(HasMCData());
467 if(!fPID->GetNumberOfPIDdetectors()) fPID->AddDetector("TPC", 0);
469 AliInfo("PID QA switched on");
470 fPIDqa->Initialize(fPID);
471 fQA->Add(fPIDqa->MakeList("HFEpidQA"));
473 fPID->SortDetectors();
475 // Background subtraction-------------------------------------------------------------------
476 if (GetPlugin(kNonPhotonicElectron)) {
477 if(!fBackgroundSubtraction) fBackgroundSubtraction = new AliHFENonPhotonicElectron();
478 if(IsAODanalysis()) fBackgroundSubtraction->SetAOD(kTRUE);
479 fBackgroundSubtraction->Init();
480 fOutput->Add(fBackgroundSubtraction->GetListOutput());
482 //------------------------------------------------------------------------------------------
485 // Initialize correction Framework and Cuts
486 const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack + AliHFEcuts::kNcutStepsSecvtxTrack;
487 fCFM = new AliCFManager;
488 fCFM->SetNStepParticle(kNcutSteps);
489 MakeParticleContainer();
490 MakeEventContainer();
491 // Temporary fix: Initialize particle cuts with NULL
492 for(Int_t istep = 0; istep < kNcutSteps; istep++)
493 fCFM->SetParticleCutsList(istep, NULL);
495 AliWarning("Cuts not available. Default cuts will be used");
496 fCuts = new AliHFEcuts;
497 fCuts->CreateStandardCuts();
499 if(IsAODanalysis()) fCuts->SetAOD();
500 // Make clone for V0 tagging step
501 fCuts->Initialize(fCFM);
502 if(fCuts->IsQAOn()) fQA->Add(fCuts->GetQAhistograms());
503 fSignalCuts = new AliHFEsignalCuts("HFEsignalCuts", "HFE MC Signal definition");
504 fVarManager->SetSignalCuts(fSignalCuts);
506 // add output objects to the List
507 fOutput->AddAt(fContainer, 0);
508 fOutput->AddAt(fCFM->GetEventContainer(), 1);
510 // mcQA----------------------------------
511 if (HasMCData() && IsQAOn(kMCqa)) {
513 if(!fMCQA) fMCQA = new AliHFEmcQA;
514 if(!fHistMCQA) fHistMCQA = new TList();
515 fHistMCQA->SetOwner();
516 if(IsPbPb()) fMCQA->SetPbPb();
517 if(fisppMultiBin) fMCQA->SetPPMultiBin();
518 if(TestBit(kTreeStream)){
519 fMCQA->EnableDebugStreamer();
521 fMCQA->CreatDefaultHistograms(fHistMCQA);
522 fMCQA->SetBackgroundWeightFactor(fElecBackgroundFactor[0][0][0],fBinLimit);
526 // secvtx----------------------------------
527 if (GetPlugin(kSecVtx)) {
528 AliInfo("Secondary Vertex Analysis on");
529 if(!fSecVtx) fSecVtx = new AliHFEsecVtx;
530 fSecVtx->SetHasMCData(HasMCData());
532 if(!fHistSECVTX) fHistSECVTX = new TList();
533 fHistSECVTX->SetOwner();
534 fSecVtx->CreateHistograms(fHistSECVTX);
535 fOutput->Add(fHistSECVTX);
538 // background----------------------------------
539 if (GetPlugin(kIsElecBackGround)) {
540 AliInfo("Electron BackGround Analysis on");
541 if(!fElecBackGround){
542 AliWarning("ElecBackGround not available. Default elecbackground will be used");
543 fElecBackGround = new AliHFEelecbackground;
545 fElecBackGround->SetHasMCData(HasMCData());
547 if(!fHistELECBACKGROUND) fHistELECBACKGROUND = new TList();
548 fHistELECBACKGROUND->SetOwner();
549 fElecBackGround->CreateHistograms(fHistELECBACKGROUND);
550 fOutput->Add(fHistELECBACKGROUND);
554 if(GetPlugin(kTaggedTrackAnalysis)){
555 AliInfo("Analysis on V0-tagged tracks enabled");
556 fTaggedTrackAnalysis = new AliHFEtaggedTrackAnalysis(Form("taggedTrackAnalysis%s", GetName()));
557 fTaggedTrackAnalysis->SetCuts(fTaggedTrackCuts);
558 fTaggedTrackAnalysis->SetClean(fCleanTaggedTrack);
559 AliHFEvarManager *varManager = fTaggedTrackAnalysis->GetVarManager();
560 TObjArray *array = fVarManager->GetVariables();
561 Int_t nvars = array->GetEntriesFast();
563 for(Int_t v = 0; v < nvars; v++) {
564 AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);
565 if(!variable) continue;
566 TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());
567 if(!name.CompareTo("source")) namee = TString("species");
568 else namee = TString(name);
569 Int_t nbins = variable->GetNumberOfBins();
570 if(variable->HasUserDefinedBinning()){
571 varManager->AddVariable(namee, nbins, variable->GetBinning());
573 varManager->AddVariable(namee, nbins, variable->GetMinimum(), variable->GetMaximum());
575 //printf("For AliTaggedTrackAnalysis, had the variable %s and the one used %s\n",(const char*)variable->GetName(),(const char*) namee);
577 if(fPIDqa->HasHighResolutionHistos())
578 fTaggedTrackAnalysis->GetPIDqa()->SetHighResolutionHistos();
579 fTaggedTrackAnalysis->SetPID(fPID);
580 fTaggedTrackAnalysis->SetVariablesTRD(fVariablesTRDTaggedTrack);
581 fTaggedTrackAnalysis->InitContainer();
582 fOutput->Add(fTaggedTrackAnalysis->GetContainer());
583 fQA->Add(fTaggedTrackAnalysis->GetPIDQA());
584 fQA->Add(fTaggedTrackAnalysis->GetCutQA());
585 fQA->Add(fTaggedTrackAnalysis->GetQAcollection());
592 PostData(1, fOutput);
596 //____________________________________________________________
597 void AliAnalysisTaskHFE::UserExec(Option_t *){
602 //printf("test00\n");
604 AliDebug(3, "Starting Single Event Analysis");
606 AliError("Reconstructed Event not available");
607 //printf("Reconstructed Event not available");
610 if(HasMCData() && IsESDanalysis()){
611 AliDebug(4, Form("MC Event: %p", fMCEvent));
613 AliError("No MC Event, but MC Data required");
614 //printf("No MC Event, but MC Data required");
619 AliError("HFE cuts not available");
620 //printf("HFE cuts not available");
623 if(!fPID->IsInitialized()){
624 // Initialize PID with the given run number
625 fPID->InitializePID(fInputEvent->GetRunNumber());
628 if(fRemoveFirstEvent){
629 if(fAnalysisUtils->IsFirstEventInChunk(fInputEvent)) return;
632 AliESDEvent *ev = dynamic_cast<AliESDEvent *>(fInputEvent);
633 if(ev && fTRDTrigger && (fWhichTRDTrigger<6))
635 if(!CheckTRDTriggerESD(ev)) return;
637 if(fInputEvent && fTRDTrigger && (fWhichTRDTrigger>5))
639 if(!CheckTRDTrigger(fInputEvent)) return;
642 if(IsESDanalysis() && HasMCData()){
643 // Protect against missing MC trees
644 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
646 AliError("No MC Event Handler available");
649 if(!mcH->InitOk()) return;
650 if(!mcH->TreeK()) return;
651 if(!mcH->TreeTR()) return;
653 // Background subtraction-------------------------------------------------------------------
654 if(GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->SetMCEvent(fMCEvent);
655 //------------------------------------------------------------------------------------------
658 if(IsAODanalysis() && HasMCData()){
660 AliAODEvent *aodE = dynamic_cast<AliAODEvent *>(fInputEvent);
662 AliError("No AOD Event");
665 fAODMCHeader = dynamic_cast<AliAODMCHeader *>(fInputEvent->FindListObject(AliAODMCHeader::StdBranchName()));
667 AliError("No AliAODMCHeader");
668 //printf("No AliAODMCHeader");
671 fAODArrayMCInfo = dynamic_cast<TClonesArray *>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
672 if(!fAODArrayMCInfo){
673 AliError("No AOD MC particles");
674 //printf("No AOD MC particles");
677 fSignalCuts->SetMCAODInfo(fAODArrayMCInfo);
678 // Background subtraction-------------------------------------------------------------------
679 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->SetAODArrayMCInfo(fAODArrayMCInfo);
680 //------------------------------------------------------------------------------------------
685 // need the centrality for everything (MC also)
687 if(!ReadCentrality()) fCentralityF = -1;
688 //printf("pass centrality\n");
689 //printf("Reading fCentralityF %d\n",fCentralityF);
691 // See if pile up and z in the range
692 RejectionPileUpVertexRangeEventCut();
696 // Protect agains missing
698 //printf("Has MC data\n");
699 fSignalCuts->SetMCEvent(fMCEvent);
700 ProcessMC(); // Run the MC loop + MC QA in case MC Data are available
703 AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();
705 AliDebug(1, "Using default PID Response");
706 pidResponse = AliHFEtools::GetDefaultPID(HasMCData(), fInputEvent->IsA() == AliESDEvent::Class());
708 fPID->SetPIDResponse(pidResponse);
709 if(fPIDpreselect) fPIDpreselect->SetPIDResponse(pidResponse);
711 // Background subtraction-------------------------------------------------------------------
712 if(GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->InitRun(fInputEvent,pidResponse);
713 //------------------------------------------------------------------------------------------
720 const char *specialTrigger = GetSpecialTrigger(fInputEvent->GetRunNumber());
721 // Check Trigger selection
723 AliDebug(2, Form("Special Trigger requested: %s", specialTrigger));
724 if(!(ev && ev->IsTriggerClassFired(specialTrigger))){
725 AliDebug(2, "Event not selected");
727 } else AliDebug(2, "Event Selected");
728 } else AliDebug(2, "No Special Trigger requested");
733 PostData(1, fOutput);
737 //____________________________________________________________
738 void AliAnalysisTaskHFE::Terminate(Option_t *){
740 // Terminate not implemented at the moment
744 //_______________________________________________________________
745 Bool_t AliAnalysisTaskHFE::IsEventInBinZero() {
750 //printf("test in IsEventInBinZero\n");
752 AliError("Reconstructed Event not available");
757 const AliVVertex *vertex = fInputEvent->GetPrimaryVertex();
758 if(!vertex) return kTRUE;
759 //if(vertex) return kTRUE;
762 if(fInputEvent->GetNumberOfTracks()<=0) return kTRUE;
763 //if(fInputEvent->GetNumberOfTracks()>0) return kTRUE;
769 //____________________________________________________________
770 void AliAnalysisTaskHFE::ProcessMC(){
772 // Runs the MC Loop (filling the container for the MC Cut Steps with the observables pt, eta and phi)
773 // In case MC QA is on also MC QA loop is done
775 AliDebug(3, "Processing MC Information");
776 Double_t eventContainer [4] = {0., 0., 0., 0.};
777 if(IsESDanalysis()) eventContainer[0] = fMCEvent->GetPrimaryVertex()->GetZ();
778 else eventContainer[0] = fAODMCHeader->GetVtxZ();
779 eventContainer[2] = fCentralityF;
780 eventContainer[3] = fContributors;
781 fVz = eventContainer[0];
782 //printf("z position is %f\n",eventContainer[0]);
783 //if(fCFM->CheckEventCuts(AliHFEcuts::kEventStepGenerated, fMCEvent))
784 fCFM->GetEventContainer()->Fill(eventContainer,AliHFEcuts::kEventStepGenerated);
785 Int_t nElectrons = 0;
787 if(!((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (fCentralityF < 0))){ //kStepMCGeneratedZOutNoPileUpCentralityFine
788 if (HasMCData() && IsQAOn(kMCqa)) {
789 AliDebug(2, "Running MC QA");
791 if(fMCEvent->Stack()){
792 fMCQA->SetMCEvent(fMCEvent);
793 fMCQA->SetGenEventHeader(fMCEvent->GenEventHeader());
794 fMCQA->SetCentrality(fCentralityF);
795 fMCQA->SetPercentrality(static_cast<Int_t>(fCentralityPercent));
796 if(IsPbPb()) { fMCQA->SetPbPb();}
799 if(fisppMultiBin) fMCQA->SetPPMultiBin();
804 fMCQA->GetMesonKine();
806 // loop over all tracks for decayed electrons
807 for (Int_t igen = 0; igen < fMCEvent->GetNumberOfTracks(); igen++){
808 TParticle* mcpart = fMCEvent->Stack()->Particle(igen);
809 if(!mcpart) continue;
810 fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kCharm);
811 fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kBeauty);
812 fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kCharm);
813 fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kBeauty);
814 fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kCharm, AliHFEmcQA::kElectronPDG); // no accept cut
815 fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kBeauty, AliHFEmcQA::kElectronPDG); // no accept cut
816 fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kOthers, AliHFEmcQA::kElectronPDG); // no accept cut
818 //fMCQA->EndOfEventAna(AliHFEmcQA::kCharm);
819 //fMCQA->EndOfEventAna(AliHFEmcQA::kBeauty);
822 } // end of MC QA loop
824 // -----------------------------------------------------------------
825 fCFM->SetMCEventInfo(fMCEvent);
826 // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);
828 fMCQA->SetMCArray(fAODArrayMCInfo);
829 fCFM->SetMCEventInfo(fInputEvent);
832 AliVParticle *mctrack = NULL;
833 Int_t numberofmctracks = 0;
835 numberofmctracks = fMCEvent->GetNumberOfTracks();
838 numberofmctracks = fAODArrayMCInfo->GetEntriesFast();
840 AliDebug(3, Form("Number of Tracks: %d",numberofmctracks));
841 //printf("Number of MC track %d\n",numberofmctracks);
842 for(Int_t imc = 0; imc <numberofmctracks; imc++){
843 if(IsESDanalysis()) {
844 if(!(mctrack = fMCEvent->GetTrack(imc))) continue;
847 if(!(mctrack = (AliVParticle *) fAODArrayMCInfo->At(imc))) continue;
849 //printf("Test in ProcessMC\n");
850 AliDebug(4, "Next MC Track");
851 if(ProcessMCtrack(mctrack)) nElectrons++;
854 // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);
855 fQACollection->Fill("nElectron", nElectrons);
858 //____________________________________________________________
859 void AliAnalysisTaskHFE::ProcessESD(){
861 // Run Analysis of reconstructed event in ESD Mode
862 // Loop over Tracks, filter according cut steps defined in AliHFEcuts
864 AliDebug(1, Form("Task %s", GetName()));
865 AliDebug(3, "Processing ESD Event");
866 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
868 AliError("ESD Event required for ESD Analysis");
872 // Set magnetic field if V0 task on
873 if(fTaggedTrackAnalysis) {
874 // Tag all v0s in current event
877 fV0Tagger->TagV0Tracks(fESD);
879 fTaggedTrackAnalysis->SetMagneticField(fESD->GetMagneticField());
880 fTaggedTrackAnalysis->SetCentrality(fCentralityF);
881 if(IsPbPb()) fTaggedTrackAnalysis->SetPbPb();
883 if(IspPb()) fTaggedTrackAnalysis->SetpPb();
884 else fTaggedTrackAnalysis->SetPP();
888 // Do event Normalization
889 Double_t eventContainer[4];
890 eventContainer[0] = 0.;
891 if(HasMCData()) eventContainer[0] = fVz;
893 const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();
894 if(vtxESD) eventContainer[0] = vtxESD->GetZ();
896 eventContainer[1] = 0.;
897 eventContainer[2] = fCentralityF;
898 eventContainer[3] = fContributors;
899 if(fTriggerAnalysis->IsOfflineTriggerFired(fESD, AliTriggerAnalysis::kV0AND))
900 eventContainer[1] = 1.;
903 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);
906 if(fIdentifiedAsPileUp) return;
907 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);
910 if(TMath::Abs(fCentralityF) < 0) return;
911 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecCentralityOk);
912 //printf("In ProcessESD %f\n",fCentralityF);
915 if(fIdentifiedAsOutInz) return;
916 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange);
919 if(!fPassTheEventCut) return;
920 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);
923 fContainer->NewEvent();
925 if (GetPlugin(kIsElecBackGround)) {
926 fElecBackGround->SetEvent(fESD);
928 if (GetPlugin(kSecVtx)) {
929 fSecVtx->SetEvent(fESD);
930 fSecVtx->GetPrimaryCondition();
934 if (GetPlugin(kSecVtx)) {
935 fSecVtx->SetMCEvent(fMCEvent);
936 fSecVtx->SetMCQA(fMCQA);
938 if (GetPlugin(kIsElecBackGround)) {
939 fElecBackGround->SetMCEvent(fMCEvent);
943 Double_t container[10];
944 memset(container, 0, sizeof(Double_t) * 10);
945 // container for the output THnSparse
946 Double_t dataDca[6]; // [source, pT, dca, centrality]
947 Int_t nElectronCandidates = 0;
948 AliESDtrack *track = NULL, *htrack = NULL;
949 AliMCParticle *mctrack = NULL;
950 AliMCParticle *mctrackmother = NULL;
952 Bool_t signal = kTRUE;
954 fCFM->SetRecEventInfo(fESD);
956 // Get Number of contributors to the primary vertex for multiplicity-dependent correction
957 Int_t ncontribVtx = 0;
958 const AliESDVertex *priVtx = fESD->GetPrimaryVertexTracks();
960 ncontribVtx = priVtx->GetNContributors();
963 // minjung for IP QA(temporary ~ 2weeks)
965 fExtraCuts = new AliHFEextraCuts("hfetmpCuts","HFE tmp Cuts");
967 fExtraCuts->SetRecEventInfo(fESD);
969 // Electron background analysis
970 if (GetPlugin(kIsElecBackGround)) {
972 AliDebug(2, "Running BackGround Analysis");
974 fElecBackGround->Reset();
976 } // end of electron background analysis
979 // Background subtraction-------------------------------------------------------------------
980 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->FillPoolAssociatedTracks(fInputEvent, fCentralityF);
981 //------------------------------------------------------------------------------------------
986 AliDebug(3, Form("Number of Tracks: %d", fESD->GetNumberOfTracks()));
987 Bool_t kinkmother(kFALSE), kinkdaughter(kFALSE); Double_t kinkstatus(0);
988 for(Int_t itrack = 0; itrack < fESD->GetNumberOfTracks(); itrack++){
989 AliDebug(4, "New ESD track");
990 track = fESD->GetTrack(itrack);
991 track->SetESDEvent(fESD);
992 kinkmother = track->GetKinkIndex(0) < 0; kinkdaughter = track->GetKinkIndex(0) > 0;
994 if(kinkmother) kinkstatus = 1.;
995 else if(kinkdaughter) kinkstatus = 2.;
997 // fill counts of v0-identified particles
998 AliPID::EParticleType v0pid = fV0Tagger ? fV0Tagger->GetV0Info(track->GetID()) : AliPID::kUnknown;
999 // here the tagged track analysis will run
1000 if(fTaggedTrackAnalysis && v0pid != AliPID::kUnknown){
1001 AliDebug(1, Form("Track identified as %s", AliPID::ParticleName(v0pid)));
1002 fTaggedTrackAnalysis->ProcessTrack(track, v0pid);
1003 AliDebug(1, "V0 PID done");
1007 //Fill non-HFE source containers at reconstructed events cut step
1008 AliDebug(3, Form("Doing track %d, %p", itrack, track));
1011 //////////////////////////////////////
1013 //////////////////////////////////////
1014 if(fPIDpreselect || fCutspreselect) {
1015 if(!PreSelectTrack(track)) continue;
1020 // Fill step without any cut
1023 // Check if it is electrons near the vertex
1024 if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel()))))) continue;
1026 if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;
1027 if(fRejectMCFakeTracks && IsMCFakeTrack(track)) signal = kFALSE;
1028 else AliDebug(3, "Signal Electron");
1030 // Fill K pt for Ke3 contributions
1031 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode())==321)) fQACollection->Fill("Kptspectra",mctrack->Pt());
1032 else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode())==130)) fQACollection->Fill("K0Lptspectra",mctrack->Pt());
1034 // Cache new Track information inside the var manager
1035 fVarManager->NewTrack(track, mctrack, fCentralityF, -1, signal);
1038 if(signal || !fFillSignalOnly){
1039 fVarManager->FillContainer(fContainer, "recTrackContReco", AliHFEcuts::kStepRecNoCut, kFALSE);
1040 fVarManager->FillContainer(fContainer, "recTrackContMC", AliHFEcuts::kStepRecNoCut, kTRUE);
1044 // RecKine: ITSTPC cuts
1045 if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
1047 fQACollection->Fill("Kinkbefore", track->Pt(), kinkstatus);
1049 if(fRejectKinkMother) {
1050 if(track->GetKinkIndex(0) != 0) continue; } // Quick and dirty fix to reject both kink mothers and daughters
1051 if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
1052 fQACollection->Fill("Kinkafter", track->Pt(), kinkstatus);
1054 // HFEcuts: ITS layers cuts
1055 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
1057 // HFE cuts: TOF PID and mismatch flag
1058 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTOF, track)) continue;
1060 // HFE cuts: TPC PID cleanup
1061 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
1063 // HFEcuts: Nb of tracklets TRD0
1064 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTRD, track)) continue;
1066 // Fill correlation maps before PID
1067 if(signal && fContainer->GetCorrelationMatrix("correlationstepbeforePID")) {
1068 //printf("Fill correlation maps before PID\n");
1069 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepbeforePID"));
1073 FillProductionVertex(track);
1075 if(fMCQA && signal){
1076 fMCQA->SetCentrality(fCentralityF);
1077 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){
1078 Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.};
1079 Double_t hfeimpactRtmp=0., hfeimpactnsigmaRtmp=0.;
1080 fExtraCuts->GetHFEImpactParameters(track, hfeimpactRtmp, hfeimpactnsigmaRtmp);
1081 UChar_t itsPixel = track->GetITSClusterMap();
1082 Double_t ilyrhit=0, ilyrstat=0;
1083 for(Int_t ilyr=0; ilyr<6; ilyr++){
1084 if(TESTBIT(itsPixel, ilyr)) ilyrhit += TMath::Power(2,ilyr);
1085 if(fExtraCuts->CheckITSstatus(fExtraCuts->GetITSstatus(track,ilyr))) ilyrstat += TMath::Power(2,ilyr);
1087 fMCQA->SetITSInfo(ilyrhit,ilyrstat);
1088 fMCQA->SetHFEImpactParameters(hfeimpactRtmp, hfeimpactnsigmaRtmp);
1089 fMCQA->SetTrkKine(track->Pt(),track->Eta(), track->Phi());
1090 fMCQA->SetContainerStep(3);
1091 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1092 weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
1093 if(!fisNonHFEsystematics || IsPbPb())break;
1096 if(fisNonHFEsystematics){
1097 //Fill additional containers for electron source distinction
1098 Int_t elecSource = 0;
1099 elecSource = fMCQA->GetElecSource(mctrack->Particle());
1100 const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
1101 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
1103 for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
1104 if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
1105 if(elecSource == iSource){
1106 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1107 if(weightElecBgV0[iLevel]>0){
1108 fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, weightElecBgV0[iLevel]);
1110 else if(weightElecBgV0[iLevel]<0){
1111 fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, -1*weightElecBgV0[iLevel]);
1118 if(iName == kElecBgSpecies)iName = 0;
1122 if(weightElecBgV0[0]>0) {
1123 fVarManager->FillContainer(fContainer, "conversionElecs", 3, kFALSE, weightElecBgV0[0]);
1124 fVarManager->FillContainer(fContainer, "conversionElecs", 4, kTRUE, weightElecBgV0[0]);
1126 else if(weightElecBgV0[0]<0) {
1127 fVarManager->FillContainer(fContainer, "mesonElecs", 3, kFALSE, -1*weightElecBgV0[0]);
1128 fVarManager->FillContainer(fContainer, "mesonElecs", 4, kTRUE, -1*weightElecBgV0[0]);
1134 Double_t hfeimpactR4all=0., hfeimpactnsigmaR4all=0.;
1135 Int_t sourceDca =-1;
1136 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 211)){
1138 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
1139 dataDca[0]=0; //pion
1140 dataDca[1]=track->Pt();
1141 dataDca[2]=hfeimpactR4all;
1142 dataDca[3]=fCentralityF;
1144 dataDca[5] = double(track->Charge());
1145 fQACollection->Fill("Dca", dataDca);
1148 else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){ // to increas statistics for Martin
1150 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
1151 if(fSignalCuts->IsCharmElectron(track)){
1154 else if(fSignalCuts->IsBeautyElectron(track)){
1157 else if(fSignalCuts->IsGammaElectron(track)){
1160 else if(fSignalCuts->IsNonHFElectron(track)){
1163 else if(fSignalCuts->IsJpsiElectron(track)){
1169 dataDca[0]=sourceDca;
1170 dataDca[1]=track->Pt();
1171 dataDca[2]=hfeimpactR4all;
1172 dataDca[3]=fCentralityF;
1174 dataDca[5] = double(track->Charge());
1175 if(signal) fQACollection->Fill("Dca", dataDca);
1180 AliHFEpidObject hfetrack;
1181 hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
1182 hfetrack.SetRecTrack(track);
1183 if(HasMCData()) hfetrack.SetMCTrack(mctrack);
1184 hfetrack.SetCentrality(fCentralityF);
1185 hfetrack.SetMulitplicity(ncontribVtx);
1186 if(IsPbPb()) hfetrack.SetPbPb();
1188 if(IspPb()) hfetrack.SetpPb();
1189 else hfetrack.SetPP();
1191 fPID->SetVarManager(fVarManager);
1192 if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue;
1193 nElectronCandidates++;
1195 // Background subtraction------------------------------------------------------------------------------------------
1196 if (GetPlugin(kNonPhotonicElectron)) {
1197 Int_t indexmother = -1;
1198 Int_t mcsource = -1;
1200 mcsource = fBackgroundSubtraction->FindMother(mctrack->GetLabel(),indexmother);
1202 fBackgroundSubtraction->LookAtNonHFE(itrack, track, fInputEvent, 1, fCentralityF, -1, mcsource, indexmother);
1204 //-----------------------------------------------------------------------------------------------------------------
1206 // Temporary histogram for chi2/ITS cluster
1208 TBits shared = track->GetTPCSharedMap();
1210 if(shared.CountBits() >= 2) sharebit=1;
1212 Double_t itschi2percluster = 0.0;
1213 Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));
1214 if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;
1216 Double_t itsChi2[7] = {track->Pt(),track->Eta(), track->Phi(),
1217 static_cast<Double_t>(fCentralityF),static_cast<Double_t>(track->GetTPCsignalN()), static_cast<Double_t>(sharebit),itschi2percluster};
1218 fQACollection->Fill("fChi2perITScluster", itsChi2);
1222 Double_t itschi2percluster = 0.0;
1223 Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));
1224 if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;
1226 Double_t itsChi2[3] = {track->Pt(), static_cast<Double_t>(fCentralityF), itschi2percluster};
1227 fQACollection->Fill("fChi2perITScluster", itsChi2);
1230 // Fill Histogram for Hadronic Background
1232 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11))
1233 fVarManager->FillContainer(fContainer, "hadronicBackground", UInt_t(0), kFALSE);
1235 // Fill Ke3 contributions
1236 Int_t glabel=TMath::Abs(mctrack->GetMother());
1237 if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
1238 if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==321)
1239 fQACollection->Fill("Ke3Kecorr",mctrack->Pt(),mctrackmother->Pt());
1240 else if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==130)
1241 fQACollection->Fill("Ke3K0Lecorr",mctrack->Pt(),mctrackmother->Pt());
1248 // Apply weight for background contamination
1249 if(fBackGroundFactorApply) {
1250 if(IsPbPb() && fCentralityF >= 0) fWeightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));
1251 else fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // for pp and pPb
1253 if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
1254 else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
1255 // weightBackGround as special weight
1256 fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);
1258 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));
1261 Bool_t bTagged=kFALSE;
1262 if(GetPlugin(kSecVtx)) {
1263 AliDebug(2, "Running Secondary Vertex Analysis");
1264 if(fSecVtx->Process(track) && signal) {
1265 fVarManager->FillContainer(fContainer, "recTrackContSecvtxReco", AliHFEcuts::kStepHFEcutsSecvtx, kFALSE);
1266 fVarManager->FillContainer(fContainer, "recTrackContSecvtxMC", AliHFEcuts::kStepHFEcutsSecvtx, kTRUE);
1271 // Electron background analysis
1272 if (GetPlugin(kIsElecBackGround)) {
1274 AliDebug(2, "Running BackGround Analysis");
1276 for(Int_t jtrack = 0; jtrack < fESD->GetNumberOfTracks(); jtrack++){
1277 htrack = fESD->GetTrack(jtrack);
1278 if ( itrack == jtrack ) continue;
1279 fElecBackGround->PairAnalysis(track, htrack);
1281 } // end of electron background analysis
1283 if (GetPlugin(kDEstep)) {
1284 Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.,};
1285 Int_t elecSource = 0;
1286 Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;
1287 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
1290 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
1291 fQACollection->Fill("hadronsBeforeIPcut",track->Pt());
1293 if(fMCQA && signal) {
1295 fMCQA->SetContainerStep(0);
1296 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1297 weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
1298 if(!fisNonHFEsystematics || IsPbPb())break;
1301 if(fisNonHFEsystematics){
1302 //Fill additional containers for electron source distinction
1303 elecSource = fMCQA->GetElecSource(mctrack->Particle());
1304 const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
1305 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
1307 for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
1308 if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
1309 if(elecSource == iSource){
1310 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1311 if(weightElecBgV0[iLevel]>0) fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 0, kFALSE, weightElecBgV0[iLevel]);
1312 else if(weightElecBgV0[iLevel]<0) fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 0, kFALSE, -1*weightElecBgV0[iLevel]);
1318 if(iName == kElecBgSpecies)iName = 0;
1322 if(weightElecBgV0[0]>0) {
1323 fVarManager->FillContainer(fContainer, "conversionElecs", 0, kFALSE, weightElecBgV0[0]);
1324 fVarManager->FillContainer(fContainer, "conversionElecs", 5, kTRUE, weightElecBgV0[0]);
1326 else if(weightElecBgV0[0]<0) {
1327 fVarManager->FillContainer(fContainer, "mesonElecs", 0, kFALSE, -1*weightElecBgV0[0]);
1328 fVarManager->FillContainer(fContainer, "mesonElecs", 5, kTRUE, -1*weightElecBgV0[0]);
1331 if(bTagged){ // bg estimation for the secondary vertex tagged signals
1332 if(weightElecBgV0[0]>0) fVarManager->FillContainer(fContainer, "conversionElecs", 2, kFALSE, weightElecBgV0[0]);
1333 else if(weightElecBgV0[0]<0) fVarManager->FillContainer(fContainer, "mesonElecs", 2, kFALSE, -1*weightElecBgV0[0]);
1338 dataDca[0]=-1; //for data, don't know the origin
1339 dataDca[1]=track->Pt();
1340 dataDca[2]=hfeimpactR;
1341 dataDca[3]=fCentralityF;
1343 dataDca[5] = double(track->Charge());
1344 if (!HasMCData()) fQACollection->Fill("Dca", dataDca);
1346 // Fill Containers for impact parameter analysis
1347 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;
1349 // Apply weight for background contamination after ip cut
1350 if(fBackGroundFactorApply) {
1351 fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
1352 if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
1353 else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
1354 // weightBackGround as special weight
1355 fVarManager->FillContainer(fContainer, "hadronicBackground", 2, kFALSE, fWeightBackGround);
1360 if(fMCQA && signal) {
1361 fMCQA->SetContainerStep(1);
1362 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1363 weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
1364 if(!fisNonHFEsystematics || IsPbPb())break;
1366 if(fisNonHFEsystematics){
1367 //Fill additional containers for electron source distinction
1368 elecSource = fMCQA->GetElecSource(mctrack->Particle());
1369 const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
1370 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
1372 for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
1373 if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
1374 if(elecSource == iSource){
1375 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1376 if(weightElecBgV0[iLevel]>0) fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 1, kFALSE, weightElecBgV0[iLevel]);
1377 else if(weightElecBgV0[iLevel]<0) fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 1, kFALSE, -1*weightElecBgV0[iLevel]);
1383 if(iName == kElecBgSpecies)iName = 0;
1387 if(weightElecBgV0[0]>0) {
1388 fVarManager->FillContainer(fContainer, "conversionElecs", 1, kFALSE, weightElecBgV0[0]);
1389 fVarManager->FillContainer(fContainer, "conversionElecs", 6, kTRUE, weightElecBgV0[0]);
1391 else if(weightElecBgV0[0]<0) {
1392 fVarManager->FillContainer(fContainer, "mesonElecs", 1, kFALSE, -1*weightElecBgV0[0]);
1393 fVarManager->FillContainer(fContainer, "mesonElecs", 6, kTRUE, -1*weightElecBgV0[0]);
1399 fVarManager->FillContainer(fContainer, "recTrackContDEReco", AliHFEcuts::kStepHFEcutsDca, kFALSE);
1400 fVarManager->FillContainer(fContainer, "recTrackContDEMC", AliHFEcuts::kStepHFEcutsDca, kTRUE);
1401 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterDE"));
1404 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
1405 fQACollection->Fill("hadronsAfterIPcut",track->Pt());
1412 // Background subtraction-------------------------------------------------------------------
1413 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->CountPoolAssociated(fInputEvent, fCentralityF);
1414 //------------------------------------------------------------------------------------------
1416 fQACollection->Fill("nElectronTracksEvent", nElectronCandidates);
1419 //____________________________________________________________
1420 void AliAnalysisTaskHFE::ProcessAOD(){
1422 // Run Analysis in AOD Mode
1423 // Function is still in development
1425 //printf("Process AOD\n");
1426 AliDebug(3, "Processing AOD Event");
1427 Double_t eventContainer[4];
1428 eventContainer[0] = 0.0;
1429 if(HasMCData()) eventContainer[0] = fVz;
1431 if(fInputEvent->GetPrimaryVertex()) eventContainer[0] = fInputEvent->GetPrimaryVertex()->GetZ();
1433 eventContainer[1] = 1.; // No Information available in AOD analysis, assume all events have V0AND
1434 eventContainer[2] = fCentralityF;
1435 eventContainer[3] = fContributors;
1437 //printf("value event container %f, %f, %f, %f\n",eventContainer[0],eventContainer[1],eventContainer[2],eventContainer[3]);
1439 AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
1441 AliError("AOD Event required for AOD Analysis");
1445 // Set magnetic field if V0 task on
1446 if(fTaggedTrackAnalysis) {
1447 // Tag all v0s in current event
1450 fV0Tagger->TagV0Tracks(fAOD);
1452 fTaggedTrackAnalysis->SetMagneticField(fAOD->GetMagneticField());
1453 fTaggedTrackAnalysis->SetCentrality(fCentralityF);
1454 if(IsPbPb()) fTaggedTrackAnalysis->SetPbPb();
1456 if(IspPb()) fTaggedTrackAnalysis->SetpPb();
1457 else fTaggedTrackAnalysis->SetPP();
1461 //printf("Will fill\n");
1463 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);
1466 if(fIdentifiedAsPileUp) return;
1467 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);
1470 if(fIdentifiedAsOutInz) return;
1471 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange);
1474 if(!fPassTheEventCut) return;
1475 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);
1478 fContainer->NewEvent();
1480 fCFM->SetRecEventInfo(fAOD);
1483 fExtraCuts = new AliHFEextraCuts("hfeExtraCuts","HFE Extra Cuts");
1485 fExtraCuts->SetRecEventInfo(fAOD);
1487 // Get Number of contributors to the primary vertex for multiplicity-dependent correction
1488 Int_t ncontribVtx = 0;
1489 AliAODVertex *priVtx = fAOD->GetPrimaryVertex();
1491 ncontribVtx = priVtx->GetNContributors();
1494 // Look for kink mother
1495 Int_t numberofvertices = fAOD->GetNumberOfVertices();
1496 Double_t listofmotherkink[numberofvertices];
1497 Int_t numberofmotherkink = 0;
1498 for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {
1499 AliAODVertex *aodvertex = fAOD->GetVertex(ivertex);
1500 if(!aodvertex) continue;
1501 if(aodvertex->GetType()==AliAODVertex::kKink) {
1502 AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();
1503 if(!mother) continue;
1504 Int_t idmother = mother->GetID();
1505 listofmotherkink[numberofmotherkink] = idmother;
1506 //printf("ID %d\n",idmother);
1507 numberofmotherkink++;
1510 //printf("Number of kink mother in the events %d\n",numberofmotherkink);
1512 // Background subtraction-------------------------------------------------------------------
1513 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->FillPoolAssociatedTracks(fInputEvent, fCentralityF);
1514 //------------------------------------------------------------------------------------------
1517 AliAODTrack *track = NULL;
1518 AliAODMCParticle *mctrack = NULL;
1519 Double_t dataDca[6]; // [source, pT, dca, centrality]
1520 Int_t nElectronCandidates = 0;
1523 //printf("Number of track %d\n",(Int_t) fAOD->GetNumberOfTracks());
1524 Bool_t kinkmother(kFALSE), kinkdaughter(kFALSE); Double_t kinkstatus(0);
1525 for(Int_t itrack = 0; itrack < fAOD->GetNumberOfTracks(); itrack++){
1527 kinkdaughter=kFALSE;
1529 track = fAOD->GetTrack(itrack); mctrack = NULL;
1530 if(!track) continue;
1532 for(int ivx = 0; ivx < numberofmotherkink; ivx++){
1533 if(track->GetID() == listofmotherkink[ivx]){
1538 AliAODVertex *pvx = track->GetProdVertex();
1539 if(pvx && (pvx->GetType() == AliAODVertex::kKink)) kinkdaughter = kTRUE;
1541 if(kinkmother) kinkstatus = 1.;
1542 else if(kinkdaughter) kinkstatus = 2.;
1544 // fill counts of v0-identified particles
1545 AliPID::EParticleType v0pid = fV0Tagger ? fV0Tagger->GetV0Info(track->GetID()) : AliPID::kUnknown;
1546 // here the tagged track analysis will run
1547 if(fTaggedTrackAnalysis && v0pid != AliPID::kUnknown){
1548 AliDebug(1, Form("Track identified as %s", AliPID::ParticleName(v0pid)));
1549 fTaggedTrackAnalysis->ProcessTrack(track, v0pid);
1550 AliDebug(1, "V0 PID done");
1555 Int_t label = TMath::Abs(track->GetLabel());
1556 if(label && label < fAODArrayMCInfo->GetEntriesFast())
1557 mctrack = dynamic_cast<AliAODMCParticle *>(fAODArrayMCInfo->At(label));
1558 if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;
1559 if(fRejectMCFakeTracks && IsMCFakeTrack(track)) signal = kFALSE;
1562 fVarManager->NewTrack(track, mctrack, fCentralityF, -1, signal);
1565 if(signal || !fFillSignalOnly){
1566 fVarManager->FillContainer(fContainer, "recTrackContReco", AliHFEcuts::kStepRecNoCut, kFALSE);
1567 fVarManager->FillContainer(fContainer, "recTrackContMC", AliHFEcuts::kStepRecNoCut, kTRUE);
1572 fQACollection->Fill("Filterbegin", -1);
1573 for(Int_t k=0; k<20; k++) {
1575 if((track->TestFilterBit(u))) {
1576 fQACollection->Fill("Filterbegin", k);
1580 // RecKine: ITSTPC cuts
1581 if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
1583 fQACollection->Fill("Kinkbefore", track->Pt(), kinkstatus);
1584 // Reject kink mother
1585 if(fRejectKinkMother) {
1586 Bool_t kinkmotherpass = kTRUE;
1587 for(Int_t ikinkmother = 0; ikinkmother < numberofmotherkink; ikinkmother++) {
1588 if(track->GetID() == listofmotherkink[ikinkmother]) {
1589 kinkmotherpass = kFALSE;
1593 if(!kinkmotherpass) continue;
1597 if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
1598 fQACollection->Fill("Kinkafter", track->Pt(), kinkstatus);
1600 // HFEcuts: ITS layers cuts
1601 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
1603 // HFE cuts: TOF PID and mismatch flag
1604 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTOF, track)) continue;
1606 // HFE cuts: TPC PID cleanup
1607 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
1609 // HFEcuts: Nb of tracklets TRD0
1610 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTRD, track)) continue;
1612 // Fill correlation maps before PID
1613 if(signal && fContainer->GetCorrelationMatrix("correlationstepbeforePID")) {
1614 //printf("Fill correlation maps before PID\n");
1615 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepbeforePID"));
1619 Double_t hfeimpactR4all=0., hfeimpactnsigmaR4all=0.;
1620 Int_t sourceDca =-1;
1621 if(mctrack && (TMath::Abs(mctrack->GetPdgCode()) == 211)){
1623 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
1624 dataDca[0]=0; //pion
1625 dataDca[1]=track->Pt();
1626 dataDca[2]=hfeimpactR4all;
1627 dataDca[3]=fCentralityF;
1628 dataDca[4] = -1; // not store V0 for the moment
1629 dataDca[5] = double(track->Charge());
1630 fQACollection->Fill("Dca", dataDca);
1633 else if(mctrack && (TMath::Abs(mctrack->GetPdgCode()) == 11)){ // to increas statistics for Martin
1635 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
1636 if(fSignalCuts->IsCharmElectron(track)){
1639 else if(fSignalCuts->IsBeautyElectron(track)){
1642 else if(fSignalCuts->IsGammaElectron(track)){
1645 else if(fSignalCuts->IsNonHFElectron(track)){
1648 else if(fSignalCuts->IsJpsiElectron(track)){
1654 dataDca[0]=sourceDca;
1655 dataDca[1]=track->Pt();
1656 dataDca[2]=hfeimpactR4all;
1657 dataDca[3]=fCentralityF;
1658 dataDca[4] = -1; // not store V0 for the moment
1659 dataDca[5] = double(track->Charge());
1660 if(signal) fQACollection->Fill("Dca", dataDca);
1665 //printf("Will process to PID\n");
1667 // track accepted, do PID
1668 AliHFEpidObject hfetrack;
1669 hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);
1670 hfetrack.SetRecTrack(track);
1671 if(HasMCData()) hfetrack.SetMCTrack(mctrack);
1672 hfetrack.SetCentrality(fCentralityF);
1673 hfetrack.SetMulitplicity(ncontribVtx); // for correction
1674 if(IsPbPb()) hfetrack.SetPbPb();
1676 if(IspPb()) hfetrack.SetpPb();
1677 else hfetrack.SetPP();
1679 fPID->SetVarManager(fVarManager);
1680 if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue;
1681 // we will do PID here as soon as possible
1683 // Background subtraction----------------------------------------------------------------------------------------------
1684 if (GetPlugin(kNonPhotonicElectron)) {
1685 Int_t indexmother = -1;
1686 Int_t mcsource = -1;
1687 if(HasMCData() && mctrack){
1688 mcsource = fBackgroundSubtraction->FindMother(TMath::Abs(track->GetLabel()),indexmother);
1689 if(mcsource == AliHFENonPhotonicElectron::kElectronfromC || mcsource == AliHFENonPhotonicElectron::kElectronfromB){
1692 if(fSignalCuts->IsCharmElectron(track)) svalue = 0;
1693 else if(fSignalCuts->IsBeautyElectron(track)) svalue = 1;
1694 else if(fSignalCuts->IsGammaElectron(track)) svalue = 2;
1695 else if(fSignalCuts->IsNonHFElectron(track)) svalue = 3;
1696 else if(fSignalCuts->IsJpsiElectron(track)) svalue = 4;
1697 else if(fSignalCuts->IsB2JpsiElectron(track)) svalue = 5;
1698 else if(fSignalCuts->IsKe3Electron(track)) svalue = 6;
1700 fQACollection->Fill("HFPuzzle",svalue);
1704 fBackgroundSubtraction->LookAtNonHFE(itrack, track, fInputEvent, 1, fCentralityF, -1,mcsource, indexmother);
1706 //---------------------------------------------------------------------------------------------------------------------
1709 fQACollection->Fill("Filterend", -1);
1710 for(Int_t k=0; k<20; k++) {
1712 if((track->TestFilterBit(u))) {
1713 fQACollection->Fill("Filterend", k);
1717 // Apply weight for background contamination
1718 //Double_t weightBackGround = 1.0;
1720 // Apply weight for background contamination
1721 if(fBackGroundFactorApply) {
1722 if(IsPbPb() && fCentralityF >= 0) fWeightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));
1723 else fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
1725 if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
1726 else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
1727 // weightBackGround as special weight
1728 fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);
1730 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));
1733 nElectronCandidates++;
1735 if (GetPlugin(kDEstep)) {
1737 Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;
1738 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
1739 dataDca[0]=-1; //for data, don't know the origin
1740 dataDca[1]=track->Pt();
1741 dataDca[2]=hfeimpactR;
1742 dataDca[3]=fCentralityF;
1743 dataDca[4] = -1; // not store V0 for the moment
1744 dataDca[5] = double(track->Charge());
1745 fQACollection->Fill("Dca", dataDca);
1748 // Fill Containers for impact parameter analysis
1749 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;
1751 // Apply weight for background contamination after ip cut
1752 if(fBackGroundFactorApply) {
1753 fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
1754 if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
1755 else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
1756 // weightBackGround as special weight
1757 fVarManager->FillContainer(fContainer, "hadronicBackground", 2, kFALSE, fWeightBackGround);
1763 // Background subtraction-------------------------------------------------------------------
1764 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->CountPoolAssociated(fInputEvent, fCentralityF);
1765 //------------------------------------------------------------------------------------------
1767 fQACollection->Fill("nElectronTracksEvent", nElectronCandidates);
1770 //____________________________________________________________
1771 Bool_t AliAnalysisTaskHFE::ProcessMCtrack(AliVParticle *track){
1773 // Filter the Monte Carlo Track
1774 // Additionally Fill a THnSparse for Signal To Background Studies
1775 // Works for AOD and MC analysis Type
1777 fVarManager->NewTrack(track, NULL, fCentralityF, -1, kTRUE);
1780 Double_t vertex[3] = {0.,0.,0.}; // Production vertex cut to mask gammas which are NOT supposed to have hits in the first ITS layer(s)
1781 if(IsESDanalysis()){
1782 AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(track);
1784 vertex[0] = mctrack->Particle()->Vx();
1785 vertex[1] = mctrack->Particle()->Vy();
1788 AliAODMCParticle *aodmctrack = dynamic_cast<AliAODMCParticle *>(track);
1789 if(aodmctrack) aodmctrack->XvYvZv(vertex);
1792 //printf("MC Generated\n");
1793 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, track)) return kFALSE;
1794 //printf("MC Generated pass\n");
1795 fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGenerated, kFALSE);
1797 // Step GeneratedZOutNoPileUp
1798 if((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (fCentralityF < 0)) return kFALSE;
1799 fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedZOutNoPileUpCentralityFine, kFALSE);
1800 //printf("In ProcessMCtrack %f\n",fCentralityF);
1802 // Step Generated Event Cut
1803 if(!fPassTheEventCut) return kFALSE;
1804 fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedEventCut, kFALSE);
1806 if(IsESDanalysis()){
1807 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepMCInAcceptance, track)) return kFALSE;
1808 fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCInAcceptance, kFALSE);
1813 //____________________________________________________________
1814 Bool_t AliAnalysisTaskHFE::PreSelectTrack(AliESDtrack *track) const {
1820 Bool_t survived = kTRUE;
1822 if(fCutspreselect) {
1823 //printf("test preselect\n");
1824 if(!fCutspreselect->IsSelected(track)) survived=kFALSE;
1826 //printf("survived %d\n",(Int_t)survived);
1828 if(survived && fPIDpreselect){
1830 AliHFEpidObject hfetrack;
1831 hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
1832 hfetrack.SetRecTrack(track);
1833 if(!fPIDpreselect->IsSelected(&hfetrack)) {
1834 //printf("Did not pass AliHFEcuts::kPID\n");
1837 //else printf("Pass AliHFEcuts::kPID\n");
1843 //____________________________________________________________
1844 void AliAnalysisTaskHFE::MakeEventContainer(){
1846 // Create the event container for the correction framework and link it
1847 // 1st bin: Vertex z-position
1848 // 2nd bin: V0AND decision (normalization to sigma_inel)
1849 // 3rd bin: Centrality class (for pp defined as number of contributors in vertex.)
1850 // 4th bin: Number of contributors > 0
1853 const Int_t kNvar = 4; // number of variables on the grid:
1854 Int_t nBins[kNvar] = {120, 2, 11, 2};
1855 Double_t binMin[kNvar] = {-30. , 0., 0.0, 0.};
1856 Double_t binMax[kNvar] = {30., 2., 11.0, 2.};
1858 AliCFContainer *evCont = new AliCFContainer("eventContainer", "Container for events", AliHFEcuts::kNcutStepsEvent, kNvar, nBins);
1860 Double_t *vertexBins = AliHFEtools::MakeLinearBinning(nBins[0], binMin[0], binMax[0]);
1861 Double_t *v0andBins = AliHFEtools::MakeLinearBinning(nBins[1], binMin[1], binMax[1]);
1862 Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBins[2], binMin[2], binMax[2]);
1863 Double_t *contributorsBins = AliHFEtools::MakeLinearBinning(nBins[3], binMin[3], binMax[3]);
1864 evCont->SetBinLimits(0, vertexBins);
1865 evCont->SetBinLimits(1, v0andBins);
1866 evCont->SetBinLimits(2, centralityBins);
1867 evCont->SetBinLimits(3, contributorsBins);
1868 delete[] vertexBins; delete[] v0andBins; delete[] centralityBins; delete[] contributorsBins;
1870 fCFM->SetEventContainer(evCont);
1873 //____________________________________________________________
1874 void AliAnalysisTaskHFE::MakeParticleContainer(){
1876 // Create the particle container for the correction framework manager and
1879 if(!fContainer) fContainer = new AliHFEcontainer("trackContainer");
1880 fVarManager->DefineVariables(fContainer);
1882 // Create Correction Framework containers
1883 fContainer->CreateContainer("MCTrackCont", "Track Container filled with MC information", AliHFEcuts::kNcutStepsMCTrack);
1884 fContainer->CreateContainer("recTrackContReco", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());
1885 fContainer->CreateContainer("recTrackContMC", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());
1887 fContainer->CreateContainer("hadronicBackground", "Container for Hadronic Background", 3);
1888 fContainer->CreateContainer("recTrackContDEReco", "Container for displaced electron analysis with Reco information", 1);
1889 fContainer->CreateContainer("recTrackContDEMC", "Container for displaced electron analysis with MC information", 1);
1890 fContainer->CreateContainer("recTrackContSecvtxReco", "Container for secondary vertexing analysis with Reco information", 1);
1891 fContainer->CreateContainer("recTrackContSecvtxMC", "Container for secondary vertexing analysis with MC information", 1);
1894 fContainer->CreateContainer("conversionElecs", "Container for weighted conversion electrons",7);
1895 fContainer->CreateContainer("mesonElecs", "Container for weighted electrons from meson decays",7);
1896 fContainer->Sumw2("conversionElecs");
1897 fContainer->Sumw2("mesonElecs");
1899 if(fisNonHFEsystematics){
1900 const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
1901 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
1902 for(Int_t iSource = 0; iSource < kElecBgSpecies; iSource++){
1903 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1904 fContainer->CreateContainer(Form("conversionElecs%s%s",sourceName[iSource],levelName[iLevel]), Form("Container for weighted conversion electrons from %s grandm., %s level",sourceName[iSource],levelName[iLevel]),5);
1905 fContainer->CreateContainer(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]), Form("Container for weighted electrons from %s decays, %s level",sourceName[iSource],levelName[iLevel]),5);
1906 fContainer->Sumw2(Form("conversionElecs%s%s",sourceName[iSource],levelName[iLevel]));
1907 fContainer->Sumw2(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]));
1912 //fContainer->CreateContainer("charmElecs", "Container for weighted charm electrons",2);
1915 fContainer->CreateCorrelationMatrix("correlationstepafterPID","THnSparse with correlations");
1916 fContainer->CreateCorrelationMatrix("correlationstepafterDE","THnSparse with correlations");
1917 if(!fVarManager->IsVariableDefined("centrality")) {
1918 //printf("Create the two other correlation maps\n");
1919 fContainer->CreateCorrelationMatrix("correlationstepbeforePID","THnSparse with correlations");
1920 fContainer->CreateCorrelationMatrix("correlationstepafterTOF","THnSparse with correlations");
1923 // Define the step names
1924 for(UInt_t istep = 0; istep < AliHFEcuts::kNcutStepsMCTrack; istep++){
1925 fContainer->SetStepTitle("MCTrackCont", AliHFEcuts::MCCutName(istep), istep);
1927 for(UInt_t istep = 0; istep < AliHFEcuts::kNcutStepsRecTrack; istep++){
1928 fContainer->SetStepTitle("recTrackContReco", AliHFEcuts::RecoCutName(istep), istep);
1929 fContainer->SetStepTitle("recTrackContMC", AliHFEcuts::RecoCutName(istep), istep);
1931 for(UInt_t ipid = 0; ipid < fPID->GetNumberOfPIDdetectors(); ipid++){
1932 fContainer->SetStepTitle("recTrackContReco", fPID->SortedDetectorName(ipid), AliHFEcuts::kNcutStepsRecTrack + ipid);
1933 fContainer->SetStepTitle("recTrackContMC", fPID->SortedDetectorName(ipid), AliHFEcuts::kNcutStepsRecTrack + ipid);
1936 //____________________________________________________________
1937 void AliAnalysisTaskHFE::InitContaminationQA(){
1939 // Add QA for Impact Parameter cut
1942 TObjArray *array = fVarManager->GetVariables();
1943 Int_t nvars = array->GetEntriesFast();
1944 for(Int_t v = 0; v < nvars; v++) {
1945 AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);
1946 if(!variable) continue;
1947 TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());
1948 if(!name.CompareTo("pt")) {
1949 const Int_t nBinPt = variable->GetNumberOfBins();
1950 const Double_t *kPtRange = variable->GetBinning();
1952 fQACollection->CreateTH1Farray("hadronsBeforeIPcut", "Hadrons before IP cut", nBinPt, kPtRange);
1953 fQACollection->CreateTH1Farray("hadronsAfterIPcut", "Hadrons after IP cut", nBinPt, kPtRange);
1955 fQACollection->CreateTH2Farray("Ke3Kecorr", "Ke3 decay e and K correlation; Ke3K p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
1956 fQACollection->CreateTH2Farray("Ke3K0Lecorr", "Ke3 decay e and K0L correlation; Ke3K0L p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
1957 fQACollection->CreateTH1Farray("Kptspectra", "Charged Kaons: MC p_{t} ", nBinPt, kPtRange);
1958 fQACollection->CreateTH1Farray("K0Lptspectra", "K0L: MC p_{t} ", nBinPt, kPtRange);
1960 const Double_t kDCAbound[2] = {-0.2, 0.2};
1962 const Int_t nDimDca=6;
1963 const Int_t nBinDca[nDimDca] = { 8, nBinPt, 800, 12, 6, 2};
1964 Double_t minimaDca[nDimDca] = { -1., 0., kDCAbound[0], -1., -1, -1.1};
1965 Double_t maximaDca[nDimDca] = { 7., 20., kDCAbound[1], 11., 5, 1.1};
1967 Double_t *sourceBins = AliHFEtools::MakeLinearBinning(nBinDca[0], minimaDca[0], maximaDca[0]);
1968 Double_t *dcaBins = AliHFEtools::MakeLinearBinning(nBinDca[2], minimaDca[2], maximaDca[2]);
1969 Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBinDca[3], minimaDca[3], maximaDca[3]);
1970 Double_t *v0PIDBins = AliHFEtools::MakeLinearBinning(nBinDca[4], minimaDca[4], maximaDca[4]);
1971 Double_t *chargeBins = AliHFEtools::MakeLinearBinning(nBinDca[5], minimaDca[5], maximaDca[5]);
1973 fQACollection->CreateTHnSparseNoLimits("Dca", "Dca; source (0-all, 1-charm,etc); pT [GeV/c]; dca; centrality bin; v0pid; charge", nDimDca, nBinDca);
1974 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(0, sourceBins);
1975 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(1, kPtRange);
1976 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(2, dcaBins);
1977 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(3, centralityBins);
1978 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(4, v0PIDBins);
1979 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(5, chargeBins);
1987 //____________________________________________________________
1988 void AliAnalysisTaskHFE::InitHistoITScluster(){
1990 // Initialize a temporary histogram to monitor the chi2/ITS cluster
1992 const Int_t kNDim = 7;
1993 const Int_t kNBins[kNDim] = {88, 20,90,11, 160, 2, 1000};
1994 const Double_t kMin[kNDim] = {0.1, -1,0, 0.,0., 0, 0.};
1995 const Double_t kMax[kNDim] = {20., 1, 2.*TMath::Pi(), 11.,160, 2, 100.};
1996 fQACollection->CreateTHnSparse("fChi2perITScluster", "chi2/ITS cluster; p_{T} (GeV/c);eta;phi; centrality class;nclus;sharebit; #chi^{2}/ITS cluster", kNDim, kNBins, kMin, kMax);
1997 fQACollection->BinLogAxis("fChi2perITScluster", 0);
2001 const Int_t kNDim = 3;
2002 const Int_t kNBins[kNDim] = {44, 11, 1000};
2003 const Double_t kMin[kNDim] = {0.1, 0., 0.};
2004 const Double_t kMax[kNDim] = {20., 11., 100.};
2005 fQACollection->CreateTHnSparse("fChi2perITScluster", "chi2/ITS cluster; p_{T} (GeV/c); centrality class; #chi^{2}/ITS cluster", kNDim, kNBins, kMin, kMax);
2006 fQACollection->BinLogAxis("fChi2perITScluster", 0);
2010 //____________________________________________________________
2011 void AliAnalysisTaskHFE::SelectSpecialTrigger(const Char_t *trgclust, Int_t runMin, Int_t runMax){
2013 // Select only events triggered by a special trigeer cluster
2015 if(!fSpecialTrigger) fSpecialTrigger = new AliOADBContainer("SpecialTrigger");
2016 fSpecialTrigger->AppendObject(new TObjString(trgclust), runMin, runMax);
2019 //____________________________________________________________
2020 const Char_t * AliAnalysisTaskHFE::GetSpecialTrigger(Int_t run){
2022 // Derive selected trigger string for given run
2024 if(!fSpecialTrigger) return NULL;
2025 TObjString *trg = dynamic_cast<TObjString *>(fSpecialTrigger->GetObject(run));
2026 if(!trg) return NULL;
2027 return trg->String().Data();
2030 //____________________________________________________________
2031 void AliAnalysisTaskHFE::PrintStatus() const {
2033 // Print Analysis status
2035 printf("\n\tAnalysis Settings\n\t========================================\n\n");
2036 printf("\tSecondary Vertex finding: %s\n", GetPlugin(kSecVtx) ? "YES" : "NO");
2037 printf("\tPrimary Vertex resolution: %s\n", GetPlugin(kPriVtx) ? "YES" : "NO");
2038 printf("\tDisplaced electron analysis step: %s\n", GetPlugin(kDEstep) ? "YES" : "NO");
2039 printf("\tTagged Track Analysis: %s\n", GetPlugin(kTaggedTrackAnalysis) ? "YES" : "NO");
2041 printf("\tParticle Identification Detectors:\n");
2042 fPID->PrintStatus();
2045 printf("\t\tPID: %s\n", IsQAOn(kPIDqa) ? "YES" : "NO");
2046 printf("\t\tCUTS: %s\n", (fCuts != NULL && fCuts->IsQAOn()) ? "YES" : "NO");
2047 printf("\t\tMC: %s\n", IsQAOn(kMCqa) ? "YES" : "NO");
2051 //____________________________________________________________
2052 Bool_t AliAnalysisTaskHFE::FillProductionVertex(const AliVParticle * const track) const{
2054 // Find the production vertex of the associated MC track
2056 if(!fMCEvent) return kFALSE;
2057 const AliVParticle *mctrack = NULL;
2058 TString objectType = track->IsA()->GetName();
2059 if(objectType.CompareTo("AliESDtrack") == 0 || objectType.CompareTo("AliAODTrack") == 0){
2060 // Reconstructed track
2061 mctrack = fMCEvent->GetTrack(TMath::Abs(track->GetLabel()));
2067 if(!mctrack) return kFALSE;
2072 if(TString(mctrack->IsA()->GetName()).CompareTo("AliMCParticle") == 0){
2074 const AliMCParticle *mcpart = dynamic_cast<const AliMCParticle *>(mctrack);
2080 // case AODMCParticle
2081 const AliAODMCParticle *mcpart = dynamic_cast<const AliAODMCParticle *>(mctrack);
2088 //printf("xv %f, yv %f\n",xv,yv);
2089 fQACollection->Fill("radius", TMath::Abs(xv),TMath::Abs(yv));
2094 //__________________________________________
2095 void AliAnalysisTaskHFE::SwitchOnPlugin(Int_t plug){
2099 // - Primary vertex studies
2100 // - Secondary vertex Studies
2101 // - Post Processing
2104 case kPriVtx: SETBIT(fPlugins, plug); break;
2105 case kSecVtx: SETBIT(fPlugins, plug); break;
2106 case kIsElecBackGround: SETBIT(fPlugins, plug); break;
2107 case kPostProcess: SETBIT(fPlugins, plug); break;
2108 case kDEstep: SETBIT(fPlugins, plug); break;
2109 case kTaggedTrackAnalysis: SETBIT(fPlugins, plug); break;
2110 case kNonPhotonicElectron: SETBIT(fPlugins, plug); break;
2111 default: AliError("Unknown Plugin");
2114 //__________________________________________
2115 Bool_t AliAnalysisTaskHFE::ProcessCutStep(Int_t cutStep, AliVParticle *track){
2117 // Check single track cuts for a given cut step
2118 // Fill the particle container
2120 const Int_t kMCOffset = AliHFEcuts::kNcutStepsMCTrack;
2121 if(!fCFM->CheckParticleCuts(cutStep + kMCOffset, track)) return kFALSE;
2122 if(fVarManager->IsSignalTrack()) {
2123 fVarManager->FillContainer(fContainer, "recTrackContReco", cutStep, kFALSE);
2124 fVarManager->FillContainer(fContainer, "recTrackContMC", cutStep, kTRUE);
2128 //___________________________________________________
2129 Bool_t AliAnalysisTaskHFE::ReadCentrality() {
2131 // Recover the centrality of the event from ESD or AOD
2134 Float_t fCentralityLimitstemp[12];
2135 Float_t fCentralityLimitsdefault[12]= {0.,5.,10., 20., 30., 40., 50., 60.,70.,80., 90., 100.00001};
2136 if(!fPbPbUserCentralityBinning) memcpy(fCentralityLimitstemp,fCentralityLimitsdefault,sizeof(fCentralityLimitsdefault));
2137 else memcpy(fCentralityLimitstemp,fCentralityLimits,sizeof(fCentralityLimitsdefault));
2141 if(IsPbPb()||IspPb()) {
2143 AliCentrality *centrality = fInputEvent->GetCentrality();
2144 fCentralityPercent = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
2145 //printf("centrality %f\n",fCentralityPercent);
2147 for(Int_t ibin = 0; ibin < 11; ibin++){
2148 if(fCentralityPercent >= fCentralityLimitstemp[ibin] && fCentralityPercent < fCentralityLimitstemp[ibin+1]){
2150 //printf("test bin %f, low %f, high %f, %d\n",fCentralityPercent,fCentralityLimitstemp[ibin],fCentralityLimitstemp[ibin+1],ibin);
2155 if(bin == -1) bin = 11; // Overflow
2157 // PP: Tracklet multiplicity, use common definition
2158 Int_t itsMultiplicity = GetITSMultiplicity(fInputEvent);
2159 Int_t multiplicityLimits[8] = {0, 1, 9, 17, 25, 36, 60, 500};
2160 for(Int_t ibin = 0; ibin < 7; ibin++){
2161 if(itsMultiplicity >= multiplicityLimits[ibin] && itsMultiplicity < multiplicityLimits[ibin + 1]){
2166 if(bin == -1) bin = 7; // Overflow
2169 AliDebug(2, Form("Centrality class %d\n", fCentralityF));
2172 // contributors, to be outsourced
2173 const AliVVertex *vtx;
2174 if(IsAODanalysis()){
2175 AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
2177 AliError("AOD Event required for AOD Analysis");
2180 vtx = fAOD->GetPrimaryVertex();
2182 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
2184 AliError("ESD Event required for ESD Analysis");
2187 vtx = fESD->GetPrimaryVertex() ;
2190 fContributors = 0.5;
2194 Int_t contributorstemp = vtx->GetNContributors();
2195 if( contributorstemp <= 0) {
2196 fContributors = 0.5;
2197 //printf("Number of contributors %d and vz %f\n",contributorstemp,vtx->GetZ());
2199 else fContributors = 1.5;
2200 //printf("Number of contributors %d\n",contributorstemp);
2205 //___________________________________________________
2206 Int_t AliAnalysisTaskHFE::GetITSMultiplicity(AliVEvent *ev){
2208 // Definition of the Multiplicity according to the JPSI group (F. Kramer)
2210 Int_t nTracklets = 0;
2212 Double_t etaRange = 1.6;
2214 if (ev->IsA() == AliAODEvent::Class()) {
2215 AliAODTracklets *tracklets = ((AliAODEvent*)ev)->GetTracklets();
2216 nTracklets = tracklets->GetNumberOfTracklets();
2217 for (Int_t nn = 0; nn < nTracklets; nn++) {
2218 Double_t theta = tracklets->GetTheta(nn);
2219 Double_t eta = -TMath::Log(TMath::Tan(theta/2.0));
2220 if (TMath::Abs(eta) < etaRange) nAcc++;
2222 } else if (ev->IsA() == AliESDEvent::Class()) {
2223 nTracklets = ((AliESDEvent*)ev)->GetMultiplicity()->GetNumberOfTracklets();
2224 for (Int_t nn = 0; nn < nTracklets; nn++) {
2225 Double_t eta = ((AliESDEvent*)ev)->GetMultiplicity()->GetEta(nn);
2226 if (TMath::Abs(eta) < etaRange) nAcc++;
2233 //___________________________________________________
2234 void AliAnalysisTaskHFE::RejectionPileUpVertexRangeEventCut() {
2236 // Recover the centrality of the event from ESD or AOD
2238 if(IsAODanalysis()){
2240 AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
2242 AliError("AOD Event required for AOD Analysis");
2246 fIdentifiedAsPileUp = kFALSE;
2247 if(fRemovePileUp && fAOD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE;
2249 fIdentifiedAsOutInz = kFALSE;
2250 //printf("Z vertex %f and out %f\n",fAOD->GetPrimaryVertex()->GetZ(),fCuts->GetVertexRange());
2251 if(TMath::Abs(fAOD->GetPrimaryVertex()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
2253 fPassTheEventCut = kTRUE;
2254 if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fAOD)) fPassTheEventCut = kFALSE;
2259 AliDebug(3, "Processing ESD Centrality");
2260 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
2262 AliError("ESD Event required for ESD Analysis");
2266 fIdentifiedAsPileUp = kFALSE;
2267 if(fRemovePileUp && fESD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE;
2272 fIdentifiedAsOutInz = kFALSE;
2273 Bool_t findvertex = kTRUE;
2274 const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();
2275 if((!vtxESD) || (vtxESD->GetNContributors() <= 0)) findvertex = kFALSE;
2277 if(TMath::Abs(vtxESD->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
2281 fPassTheEventCut = kTRUE;
2282 if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) fPassTheEventCut = kFALSE;
2288 //___________________________________________________
2289 Bool_t AliAnalysisTaskHFE::CheckTRDTriggerESD(AliESDEvent *ev) {
2291 // Check TRD trigger; pPb settings
2293 Bool_t cint8=kFALSE;
2294 Bool_t cint7=kFALSE;
2295 Bool_t cint5=kFALSE;
2296 Bool_t cint8s=kFALSE;
2297 Bool_t cint7s=kFALSE;
2298 Bool_t cint7ppb=kFALSE;
2299 Bool_t trdtrgevent=kFALSE;
2301 // printf("TRIGGERS %s \n",ev->GetFiredTriggerClasses().Data());
2303 // mb selection of WU events
2304 if(fWhichTRDTrigger==1)
2306 if(ev->IsTriggerClassFired("CINT7WU-B-NOPF-ALL"))
2316 if(fWhichTRDTrigger==2)
2318 cint8= ev->IsTriggerClassFired("CINT8WUHSE-B-NOPF-CENT");
2319 cint7= ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT"); // pPb rare
2320 cint7ppb= ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-ALL"); // pPb mb
2321 cint8s= ev->IsTriggerClassFired("CINT7WUHSE-S-NOPF-CENT");
2322 cint7s= ev->IsTriggerClassFired("CINT8WUHSE-S-NOPF-CENT");
2323 cint5= (ev->IsTriggerClassFired("CINT5WU-B-NOPF-ALL")) &&
2324 (ev->GetHeader()->GetL1TriggerInputs() & (1 << 10));
2325 // printf("hse trigger %i %i %i %i %i \n",cint7,cint7ppb,cint8,cint7s,cint8s);
2326 if((cint7==kFALSE)&&(cint7ppb==kFALSE)&&(cint8==kFALSE)&&(cint7s==kFALSE)&&(cint8s==kFALSE)&&(cint5==kFALSE)) return kFALSE;
2337 if(fWhichTRDTrigger==3)
2339 cint8= ev->IsTriggerClassFired("CINT8WUHQU-B-NOPF-CENT");
2340 cint7= ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT"); // pPb rare
2341 cint7ppb= ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-ALL"); // pPb mb
2342 cint8s= ev->IsTriggerClassFired("CINT7WUHQU-S-NOPF-CENT");
2343 cint7s= ev->IsTriggerClassFired("CINT8WUHQU-S-NOPF-CENT");
2344 cint5= (ev->IsTriggerClassFired("CINT5WU-B-NOPF-ALL")) &&
2345 (ev->GetHeader()->GetL1TriggerInputs() & (1 << 12));
2346 // printf("hqu trigger %i %i %i %i %i \n",cint7,cint7ppb,cint8,cint7s,cint8s);
2347 if((cint7==kFALSE)&&(cint7ppb==kFALSE)&&(cint8==kFALSE)&&(cint7s==kFALSE)&&(cint8s==kFALSE)&&(cint5==kFALSE)) return kFALSE;
2355 if(fWhichTRDTrigger==4)
2357 // printf("trigger %i %i \n", ev->GetHeader()->IsTriggerInputFired("1HSE"),(ev->GetHeader()->GetL1TriggerInputs() & (1 << 10))); // bug in IsTriggerInputFired; reported in savannah
2359 if(ev->IsTriggerClassFired("CINT7WU-B-NOPF-ALL"))
2362 trginput=ev->GetHeader()->GetL1TriggerInputs() & (1 << 10); // HSE
2367 } else return kFALSE;
2368 } else return kFALSE;
2370 if(fWhichTRDTrigger==5)
2372 // printf("trigger %i %i \n", ev->GetHeader()->IsTriggerInputFired("1HQU"),(ev->GetHeader()->GetL1TriggerInputs() & (1 << 12))); // bug in IsTriggerInputFired; reported in savannah
2373 if(ev->IsTriggerClassFired("CINT7WU-B-NOPF-ALL"))
2377 trginput=ev->GetHeader()->GetL1TriggerInputs() & (1 << 12); //HQU
2378 // printf("triggerinput %i \n",trginput);
2383 } else return kFALSE;
2384 } else return kFALSE;
2393 //___________________________________________________
2394 Bool_t AliAnalysisTaskHFE::CheckTRDTrigger(AliVEvent *ev) {
2396 // Check TRD trigger; pPb settings
2399 fTRDTriggerAnalysis->CalcTriggers(ev);
2402 if(fWhichTRDTrigger==6)
2404 if(!fTRDTriggerAnalysis->IsFired(AliTRDTriggerAnalysis::kHSE))
2410 // DrawTRDTrigger(ev);
2418 if(fWhichTRDTrigger==7)
2421 if(!fTRDTriggerAnalysis->IsFired(AliTRDTriggerAnalysis::kHQU))
2427 // DrawTRDTrigger(ev);
2432 // HSE or HQU cleanup
2433 if(fWhichTRDTrigger==8)
2435 if((fTRDTriggerAnalysis->IsFired(AliTRDTriggerAnalysis::kHSE))||(fTRDTriggerAnalysis->IsFired(AliTRDTriggerAnalysis::kHQU)))
2437 // DrawTRDTrigger(ev);
2450 //___________________________________________________
2451 void AliAnalysisTaskHFE::DrawTRDTrigger(AliESDEvent *ev) {
2453 Int_t ntriggerbit=0;
2454 fQACollection->Fill("nTriggerBit",ntriggerbit);
2455 if(ev->IsTriggerClassFired("CINT7-B-NOPF-ALLNOTRD"))
2458 fQACollection->Fill("nTriggerBit",ntriggerbit);
2460 if(ev->IsTriggerClassFired("CINT7WU-B-NOPF-ALL"))
2463 fQACollection->Fill("nTriggerBit",ntriggerbit);
2464 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2466 fQACollection->Fill("nTriggerBit",ntriggerbit);
2468 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT")) {
2470 fQACollection->Fill("nTriggerBit",ntriggerbit);
2473 if(ev->IsTriggerClassFired("CINT7WUHJT-B-NOPF-CENT"))
2476 fQACollection->Fill("nTriggerBit",ntriggerbit);
2478 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2480 fQACollection->Fill("nTriggerBit",ntriggerbit);
2482 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT")) {
2484 fQACollection->Fill("nTriggerBit",ntriggerbit);
2485 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2487 fQACollection->Fill("nTriggerBit",ntriggerbit);
2491 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT"))
2494 fQACollection->Fill("nTriggerBit",ntriggerbit);
2495 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2497 fQACollection->Fill("nTriggerBit",ntriggerbit);
2499 if((!(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")))&&(!(ev->IsTriggerClassFired("CINT7WUHJT-B-NOPF-CENT")))) {
2501 fQACollection->Fill("nTriggerBit",ntriggerbit);
2504 Int_t nTrdTracks = ev->GetNumberOfTrdTracks();
2505 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2506 AliESDTrdTrack* trdTrack = ev->GetTrdTrack(iTrack);
2507 printf("GTU track %3i: pt = %5.1f, PID = %3i\n", iTrack, trdTrack->Pt(), trdTrack->GetPID());
2514 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT"))
2517 fQACollection->Fill("nTriggerBit",ntriggerbit);
2518 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT")) {
2520 fQACollection->Fill("nTriggerBit",ntriggerbit);
2522 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-FAST")){
2524 fQACollection->Fill("nTriggerBit",ntriggerbit);
2526 if((!(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT")))&&(!(ev->IsTriggerClassFired("CINT7WUHJT-B-NOPF-CENT")))) {
2528 fQACollection->Fill("nTriggerBit",ntriggerbit);
2530 Int_t nTrdTracks = ev->GetNumberOfTrdTracks();
2531 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2532 AliESDTrdTrack* trdTrack = ev->GetTrdTrack(iTrack);
2533 printf("HSE GTU track %3i: pt = %5.1f, PID = %3i\n", iTrack, trdTrack->Pt(), trdTrack->GetPID());
2541 if(ev->IsTriggerClassFired("CEMC7WUHEE-B-NOPF-CENT")) {
2543 fQACollection->Fill("nTriggerBit",ntriggerbit);
2545 if(ev->IsTriggerClassFired("CINT7WUHJT-B-NOPF-FAST")){
2547 fQACollection->Fill("nTriggerBit",ntriggerbit);
2549 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-FAST")){
2551 fQACollection->Fill("nTriggerBit",ntriggerbit);
2553 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-FAST")){
2555 fQACollection->Fill("nTriggerBit",ntriggerbit);
2556 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2558 fQACollection->Fill("nTriggerBit",ntriggerbit);
2561 if(ntriggerbit==0) fQACollection->Fill("nTriggerBit",1);
2565 //___________________________________________________
2566 Bool_t AliAnalysisTaskHFE::IsMCFakeTrack(const AliVTrack *const trk) const {
2568 // Check whether track is MC Fake track using the sign of the track label
2570 return trk->GetLabel() < 0;