Add directory structure (needed if new in cvmfs)
[u/mrichter/AliRoot.git] / STEER / CreateAODfromESD.C
1 #include <cstring>
2 #include <TChain.h>
3 #include <TSystem.h>
4 #include "AliAnalysisManager.h"
5 #include "AliESDInputHandler.h"
6 #include "AliAODHandler.h"
7 #include "AliAnalysisTaskESDfilter.h"
8 #include "AliAnalysisDataContainer.h"
9 #include "AliTaskCDBconnect.h"
10
11 void CreateAODfromESD(const char *inFileName = "AliESDs.root",
12                       const char *outFileName = "AliAOD.root",
13                       const char *cdbLocation = "raw://",
14                       const char *grpSpecific = "",
15                       Bool_t bKineFilter = kTRUE) 
16 {
17   
18     TChain *chain = new TChain("esdTree");
19     // Steering input chain
20     chain->Add(inFileName);
21     AliAnalysisManager *mgr  = new AliAnalysisManager("ESD to AOD", "Analysis Manager");
22
23     // Input
24     AliESDInputHandler* inpHandler = new AliESDInputHandler();
25     inpHandler->SetReadFriends(kFALSE);
26     inpHandler->SetReadTags();
27     inpHandler->NeedField();
28     mgr->SetInputEventHandler  (inpHandler);
29     // Output
30     AliAODHandler* aodHandler   = new AliAODHandler();
31     aodHandler->SetOutputFileName(outFileName);
32     mgr->SetOutputEventHandler(aodHandler);
33
34     // MC Truth
35     if(bKineFilter){
36         AliMCEventHandler* mcHandler = new AliMCEventHandler();
37         mgr->SetMCtruthEventHandler(mcHandler);
38     }
39
40
41     // Tasks
42     // Filtering of MC particles (decays conversions etc)
43     // this task is also needed to set the MCEventHandler
44     // to the AODHandler, this will not be needed when
45     // AODHandler goes to ANALYSISalice
46     
47     // Connect CDB: needed by AliEMCALRecoUtils
48     Int_t run=-1; // Do not use 0, it is the default MC run
49     AliTaskCDBconnect *task= new AliTaskCDBconnect("CDBconnect", cdbLocation, run);
50     if (strlen(grpSpecific)>0) task->SetSpecificStorage("GRP/GRP/Data",grpSpecific);
51     mgr->AddTask(task);
52     AliAnalysisDataContainer *cinput0 = mgr->GetCommonInputContainer();    
53     mgr->ConnectInput(task,  0, cinput0);
54
55     // Barrel Tracks
56     AliAnalysisTaskESDfilter *filter = new AliAnalysisTaskESDfilter("Filter");
57     mgr->AddTask(filter);
58     AliAnalysisTaskMCParticleFilter *kinefilter = new AliAnalysisTaskMCParticleFilter("Particle Filter");
59     if (bKineFilter) mgr->AddTask(kinefilter);
60     // Muons
61     AliAnalysisTaskESDMuonFilter *esdmuonfilter = new AliAnalysisTaskESDMuonFilter("ESD Muon Filter");
62     mgr->AddTask(esdmuonfilter);
63
64     // Cuts on primary tracks
65     AliESDtrackCuts* esdTrackCutsL = new AliESDtrackCuts("AliESDtrackCuts", "Standard");
66     esdTrackCutsL->SetMinNClustersTPC(50);
67     esdTrackCutsL->SetMaxChi2PerClusterTPC(3.5);
68     esdTrackCutsL->SetMaxCovDiagonalElements(2, 2, 0.5, 0.5, 2);
69     esdTrackCutsL->SetRequireTPCRefit(kTRUE);
70     esdTrackCutsL->SetMaxDCAToVertexXY(3.0);
71     esdTrackCutsL->SetMaxDCAToVertexZ(3.0);
72     esdTrackCutsL->SetDCAToVertex2D(kTRUE);
73     esdTrackCutsL->SetRequireSigmaToVertex(kFALSE);
74     esdTrackCutsL->SetAcceptKinkDaughters(kFALSE);
75     // ITS stand-alone tracks
76     AliESDtrackCuts* esdTrackCutsITSsa = new AliESDtrackCuts("AliESDtrackCuts", "ITS stand-alone");
77     esdTrackCutsITSsa->SetRequireITSStandAlone(kTRUE);
78
79     AliAnalysisFilter* trackFilter = new AliAnalysisFilter("trackFilter");
80     trackFilter->AddCuts(esdTrackCutsL);
81     trackFilter->AddCuts(esdTrackCutsITSsa);
82
83     // Cuts on V0s
84     AliESDv0Cuts*   esdV0Cuts = new AliESDv0Cuts("AliESDv0Cuts", "Standard pp");
85     esdV0Cuts->SetMinRadius(0.2);
86     esdV0Cuts->SetMaxRadius(200);
87     esdV0Cuts->SetMinDcaPosToVertex(0.05);
88     esdV0Cuts->SetMinDcaNegToVertex(0.05);
89     esdV0Cuts->SetMaxDcaV0Daughters(1.0);
90     esdV0Cuts->SetMinCosinePointingAngle(0.99);
91     AliAnalysisFilter* v0Filter = new AliAnalysisFilter("v0Filter");
92     v0Filter->AddCuts(esdV0Cuts);
93
94
95 //
96     filter->SetTrackFilter(trackFilter);
97     filter->SetV0Filter(v0Filter);
98
99
100 //  Create AOD Tags
101     AliAnalysisTaskTagCreator* tagTask = new AliAnalysisTaskTagCreator("AOD Tag Creator");
102     mgr->AddTask(tagTask);
103
104     // Pipelining
105     AliAnalysisDataContainer *cinput1  = mgr->GetCommonInputContainer();    
106     AliAnalysisDataContainer *coutput1 = mgr->GetCommonOutputContainer();
107     
108     
109     AliAnalysisDataContainer *coutputT
110         = mgr->CreateContainer("cTag",  TTree::Class(), AliAnalysisManager::kOutputContainer, "AOD.tag.root");
111
112     coutput1->SetSpecialOutput();
113     coutputT->SetSpecialOutput();
114     
115     if(bKineFilter) {
116         mgr->ConnectInput  (kinefilter,     0, cinput1  );
117         mgr->ConnectOutput (kinefilter,     0, coutput1 );
118     }
119
120     mgr->ConnectInput (filter, 0, cinput1 );
121     mgr->ConnectOutput(filter, 0, coutput1);
122
123     mgr->ConnectInput (esdmuonfilter, 0, cinput1 );
124 //    mgr->ConnectOutput(esdmuonfilter, 0, coutput1);
125
126     mgr->ConnectInput (tagTask, 0, cinput1);
127     mgr->ConnectOutput(tagTask, 1, coutputT);
128
129     //
130     // Run the analysis
131     //
132     mgr->InitAnalysis();
133     mgr->PrintStatus();
134     mgr->StartAnalysis("local", chain);
135 }
136