ROOT logo
#include <cstring>
#include <TChain.h>
#include <TSystem.h>
#include "AliAnalysisManager.h"
#include "AliESDInputHandler.h"
#include "AliAODHandler.h"
#include "AliAnalysisTaskESDfilter.h"
#include "AliAnalysisDataContainer.h"
#include "AliTaskCDBconnect.h"

void CreateAODfromESD(const char *inFileName = "AliESDs.root",
		      const char *outFileName = "AliAOD.root",
		      const char *cdbLocation = "raw://",
		      const char *grpSpecific = "",
		      Bool_t bKineFilter = kTRUE) 
{
  
    TChain *chain = new TChain("esdTree");
    // Steering input chain
    chain->Add(inFileName);
    AliAnalysisManager *mgr  = new AliAnalysisManager("ESD to AOD", "Analysis Manager");

    // Input
    AliESDInputHandler* inpHandler = new AliESDInputHandler();
    inpHandler->SetReadFriends(kFALSE);
    inpHandler->SetReadTags();
    inpHandler->NeedField();
    mgr->SetInputEventHandler  (inpHandler);
    // Output
    AliAODHandler* aodHandler   = new AliAODHandler();
    aodHandler->SetOutputFileName(outFileName);
    mgr->SetOutputEventHandler(aodHandler);

    // MC Truth
    if(bKineFilter){
	AliMCEventHandler* mcHandler = new AliMCEventHandler();
	mgr->SetMCtruthEventHandler(mcHandler);
    }


    // Tasks
    // Filtering of MC particles (decays conversions etc)
    // this task is also needed to set the MCEventHandler
    // to the AODHandler, this will not be needed when
    // AODHandler goes to ANALYSISalice
    
    // Connect CDB: needed by AliEMCALRecoUtils
    Int_t run=-1; // Do not use 0, it is the default MC run
    AliTaskCDBconnect *task= new AliTaskCDBconnect("CDBconnect", cdbLocation, run);
    if (strlen(grpSpecific)>0) task->SetSpecificStorage("GRP/GRP/Data",grpSpecific);
    mgr->AddTask(task);
    AliAnalysisDataContainer *cinput0 = mgr->GetCommonInputContainer();    
    mgr->ConnectInput(task,  0, cinput0);

    // Barrel Tracks
    AliAnalysisTaskESDfilter *filter = new AliAnalysisTaskESDfilter("Filter");
    mgr->AddTask(filter);
    AliAnalysisTaskMCParticleFilter *kinefilter = new AliAnalysisTaskMCParticleFilter("Particle Filter");
    if (bKineFilter) mgr->AddTask(kinefilter);
    // Muons
    AliAnalysisTaskESDMuonFilter *esdmuonfilter = new AliAnalysisTaskESDMuonFilter("ESD Muon Filter");
    mgr->AddTask(esdmuonfilter);

    // Cuts on primary tracks
    AliESDtrackCuts* esdTrackCutsL = new AliESDtrackCuts("AliESDtrackCuts", "Standard");
    esdTrackCutsL->SetMinNClustersTPC(50);
    esdTrackCutsL->SetMaxChi2PerClusterTPC(3.5);
    esdTrackCutsL->SetMaxCovDiagonalElements(2, 2, 0.5, 0.5, 2);
    esdTrackCutsL->SetRequireTPCRefit(kTRUE);
    esdTrackCutsL->SetMaxDCAToVertexXY(3.0);
    esdTrackCutsL->SetMaxDCAToVertexZ(3.0);
    esdTrackCutsL->SetDCAToVertex2D(kTRUE);
    esdTrackCutsL->SetRequireSigmaToVertex(kFALSE);
    esdTrackCutsL->SetAcceptKinkDaughters(kFALSE);
    // ITS stand-alone tracks
    AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("AliESDtrackCuts", "ITS stand-alone");
    esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);

    AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
    trackFilter->AddCuts(esdTrackCutsL);
    trackFilter->AddCuts(esdTrackCutsITSsa);

    // Cuts on V0s
    AliESDv0Cuts*   esdV0Cuts = new AliESDv0Cuts("AliESDv0Cuts", "Standard pp");
    esdV0Cuts->SetMinRadius(0.2);
    esdV0Cuts->SetMaxRadius(200);
    esdV0Cuts->SetMinDcaPosToVertex(0.05);
    esdV0Cuts->SetMinDcaNegToVertex(0.05);
    esdV0Cuts->SetMaxDcaV0Daughters(1.0);
    esdV0Cuts->SetMinCosinePointingAngle(0.99);
    AliAnalysisFilter* v0Filter = new AliAnalysisFilter("v0Filter");
    v0Filter->AddCuts(esdV0Cuts);


//
    filter->SetTrackFilter(trackFilter);
    filter->SetV0Filter(v0Filter);


//  Create AOD Tags
    AliAnalysisTaskTagCreator* tagTask = new AliAnalysisTaskTagCreator("AOD Tag Creator");
    mgr->AddTask(tagTask);

    // Pipelining
    AliAnalysisDataContainer *cinput1  = mgr->GetCommonInputContainer();    
    AliAnalysisDataContainer *coutput1 = mgr->GetCommonOutputContainer();
    
    
    AliAnalysisDataContainer *coutputT
	= mgr->CreateContainer("cTag",  TTree::Class(), AliAnalysisManager::kOutputContainer, "AOD.tag.root");

    coutput1->SetSpecialOutput();
    coutputT->SetSpecialOutput();
    
    if(bKineFilter) {
	mgr->ConnectInput  (kinefilter,     0, cinput1  );
	mgr->ConnectOutput (kinefilter,     0, coutput1 );
    }

    mgr->ConnectInput (filter, 0, cinput1 );
    mgr->ConnectOutput(filter, 0, coutput1);

    mgr->ConnectInput (esdmuonfilter, 0, cinput1 );
//    mgr->ConnectOutput(esdmuonfilter, 0, coutput1);

    mgr->ConnectInput (tagTask, 0, cinput1);
    mgr->ConnectOutput(tagTask, 1, coutputT);

    //
    // Run the analysis
    //
    mgr->InitAnalysis();
    mgr->PrintStatus();
    mgr->StartAnalysis("local", chain);
}

 CreateAODfromESD.C:1
 CreateAODfromESD.C:2
 CreateAODfromESD.C:3
 CreateAODfromESD.C:4
 CreateAODfromESD.C:5
 CreateAODfromESD.C:6
 CreateAODfromESD.C:7
 CreateAODfromESD.C:8
 CreateAODfromESD.C:9
 CreateAODfromESD.C:10
 CreateAODfromESD.C:11
 CreateAODfromESD.C:12
 CreateAODfromESD.C:13
 CreateAODfromESD.C:14
 CreateAODfromESD.C:15
 CreateAODfromESD.C:16
 CreateAODfromESD.C:17
 CreateAODfromESD.C:18
 CreateAODfromESD.C:19
 CreateAODfromESD.C:20
 CreateAODfromESD.C:21
 CreateAODfromESD.C:22
 CreateAODfromESD.C:23
 CreateAODfromESD.C:24
 CreateAODfromESD.C:25
 CreateAODfromESD.C:26
 CreateAODfromESD.C:27
 CreateAODfromESD.C:28
 CreateAODfromESD.C:29
 CreateAODfromESD.C:30
 CreateAODfromESD.C:31
 CreateAODfromESD.C:32
 CreateAODfromESD.C:33
 CreateAODfromESD.C:34
 CreateAODfromESD.C:35
 CreateAODfromESD.C:36
 CreateAODfromESD.C:37
 CreateAODfromESD.C:38
 CreateAODfromESD.C:39
 CreateAODfromESD.C:40
 CreateAODfromESD.C:41
 CreateAODfromESD.C:42
 CreateAODfromESD.C:43
 CreateAODfromESD.C:44
 CreateAODfromESD.C:45
 CreateAODfromESD.C:46
 CreateAODfromESD.C:47
 CreateAODfromESD.C:48
 CreateAODfromESD.C:49
 CreateAODfromESD.C:50
 CreateAODfromESD.C:51
 CreateAODfromESD.C:52
 CreateAODfromESD.C:53
 CreateAODfromESD.C:54
 CreateAODfromESD.C:55
 CreateAODfromESD.C:56
 CreateAODfromESD.C:57
 CreateAODfromESD.C:58
 CreateAODfromESD.C:59
 CreateAODfromESD.C:60
 CreateAODfromESD.C:61
 CreateAODfromESD.C:62
 CreateAODfromESD.C:63
 CreateAODfromESD.C:64
 CreateAODfromESD.C:65
 CreateAODfromESD.C:66
 CreateAODfromESD.C:67
 CreateAODfromESD.C:68
 CreateAODfromESD.C:69
 CreateAODfromESD.C:70
 CreateAODfromESD.C:71
 CreateAODfromESD.C:72
 CreateAODfromESD.C:73
 CreateAODfromESD.C:74
 CreateAODfromESD.C:75
 CreateAODfromESD.C:76
 CreateAODfromESD.C:77
 CreateAODfromESD.C:78
 CreateAODfromESD.C:79
 CreateAODfromESD.C:80
 CreateAODfromESD.C:81
 CreateAODfromESD.C:82
 CreateAODfromESD.C:83
 CreateAODfromESD.C:84
 CreateAODfromESD.C:85
 CreateAODfromESD.C:86
 CreateAODfromESD.C:87
 CreateAODfromESD.C:88
 CreateAODfromESD.C:89
 CreateAODfromESD.C:90
 CreateAODfromESD.C:91
 CreateAODfromESD.C:92
 CreateAODfromESD.C:93
 CreateAODfromESD.C:94
 CreateAODfromESD.C:95
 CreateAODfromESD.C:96
 CreateAODfromESD.C:97
 CreateAODfromESD.C:98
 CreateAODfromESD.C:99
 CreateAODfromESD.C:100
 CreateAODfromESD.C:101
 CreateAODfromESD.C:102
 CreateAODfromESD.C:103
 CreateAODfromESD.C:104
 CreateAODfromESD.C:105
 CreateAODfromESD.C:106
 CreateAODfromESD.C:107
 CreateAODfromESD.C:108
 CreateAODfromESD.C:109
 CreateAODfromESD.C:110
 CreateAODfromESD.C:111
 CreateAODfromESD.C:112
 CreateAODfromESD.C:113
 CreateAODfromESD.C:114
 CreateAODfromESD.C:115
 CreateAODfromESD.C:116
 CreateAODfromESD.C:117
 CreateAODfromESD.C:118
 CreateAODfromESD.C:119
 CreateAODfromESD.C:120
 CreateAODfromESD.C:121
 CreateAODfromESD.C:122
 CreateAODfromESD.C:123
 CreateAODfromESD.C:124
 CreateAODfromESD.C:125
 CreateAODfromESD.C:126
 CreateAODfromESD.C:127
 CreateAODfromESD.C:128
 CreateAODfromESD.C:129
 CreateAODfromESD.C:130
 CreateAODfromESD.C:131
 CreateAODfromESD.C:132
 CreateAODfromESD.C:133
 CreateAODfromESD.C:134
 CreateAODfromESD.C:135
 CreateAODfromESD.C:136
 CreateAODfromESD.C:137