7440384fef31982cd348730d18f56c5cfa53b4c8
[u/mrichter/AliRoot.git] / PWG2 / FORWARD / analysis2 / RunManager.C
1 /** 
2  * Flags for the analysis
3  *
4  * @ingroup pwg2_forward_analysis_scripts
5  */
6 enum {
7   kMC        = 0x01, // MC input 
8   kProof     = 0x02, // Run in proof mode 
9   kFull      = 0x04, // Do full analysis - including terminate 
10   kAnalyse   = 0x08, // Run the analysis 
11   kTerminate = 0x10  // Run only terminate 
12 };
13
14 /** 
15  * Run first pass of the analysis - that is read in ESD and produce AOD
16  * 
17  * @param esddir    ESD input directory. Any file matching the pattern 
18  *                  *AliESDs*.root are added to the chain 
19  * @param nEvents   Number of events to process.  If 0 or less, then 
20  *                  all events are analysed
21  * @param flags     Job flags. A bit mask of 
22  *  - 0x01 (MC)        Monte-Carlo truth handler installed 
23  *  - 0x02 (PROOF)     Proof mode 
24  *  - 0x04 (FULL)      Run full analysis - including terminate 
25  *  - 0x08 (ANALYSE)   Run only analysis - not terminate 
26  *  - 0x10 (TERMINATE) Run no analysis - just terminate.  
27  * 
28  * of these, PROOF, FULL, ANALYSE, and TERMINATE are mutually exclusive. 
29  *
30  * If PROOF mode is selected, then Terminate will be run on the master node 
31  * in any case. 
32  * 
33  * If FULL is selected, then the full analysis is done.  Note that
34  * this can be combined with PROOF but with no effect.
35  *
36  * ANALYSE cannot be combined with FULL, PROOF, or TERMINATE.  In a
37  * local job, the output AnalysisResults.root will still be made, but
38  * terminate is not called.
39  *
40  * In TERMINATE, the file AnalysisResults.root is opened and all
41  * containers found are connected to the tasks.  The terminate member
42  * function is then called
43  * 
44  *
45  * @ingroup pwg2_forward_analysis_scripts
46  */
47 void RunManager(const char* esddir, 
48                 Int_t       nEvents=1000, 
49                 UShort_t    flags=kFull)
50 {
51   // --- Libraries to load -------------------------------------------
52   gSystem->Load("libVMC");
53   gSystem->Load("libTree");
54   
55   gSystem->Load("libSTEERBase");
56   
57   gSystem->Load("libESD") ;
58   gSystem->Load("libAOD") ;
59   gSystem->Load("libANALYSIS");
60   gSystem->Load("libANALYSISalice");
61   
62   gSystem->Load("libPhysics");
63   gSystem->Load("libPWG0base");
64   gSystem->Load("libPWG0dep");
65   gSystem->Load("libPWG2forward");
66   gSystem->Load("libPWG2forward2");
67
68   // --- Check for proof mode, and possibly upload pars --------------
69   if (flags & kProof) { 
70     TProof::Open("workers=2");
71     const char* pkgs[] = { "STEERBase", "ESD", "AOD", "ANALYSIS", 
72                            "ANALYSISalice", "PWG2forward", "PWG2forward2", 0};
73     const char** pkg = pkgs;
74     while (*pkg) { 
75       gProof->UploadPackage(Form("${ALICE_ROOT}/%s.par",*pkg));
76       gProof->EnablePackage(*pkg);    
77       pkg++;
78     }
79   }
80   
81   // --- Our data chain ----------------------------------------------
82   TChain* chain = new TChain("esdTree");
83
84   // --- Get list of ESDs --------------------------------------------
85   // Open source directory, and make sure we go back to were we were 
86   TString oldDir(gSystem->WorkingDirectory());
87   TSystemDirectory d(esddir, esddir);
88   TList* files = d.GetListOfFiles();
89   gSystem->ChangeDirectory(oldDir);
90
91   // Sort list of files and check if we should add it 
92   files->Sort();
93   TIter next(files);
94   TSystemFile* file = 0;
95   while ((file = static_cast<TSystemFile*>(next()))) {
96     if (file->IsDirectory()) continue;
97     TString name(file->GetName());
98     if (!name.EndsWith(".root")) continue;
99     if (!name.Contains("AliESDs")) continue;
100     TString esd(Form("%s/%s", file->GetTitle(), name.Data()));
101     Info("RunManager", "Adding %s to chain", esd.Data());
102     chain->Add(esd);
103   }  
104   // If 0 or less events is select, choose all 
105   if (nEvents <= 0) nEvents = chain->GetEntries();
106     
107
108   // --- Creating the manager and handlers ---------------------------
109   AliAnalysisManager *mgr  = new AliAnalysisManager("Analysis Train", 
110                                                     "FMD analysis train");
111
112   AliESDInputHandler *esdHandler = new AliESDInputHandler();
113   esdHandler->SetInactiveBranches("AliESDACORDE "
114                                   "AliRawDataErrorLogs "
115                                   "CaloClusters "
116                                   "Cascades "
117                                   "EMCALCells "
118                                   "EMCALTrigger "
119                                   "Kinks "
120                                   "Cascades "
121                                   "MuonTracks "
122                                   "TrdTracks "
123                                   "CaloClusters "
124                                   "HLTGlobalTrigger");
125   mgr->SetInputEventHandler(esdHandler);      
126        
127   // Monte Carlo handler
128   if (flags & kMC) { 
129     AliMCEventHandler* mcHandler = new AliMCEventHandler();
130     mgr->SetMCtruthEventHandler(mcHandler);
131     mcHandler->SetReadTR(readTR);    
132   }
133   
134   // AOD output handler
135   AliAODHandler* aodHandler   = new AliAODHandler();
136   mgr->SetOutputEventHandler(aodHandler);
137   aodHandler->SetOutputFileName("AliAODs.root");
138
139   // --- Add tasks ---------------------------------------------------
140   gROOT->LoadMacro("$ALICE_ROOT/PWG2/FORWARD/analysis2/AddTaskFMD.C");
141   gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
142   AliAnalysisTask* task = AddTaskFMD();
143   mgr->ConnectOutput(task, 0, mgr->GetCommonOutputContainer());
144
145   task = AddTaskPhysicsSelection((flags & kMC), kTRUE, kTRUE);
146   mgr->ConnectOutput(task, 0, mgr->GetCommonOutputContainer());
147   
148   // --- Run the analysis --------------------------------------------
149   TStopwatch t;
150   if (!mgr->InitAnalysis()) {
151     Error("RunManager", "Failed to initialize analysis train!");
152     return;
153   }
154   // Skip terminate if we're so requested and not in Proof or full mode
155   mgr->SetSkipTerminate(!(flags & kProof) &&
156                         !(flags & kFull)  && 
157                         (flags & kAnalyse));
158   // Some informative output 
159   mgr->PrintStatus();
160   // mgr->SetDebugLevel(3);
161   if (mgr->GetDebugLevel() < 1 && !(flags & kProof)) 
162     mgr->SetUseProgressBar(kTRUE);
163
164   // Run the train 
165   t.Start();
166   if (!(flags & kTerminate))
167     mgr->StartAnalysis((flags & kProof) ? "proof" : "local", chain, nEvents);
168   else {
169     mgr->ImportWrappers();
170     mgr->Terminate();
171   }
172   t.Stop();
173   t.Print();
174 }
175 //
176 // EOF
177 //