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 "AliVVertex.h"
71 #include "AliHFEcollection.h"
72 #include "AliHFEcontainer.h"
73 #include "AliHFEcuts.h"
74 #include "AliHFEelecbackground.h"
75 #include "AliHFENonPhotonicElectron.h"
76 #include "AliHFEmcQA.h"
77 #include "AliHFEpairs.h"
78 #include "AliHFEpid.h"
79 #include "AliHFEpidQAmanager.h"
80 #include "AliHFEsecVtxs.h"
81 #include "AliHFEsecVtx.h"
82 #include "AliHFEsignalCuts.h"
83 #include "AliHFEtaggedTrackAnalysis.h"
84 #include "AliHFEtools.h"
85 #include "AliHFEvarManager.h"
86 #include "AliAnalysisTaskHFE.h"
87 #include "AliAODMCHeader.h"
88 #include "TClonesArray.h"
90 ClassImp(AliAnalysisTaskHFE)
92 //____________________________________________________________
93 AliAnalysisTaskHFE::AliAnalysisTaskHFE():
94 AliAnalysisTaskSE("PID efficiency Analysis")
96 , fAODArrayMCInfo(NULL)
100 , fFillSignalOnly(kTRUE)
101 , fFillNoCuts(kFALSE)
102 , fApplyCutAOD(kFALSE)
103 , fBackGroundFactorApply(kFALSE)
104 , fRemovePileUp(kFALSE)
105 , fIdentifiedAsPileUp(kFALSE)
106 , fIdentifiedAsOutInz(kFALSE)
107 , fPassTheEventCut(kFALSE)
108 , fRejectKinkMother(kTRUE)
109 , fisppMultiBin(kFALSE)
110 , fPbPbUserCentralityBinning(kFALSE)
111 , fRemoveFirstEvent(kFALSE)
112 , fisNonHFEsystematics(kFALSE)
113 , fSpecialTrigger(NULL)
115 , fCentralityPercent(-1)
116 , fCentralityEstimator("V0M")
118 , fWeightBackGround(0.)
124 , fTriggerAnalysis(NULL)
127 , fPIDpreselect(NULL)
129 , fTaggedTrackCuts(NULL)
130 , fCleanTaggedTrack(kFALSE)
131 , fVariablesTRDTaggedTrack(kFALSE)
132 , fAnalysisUtils(NULL)
133 , fCutspreselect(NULL)
135 , fElecBackGround(NULL)
137 , fTaggedTrackAnalysis(NULL)
139 , fBackgroundSubtraction(NULL)
140 , fTRDTrigger(kFALSE)
141 , fWhichTRDTrigger(0)
146 , fHistELECBACKGROUND(NULL)
147 , fQACollection(NULL)
152 memset(fElecBackgroundFactor, 0, sizeof(Double_t) * kElecBgSpecies * kBgPtBins * kCentBins * kBgLevels);
153 memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);
154 memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));
155 memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));
156 memset(fCentralityLimits, 0, sizeof(Float_t) * 12);
161 //____________________________________________________________
162 AliAnalysisTaskHFE::AliAnalysisTaskHFE(const char * name):
163 AliAnalysisTaskSE(name)
165 , fAODArrayMCInfo(NULL)
168 , fCollisionSystem(3)
169 , fFillSignalOnly(kTRUE)
170 , fFillNoCuts(kFALSE)
171 , fApplyCutAOD(kFALSE)
172 , fBackGroundFactorApply(kFALSE)
173 , fRemovePileUp(kFALSE)
174 , fIdentifiedAsPileUp(kFALSE)
175 , fIdentifiedAsOutInz(kFALSE)
176 , fPassTheEventCut(kFALSE)
177 , fRejectKinkMother(kTRUE)
178 , fisppMultiBin(kFALSE)
179 , fPbPbUserCentralityBinning(kFALSE)
180 , fRemoveFirstEvent(kFALSE)
181 , fisNonHFEsystematics(kFALSE)
182 , fSpecialTrigger(NULL)
184 , fCentralityPercent(-1)
185 , fCentralityEstimator("V0M")
187 , fWeightBackGround(0.)
193 , fTriggerAnalysis(NULL)
196 , fPIDpreselect(NULL)
198 , fTaggedTrackCuts(NULL)
199 , fCleanTaggedTrack(kFALSE)
200 , fVariablesTRDTaggedTrack(kFALSE)
201 , fAnalysisUtils(NULL)
202 , fCutspreselect(NULL)
204 , fElecBackGround(NULL)
206 , fTaggedTrackAnalysis(NULL)
208 , fBackgroundSubtraction(NULL)
209 , fTRDTrigger(kFALSE)
210 , fWhichTRDTrigger(0)
215 , fHistELECBACKGROUND(NULL)
219 // Default constructor
221 DefineOutput(1, TList::Class());
222 DefineOutput(2, TList::Class());
224 fPID = new AliHFEpid("hfePid");
225 fPIDqa = new AliHFEpidQAmanager;
226 fVarManager = new AliHFEvarManager("hfeVarManager");
227 fAnalysisUtils = new AliAnalysisUtils;
229 memset(fElecBackgroundFactor, 0, sizeof(Double_t) * kElecBgSpecies * kBgPtBins * kCentBins * kBgLevels);
230 memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);
231 memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));
232 memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));
233 memset(fCentralityLimits, 0, sizeof(Float_t) * 12);
238 //____________________________________________________________
239 AliAnalysisTaskHFE::AliAnalysisTaskHFE(const AliAnalysisTaskHFE &ref):
240 AliAnalysisTaskSE(ref)
242 , fAODArrayMCInfo(NULL)
245 , fCollisionSystem(ref.fCollisionSystem)
246 , fFillSignalOnly(ref.fFillSignalOnly)
247 , fFillNoCuts(ref.fFillNoCuts)
248 , fApplyCutAOD(ref.fApplyCutAOD)
249 , fBackGroundFactorApply(ref.fBackGroundFactorApply)
250 , fRemovePileUp(ref.fRemovePileUp)
251 , fIdentifiedAsPileUp(ref.fIdentifiedAsPileUp)
252 , fIdentifiedAsOutInz(ref.fIdentifiedAsOutInz)
253 , fPassTheEventCut(ref.fPassTheEventCut)
254 , fRejectKinkMother(ref.fRejectKinkMother)
255 , fisppMultiBin(ref.fisppMultiBin)
256 , fPbPbUserCentralityBinning(ref.fPbPbUserCentralityBinning)
257 , fRemoveFirstEvent(ref.fRemoveFirstEvent)
258 , fisNonHFEsystematics(ref.fisNonHFEsystematics)
259 , fSpecialTrigger(ref.fSpecialTrigger)
260 , fCentralityF(ref.fCentralityF)
261 , fCentralityPercent(ref.fCentralityPercent)
262 , fCentralityEstimator(ref.fCentralityEstimator)
263 , fContributors(ref.fContributors)
264 , fWeightBackGround(ref.fWeightBackGround)
270 , fTriggerAnalysis(NULL)
273 , fPIDpreselect(NULL)
275 , fTaggedTrackCuts(NULL)
276 , fCleanTaggedTrack(ref.fCleanTaggedTrack)
277 , fVariablesTRDTaggedTrack(ref.fVariablesTRDTaggedTrack)
278 , fAnalysisUtils(NULL)
279 , fCutspreselect(NULL)
281 , fElecBackGround(NULL)
283 , fTaggedTrackAnalysis(NULL)
285 , fBackgroundSubtraction(NULL)
286 , fTRDTrigger(ref.fTRDTrigger)
287 , fWhichTRDTrigger(ref.fWhichTRDTrigger)
292 , fHistELECBACKGROUND(NULL)
293 , fQACollection(NULL)
301 //____________________________________________________________
302 AliAnalysisTaskHFE &AliAnalysisTaskHFE::operator=(const AliAnalysisTaskHFE &ref){
304 // Assignment operator
311 //____________________________________________________________
312 void AliAnalysisTaskHFE::Copy(TObject &o) const {
314 // Copy into object o
316 AliAnalysisTaskHFE &target = dynamic_cast<AliAnalysisTaskHFE &>(o);
317 target.fAODMCHeader = fAODMCHeader;
318 target.fAODArrayMCInfo = fAODArrayMCInfo;
319 target.fQAlevel = fQAlevel;
320 target.fPlugins = fPlugins;
321 target.fCollisionSystem = fCollisionSystem;
322 target.fFillSignalOnly = fFillSignalOnly;
323 target.fFillNoCuts = fFillNoCuts;
324 target.fApplyCutAOD = fApplyCutAOD;
325 target.fBackGroundFactorApply = fBackGroundFactorApply;
326 target.fRemovePileUp = fRemovePileUp;
327 target.fIdentifiedAsPileUp = fIdentifiedAsPileUp;
328 target.fIdentifiedAsOutInz = fIdentifiedAsOutInz;
329 target.fPassTheEventCut = fPassTheEventCut;
330 target.fRejectKinkMother = fRejectKinkMother;
331 target.fisppMultiBin = fisppMultiBin;
332 target.fPbPbUserCentralityBinning = fPbPbUserCentralityBinning;
333 target.fRemoveFirstEvent = fRemoveFirstEvent;
334 target.fisNonHFEsystematics = fisNonHFEsystematics;
335 target.fSpecialTrigger = fSpecialTrigger;
336 target.fCentralityF = fCentralityF;
337 target.fCentralityPercent = fCentralityPercent;
338 target.fCentralityEstimator = fCentralityEstimator;
339 target.fContributors = fContributors;
340 target.fWeightBackGround = fWeightBackGround;
342 target.fContainer = fContainer;
343 target.fVarManager = fVarManager;
344 target.fSignalCuts = fSignalCuts;
346 target.fTriggerAnalysis = fTriggerAnalysis;
348 target.fPIDqa = fPIDqa;
349 target.fPIDpreselect = fPIDpreselect;
350 target.fCuts = fCuts;
351 target.fTaggedTrackCuts = fTaggedTrackCuts;
352 target.fCleanTaggedTrack = fCleanTaggedTrack;
353 target.fVariablesTRDTaggedTrack = fVariablesTRDTaggedTrack;
354 target.fAnalysisUtils = fAnalysisUtils;
355 target.fCutspreselect = fCutspreselect;
356 target.fSecVtx = fSecVtx;
357 target.fElecBackGround = fElecBackGround;
358 target.fMCQA = fMCQA;
359 target.fTaggedTrackAnalysis = fTaggedTrackAnalysis;
360 target.fExtraCuts = fExtraCuts;
361 target.fBackgroundSubtraction = fBackgroundSubtraction;
362 target.fTRDTrigger = fTRDTrigger;
363 target.fWhichTRDTrigger = fWhichTRDTrigger;
365 target.fOutput = fOutput;
366 target.fHistMCQA = fHistMCQA;
367 target.fHistSECVTX = fHistSECVTX;
368 target.fHistELECBACKGROUND = fHistELECBACKGROUND;
369 target.fQACollection = fQACollection;
372 //____________________________________________________________
373 AliAnalysisTaskHFE::~AliAnalysisTaskHFE(){
377 if(fPID) delete fPID;
378 if(fPIDpreselect) delete fPIDpreselect;
379 if(fVarManager) delete fVarManager;
380 if(fCFM) delete fCFM;
381 if(fTriggerAnalysis) delete fTriggerAnalysis;
382 if(fSignalCuts) delete fSignalCuts;
383 if(fSecVtx) delete fSecVtx;
384 if(fMCQA) delete fMCQA;
385 if(fElecBackGround) delete fElecBackGround;
386 if(fBackgroundSubtraction) delete fBackgroundSubtraction;
387 if(fSpecialTrigger) delete fSpecialTrigger;
388 if(fAnalysisUtils) delete fAnalysisUtils;
389 // Delete output objects only if we are not running in PROOF mode because otherwise this produces a crash during merging
390 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
391 if(mgr && mgr->GetAnalysisType() != AliAnalysisManager::kProofAnalysis){
392 if(fPIDqa) delete fPIDqa;
393 if(fOutput) delete fOutput;
398 //____________________________________________________________
399 void AliAnalysisTaskHFE::UserCreateOutputObjects(){
401 // Creating output container and output objects
402 // Here we also Initialize the correction framework container and
407 // QA histograms are created if requested
408 // Called once per worker
410 AliDebug(3, "Creating Output Objects");
412 // Make lists for Output
413 if(!fQA) fQA = new TList;
415 if(!fOutput) fOutput = new TList;
418 // Automatic determination of the analysis mode
419 AliVEventHandler *inputHandler = dynamic_cast<AliVEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
420 if(!TString(inputHandler->IsA()->GetName()).CompareTo("AliAODInputHandler")){
424 if(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler())
427 printf("Analysis Mode: %s Analysis\n", IsAODanalysis() ? "AOD" : "ESD");
428 printf("MC Data available %s\n", HasMCData() ? "Yes" : "No");
430 // Enable Trigger Analysis
431 fTriggerAnalysis = new AliTriggerAnalysis;
432 fTriggerAnalysis->EnableHistograms();
433 fTriggerAnalysis->SetAnalyzeMC(HasMCData());
435 // First Part: Make QA histograms
436 fQACollection = new AliHFEcollection("TaskQA", "QA histos from the Electron Task");
437 fQACollection->CreateTH1F("nElectronTracksEvent", "Number of Electron Candidates", 100, 0, 100);
438 fQACollection->CreateTH1F("nElectron", "Number of electrons", 100, 0, 100);
439 fQACollection->CreateTH2F("radius", "Production Vertex", 100, 0.0, 5.0, 100, 0.0, 5.0);
440 fQACollection->CreateTH1F("nTriggerBit", "Histo Trigger Bit", 22, 0, 22);
442 InitHistoITScluster();
443 InitContaminationQA();
444 fQA->Add(fQACollection);
447 fPID->SetHasMCData(HasMCData());
448 if(!fPID->GetNumberOfPIDdetectors()) fPID->AddDetector("TPC", 0);
450 AliInfo("PID QA switched on");
451 fPIDqa->Initialize(fPID);
452 fQA->Add(fPIDqa->MakeList("HFEpidQA"));
454 fPID->SortDetectors();
456 // Background subtraction-------------------------------------------------------------------
457 if (GetPlugin(kNonPhotonicElectron)) {
458 if(!fBackgroundSubtraction) fBackgroundSubtraction = new AliHFENonPhotonicElectron();
459 if(IsAODanalysis()) fBackgroundSubtraction->SetAOD(kTRUE);
460 fBackgroundSubtraction->Init();
461 fOutput->Add(fBackgroundSubtraction->GetListOutput());
463 //------------------------------------------------------------------------------------------
466 // Initialize correction Framework and Cuts
467 const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack + AliHFEcuts::kNcutStepsSecvtxTrack;
468 fCFM = new AliCFManager;
469 fCFM->SetNStepParticle(kNcutSteps);
470 MakeParticleContainer();
471 MakeEventContainer();
472 // Temporary fix: Initialize particle cuts with NULL
473 for(Int_t istep = 0; istep < kNcutSteps; istep++)
474 fCFM->SetParticleCutsList(istep, NULL);
476 AliWarning("Cuts not available. Default cuts will be used");
477 fCuts = new AliHFEcuts;
478 fCuts->CreateStandardCuts();
480 if(IsAODanalysis()) fCuts->SetAOD();
481 // Make clone for V0 tagging step
482 fCuts->Initialize(fCFM);
483 if(fCuts->IsQAOn()) fQA->Add(fCuts->GetQAhistograms());
484 fSignalCuts = new AliHFEsignalCuts("HFEsignalCuts", "HFE MC Signal definition");
485 fVarManager->SetSignalCuts(fSignalCuts);
487 // add output objects to the List
488 fOutput->AddAt(fContainer, 0);
489 fOutput->AddAt(fCFM->GetEventContainer(), 1);
491 // mcQA----------------------------------
492 if (HasMCData() && IsQAOn(kMCqa)) {
494 if(!fMCQA) fMCQA = new AliHFEmcQA;
495 if(!fHistMCQA) fHistMCQA = new TList();
496 fHistMCQA->SetOwner();
497 if(IsPbPb()) fMCQA->SetPbPb();
498 if(fisppMultiBin) fMCQA->SetPPMultiBin();
499 if(TestBit(kTreeStream)){
500 fMCQA->EnableDebugStreamer();
502 fMCQA->CreatDefaultHistograms(fHistMCQA);
503 fMCQA->SetBackgroundWeightFactor(fElecBackgroundFactor[0][0][0],fBinLimit);
507 // secvtx----------------------------------
508 if (GetPlugin(kSecVtx)) {
509 AliInfo("Secondary Vertex Analysis on");
510 if(!fSecVtx) fSecVtx = new AliHFEsecVtx;
511 fSecVtx->SetHasMCData(HasMCData());
513 if(!fHistSECVTX) fHistSECVTX = new TList();
514 fHistSECVTX->SetOwner();
515 fSecVtx->CreateHistograms(fHistSECVTX);
516 fOutput->Add(fHistSECVTX);
519 // background----------------------------------
520 if (GetPlugin(kIsElecBackGround)) {
521 AliInfo("Electron BackGround Analysis on");
522 if(!fElecBackGround){
523 AliWarning("ElecBackGround not available. Default elecbackground will be used");
524 fElecBackGround = new AliHFEelecbackground;
526 fElecBackGround->SetHasMCData(HasMCData());
528 if(!fHistELECBACKGROUND) fHistELECBACKGROUND = new TList();
529 fHistELECBACKGROUND->SetOwner();
530 fElecBackGround->CreateHistograms(fHistELECBACKGROUND);
531 fOutput->Add(fHistELECBACKGROUND);
535 if(GetPlugin(kTaggedTrackAnalysis)){
536 AliInfo("Analysis on V0-tagged tracks enabled");
537 fTaggedTrackAnalysis = new AliHFEtaggedTrackAnalysis(Form("taggedTrackAnalysis%s", GetName()));
538 fTaggedTrackAnalysis->SetCuts(fTaggedTrackCuts);
539 fTaggedTrackAnalysis->SetClean(fCleanTaggedTrack);
540 AliHFEvarManager *varManager = fTaggedTrackAnalysis->GetVarManager();
541 TObjArray *array = fVarManager->GetVariables();
542 Int_t nvars = array->GetEntriesFast();
544 for(Int_t v = 0; v < nvars; v++) {
545 AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);
546 if(!variable) continue;
547 TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());
548 if(!name.CompareTo("source")) namee = TString("species");
549 else namee = TString(name);
550 Int_t nbins = variable->GetNumberOfBins();
551 if(variable->HasUserDefinedBinning()){
552 varManager->AddVariable(namee, nbins, variable->GetBinning());
554 varManager->AddVariable(namee, nbins, variable->GetMinimum(), variable->GetMaximum());
556 //printf("For AliTaggedTrackAnalysis, had the variable %s and the one used %s\n",(const char*)variable->GetName(),(const char*) namee);
558 if(fPIDqa->HasHighResolutionHistos())
559 fTaggedTrackAnalysis->GetPIDqa()->SetHighResolutionHistos();
560 fTaggedTrackAnalysis->SetPID(fPID);
561 fTaggedTrackAnalysis->SetVariablesTRD(fVariablesTRDTaggedTrack);
562 fTaggedTrackAnalysis->InitContainer();
563 fOutput->Add(fTaggedTrackAnalysis->GetContainer());
564 fQA->Add(fTaggedTrackAnalysis->GetPIDQA());
565 fQA->Add(fTaggedTrackAnalysis->GetCutQA());
566 fQA->Add(fTaggedTrackAnalysis->GetQAcollection());
573 PostData(1, fOutput);
577 //____________________________________________________________
578 void AliAnalysisTaskHFE::UserExec(Option_t *){
583 //printf("test00\n");
585 AliDebug(3, "Starting Single Event Analysis");
587 AliError("Reconstructed Event not available");
588 //printf("Reconstructed Event not available");
591 if(HasMCData() && IsESDanalysis()){
592 AliDebug(4, Form("MC Event: %p", fMCEvent));
594 AliError("No MC Event, but MC Data required");
595 //printf("No MC Event, but MC Data required");
600 AliError("HFE cuts not available");
601 //printf("HFE cuts not available");
604 if(!fPID->IsInitialized()){
605 // Initialize PID with the given run number
606 fPID->InitializePID(fInputEvent->GetRunNumber());
609 if(fRemoveFirstEvent){
610 if(fAnalysisUtils->IsFirstEventInChunk(fInputEvent)) return;
613 AliESDEvent *ev = dynamic_cast<AliESDEvent *>(fInputEvent);
614 if(ev && fTRDTrigger)
616 if(!CheckTRDTrigger(ev)) return;
620 if(IsESDanalysis() && HasMCData()){
621 // Protect against missing MC trees
622 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
624 AliError("No MC Event Handler available");
627 if(!mcH->InitOk()) return;
628 if(!mcH->TreeK()) return;
629 if(!mcH->TreeTR()) return;
631 // Background subtraction-------------------------------------------------------------------
632 if(GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->SetMCEvent(fMCEvent);
633 //------------------------------------------------------------------------------------------
636 if(IsAODanalysis() && HasMCData()){
638 AliAODEvent *aodE = dynamic_cast<AliAODEvent *>(fInputEvent);
640 AliError("No AOD Event");
643 fAODMCHeader = dynamic_cast<AliAODMCHeader *>(fInputEvent->FindListObject(AliAODMCHeader::StdBranchName()));
645 AliError("No AliAODMCHeader");
646 //printf("No AliAODMCHeader");
649 fAODArrayMCInfo = dynamic_cast<TClonesArray *>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));
650 if(!fAODArrayMCInfo){
651 AliError("No AOD MC particles");
652 //printf("No AOD MC particles");
655 fSignalCuts->SetMCAODInfo(fAODArrayMCInfo);
656 // Background subtraction-------------------------------------------------------------------
657 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->SetAODArrayMCInfo(fAODArrayMCInfo);
658 //------------------------------------------------------------------------------------------
663 // need the centrality for everything (MC also)
665 if(!ReadCentrality()) fCentralityF = -1;
666 //printf("pass centrality\n");
667 //printf("Reading fCentralityF %d\n",fCentralityF);
669 // See if pile up and z in the range
670 RejectionPileUpVertexRangeEventCut();
674 // Protect agains missing
676 //printf("Has MC data\n");
677 fSignalCuts->SetMCEvent(fMCEvent);
678 ProcessMC(); // Run the MC loop + MC QA in case MC Data are available
681 AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();
683 AliDebug(1, "Using default PID Response");
684 pidResponse = AliHFEtools::GetDefaultPID(HasMCData(), fInputEvent->IsA() == AliESDEvent::Class());
686 fPID->SetPIDResponse(pidResponse);
687 if(fPIDpreselect) fPIDpreselect->SetPIDResponse(pidResponse);
689 // Background subtraction-------------------------------------------------------------------
690 if(GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->InitRun(fInputEvent,pidResponse);
691 //------------------------------------------------------------------------------------------
698 const char *specialTrigger = GetSpecialTrigger(fInputEvent->GetRunNumber());
699 // Check Trigger selection
701 AliDebug(2, Form("Special Trigger requested: %s", specialTrigger));
702 if(!(ev && ev->IsTriggerClassFired(specialTrigger))){
703 AliDebug(2, "Event not selected");
705 } else AliDebug(2, "Event Selected");
706 } else AliDebug(2, "No Special Trigger requested");
711 PostData(1, fOutput);
715 //____________________________________________________________
716 void AliAnalysisTaskHFE::Terminate(Option_t *){
718 // Terminate not implemented at the moment
722 //_______________________________________________________________
723 Bool_t AliAnalysisTaskHFE::IsEventInBinZero() {
728 //printf("test in IsEventInBinZero\n");
730 AliError("Reconstructed Event not available");
735 const AliVVertex *vertex = fInputEvent->GetPrimaryVertex();
736 if(!vertex) return kTRUE;
737 //if(vertex) return kTRUE;
740 if(fInputEvent->GetNumberOfTracks()<=0) return kTRUE;
741 //if(fInputEvent->GetNumberOfTracks()>0) return kTRUE;
747 //____________________________________________________________
748 void AliAnalysisTaskHFE::ProcessMC(){
750 // Runs the MC Loop (filling the container for the MC Cut Steps with the observables pt, eta and phi)
751 // In case MC QA is on also MC QA loop is done
753 AliDebug(3, "Processing MC Information");
754 Double_t eventContainer [4] = {0., 0., 0., 0.};
755 if(IsESDanalysis()) eventContainer[0] = fMCEvent->GetPrimaryVertex()->GetZ();
756 else eventContainer[0] = fAODMCHeader->GetVtxZ();
757 eventContainer[2] = fCentralityF;
758 eventContainer[3] = fContributors;
759 fVz = eventContainer[0];
760 //printf("z position is %f\n",eventContainer[0]);
761 //if(fCFM->CheckEventCuts(AliHFEcuts::kEventStepGenerated, fMCEvent))
762 fCFM->GetEventContainer()->Fill(eventContainer,AliHFEcuts::kEventStepGenerated);
763 Int_t nElectrons = 0;
765 if(!((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (fCentralityF < 0))){ //kStepMCGeneratedZOutNoPileUpCentralityFine
766 if (HasMCData() && IsQAOn(kMCqa)) {
767 AliDebug(2, "Running MC QA");
769 if(fMCEvent->Stack()){
770 fMCQA->SetMCEvent(fMCEvent);
771 fMCQA->SetGenEventHeader(fMCEvent->GenEventHeader());
772 fMCQA->SetCentrality(fCentralityF);
773 fMCQA->SetPercentrality(static_cast<Int_t>(fCentralityPercent));
774 if(IsPbPb()) { fMCQA->SetPbPb();}
777 if(fisppMultiBin) fMCQA->SetPPMultiBin();
782 fMCQA->GetMesonKine();
784 // loop over all tracks for decayed electrons
785 for (Int_t igen = 0; igen < fMCEvent->GetNumberOfTracks(); igen++){
786 TParticle* mcpart = fMCEvent->Stack()->Particle(igen);
787 if(!mcpart) continue;
788 fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kCharm);
789 fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kBeauty);
790 fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kCharm);
791 fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kBeauty);
792 fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kCharm, AliHFEmcQA::kElectronPDG); // no accept cut
793 fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kBeauty, AliHFEmcQA::kElectronPDG); // no accept cut
794 fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kOthers, AliHFEmcQA::kElectronPDG); // no accept cut
796 //fMCQA->EndOfEventAna(AliHFEmcQA::kCharm);
797 //fMCQA->EndOfEventAna(AliHFEmcQA::kBeauty);
800 } // end of MC QA loop
802 // -----------------------------------------------------------------
803 fCFM->SetMCEventInfo(fMCEvent);
804 // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);
806 fCFM->SetMCEventInfo(fInputEvent);
809 AliVParticle *mctrack = NULL;
810 Int_t numberofmctracks = 0;
812 numberofmctracks = fMCEvent->GetNumberOfTracks();
815 numberofmctracks = fAODArrayMCInfo->GetEntriesFast();
817 AliDebug(3, Form("Number of Tracks: %d",numberofmctracks));
818 //printf("Number of MC track %d\n",numberofmctracks);
819 for(Int_t imc = 0; imc <numberofmctracks; imc++){
820 if(IsESDanalysis()) {
821 if(!(mctrack = fMCEvent->GetTrack(imc))) continue;
824 if(!(mctrack = (AliVParticle *) fAODArrayMCInfo->At(imc))) continue;
826 //printf("Test in ProcessMC\n");
827 AliDebug(4, "Next MC Track");
828 if(ProcessMCtrack(mctrack)) nElectrons++;
831 // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);
832 fQACollection->Fill("nElectron", nElectrons);
835 //____________________________________________________________
836 void AliAnalysisTaskHFE::ProcessESD(){
838 // Run Analysis of reconstructed event in ESD Mode
839 // Loop over Tracks, filter according cut steps defined in AliHFEcuts
841 AliDebug(1, Form("Task %s", GetName()));
842 AliDebug(3, "Processing ESD Event");
843 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
845 AliError("ESD Event required for ESD Analysis");
849 // Set magnetic field if V0 task on
850 if(fTaggedTrackAnalysis) {
851 fTaggedTrackAnalysis->SetMagneticField(fESD->GetMagneticField());
852 fTaggedTrackAnalysis->SetCentrality(fCentralityF);
853 if(IsHeavyIon()) fTaggedTrackAnalysis->SetPbPb();
854 else fTaggedTrackAnalysis->SetPP();
857 // Do event Normalization
858 Double_t eventContainer[4];
859 eventContainer[0] = 0.;
860 if(HasMCData()) eventContainer[0] = fVz;
862 const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();
863 if(vtxESD) eventContainer[0] = vtxESD->GetZ();
865 eventContainer[1] = 0.;
866 eventContainer[2] = fCentralityF;
867 eventContainer[3] = fContributors;
868 if(fTriggerAnalysis->IsOfflineTriggerFired(fESD, AliTriggerAnalysis::kV0AND))
869 eventContainer[1] = 1.;
872 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);
875 if(fIdentifiedAsPileUp) return;
876 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);
879 if(TMath::Abs(fCentralityF) < 0) return;
880 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecCentralityOk);
881 //printf("In ProcessESD %f\n",fCentralityF);
884 if(fIdentifiedAsOutInz) return;
885 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange);
888 if(!fPassTheEventCut) return;
889 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);
892 fContainer->NewEvent();
894 if (GetPlugin(kIsElecBackGround)) {
895 fElecBackGround->SetEvent(fESD);
897 if (GetPlugin(kSecVtx)) {
898 fSecVtx->SetEvent(fESD);
899 fSecVtx->GetPrimaryCondition();
903 if (GetPlugin(kSecVtx)) {
904 fSecVtx->SetMCEvent(fMCEvent);
905 fSecVtx->SetMCQA(fMCQA);
907 if (GetPlugin(kIsElecBackGround)) {
908 fElecBackGround->SetMCEvent(fMCEvent);
912 Double_t container[10];
913 memset(container, 0, sizeof(Double_t) * 10);
914 // container for the output THnSparse
915 Double_t dataDca[6]; // [source, pT, dca, centrality]
916 Int_t nElectronCandidates = 0;
917 AliESDtrack *track = NULL, *htrack = NULL;
918 AliMCParticle *mctrack = NULL;
919 AliMCParticle *mctrackmother = NULL;
921 Bool_t signal = kTRUE;
923 fCFM->SetRecEventInfo(fESD);
925 // Get Number of contributors to the primary vertex for multiplicity-dependent correction
926 Int_t ncontribVtx = 0;
927 const AliESDVertex *priVtx = fESD->GetPrimaryVertexTracks();
929 ncontribVtx = priVtx->GetNContributors();
932 // minjung for IP QA(temporary ~ 2weeks)
934 fExtraCuts = new AliHFEextraCuts("hfetmpCuts","HFE tmp Cuts");
936 fExtraCuts->SetRecEventInfo(fESD);
938 // Electron background analysis
939 if (GetPlugin(kIsElecBackGround)) {
941 AliDebug(2, "Running BackGround Analysis");
943 fElecBackGround->Reset();
945 } // end of electron background analysis
948 // Background subtraction-------------------------------------------------------------------
949 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->FillPoolAssociatedTracks(fInputEvent, fCentralityF);
950 //------------------------------------------------------------------------------------------
955 AliDebug(3, Form("Number of Tracks: %d", fESD->GetNumberOfTracks()));
956 for(Int_t itrack = 0; itrack < fESD->GetNumberOfTracks(); itrack++){
957 AliDebug(4, "New ESD track");
958 track = fESD->GetTrack(itrack);
959 track->SetESDEvent(fESD);
961 // fill counts of v0-identified particles
963 if(track->TestBit(BIT(14))) v0pid = AliPID::kElectron;
964 else if(track->TestBit(BIT(15))) v0pid = AliPID::kPion;
965 else if(track->TestBit(BIT(16))) v0pid = AliPID::kProton;
966 // here the tagged track analysis will run
967 if(fTaggedTrackAnalysis && v0pid > -1){
968 AliDebug(1, Form("Track identified as %s", AliPID::ParticleName(v0pid)));
969 fTaggedTrackAnalysis->ProcessTrack(track, v0pid);
970 AliDebug(1, "V0 PID done");
974 //Fill non-HFE source containers at reconstructed events cut step
975 AliDebug(3, Form("Doing track %d, %p", itrack, track));
978 //////////////////////////////////////
980 //////////////////////////////////////
981 if(fPIDpreselect || fCutspreselect) {
982 if(!PreSelectTrack(track)) continue;
987 // Fill step without any cut
990 // Check if it is electrons near the vertex
991 if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel()))))) continue;
993 if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;
994 else AliDebug(3, "Signal Electron");
996 // Fill K pt for Ke3 contributions
997 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode())==321)) fQACollection->Fill("Kptspectra",mctrack->Pt());
998 else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode())==130)) fQACollection->Fill("K0Lptspectra",mctrack->Pt());
1000 // Cache new Track information inside the var manager
1001 fVarManager->NewTrack(track, mctrack, fCentralityF, -1, signal);
1004 if(signal || !fFillSignalOnly){
1005 fVarManager->FillContainer(fContainer, "recTrackContReco", AliHFEcuts::kStepRecNoCut, kFALSE);
1006 fVarManager->FillContainer(fContainer, "recTrackContMC", AliHFEcuts::kStepRecNoCut, kTRUE);
1010 // RecKine: ITSTPC cuts
1011 if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
1015 if(fRejectKinkMother) {
1016 if(track->GetKinkIndex(0) != 0) continue; } // Quick and dirty fix to reject both kink mothers and daughters
1017 if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
1019 // HFEcuts: ITS layers cuts
1020 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
1022 // HFE cuts: TOF PID and mismatch flag
1023 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTOF, track)) continue;
1025 // HFE cuts: TPC PID cleanup
1026 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
1028 // HFEcuts: Nb of tracklets TRD0
1029 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTRD, track)) continue;
1031 // Fill correlation maps before PID
1032 if(signal && fContainer->GetCorrelationMatrix("correlationstepbeforePID")) {
1033 //printf("Fill correlation maps before PID\n");
1034 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepbeforePID"));
1038 FillProductionVertex(track);
1040 if(fMCQA && signal){
1041 fMCQA->SetCentrality(fCentralityF);
1042 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){
1043 Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.};
1044 Double_t hfeimpactRtmp=0., hfeimpactnsigmaRtmp=0.;
1045 fExtraCuts->GetHFEImpactParameters(track, hfeimpactRtmp, hfeimpactnsigmaRtmp);
1046 UChar_t itsPixel = track->GetITSClusterMap();
1047 Double_t ilyrhit=0, ilyrstat=0;
1048 for(Int_t ilyr=0; ilyr<6; ilyr++){
1049 if(TESTBIT(itsPixel, ilyr)) ilyrhit += TMath::Power(2,ilyr);
1050 if(fExtraCuts->CheckITSstatus(fExtraCuts->GetITSstatus(track,ilyr))) ilyrstat += TMath::Power(2,ilyr);
1052 fMCQA->SetITSInfo(ilyrhit,ilyrstat);
1053 fMCQA->SetHFEImpactParameters(hfeimpactRtmp, hfeimpactnsigmaRtmp);
1054 fMCQA->SetTrkKine(track->Pt(),track->Eta(), track->Phi());
1055 fMCQA->SetContainerStep(3);
1056 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1057 weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
1058 if(!fisNonHFEsystematics || IsPbPb())break;
1061 if(fisNonHFEsystematics){
1062 //Fill additional containers for electron source distinction
1063 Int_t elecSource = 0;
1064 elecSource = fMCQA->GetElecSource(mctrack->Particle());
1065 const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
1066 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
1068 for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
1069 if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
1070 if(elecSource == iSource){
1071 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1072 if(weightElecBgV0[iLevel]>0){
1073 fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, weightElecBgV0[iLevel]);
1075 else if(weightElecBgV0[iLevel]<0){
1076 fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, -1*weightElecBgV0[iLevel]);
1083 if(iName == kElecBgSpecies)iName = 0;
1087 if(weightElecBgV0[0]>0) {
1088 fVarManager->FillContainer(fContainer, "conversionElecs", 3, kFALSE, weightElecBgV0[0]);
1089 fVarManager->FillContainer(fContainer, "conversionElecs", 4, kTRUE, weightElecBgV0[0]);
1091 else if(weightElecBgV0[0]<0) {
1092 fVarManager->FillContainer(fContainer, "mesonElecs", 3, kFALSE, -1*weightElecBgV0[0]);
1093 fVarManager->FillContainer(fContainer, "mesonElecs", 4, kTRUE, -1*weightElecBgV0[0]);
1099 Double_t hfeimpactR4all=0., hfeimpactnsigmaR4all=0.;
1100 Int_t sourceDca =-1;
1101 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 211)){
1103 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
1104 dataDca[0]=0; //pion
1105 dataDca[1]=track->Pt();
1106 dataDca[2]=hfeimpactR4all;
1107 dataDca[3]=fCentralityF;
1109 dataDca[5] = double(track->Charge());
1110 fQACollection->Fill("Dca", dataDca);
1113 else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){ // to increas statistics for Martin
1115 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
1116 if(fSignalCuts->IsCharmElectron(track)){
1119 else if(fSignalCuts->IsBeautyElectron(track)){
1122 else if(fSignalCuts->IsGammaElectron(track)){
1125 else if(fSignalCuts->IsNonHFElectron(track)){
1128 else if(fSignalCuts->IsJpsiElectron(track)){
1134 dataDca[0]=sourceDca;
1135 dataDca[1]=track->Pt();
1136 dataDca[2]=hfeimpactR4all;
1137 dataDca[3]=fCentralityF;
1139 dataDca[5] = double(track->Charge());
1140 if(signal) fQACollection->Fill("Dca", dataDca);
1145 AliHFEpidObject hfetrack;
1146 hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
1147 hfetrack.SetRecTrack(track);
1148 if(HasMCData()) hfetrack.SetMCTrack(mctrack);
1149 hfetrack.SetCentrality(fCentralityF);
1150 hfetrack.SetMulitplicity(ncontribVtx);
1151 if(IsHeavyIon()) hfetrack.SetPbPb();
1152 else hfetrack.SetPP();
1153 fPID->SetVarManager(fVarManager);
1154 if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue;
1155 nElectronCandidates++;
1157 // Background subtraction------------------------------------------------------------------------------------------
1158 if (GetPlugin(kNonPhotonicElectron)) {
1159 Int_t indexmother = -1;
1160 Int_t mcsource = -1;
1162 mcsource = fBackgroundSubtraction->FindMother(mctrack->GetLabel(),indexmother);
1164 fBackgroundSubtraction->LookAtNonHFE(itrack, track, fInputEvent, 1, fCentralityF, -1, mcsource, indexmother);
1166 //-----------------------------------------------------------------------------------------------------------------
1168 // Temporary histogram for chi2/ITS cluster
1170 TBits shared = track->GetTPCSharedMap();
1172 if(shared.CountBits() >= 2) sharebit=1;
1174 Double_t itschi2percluster = 0.0;
1175 Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));
1176 if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;
1178 Double_t itsChi2[7] = {track->Pt(),track->Eta(), track->Phi(),
1179 static_cast<Double_t>(fCentralityF),static_cast<Double_t>(track->GetTPCsignalN()), static_cast<Double_t>(sharebit),itschi2percluster};
1180 fQACollection->Fill("fChi2perITScluster", itsChi2);
1184 Double_t itschi2percluster = 0.0;
1185 Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));
1186 if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;
1188 Double_t itsChi2[3] = {track->Pt(), static_cast<Double_t>(fCentralityF), itschi2percluster};
1189 fQACollection->Fill("fChi2perITScluster", itsChi2);
1192 // Fill Histogram for Hadronic Background
1194 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11))
1195 fVarManager->FillContainer(fContainer, "hadronicBackground", UInt_t(0), kFALSE);
1197 // Fill Ke3 contributions
1198 Int_t glabel=TMath::Abs(mctrack->GetMother());
1199 if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
1200 if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==321)
1201 fQACollection->Fill("Ke3Kecorr",mctrack->Pt(),mctrackmother->Pt());
1202 else if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==130)
1203 fQACollection->Fill("Ke3K0Lecorr",mctrack->Pt(),mctrackmother->Pt());
1210 // Apply weight for background contamination
1211 if(fBackGroundFactorApply) {
1212 if(IsHeavyIon() && fCentralityF >= 0) fWeightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));
1213 else fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
1215 if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
1216 else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
1217 // weightBackGround as special weight
1218 fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);
1220 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));
1223 Bool_t bTagged=kFALSE;
1224 if(GetPlugin(kSecVtx)) {
1225 AliDebug(2, "Running Secondary Vertex Analysis");
1226 if(fSecVtx->Process(track) && signal) {
1227 fVarManager->FillContainer(fContainer, "recTrackContSecvtxReco", AliHFEcuts::kStepHFEcutsSecvtx, kFALSE);
1228 fVarManager->FillContainer(fContainer, "recTrackContSecvtxMC", AliHFEcuts::kStepHFEcutsSecvtx, kTRUE);
1233 // Electron background analysis
1234 if (GetPlugin(kIsElecBackGround)) {
1236 AliDebug(2, "Running BackGround Analysis");
1238 for(Int_t jtrack = 0; jtrack < fESD->GetNumberOfTracks(); jtrack++){
1239 htrack = fESD->GetTrack(jtrack);
1240 if ( itrack == jtrack ) continue;
1241 fElecBackGround->PairAnalysis(track, htrack);
1243 } // end of electron background analysis
1245 if (GetPlugin(kDEstep)) {
1246 Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.,};
1247 Int_t elecSource = 0;
1248 Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;
1249 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
1252 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
1253 fQACollection->Fill("hadronsBeforeIPcut",track->Pt());
1255 if(fMCQA && signal) {
1257 fMCQA->SetContainerStep(0);
1258 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1259 weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
1260 if(!fisNonHFEsystematics || IsPbPb())break;
1263 if(fisNonHFEsystematics){
1264 //Fill additional containers for electron source distinction
1265 elecSource = fMCQA->GetElecSource(mctrack->Particle());
1266 const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
1267 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
1269 for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
1270 if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
1271 if(elecSource == iSource){
1272 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1273 if(weightElecBgV0[iLevel]>0) fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 0, kFALSE, weightElecBgV0[iLevel]);
1274 else if(weightElecBgV0[iLevel]<0) fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 0, kFALSE, -1*weightElecBgV0[iLevel]);
1280 if(iName == kElecBgSpecies)iName = 0;
1284 if(weightElecBgV0[0]>0) {
1285 fVarManager->FillContainer(fContainer, "conversionElecs", 0, kFALSE, weightElecBgV0[0]);
1286 fVarManager->FillContainer(fContainer, "conversionElecs", 5, kTRUE, weightElecBgV0[0]);
1288 else if(weightElecBgV0[0]<0) {
1289 fVarManager->FillContainer(fContainer, "mesonElecs", 0, kFALSE, -1*weightElecBgV0[0]);
1290 fVarManager->FillContainer(fContainer, "mesonElecs", 5, kTRUE, -1*weightElecBgV0[0]);
1293 if(bTagged){ // bg estimation for the secondary vertex tagged signals
1294 if(weightElecBgV0[0]>0) fVarManager->FillContainer(fContainer, "conversionElecs", 2, kFALSE, weightElecBgV0[0]);
1295 else if(weightElecBgV0[0]<0) fVarManager->FillContainer(fContainer, "mesonElecs", 2, kFALSE, -1*weightElecBgV0[0]);
1300 dataDca[0]=-1; //for data, don't know the origin
1301 dataDca[1]=track->Pt();
1302 dataDca[2]=hfeimpactR;
1303 dataDca[3]=fCentralityF;
1305 dataDca[5] = double(track->Charge());
1306 if (!HasMCData()) fQACollection->Fill("Dca", dataDca);
1308 // Fill Containers for impact parameter analysis
1309 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;
1311 // Apply weight for background contamination after ip cut
1312 if(fBackGroundFactorApply) {
1313 fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
1314 if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
1315 else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
1316 // weightBackGround as special weight
1317 fVarManager->FillContainer(fContainer, "hadronicBackground", 2, kFALSE, fWeightBackGround);
1322 if(fMCQA && signal) {
1323 fMCQA->SetContainerStep(1);
1324 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1325 weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
1326 if(!fisNonHFEsystematics || IsPbPb())break;
1328 if(fisNonHFEsystematics){
1329 //Fill additional containers for electron source distinction
1330 elecSource = fMCQA->GetElecSource(mctrack->Particle());
1331 const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
1332 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
1334 for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
1335 if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
1336 if(elecSource == iSource){
1337 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1338 if(weightElecBgV0[iLevel]>0) fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 1, kFALSE, weightElecBgV0[iLevel]);
1339 else if(weightElecBgV0[iLevel]<0) fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 1, kFALSE, -1*weightElecBgV0[iLevel]);
1345 if(iName == kElecBgSpecies)iName = 0;
1349 if(weightElecBgV0[0]>0) {
1350 fVarManager->FillContainer(fContainer, "conversionElecs", 1, kFALSE, weightElecBgV0[0]);
1351 fVarManager->FillContainer(fContainer, "conversionElecs", 6, kTRUE, weightElecBgV0[0]);
1353 else if(weightElecBgV0[0]<0) {
1354 fVarManager->FillContainer(fContainer, "mesonElecs", 1, kFALSE, -1*weightElecBgV0[0]);
1355 fVarManager->FillContainer(fContainer, "mesonElecs", 6, kTRUE, -1*weightElecBgV0[0]);
1361 fVarManager->FillContainer(fContainer, "recTrackContDEReco", AliHFEcuts::kStepHFEcutsDca, kFALSE);
1362 fVarManager->FillContainer(fContainer, "recTrackContDEMC", AliHFEcuts::kStepHFEcutsDca, kTRUE);
1363 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterDE"));
1366 if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
1367 fQACollection->Fill("hadronsAfterIPcut",track->Pt());
1374 // Background subtraction-------------------------------------------------------------------
1375 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->CountPoolAssociated(fInputEvent, fCentralityF);
1376 //------------------------------------------------------------------------------------------
1378 fQACollection->Fill("nElectronTracksEvent", nElectronCandidates);
1381 //____________________________________________________________
1382 void AliAnalysisTaskHFE::ProcessAOD(){
1384 // Run Analysis in AOD Mode
1385 // Function is still in development
1387 //printf("Process AOD\n");
1388 AliDebug(3, "Processing AOD Event");
1389 Double_t eventContainer[4];
1390 eventContainer[0] = 0.0;
1391 if(HasMCData()) eventContainer[0] = fVz;
1393 if(fInputEvent->GetPrimaryVertex()) eventContainer[0] = fInputEvent->GetPrimaryVertex()->GetZ();
1395 eventContainer[1] = 1.; // No Information available in AOD analysis, assume all events have V0AND
1396 eventContainer[2] = fCentralityF;
1397 eventContainer[3] = fContributors;
1399 //printf("value event container %f, %f, %f, %f\n",eventContainer[0],eventContainer[1],eventContainer[2],eventContainer[3]);
1401 AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
1403 AliError("AOD Event required for AOD Analysis");
1407 //printf("Will fill\n");
1409 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);
1412 if(fIdentifiedAsPileUp) return;
1413 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);
1416 if(fIdentifiedAsOutInz) return;
1417 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange);
1420 if(!fPassTheEventCut) return;
1421 fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);
1424 fContainer->NewEvent();
1426 fCFM->SetRecEventInfo(fAOD);
1429 fExtraCuts = new AliHFEextraCuts("hfeExtraCuts","HFE Extra Cuts");
1431 fExtraCuts->SetRecEventInfo(fAOD);
1433 // Get Number of contributors to the primary vertex for multiplicity-dependent correction
1434 Int_t ncontribVtx = 0;
1435 AliAODVertex *priVtx = fAOD->GetPrimaryVertex();
1437 ncontribVtx = priVtx->GetNContributors();
1440 // Look for kink mother
1441 Int_t numberofvertices = fAOD->GetNumberOfVertices();
1442 Double_t listofmotherkink[numberofvertices];
1443 Int_t numberofmotherkink = 0;
1444 for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {
1445 AliAODVertex *aodvertex = fAOD->GetVertex(ivertex);
1446 if(!aodvertex) continue;
1447 if(aodvertex->GetType()==AliAODVertex::kKink) {
1448 AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();
1449 if(!mother) continue;
1450 Int_t idmother = mother->GetID();
1451 listofmotherkink[numberofmotherkink] = idmother;
1452 //printf("ID %d\n",idmother);
1453 numberofmotherkink++;
1456 //printf("Number of kink mother in the events %d\n",numberofmotherkink);
1458 // Background subtraction-------------------------------------------------------------------
1459 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->FillPoolAssociatedTracks(fInputEvent, fCentralityF);
1460 //------------------------------------------------------------------------------------------
1463 AliAODTrack *track = NULL;
1464 AliAODMCParticle *mctrack = NULL;
1465 Double_t dataDca[6]; // [source, pT, dca, centrality]
1466 Int_t nElectronCandidates = 0;
1469 //printf("Number of track %d\n",(Int_t) fAOD->GetNumberOfTracks());
1470 for(Int_t itrack = 0; itrack < fAOD->GetNumberOfTracks(); itrack++){
1471 track = fAOD->GetTrack(itrack); mctrack = NULL;
1472 if(!track) continue;
1477 Int_t label = TMath::Abs(track->GetLabel());
1478 if(label && label < fAODArrayMCInfo->GetEntriesFast())
1479 mctrack = dynamic_cast<AliAODMCParticle *>(fAODArrayMCInfo->At(label));
1480 if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;
1483 fVarManager->NewTrack(track, mctrack, fCentralityF, -1, signal);
1486 if(signal || !fFillSignalOnly){
1487 fVarManager->FillContainer(fContainer, "recTrackContReco", AliHFEcuts::kStepRecNoCut, kFALSE);
1488 fVarManager->FillContainer(fContainer, "recTrackContMC", AliHFEcuts::kStepRecNoCut, kTRUE);
1493 //printf("Apply cuts\n");
1494 // RecKine: ITSTPC cuts
1495 if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
1497 // Reject kink mother
1498 if(fRejectKinkMother) {
1499 Bool_t kinkmotherpass = kTRUE;
1500 for(Int_t kinkmother = 0; kinkmother < numberofmotherkink; kinkmother++) {
1501 if(track->GetID() == listofmotherkink[kinkmother]) {
1502 kinkmotherpass = kFALSE;
1506 if(!kinkmotherpass) continue;
1510 if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
1512 // HFEcuts: ITS layers cuts
1513 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
1515 // HFE cuts: TOF PID and mismatch flag
1516 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTOF, track)) continue;
1518 // HFE cuts: TPC PID cleanup
1519 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
1521 // HFEcuts: Nb of tracklets TRD0
1522 if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTRD, track)) continue;
1525 // Fill correlation maps before PID
1526 if(signal && fContainer->GetCorrelationMatrix("correlationstepbeforePID")) {
1527 //printf("Fill correlation maps before PID\n");
1528 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepbeforePID"));
1532 Double_t hfeimpactR4all=0., hfeimpactnsigmaR4all=0.;
1533 Int_t sourceDca =-1;
1534 if(mctrack && (TMath::Abs(mctrack->GetPdgCode()) == 211)){
1536 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
1537 dataDca[0]=0; //pion
1538 dataDca[1]=track->Pt();
1539 dataDca[2]=hfeimpactR4all;
1540 dataDca[3]=fCentralityF;
1541 dataDca[4] = -1; // not store V0 for the moment
1542 dataDca[5] = double(track->Charge());
1543 fQACollection->Fill("Dca", dataDca);
1546 else if(mctrack && (TMath::Abs(mctrack->GetPdgCode()) == 11)){ // to increas statistics for Martin
1548 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);
1549 if(fSignalCuts->IsCharmElectron(track)){
1552 else if(fSignalCuts->IsBeautyElectron(track)){
1555 else if(fSignalCuts->IsGammaElectron(track)){
1558 else if(fSignalCuts->IsNonHFElectron(track)){
1561 else if(fSignalCuts->IsJpsiElectron(track)){
1567 dataDca[0]=sourceDca;
1568 dataDca[1]=track->Pt();
1569 dataDca[2]=hfeimpactR4all;
1570 dataDca[3]=fCentralityF;
1571 dataDca[4] = -1; // not store V0 for the moment
1572 dataDca[5] = double(track->Charge());
1573 if(signal) fQACollection->Fill("Dca", dataDca);
1578 //printf("Will process to PID\n");
1580 // track accepted, do PID
1581 AliHFEpidObject hfetrack;
1582 hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);
1583 hfetrack.SetRecTrack(track);
1584 if(HasMCData()) hfetrack.SetMCTrack(mctrack);
1585 hfetrack.SetCentrality(fCentralityF);
1586 hfetrack.SetMulitplicity(ncontribVtx); // for correction
1587 if(IsHeavyIon()) hfetrack.SetPbPb();
1588 else hfetrack.SetPP();
1589 fPID->SetVarManager(fVarManager);
1590 if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue;
1591 // we will do PID here as soon as possible
1593 // Background subtraction----------------------------------------------------------------------------------------------
1594 if (GetPlugin(kNonPhotonicElectron)) {
1595 Int_t indexmother = -1;
1596 Int_t mcsource = -1;
1597 if(HasMCData() && mctrack) mcsource = fBackgroundSubtraction->FindMother(mctrack->GetLabel(),indexmother);
1598 fBackgroundSubtraction->LookAtNonHFE(itrack, track, fInputEvent, 1, fCentralityF, -1,mcsource, indexmother);
1600 //---------------------------------------------------------------------------------------------------------------------
1603 fQACollection->Fill("Filterend", -1);
1604 for(Int_t k=0; k<20; k++) {
1606 if((track->TestFilterBit(u))) {
1607 fQACollection->Fill("Filterend", k);
1611 // Apply weight for background contamination
1612 //Double_t weightBackGround = 1.0;
1614 // Apply weight for background contamination
1615 if(fBackGroundFactorApply) {
1616 if(IsHeavyIon() && fCentralityF >= 0) fWeightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));
1617 else fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
1619 if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
1620 else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
1621 // weightBackGround as special weight
1622 fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);
1624 fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));
1627 nElectronCandidates++;
1629 if (GetPlugin(kDEstep)) {
1631 Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;
1632 fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
1633 dataDca[0]=-1; //for data, don't know the origin
1634 dataDca[1]=track->Pt();
1635 dataDca[2]=hfeimpactR;
1636 dataDca[3]=fCentralityF;
1637 dataDca[4] = -1; // not store V0 for the moment
1638 dataDca[5] = double(track->Charge());
1639 fQACollection->Fill("Dca", dataDca);
1642 // Fill Containers for impact parameter analysis
1643 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;
1645 // Apply weight for background contamination after ip cut
1646 if(fBackGroundFactorApply) {
1647 fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
1648 if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
1649 else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
1650 // weightBackGround as special weight
1651 fVarManager->FillContainer(fContainer, "hadronicBackground", 2, kFALSE, fWeightBackGround);
1657 // Background subtraction-------------------------------------------------------------------
1658 if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->CountPoolAssociated(fInputEvent, fCentralityF);
1659 //------------------------------------------------------------------------------------------
1661 fQACollection->Fill("nElectronTracksEvent", nElectronCandidates);
1664 //____________________________________________________________
1665 Bool_t AliAnalysisTaskHFE::ProcessMCtrack(AliVParticle *track){
1667 // Filter the Monte Carlo Track
1668 // Additionally Fill a THnSparse for Signal To Background Studies
1669 // Works for AOD and MC analysis Type
1671 fVarManager->NewTrack(track, NULL, fCentralityF, -1, kTRUE);
1674 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)
1675 if(IsESDanalysis()){
1676 AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(track);
1678 vertex[0] = mctrack->Particle()->Vx();
1679 vertex[1] = mctrack->Particle()->Vy();
1682 AliAODMCParticle *aodmctrack = dynamic_cast<AliAODMCParticle *>(track);
1683 if(aodmctrack) aodmctrack->XvYvZv(vertex);
1686 //printf("MC Generated\n");
1687 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, track)) return kFALSE;
1688 //printf("MC Generated pass\n");
1689 fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGenerated, kFALSE);
1691 // Step GeneratedZOutNoPileUp
1692 if((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (fCentralityF < 0)) return kFALSE;
1693 fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedZOutNoPileUpCentralityFine, kFALSE);
1694 //printf("In ProcessMCtrack %f\n",fCentralityF);
1696 // Step Generated Event Cut
1697 if(!fPassTheEventCut) return kFALSE;
1698 fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedEventCut, kFALSE);
1700 if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepMCInAcceptance, track)) return kFALSE;
1701 fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCInAcceptance, kFALSE);
1705 //____________________________________________________________
1706 Bool_t AliAnalysisTaskHFE::PreSelectTrack(AliESDtrack *track) const {
1712 Bool_t survived = kTRUE;
1714 if(fCutspreselect) {
1715 //printf("test preselect\n");
1716 if(!fCutspreselect->IsSelected(track)) survived=kFALSE;
1718 //printf("survived %d\n",(Int_t)survived);
1720 if(survived && fPIDpreselect){
1722 AliHFEpidObject hfetrack;
1723 hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
1724 hfetrack.SetRecTrack(track);
1725 if(!fPIDpreselect->IsSelected(&hfetrack)) {
1726 //printf("Did not pass AliHFEcuts::kPID\n");
1729 //else printf("Pass AliHFEcuts::kPID\n");
1735 //____________________________________________________________
1736 void AliAnalysisTaskHFE::MakeEventContainer(){
1738 // Create the event container for the correction framework and link it
1739 // 1st bin: Vertex z-position
1740 // 2nd bin: V0AND decision (normalization to sigma_inel)
1741 // 3rd bin: Centrality class (for pp defined as number of contributors in vertex.)
1742 // 4th bin: Number of contributors > 0
1745 const Int_t kNvar = 4; // number of variables on the grid:
1746 Int_t nBins[kNvar] = {120, 2, 11, 2};
1747 Double_t binMin[kNvar] = {-30. , 0., 0.0, 0.};
1748 Double_t binMax[kNvar] = {30., 2., 11.0, 2.};
1750 AliCFContainer *evCont = new AliCFContainer("eventContainer", "Container for events", AliHFEcuts::kNcutStepsEvent, kNvar, nBins);
1752 Double_t *vertexBins = AliHFEtools::MakeLinearBinning(nBins[0], binMin[0], binMax[0]);
1753 Double_t *v0andBins = AliHFEtools::MakeLinearBinning(nBins[1], binMin[1], binMax[1]);
1754 Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBins[2], binMin[2], binMax[2]);
1755 Double_t *contributorsBins = AliHFEtools::MakeLinearBinning(nBins[3], binMin[3], binMax[3]);
1756 evCont->SetBinLimits(0, vertexBins);
1757 evCont->SetBinLimits(1, v0andBins);
1758 evCont->SetBinLimits(2, centralityBins);
1759 evCont->SetBinLimits(3, contributorsBins);
1760 delete[] vertexBins; delete[] v0andBins; delete[] centralityBins; delete[] contributorsBins;
1762 fCFM->SetEventContainer(evCont);
1765 //____________________________________________________________
1766 void AliAnalysisTaskHFE::MakeParticleContainer(){
1768 // Create the particle container for the correction framework manager and
1771 if(!fContainer) fContainer = new AliHFEcontainer("trackContainer");
1772 fVarManager->DefineVariables(fContainer);
1774 // Create Correction Framework containers
1775 fContainer->CreateContainer("MCTrackCont", "Track Container filled with MC information", AliHFEcuts::kNcutStepsMCTrack);
1776 fContainer->CreateContainer("recTrackContReco", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());
1777 fContainer->CreateContainer("recTrackContMC", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());
1779 fContainer->CreateContainer("hadronicBackground", "Container for Hadronic Background", 3);
1780 fContainer->CreateContainer("recTrackContDEReco", "Container for displaced electron analysis with Reco information", 1);
1781 fContainer->CreateContainer("recTrackContDEMC", "Container for displaced electron analysis with MC information", 1);
1782 fContainer->CreateContainer("recTrackContSecvtxReco", "Container for secondary vertexing analysis with Reco information", 1);
1783 fContainer->CreateContainer("recTrackContSecvtxMC", "Container for secondary vertexing analysis with MC information", 1);
1786 fContainer->CreateContainer("conversionElecs", "Container for weighted conversion electrons",7);
1787 fContainer->CreateContainer("mesonElecs", "Container for weighted electrons from meson decays",7);
1788 fContainer->Sumw2("conversionElecs");
1789 fContainer->Sumw2("mesonElecs");
1791 if(fisNonHFEsystematics){
1792 const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
1793 const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
1794 for(Int_t iSource = 0; iSource < kElecBgSpecies; iSource++){
1795 for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
1796 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);
1797 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);
1798 fContainer->Sumw2(Form("conversionElecs%s%s",sourceName[iSource],levelName[iLevel]));
1799 fContainer->Sumw2(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]));
1804 //fContainer->CreateContainer("charmElecs", "Container for weighted charm electrons",2);
1807 fContainer->CreateCorrelationMatrix("correlationstepafterPID","THnSparse with correlations");
1808 fContainer->CreateCorrelationMatrix("correlationstepafterDE","THnSparse with correlations");
1809 if(!fVarManager->IsVariableDefined("centrality")) {
1810 //printf("Create the two other correlation maps\n");
1811 fContainer->CreateCorrelationMatrix("correlationstepbeforePID","THnSparse with correlations");
1812 fContainer->CreateCorrelationMatrix("correlationstepafterTOF","THnSparse with correlations");
1815 // Define the step names
1816 for(UInt_t istep = 0; istep < AliHFEcuts::kNcutStepsMCTrack; istep++){
1817 fContainer->SetStepTitle("MCTrackCont", AliHFEcuts::MCCutName(istep), istep);
1819 for(UInt_t istep = 0; istep < AliHFEcuts::kNcutStepsRecTrack; istep++){
1820 fContainer->SetStepTitle("recTrackContReco", AliHFEcuts::RecoCutName(istep), istep);
1821 fContainer->SetStepTitle("recTrackContMC", AliHFEcuts::RecoCutName(istep), istep);
1823 for(UInt_t ipid = 0; ipid < fPID->GetNumberOfPIDdetectors(); ipid++){
1824 fContainer->SetStepTitle("recTrackContReco", fPID->SortedDetectorName(ipid), AliHFEcuts::kNcutStepsRecTrack + ipid);
1825 fContainer->SetStepTitle("recTrackContMC", fPID->SortedDetectorName(ipid), AliHFEcuts::kNcutStepsRecTrack + ipid);
1828 //____________________________________________________________
1829 void AliAnalysisTaskHFE::InitContaminationQA(){
1831 // Add QA for Impact Parameter cut
1834 TObjArray *array = fVarManager->GetVariables();
1835 Int_t nvars = array->GetEntriesFast();
1836 for(Int_t v = 0; v < nvars; v++) {
1837 AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);
1838 if(!variable) continue;
1839 TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());
1840 if(!name.CompareTo("pt")) {
1841 const Int_t nBinPt = variable->GetNumberOfBins();
1842 const Double_t *kPtRange = variable->GetBinning();
1844 fQACollection->CreateTH1Farray("hadronsBeforeIPcut", "Hadrons before IP cut", nBinPt, kPtRange);
1845 fQACollection->CreateTH1Farray("hadronsAfterIPcut", "Hadrons after IP cut", nBinPt, kPtRange);
1847 fQACollection->CreateTH2Farray("Ke3Kecorr", "Ke3 decay e and K correlation; Ke3K p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
1848 fQACollection->CreateTH2Farray("Ke3K0Lecorr", "Ke3 decay e and K0L correlation; Ke3K0L p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
1849 fQACollection->CreateTH1Farray("Kptspectra", "Charged Kaons: MC p_{t} ", nBinPt, kPtRange);
1850 fQACollection->CreateTH1Farray("K0Lptspectra", "K0L: MC p_{t} ", nBinPt, kPtRange);
1852 const Double_t kDCAbound[2] = {-0.2, 0.2};
1854 const Int_t nDimDca=6;
1855 const Int_t nBinDca[nDimDca] = { 8, nBinPt, 800, 12, 6, 2};
1856 Double_t minimaDca[nDimDca] = { -1., 0., kDCAbound[0], -1., -1, -1.1};
1857 Double_t maximaDca[nDimDca] = { 7., 20., kDCAbound[1], 11., 5, 1.1};
1859 Double_t *sourceBins = AliHFEtools::MakeLinearBinning(nBinDca[0], minimaDca[0], maximaDca[0]);
1860 Double_t *dcaBins = AliHFEtools::MakeLinearBinning(nBinDca[2], minimaDca[2], maximaDca[2]);
1861 Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBinDca[3], minimaDca[3], maximaDca[3]);
1862 Double_t *v0PIDBins = AliHFEtools::MakeLinearBinning(nBinDca[4], minimaDca[4], maximaDca[4]);
1863 Double_t *chargeBins = AliHFEtools::MakeLinearBinning(nBinDca[5], minimaDca[5], maximaDca[5]);
1865 fQACollection->CreateTHnSparseNoLimits("Dca", "Dca; source (0-all, 1-charm,etc); pT [GeV/c]; dca; centrality bin; v0pid; charge", nDimDca, nBinDca);
1866 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(0, sourceBins);
1867 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(1, kPtRange);
1868 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(2, dcaBins);
1869 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(3, centralityBins);
1870 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(4, v0PIDBins);
1871 ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(5, chargeBins);
1879 //____________________________________________________________
1880 void AliAnalysisTaskHFE::InitHistoITScluster(){
1882 // Initialize a temporary histogram to monitor the chi2/ITS cluster
1884 const Int_t kNDim = 7;
1885 const Int_t kNBins[kNDim] = {88, 20,90,11, 160, 2, 1000};
1886 const Double_t kMin[kNDim] = {0.1, -1,0, 0.,0., 0, 0.};
1887 const Double_t kMax[kNDim] = {20., 1, 2.*TMath::Pi(), 11.,160, 2, 100.};
1888 fQACollection->CreateTHnSparse("fChi2perITScluster", "chi2/ITS cluster; p_{T} (GeV/c);eta;phi; centrality class;nclus;sharebit; #chi^{2}/ITS cluster", kNDim, kNBins, kMin, kMax);
1889 fQACollection->BinLogAxis("fChi2perITScluster", 0);
1893 const Int_t kNDim = 3;
1894 const Int_t kNBins[kNDim] = {44, 11, 1000};
1895 const Double_t kMin[kNDim] = {0.1, 0., 0.};
1896 const Double_t kMax[kNDim] = {20., 11., 100.};
1897 fQACollection->CreateTHnSparse("fChi2perITScluster", "chi2/ITS cluster; p_{T} (GeV/c); centrality class; #chi^{2}/ITS cluster", kNDim, kNBins, kMin, kMax);
1898 fQACollection->BinLogAxis("fChi2perITScluster", 0);
1902 //____________________________________________________________
1903 void AliAnalysisTaskHFE::SelectSpecialTrigger(const Char_t *trgclust, Int_t runMin, Int_t runMax){
1905 // Select only events triggered by a special trigeer cluster
1907 if(!fSpecialTrigger) fSpecialTrigger = new AliOADBContainer("SpecialTrigger");
1908 fSpecialTrigger->AppendObject(new TObjString(trgclust), runMin, runMax);
1911 //____________________________________________________________
1912 const Char_t * AliAnalysisTaskHFE::GetSpecialTrigger(Int_t run){
1914 // Derive selected trigger string for given run
1916 if(!fSpecialTrigger) return NULL;
1917 TObjString *trg = dynamic_cast<TObjString *>(fSpecialTrigger->GetObject(run));
1918 if(!trg) return NULL;
1919 return trg->String().Data();
1922 //____________________________________________________________
1923 void AliAnalysisTaskHFE::PrintStatus() const {
1925 // Print Analysis status
1927 printf("\n\tAnalysis Settings\n\t========================================\n\n");
1928 printf("\tSecondary Vertex finding: %s\n", GetPlugin(kSecVtx) ? "YES" : "NO");
1929 printf("\tPrimary Vertex resolution: %s\n", GetPlugin(kPriVtx) ? "YES" : "NO");
1930 printf("\tDisplaced electron analysis step: %s\n", GetPlugin(kDEstep) ? "YES" : "NO");
1931 printf("\tTagged Track Analysis: %s\n", GetPlugin(kTaggedTrackAnalysis) ? "YES" : "NO");
1933 printf("\tParticle Identification Detectors:\n");
1934 fPID->PrintStatus();
1937 printf("\t\tPID: %s\n", IsQAOn(kPIDqa) ? "YES" : "NO");
1938 printf("\t\tCUTS: %s\n", (fCuts != NULL && fCuts->IsQAOn()) ? "YES" : "NO");
1939 printf("\t\tMC: %s\n", IsQAOn(kMCqa) ? "YES" : "NO");
1943 //____________________________________________________________
1944 Bool_t AliAnalysisTaskHFE::FillProductionVertex(const AliVParticle * const track) const{
1946 // Find the production vertex of the associated MC track
1948 if(!fMCEvent) return kFALSE;
1949 const AliVParticle *mctrack = NULL;
1950 TString objectType = track->IsA()->GetName();
1951 if(objectType.CompareTo("AliESDtrack") == 0 || objectType.CompareTo("AliAODTrack") == 0){
1952 // Reconstructed track
1953 mctrack = fMCEvent->GetTrack(TMath::Abs(track->GetLabel()));
1959 if(!mctrack) return kFALSE;
1964 if(TString(mctrack->IsA()->GetName()).CompareTo("AliMCParticle") == 0){
1966 const AliMCParticle *mcpart = dynamic_cast<const AliMCParticle *>(mctrack);
1972 // case AODMCParticle
1973 const AliAODMCParticle *mcpart = dynamic_cast<const AliAODMCParticle *>(mctrack);
1980 //printf("xv %f, yv %f\n",xv,yv);
1981 fQACollection->Fill("radius", TMath::Abs(xv),TMath::Abs(yv));
1986 //__________________________________________
1987 void AliAnalysisTaskHFE::SwitchOnPlugin(Int_t plug){
1991 // - Primary vertex studies
1992 // - Secondary vertex Studies
1993 // - Post Processing
1996 case kPriVtx: SETBIT(fPlugins, plug); break;
1997 case kSecVtx: SETBIT(fPlugins, plug); break;
1998 case kIsElecBackGround: SETBIT(fPlugins, plug); break;
1999 case kPostProcess: SETBIT(fPlugins, plug); break;
2000 case kDEstep: SETBIT(fPlugins, plug); break;
2001 case kTaggedTrackAnalysis: SETBIT(fPlugins, plug); break;
2002 case kNonPhotonicElectron: SETBIT(fPlugins, plug); break;
2003 default: AliError("Unknown Plugin");
2006 //__________________________________________
2007 Bool_t AliAnalysisTaskHFE::ProcessCutStep(Int_t cutStep, AliVParticle *track){
2009 // Check single track cuts for a given cut step
2010 // Fill the particle container
2012 const Int_t kMCOffset = AliHFEcuts::kNcutStepsMCTrack;
2013 if(!fCFM->CheckParticleCuts(cutStep + kMCOffset, track)) return kFALSE;
2014 if(fVarManager->IsSignalTrack()) {
2015 fVarManager->FillContainer(fContainer, "recTrackContReco", cutStep, kFALSE);
2016 fVarManager->FillContainer(fContainer, "recTrackContMC", cutStep, kTRUE);
2020 //___________________________________________________
2021 Bool_t AliAnalysisTaskHFE::ReadCentrality() {
2023 // Recover the centrality of the event from ESD or AOD
2026 Float_t fCentralityLimitstemp[12];
2027 Float_t fCentralityLimitsdefault[12]= {0.,5.,10., 20., 30., 40., 50., 60.,70.,80., 90., 100.};
2028 if(!fPbPbUserCentralityBinning) memcpy(fCentralityLimitstemp,fCentralityLimitsdefault,sizeof(fCentralityLimitsdefault));
2029 else memcpy(fCentralityLimitstemp,fCentralityLimits,sizeof(fCentralityLimitsdefault));
2035 AliCentrality *centrality = fInputEvent->GetCentrality();
2036 fCentralityPercent = centrality->GetCentralityPercentile(fCentralityEstimator.Data());
2037 //printf("centrality %f\n",fCentralityPercent);
2039 for(Int_t ibin = 0; ibin < 11; ibin++){
2040 if(fCentralityPercent >= fCentralityLimitstemp[ibin] && fCentralityPercent < fCentralityLimitstemp[ibin+1]){
2042 //printf("test bin %f, low %f, high %f, %d\n",fCentralityPercent,fCentralityLimitstemp[ibin],fCentralityLimitstemp[ibin+1],ibin);
2047 if(bin == -1) bin = 11; // Overflow
2049 // PP: Tracklet multiplicity, use common definition
2050 Int_t itsMultiplicity = GetITSMultiplicity(fInputEvent);
2051 Int_t multiplicityLimits[8] = {0, 1, 9, 17, 25, 36, 60, 500};
2052 for(Int_t ibin = 0; ibin < 7; ibin++){
2053 if(itsMultiplicity >= multiplicityLimits[ibin] && itsMultiplicity < multiplicityLimits[ibin + 1]){
2058 if(bin == -1) bin = 7; // Overflow
2061 AliDebug(2, Form("Centrality class %d\n", fCentralityF));
2064 // contributors, to be outsourced
2065 const AliVVertex *vtx;
2066 if(IsAODanalysis()){
2067 AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
2069 AliError("AOD Event required for AOD Analysis");
2072 vtx = fAOD->GetPrimaryVertex();
2074 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
2076 AliError("ESD Event required for ESD Analysis");
2079 vtx = fESD->GetPrimaryVertex() ;
2082 fContributors = 0.5;
2086 Int_t contributorstemp = vtx->GetNContributors();
2087 if( contributorstemp <= 0) {
2088 fContributors = 0.5;
2089 //printf("Number of contributors %d and vz %f\n",contributorstemp,vtx->GetZ());
2091 else fContributors = 1.5;
2092 //printf("Number of contributors %d\n",contributorstemp);
2097 //___________________________________________________
2098 Int_t AliAnalysisTaskHFE::GetITSMultiplicity(AliVEvent *ev){
2100 // Definition of the Multiplicity according to the JPSI group (F. Kramer)
2102 Int_t nTracklets = 0;
2104 Double_t etaRange = 1.6;
2106 if (ev->IsA() == AliAODEvent::Class()) {
2107 AliAODTracklets *tracklets = ((AliAODEvent*)ev)->GetTracklets();
2108 nTracklets = tracklets->GetNumberOfTracklets();
2109 for (Int_t nn = 0; nn < nTracklets; nn++) {
2110 Double_t theta = tracklets->GetTheta(nn);
2111 Double_t eta = -TMath::Log(TMath::Tan(theta/2.0));
2112 if (TMath::Abs(eta) < etaRange) nAcc++;
2114 } else if (ev->IsA() == AliESDEvent::Class()) {
2115 nTracklets = ((AliESDEvent*)ev)->GetMultiplicity()->GetNumberOfTracklets();
2116 for (Int_t nn = 0; nn < nTracklets; nn++) {
2117 Double_t eta = ((AliESDEvent*)ev)->GetMultiplicity()->GetEta(nn);
2118 if (TMath::Abs(eta) < etaRange) nAcc++;
2125 //___________________________________________________
2126 void AliAnalysisTaskHFE::RejectionPileUpVertexRangeEventCut() {
2128 // Recover the centrality of the event from ESD or AOD
2130 if(IsAODanalysis()){
2132 AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
2134 AliError("AOD Event required for AOD Analysis");
2138 fIdentifiedAsPileUp = kFALSE;
2139 if(fRemovePileUp && fAOD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE;
2141 fIdentifiedAsOutInz = kFALSE;
2142 //printf("Z vertex %f and out %f\n",fAOD->GetPrimaryVertex()->GetZ(),fCuts->GetVertexRange());
2143 if(TMath::Abs(fAOD->GetPrimaryVertex()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
2145 fPassTheEventCut = kTRUE;
2146 if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fAOD)) fPassTheEventCut = kFALSE;
2151 AliDebug(3, "Processing ESD Centrality");
2152 AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
2154 AliError("ESD Event required for ESD Analysis");
2158 fIdentifiedAsPileUp = kFALSE;
2159 if(fRemovePileUp && fESD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE;
2164 fIdentifiedAsOutInz = kFALSE;
2165 Bool_t findvertex = kTRUE;
2166 const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();
2167 if((!vtxESD) || (vtxESD->GetNContributors() <= 0)) findvertex = kFALSE;
2169 if(TMath::Abs(vtxESD->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
2173 fPassTheEventCut = kTRUE;
2174 if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) fPassTheEventCut = kFALSE;
2180 //___________________________________________________
2181 Bool_t AliAnalysisTaskHFE::CheckTRDTrigger(AliESDEvent *ev) {
2183 // Check TRD trigger; pPb settings
2185 Bool_t cint8=kFALSE;
2186 Bool_t cint7=kFALSE;
2187 Bool_t cint5=kFALSE;
2188 Bool_t trdtrgevent=kFALSE;
2191 if(fWhichTRDTrigger==1)
2193 // DrawTRDTrigger(ev);
2195 // if (!(fAliTrigger->TRDTrigger(ev,AliTriggerAnalysis::kTRDHSE))) return kFALSE; // HSE
2199 // DrawTRDTrigger(ev);
2202 // if (!(AliTriggerAnalysis::TRDTrigger(ev) & 0x2)) return; // HSE
2203 // cint8= ev->IsTriggerClassFired("CINT8WUHSE-B-NOPF-CENT");
2204 // cint7= ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT");
2205 // cint5= (ev->IsTriggerClassFired("CINT5WU-B-NOPF-ALL")) &&
2206 // (ev->GetHeader()->GetL1TriggerInputs() & (1 << 10));
2207 // printf("trdtrg condition %i \n",whichTRDTrigger);
2208 cint8= ev->IsTriggerClassFired("CINT8WUHSE-B-NOPF-CENT");
2209 cint7= ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT");
2210 cint5= (ev->IsTriggerClassFired("CINT5WU-B-NOPF-ALL")) &&
2211 (ev->GetHeader()->GetL1TriggerInputs() & (1 << 10));
2212 // printf("trdtrg condition %i \n",whichTRDTrigger);
2213 if((cint7==kFALSE)&&(cint8==kFALSE)&&(cint5==kFALSE)) return kFALSE;
2220 if(fWhichTRDTrigger==2)
2222 cint8= ev->IsTriggerClassFired("CINT8WUHSE-B-NOPF-CENT");
2223 cint7= ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT");
2224 cint5= (ev->IsTriggerClassFired("CINT5WU-B-NOPF-ALL")) &&
2225 (ev->GetHeader()->GetL1TriggerInputs() & (1 << 10));
2226 // printf("trdtrg condition %i \n",whichTRDTrigger);
2227 if((cint7==kFALSE)&&(cint8==kFALSE)&&(cint5==kFALSE)) return kFALSE;
2236 if(fWhichTRDTrigger==3)
2239 if (!(fAliTrigger->TRDTrigger(ev,AliTriggerAnalysis::kTRDHQU))) return kFALSE; // HQU
2246 cint8= ev->IsTriggerClassFired("CINT8WUHQU-B-NOPF-CENT");
2247 cint7= ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT");
2248 cint5= (ev->IsTriggerClassFired("CINT5WU-B-NOPF-ALL")) &&
2249 (ev->GetHeader()->GetL1TriggerInputs() & (1 << 12));
2250 // printf("trdtrg condition %i \n",whichTRDTrigger);
2251 if((cint7==kFALSE)&&(cint8==kFALSE)&&(cint5==kFALSE)) return kFALSE;
2259 // if (!(AliTriggerAnalysis::TRDTrigger(ev) & 0x4)) return; // HQU
2260 // cint8= ev->IsTriggerClassFired("CINT8WUHQU-B-NOPF-CENT");
2261 // cint7= ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT");
2262 // cint5= (ev->IsTriggerClassFired("CINT5WU-B-NOPF-ALL")) &&
2263 // (ev->GetHeader()->GetL1TriggerInputs() & (1 << 12));
2264 // printf("trdtrg condition %i \n",whichTRDTrigger);
2266 if(fWhichTRDTrigger==4)
2268 cint8= ev->IsTriggerClassFired("CINT8WUHQU-B-NOPF-CENT");
2269 cint7= ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT");
2270 cint5= (ev->IsTriggerClassFired("CINT5WU-B-NOPF-ALL")) &&
2271 (ev->GetHeader()->GetL1TriggerInputs() & (1 << 12));
2272 // printf("trdtrg condition %i \n",whichTRDTrigger);
2273 if((cint7==kFALSE)&&(cint8==kFALSE)&&(cint5==kFALSE)) return kFALSE;
2281 // if((cint7==kFALSE)&&(cint8==kFALSE)&&(cint5==kFALSE)) trdtrgevent=kFALSE;
2282 // else trdtrgevent=kTRUE;
2283 // printf("in check fct %i \n",(Int_t)trdtrgevent);
2288 void AliAnalysisTaskHFE::DrawTRDTrigger(AliESDEvent *ev) {
2290 Int_t ntriggerbit=0;
2291 fQACollection->Fill("nTriggerBit",ntriggerbit);
2292 if(ev->IsTriggerClassFired("CINT7-B-NOPF-ALLNOTRD"))
2295 fQACollection->Fill("nTriggerBit",ntriggerbit);
2297 if(ev->IsTriggerClassFired("CINT7WU-B-NOPF-ALL"))
2300 fQACollection->Fill("nTriggerBit",ntriggerbit);
2301 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2303 fQACollection->Fill("nTriggerBit",ntriggerbit);
2305 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT")) {
2307 fQACollection->Fill("nTriggerBit",ntriggerbit);
2310 if(ev->IsTriggerClassFired("CINT7WUHJT-B-NOPF-CENT"))
2313 fQACollection->Fill("nTriggerBit",ntriggerbit);
2315 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2317 fQACollection->Fill("nTriggerBit",ntriggerbit);
2319 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT")) {
2321 fQACollection->Fill("nTriggerBit",ntriggerbit);
2322 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2324 fQACollection->Fill("nTriggerBit",ntriggerbit);
2328 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT"))
2331 fQACollection->Fill("nTriggerBit",ntriggerbit);
2332 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2334 fQACollection->Fill("nTriggerBit",ntriggerbit);
2336 if((!(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")))&&(!(ev->IsTriggerClassFired("CINT7WUHJT-B-NOPF-CENT")))) {
2338 fQACollection->Fill("nTriggerBit",ntriggerbit);
2341 Int_t nTrdTracks = ev->GetNumberOfTrdTracks();
2342 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2343 AliESDTrdTrack* trdTrack = ev->GetTrdTrack(iTrack);
2344 printf("GTU track %3i: pt = %5.1f, PID = %3i\n", iTrack, trdTrack->Pt(), trdTrack->GetPID());
2351 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT"))
2354 fQACollection->Fill("nTriggerBit",ntriggerbit);
2355 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT")) {
2357 fQACollection->Fill("nTriggerBit",ntriggerbit);
2359 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-FAST")){
2361 fQACollection->Fill("nTriggerBit",ntriggerbit);
2363 if((!(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-CENT")))&&(!(ev->IsTriggerClassFired("CINT7WUHJT-B-NOPF-CENT")))) {
2365 fQACollection->Fill("nTriggerBit",ntriggerbit);
2367 Int_t nTrdTracks = ev->GetNumberOfTrdTracks();
2368 for (Int_t iTrack = 0; iTrack < nTrdTracks; ++iTrack) {
2369 AliESDTrdTrack* trdTrack = ev->GetTrdTrack(iTrack);
2370 printf("HSE GTU track %3i: pt = %5.1f, PID = %3i\n", iTrack, trdTrack->Pt(), trdTrack->GetPID());
2378 if(ev->IsTriggerClassFired("CEMC7WUHEE-B-NOPF-CENT")) {
2380 fQACollection->Fill("nTriggerBit",ntriggerbit);
2382 if(ev->IsTriggerClassFired("CINT7WUHJT-B-NOPF-FAST")){
2384 fQACollection->Fill("nTriggerBit",ntriggerbit);
2386 if(ev->IsTriggerClassFired("CINT7WUHQU-B-NOPF-FAST")){
2388 fQACollection->Fill("nTriggerBit",ntriggerbit);
2390 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-FAST")){
2392 fQACollection->Fill("nTriggerBit",ntriggerbit);
2393 if(ev->IsTriggerClassFired("CINT7WUHSE-B-NOPF-CENT")) {
2395 fQACollection->Fill("nTriggerBit",ntriggerbit);
2398 if(ntriggerbit==0) fQACollection->Fill("nTriggerBit",1);