-/**************************************************************************
-* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
-* *
-* Author: The ALICE Off-line Project. *
-* Contributors are mentioned in the code where appropriate. *
-* *
-* Permission to use, copy, modify and distribute this software and its *
-* documentation strictly for non-commercial purposes is hereby granted *
-* without fee, provided that the above copyright notice appears in all *
-* copies and that both the copyright notice and this permission notice *
-* appear in the supporting documentation. The authors make no claims *
-* about the suitability of this software for any purpose. It is *
-* provided "as is" without express or implied warranty. *
-**************************************************************************/
-//
-// The analysis task:
-// Filling an AliCFContainer with the quantities pt, eta and phi
-// for tracks which survivied the particle cuts (MC resp. ESD tracks)
-// Track selection is done using the AliHFE package
-//
-// Author:
-// Raphaelle Bailhache <R.Bailhache@gsi.de>
-// Markus Fasel <M.Fasel@gsi.de>
-// Matus Kalisky <matus.kalisky@cern.ch>
-// MinJung Kweon <minjung@physi.uni-heidelberg.de>
-//
-#include <TAxis.h>
-#include <TBits.h>
-#include <TCanvas.h>
-#include <TChain.h>
-#include <TDirectory.h>
-#include <TFile.h>
-#include <TH3D.h>
-#include <TIterator.h>
-#include <TList.h>
-#include <TLegend.h>
-#include <TMath.h>
-#include <TObjArray.h>
-#include <TObjString.h>
-#include <TParticle.h>
-#include <TProfile.h>
-#include <TString.h>
-#include <TF1.h>
-#include <TTree.h>
-
-#include "AliAnalysisManager.h"
-#include "AliAODInputHandler.h"
-#include "AliAODMCParticle.h"
-#include "AliAODTrack.h"
-#include "AliAODVertex.h"
-#include "AliCentrality.h"
-#include "AliCFContainer.h"
-#include "AliCFManager.h"
-#include "AliESDEvent.h"
-#include "AliESDInputHandler.h"
-#include "AliESDtrack.h"
-#include "AliLog.h"
-#include "AliMCEvent.h"
-#include "AliMCEventHandler.h"
-#include "AliMCParticle.h"
-#include "AliMultiplicity.h"
-#include "AliPID.h"
-#include "AliPIDResponse.h"
-#include "AliOADBContainer.h"
-#include "AliStack.h"
-#include "AliTriggerAnalysis.h"
-#include "AliVVertex.h"
-
-#include "AliHFEcollection.h"
-#include "AliHFEcontainer.h"
-#include "AliHFEcuts.h"
-#include "AliHFEelecbackground.h"
-#include "AliHFEmcQA.h"
-#include "AliHFEpairs.h"
-#include "AliHFEpid.h"
-#include "AliHFEpidQAmanager.h"
-#include "AliHFEpostAnalysis.h"
-#include "AliHFEsecVtxs.h"
-#include "AliHFEsecVtx.h"
-#include "AliHFEsignalCuts.h"
-#include "AliHFEtaggedTrackAnalysis.h"
-#include "AliHFEtools.h"
-#include "AliHFEvarManager.h"
-#include "AliAnalysisTaskHFE.h"
-
-ClassImp(AliAnalysisTaskHFE)
-
-//____________________________________________________________
-AliAnalysisTaskHFE::AliAnalysisTaskHFE():
- AliAnalysisTaskSE("PID efficiency Analysis")
- , fQAlevel(0)
- , fPlugins(0)
- , fFillSignalOnly(kTRUE)
- , fFillNoCuts(kFALSE)
- , fBackGroundFactorApply(kFALSE)
- , fRemovePileUp(kFALSE)
- , fIdentifiedAsPileUp(kFALSE)
- , fIdentifiedAsOutInz(kFALSE)
- , fPassTheEventCut(kFALSE)
- , fRejectKinkMother(kTRUE)
- , fisppMultiBin(kFALSE)
- , fisNonHFEsystematics(kFALSE)
- , fSpecialTrigger(NULL)
- , fCentralityF(-1)
- , fContributors(0.5)
- , fWeightBackGround(0.)
- , fVz(0.0)
- , fHadronBackgroundOADB(NULL)
- , fContainer(NULL)
- , fVarManager(NULL)
- , fSignalCuts(NULL)
- , fCFM(NULL)
- , fTriggerAnalysis(NULL)
- , fPID(NULL)
- , fPIDqa(NULL)
- , fPIDpreselect(NULL)
- , fCuts(NULL)
- , fTaggedTrackCuts(NULL)
- , fCleanTaggedTrack(kFALSE)
- , fVariablesTRDTaggedTrack(kFALSE)
- , fCutspreselect(NULL)
- , fSecVtx(NULL)
- , fElecBackGround(NULL)
- , fMCQA(NULL)
- , fTaggedTrackAnalysis(NULL)
- , fExtraCuts(NULL)
- , fQA(NULL)
- , fOutput(NULL)
- , fHistMCQA(NULL)
- , fHistSECVTX(NULL)
- , fHistELECBACKGROUND(NULL)
- , fQACollection(NULL)
-{
- //
- // Dummy constructor
- //
- memset(fElecBackgroundFactor, 0, sizeof(Double_t) * kElecBgSpecies * kBgPtBins * kCentBins * kBgLevels);
- memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);
- memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));
- memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));
-}
-
-//____________________________________________________________
-AliAnalysisTaskHFE::AliAnalysisTaskHFE(const char * name):
- AliAnalysisTaskSE(name)
- , fQAlevel(0)
- , fPlugins(0)
- , fFillSignalOnly(kTRUE)
- , fFillNoCuts(kFALSE)
- , fBackGroundFactorApply(kFALSE)
- , fRemovePileUp(kFALSE)
- , fIdentifiedAsPileUp(kFALSE)
- , fIdentifiedAsOutInz(kFALSE)
- , fPassTheEventCut(kFALSE)
- , fRejectKinkMother(kTRUE)
- , fisppMultiBin(kFALSE)
- , fisNonHFEsystematics(kFALSE)
- , fSpecialTrigger(NULL)
- , fCentralityF(-1)
- , fContributors(0.5)
- , fWeightBackGround(0.)
- , fVz(0.0)
- , fHadronBackgroundOADB(NULL)
- , fContainer(NULL)
- , fVarManager(NULL)
- , fSignalCuts(NULL)
- , fCFM(NULL)
- , fTriggerAnalysis(NULL)
- , fPID(NULL)
- , fPIDqa(NULL)
- , fPIDpreselect(NULL)
- , fCuts(NULL)
- , fTaggedTrackCuts(NULL)
- , fCleanTaggedTrack(kFALSE)
- , fVariablesTRDTaggedTrack(kFALSE)
- , fCutspreselect(NULL)
- , fSecVtx(NULL)
- , fElecBackGround(NULL)
- , fMCQA(NULL)
- , fTaggedTrackAnalysis(NULL)
- , fExtraCuts(NULL)
- , fQA(NULL)
- , fOutput(NULL)
- , fHistMCQA(NULL)
- , fHistSECVTX(NULL)
- , fHistELECBACKGROUND(NULL)
- , fQACollection(0x0)
-{
- //
- // Default constructor
- //
- DefineOutput(1, TList::Class());
- DefineOutput(2, TList::Class());
-
- fPID = new AliHFEpid("hfePid");
- fPIDqa = new AliHFEpidQAmanager;
- fVarManager = new AliHFEvarManager("hfeVarManager");
-
- memset(fElecBackgroundFactor, 0, sizeof(Double_t) * kElecBgSpecies * kBgPtBins * kCentBins * kBgLevels);
- memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);
- memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));
- memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));
-}
-
-//____________________________________________________________
-AliAnalysisTaskHFE::AliAnalysisTaskHFE(const AliAnalysisTaskHFE &ref):
- AliAnalysisTaskSE(ref)
- , fQAlevel(0)
- , fPlugins(0)
- , fFillSignalOnly(ref.fFillSignalOnly)
- , fFillNoCuts(ref.fFillNoCuts)
- , fBackGroundFactorApply(ref.fBackGroundFactorApply)
- , fRemovePileUp(ref.fRemovePileUp)
- , fIdentifiedAsPileUp(ref.fIdentifiedAsPileUp)
- , fIdentifiedAsOutInz(ref.fIdentifiedAsOutInz)
- , fPassTheEventCut(ref.fPassTheEventCut)
- , fRejectKinkMother(ref.fRejectKinkMother)
- , fisppMultiBin(ref.fisppMultiBin)
- , fisNonHFEsystematics(ref.fisNonHFEsystematics)
- , fSpecialTrigger(ref.fSpecialTrigger)
- , fCentralityF(ref.fCentralityF)
- , fContributors(ref.fContributors)
- , fWeightBackGround(ref.fWeightBackGround)
- , fVz(ref.fVz)
- , fHadronBackgroundOADB(ref.fHadronBackgroundOADB)
- , fContainer(NULL)
- , fVarManager(NULL)
- , fSignalCuts(NULL)
- , fCFM(NULL)
- , fTriggerAnalysis(NULL)
- , fPID(NULL)
- , fPIDqa(NULL)
- , fPIDpreselect(NULL)
- , fCuts(NULL)
- , fTaggedTrackCuts(NULL)
- , fCleanTaggedTrack(ref.fCleanTaggedTrack)
- , fVariablesTRDTaggedTrack(ref.fVariablesTRDTaggedTrack)
- , fCutspreselect(NULL)
- , fSecVtx(NULL)
- , fElecBackGround(NULL)
- , fMCQA(NULL)
- , fTaggedTrackAnalysis(NULL)
- , fExtraCuts(NULL)
- , fQA(NULL)
- , fOutput(NULL)
- , fHistMCQA(NULL)
- , fHistSECVTX(NULL)
- , fHistELECBACKGROUND(NULL)
- , fQACollection(NULL)
-{
- //
- // Copy Constructor
- //
- ref.Copy(*this);
-}
-
-//____________________________________________________________
-AliAnalysisTaskHFE &AliAnalysisTaskHFE::operator=(const AliAnalysisTaskHFE &ref){
- //
- // Assignment operator
- //
- if(this == &ref)
- ref.Copy(*this);
- return *this;
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::Copy(TObject &o) const {
- //
- // Copy into object o
- //
- AliAnalysisTaskHFE &target = dynamic_cast<AliAnalysisTaskHFE &>(o);
- target.fQAlevel = fQAlevel;
- target.fPlugins = fPlugins;
- target.fFillSignalOnly = fFillSignalOnly;
- target.fFillNoCuts = fFillNoCuts;
- target.fBackGroundFactorApply = fBackGroundFactorApply;
- target.fRemovePileUp = fRemovePileUp;
- target.fIdentifiedAsPileUp = fIdentifiedAsPileUp;
- target.fIdentifiedAsOutInz = fIdentifiedAsOutInz;
- target.fPassTheEventCut = fPassTheEventCut;
- target.fRejectKinkMother = fRejectKinkMother;
- target.fisppMultiBin = fisppMultiBin;
- target.fisNonHFEsystematics = fisNonHFEsystematics;
- target.fSpecialTrigger = fSpecialTrigger;
- target.fCentralityF = fCentralityF;
- target.fContributors = fContributors;
- target.fWeightBackGround = fWeightBackGround;
- target.fVz = fVz;
- target.fHadronBackgroundOADB = fHadronBackgroundOADB;
- target.fContainer = fContainer;
- target.fVarManager = fVarManager;
- target.fSignalCuts = fSignalCuts;
- target.fCFM = fCFM;
- target.fTriggerAnalysis = fTriggerAnalysis;
- target.fPID = fPID;
- target.fPIDqa = fPIDqa;
- target.fPIDpreselect = fPIDpreselect;
- target.fCuts = fCuts;
- target.fTaggedTrackCuts = fTaggedTrackCuts;
- target.fCleanTaggedTrack = fCleanTaggedTrack;
- target.fVariablesTRDTaggedTrack = fVariablesTRDTaggedTrack;
- target.fCutspreselect = fCutspreselect;
- target.fSecVtx = fSecVtx;
- target.fElecBackGround = fElecBackGround;
- target.fMCQA = fMCQA;
- target.fTaggedTrackAnalysis = fTaggedTrackAnalysis;
- target.fExtraCuts = fExtraCuts;
- target.fQA = fQA;
- target.fOutput = fOutput;
- target.fHistMCQA = fHistMCQA;
- target.fHistSECVTX = fHistSECVTX;
- target.fHistELECBACKGROUND = fHistELECBACKGROUND;
- target.fQACollection = fQACollection;
-}
-
-//____________________________________________________________
-AliAnalysisTaskHFE::~AliAnalysisTaskHFE(){
- //
- // Destructor
- //
- if(fPID) delete fPID;
- if(fPIDpreselect) delete fPIDpreselect;
- if(fVarManager) delete fVarManager;
- if(fCFM) delete fCFM;
- if(fTriggerAnalysis) delete fTriggerAnalysis;
- if(fSignalCuts) delete fSignalCuts;
- if(fSecVtx) delete fSecVtx;
- if(fMCQA) delete fMCQA;
- if(fElecBackGround) delete fElecBackGround;
- if(fSpecialTrigger) delete fSpecialTrigger;
- // Delete output objects only if we are not running in PROOF mode because otherwise this produces a crash during merging
- AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
- if(mgr && mgr->GetAnalysisType() != AliAnalysisManager::kProofAnalysis){
- if(fPIDqa) delete fPIDqa;
- if(fOutput) delete fOutput;
- if(fQA) delete fQA;
- }
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::UserCreateOutputObjects(){
- //
- // Creating output container and output objects
- // Here we also Initialize the correction framework container and
- // the objects for
- // - PID
- // - MC QA
- // - SecVtx
- // QA histograms are created if requested
- // Called once per worker
- //
- AliDebug(3, "Creating Output Objects");
- // Automatic determination of the analysis mode
- AliVEventHandler *inputHandler = dynamic_cast<AliVEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
- if(!TString(inputHandler->IsA()->GetName()).CompareTo("AliAODInputHandler")){
- SetAODAnalysis();
- } else {
- SetESDAnalysis();
- if(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler())
- SetHasMCData();
- }
- printf("Analysis Mode: %s Analysis\n", IsAODanalysis() ? "AOD" : "ESD");
- printf("MC Data available %s\n", HasMCData() ? "Yes" : "No");
-
- // Enable Trigger Analysis
- fTriggerAnalysis = new AliTriggerAnalysis;
- fTriggerAnalysis->EnableHistograms();
- fTriggerAnalysis->SetAnalyzeMC(HasMCData());
-
-
- // Make lists for Output
- if(!fQA) fQA = new TList;
- fQA->SetOwner();
- if(!fOutput) fOutput = new TList;
- fOutput->SetOwner();
-
- // First Part: Make QA histograms
- fQACollection = new AliHFEcollection("TaskQA", "QA histos from the Electron Task");
- fQACollection->CreateTH1F("nElectronTracksEvent", "Number of Electron Candidates", 100, 0, 100);
- fQACollection->CreateTH1F("nElectron", "Number of electrons", 100, 0, 100);
- fQACollection->CreateTH2F("radius", "Production Vertex", 100, 0.0, 5.0, 100, 0.0, 5.0);
- fQACollection->CreateTH2F("TPCdEdxBeforePID", "TPC dE/dx; p (GeV/c); TPC dE/dx (a.u.)", 1000, 0., 10., 200, 0., 200.);
- fQACollection->CreateTH2F("TPCnSigmaBeforePID", "TPC dE/dx; p (GeV/c); TPC dE/dx - <TPC dE/dx>|_{el} (#sigma)", 1000, 0., 10., 1000, -10., 10.);
-
- InitPIDperformanceQA();
- InitContaminationQA();
- InitHistoITScluster();
- fQA->Add(fQACollection);
-
- // Initialize PID
- fPID->SetHasMCData(HasMCData());
- if(!fPID->GetNumberOfPIDdetectors()) fPID->AddDetector("TPC", 0);
- if(IsQAOn(kPIDqa)){
- AliInfo("PID QA switched on");
- fPIDqa->Initialize(fPID);
- fQA->Add(fPIDqa->MakeList("HFEpidQA"));
- }
- fPID->SortDetectors();
-
- // Initialize correction Framework and Cuts
- const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack + AliHFEcuts::kNcutStepsSecvtxTrack;
- fCFM = new AliCFManager;
- fCFM->SetNStepParticle(kNcutSteps);
- MakeParticleContainer();
- MakeEventContainer();
- // Temporary fix: Initialize particle cuts with NULL
- for(Int_t istep = 0; istep < kNcutSteps; istep++)
- fCFM->SetParticleCutsList(istep, NULL);
- if(!fCuts){
- AliWarning("Cuts not available. Default cuts will be used");
- fCuts = new AliHFEcuts;
- fCuts->CreateStandardCuts();
- }
- if(IsAODanalysis()) fCuts->SetAOD();
- // Make clone for V0 tagging step
- fCuts->Initialize(fCFM);
- if(fCuts->IsQAOn()) fQA->Add(fCuts->GetQAhistograms());
- fSignalCuts = new AliHFEsignalCuts("HFEsignalCuts", "HFE MC Signal definition");
- fVarManager->SetSignalCuts(fSignalCuts);
-
- // add output objects to the List
- fOutput->AddAt(fContainer, 0);
- fOutput->AddAt(fCFM->GetEventContainer(), 1);
-
- // mcQA----------------------------------
- if (HasMCData() && IsQAOn(kMCqa)) {
- AliInfo("MC QA on");
- if(!fMCQA) fMCQA = new AliHFEmcQA;
- if(!fHistMCQA) fHistMCQA = new TList();
- fHistMCQA->SetOwner();
- if(IsPbPb()) fMCQA->SetPbPb();
- if(fisppMultiBin) fMCQA->SetPPMultiBin();
- if(TestBit(kTreeStream)){
- fMCQA->EnableDebugStreamer();
- }
- fMCQA->CreatDefaultHistograms(fHistMCQA);
- fMCQA->SetBackgroundWeightFactor(fElecBackgroundFactor[0][0][0],fBinLimit);
- fQA->Add(fHistMCQA);
- }
-
- // secvtx----------------------------------
- if (GetPlugin(kSecVtx)) {
- AliInfo("Secondary Vertex Analysis on");
- if(!fSecVtx) fSecVtx = new AliHFEsecVtx;
- fSecVtx->SetHasMCData(HasMCData());
-
- if(!fHistSECVTX) fHistSECVTX = new TList();
- fHistSECVTX->SetOwner();
- fSecVtx->CreateHistograms(fHistSECVTX);
- fOutput->Add(fHistSECVTX);
- }
-
- // background----------------------------------
- if (GetPlugin(kIsElecBackGround)) {
- AliInfo("Electron BackGround Analysis on");
- if(!fElecBackGround){
- AliWarning("ElecBackGround not available. Default elecbackground will be used");
- fElecBackGround = new AliHFEelecbackground;
- }
- fElecBackGround->SetHasMCData(HasMCData());
-
- if(!fHistELECBACKGROUND) fHistELECBACKGROUND = new TList();
- fHistELECBACKGROUND->SetOwner();
- fElecBackGround->CreateHistograms(fHistELECBACKGROUND);
- fOutput->Add(fHistELECBACKGROUND);
- }
-
- // tagged tracks
- if(GetPlugin(kTaggedTrackAnalysis)){
- AliInfo("Analysis on V0-tagged tracks enabled");
- fTaggedTrackAnalysis = new AliHFEtaggedTrackAnalysis(Form("taggedTrackAnalysis%s", GetName()));
- fTaggedTrackAnalysis->SetCuts(fTaggedTrackCuts);
- fTaggedTrackAnalysis->SetClean(fCleanTaggedTrack);
- AliHFEvarManager *varManager = fTaggedTrackAnalysis->GetVarManager();
- TObjArray *array = fVarManager->GetVariables();
- Int_t nvars = array->GetEntriesFast();
- TString namee;
- for(Int_t v = 0; v < nvars; v++) {
- AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);
- if(!variable) continue;
- TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());
- if(!name.CompareTo("source")) namee = TString("species");
- else namee = TString(name);
- Int_t nbins = variable->GetNumberOfBins();
- if(variable->HasUserDefinedBinning()){
- varManager->AddVariable(namee, nbins, variable->GetBinning());
- } else {
- varManager->AddVariable(namee, nbins, variable->GetMinimum(), variable->GetMaximum());
- }
- //printf("For AliTaggedTrackAnalysis, had the variable %s and the one used %s\n",(const char*)variable->GetName(),(const char*) namee);
- }
- if(fPIDqa->HasHighResolutionHistos())
- fTaggedTrackAnalysis->GetPIDqa()->SetHighResolutionHistos();
- fTaggedTrackAnalysis->SetPID(fPID);
- fTaggedTrackAnalysis->SetVariablesTRD(fVariablesTRDTaggedTrack);
- fTaggedTrackAnalysis->InitContainer();
- fOutput->Add(fTaggedTrackAnalysis->GetContainer());
- fQA->Add(fTaggedTrackAnalysis->GetPIDQA());
- fQA->Add(fTaggedTrackAnalysis->GetCutQA());
- fQA->Add(fTaggedTrackAnalysis->GetQAcollection());
- }
-
- PrintStatus();
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::UserExec(Option_t *){
- //
- // Run the analysis
- //
- AliDebug(3, "Starting Single Event Analysis");
- if(!fInputEvent){
- AliError("Reconstructed Event not available");
- return;
- }
- if(HasMCData()){
- AliDebug(4, Form("MC Event: %p", fMCEvent));
- if(!fMCEvent){
- AliError("No MC Event, but MC Data required");
- return;
- }
- }
- if(!fCuts){
- AliError("HFE cuts not available");
- return;
- }
- if(!fPID->IsInitialized()){
- // Initialize PID with the given run number
- fPID->InitializePID(fInputEvent->GetRunNumber());
- }
-
- // Initialize hadronic background from OADB Container
- AliDebug(2, Form("Apply background factors: %s, OADB Container %p", fBackGroundFactorApply ? "Yes" : "No", fHadronBackgroundOADB));
- if(fBackGroundFactorApply && !TestBit(kBackgroundInitialized)){
- AliDebug(2, "Initializing Background from OADB");
- if(!InitializeHadronBackground(fInputEvent->GetRunNumber())) AliError("Failed initializing hadronic background parameterization from OADB");
- else AliDebug(2, "Successfully loaded Background from OADB");
- SetBit(kBackgroundInitialized);
- }
-
- if(IsESDanalysis() && HasMCData()){
- // Protect against missing MC trees
- AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
- if(!mcH){
- AliError("No MC Event Handler available");
- return;
- }
- if(!mcH->InitOk()) return;
- if(!mcH->TreeK()) return;
- if(!mcH->TreeTR()) return;
- }
-
- // need the centrality for everything (MC also)
- fCentralityF = -1;
- if(!ReadCentrality()) fCentralityF = -1;
- //printf("pass centrality\n");
- //printf("Reading fCentralityF %f\n",fCentralityF);
-
- // See if pile up and z in the range
- RejectionPileUpVertexRangeEventCut();
-
- // Protect agains missing
- if(HasMCData()){
- //printf("Has MC data\n");
- fSignalCuts->SetMCEvent(fMCEvent);
- ProcessMC(); // Run the MC loop + MC QA in case MC Data are available
- }
-
- AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();
- if(!pidResponse){
- AliDebug(1, "Using default PID Response");
- pidResponse = AliHFEtools::GetDefaultPID(HasMCData(), fInputEvent->IsA() == AliAODEvent::Class());
- }
- fPID->SetPIDResponse(pidResponse);
- if(fPIDpreselect) fPIDpreselect->SetPIDResponse(pidResponse);
-
- // Event loop
- if(IsAODanalysis()){
- ProcessAOD();
- } else {
- const char *specialTrigger = GetSpecialTrigger(fInputEvent->GetRunNumber());
- // Check Trigger selection
- if(specialTrigger){
- AliDebug(2, Form("Special Trigger requested: %s", specialTrigger));
- AliESDEvent *ev = dynamic_cast<AliESDEvent *>(fInputEvent);
- if(!(ev && ev->IsTriggerClassFired(specialTrigger))){
- AliDebug(2, "Event not selected");
- return;
- } else AliDebug(2, "Event Selected");
- } else AliDebug(2, "No Special Trigger requested");
-
- ProcessESD();
- }
- // Done!!!
- PostData(1, fOutput);
- PostData(2, fQA);
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::Terminate(Option_t *){
- //
- // Terminate not implemented at the moment
- //
- if(GetPlugin(kPostProcess)){
- fOutput = dynamic_cast<TList *>(GetOutputData(1));
- fQA = dynamic_cast<TList *>(GetOutputData(2));
- if(!fOutput){
- AliError("Results not available");
- return;
- }
- if(!fQA){
- AliError("QA output not available");
- return;
- }
- fContainer = dynamic_cast<AliHFEcontainer *>(fOutput->FindObject("trackContainer"));
- if(!fContainer){
- AliError("Track container not found");
- return;
- }
- AliHFEpostAnalysis postanalysis;
- postanalysis.SetTaskResults(fContainer);
- TList *qalist = dynamic_cast<TList *>(fQA->FindObject("list_TaskQA"));
- if(!qalist){
- AliError("QA List not found");
- return;
- }
- postanalysis.SetTaskQA(qalist);
- printf("Running post analysis\n");
- //if(HasMCData())
- postanalysis.DrawMCSignal2Background();
- postanalysis.DrawEfficiency();
- postanalysis.DrawPIDperformance();
- postanalysis.DrawCutEfficiency();
-
- if (GetPlugin(kIsElecBackGround)) {
- AliHFEelecbackground elecBackGround;
- TList *oe = 0x0;
- if(!(oe = (TList*)dynamic_cast<TList *>(fOutput->FindObject("HFEelecbackground")))){
- return;
- }
- elecBackGround.Load(oe);
- elecBackGround.Plot();
- elecBackGround.PostProcess();
- }
- }
-}
-//_______________________________________________________________
-Bool_t AliAnalysisTaskHFE::IsEventInBinZero() {
- //
- //
- //
-
- //printf("test in IsEventInBinZero\n");
- if(!fInputEvent){
- AliError("Reconstructed Event not available");
- return kFALSE;
- }
-
- // check vertex
- const AliVVertex *vertex = fInputEvent->GetPrimaryVertex();
- if(!vertex) return kTRUE;
- //if(vertex) return kTRUE;
-
- // check tracks
- if(fInputEvent->GetNumberOfTracks()<=0) return kTRUE;
- //if(fInputEvent->GetNumberOfTracks()>0) return kTRUE;
-
-
- return kFALSE;
-
-}
-//____________________________________________________________
-void AliAnalysisTaskHFE::ProcessMC(){
- //
- // Runs the MC Loop (filling the container for the MC Cut Steps with the observables pt, eta and phi)
- // In case MC QA is on also MC QA loop is done
- //
- AliDebug(3, "Processing MC Information");
- Double_t eventContainer [4];
- eventContainer[0] = fMCEvent->GetPrimaryVertex()->GetZ();
- eventContainer[2] = fCentralityF;
- eventContainer[3] = fContributors;
- fVz = eventContainer[0];
- //printf("z position is %f\n",eventContainer[0]);
- //if(fCFM->CheckEventCuts(AliHFEcuts::kEventStepGenerated, fMCEvent))
- fCFM->GetEventContainer()->Fill(eventContainer,AliHFEcuts::kEventStepGenerated);
- Int_t nElectrons = 0;
- if(IsESDanalysis()){
- if(!((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (fCentralityF < 0))){ //kStepMCGeneratedZOutNoPileUpCentralityFine
- if (HasMCData() && IsQAOn(kMCqa)) {
- AliDebug(2, "Running MC QA");
-
- if(fMCEvent->Stack()){
- fMCQA->SetMCEvent(fMCEvent);
- fMCQA->SetGenEventHeader(fMCEvent->GenEventHeader());
- fMCQA->SetCentrality(fCentralityF);
- if(IsPbPb()) { fMCQA->SetPbPb();}
- else
- {
- if(fisppMultiBin) fMCQA->SetPPMultiBin();
- else fMCQA->SetPP();
- }
- fMCQA->Init();
-
- fMCQA->GetMesonKine();
-
- // loop over all tracks for decayed electrons
- for (Int_t igen = 0; igen < fMCEvent->GetNumberOfTracks(); igen++){
- TParticle* mcpart = fMCEvent->Stack()->Particle(igen);
- if(!mcpart) continue;
- fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kCharm);
- fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kBeauty);
- fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kCharm);
- fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kBeauty);
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kCharm, AliHFEmcQA::kElectronPDG); // no accept cut
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kBeauty, AliHFEmcQA::kElectronPDG); // no accept cut
- fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kOthers, AliHFEmcQA::kElectronPDG); // no accept cut
- }
- //fMCQA->EndOfEventAna(AliHFEmcQA::kCharm);
- //fMCQA->EndOfEventAna(AliHFEmcQA::kBeauty);
- }
-
- } // end of MC QA loop
- }
- // -----------------------------------------------------------------
- fCFM->SetMCEventInfo(fMCEvent);
- // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);
- } else {
- fCFM->SetMCEventInfo(fInputEvent);
- }
- // Run MC loop
- AliVParticle *mctrack = NULL;
- AliDebug(3, Form("Number of Tracks: %d", fMCEvent->GetNumberOfTracks()));
- for(Int_t imc = 0; imc <fMCEvent->GetNumberOfTracks(); imc++){
- if(!(mctrack = fMCEvent->GetTrack(imc))) continue;
- AliDebug(4, "Next MC Track");
- if(ProcessMCtrack(mctrack)) nElectrons++;
- }
-
- // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);
- fQACollection->Fill("nElectron", nElectrons);
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::ProcessESD(){
- //
- // Run Analysis of reconstructed event in ESD Mode
- // Loop over Tracks, filter according cut steps defined in AliHFEcuts
- //
- AliDebug(3, "Processing ESD Event");
- AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
- if(!fESD){
- AliError("ESD Event required for ESD Analysis");
- return;
- }
-
- // Set magnetic field if V0 task on
- if(fTaggedTrackAnalysis) {
- fTaggedTrackAnalysis->SetMagneticField(fESD->GetMagneticField());
- fTaggedTrackAnalysis->SetCentrality(fCentralityF);
- if(IsPbPb()) fTaggedTrackAnalysis->SetPbPb();
- else fTaggedTrackAnalysis->SetPP();
- }
-
- // Do event Normalization
- Double_t eventContainer[4];
- eventContainer[0] = 0.;
- if(HasMCData()) eventContainer[0] = fVz;
- else {
- if(fESD->GetPrimaryVertexSPD()) eventContainer[0] = fESD->GetPrimaryVertexSPD()->GetZ();
- }
- eventContainer[1] = 0.;
- eventContainer[2] = fCentralityF;
- eventContainer[3] = fContributors;
- if(fTriggerAnalysis->IsOfflineTriggerFired(fESD, AliTriggerAnalysis::kV0AND))
- eventContainer[1] = 1.;
-
- //
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);
-
- //
- if(fIdentifiedAsPileUp) return;
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);
-
- //
- if(TMath::Abs(fCentralityF) < 0) return;
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecCentralityOk);
- //printf("In ProcessESD %f\n",fCentralityF);
-
- //
- if(fIdentifiedAsOutInz) return;
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange);
-
- //
- if(!fPassTheEventCut) return;
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);
-
-
-
- fContainer->NewEvent();
-
- if (GetPlugin(kIsElecBackGround)) {
- fElecBackGround->SetEvent(fESD);
- }
- if (GetPlugin(kSecVtx)) {
- fSecVtx->SetEvent(fESD);
- fSecVtx->GetPrimaryCondition();
- }
-
- if(HasMCData()){
- if (GetPlugin(kSecVtx)) {
- fSecVtx->SetMCEvent(fMCEvent);
- fSecVtx->SetMCQA(fMCQA);
- }
- if (GetPlugin(kIsElecBackGround)) {
- fElecBackGround->SetMCEvent(fMCEvent);
- }
- }
-
- Double_t container[10];
- memset(container, 0, sizeof(Double_t) * 10);
- // container for the output THnSparse
- Double_t dataE[6]; // [pT, eta, Phi, type, 'C' or 'B']
- Double_t dataDca[7]; // [source, pT, dca, dcaSig, centrality]
- Int_t nElectronCandidates = 0;
- AliESDtrack *track = NULL, *htrack = NULL;
- AliMCParticle *mctrack = NULL;
- AliMCParticle *mctrackmother = NULL;
- Int_t pid = 0;
-
- Bool_t signal = kTRUE;
-
- fCFM->SetRecEventInfo(fESD);
-
- // minjung for IP QA(temporary ~ 2weeks)
- if(!fExtraCuts){
- fExtraCuts = new AliHFEextraCuts("hfetmpCuts","HFE tmp Cuts");
- }
- fExtraCuts->SetRecEventInfo(fESD);
-
- // Electron background analysis
- if (GetPlugin(kIsElecBackGround)) {
-
- AliDebug(2, "Running BackGround Analysis");
-
- fElecBackGround->Reset();
-
- } // end of electron background analysis
- //
- // Loop ESD
- //
- AliDebug(3, Form("Number of Tracks: %d", fESD->GetNumberOfTracks()));
- for(Int_t itrack = 0; itrack < fESD->GetNumberOfTracks(); itrack++){
- AliDebug(4, "New ESD track");
- track = fESD->GetTrack(itrack);
- track->SetESDEvent(fESD);
-
- // fill counts of v0-identified particles
- Int_t v0pid = -1;
- if(track->TestBit(BIT(14))) v0pid = AliPID::kElectron;
- else if(track->TestBit(BIT(15))) v0pid = AliPID::kPion;
- else if(track->TestBit(BIT(16))) v0pid = AliPID::kProton;
- // here the tagged track analysis will run
- if(fTaggedTrackAnalysis && v0pid > -1){
- AliDebug(1, Form("Track identified as %s", AliPID::ParticleName(v0pid)));
- fTaggedTrackAnalysis->ProcessTrack(track, v0pid);
- }
-
- AliDebug(3, Form("Doing track %d, %p", itrack, track));
-
- //////////////////////////////////////
- // preselect
- /////////////////////////////////////
- if(fPIDpreselect && fCutspreselect) {
- if(!PreSelectTrack(track)) continue;
- }
-
- signal = kTRUE;
-
- // Fill step without any cut
-
- if(HasMCData()){
- // Check if it is electrons near the vertex
- if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel()))))) continue;
-
- if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;
- else AliDebug(3, "Signal Electron");
-
- // Fill K pt for Ke3 contributions
- if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode())==321)) fQACollection->Fill("Kptspectra",mctrack->Pt());
- else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode())==130)) fQACollection->Fill("K0Lptspectra",mctrack->Pt());
- }
- // Cache new Track information inside the var manager
- fVarManager->NewTrack(track, mctrack, fCentralityF, -1, signal);
-
- if(fFillNoCuts) {
- if(signal || !fFillSignalOnly){
- fVarManager->FillContainer(fContainer, "recTrackContReco", AliHFEcuts::kStepRecNoCut, kFALSE);
- fVarManager->FillContainer(fContainer, "recTrackContMC", AliHFEcuts::kStepRecNoCut, kTRUE);
- }
- }
-
- // RecKine: ITSTPC cuts
- if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;
-
-
- // RecPrim
- if(fRejectKinkMother) {
- if(track->GetKinkIndex(0) != 0) continue; } // Quick and dirty fix to reject both kink mothers and daughters
- if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;
-
- // HFEcuts: ITS layers cuts
- if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;
-
- // HFE cuts: TOF PID and mismatch flag
- if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTOF, track)) continue;
-
- // HFE cuts: TPC PID cleanup
- if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;
-
- // HFEcuts: Nb of tracklets TRD0
- if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTRD, track)) continue;
-
- // Fill correlation maps before PID
- if(signal && fContainer->GetCorrelationMatrix("correlationstepbeforePID")) {
- //printf("Fill correlation maps before PID\n");
- fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepbeforePID"));
- }
-
- if(HasMCData()){
- FillProductionVertex(track);
-
- if(fMCQA && signal){
- fMCQA->SetCentrality(fCentralityF);
- if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){
- Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.};
- Double_t hfeimpactRtmp=0., hfeimpactnsigmaRtmp=0.;
- fExtraCuts->GetHFEImpactParameters(track, hfeimpactRtmp, hfeimpactnsigmaRtmp);
- UChar_t itsPixel = track->GetITSClusterMap();
- Double_t ilyrhit=0, ilyrstat=0;
- for(Int_t ilyr=0; ilyr<6; ilyr++){
- if(TESTBIT(itsPixel, ilyr)) ilyrhit += TMath::Power(2,ilyr);
- if(fExtraCuts->CheckITSstatus(fExtraCuts->GetITSstatus(track,ilyr))) ilyrstat += TMath::Power(2,ilyr);
- }
- fMCQA->SetITSInfo(ilyrhit,ilyrstat);
- fMCQA->SetHFEImpactParameters(hfeimpactRtmp, hfeimpactnsigmaRtmp);
- fMCQA->SetTrkKine(track->Pt(),track->Eta(), track->Phi());
- fMCQA->SetContainerStep(3);
- for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
- weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
- if(!fisNonHFEsystematics)break;
- }
-
- if(fisNonHFEsystematics){
- //Fill additional containers for electron source distinction
- Int_t elecSource = 0;
- elecSource = fMCQA->GetElecSource(mctrack->Particle());
- const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
- const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
- Int_t iName = 0;
- for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
- if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
- if(elecSource == iSource){
- for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
- if(weightElecBgV0[iLevel]>0){
- fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, weightElecBgV0[iLevel]);
- }
- else if(weightElecBgV0[iLevel]<0){
- fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, -1*weightElecBgV0[iLevel]);
- }
- }
- break;
- }
- iName++;
- if(iName == kElecBgSpecies)iName = 0;
- }
- }
- //else{
- if(weightElecBgV0[0]>0) {
- fVarManager->FillContainer(fContainer, "conversionElecs", 3, kFALSE, weightElecBgV0[0]);
- fVarManager->FillContainer(fContainer, "conversionElecs", 4, kTRUE, weightElecBgV0[0]);
- }
- else if(weightElecBgV0[0]<0) {
- fVarManager->FillContainer(fContainer, "mesonElecs", 3, kFALSE, -1*weightElecBgV0[0]);
- fVarManager->FillContainer(fContainer, "mesonElecs", 4, kTRUE, -1*weightElecBgV0[0]);
- }
- //}
- }
- }
- }
-
- if(TMath::Abs(track->Eta()) < 0.5){
- if(track->GetInnerParam())
- fQACollection->Fill("TPCdEdxBeforePID", track->GetInnerParam()->P(), track->GetTPCsignal());
- fQACollection->Fill("TPCnSigmaBeforePID", track->P(), fInputHandler->GetPIDResponse()->NumberOfSigmasTPC(track, AliPID::kElectron));
- }
-
- AliHFEpidObject hfetrack;
- hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
- hfetrack.SetRecTrack(track);
- if(HasMCData()) hfetrack.SetMCTrack(mctrack);
- hfetrack.SetCentrality(fCentralityF);
- if(IsPbPb()) hfetrack.SetPbPb();
- else hfetrack.SetPP();
- fPID->SetVarManager(fVarManager);
- if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue;
- nElectronCandidates++;
-
- // Temporary histogram for chi2/ITS cluster
- if(IsPbPb()) {
- TBits shared = track->GetTPCSharedMap();
- Int_t sharebit=0;
- if(shared.CountBits() >= 2) sharebit=1;
-
- Double_t itschi2percluster = 0.0;
- Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));
- if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;
-
- Double_t itsChi2[7] = {track->Pt(),track->Eta(), track->Phi(),
- fCentralityF,track->GetTPCsignalN(), sharebit,itschi2percluster};
- fQACollection->Fill("fChi2perITScluster", itsChi2);
- }
- else{
-
- Double_t itschi2percluster = 0.0;
- Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));
- if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;
-
- Double_t itsChi2[3] = {track->Pt(), fCentralityF, itschi2percluster};
- fQACollection->Fill("fChi2perITScluster", itsChi2);
- }
-
- // Fill Histogram for Hadronic Background
- if(HasMCData()){
- if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11))
- fVarManager->FillContainer(fContainer, "hadronicBackground", UInt_t(0), kFALSE);
- else if(mctrack){
- // Fill Ke3 contributions
- Int_t glabel=TMath::Abs(mctrack->GetMother());
- if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){
- if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==321)
- fQACollection->Fill("Ke3Kecorr",mctrack->Pt(),mctrackmother->Pt());
- else if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==130)
- fQACollection->Fill("Ke3K0Lecorr",mctrack->Pt(),mctrackmother->Pt());
- }
- }
- }
-
- // Fill Containers
- if(signal) {
- // Apply weight for background contamination
- if(fBackGroundFactorApply) {
- if(IsPbPb() && fCentralityF >= 0) fWeightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));
- else fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case
-
- if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;
- else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;
- // weightBackGround as special weight
- fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);
- }
- fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));
- }
-
- Bool_t bTagged=kFALSE;
- if(GetPlugin(kSecVtx)) {
- AliDebug(2, "Running Secondary Vertex Analysis");
- if(fSecVtx->Process(track) && signal) {
- fVarManager->FillContainer(fContainer, "recTrackContSecvtxReco", AliHFEcuts::kStepHFEcutsSecvtx, kFALSE);
- fVarManager->FillContainer(fContainer, "recTrackContSecvtxMC", AliHFEcuts::kStepHFEcutsSecvtx, kTRUE);
- bTagged=kTRUE;
- }
- }
-
- if(HasMCData()){
- dataE[0] = track->Pt();
- dataE[1] = track->Eta();
- dataE[2] = track->Phi();
- dataE[3] = track->Charge();
- dataE[4] = -1.;
- dataE[5] = -1.;
-
- // Track selected: distinguish between true and fake
- AliDebug(1, Form("Candidate Selected, filling THnSparse, PID: %d\n", mctrack->Particle()->GetPdgCode()));
- if((pid = TMath::Abs(mctrack->Particle()->GetPdgCode())) == 11){
- Int_t type = 0;
- if(fSignalCuts->IsCharmElectron(track))
- type = 1;
- else if(fSignalCuts->IsBeautyElectron(track))
- type = 2;
- AliDebug(1, Form("Type: %d\n", type));
- if(type){
- dataE[5] = type; // beauty[1] or charm[2]
- dataE[4] = 2; // signal electron
- }
- else{
- dataE[4] = 1; // not a signal electron
- dataE[5] = 0;
- }
- }
- else {
- // Fill THnSparse with the information for Fake Electrons
- dataE[4] = 0;
- dataE[5] = 0;
- }
- // fill the performance THnSparse, if the mc origin could be defined
- if(dataE[4] > -1){
- AliDebug(1, Form("Entries: [%.3f|%.3f|%.3f|%f|%f|%f]\n", dataE[0],dataE[1],dataE[2],dataE[3],dataE[4],dataE[5]));
- fQACollection->Fill("PIDperformance", dataE);
- }
- }
-
- // Electron background analysis
- if (GetPlugin(kIsElecBackGround)) {
-
- AliDebug(2, "Running BackGround Analysis");
-
- for(Int_t jtrack = 0; jtrack < fESD->GetNumberOfTracks(); jtrack++){
- htrack = fESD->GetTrack(jtrack);
- if ( itrack == jtrack ) continue;
- fElecBackGround->PairAnalysis(track, htrack);
- }
- } // end of electron background analysis
-
-
- Int_t sourceDca =-1;
- if (GetPlugin(kDEstep)) {
- Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.,};
- Int_t elecSource = 0;
- // minjung for IP QA(temporary ~ 2weeks)
- Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;
- fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
- sourceDca=0;
- if(HasMCData())
- {
- // minjung for IP QA(temporary ~ 2weeks)
- if(fSignalCuts->IsCharmElectron(track)){
- sourceDca=1;
- }
- else if(fSignalCuts->IsBeautyElectron(track)){
- sourceDca=2;
- }
- else if(fSignalCuts->IsGammaElectron(track)){
- sourceDca=3;
- }
- else if(fSignalCuts->IsNonHFElectron(track)){
- sourceDca=4;
- }
- else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
- sourceDca=5;
- fQACollection->Fill("hadronsBeforeIPcut",track->Pt());
- fQACollection->Fill("hadronsBeforeIPcutMC",mctrack->Pt());
- }
- else {
- sourceDca=6;
- }
-
- if(fMCQA && signal) {
-
- fMCQA->SetContainerStep(0);
- for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
- weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
- if(!fisNonHFEsystematics)break;
- }
-
- if(fisNonHFEsystematics){
- //Fill additional containers for electron source distinction
- elecSource = fMCQA->GetElecSource(mctrack->Particle());
- const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
- const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
- Int_t iName = 0;
- for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
- if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
- if(elecSource == iSource){
- for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
- if(weightElecBgV0[iLevel]>0) fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 0, kFALSE, weightElecBgV0[iLevel]);
- else if(weightElecBgV0[iLevel]<0) fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 0, kFALSE, -1*weightElecBgV0[iLevel]);
- }
- break;
- }
- iName++;
- if(iName == kElecBgSpecies)iName = 0;
- }
- }
- //else{
- if(weightElecBgV0[0]>0) {
- fVarManager->FillContainer(fContainer, "conversionElecs", 0, kFALSE, weightElecBgV0[0]);
- fVarManager->FillContainer(fContainer, "conversionElecs", 5, kTRUE, weightElecBgV0[0]);
- }
- else if(weightElecBgV0[0]<0) {
- fVarManager->FillContainer(fContainer, "mesonElecs", 0, kFALSE, -1*weightElecBgV0[0]);
- fVarManager->FillContainer(fContainer, "mesonElecs", 5, kTRUE, -1*weightElecBgV0[0]);
- }
- //}
- if(bTagged){ // bg estimation for the secondary vertex tagged signals
- if(weightElecBgV0[0]>0) fVarManager->FillContainer(fContainer, "conversionElecs", 2, kFALSE, weightElecBgV0[0]);
- else if(weightElecBgV0[0]<0) fVarManager->FillContainer(fContainer, "mesonElecs", 2, kFALSE, -1*weightElecBgV0[0]);
- }
- }
- } // end of MC
-
- dataDca[0]=sourceDca;
- dataDca[1]=track->Pt();
- dataDca[2]=hfeimpactR;
- dataDca[3]=hfeimpactnsigmaR;
- dataDca[4]=fCentralityF;
- dataDca[5] = 49;
- Double_t xr[3]={49,49,49};
- if(HasMCData()) {
- mctrack->XvYvZv(xr);
- dataDca[5] = TMath::Sqrt(xr[0]*xr[0]+xr[1]*xr[1]);
- }
- dataDca[6] = v0pid;
-
- // printf("Entries dca: [%.3f|%.3f|%.3f|%f|%f]\n", dataDca[0],dataDca[1],dataDca[2],dataDca[3],dataDca[4]);
- if (!HasMCData()) fQACollection->Fill("Dca", dataDca);
- else if(signal) fQACollection->Fill("Dca", dataDca);
-
-
- // Fill Containers for impact parameter analysis
- if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;
- if(HasMCData()){
- if(fMCQA && signal) {
- fMCQA->SetContainerStep(1);
- for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
- weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE
- if(!fisNonHFEsystematics)break;
- }
- if(fisNonHFEsystematics){
- //Fill additional containers for electron source distinction
- elecSource = fMCQA->GetElecSource(mctrack->Particle());
- const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
- const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
- Int_t iName = 0;
- for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){
- if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;
- if(elecSource == iSource){
- for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
- if(weightElecBgV0[iLevel]>0) fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 1, kFALSE, weightElecBgV0[iLevel]);
- else if(weightElecBgV0[iLevel]<0) fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 1, kFALSE, -1*weightElecBgV0[iLevel]);
- }
- break;
- }
- iName++;
- if(iName == kElecBgSpecies)iName = 0;
- }
- }
- // else{
- if(weightElecBgV0[0]>0) {
- fVarManager->FillContainer(fContainer, "conversionElecs", 1, kFALSE, weightElecBgV0[0]);
- fVarManager->FillContainer(fContainer, "conversionElecs", 6, kTRUE, weightElecBgV0[0]);
- }
- else if(weightElecBgV0[0]<0) {
- fVarManager->FillContainer(fContainer, "mesonElecs", 1, kFALSE, -1*weightElecBgV0[0]);
- fVarManager->FillContainer(fContainer, "mesonElecs", 6, kTRUE, -1*weightElecBgV0[0]);
- }
- //}
- }
- }
- if(signal) {
- fVarManager->FillContainer(fContainer, "recTrackContDEReco", AliHFEcuts::kStepHFEcutsDca, kFALSE);
- fVarManager->FillContainer(fContainer, "recTrackContDEMC", AliHFEcuts::kStepHFEcutsDca, kTRUE);
- fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterDE"));
- }
- if(HasMCData()){
- if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){
- fQACollection->Fill("hadronsAfterIPcut",track->Pt());
- fQACollection->Fill("hadronsAfterIPcutMC",mctrack->Pt());
- }
- }
- }
-
- }
- fQACollection->Fill("nElectronTracksEvent", nElectronCandidates);
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::ProcessAOD(){
- //
- // Run Analysis in AOD Mode
- // Function is still in development
- //
- AliDebug(3, "Processing AOD Event");
- Double_t eventContainer[4];
- if(HasMCData()) eventContainer[0] = fVz;
- else {
- eventContainer[0] = fInputEvent->GetPrimaryVertex()->GetZ();
- }
- eventContainer[1] = 1.; // No Information available in AOD analysis, assume all events have V0AND
- eventContainer[2] = fCentralityF;
- eventContainer[3] = fContributors;
-
- AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
- if(!fAOD){
- AliError("AOD Event required for AOD Analysis");
- return;
- }
-
- //
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);
-
- //
- if(fIdentifiedAsPileUp) return;
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);
-
- //
- if(fIdentifiedAsOutInz) return;
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange);
-
- //
- if(!fPassTheEventCut) return;
- fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);
-
- fContainer->NewEvent();
-
- AliAODTrack *track = NULL;
- AliAODMCParticle *mctrack = NULL;
- Double_t dataE[6]; // [pT, eta, Phi, Charge, type, 'C' or 'B']
- Int_t nElectronCandidates = 0;
- Int_t pid;
- Bool_t signal;
- for(Int_t itrack = 0; itrack < fAOD->GetNumberOfTracks(); itrack++){
- track = fAOD->GetTrack(itrack); mctrack = NULL;
- if(!track) continue;
- if(track->GetFlags() != 1<<4) continue; // Only process AOD tracks where the HFE is set
-
- signal = kTRUE;
- if(HasMCData()){
-
- Int_t label = TMath::Abs(track->GetLabel());
- if(label)
- mctrack = dynamic_cast<AliAODMCParticle *>(fMCEvent->GetTrack(label));
- if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;
- }
- fVarManager->NewTrack(track, mctrack, fCentralityF, -1, kTRUE);
- // track accepted, do PID
- AliHFEpidObject hfetrack;
- hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);
- hfetrack.SetRecTrack(track);
- if(HasMCData()) hfetrack.SetMCTrack(mctrack);
- hfetrack.SetCentrality(fCentralityF);
- fPID->SetVarManager(fVarManager);
- if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue; // we will do PID here as soon as possible
- // Apply weight for background contamination
- Double_t weightBackGround = 1.0;
-
- // not correct treatment for pp
- if(fBackGroundFactorApply==kTRUE) {
- if(IsPbPb()) weightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));
- else weightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P()));
-
- if(weightBackGround < 0.0) weightBackGround = 0.0;
- else if(weightBackGround > 1.0) weightBackGround = 1.0;
- fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, weightBackGround);
- }
-
- nElectronCandidates++;
- if(HasMCData()){
- dataE[0] = track->Pt();
- dataE[1] = track->Eta();
- dataE[2] = track->Phi();
- dataE[3] = track->Charge();
- dataE[4] = -1;
- dataE[5] = -1;
- // Track selected: distinguish between true and fake
- AliDebug(1, Form("Candidate Selected, filling THnSparse, PID: %d\n", mctrack ? mctrack->GetPdgCode(): -1));
- if(mctrack && ((pid = TMath::Abs(mctrack->GetPdgCode())) == 11)){
-
- Int_t type = 0;
- if(fSignalCuts->IsCharmElectron(track))
- type = 1;
- else if(fSignalCuts->IsBeautyElectron(track))
- type = 2;
- AliDebug(1, Form("Type: %d\n", type));
- if(type){
- dataE[5] = type; // beauty[1] or charm[2]
- dataE[4] = 2; // signal electron
- }
- else{
- dataE[4] = 1; // not a signal electron
- dataE[5] = 0;
- }
- }
- else {
- // Fill THnSparse with the information for Fake Electrons
- dataE[4] = 0;
- dataE[5] = 0;
- }
- // fill the performance THnSparse, if the mc origin could be defined
- if(dataE[4] > -1){
- AliDebug(1, Form("Entries: [%.3f|%.3f|%.3f|%f|%f|%f]\n", dataE[0],dataE[1],dataE[2],dataE[3],dataE[4],dataE[5]));
- fQACollection->Fill("PIDperformance", dataE);
- }
- }
- }
- fQACollection->Fill("nElectronTracksEvent", nElectronCandidates);
-}
-
-//____________________________________________________________
-Bool_t AliAnalysisTaskHFE::ProcessMCtrack(AliVParticle *track){
- //
- // Filter the Monte Carlo Track
- // Additionally Fill a THnSparse for Signal To Background Studies
- // Works for AOD and MC analysis Type
- //
- fVarManager->NewTrack(track, NULL, fCentralityF, -1, kTRUE);
- Double_t signalContainer[6];
-
- signalContainer[0] = track->Pt();
- signalContainer[1] = track->Eta();
- signalContainer[2] = track->Phi();
- signalContainer[3] = track->Charge()/3;
-
- 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)
- if(IsESDanalysis()){
- AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(track);
- if(mctrack){
- vertex[0] = mctrack->Particle()->Vx();
- vertex[1] = mctrack->Particle()->Vy();
- }
- } else {
- AliAODMCParticle *aodmctrack = dynamic_cast<AliAODMCParticle *>(track);
- if(aodmctrack) aodmctrack->XvYvZv(vertex);
- }
-
- if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, track)) return kFALSE;
- fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGenerated, kFALSE);
- signalContainer[4] = 0;
- if(fSignalCuts->IsSelected(track)){
- //fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCsignal, kFALSE);
- // Filling of the Signal/Background histogram using the
- // definition of the codes for charm and beauty as below in
- // th crearion of the histogram
- if(fSignalCuts->IsCharmElectron(track))
- signalContainer[4] = 1;
- else
- signalContainer[4] = 2;
- } else {
- signalContainer[4] = 0; // (and other background)
- }
- signalContainer[5] = 0;
- // apply cut on the sqrt of the production vertex
- Double_t radVertex = TMath::Sqrt(vertex[0]*vertex[0] + vertex[1] * vertex[1]);
- if(radVertex < 3.5){
- // Within first ITS layer(2) -> Background we cannot reject by ITS cut, let it pass
- signalContainer[5] = 1;
- } else if (radVertex < 7.5){
- signalContainer[5] = 2;
- }
- fQACollection->Fill("SignalToBackgroundMC", signalContainer);
-
- // Step GeneratedZOutNoPileUp
- if((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (fCentralityF < 0)) return kFALSE;
- fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedZOutNoPileUpCentralityFine, kFALSE);
- //printf("In ProcessMCtrack %f\n",fCentralityF);
-
- // Step Generated Event Cut
- if(!fPassTheEventCut) return kFALSE;
- fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedEventCut, kFALSE);
-
- if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepMCInAcceptance, track)) return kFALSE;
- fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCInAcceptance, kFALSE);
- return kTRUE;
-}
-
-//____________________________________________________________
-Bool_t AliAnalysisTaskHFE::PreSelectTrack(AliESDtrack *track) const {
- //
- // Preselect tracks
- //
-
-
- Bool_t survived = kTRUE;
-
- if(!fCutspreselect->CheckParticleCuts(AliHFEcuts::kStepRecKineITSTPC, track)) {
- survived = kFALSE;
- //printf("Did not pass AliHFEcuts::kStepRecKineITSTPC\n");
- }
- //else printf("Pass AliHFEcuts::kStepRecKineITSTPC\n");
- if(!fCutspreselect->CheckParticleCuts(AliHFEcuts::kStepRecPrim, track)) {
- survived = kFALSE;
- //printf("Did not pass AliHFEcuts::kStepRecPrim\n");
- }
- //else printf("Pass AliHFEcuts::kStepRecPrim\n");
- if(!fCutspreselect->CheckParticleCuts(AliHFEcuts::kStepHFEcutsITS, track)) {
- survived = kFALSE;
- //printf("Did not pass AliHFEcuts::kStepHFEcutsITS\n");
- }
- //else printf("Pass AliHFEcuts::kStepHFEcutsITS\n");
- if(!fCutspreselect->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTOF, track)) {
- survived = kFALSE;
- //printf("Did not pass AliHFEcuts::kStepHFEcutsTOF\n");
- }
- //else printf("Pass AliHFEcuts::kStepHFEcutsTOF\n");
- if(!fCutspreselect->CheckParticleCuts(AliHFEcuts::kStepHFEcutsTRD, track)) {
- survived = kFALSE;
- //printf("Did not pass AliHFEcuts::kStepHFEcutsTRD\n");
- }
- //else printf("Pass AliHFEcuts::kStepHFEcutsTRD\n");
-
- if(survived){
- // Apply PID
- AliHFEpidObject hfetrack;
- hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);
- hfetrack.SetRecTrack(track);
- if(!fPIDpreselect->IsSelected(&hfetrack)) {
- //printf("Did not pass AliHFEcuts::kPID\n");
- survived = kFALSE;
- }
- //else printf("Pass AliHFEcuts::kPID\n");
- }
-
- return survived;
-
-}
-//____________________________________________________________
-void AliAnalysisTaskHFE::MakeEventContainer(){
- //
- // Create the event container for the correction framework and link it
- // 1st bin: Vertex z-position
- // 2nd bin: V0AND decision (normalization to sigma_inel)
- // 3rd bin: Centrality class (for pp defined as number of contributors in vertex.)
- // 4th bin: Number of contributors > 0
- //
-
- const Int_t kNvar = 4; // number of variables on the grid:
- Int_t nBins[kNvar] = {120, 2, 11, 2};
- Double_t binMin[kNvar] = {-30. , 0., 0.0, 0.};
- Double_t binMax[kNvar] = {30., 2., 11.0, 2.};
-
- AliCFContainer *evCont = new AliCFContainer("eventContainer", "Container for events", AliHFEcuts::kNcutStepsEvent, kNvar, nBins);
-
- Double_t *vertexBins = AliHFEtools::MakeLinearBinning(nBins[0], binMin[0], binMax[0]);
- Double_t *v0andBins = AliHFEtools::MakeLinearBinning(nBins[1], binMin[1], binMax[1]);
- Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBins[2], binMin[2], binMax[2]);
- Double_t *contributorsBins = AliHFEtools::MakeLinearBinning(nBins[3], binMin[3], binMax[3]);
- evCont->SetBinLimits(0, vertexBins);
- evCont->SetBinLimits(1, v0andBins);
- evCont->SetBinLimits(2, centralityBins);
- evCont->SetBinLimits(3, contributorsBins);
- delete[] vertexBins; delete[] v0andBins; delete[] centralityBins; delete[] contributorsBins;
-
- fCFM->SetEventContainer(evCont);
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::MakeParticleContainer(){
- //
- // Create the particle container for the correction framework manager and
- // link it
- //
- if(!fContainer) fContainer = new AliHFEcontainer("trackContainer");
- fVarManager->DefineVariables(fContainer);
-
- // Create Correction Framework containers
- fContainer->CreateContainer("MCTrackCont", "Track Container filled with MC information", AliHFEcuts::kNcutStepsMCTrack);
- fContainer->CreateContainer("recTrackContReco", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());
- fContainer->CreateContainer("recTrackContMC", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());
-
- fContainer->CreateContainer("hadronicBackground", "Container for Hadronic Background", 2);
- fContainer->CreateContainer("recTrackContDEReco", "Container for displaced electron analysis with Reco information", 1);
- fContainer->CreateContainer("recTrackContDEMC", "Container for displaced electron analysis with MC information", 1);
- fContainer->CreateContainer("recTrackContSecvtxReco", "Container for secondary vertexing analysis with Reco information", 1);
- fContainer->CreateContainer("recTrackContSecvtxMC", "Container for secondary vertexing analysis with MC information", 1);
-
- if(HasMCData()){
- fContainer->CreateContainer("conversionElecs", "Container for weighted conversion electrons",7);
- fContainer->CreateContainer("mesonElecs", "Container for weighted electrons from meson decays",7);
- fContainer->Sumw2("conversionElecs");
- fContainer->Sumw2("mesonElecs");
-
- if(fisNonHFEsystematics){
- const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};
- const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};
- for(Int_t iSource = 0; iSource < kElecBgSpecies; iSource++){
- for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){
- 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]),4);
- fContainer->CreateContainer(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]), Form("Container for weighted electrons from %s decays, %s level",sourceName[iSource],levelName[iLevel]),4);
- fContainer->Sumw2(Form("conversionElecs%s%s",sourceName[iSource],levelName[iLevel]));
- fContainer->Sumw2(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]));
- }
- }
- }
- //fContainer->CreateContainer("charmElecs", "Container for weighted charm electrons",2);
- }
-
- fContainer->CreateCorrelationMatrix("correlationstepafterPID","THnSparse with correlations");
- fContainer->CreateCorrelationMatrix("correlationstepafterDE","THnSparse with correlations");
- if(!fVarManager->IsVariableDefined("centrality")) {
- //printf("Create the two other correlation maps\n");
- fContainer->CreateCorrelationMatrix("correlationstepbeforePID","THnSparse with correlations");
- fContainer->CreateCorrelationMatrix("correlationstepafterTOF","THnSparse with correlations");
- }
-
- // Define the step names
- for(UInt_t istep = 0; istep < AliHFEcuts::kNcutStepsMCTrack; istep++){
- fContainer->SetStepTitle("MCTrackCont", AliHFEcuts::MCCutName(istep), istep);
- }
- for(UInt_t istep = 0; istep < AliHFEcuts::kNcutStepsRecTrack; istep++){
- fContainer->SetStepTitle("recTrackContReco", AliHFEcuts::RecoCutName(istep), istep);
- fContainer->SetStepTitle("recTrackContMC", AliHFEcuts::RecoCutName(istep), istep);
- }
- for(UInt_t ipid = 0; ipid < fPID->GetNumberOfPIDdetectors(); ipid++){
- fContainer->SetStepTitle("recTrackContReco", fPID->SortedDetectorName(ipid), AliHFEcuts::kNcutStepsRecTrack + ipid);
- fContainer->SetStepTitle("recTrackContMC", fPID->SortedDetectorName(ipid), AliHFEcuts::kNcutStepsRecTrack + ipid);
- }
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::InitPIDperformanceQA(){
- // Add a histogram for Fake electrons
- const Int_t nDim=6;
- Int_t nBin[nDim] = {40, 8, 18, 2, 3, 3};
- //number of variables on the grid:pt,eta,phi,charge,
- const Double_t kPtbound[2] = {0.1, 20.};
- const Double_t kEtabound[2] = {-0.8, 0.8};
- const Double_t kPhibound[2] = {0., 2. * TMath::Pi()};
- const Double_t kChargebound[2] = {-1.1, 1.1};
- const Double_t kAddInf1bound[2] = {0., 3.};
- const Double_t kAddInf2bound[2] = {0., 3.};
- Double_t minima[nDim] = {kPtbound[0], kEtabound[0], kPhibound[0], kChargebound[0], kAddInf1bound[0], kAddInf2bound[0]};
- Double_t maxima[nDim] = {kPtbound[1], kEtabound[1], kPhibound[1], kChargebound[1], kAddInf1bound[1], kAddInf2bound[1]};
-
- fQACollection->CreateTHnSparse("PIDperformance", "PID performance; pT [GeV/c]; theta [rad]; phi [rad]; charge; type (0 - not el, 1 - other el, 2 - HF el; flavor (0 - no, 1 - charm, 2 - bottom)", nDim, nBin, minima, maxima);
- fQACollection->CreateTHnSparse("SignalToBackgroundMC", "PID performance; pT [GeV/c]; theta [rad]; phi [rad]; charge; flavor (0 - no, 1 - charm, 2 - bottom); ITS Cluster (0 - no, 1 - first (and maybe second), 2 - second)", nDim, nBin, minima, maxima);
-
- fQACollection->BinLogAxis("PIDperformance", 0);
- fQACollection->BinLogAxis("SignalToBackgroundMC", 0);
- fQACollection->Sumw2("PIDperformance");
- fQACollection->Sumw2("SignalToBackgroundMC");
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::InitContaminationQA(){
- //
- // Add QA for Impact Parameter cut
- //
-
- TObjArray *array = fVarManager->GetVariables();
- Int_t nvars = array->GetEntriesFast();
- for(Int_t v = 0; v < nvars; v++) {
- AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);
- if(!variable) continue;
- TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());
- if(!name.CompareTo("pt")) {
- const Int_t nBinPt = variable->GetNumberOfBins();
- const Double_t *kPtRange = variable->GetBinning();
-
- fQACollection->CreateTH1Farray("hadronsBeforeIPcut", "Hadrons before IP cut", nBinPt, kPtRange);
- fQACollection->CreateTH1Farray("hadronsAfterIPcut", "Hadrons after IP cut", nBinPt, kPtRange);
- fQACollection->CreateTH1Farray("hadronsBeforeIPcutMC", "Hadrons before IP cut; MC p_{t}", nBinPt, kPtRange);
- fQACollection->CreateTH1Farray("hadronsAfterIPcutMC", "Hadrons after IP cut; MC p_{t} ", nBinPt, kPtRange);
-
- fQACollection->CreateTH2Farray("Ke3Kecorr", "Ke3 decay e and K correlation; Ke3K p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
- fQACollection->CreateTH2Farray("Ke3K0Lecorr", "Ke3 decay e and K0L correlation; Ke3K0L p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);
- fQACollection->CreateTH1Farray("Kptspectra", "Charged Kaons: MC p_{t} ", nBinPt, kPtRange);
- fQACollection->CreateTH1Farray("K0Lptspectra", "K0L: MC p_{t} ", nBinPt, kPtRange);
-
- const Double_t kDCAbound[2] = {-5., 5.};
- const Double_t kDCAsigbound[2] = {-50., 50.};
-
- const Int_t nDimDca=7;
- const Int_t nBinDca[nDimDca] = { 8, nBinPt, 2000, 2000, 12, 500, 6};
- Double_t minimaDca[nDimDca] = { -1., 0., kDCAbound[0], kDCAsigbound[0], -1., 0, -1};
- Double_t maximaDca[nDimDca] = { 7., 20., kDCAbound[1], kDCAsigbound[1], 11., 50, 5};
-
- Double_t *sourceBins = AliHFEtools::MakeLinearBinning(nBinDca[0], minimaDca[0], maximaDca[0]);
- Double_t *dcaBins = AliHFEtools::MakeLinearBinning(nBinDca[2], minimaDca[2], maximaDca[2]);
- Double_t *dcaSigBins = AliHFEtools::MakeLinearBinning(nBinDca[3], minimaDca[3], maximaDca[3]);
- Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBinDca[4], minimaDca[4], maximaDca[4]);
- Double_t *eProdRBins = AliHFEtools::MakeLinearBinning(nBinDca[5], minimaDca[5], maximaDca[5]);
- Double_t *v0PIDBins = AliHFEtools::MakeLinearBinning(nBinDca[6], minimaDca[6], maximaDca[6]);
-
- fQACollection->CreateTHnSparseNoLimits("Dca", "Dca; source (0-all, 1-charm,etc); pT [GeV/c]; dca; dcasig; centrality bin; eProdR; v0pid", nDimDca, nBinDca);
- ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(0, sourceBins);
- ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(1, kPtRange);
- ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(2, dcaBins);
- ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(3, dcaSigBins);
- ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(4, centralityBins);
- ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(5, eProdRBins);
- ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(6, v0PIDBins);
-
- break;
- }
- }
-
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::InitHistoITScluster(){
- //
- // Initialize a temporary histogram to monitor the chi2/ITS cluster
- if(IsPbPb()) {
- const Int_t kNDim = 7;
- const Int_t kNBins[kNDim] = {88, 20,90,11, 160, 2, 1000};
- const Double_t kMin[kNDim] = {0.1, -1,0, 0.,0., 0, 0.};
- const Double_t kMax[kNDim] = {20., 1, 2.*TMath::Pi(), 11.,160, 2, 100.};
- fQACollection->CreateTHnSparse("fChi2perITScluster", "chi2/ITS cluster; p_{T} (GeV/c);eta;phi; centrality class;nclus;sharebit; #chi^{2}/ITS cluster", kNDim, kNBins, kMin, kMax);
- fQACollection->BinLogAxis("fChi2perITScluster", 0);
- }
- else
- {
- const Int_t kNDim = 3;
- const Int_t kNBins[kNDim] = {44, 11, 1000};
- const Double_t kMin[kNDim] = {0.1, 0., 0.};
- const Double_t kMax[kNDim] = {20., 11., 100.};
- fQACollection->CreateTHnSparse("fChi2perITScluster", "chi2/ITS cluster; p_{T} (GeV/c); centrality class; #chi^{2}/ITS cluster", kNDim, kNBins, kMin, kMax);
- fQACollection->BinLogAxis("fChi2perITScluster", 0);
- }
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::SelectSpecialTrigger(const Char_t *trgclust, Int_t runMin, Int_t runMax){
- //
- // Select only events triggered by a special trigeer cluster
- //
- if(!fSpecialTrigger) fSpecialTrigger = new AliOADBContainer("SpecialTrigger");
- fSpecialTrigger->AppendObject(new TObjString(trgclust), runMin, runMax);
-}
-
-//____________________________________________________________
-const Char_t * AliAnalysisTaskHFE::GetSpecialTrigger(Int_t run){
- //
- // Derive selected trigger string for given run
- //
- if(!fSpecialTrigger) return NULL;
- TObjString *trg = dynamic_cast<TObjString *>(fSpecialTrigger->GetObject(run));
- if(!trg) return NULL;
- return trg->String().Data();
-}
-
-//____________________________________________________________
-void AliAnalysisTaskHFE::PrintStatus() const {
- //
- // Print Analysis status
- //
- printf("\n\tAnalysis Settings\n\t========================================\n\n");
- printf("\tSecondary Vertex finding: %s\n", GetPlugin(kSecVtx) ? "YES" : "NO");
- printf("\tPrimary Vertex resolution: %s\n", GetPlugin(kPriVtx) ? "YES" : "NO");
- printf("\tDisplaced electron analysis step: %s\n", GetPlugin(kDEstep) ? "YES" : "NO");
- printf("\tTagged Track Analysis: %s\n", GetPlugin(kTaggedTrackAnalysis) ? "YES" : "NO");
- printf("\n");
- printf("\tParticle Identification Detectors:\n");
- fPID->PrintStatus();
- printf("\n");
- printf("\tQA: \n");
- printf("\t\tPID: %s\n", IsQAOn(kPIDqa) ? "YES" : "NO");
- printf("\t\tCUTS: %s\n", (fCuts != NULL && fCuts->IsQAOn()) ? "YES" : "NO");
- printf("\t\tMC: %s\n", IsQAOn(kMCqa) ? "YES" : "NO");
- printf("\n");
-}
-
-//____________________________________________________________
-Bool_t AliAnalysisTaskHFE::FillProductionVertex(const AliVParticle * const track) const{
- //
- // Find the production vertex of the associated MC track
- //
- if(!fMCEvent) return kFALSE;
- const AliVParticle *mctrack = NULL;
- TString objectType = track->IsA()->GetName();
- if(objectType.CompareTo("AliESDtrack") == 0 || objectType.CompareTo("AliAODTrack") == 0){
- // Reconstructed track
- mctrack = fMCEvent->GetTrack(TMath::Abs(track->GetLabel()));
- } else {
- // MCParticle
- mctrack = track;
- }
-
- if(!mctrack) return kFALSE;
-
- Double_t xv = 0.0;
- Double_t yv = 0.0;
-
- if(TString(mctrack->IsA()->GetName()).CompareTo("AliMCParticle") == 0){
- // case MCParticle
- const AliMCParticle *mcpart = dynamic_cast<const AliMCParticle *>(mctrack);
- if(mcpart){
- xv = mcpart->Xv();
- yv = mcpart->Yv();
- }
- } else {
- // case AODMCParticle
- const AliAODMCParticle *mcpart = dynamic_cast<const AliAODMCParticle *>(mctrack);
- if(mcpart){
- xv = mcpart->Xv();
- yv = mcpart->Yv();
- }
- }
-
- //printf("xv %f, yv %f\n",xv,yv);
- fQACollection->Fill("radius", TMath::Abs(xv),TMath::Abs(yv));
-
- return kTRUE;
-
-}
-//__________________________________________
-void AliAnalysisTaskHFE::SwitchOnPlugin(Int_t plug){
- //
- // Switch on Plugin
- // Available:
- // - Primary vertex studies
- // - Secondary vertex Studies
- // - Post Processing
- //
- switch(plug){
- case kPriVtx: SETBIT(fPlugins, plug); break;
- case kSecVtx: SETBIT(fPlugins, plug); break;
- case kIsElecBackGround: SETBIT(fPlugins, plug); break;
- case kPostProcess: SETBIT(fPlugins, plug); break;
- case kDEstep: SETBIT(fPlugins, plug); break;
- case kTaggedTrackAnalysis: SETBIT(fPlugins, plug); break;
- default: AliError("Unknown Plugin");
- };
-}
-//__________________________________________
-Bool_t AliAnalysisTaskHFE::ProcessCutStep(Int_t cutStep, AliVParticle *track){
- //
- // Check single track cuts for a given cut step
- // Fill the particle container
- //
- const Int_t kMCOffset = AliHFEcuts::kNcutStepsMCTrack;
- if(!fCFM->CheckParticleCuts(cutStep + kMCOffset, track)) return kFALSE;
- if(fVarManager->IsSignalTrack()) {
- fVarManager->FillContainer(fContainer, "recTrackContReco", cutStep, kFALSE);
- fVarManager->FillContainer(fContainer, "recTrackContMC", cutStep, kTRUE);
- }
- return kTRUE;
-}
-//___________________________________________________
-Bool_t AliAnalysisTaskHFE::ReadCentrality() {
- //
- // Recover the centrality of the event from ESD or AOD
- //
- Int_t bin = -1;
- if(IsPbPb()) {
- // Centrality
- AliCentrality *centrality = fInputEvent->GetCentrality();
- Float_t fCentralityFtemp = centrality->GetCentralityPercentile("V0M");
- Float_t centralityLimits[12] = {0.,5.,10., 20., 30., 40., 50., 60.,70.,80., 90., 100.};
- for(Int_t ibin = 0; ibin < 11; ibin++){
- if(fCentralityFtemp >= centralityLimits[ibin] && fCentralityFtemp < centralityLimits[ibin+1]){
- bin = ibin;
- break;
- }
- }
- if(bin == -1) bin = 11; // Overflow
- } else {
- // PP: Tracklet multiplicity, use common definition
- Int_t itsMultiplicity = GetITSMultiplicity(fInputEvent);
- Int_t multiplicityLimits[8] = {0, 1, 9, 17, 25, 36, 60, 500};
- for(Int_t ibin = 0; ibin < 7; ibin++){
- if(itsMultiplicity >= multiplicityLimits[ibin] && itsMultiplicity < multiplicityLimits[ibin + 1]){
- bin = ibin;
- break;
- }
- }
- if(bin == -1) bin = 7; // Overflow
- }
- fCentralityF = bin;
- AliDebug(2, Form("Centrality class %d\n", fCentralityF));
-
- // contributors, to be outsourced
- const AliVVertex *vtx;
- if(IsAODanalysis()){
- AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
- if(!fAOD){
- AliError("AOD Event required for AOD Analysis");
- return kFALSE;
- }
- vtx = fAOD->GetPrimaryVertex();
- } else {
- AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
- if(!fESD){
- AliError("ESD Event required for ESD Analysis");
- return kFALSE;
- }
- vtx = fESD->GetPrimaryVertexSPD();
- }
- if(!vtx){
- fContributors = 0.5;
- return kFALSE;
- }
- else {
- Int_t contributorstemp = vtx->GetNContributors();
- if( contributorstemp <= 0) fContributors = 0.5;
- else fContributors = 1.5;
- }
- return kTRUE;
-}
-
-//___________________________________________________
-Int_t AliAnalysisTaskHFE::GetITSMultiplicity(AliVEvent *ev){
- //
- // Definition of the Multiplicity according to the JPSI group (F. Kramer)
- //
- Int_t nTracklets = 0;
- Int_t nAcc = 0;
- Double_t etaRange = 1.6;
-
- if (ev->IsA() == AliAODEvent::Class()) {
- AliAODTracklets *tracklets = ((AliAODEvent*)ev)->GetTracklets();
- nTracklets = tracklets->GetNumberOfTracklets();
- for (Int_t nn = 0; nn < nTracklets; nn++) {
- Double_t theta = tracklets->GetTheta(nn);
- Double_t eta = -TMath::Log(TMath::Tan(theta/2.0));
- if (TMath::Abs(eta) < etaRange) nAcc++;
- }
- } else if (ev->IsA() == AliESDEvent::Class()) {
- nTracklets = ((AliESDEvent*)ev)->GetMultiplicity()->GetNumberOfTracklets();
- for (Int_t nn = 0; nn < nTracklets; nn++) {
- Double_t eta = ((AliESDEvent*)ev)->GetMultiplicity()->GetEta(nn);
- if (TMath::Abs(eta) < etaRange) nAcc++;
- }
- } else return -1;
-
- return nAcc;
-}
-
-//___________________________________________________
-Bool_t AliAnalysisTaskHFE::InitializeHadronBackground(Int_t run){
- //
- // Initialize background factors array from the AliOADBContainer
- // The container is expected to provide a TObjArray with the name
- // "hadronBackground" and the size 12 for the given run number
- //
- AliDebug(1, "Deriving hadronic background parameterization from OADB container");
- TObjArray *functions = dynamic_cast<TObjArray *>(fHadronBackgroundOADB->GetObject(run, "hadronBackground"));
- if(!functions){
- AliDebug(1, "Content in the OADB Container is not a TObjArray");
- fBackGroundFactorApply = kFALSE;
- return kFALSE;
- }
- if(functions->GetSize() < 12){
- AliDebug(1, Form("Size not matching: 12 expected, %d provided", functions->GetSize()));
- fBackGroundFactorApply = kFALSE;
- return kFALSE;
- }
- for(Int_t icent = 0; icent < 12; icent++) fkBackGroundFactorArray[icent] = dynamic_cast<const TF1 *>(functions->UncheckedAt(icent));
- return kTRUE;
-}
-
-//___________________________________________________
-void AliAnalysisTaskHFE::RejectionPileUpVertexRangeEventCut() {
- //
- // Recover the centrality of the event from ESD or AOD
- //
- if(IsAODanalysis()){
-
- AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);
- if(!fAOD){
- AliError("AOD Event required for AOD Analysis");
- return;
- }
- // PileUp
- if(fRemovePileUp && fAOD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE;
- // Z vertex
- if(TMath::Abs(fAOD->GetPrimaryVertex()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
- // Event Cut
- fPassTheEventCut = kTRUE;
- if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fAOD)) fPassTheEventCut = kFALSE;
-
-
- } else {
-
- AliDebug(3, "Processing ESD Centrality");
- AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);
- if(!fESD){
- AliError("ESD Event required for ESD Analysis");
- return;
- }
- // PileUp
- fIdentifiedAsPileUp = kFALSE;
- if(fRemovePileUp && fESD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE;
- // Z vertex
- fIdentifiedAsOutInz = kFALSE;
- if (IsPbPb()) {
- //printf("PbPb\n");
- if(fESD->GetPrimaryVertex()){
- if(TMath::Abs(fESD->GetPrimaryVertex()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
- }
- }
- else {
- //printf("pp\n");
- if(fESD->GetPrimaryVertexTracks()){
- if(TMath::Abs(fESD->GetPrimaryVertexTracks()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;
- }
- }
- //Event Cut
- fPassTheEventCut = kTRUE;
- if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) fPassTheEventCut = kFALSE;
-
-
- }
-
-}
-
+/**************************************************************************\r
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
+* *\r
+* Author: The ALICE Off-line Project. *\r
+* Contributors are mentioned in the code where appropriate. *\r
+* *\r
+* Permission to use, copy, modify and distribute this software and its *\r
+* documentation strictly for non-commercial purposes is hereby granted *\r
+* without fee, provided that the above copyright notice appears in all *\r
+* copies and that both the copyright notice and this permission notice *\r
+* appear in the supporting documentation. The authors make no claims *\r
+* about the suitability of this software for any purpose. It is *\r
+* provided "as is" without express or implied warranty. *\r
+**************************************************************************/\r
+//\r
+// The analysis task:\r
+// Filling an AliCFContainer with the quantities pt, eta and phi\r
+// for tracks which survivied the particle cuts (MC resp. ESD tracks)\r
+// Track selection is done using the AliHFE package\r
+// \r
+// Author:\r
+// Raphaelle Bailhache <R.Bailhache@gsi.de>\r
+// Markus Fasel <M.Fasel@gsi.de>\r
+// Matus Kalisky <matus.kalisky@cern.ch>\r
+// MinJung Kweon <minjung@physi.uni-heidelberg.de>\r
+//\r
+#include <TAxis.h>\r
+#include <TBits.h>\r
+#include <TCanvas.h>\r
+#include <TChain.h>\r
+#include <TDirectory.h>\r
+#include <TFile.h>\r
+#include <TH3D.h>\r
+#include <TIterator.h>\r
+#include <TList.h>\r
+#include <TLegend.h>\r
+#include <TMath.h>\r
+#include <TObjArray.h>\r
+#include <TObjString.h>\r
+#include <TParticle.h>\r
+#include <TProfile.h>\r
+#include <TString.h>\r
+#include <TF1.h>\r
+#include <TTree.h>\r
+\r
+#include "AliESDtrackCuts.h"\r
+#include "AliAnalysisManager.h"\r
+#include "AliAnalysisUtils.h"\r
+#include "AliAODInputHandler.h"\r
+#include "AliAODMCParticle.h"\r
+#include "AliAODTrack.h"\r
+#include "AliAODVertex.h"\r
+#include "AliCentrality.h"\r
+#include "AliCFContainer.h"\r
+#include "AliCFManager.h"\r
+#include "AliESDEvent.h"\r
+#include "AliESDInputHandler.h"\r
+#include "AliESDtrack.h"\r
+#include "AliLog.h"\r
+#include "AliMCEvent.h"\r
+#include "AliMCEventHandler.h"\r
+#include "AliMCParticle.h"\r
+#include "AliMultiplicity.h"\r
+#include "AliPID.h"\r
+#include "AliPIDResponse.h"\r
+#include "AliOADBContainer.h"\r
+#include "AliStack.h"\r
+#include "AliTriggerAnalysis.h"\r
+#include "AliVVertex.h"\r
+\r
+#include "AliHFEcollection.h"\r
+#include "AliHFEcontainer.h"\r
+#include "AliHFEcuts.h"\r
+#include "AliHFEelecbackground.h"\r
+#include "AliHFENonPhotonicElectron.h"\r
+#include "AliHFEmcQA.h"\r
+#include "AliHFEpairs.h"\r
+#include "AliHFEpid.h"\r
+#include "AliHFEpidQAmanager.h"\r
+#include "AliHFEsecVtxs.h"\r
+#include "AliHFEsecVtx.h"\r
+#include "AliHFEsignalCuts.h"\r
+#include "AliHFEtaggedTrackAnalysis.h"\r
+#include "AliHFEtools.h"\r
+#include "AliHFEvarManager.h"\r
+#include "AliAnalysisTaskHFE.h"\r
+#include "AliAODMCHeader.h"\r
+#include "TClonesArray.h"\r
+\r
+ClassImp(AliAnalysisTaskHFE)\r
+\r
+//____________________________________________________________\r
+AliAnalysisTaskHFE::AliAnalysisTaskHFE():\r
+AliAnalysisTaskSE("PID efficiency Analysis")\r
+ , fAODMCHeader(NULL)\r
+ , fAODArrayMCInfo(NULL)\r
+ , fQAlevel(0)\r
+ , fPlugins(0)\r
+ , fCollisionSystem(3)\r
+ , fFillSignalOnly(kTRUE)\r
+ , fFillNoCuts(kFALSE)\r
+ , fApplyCutAOD(kTRUE)\r
+ , fBackGroundFactorApply(kFALSE)\r
+ , fRemovePileUp(kFALSE)\r
+ , fIdentifiedAsPileUp(kFALSE)\r
+ , fIdentifiedAsOutInz(kFALSE)\r
+ , fPassTheEventCut(kFALSE)\r
+ , fRejectKinkMother(kTRUE)\r
+ , fisppMultiBin(kFALSE)\r
+ , fPbPbUserCentralityBinning(kFALSE)\r
+ , fRemoveFirstEvent(kFALSE)\r
+ , fisNonHFEsystematics(kFALSE)\r
+ , fSpecialTrigger(NULL)\r
+ , fCentralityF(-1)\r
+ , fCentralityPercent(-1)\r
+ , fContributors(0.5)\r
+ , fWeightBackGround(0.)\r
+ , fVz(0.0)\r
+ , fContainer(NULL)\r
+ , fVarManager(NULL)\r
+ , fSignalCuts(NULL)\r
+ , fCFM(NULL)\r
+ , fTriggerAnalysis(NULL)\r
+ , fPID(NULL)\r
+ , fPIDqa(NULL)\r
+ , fPIDpreselect(NULL)\r
+ , fCuts(NULL)\r
+ , fTaggedTrackCuts(NULL)\r
+ , fCleanTaggedTrack(kFALSE)\r
+ , fVariablesTRDTaggedTrack(kFALSE)\r
+ , fAnalysisUtils(NULL)\r
+ , fCutspreselect(NULL)\r
+ , fSecVtx(NULL)\r
+ , fElecBackGround(NULL)\r
+ , fMCQA(NULL)\r
+ , fTaggedTrackAnalysis(NULL)\r
+ , fExtraCuts(NULL)\r
+ , fBackgroundSubtraction(NULL)\r
+ , fQA(NULL)\r
+ , fOutput(NULL)\r
+ , fHistMCQA(NULL)\r
+ , fHistSECVTX(NULL)\r
+ , fHistELECBACKGROUND(NULL)\r
+ , fQACollection(NULL)\r
+{\r
+ //\r
+ // Dummy constructor\r
+ //\r
+ memset(fElecBackgroundFactor, 0, sizeof(Double_t) * kElecBgSpecies * kBgPtBins * kCentBins * kBgLevels);\r
+ memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);\r
+ memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));\r
+ memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));\r
+ memset(fCentralityLimits, 0, sizeof(Float_t) * 12);\r
+\r
+ SetppAnalysis();\r
+}\r
+\r
+//____________________________________________________________\r
+AliAnalysisTaskHFE::AliAnalysisTaskHFE(const char * name):\r
+ AliAnalysisTaskSE(name)\r
+ , fAODMCHeader(NULL)\r
+ , fAODArrayMCInfo(NULL)\r
+ , fQAlevel(0)\r
+ , fPlugins(0)\r
+ , fCollisionSystem(3)\r
+ , fFillSignalOnly(kTRUE)\r
+ , fFillNoCuts(kFALSE)\r
+ , fApplyCutAOD(kTRUE)\r
+ , fBackGroundFactorApply(kFALSE)\r
+ , fRemovePileUp(kFALSE)\r
+ , fIdentifiedAsPileUp(kFALSE)\r
+ , fIdentifiedAsOutInz(kFALSE)\r
+ , fPassTheEventCut(kFALSE) \r
+ , fRejectKinkMother(kTRUE)\r
+ , fisppMultiBin(kFALSE)\r
+ , fPbPbUserCentralityBinning(kFALSE)\r
+ , fRemoveFirstEvent(kFALSE)\r
+ , fisNonHFEsystematics(kFALSE)\r
+ , fSpecialTrigger(NULL)\r
+ , fCentralityF(-1)\r
+ , fCentralityPercent(-1)\r
+ , fContributors(0.5)\r
+ , fWeightBackGround(0.)\r
+ , fVz(0.0)\r
+ , fContainer(NULL)\r
+ , fVarManager(NULL)\r
+ , fSignalCuts(NULL)\r
+ , fCFM(NULL)\r
+ , fTriggerAnalysis(NULL)\r
+ , fPID(NULL)\r
+ , fPIDqa(NULL)\r
+ , fPIDpreselect(NULL)\r
+ , fCuts(NULL)\r
+ , fTaggedTrackCuts(NULL)\r
+ , fCleanTaggedTrack(kFALSE)\r
+ , fVariablesTRDTaggedTrack(kFALSE)\r
+ , fAnalysisUtils(NULL)\r
+ , fCutspreselect(NULL)\r
+ , fSecVtx(NULL)\r
+ , fElecBackGround(NULL)\r
+ , fMCQA(NULL)\r
+ , fTaggedTrackAnalysis(NULL)\r
+ , fExtraCuts(NULL)\r
+ , fBackgroundSubtraction(NULL)\r
+ , fQA(NULL)\r
+ , fOutput(NULL)\r
+ , fHistMCQA(NULL)\r
+ , fHistSECVTX(NULL)\r
+ , fHistELECBACKGROUND(NULL)\r
+ , fQACollection(0x0)\r
+{\r
+ //\r
+ // Default constructor\r
+ // \r
+ DefineOutput(1, TList::Class());\r
+ DefineOutput(2, TList::Class());\r
+\r
+ fPID = new AliHFEpid("hfePid");\r
+ fPIDqa = new AliHFEpidQAmanager;\r
+ fVarManager = new AliHFEvarManager("hfeVarManager");\r
+ fAnalysisUtils = new AliAnalysisUtils;\r
+\r
+ memset(fElecBackgroundFactor, 0, sizeof(Double_t) * kElecBgSpecies * kBgPtBins * kCentBins * kBgLevels);\r
+ memset(fkBackGroundFactorArray, 0, sizeof(TF1 *) * 12);\r
+ memset(fBinLimit, 0, sizeof(Double_t) * (kBgPtBins+1));\r
+ memset(&fisppMultiBin, kFALSE, sizeof(fisppMultiBin));\r
+ memset(fCentralityLimits, 0, sizeof(Float_t) * 12);\r
+\r
+ SetppAnalysis();\r
+}\r
+\r
+//____________________________________________________________\r
+AliAnalysisTaskHFE::AliAnalysisTaskHFE(const AliAnalysisTaskHFE &ref):\r
+ AliAnalysisTaskSE(ref)\r
+ , fAODMCHeader(NULL)\r
+ , fAODArrayMCInfo(NULL)\r
+ , fQAlevel(0)\r
+ , fPlugins(0)\r
+ , fCollisionSystem(ref.fCollisionSystem)\r
+ , fFillSignalOnly(ref.fFillSignalOnly)\r
+ , fFillNoCuts(ref.fFillNoCuts)\r
+ , fApplyCutAOD(ref.fApplyCutAOD)\r
+ , fBackGroundFactorApply(ref.fBackGroundFactorApply)\r
+ , fRemovePileUp(ref.fRemovePileUp)\r
+ , fIdentifiedAsPileUp(ref.fIdentifiedAsPileUp)\r
+ , fIdentifiedAsOutInz(ref.fIdentifiedAsOutInz)\r
+ , fPassTheEventCut(ref.fPassTheEventCut)\r
+ , fRejectKinkMother(ref.fRejectKinkMother)\r
+ , fisppMultiBin(ref.fisppMultiBin)\r
+ , fPbPbUserCentralityBinning(ref.fPbPbUserCentralityBinning)\r
+ , fRemoveFirstEvent(ref.fRemoveFirstEvent)\r
+ , fisNonHFEsystematics(ref.fisNonHFEsystematics)\r
+ , fSpecialTrigger(ref.fSpecialTrigger)\r
+ , fCentralityF(ref.fCentralityF)\r
+ , fCentralityPercent(ref.fCentralityPercent)\r
+ , fContributors(ref.fContributors)\r
+ , fWeightBackGround(ref.fWeightBackGround)\r
+ , fVz(ref.fVz)\r
+ , fContainer(NULL)\r
+ , fVarManager(NULL)\r
+ , fSignalCuts(NULL)\r
+ , fCFM(NULL)\r
+ , fTriggerAnalysis(NULL)\r
+ , fPID(NULL)\r
+ , fPIDqa(NULL)\r
+ , fPIDpreselect(NULL)\r
+ , fCuts(NULL)\r
+ , fTaggedTrackCuts(NULL)\r
+ , fCleanTaggedTrack(ref.fCleanTaggedTrack)\r
+ , fVariablesTRDTaggedTrack(ref.fVariablesTRDTaggedTrack)\r
+ , fAnalysisUtils(NULL)\r
+ , fCutspreselect(NULL)\r
+ , fSecVtx(NULL)\r
+ , fElecBackGround(NULL)\r
+ , fMCQA(NULL)\r
+ , fTaggedTrackAnalysis(NULL)\r
+ , fExtraCuts(NULL)\r
+ , fBackgroundSubtraction(NULL)\r
+ , fQA(NULL)\r
+ , fOutput(NULL)\r
+ , fHistMCQA(NULL)\r
+ , fHistSECVTX(NULL)\r
+ , fHistELECBACKGROUND(NULL)\r
+ , fQACollection(NULL)\r
+{\r
+ //\r
+ // Copy Constructor\r
+ //\r
+ ref.Copy(*this);\r
+}\r
+\r
+//____________________________________________________________\r
+AliAnalysisTaskHFE &AliAnalysisTaskHFE::operator=(const AliAnalysisTaskHFE &ref){\r
+ //\r
+ // Assignment operator\r
+ //\r
+ if(this == &ref) \r
+ ref.Copy(*this);\r
+ return *this;\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::Copy(TObject &o) const {\r
+ // \r
+ // Copy into object o\r
+ //\r
+ AliAnalysisTaskHFE &target = dynamic_cast<AliAnalysisTaskHFE &>(o);\r
+ target.fAODMCHeader = fAODMCHeader;\r
+ target.fAODArrayMCInfo = fAODArrayMCInfo;\r
+ target.fQAlevel = fQAlevel;\r
+ target.fPlugins = fPlugins;\r
+ target.fCollisionSystem = fCollisionSystem;\r
+ target.fFillSignalOnly = fFillSignalOnly;\r
+ target.fFillNoCuts = fFillNoCuts;\r
+ target.fApplyCutAOD = fApplyCutAOD;\r
+ target.fBackGroundFactorApply = fBackGroundFactorApply;\r
+ target.fRemovePileUp = fRemovePileUp;\r
+ target.fIdentifiedAsPileUp = fIdentifiedAsPileUp;\r
+ target.fIdentifiedAsOutInz = fIdentifiedAsOutInz;\r
+ target.fPassTheEventCut = fPassTheEventCut;\r
+ target.fRejectKinkMother = fRejectKinkMother;\r
+ target.fisppMultiBin = fisppMultiBin;\r
+ target.fPbPbUserCentralityBinning = fPbPbUserCentralityBinning;\r
+ target.fRemoveFirstEvent = fRemoveFirstEvent;\r
+ target.fisNonHFEsystematics = fisNonHFEsystematics;\r
+ target.fSpecialTrigger = fSpecialTrigger;\r
+ target.fCentralityF = fCentralityF;\r
+ target.fCentralityPercent = fCentralityPercent;\r
+ target.fContributors = fContributors;\r
+ target.fWeightBackGround = fWeightBackGround;\r
+ target.fVz = fVz;\r
+ target.fContainer = fContainer;\r
+ target.fVarManager = fVarManager;\r
+ target.fSignalCuts = fSignalCuts;\r
+ target.fCFM = fCFM;\r
+ target.fTriggerAnalysis = fTriggerAnalysis;\r
+ target.fPID = fPID;\r
+ target.fPIDqa = fPIDqa;\r
+ target.fPIDpreselect = fPIDpreselect;\r
+ target.fCuts = fCuts;\r
+ target.fTaggedTrackCuts = fTaggedTrackCuts;\r
+ target.fCleanTaggedTrack = fCleanTaggedTrack;\r
+ target.fVariablesTRDTaggedTrack = fVariablesTRDTaggedTrack;\r
+ target.fAnalysisUtils = fAnalysisUtils;\r
+ target.fCutspreselect = fCutspreselect;\r
+ target.fSecVtx = fSecVtx;\r
+ target.fElecBackGround = fElecBackGround;\r
+ target.fMCQA = fMCQA;\r
+ target.fTaggedTrackAnalysis = fTaggedTrackAnalysis;\r
+ target.fExtraCuts = fExtraCuts;\r
+ target.fBackgroundSubtraction = fBackgroundSubtraction;\r
+ target.fQA = fQA;\r
+ target.fOutput = fOutput;\r
+ target.fHistMCQA = fHistMCQA;\r
+ target.fHistSECVTX = fHistSECVTX;\r
+ target.fHistELECBACKGROUND = fHistELECBACKGROUND;\r
+ target.fQACollection = fQACollection;\r
+}\r
+\r
+//____________________________________________________________\r
+AliAnalysisTaskHFE::~AliAnalysisTaskHFE(){\r
+ //\r
+ // Destructor\r
+ //\r
+ if(fPID) delete fPID;\r
+ if(fPIDpreselect) delete fPIDpreselect;\r
+ if(fVarManager) delete fVarManager;\r
+ if(fCFM) delete fCFM;\r
+ if(fTriggerAnalysis) delete fTriggerAnalysis;\r
+ if(fSignalCuts) delete fSignalCuts;\r
+ if(fSecVtx) delete fSecVtx;\r
+ if(fMCQA) delete fMCQA;\r
+ if(fElecBackGround) delete fElecBackGround;\r
+ if(fBackgroundSubtraction) delete fBackgroundSubtraction;\r
+ if(fSpecialTrigger) delete fSpecialTrigger;\r
+ if(fAnalysisUtils) delete fAnalysisUtils;\r
+ // Delete output objects only if we are not running in PROOF mode because otherwise this produces a crash during merging\r
+ AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();\r
+ if(mgr && mgr->GetAnalysisType() != AliAnalysisManager::kProofAnalysis){\r
+ if(fPIDqa) delete fPIDqa;\r
+ if(fOutput) delete fOutput;\r
+ if(fQA) delete fQA;\r
+ }\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::UserCreateOutputObjects(){\r
+ //\r
+ // Creating output container and output objects\r
+ // Here we also Initialize the correction framework container and \r
+ // the objects for\r
+ // - PID\r
+ // - MC QA\r
+ // - SecVtx\r
+ // QA histograms are created if requested\r
+ // Called once per worker\r
+ //\r
+ AliDebug(3, "Creating Output Objects");\r
+ \r
+ // Make lists for Output\r
+ if(!fQA) fQA = new TList;\r
+ fQA->SetOwner();\r
+ if(!fOutput) fOutput = new TList;\r
+ fOutput->SetOwner();\r
+ \r
+ // Automatic determination of the analysis mode\r
+ AliVEventHandler *inputHandler = dynamic_cast<AliVEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());\r
+ if(!TString(inputHandler->IsA()->GetName()).CompareTo("AliAODInputHandler")){\r
+ SetAODAnalysis();\r
+ } else {\r
+ SetESDAnalysis();\r
+ if(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler())\r
+ SetHasMCData();\r
+ }\r
+ printf("Analysis Mode: %s Analysis\n", IsAODanalysis() ? "AOD" : "ESD");\r
+ printf("MC Data available %s\n", HasMCData() ? "Yes" : "No");\r
+\r
+ // Enable Trigger Analysis\r
+ fTriggerAnalysis = new AliTriggerAnalysis;\r
+ fTriggerAnalysis->EnableHistograms();\r
+ fTriggerAnalysis->SetAnalyzeMC(HasMCData());\r
+\r
+ // First Part: Make QA histograms\r
+ fQACollection = new AliHFEcollection("TaskQA", "QA histos from the Electron Task");\r
+ fQACollection->CreateTH1F("nElectronTracksEvent", "Number of Electron Candidates", 100, 0, 100);\r
+ fQACollection->CreateTH1F("nElectron", "Number of electrons", 100, 0, 100);\r
+ fQACollection->CreateTH2F("radius", "Production Vertex", 100, 0.0, 5.0, 100, 0.0, 5.0);\r
+\r
+ if(IsAODanalysis()){\r
+ fQACollection->CreateTH1F("Filterorigin","AOD filter of tracks at origin", 21,-1, 20);\r
+ fQACollection->CreateTH1F("Filterend","AOD filter of tracks after all cuts", 21, -1, 20);\r
+ }\r
+ \r
+ InitHistoITScluster();\r
+ InitContaminationQA();\r
+ fQA->Add(fQACollection);\r
+\r
+ // Initialize PID\r
+ fPID->SetHasMCData(HasMCData());\r
+ if(!fPID->GetNumberOfPIDdetectors()) fPID->AddDetector("TPC", 0);\r
+ if(IsQAOn(kPIDqa)){\r
+ AliInfo("PID QA switched on");\r
+ fPIDqa->Initialize(fPID);\r
+ fQA->Add(fPIDqa->MakeList("HFEpidQA"));\r
+ }\r
+ fPID->SortDetectors();\r
+\r
+ // Background subtraction-------------------------------------------------------------------\r
+ if (GetPlugin(kNonPhotonicElectron)) {\r
+ if(!fBackgroundSubtraction) fBackgroundSubtraction = new AliHFENonPhotonicElectron();\r
+ if(IsAODanalysis()) fBackgroundSubtraction->SetAOD(kTRUE);\r
+ fBackgroundSubtraction->Init();\r
+ fOutput->Add(fBackgroundSubtraction->GetListOutput());\r
+ }\r
+ //------------------------------------------------------------------------------------------\r
+\r
+\r
+ // Initialize correction Framework and Cuts\r
+ const Int_t kNcutSteps = AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack + AliHFEcuts::kNcutStepsDETrack + AliHFEcuts::kNcutStepsSecvtxTrack;\r
+ fCFM = new AliCFManager;\r
+ fCFM->SetNStepParticle(kNcutSteps);\r
+ MakeParticleContainer();\r
+ MakeEventContainer();\r
+ // Temporary fix: Initialize particle cuts with NULL\r
+ for(Int_t istep = 0; istep < kNcutSteps; istep++)\r
+ fCFM->SetParticleCutsList(istep, NULL);\r
+ if(!fCuts){\r
+ AliWarning("Cuts not available. Default cuts will be used");\r
+ fCuts = new AliHFEcuts;\r
+ fCuts->CreateStandardCuts();\r
+ }\r
+ if(IsAODanalysis()) fCuts->SetAOD();\r
+ // Make clone for V0 tagging step\r
+ fCuts->Initialize(fCFM);\r
+ if(fCuts->IsQAOn()) fQA->Add(fCuts->GetQAhistograms());\r
+ fSignalCuts = new AliHFEsignalCuts("HFEsignalCuts", "HFE MC Signal definition");\r
+ fVarManager->SetSignalCuts(fSignalCuts);\r
+ \r
+ // add output objects to the List\r
+ fOutput->AddAt(fContainer, 0);\r
+ fOutput->AddAt(fCFM->GetEventContainer(), 1);\r
+ \r
+ // mcQA----------------------------------\r
+ if (HasMCData() && IsQAOn(kMCqa)) {\r
+ AliInfo("MC QA on");\r
+ if(!fMCQA) fMCQA = new AliHFEmcQA;\r
+ if(!fHistMCQA) fHistMCQA = new TList();\r
+ fHistMCQA->SetOwner();\r
+ if(IsPbPb()) fMCQA->SetPbPb();\r
+ if(fisppMultiBin) fMCQA->SetPPMultiBin();\r
+ if(TestBit(kTreeStream)){\r
+ fMCQA->EnableDebugStreamer();\r
+ }\r
+ fMCQA->CreatDefaultHistograms(fHistMCQA);\r
+ fMCQA->SetBackgroundWeightFactor(fElecBackgroundFactor[0][0][0],fBinLimit);\r
+ fQA->Add(fHistMCQA);\r
+ } \r
+\r
+ // secvtx----------------------------------\r
+ if (GetPlugin(kSecVtx)) {\r
+ AliInfo("Secondary Vertex Analysis on");\r
+ if(!fSecVtx) fSecVtx = new AliHFEsecVtx;\r
+ fSecVtx->SetHasMCData(HasMCData());\r
+\r
+ if(!fHistSECVTX) fHistSECVTX = new TList();\r
+ fHistSECVTX->SetOwner();\r
+ fSecVtx->CreateHistograms(fHistSECVTX);\r
+ fOutput->Add(fHistSECVTX);\r
+ }\r
+\r
+ // background----------------------------------\r
+ if (GetPlugin(kIsElecBackGround)) {\r
+ AliInfo("Electron BackGround Analysis on");\r
+ if(!fElecBackGround){\r
+ AliWarning("ElecBackGround not available. Default elecbackground will be used");\r
+ fElecBackGround = new AliHFEelecbackground;\r
+ }\r
+ fElecBackGround->SetHasMCData(HasMCData());\r
+\r
+ if(!fHistELECBACKGROUND) fHistELECBACKGROUND = new TList();\r
+ fHistELECBACKGROUND->SetOwner();\r
+ fElecBackGround->CreateHistograms(fHistELECBACKGROUND);\r
+ fOutput->Add(fHistELECBACKGROUND);\r
+ } \r
+\r
+ // tagged tracks\r
+ if(GetPlugin(kTaggedTrackAnalysis)){\r
+ AliInfo("Analysis on V0-tagged tracks enabled");\r
+ fTaggedTrackAnalysis = new AliHFEtaggedTrackAnalysis(Form("taggedTrackAnalysis%s", GetName()));\r
+ fTaggedTrackAnalysis->SetCuts(fTaggedTrackCuts);\r
+ fTaggedTrackAnalysis->SetClean(fCleanTaggedTrack);\r
+ AliHFEvarManager *varManager = fTaggedTrackAnalysis->GetVarManager();\r
+ TObjArray *array = fVarManager->GetVariables();\r
+ Int_t nvars = array->GetEntriesFast();\r
+ TString namee;\r
+ for(Int_t v = 0; v < nvars; v++) {\r
+ AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);\r
+ if(!variable) continue;\r
+ TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());\r
+ if(!name.CompareTo("source")) namee = TString("species");\r
+ else namee = TString(name);\r
+ Int_t nbins = variable->GetNumberOfBins();\r
+ if(variable->HasUserDefinedBinning()){\r
+ varManager->AddVariable(namee, nbins, variable->GetBinning());\r
+ } else {\r
+ varManager->AddVariable(namee, nbins, variable->GetMinimum(), variable->GetMaximum());\r
+ }\r
+ //printf("For AliTaggedTrackAnalysis, had the variable %s and the one used %s\n",(const char*)variable->GetName(),(const char*) namee);\r
+ }\r
+ if(fPIDqa->HasHighResolutionHistos()) \r
+ fTaggedTrackAnalysis->GetPIDqa()->SetHighResolutionHistos();\r
+ fTaggedTrackAnalysis->SetPID(fPID);\r
+ fTaggedTrackAnalysis->SetVariablesTRD(fVariablesTRDTaggedTrack);\r
+ fTaggedTrackAnalysis->InitContainer();\r
+ fOutput->Add(fTaggedTrackAnalysis->GetContainer());\r
+ fQA->Add(fTaggedTrackAnalysis->GetPIDQA());\r
+ fQA->Add(fTaggedTrackAnalysis->GetCutQA());\r
+ fQA->Add(fTaggedTrackAnalysis->GetQAcollection());\r
+ }\r
+\r
+ //fQA->Print();\r
+\r
+ PrintStatus();\r
+ // Done!!!\r
+ PostData(1, fOutput);\r
+ PostData(2, fQA);\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::UserExec(Option_t *){\r
+ //\r
+ // Run the analysis\r
+ // \r
+\r
+ //printf("test00\n");\r
+\r
+ AliDebug(3, "Starting Single Event Analysis");\r
+ if(!fInputEvent){\r
+ AliError("Reconstructed Event not available");\r
+ //printf("Reconstructed Event not available");\r
+ return;\r
+ }\r
+ if(HasMCData() && IsESDanalysis()){\r
+ AliDebug(4, Form("MC Event: %p", fMCEvent));\r
+ if(!fMCEvent){\r
+ AliError("No MC Event, but MC Data required");\r
+ //printf("No MC Event, but MC Data required");\r
+ return;\r
+ }\r
+ }\r
+ if(!fCuts){\r
+ AliError("HFE cuts not available");\r
+ //printf("HFE cuts not available");\r
+ return;\r
+ }\r
+ if(!fPID->IsInitialized()){\r
+ // Initialize PID with the given run number\r
+ fPID->InitializePID(fInputEvent->GetRunNumber());\r
+ }\r
+\r
+ if(fRemoveFirstEvent){\r
+ if(fAnalysisUtils->IsFirstEventInChunk(fInputEvent)) return;\r
+ }\r
+\r
+ if(IsESDanalysis() && HasMCData()){\r
+ // Protect against missing MC trees\r
+ AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());\r
+ if(!mcH){ \r
+ AliError("No MC Event Handler available");\r
+ return;\r
+ }\r
+ /*\r
+ if(!mcH->InitOk()) return;\r
+ if(!mcH->TreeK()) return;\r
+ if(!mcH->TreeTR()) return;\r
+ */\r
+\r
+ // Background subtraction-------------------------------------------------------------------\r
+ if(GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->SetMCEvent(fMCEvent);\r
+ //------------------------------------------------------------------------------------------\r
+ }\r
+\r
+ if(IsAODanalysis() && HasMCData()){\r
+ // take MC info\r
+ AliAODEvent *aodE = dynamic_cast<AliAODEvent *>(fInputEvent);\r
+ if(!aodE){ \r
+ AliError("No AOD Event");\r
+ return;\r
+ }\r
+ fAODMCHeader = dynamic_cast<AliAODMCHeader *>(fInputEvent->FindListObject(AliAODMCHeader::StdBranchName()));\r
+ if(!fAODMCHeader){ \r
+ AliError("No AliAODMCHeader");\r
+ //printf("No AliAODMCHeader");\r
+ return;\r
+ }\r
+ fAODArrayMCInfo = dynamic_cast<TClonesArray *>(fInputEvent->FindListObject(AliAODMCParticle::StdBranchName()));\r
+ if(!fAODArrayMCInfo){ \r
+ AliError("No AOD MC particles");\r
+ //printf("No AOD MC particles");\r
+ return;\r
+ }\r
+ fSignalCuts->SetMCAODInfo(fAODArrayMCInfo);\r
+ // Background subtraction-------------------------------------------------------------------\r
+ if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->SetAODArrayMCInfo(fAODArrayMCInfo);\r
+ //------------------------------------------------------------------------------------------\r
+ }\r
+\r
+ //printf("test2\n");\r
+\r
+ // need the centrality for everything (MC also)\r
+ fCentralityF = -1;\r
+ if(!ReadCentrality()) fCentralityF = -1;\r
+ //printf("pass centrality\n");\r
+ //printf("Reading fCentralityF %d\n",fCentralityF);\r
+ \r
+ // See if pile up and z in the range\r
+ RejectionPileUpVertexRangeEventCut();\r
+\r
+ //printf("test3\n");\r
+\r
+ // Protect agains missing \r
+ if(HasMCData()){\r
+ //printf("Has MC data\n");\r
+ fSignalCuts->SetMCEvent(fMCEvent);\r
+ ProcessMC(); // Run the MC loop + MC QA in case MC Data are available\r
+ }\r
+ \r
+ AliPIDResponse *pidResponse = fInputHandler->GetPIDResponse();\r
+ if(!pidResponse){\r
+ AliDebug(1, "Using default PID Response");\r
+ pidResponse = AliHFEtools::GetDefaultPID(HasMCData(), fInputEvent->IsA() == AliESDEvent::Class());\r
+ }\r
+ fPID->SetPIDResponse(pidResponse);\r
+ if(fPIDpreselect) fPIDpreselect->SetPIDResponse(pidResponse);\r
+\r
+ // Background subtraction-------------------------------------------------------------------\r
+ if(GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->InitRun(fInputEvent,pidResponse);\r
+ //------------------------------------------------------------------------------------------\r
+\r
+ // Event loop\r
+ if(IsAODanalysis()){\r
+ //printf("test4\n");\r
+ ProcessAOD();\r
+ } else {\r
+ const char *specialTrigger = GetSpecialTrigger(fInputEvent->GetRunNumber());\r
+ // Check Trigger selection\r
+ if(specialTrigger){\r
+ AliDebug(2, Form("Special Trigger requested: %s", specialTrigger));\r
+ AliESDEvent *ev = dynamic_cast<AliESDEvent *>(fInputEvent);\r
+ if(!(ev && ev->IsTriggerClassFired(specialTrigger))){\r
+ AliDebug(2, "Event not selected"); \r
+ return;\r
+ } else AliDebug(2, "Event Selected");\r
+ } else AliDebug(2, "No Special Trigger requested");\r
+ \r
+ ProcessESD();\r
+ }\r
+ // Done!!!\r
+ PostData(1, fOutput);\r
+ PostData(2, fQA);\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::Terminate(Option_t *){\r
+ //\r
+ // Terminate not implemented at the moment\r
+ //\r
+}\r
+\r
+//_______________________________________________________________\r
+Bool_t AliAnalysisTaskHFE::IsEventInBinZero() {\r
+ //\r
+ //\r
+ //\r
+\r
+ //printf("test in IsEventInBinZero\n");\r
+ if(!fInputEvent){\r
+ AliError("Reconstructed Event not available");\r
+ return kFALSE;\r
+ }\r
+\r
+ // check vertex\r
+ const AliVVertex *vertex = fInputEvent->GetPrimaryVertex();\r
+ if(!vertex) return kTRUE;\r
+ //if(vertex) return kTRUE;\r
+\r
+ // check tracks\r
+ if(fInputEvent->GetNumberOfTracks()<=0) return kTRUE;\r
+ //if(fInputEvent->GetNumberOfTracks()>0) return kTRUE;\r
+ \r
+ \r
+ return kFALSE;\r
+ \r
+}\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::ProcessMC(){\r
+ //\r
+ // Runs the MC Loop (filling the container for the MC Cut Steps with the observables pt, eta and phi)\r
+ // In case MC QA is on also MC QA loop is done\r
+ //\r
+ AliDebug(3, "Processing MC Information");\r
+ Double_t eventContainer [4] = {0., 0., 0., 0.};\r
+ if(IsESDanalysis()) eventContainer[0] = fMCEvent->GetPrimaryVertex()->GetZ();\r
+ else eventContainer[0] = fAODMCHeader->GetVtxZ();\r
+ eventContainer[2] = fCentralityF;\r
+ eventContainer[3] = fContributors;\r
+ fVz = eventContainer[0];\r
+ //printf("z position is %f\n",eventContainer[0]);\r
+ //if(fCFM->CheckEventCuts(AliHFEcuts::kEventStepGenerated, fMCEvent)) \r
+ fCFM->GetEventContainer()->Fill(eventContainer,AliHFEcuts::kEventStepGenerated);\r
+ Int_t nElectrons = 0;\r
+ if(IsESDanalysis()){\r
+ if(!((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (fCentralityF < 0))){ //kStepMCGeneratedZOutNoPileUpCentralityFine\r
+ if (HasMCData() && IsQAOn(kMCqa)) {\r
+ AliDebug(2, "Running MC QA");\r
+\r
+ if(fMCEvent->Stack()){\r
+ fMCQA->SetMCEvent(fMCEvent);\r
+ fMCQA->SetGenEventHeader(fMCEvent->GenEventHeader());\r
+ fMCQA->SetCentrality(fCentralityF);\r
+ fMCQA->SetPercentrality(fCentralityPercent);\r
+ if(IsPbPb()) { fMCQA->SetPbPb();}\r
+ else\r
+ {\r
+ if(fisppMultiBin) fMCQA->SetPPMultiBin();\r
+ else fMCQA->SetPP();\r
+ }\r
+ fMCQA->Init();\r
+\r
+ fMCQA->GetMesonKine();\r
+\r
+ // loop over all tracks for decayed electrons\r
+ for (Int_t igen = 0; igen < fMCEvent->GetNumberOfTracks(); igen++){\r
+ TParticle* mcpart = fMCEvent->Stack()->Particle(igen);\r
+ if(!mcpart) continue;\r
+ fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kCharm);\r
+ fMCQA->GetQuarkKine(mcpart, igen, AliHFEmcQA::kBeauty);\r
+ fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kCharm);\r
+ fMCQA->GetHadronKine(mcpart, AliHFEmcQA::kBeauty);\r
+ fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kCharm, AliHFEmcQA::kElectronPDG); // no accept cut\r
+ fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kBeauty, AliHFEmcQA::kElectronPDG); // no accept cut\r
+ fMCQA->GetDecayedKine(mcpart, AliHFEmcQA::kOthers, AliHFEmcQA::kElectronPDG); // no accept cut\r
+ }\r
+ //fMCQA->EndOfEventAna(AliHFEmcQA::kCharm);\r
+ //fMCQA->EndOfEventAna(AliHFEmcQA::kBeauty);\r
+ }\r
+\r
+ } // end of MC QA loop\r
+ }\r
+ // -----------------------------------------------------------------\r
+ fCFM->SetMCEventInfo(fMCEvent);\r
+ // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);\r
+ } else {\r
+ fCFM->SetMCEventInfo(fInputEvent);\r
+ }\r
+ // Run MC loop\r
+ AliVParticle *mctrack = NULL;\r
+ Int_t numberofmctracks = 0;\r
+ if(IsESDanalysis()){\r
+ numberofmctracks = fMCEvent->GetNumberOfTracks();\r
+ }\r
+ else {\r
+ numberofmctracks = fAODArrayMCInfo->GetEntriesFast();\r
+ }\r
+ AliDebug(3, Form("Number of Tracks: %d",numberofmctracks));\r
+ //printf("Number of MC track %d\n",numberofmctracks);\r
+ for(Int_t imc = 0; imc <numberofmctracks; imc++){\r
+ if(IsESDanalysis()) {\r
+ if(!(mctrack = fMCEvent->GetTrack(imc))) continue;\r
+ }\r
+ else {\r
+ if(!(mctrack = (AliVParticle *) fAODArrayMCInfo->At(imc))) continue;\r
+ }\r
+ //printf("Test in ProcessMC\n");\r
+ AliDebug(4, "Next MC Track");\r
+ if(ProcessMCtrack(mctrack)) nElectrons++;\r
+ }\r
+\r
+ // fCFM->CheckEventCuts(AliCFManager::kEvtRecCuts, fESD);\r
+ fQACollection->Fill("nElectron", nElectrons);\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::ProcessESD(){\r
+ //\r
+ // Run Analysis of reconstructed event in ESD Mode\r
+ // Loop over Tracks, filter according cut steps defined in AliHFEcuts\r
+ //\r
+ AliDebug(1, Form("Task %s", GetName()));\r
+ AliDebug(3, "Processing ESD Event");\r
+ AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);\r
+ if(!fESD){\r
+ AliError("ESD Event required for ESD Analysis");\r
+ return;\r
+ }\r
+\r
+ // Set magnetic field if V0 task on\r
+ if(fTaggedTrackAnalysis) {\r
+ fTaggedTrackAnalysis->SetMagneticField(fESD->GetMagneticField());\r
+ fTaggedTrackAnalysis->SetCentrality(fCentralityF);\r
+ if(IsHeavyIon()) fTaggedTrackAnalysis->SetPbPb();\r
+ else fTaggedTrackAnalysis->SetPP();\r
+ }\r
+\r
+ // Do event Normalization\r
+ Double_t eventContainer[4];\r
+ eventContainer[0] = 0.; \r
+ if(HasMCData()) eventContainer[0] = fVz;\r
+ else {\r
+ const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();\r
+ if(vtxESD) eventContainer[0] = vtxESD->GetZ();\r
+ }\r
+ eventContainer[1] = 0.;\r
+ eventContainer[2] = fCentralityF;\r
+ eventContainer[3] = fContributors;\r
+ if(fTriggerAnalysis->IsOfflineTriggerFired(fESD, AliTriggerAnalysis::kV0AND))\r
+ eventContainer[1] = 1.;\r
+\r
+ //\r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);\r
+\r
+ //\r
+ if(fIdentifiedAsPileUp) return; \r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);\r
+\r
+ //\r
+ if(TMath::Abs(fCentralityF) < 0) return; \r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecCentralityOk);\r
+ //printf("In ProcessESD %f\n",fCentralityF);\r
+\r
+ //\r
+ if(fIdentifiedAsOutInz) return;\r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange); \r
+\r
+ //\r
+ if(!fPassTheEventCut) return;\r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);\r
+\r
+\r
+ fContainer->NewEvent();\r
+\r
+ if (GetPlugin(kIsElecBackGround)) { \r
+ fElecBackGround->SetEvent(fESD);\r
+ }\r
+ if (GetPlugin(kSecVtx)) {\r
+ fSecVtx->SetEvent(fESD);\r
+ fSecVtx->GetPrimaryCondition();\r
+ }\r
+\r
+ if(HasMCData()){\r
+ if (GetPlugin(kSecVtx)) { \r
+ fSecVtx->SetMCEvent(fMCEvent);\r
+ fSecVtx->SetMCQA(fMCQA); \r
+ }\r
+ if (GetPlugin(kIsElecBackGround)) { \r
+ fElecBackGround->SetMCEvent(fMCEvent);\r
+ }\r
+ }\r
+\r
+ Double_t container[10];\r
+ memset(container, 0, sizeof(Double_t) * 10);\r
+ // container for the output THnSparse\r
+ Double_t dataDca[6]; // [source, pT, dca, centrality]\r
+ Int_t nElectronCandidates = 0;\r
+ AliESDtrack *track = NULL, *htrack = NULL;\r
+ AliMCParticle *mctrack = NULL;\r
+ AliMCParticle *mctrackmother = NULL;\r
+\r
+ Bool_t signal = kTRUE;\r
+\r
+ fCFM->SetRecEventInfo(fESD);\r
+\r
+ // Get Number of contributors to the primary vertex for multiplicity-dependent correction\r
+ Int_t ncontribVtx = 0;\r
+ const AliESDVertex *priVtx = fESD->GetPrimaryVertexTracks();\r
+ if(priVtx){\r
+ ncontribVtx = priVtx->GetNContributors();\r
+ }\r
+\r
+ // minjung for IP QA(temporary ~ 2weeks)\r
+ if(!fExtraCuts){\r
+ fExtraCuts = new AliHFEextraCuts("hfetmpCuts","HFE tmp Cuts");\r
+ }\r
+ fExtraCuts->SetRecEventInfo(fESD);\r
+\r
+ // Electron background analysis \r
+ if (GetPlugin(kIsElecBackGround)) {\r
+\r
+ AliDebug(2, "Running BackGround Analysis");\r
+\r
+ fElecBackGround->Reset();\r
+\r
+ } // end of electron background analysis\r
+\r
+\r
+ // Background subtraction-------------------------------------------------------------------\r
+ if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->FillPoolAssociatedTracks(fInputEvent, fCentralityF);\r
+ //------------------------------------------------------------------------------------------\r
+\r
+ //\r
+ // Loop ESD\r
+ //\r
+ AliDebug(3, Form("Number of Tracks: %d", fESD->GetNumberOfTracks()));\r
+ for(Int_t itrack = 0; itrack < fESD->GetNumberOfTracks(); itrack++){\r
+ AliDebug(4, "New ESD track");\r
+ track = fESD->GetTrack(itrack);\r
+ track->SetESDEvent(fESD);\r
+\r
+ // fill counts of v0-identified particles\r
+ Int_t v0pid = -1;\r
+ if(track->TestBit(BIT(14))) v0pid = AliPID::kElectron;\r
+ else if(track->TestBit(BIT(15))) v0pid = AliPID::kPion;\r
+ else if(track->TestBit(BIT(16))) v0pid = AliPID::kProton;\r
+ // here the tagged track analysis will run\r
+ if(fTaggedTrackAnalysis && v0pid > -1){ \r
+ AliDebug(1, Form("Track identified as %s", AliPID::ParticleName(v0pid)));\r
+ fTaggedTrackAnalysis->ProcessTrack(track, v0pid);\r
+ AliDebug(1, "V0 PID done");\r
+ }\r
+ \r
+\r
+ //Fill non-HFE source containers at reconstructed events cut step\r
+ AliDebug(3, Form("Doing track %d, %p", itrack, track));\r
+\r
+\r
+ //////////////////////////////////////\r
+ // preselect\r
+ //////////////////////////////////////\r
+ if(fPIDpreselect || fCutspreselect) {\r
+ if(!PreSelectTrack(track)) continue;\r
+ }\r
+\r
+ signal = kTRUE;\r
+ \r
+ // Fill step without any cut\r
+ \r
+ if(HasMCData()){\r
+ // Check if it is electrons near the vertex\r
+ if(!(mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel()))))) continue;\r
+\r
+ if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE; \r
+ else AliDebug(3, "Signal Electron");\r
+\r
+ // Fill K pt for Ke3 contributions\r
+ if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode())==321)) fQACollection->Fill("Kptspectra",mctrack->Pt());\r
+ else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode())==130)) fQACollection->Fill("K0Lptspectra",mctrack->Pt());\r
+ } \r
+ // Cache new Track information inside the var manager\r
+ fVarManager->NewTrack(track, mctrack, fCentralityF, -1, signal);\r
+\r
+ if(fFillNoCuts) {\r
+ if(signal || !fFillSignalOnly){\r
+ fVarManager->FillContainer(fContainer, "recTrackContReco", AliHFEcuts::kStepRecNoCut, kFALSE);\r
+ fVarManager->FillContainer(fContainer, "recTrackContMC", AliHFEcuts::kStepRecNoCut, kTRUE);\r
+ }\r
+ }\r
+ \r
+ // RecKine: ITSTPC cuts \r
+ if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;\r
+ \r
+ \r
+ // RecPrim\r
+ if(fRejectKinkMother) { \r
+ if(track->GetKinkIndex(0) != 0) continue; } // Quick and dirty fix to reject both kink mothers and daughters\r
+ if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;\r
+\r
+ // HFEcuts: ITS layers cuts\r
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;\r
+ \r
+ // HFE cuts: TOF PID and mismatch flag\r
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTOF, track)) continue;\r
+\r
+ // HFE cuts: TPC PID cleanup\r
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;\r
+\r
+ // HFEcuts: Nb of tracklets TRD0\r
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTRD, track)) continue;\r
+\r
+ // Fill correlation maps before PID\r
+ if(signal && fContainer->GetCorrelationMatrix("correlationstepbeforePID")) {\r
+ //printf("Fill correlation maps before PID\n");\r
+ fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepbeforePID"));\r
+ }\r
+\r
+ if(HasMCData()){\r
+ FillProductionVertex(track);\r
+\r
+ if(fMCQA && signal){\r
+ fMCQA->SetCentrality(fCentralityF);\r
+ if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){\r
+ Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.};\r
+ Double_t hfeimpactRtmp=0., hfeimpactnsigmaRtmp=0.;\r
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactRtmp, hfeimpactnsigmaRtmp);\r
+ UChar_t itsPixel = track->GetITSClusterMap();\r
+ Double_t ilyrhit=0, ilyrstat=0;\r
+ for(Int_t ilyr=0; ilyr<6; ilyr++){\r
+ if(TESTBIT(itsPixel, ilyr)) ilyrhit += TMath::Power(2,ilyr);\r
+ if(fExtraCuts->CheckITSstatus(fExtraCuts->GetITSstatus(track,ilyr))) ilyrstat += TMath::Power(2,ilyr);\r
+ }\r
+ fMCQA->SetITSInfo(ilyrhit,ilyrstat);\r
+ fMCQA->SetHFEImpactParameters(hfeimpactRtmp, hfeimpactnsigmaRtmp);\r
+ fMCQA->SetTrkKine(track->Pt(),track->Eta(), track->Phi());\r
+ fMCQA->SetContainerStep(3);\r
+ for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){\r
+ weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE \r
+ if(!fisNonHFEsystematics || IsPbPb())break; \r
+ }\r
+ \r
+ if(fisNonHFEsystematics){\r
+ //Fill additional containers for electron source distinction\r
+ Int_t elecSource = 0;\r
+ elecSource = fMCQA->GetElecSource(mctrack->Particle());\r
+ const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};\r
+ const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};\r
+ Int_t iName = 0;\r
+ for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){\r
+ if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;\r
+ if(elecSource == iSource){\r
+ for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){\r
+ if(weightElecBgV0[iLevel]>0){ \r
+ fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, weightElecBgV0[iLevel]);\r
+ } \r
+ else if(weightElecBgV0[iLevel]<0){ \r
+ fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 3, kFALSE, -1*weightElecBgV0[iLevel]);\r
+ }\r
+ if(IsPbPb())break;\r
+ }\r
+ break;\r
+ }\r
+ iName++;\r
+ if(iName == kElecBgSpecies)iName = 0;\r
+ }\r
+ }\r
+ //else{\r
+ if(weightElecBgV0[0]>0) {\r
+ fVarManager->FillContainer(fContainer, "conversionElecs", 3, kFALSE, weightElecBgV0[0]);\r
+ fVarManager->FillContainer(fContainer, "conversionElecs", 4, kTRUE, weightElecBgV0[0]);\r
+ }\r
+ else if(weightElecBgV0[0]<0) {\r
+ fVarManager->FillContainer(fContainer, "mesonElecs", 3, kFALSE, -1*weightElecBgV0[0]);\r
+ fVarManager->FillContainer(fContainer, "mesonElecs", 4, kTRUE, -1*weightElecBgV0[0]);\r
+ }\r
+ //}\r
+ }\r
+ }\r
+\r
+ Double_t hfeimpactR4all=0., hfeimpactnsigmaR4all=0.;\r
+ Int_t sourceDca =-1;\r
+ if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 211)){\r
+ if(track->Pt()>4.){\r
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);\r
+ dataDca[0]=0; //pion\r
+ dataDca[1]=track->Pt();\r
+ dataDca[2]=hfeimpactR4all;\r
+ dataDca[3]=fCentralityF;\r
+ dataDca[4] = v0pid;\r
+ dataDca[5] = double(track->Charge());\r
+ fQACollection->Fill("Dca", dataDca);\r
+ }\r
+ }\r
+ else if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) == 11)){ // to increas statistics for Martin\r
+ if(signal){\r
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);\r
+ if(fSignalCuts->IsCharmElectron(track)){\r
+ sourceDca=1;\r
+ }\r
+ else if(fSignalCuts->IsBeautyElectron(track)){\r
+ sourceDca=2;\r
+ }\r
+ else if(fSignalCuts->IsGammaElectron(track)){\r
+ sourceDca=3;\r
+ }\r
+ else if(fSignalCuts->IsNonHFElectron(track)){\r
+ sourceDca=4;\r
+ }\r
+ else if(fSignalCuts->IsJpsiElectron(track)){\r
+ sourceDca=5;\r
+ }\r
+ else {\r
+ sourceDca=6;\r
+ }\r
+ dataDca[0]=sourceDca;\r
+ dataDca[1]=track->Pt();\r
+ dataDca[2]=hfeimpactR4all;\r
+ dataDca[3]=fCentralityF;\r
+ dataDca[4] = v0pid;\r
+ dataDca[5] = double(track->Charge());\r
+ if(signal) fQACollection->Fill("Dca", dataDca);\r
+ }\r
+ }\r
+ }\r
+\r
+ AliHFEpidObject hfetrack;\r
+ hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);\r
+ hfetrack.SetRecTrack(track);\r
+ if(HasMCData()) hfetrack.SetMCTrack(mctrack);\r
+ hfetrack.SetCentrality(fCentralityF);\r
+ hfetrack.SetMulitplicity(ncontribVtx);\r
+ if(IsHeavyIon()) hfetrack.SetPbPb();\r
+ else hfetrack.SetPP();\r
+ fPID->SetVarManager(fVarManager);\r
+ if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue;\r
+ nElectronCandidates++;\r
+ \r
+ // Background subtraction------------------------------------------------------------------------------------------\r
+ if (GetPlugin(kNonPhotonicElectron)) {\r
+ Int_t indexmother = -1;\r
+ Int_t mcsource = -1;\r
+ if(HasMCData()){\r
+ mcsource = fBackgroundSubtraction->FindMother(mctrack->GetLabel(),indexmother);\r
+ }\r
+ fBackgroundSubtraction->LookAtNonHFE(itrack, track, fInputEvent, 1, fCentralityF, -1, mcsource, indexmother);\r
+ }\r
+ //-----------------------------------------------------------------------------------------------------------------\r
+\r
+ // Temporary histogram for chi2/ITS cluster\r
+ if(IsPbPb()) {\r
+ TBits shared = track->GetTPCSharedMap();\r
+ Int_t sharebit=0;\r
+ if(shared.CountBits() >= 2) sharebit=1;\r
+\r
+ Double_t itschi2percluster = 0.0;\r
+ Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));\r
+ if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;\r
+\r
+ Double_t itsChi2[7] = {track->Pt(),track->Eta(), track->Phi(),\r
+ fCentralityF,track->GetTPCsignalN(), sharebit,itschi2percluster};\r
+ fQACollection->Fill("fChi2perITScluster", itsChi2);\r
+ }\r
+ else{\r
+\r
+ Double_t itschi2percluster = 0.0;\r
+ Double_t itsnbcls = static_cast<Double_t>(track->GetNcls(0));\r
+ if(itsnbcls > 0) itschi2percluster = track->GetITSchi2()/itsnbcls;\r
+\r
+ Double_t itsChi2[3] = {track->Pt(), fCentralityF, itschi2percluster};\r
+ fQACollection->Fill("fChi2perITScluster", itsChi2);\r
+ }\r
+\r
+ // Fill Histogram for Hadronic Background\r
+ if(HasMCData()){\r
+ if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11))\r
+ fVarManager->FillContainer(fContainer, "hadronicBackground", UInt_t(0), kFALSE);\r
+ else if(mctrack){\r
+ // Fill Ke3 contributions\r
+ Int_t glabel=TMath::Abs(mctrack->GetMother());\r
+ if((mctrackmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(glabel)))){\r
+ if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==321)\r
+ fQACollection->Fill("Ke3Kecorr",mctrack->Pt(),mctrackmother->Pt());\r
+ else if(TMath::Abs(mctrackmother->Particle()->GetPdgCode())==130)\r
+ fQACollection->Fill("Ke3K0Lecorr",mctrack->Pt(),mctrackmother->Pt());\r
+ }\r
+ }\r
+ }\r
+\r
+ // Fill Containers\r
+ if(signal) {\r
+ // Apply weight for background contamination\r
+ if(fBackGroundFactorApply) {\r
+ if(IsHeavyIon() && fCentralityF >= 0) fWeightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));\r
+ else fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case\r
+\r
+ if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;\r
+ else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;\r
+ // weightBackGround as special weight\r
+ fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);\r
+ }\r
+ fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));\r
+ }\r
+\r
+ Bool_t bTagged=kFALSE;\r
+ if(GetPlugin(kSecVtx)) {\r
+ AliDebug(2, "Running Secondary Vertex Analysis");\r
+ if(fSecVtx->Process(track) && signal) {\r
+ fVarManager->FillContainer(fContainer, "recTrackContSecvtxReco", AliHFEcuts::kStepHFEcutsSecvtx, kFALSE);\r
+ fVarManager->FillContainer(fContainer, "recTrackContSecvtxMC", AliHFEcuts::kStepHFEcutsSecvtx, kTRUE);\r
+ bTagged=kTRUE;\r
+ }\r
+ }\r
+\r
+ // Electron background analysis \r
+ if (GetPlugin(kIsElecBackGround)) {\r
+ \r
+ AliDebug(2, "Running BackGround Analysis");\r
+ \r
+ for(Int_t jtrack = 0; jtrack < fESD->GetNumberOfTracks(); jtrack++){\r
+ htrack = fESD->GetTrack(jtrack);\r
+ if ( itrack == jtrack ) continue; \r
+ fElecBackGround->PairAnalysis(track, htrack); \r
+ }\r
+ } // end of electron background analysis\r
+\r
+ if (GetPlugin(kDEstep)) { \r
+ Double_t weightElecBgV0[kBgLevels] = {0.,0.,0.,};\r
+ Int_t elecSource = 0;\r
+ Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;\r
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);\r
+ if(HasMCData())\r
+ {\r
+ if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){\r
+ fQACollection->Fill("hadronsBeforeIPcut",track->Pt());\r
+ } \r
+ if(fMCQA && signal) {\r
+ \r
+ fMCQA->SetContainerStep(0);\r
+ for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){\r
+ weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE \r
+ if(!fisNonHFEsystematics || IsPbPb())break; \r
+ }\r
+ \r
+ if(fisNonHFEsystematics){\r
+ //Fill additional containers for electron source distinction \r
+ elecSource = fMCQA->GetElecSource(mctrack->Particle());\r
+ const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};\r
+ const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};\r
+ Int_t iName = 0;\r
+ for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){\r
+ if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;\r
+ if(elecSource == iSource){\r
+ for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){\r
+ if(weightElecBgV0[iLevel]>0) fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 0, kFALSE, weightElecBgV0[iLevel]);\r
+ else if(weightElecBgV0[iLevel]<0) fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 0, kFALSE, -1*weightElecBgV0[iLevel]);\r
+ if(IsPbPb())break;\r
+ }\r
+ break;\r
+ }\r
+ iName++;\r
+ if(iName == kElecBgSpecies)iName = 0;\r
+ }\r
+ }\r
+ //else{\r
+ if(weightElecBgV0[0]>0) {\r
+ fVarManager->FillContainer(fContainer, "conversionElecs", 0, kFALSE, weightElecBgV0[0]);\r
+ fVarManager->FillContainer(fContainer, "conversionElecs", 5, kTRUE, weightElecBgV0[0]);\r
+ }\r
+ else if(weightElecBgV0[0]<0) {\r
+ fVarManager->FillContainer(fContainer, "mesonElecs", 0, kFALSE, -1*weightElecBgV0[0]);\r
+ fVarManager->FillContainer(fContainer, "mesonElecs", 5, kTRUE, -1*weightElecBgV0[0]);\r
+ } \r
+ //}\r
+ if(bTagged){ // bg estimation for the secondary vertex tagged signals\r
+ if(weightElecBgV0[0]>0) fVarManager->FillContainer(fContainer, "conversionElecs", 2, kFALSE, weightElecBgV0[0]);\r
+ else if(weightElecBgV0[0]<0) fVarManager->FillContainer(fContainer, "mesonElecs", 2, kFALSE, -1*weightElecBgV0[0]);\r
+ }\r
+ }\r
+ } // end of MC\r
+\r
+ dataDca[0]=-1; //for data, don't know the origin\r
+ dataDca[1]=track->Pt();\r
+ dataDca[2]=hfeimpactR;\r
+ dataDca[3]=fCentralityF;\r
+ dataDca[4] = v0pid;\r
+ dataDca[5] = double(track->Charge());\r
+ if (!HasMCData()) fQACollection->Fill("Dca", dataDca);\r
+\r
+ // Fill Containers for impact parameter analysis\r
+ if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;\r
+ if(signal) {\r
+ // Apply weight for background contamination after ip cut\r
+ if(fBackGroundFactorApply) {\r
+ fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case\r
+ if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;\r
+ else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;\r
+ // weightBackGround as special weight\r
+ fVarManager->FillContainer(fContainer, "hadronicBackground", 2, kFALSE, fWeightBackGround);\r
+ }\r
+ }\r
+\r
+ if(HasMCData()){\r
+ if(fMCQA && signal) {\r
+ fMCQA->SetContainerStep(1);\r
+ for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){\r
+ weightElecBgV0[iLevel] = fMCQA->GetWeightFactor(mctrack, iLevel); // positive:conversion e, negative: nonHFE \r
+ if(!fisNonHFEsystematics || IsPbPb())break; \r
+ } \r
+ if(fisNonHFEsystematics){\r
+ //Fill additional containers for electron source distinction \r
+ elecSource = fMCQA->GetElecSource(mctrack->Particle());\r
+ const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};\r
+ const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};\r
+ Int_t iName = 0;\r
+ for(Int_t iSource = AliHFEmcQA::kPi0; iSource <= AliHFEmcQA::kGammaRho0; iSource++){\r
+ if((iSource == AliHFEmcQA::kElse)||(iSource == AliHFEmcQA::kMisID)) continue;\r
+ if(elecSource == iSource){\r
+ for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){\r
+ if(weightElecBgV0[iLevel]>0) fVarManager->FillContainer(fContainer, Form("conversionElecs%s%s",sourceName[iName], levelName[iLevel]), 1, kFALSE, weightElecBgV0[iLevel]);\r
+ else if(weightElecBgV0[iLevel]<0) fVarManager->FillContainer(fContainer, Form("mesonElecs%s%s",sourceName[iName], levelName[iLevel]), 1, kFALSE, -1*weightElecBgV0[iLevel]);\r
+ if(IsPbPb())break;\r
+ }\r
+ break;\r
+ }\r
+ iName++;\r
+ if(iName == kElecBgSpecies)iName = 0;\r
+ }\r
+ }\r
+ // else{\r
+ if(weightElecBgV0[0]>0) {\r
+ fVarManager->FillContainer(fContainer, "conversionElecs", 1, kFALSE, weightElecBgV0[0]);\r
+ fVarManager->FillContainer(fContainer, "conversionElecs", 6, kTRUE, weightElecBgV0[0]);\r
+ }\r
+ else if(weightElecBgV0[0]<0) {\r
+ fVarManager->FillContainer(fContainer, "mesonElecs", 1, kFALSE, -1*weightElecBgV0[0]);\r
+ fVarManager->FillContainer(fContainer, "mesonElecs", 6, kTRUE, -1*weightElecBgV0[0]);\r
+ }\r
+ //}\r
+ }\r
+ }\r
+ if(signal) {\r
+ fVarManager->FillContainer(fContainer, "recTrackContDEReco", AliHFEcuts::kStepHFEcutsDca, kFALSE);\r
+ fVarManager->FillContainer(fContainer, "recTrackContDEMC", AliHFEcuts::kStepHFEcutsDca, kTRUE);\r
+ fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterDE"));\r
+ }\r
+ if(HasMCData()){\r
+ if(mctrack && (TMath::Abs(mctrack->Particle()->GetPdgCode()) != 11)){\r
+ fQACollection->Fill("hadronsAfterIPcut",track->Pt());\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ // Background subtraction-------------------------------------------------------------------\r
+ if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->CountPoolAssociated(fInputEvent, fCentralityF);\r
+ //------------------------------------------------------------------------------------------\r
+\r
+ fQACollection->Fill("nElectronTracksEvent", nElectronCandidates);\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::ProcessAOD(){\r
+ //\r
+ // Run Analysis in AOD Mode\r
+ // Function is still in development\r
+ //\r
+ //printf("Process AOD\n");\r
+ AliDebug(3, "Processing AOD Event");\r
+ Double_t eventContainer[4];\r
+ eventContainer[0] = 0.0;\r
+ if(HasMCData()) eventContainer[0] = fVz;\r
+ else {\r
+ if(fInputEvent->GetPrimaryVertex()) eventContainer[0] = fInputEvent->GetPrimaryVertex()->GetZ();\r
+ }\r
+ eventContainer[1] = 1.; // No Information available in AOD analysis, assume all events have V0AND\r
+ eventContainer[2] = fCentralityF; \r
+ eventContainer[3] = fContributors; \r
+ \r
+ //printf("value event container %f, %f, %f, %f\n",eventContainer[0],eventContainer[1],eventContainer[2],eventContainer[3]);\r
+\r
+ AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);\r
+ if(!fAOD){\r
+ AliError("AOD Event required for AOD Analysis");\r
+ return;\r
+ }\r
+ \r
+ //printf("Will fill\n");\r
+ //\r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoCut);\r
+ //printf("Fill\n");\r
+ //\r
+ if(fIdentifiedAsPileUp) return; \r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepRecNoPileUp);\r
+\r
+ //\r
+ if(fIdentifiedAsOutInz) return;\r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepZRange); \r
+\r
+ //\r
+ if(!fPassTheEventCut) return;\r
+ fCFM->GetEventContainer()->Fill(eventContainer, AliHFEcuts::kEventStepReconstructed);\r
+ //printf("pass\n");\r
+\r
+ fContainer->NewEvent();\r
+\r
+ fCFM->SetRecEventInfo(fAOD);\r
+\r
+ if(!fExtraCuts){\r
+ fExtraCuts = new AliHFEextraCuts("hfeExtraCuts","HFE Extra Cuts");\r
+ }\r
+ fExtraCuts->SetRecEventInfo(fAOD);\r
+\r
+ // Get Number of contributors to the primary vertex for multiplicity-dependent correction\r
+ Int_t ncontribVtx = 0;\r
+ AliAODVertex *priVtx = fAOD->GetPrimaryVertex();\r
+ if(priVtx){\r
+ ncontribVtx = priVtx->GetNContributors();\r
+ }\r
+\r
+ // Look for kink mother\r
+ Int_t numberofvertices = fAOD->GetNumberOfVertices();\r
+ Double_t listofmotherkink[numberofvertices];\r
+ Int_t numberofmotherkink = 0;\r
+ for(Int_t ivertex=0; ivertex < numberofvertices; ivertex++) {\r
+ AliAODVertex *aodvertex = fAOD->GetVertex(ivertex);\r
+ if(!aodvertex) continue;\r
+ if(aodvertex->GetType()==AliAODVertex::kKink) {\r
+ AliAODTrack *mother = (AliAODTrack *) aodvertex->GetParent();\r
+ if(!mother) continue;\r
+ Int_t idmother = mother->GetID();\r
+ listofmotherkink[numberofmotherkink] = idmother;\r
+ //printf("ID %d\n",idmother);\r
+ numberofmotherkink++;\r
+ }\r
+ }\r
+ //printf("Number of kink mother in the events %d\n",numberofmotherkink);\r
+\r
+ // Background subtraction-------------------------------------------------------------------\r
+ if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->FillPoolAssociatedTracks(fInputEvent, fCentralityF);\r
+ //------------------------------------------------------------------------------------------\r
+\r
+ // Loop over tracks\r
+ AliAODTrack *track = NULL;\r
+ AliAODMCParticle *mctrack = NULL;\r
+ Double_t dataDca[6]; // [source, pT, dca, centrality]\r
+ Int_t nElectronCandidates = 0;\r
+ Bool_t signal;\r
+\r
+ //printf("Number of track %d\n",(Int_t) fAOD->GetNumberOfTracks());\r
+ for(Int_t itrack = 0; itrack < fAOD->GetNumberOfTracks(); itrack++){\r
+ track = fAOD->GetTrack(itrack); mctrack = NULL;\r
+ if(!track) continue;\r
+ \r
+ signal = kTRUE;\r
+ if(HasMCData()){\r
+\r
+ Int_t label = TMath::Abs(track->GetLabel());\r
+ if(label && label < fAODArrayMCInfo->GetEntriesFast())\r
+ mctrack = dynamic_cast<AliAODMCParticle *>(fAODArrayMCInfo->At(label));\r
+ if(fFillSignalOnly && !fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, mctrack)) signal = kFALSE;\r
+ }\r
+ \r
+ fVarManager->NewTrack(track, mctrack, fCentralityF, -1, signal);\r
+ \r
+ if(fFillNoCuts) {\r
+ if(signal || !fFillSignalOnly){\r
+ fVarManager->FillContainer(fContainer, "recTrackContReco", AliHFEcuts::kStepRecNoCut, kFALSE);\r
+ fVarManager->FillContainer(fContainer, "recTrackContMC", AliHFEcuts::kStepRecNoCut, kTRUE);\r
+ }\r
+ }\r
+\r
+ fQACollection->Fill("Filterorigin", -1); \r
+ for(Int_t k=0; k<20; k++) {\r
+ Int_t u = 1<<k;\r
+ if((track->TestFilterBit(u))) {\r
+ fQACollection->Fill("Filterorigin", k);\r
+ }\r
+ }\r
+\r
+ if(fApplyCutAOD) {\r
+ //printf("Apply cuts\n");\r
+ // RecKine: ITSTPC cuts \r
+ if(!ProcessCutStep(AliHFEcuts::kStepRecKineITSTPC, track)) continue;\r
+\r
+ // Reject kink mother\r
+ if(fRejectKinkMother) {\r
+ Bool_t kinkmotherpass = kTRUE;\r
+ for(Int_t kinkmother = 0; kinkmother < numberofmotherkink; kinkmother++) {\r
+ if(track->GetID() == listofmotherkink[kinkmother]) {\r
+ kinkmotherpass = kFALSE;\r
+ continue;\r
+ }\r
+ }\r
+ if(!kinkmotherpass) continue;\r
+ }\r
+ \r
+ // RecPrim\r
+ if(!ProcessCutStep(AliHFEcuts::kStepRecPrim, track)) continue;\r
+ \r
+ // HFEcuts: ITS layers cuts\r
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsITS, track)) continue;\r
+ \r
+ // HFE cuts: TOF PID and mismatch flag\r
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTOF, track)) continue;\r
+ \r
+ // HFE cuts: TPC PID cleanup\r
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTPC, track)) continue;\r
+ \r
+ // HFEcuts: Nb of tracklets TRD0\r
+ if(!ProcessCutStep(AliHFEcuts::kStepHFEcutsTRD, track)) continue;\r
+ }\r
+\r
+ // Fill correlation maps before PID\r
+ if(signal && fContainer->GetCorrelationMatrix("correlationstepbeforePID")) {\r
+ //printf("Fill correlation maps before PID\n");\r
+ fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepbeforePID"));\r
+ }\r
+\r
+ if(HasMCData()){\r
+ Double_t hfeimpactR4all=0., hfeimpactnsigmaR4all=0.;\r
+ Int_t sourceDca =-1;\r
+ if(mctrack && (TMath::Abs(mctrack->GetPdgCode()) == 211)){\r
+ if(track->Pt()>4.){\r
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);\r
+ dataDca[0]=0; //pion\r
+ dataDca[1]=track->Pt();\r
+ dataDca[2]=hfeimpactR4all;\r
+ dataDca[3]=fCentralityF;\r
+ dataDca[4] = -1; // not store V0 for the moment\r
+ dataDca[5] = double(track->Charge());\r
+ fQACollection->Fill("Dca", dataDca);\r
+ }\r
+ }\r
+ else if(mctrack && (TMath::Abs(mctrack->GetPdgCode()) == 11)){ // to increas statistics for Martin\r
+ if(signal){\r
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactR4all, hfeimpactnsigmaR4all);\r
+ if(fSignalCuts->IsCharmElectron(track)){\r
+ sourceDca=1;\r
+ }\r
+ else if(fSignalCuts->IsBeautyElectron(track)){\r
+ sourceDca=2;\r
+ }\r
+ else if(fSignalCuts->IsGammaElectron(track)){\r
+ sourceDca=3;\r
+ }\r
+ else if(fSignalCuts->IsNonHFElectron(track)){\r
+ sourceDca=4;\r
+ }\r
+ else if(fSignalCuts->IsJpsiElectron(track)){\r
+ sourceDca=5;\r
+ }\r
+ else {\r
+ sourceDca=6;\r
+ }\r
+ dataDca[0]=sourceDca;\r
+ dataDca[1]=track->Pt();\r
+ dataDca[2]=hfeimpactR4all;\r
+ dataDca[3]=fCentralityF;\r
+ dataDca[4] = -1; // not store V0 for the moment\r
+ dataDca[5] = double(track->Charge());\r
+ if(signal) fQACollection->Fill("Dca", dataDca);\r
+ }\r
+ }\r
+ }\r
+\r
+ //printf("Will process to PID\n");\r
+\r
+ // track accepted, do PID\r
+ AliHFEpidObject hfetrack;\r
+ hfetrack.SetAnalysisType(AliHFEpidObject::kAODanalysis);\r
+ hfetrack.SetRecTrack(track);\r
+ if(HasMCData()) hfetrack.SetMCTrack(mctrack);\r
+ hfetrack.SetCentrality(fCentralityF);\r
+ hfetrack.SetMulitplicity(ncontribVtx); // for correction\r
+ if(IsHeavyIon()) hfetrack.SetPbPb();\r
+ else hfetrack.SetPP();\r
+ fPID->SetVarManager(fVarManager);\r
+ if(!fPID->IsSelected(&hfetrack, fContainer, "recTrackCont", fPIDqa)) continue; \r
+ // we will do PID here as soon as possible\r
+\r
+ // Background subtraction----------------------------------------------------------------------------------------------\r
+ if (GetPlugin(kNonPhotonicElectron)) {\r
+ Int_t indexmother = -1;\r
+ Int_t mcsource = -1;\r
+ if(HasMCData() && mctrack) mcsource = fBackgroundSubtraction->FindMother(mctrack->GetLabel(),indexmother);\r
+ fBackgroundSubtraction->LookAtNonHFE(itrack, track, fInputEvent, 1, fCentralityF, -1,mcsource, indexmother);\r
+ }\r
+ //---------------------------------------------------------------------------------------------------------------------\r
+\r
+ // end AOD QA\r
+ fQACollection->Fill("Filterend", -1); \r
+ for(Int_t k=0; k<20; k++) {\r
+ Int_t u = 1<<k;\r
+ if((track->TestFilterBit(u))) {\r
+ fQACollection->Fill("Filterend", k);\r
+ }\r
+ }\r
+ \r
+ // Apply weight for background contamination\r
+ //Double_t weightBackGround = 1.0;\r
+ if(signal) {\r
+ // Apply weight for background contamination\r
+ if(fBackGroundFactorApply) {\r
+ if(IsHeavyIon() && fCentralityF >= 0) fWeightBackGround = fkBackGroundFactorArray[fCentralityF >= 0 ? fCentralityF : 0]->Eval(TMath::Abs(track->P()));\r
+ else fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case\r
+ \r
+ if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;\r
+ else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;\r
+ // weightBackGround as special weight\r
+ fVarManager->FillContainer(fContainer, "hadronicBackground", 1, kFALSE, fWeightBackGround);\r
+ }\r
+ fVarManager->FillCorrelationMatrix(fContainer->GetCorrelationMatrix("correlationstepafterPID"));\r
+ }\r
+ \r
+ nElectronCandidates++; \r
+\r
+ if (GetPlugin(kDEstep)) {\r
+ if (!HasMCData()){\r
+ Double_t hfeimpactR=0., hfeimpactnsigmaR=0.;\r
+ fExtraCuts->GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);\r
+ dataDca[0]=-1; //for data, don't know the origin\r
+ dataDca[1]=track->Pt();\r
+ dataDca[2]=hfeimpactR;\r
+ dataDca[3]=fCentralityF;\r
+ dataDca[4] = -1; // not store V0 for the moment\r
+ dataDca[5] = double(track->Charge());\r
+ fQACollection->Fill("Dca", dataDca);\r
+ }\r
+\r
+ // Fill Containers for impact parameter analysis\r
+ if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepHFEcutsDca + AliHFEcuts::kNcutStepsMCTrack + AliHFEcuts::kNcutStepsRecTrack,track)) continue;\r
+ if(signal) {\r
+ // Apply weight for background contamination after ip cut\r
+ if(fBackGroundFactorApply) {\r
+ fWeightBackGround = fkBackGroundFactorArray[0]->Eval(TMath::Abs(track->P())); // pp case\r
+ if(fWeightBackGround < 0.0) fWeightBackGround = 0.0;\r
+ else if(fWeightBackGround > 1.0) fWeightBackGround = 1.0;\r
+ // weightBackGround as special weight\r
+ fVarManager->FillContainer(fContainer, "hadronicBackground", 2, kFALSE, fWeightBackGround);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ // Background subtraction-------------------------------------------------------------------\r
+ if (GetPlugin(kNonPhotonicElectron)) fBackgroundSubtraction->CountPoolAssociated(fInputEvent, fCentralityF);\r
+ //------------------------------------------------------------------------------------------\r
+\r
+ fQACollection->Fill("nElectronTracksEvent", nElectronCandidates);\r
+}\r
+\r
+//____________________________________________________________\r
+Bool_t AliAnalysisTaskHFE::ProcessMCtrack(AliVParticle *track){\r
+ //\r
+ // Filter the Monte Carlo Track\r
+ // Additionally Fill a THnSparse for Signal To Background Studies\r
+ // Works for AOD and MC analysis Type\r
+ //\r
+ fVarManager->NewTrack(track, NULL, fCentralityF, -1, kTRUE);\r
+\r
+\r
+ 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)\r
+ if(IsESDanalysis()){\r
+ AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(track);\r
+ if(mctrack){\r
+ vertex[0] = mctrack->Particle()->Vx();\r
+ vertex[1] = mctrack->Particle()->Vy();\r
+ }\r
+ } else {\r
+ AliAODMCParticle *aodmctrack = dynamic_cast<AliAODMCParticle *>(track);\r
+ if(aodmctrack) aodmctrack->XvYvZv(vertex);\r
+ }\r
+\r
+ //printf("MC Generated\n");\r
+ if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepMCGenerated, track)) return kFALSE;\r
+ //printf("MC Generated pass\n");\r
+ fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGenerated, kFALSE);\r
+\r
+ // Step GeneratedZOutNoPileUp\r
+ if((fIdentifiedAsPileUp) || (TMath::Abs(fVz) > fCuts->GetVertexRange()) || (fCentralityF < 0)) return kFALSE;\r
+ fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedZOutNoPileUpCentralityFine, kFALSE);\r
+ //printf("In ProcessMCtrack %f\n",fCentralityF);\r
+\r
+ // Step Generated Event Cut\r
+ if(!fPassTheEventCut) return kFALSE;\r
+ fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCGeneratedEventCut, kFALSE);\r
+\r
+ if(!fCFM->CheckParticleCuts(AliHFEcuts::kStepMCInAcceptance, track)) return kFALSE;\r
+ fVarManager->FillContainer(fContainer, "MCTrackCont", AliHFEcuts::kStepMCInAcceptance, kFALSE);\r
+ return kTRUE;\r
+}\r
+\r
+//____________________________________________________________\r
+Bool_t AliAnalysisTaskHFE::PreSelectTrack(AliESDtrack *track) const {\r
+ //\r
+ // Preselect tracks\r
+ //\r
+ \r
+\r
+ Bool_t survived = kTRUE;\r
+\r
+ if(fCutspreselect) {\r
+ //printf("test preselect\n");\r
+ if(!fCutspreselect->IsSelected(track)) survived=kFALSE;\r
+ }\r
+ //printf("survived %d\n",(Int_t)survived);\r
+ \r
+ if(survived && fPIDpreselect){\r
+ // Apply PID\r
+ AliHFEpidObject hfetrack;\r
+ hfetrack.SetAnalysisType(AliHFEpidObject::kESDanalysis);\r
+ hfetrack.SetRecTrack(track);\r
+ if(!fPIDpreselect->IsSelected(&hfetrack)) {\r
+ //printf("Did not pass AliHFEcuts::kPID\n");\r
+ survived = kFALSE;\r
+ }\r
+ //else printf("Pass AliHFEcuts::kPID\n");\r
+ }\r
+\r
+ return survived; \r
+ \r
+}\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::MakeEventContainer(){\r
+ //\r
+ // Create the event container for the correction framework and link it\r
+ // 1st bin: Vertex z-position\r
+ // 2nd bin: V0AND decision (normalization to sigma_inel)\r
+ // 3rd bin: Centrality class (for pp defined as number of contributors in vertex.)\r
+ // 4th bin: Number of contributors > 0\r
+ //\r
+ \r
+ const Int_t kNvar = 4; // number of variables on the grid: \r
+ Int_t nBins[kNvar] = {120, 2, 11, 2};\r
+ Double_t binMin[kNvar] = {-30. , 0., 0.0, 0.};\r
+ Double_t binMax[kNvar] = {30., 2., 11.0, 2.};\r
+ \r
+ AliCFContainer *evCont = new AliCFContainer("eventContainer", "Container for events", AliHFEcuts::kNcutStepsEvent, kNvar, nBins);\r
+ \r
+ Double_t *vertexBins = AliHFEtools::MakeLinearBinning(nBins[0], binMin[0], binMax[0]);\r
+ Double_t *v0andBins = AliHFEtools::MakeLinearBinning(nBins[1], binMin[1], binMax[1]);\r
+ Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBins[2], binMin[2], binMax[2]);\r
+ Double_t *contributorsBins = AliHFEtools::MakeLinearBinning(nBins[3], binMin[3], binMax[3]);\r
+ evCont->SetBinLimits(0, vertexBins);\r
+ evCont->SetBinLimits(1, v0andBins);\r
+ evCont->SetBinLimits(2, centralityBins);\r
+ evCont->SetBinLimits(3, contributorsBins);\r
+ delete[] vertexBins; delete[] v0andBins; delete[] centralityBins; delete[] contributorsBins;\r
+ \r
+ fCFM->SetEventContainer(evCont);\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::MakeParticleContainer(){\r
+ //\r
+ // Create the particle container for the correction framework manager and \r
+ // link it\r
+ //\r
+ if(!fContainer) fContainer = new AliHFEcontainer("trackContainer");\r
+ fVarManager->DefineVariables(fContainer);\r
+\r
+ // Create Correction Framework containers\r
+ fContainer->CreateContainer("MCTrackCont", "Track Container filled with MC information", AliHFEcuts::kNcutStepsMCTrack);\r
+ fContainer->CreateContainer("recTrackContReco", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());\r
+ fContainer->CreateContainer("recTrackContMC", "Track Container filled with MC information", AliHFEcuts::kNcutStepsRecTrack + fPID->GetNumberOfPIDdetectors());\r
+ \r
+ fContainer->CreateContainer("hadronicBackground", "Container for Hadronic Background", 3);\r
+ fContainer->CreateContainer("recTrackContDEReco", "Container for displaced electron analysis with Reco information", 1);\r
+ fContainer->CreateContainer("recTrackContDEMC", "Container for displaced electron analysis with MC information", 1);\r
+ fContainer->CreateContainer("recTrackContSecvtxReco", "Container for secondary vertexing analysis with Reco information", 1);\r
+ fContainer->CreateContainer("recTrackContSecvtxMC", "Container for secondary vertexing analysis with MC information", 1);\r
+\r
+ if(HasMCData()){\r
+ fContainer->CreateContainer("conversionElecs", "Container for weighted conversion electrons",7);\r
+ fContainer->CreateContainer("mesonElecs", "Container for weighted electrons from meson decays",7);\r
+ fContainer->Sumw2("conversionElecs");\r
+ fContainer->Sumw2("mesonElecs");\r
+ \r
+ if(fisNonHFEsystematics){\r
+ const Char_t *sourceName[kElecBgSpecies]={"Pion","Eta","Omega","Phi","EtaPrime","Rho"};\r
+ const Char_t *levelName[kBgLevels]={"Best","Lower","Upper"};\r
+ for(Int_t iSource = 0; iSource < kElecBgSpecies; iSource++){\r
+ for(Int_t iLevel = 0; iLevel < kBgLevels; iLevel++){\r
+ 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);\r
+ 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);\r
+ fContainer->Sumw2(Form("conversionElecs%s%s",sourceName[iSource],levelName[iLevel]));\r
+ fContainer->Sumw2(Form("mesonElecs%s%s",sourceName[iSource],levelName[iLevel]));\r
+ if(IsPbPb())break;\r
+ }\r
+ }\r
+ }\r
+ //fContainer->CreateContainer("charmElecs", "Container for weighted charm electrons",2);\r
+ }\r
+\r
+ fContainer->CreateCorrelationMatrix("correlationstepafterPID","THnSparse with correlations");\r
+ fContainer->CreateCorrelationMatrix("correlationstepafterDE","THnSparse with correlations");\r
+ if(!fVarManager->IsVariableDefined("centrality")) {\r
+ //printf("Create the two other correlation maps\n");\r
+ fContainer->CreateCorrelationMatrix("correlationstepbeforePID","THnSparse with correlations");\r
+ fContainer->CreateCorrelationMatrix("correlationstepafterTOF","THnSparse with correlations");\r
+ }\r
+\r
+ // Define the step names\r
+ for(UInt_t istep = 0; istep < AliHFEcuts::kNcutStepsMCTrack; istep++){\r
+ fContainer->SetStepTitle("MCTrackCont", AliHFEcuts::MCCutName(istep), istep);\r
+ }\r
+ for(UInt_t istep = 0; istep < AliHFEcuts::kNcutStepsRecTrack; istep++){\r
+ fContainer->SetStepTitle("recTrackContReco", AliHFEcuts::RecoCutName(istep), istep);\r
+ fContainer->SetStepTitle("recTrackContMC", AliHFEcuts::RecoCutName(istep), istep);\r
+ }\r
+ for(UInt_t ipid = 0; ipid < fPID->GetNumberOfPIDdetectors(); ipid++){\r
+ fContainer->SetStepTitle("recTrackContReco", fPID->SortedDetectorName(ipid), AliHFEcuts::kNcutStepsRecTrack + ipid);\r
+ fContainer->SetStepTitle("recTrackContMC", fPID->SortedDetectorName(ipid), AliHFEcuts::kNcutStepsRecTrack + ipid);\r
+ }\r
+}\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::InitContaminationQA(){\r
+ // \r
+ // Add QA for Impact Parameter cut\r
+ //\r
+\r
+ TObjArray *array = fVarManager->GetVariables();\r
+ Int_t nvars = array->GetEntriesFast();\r
+ for(Int_t v = 0; v < nvars; v++) {\r
+ AliHFEvarManager::AliHFEvariable *variable = (AliHFEvarManager::AliHFEvariable *) array->At(v);\r
+ if(!variable) continue;\r
+ TString name(((AliHFEvarManager::AliHFEvariable *)variable)->GetName());\r
+ if(!name.CompareTo("pt")) {\r
+ const Int_t nBinPt = variable->GetNumberOfBins();\r
+ const Double_t *kPtRange = variable->GetBinning();\r
+\r
+ fQACollection->CreateTH1Farray("hadronsBeforeIPcut", "Hadrons before IP cut", nBinPt, kPtRange);\r
+ fQACollection->CreateTH1Farray("hadronsAfterIPcut", "Hadrons after IP cut", nBinPt, kPtRange);\r
+\r
+ fQACollection->CreateTH2Farray("Ke3Kecorr", "Ke3 decay e and K correlation; Ke3K p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);\r
+ fQACollection->CreateTH2Farray("Ke3K0Lecorr", "Ke3 decay e and K0L correlation; Ke3K0L p_{t}; Ke3e p_{t}; ", nBinPt, kPtRange, 20,0.,20.);\r
+ fQACollection->CreateTH1Farray("Kptspectra", "Charged Kaons: MC p_{t} ", nBinPt, kPtRange);\r
+ fQACollection->CreateTH1Farray("K0Lptspectra", "K0L: MC p_{t} ", nBinPt, kPtRange);\r
+\r
+ const Double_t kDCAbound[2] = {-0.2, 0.2};\r
+\r
+ const Int_t nDimDca=6;\r
+ const Int_t nBinDca[nDimDca] = { 8, nBinPt, 800, 12, 6, 2};\r
+ Double_t minimaDca[nDimDca] = { -1., 0., kDCAbound[0], -1., -1, -1.1};\r
+ Double_t maximaDca[nDimDca] = { 7., 20., kDCAbound[1], 11., 5, 1.1};\r
+\r
+ Double_t *sourceBins = AliHFEtools::MakeLinearBinning(nBinDca[0], minimaDca[0], maximaDca[0]);\r
+ Double_t *dcaBins = AliHFEtools::MakeLinearBinning(nBinDca[2], minimaDca[2], maximaDca[2]);\r
+ Double_t *centralityBins = AliHFEtools::MakeLinearBinning(nBinDca[3], minimaDca[3], maximaDca[3]);\r
+ Double_t *v0PIDBins = AliHFEtools::MakeLinearBinning(nBinDca[4], minimaDca[4], maximaDca[4]);\r
+ Double_t *chargeBins = AliHFEtools::MakeLinearBinning(nBinDca[5], minimaDca[5], maximaDca[5]);\r
+\r
+ fQACollection->CreateTHnSparseNoLimits("Dca", "Dca; source (0-all, 1-charm,etc); pT [GeV/c]; dca; centrality bin; v0pid; charge", nDimDca, nBinDca);\r
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(0, sourceBins);\r
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(1, kPtRange);\r
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(2, dcaBins);\r
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(3, centralityBins);\r
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(4, v0PIDBins);\r
+ ((THnSparse*)(fQACollection->Get("Dca")))->SetBinEdges(5, chargeBins);\r
+\r
+ break;\r
+ } \r
+ }\r
+\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::InitHistoITScluster(){\r
+ //\r
+ // Initialize a temporary histogram to monitor the chi2/ITS cluster\r
+ if(IsPbPb()) {\r
+ const Int_t kNDim = 7;\r
+ const Int_t kNBins[kNDim] = {88, 20,90,11, 160, 2, 1000};\r
+ const Double_t kMin[kNDim] = {0.1, -1,0, 0.,0., 0, 0.};\r
+ const Double_t kMax[kNDim] = {20., 1, 2.*TMath::Pi(), 11.,160, 2, 100.};\r
+ fQACollection->CreateTHnSparse("fChi2perITScluster", "chi2/ITS cluster; p_{T} (GeV/c);eta;phi; centrality class;nclus;sharebit; #chi^{2}/ITS cluster", kNDim, kNBins, kMin, kMax);\r
+ fQACollection->BinLogAxis("fChi2perITScluster", 0);\r
+ }\r
+ else\r
+ {\r
+ const Int_t kNDim = 3;\r
+ const Int_t kNBins[kNDim] = {44, 11, 1000};\r
+ const Double_t kMin[kNDim] = {0.1, 0., 0.};\r
+ const Double_t kMax[kNDim] = {20., 11., 100.};\r
+ fQACollection->CreateTHnSparse("fChi2perITScluster", "chi2/ITS cluster; p_{T} (GeV/c); centrality class; #chi^{2}/ITS cluster", kNDim, kNBins, kMin, kMax);\r
+ fQACollection->BinLogAxis("fChi2perITScluster", 0);\r
+ }\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::SelectSpecialTrigger(const Char_t *trgclust, Int_t runMin, Int_t runMax){\r
+ //\r
+ // Select only events triggered by a special trigeer cluster\r
+ //\r
+ if(!fSpecialTrigger) fSpecialTrigger = new AliOADBContainer("SpecialTrigger");\r
+ fSpecialTrigger->AppendObject(new TObjString(trgclust), runMin, runMax);\r
+}\r
+\r
+//____________________________________________________________\r
+const Char_t * AliAnalysisTaskHFE::GetSpecialTrigger(Int_t run){\r
+ //\r
+ // Derive selected trigger string for given run\r
+ //\r
+ if(!fSpecialTrigger) return NULL;\r
+ TObjString *trg = dynamic_cast<TObjString *>(fSpecialTrigger->GetObject(run));\r
+ if(!trg) return NULL;\r
+ return trg->String().Data();\r
+}\r
+\r
+//____________________________________________________________\r
+void AliAnalysisTaskHFE::PrintStatus() const {\r
+ //\r
+ // Print Analysis status\r
+ //\r
+ printf("\n\tAnalysis Settings\n\t========================================\n\n");\r
+ printf("\tSecondary Vertex finding: %s\n", GetPlugin(kSecVtx) ? "YES" : "NO");\r
+ printf("\tPrimary Vertex resolution: %s\n", GetPlugin(kPriVtx) ? "YES" : "NO");\r
+ printf("\tDisplaced electron analysis step: %s\n", GetPlugin(kDEstep) ? "YES" : "NO");\r
+ printf("\tTagged Track Analysis: %s\n", GetPlugin(kTaggedTrackAnalysis) ? "YES" : "NO");\r
+ printf("\n");\r
+ printf("\tParticle Identification Detectors:\n");\r
+ fPID->PrintStatus();\r
+ printf("\n");\r
+ printf("\tQA: \n");\r
+ printf("\t\tPID: %s\n", IsQAOn(kPIDqa) ? "YES" : "NO");\r
+ printf("\t\tCUTS: %s\n", (fCuts != NULL && fCuts->IsQAOn()) ? "YES" : "NO");\r
+ printf("\t\tMC: %s\n", IsQAOn(kMCqa) ? "YES" : "NO");\r
+ printf("\n");\r
+}\r
+\r
+//____________________________________________________________\r
+Bool_t AliAnalysisTaskHFE::FillProductionVertex(const AliVParticle * const track) const{\r
+ //\r
+ // Find the production vertex of the associated MC track\r
+ //\r
+ if(!fMCEvent) return kFALSE;\r
+ const AliVParticle *mctrack = NULL;\r
+ TString objectType = track->IsA()->GetName();\r
+ if(objectType.CompareTo("AliESDtrack") == 0 || objectType.CompareTo("AliAODTrack") == 0){\r
+ // Reconstructed track\r
+ mctrack = fMCEvent->GetTrack(TMath::Abs(track->GetLabel()));\r
+ } else {\r
+ // MCParticle\r
+ mctrack = track;\r
+ }\r
+\r
+ if(!mctrack) return kFALSE;\r
+\r
+ Double_t xv = 0.0;\r
+ Double_t yv = 0.0;\r
+ \r
+ if(TString(mctrack->IsA()->GetName()).CompareTo("AliMCParticle") == 0){\r
+ // case MCParticle\r
+ const AliMCParticle *mcpart = dynamic_cast<const AliMCParticle *>(mctrack);\r
+ if(mcpart){\r
+ xv = mcpart->Xv();\r
+ yv = mcpart->Yv();\r
+ }\r
+ } else {\r
+ // case AODMCParticle\r
+ const AliAODMCParticle *mcpart = dynamic_cast<const AliAODMCParticle *>(mctrack);\r
+ if(mcpart){\r
+ xv = mcpart->Xv();\r
+ yv = mcpart->Yv();\r
+ }\r
+ }\r
+\r
+ //printf("xv %f, yv %f\n",xv,yv);\r
+ fQACollection->Fill("radius", TMath::Abs(xv),TMath::Abs(yv));\r
+\r
+ return kTRUE;\r
+\r
+}\r
+//__________________________________________\r
+void AliAnalysisTaskHFE::SwitchOnPlugin(Int_t plug){\r
+ //\r
+ // Switch on Plugin\r
+ // Available:\r
+ // - Primary vertex studies\r
+ // - Secondary vertex Studies\r
+ // - Post Processing\r
+ //\r
+ switch(plug){\r
+ case kPriVtx: SETBIT(fPlugins, plug); break;\r
+ case kSecVtx: SETBIT(fPlugins, plug); break;\r
+ case kIsElecBackGround: SETBIT(fPlugins, plug); break;\r
+ case kPostProcess: SETBIT(fPlugins, plug); break;\r
+ case kDEstep: SETBIT(fPlugins, plug); break;\r
+ case kTaggedTrackAnalysis: SETBIT(fPlugins, plug); break;\r
+ case kNonPhotonicElectron: SETBIT(fPlugins, plug); break; \r
+ default: AliError("Unknown Plugin");\r
+ };\r
+}\r
+//__________________________________________\r
+Bool_t AliAnalysisTaskHFE::ProcessCutStep(Int_t cutStep, AliVParticle *track){\r
+ //\r
+ // Check single track cuts for a given cut step\r
+ // Fill the particle container\r
+ //\r
+ const Int_t kMCOffset = AliHFEcuts::kNcutStepsMCTrack;\r
+ if(!fCFM->CheckParticleCuts(cutStep + kMCOffset, track)) return kFALSE;\r
+ if(fVarManager->IsSignalTrack()) {\r
+ fVarManager->FillContainer(fContainer, "recTrackContReco", cutStep, kFALSE);\r
+ fVarManager->FillContainer(fContainer, "recTrackContMC", cutStep, kTRUE);\r
+ }\r
+ return kTRUE;\r
+}\r
+//___________________________________________________\r
+Bool_t AliAnalysisTaskHFE::ReadCentrality() {\r
+ //\r
+ // Recover the centrality of the event from ESD or AOD\r
+ //\r
+ \r
+ Float_t fCentralityLimitstemp[12];\r
+ Float_t fCentralityLimitsdefault[12]= {0.,5.,10., 20., 30., 40., 50., 60.,70.,80., 90., 100.};\r
+ if(!fPbPbUserCentralityBinning) memcpy(fCentralityLimitstemp,fCentralityLimitsdefault,sizeof(fCentralityLimitsdefault));\r
+ else memcpy(fCentralityLimitstemp,fCentralityLimits,sizeof(fCentralityLimitsdefault));\r
+ \r
+\r
+ Int_t bin = -1;\r
+ if(IsHeavyIon()) {\r
+ // Centrality\r
+ AliCentrality *centrality = fInputEvent->GetCentrality();\r
+ fCentralityPercent = centrality->GetCentralityPercentile("V0M");\r
+ //printf("centrality %f\n",fCentralityPercent);\r
+\r
+ for(Int_t ibin = 0; ibin < 11; ibin++){\r
+ if(fCentralityPercent >= fCentralityLimitstemp[ibin] && fCentralityPercent < fCentralityLimitstemp[ibin+1]){\r
+ bin = ibin;\r
+ //printf("test bin %f, low %f, high %f, %d\n",fCentralityPercent,fCentralityLimitstemp[ibin],fCentralityLimitstemp[ibin+1],ibin);\r
+ break;\r
+ }\r
+ }\r
+ \r
+ if(bin == -1) bin = 11; // Overflow\r
+ } else {\r
+ // PP: Tracklet multiplicity, use common definition\r
+ Int_t itsMultiplicity = GetITSMultiplicity(fInputEvent);\r
+ Int_t multiplicityLimits[8] = {0, 1, 9, 17, 25, 36, 60, 500};\r
+ for(Int_t ibin = 0; ibin < 7; ibin++){ \r
+ if(itsMultiplicity >= multiplicityLimits[ibin] && itsMultiplicity < multiplicityLimits[ibin + 1]){\r
+ bin = ibin;\r
+ break;\r
+ }\r
+ }\r
+ if(bin == -1) bin = 7; // Overflow\r
+ }\r
+ fCentralityF = bin;\r
+ AliDebug(2, Form("Centrality class %d\n", fCentralityF));\r
+\r
+ \r
+ // contributors, to be outsourced\r
+ const AliVVertex *vtx;\r
+ if(IsAODanalysis()){\r
+ AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);\r
+ if(!fAOD){\r
+ AliError("AOD Event required for AOD Analysis");\r
+ return kFALSE;\r
+ }\r
+ vtx = fAOD->GetPrimaryVertex();\r
+ } else {\r
+ AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);\r
+ if(!fESD){\r
+ AliError("ESD Event required for ESD Analysis");\r
+ return kFALSE;\r
+ }\r
+ vtx = fESD->GetPrimaryVertex() ;\r
+ }\r
+ if(!vtx){ \r
+ fContributors = 0.5;\r
+ return kFALSE;\r
+ }\r
+ else {\r
+ Int_t contributorstemp = vtx->GetNContributors();\r
+ if( contributorstemp <= 0) {\r
+ fContributors = 0.5;\r
+ //printf("Number of contributors %d and vz %f\n",contributorstemp,vtx->GetZ());\r
+ }\r
+ else fContributors = 1.5;\r
+ //printf("Number of contributors %d\n",contributorstemp);\r
+ }\r
+ return kTRUE;\r
+}\r
+\r
+//___________________________________________________\r
+Int_t AliAnalysisTaskHFE::GetITSMultiplicity(AliVEvent *ev){\r
+ //\r
+ // Definition of the Multiplicity according to the JPSI group (F. Kramer)\r
+ //\r
+ Int_t nTracklets = 0;\r
+ Int_t nAcc = 0;\r
+ Double_t etaRange = 1.6;\r
+\r
+ if (ev->IsA() == AliAODEvent::Class()) {\r
+ AliAODTracklets *tracklets = ((AliAODEvent*)ev)->GetTracklets();\r
+ nTracklets = tracklets->GetNumberOfTracklets();\r
+ for (Int_t nn = 0; nn < nTracklets; nn++) {\r
+ Double_t theta = tracklets->GetTheta(nn);\r
+ Double_t eta = -TMath::Log(TMath::Tan(theta/2.0));\r
+ if (TMath::Abs(eta) < etaRange) nAcc++;\r
+ }\r
+ } else if (ev->IsA() == AliESDEvent::Class()) {\r
+ nTracklets = ((AliESDEvent*)ev)->GetMultiplicity()->GetNumberOfTracklets();\r
+ for (Int_t nn = 0; nn < nTracklets; nn++) {\r
+ Double_t eta = ((AliESDEvent*)ev)->GetMultiplicity()->GetEta(nn);\r
+ if (TMath::Abs(eta) < etaRange) nAcc++;\r
+ }\r
+ } else return -1;\r
+\r
+ return nAcc;\r
+}\r
+\r
+//___________________________________________________\r
+void AliAnalysisTaskHFE::RejectionPileUpVertexRangeEventCut() {\r
+ //\r
+ // Recover the centrality of the event from ESD or AOD\r
+ //\r
+ if(IsAODanalysis()){\r
+\r
+ AliAODEvent *fAOD = dynamic_cast<AliAODEvent *>(fInputEvent);\r
+ if(!fAOD){\r
+ AliError("AOD Event required for AOD Analysis");\r
+ return;\r
+ }\r
+ // PileUp\r
+ fIdentifiedAsPileUp = kFALSE;\r
+ if(fRemovePileUp && fAOD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE; \r
+ // Z vertex\r
+ fIdentifiedAsOutInz = kFALSE;\r
+ //printf("Z vertex %f and out %f\n",fAOD->GetPrimaryVertex()->GetZ(),fCuts->GetVertexRange());\r
+ if(TMath::Abs(fAOD->GetPrimaryVertex()->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;\r
+ // Event Cut\r
+ fPassTheEventCut = kTRUE;\r
+ if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fAOD)) fPassTheEventCut = kFALSE; \r
+ \r
+ \r
+ } else {\r
+ \r
+ AliDebug(3, "Processing ESD Centrality");\r
+ AliESDEvent *fESD = dynamic_cast<AliESDEvent *>(fInputEvent);\r
+ if(!fESD){\r
+ AliError("ESD Event required for ESD Analysis");\r
+ return;\r
+ }\r
+ // PileUp\r
+ fIdentifiedAsPileUp = kFALSE;\r
+ if(fRemovePileUp && fESD->IsPileupFromSPD()) fIdentifiedAsPileUp = kTRUE; \r
+ \r
+\r
+\r
+ // Z vertex\r
+ fIdentifiedAsOutInz = kFALSE;\r
+ Bool_t findvertex = kTRUE;\r
+ const AliESDVertex* vtxESD = fESD->GetPrimaryVertex();\r
+ if((!vtxESD) || (vtxESD->GetNContributors() <= 0)) findvertex = kFALSE;\r
+ if(findvertex) {\r
+ if(TMath::Abs(vtxESD->GetZ()) > fCuts->GetVertexRange()) fIdentifiedAsOutInz = kTRUE;\r
+ }\r
+ \r
+ //Event Cut\r
+ fPassTheEventCut = kTRUE;\r
+ if(!fCFM->CheckEventCuts(AliHFEcuts::kEventStepReconstructed, fESD)) fPassTheEventCut = kFALSE; \r
+ \r
+ }\r
+\r
+}\r
+\r