AliRsnReader:
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / macros / AliRsnAnalysis.C
1 //=============================================================================
2 //
3 // *** AliRsnAnalysis.C ***
4 //
5 // This macro contains all stuff which is required to run
6 // a resonance analysis in whatever environment.
7 // It contains a pool of macroes which do all the steps to set it up
8 // and run it with the appropriate configurations.
9 // All the possibilities are made available through enumerations,
10 // with the same style of the Config.C file used for simulation.
11 //
12 //=============================================================================
13
14 #include <TProof.h>
15 #include <TGrid.h>
16
17 enum Rsn_DataSource
18 {
19   kTextFile,        // text file with paths of all used files (local analysis)
20   kXMLCollection,   // XML collection of files (local/AliEn analysis)
21   kDataset          // CAF dataset
22 };
23
24 static Bool_t            cleanPars = kFALSE;
25 static Bool_t            cleanPWG2resonances = kFALSE;
26 static const char*       listPar = "STEERBase:ESD:AOD:ANALYSIS:ANALYSISalice:PWG2resonances";
27 static const char*       proofConnection = "pulvir@alicecaf.cern.ch";
28
29 static Bool_t            isAlien = kTRUE;
30 static Bool_t            isProof = kFALSE;
31
32 // Uncomment these two lines for an example run with a local list of local files
33 //static Rsn_DataSource    listType = kTextFile;
34 //static const char*       inputSource = "local.txt";
35
36 // Uncomment these two lines for an example run with PROOF
37 //static const char*    inputSource = "/COMMON/COMMON/LHC08c11_10TeV_0.5T";
38 //static Rsn_DataSource listType    = kDataset;
39
40 // Uncomment these two lines for an example run with AliEn XML collection
41 static const char*    inputSource = "wn.xml";
42 static Rsn_DataSource listType    = kXMLCollection;
43
44 static Int_t             nReadFiles = 0;
45 static Int_t             nSkippedFiles = 0;
46 static TString           treeName = "esdTree";
47
48 //_________________________________________________________________________________________________
49 Bool_t CleanPars(const char *pars)
50 {
51 //
52 // Cleans existing PAR library directories.
53 // The string argument must contain their names
54 // separated by colons (':').
55 // Returns kTRUE if everything went well, otherwise returns kFALSE.
56 //
57
58   TString list(pars);
59   TObjArray* array = list.Tokenize(":");
60   TObjString *ostr;
61   TString str;
62
63   for (Int_t i = 0; i < array->GetEntriesFast(); i++)
64   {
65     ostr = (TObjString *) array->At(i);
66     str = ostr->GetString();
67     Info("", ">> Cleaning PARs: %s", str.Data());
68     if (isProof) {
69       if (!gProof) {
70         Error("CleanPars", "gProof object not initialized");
71         return kFALSE;
72       }
73       gProof->ClearPackage(Form("%s.par", str.Data()));
74     }
75     else {
76       gSystem->Exec(Form("rm -Rf %s/", str.Data()));
77     }
78   }
79
80   return kTRUE;
81 }
82
83 //_________________________________________________________________________________________________
84 Bool_t LoadPars(TString pars)
85 {
86 //
87 // Loads required PAR libraries.
88 // The string argument must contain their names
89 // separated by colons (':').
90 // Returns kTRUE if everything went well, otherwise returns kFALSE.
91 //
92
93   TObjArray *array = pars.Tokenize(":");
94   TObjString *ostr;
95   TString str;
96
97   for (Int_t i = 0; i < array->GetEntriesFast(); i++) {
98     ostr = (TObjString *) array->At(i);
99     str = ostr->GetString();
100     Info("", ">> Creating PARs: %s", str.Data());
101     if (isProof) {
102        if (!gProof) {
103         Error("CleanPars", "gProof object not initialized");
104         return kFALSE;
105       }
106       gProof->UploadPackage(Form("%s.par", str.Data()));
107       gProof->EnablePackage(str.Data());
108     }
109     else {
110       // check that file exists...
111       if (gSystem->AccessPathName(Form("%s.par", str.Data()))) {
112         Error("", " !!! File not found");
113         return kFALSE;
114       }
115       // ...explode tar-ball...
116       gROOT->ProcessLine(Form(".! tar xzf %s.par", str.Data()));
117       // ...go to unpacked directory of PAR library...
118       TString ocwd = gSystem->WorkingDirectory();
119       gSystem->ChangeDirectory(Form("%s", str.Data()));
120       // ...checks for BUILD.sh and execute it...
121       if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
122         if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
123           Error("", " !!! Build error");
124           return kFALSE;
125         }
126       }
127       // ...check and execute SETUP.C...
128       if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
129         if (gROOT->Macro("PROOF-INF/SETUP.C")) {
130           Error("", " !!! Set-up error");
131           return kFALSE;
132         }
133       }
134       // ...return to main dir and finish
135       gSystem->ChangeDirectory(ocwd);
136     }
137   }
138
139   return kTRUE;
140 }
141
142 //_________________________________________________________________________________________________
143 TChain* CreateChainFromTXT()
144 {
145 //
146 // Create a TChain of files to be analyzed from a text file.
147 // This text file must contain in each line the FULL PATH of an analyzed file.
148 // Last argument specifies the TTree name.
149 //
150
151   TChain *chain = new TChain(treeName.Data());
152
153   ifstream fileIn(inputSource);
154   Int_t count = 0, skip = nSkippedFiles;
155
156   TString line;
157   while (fileIn.good()) {
158     fileIn >> line;
159     if (line.IsNull()) continue;
160     if (skip > 0) {
161       --skip;
162       continue;
163     }
164     if (nReadFiles > 0 && count++ >= nReadFiles) break;
165     chain->Add(Form("%s", line.Data()));
166   }
167   fileIn.close();
168
169   return chain;
170 }
171
172 //_________________________________________________________________________________________________
173 TChain* CreateChainFromXML()
174 {
175 //
176 // Create a TChain of files to be analyzed from a XML file.
177 // Last argument specifies the TTree name.
178 //
179
180   if (!gGrid) {
181     Error("CreateChainFromXML", "gGrid object not instantiated");
182     return 0;
183   }
184
185   TChain *chain = new TChain(treeName.Data());
186   TAlienCollection *myCollection = TAlienCollection::Open(inputSource);
187   if (!myCollection)
188   {
189     Error("CreateChainFromXML", "Cannot create an AliEn collection from %s", collectionFile);
190     return 0x0;
191   }
192
193   // initialize a counter to check the number of read files
194   Int_t nfiles = 0, skip = nSkippedFiles;
195   TString filename;
196   myCollection->Reset();
197   while (myCollection->Next())
198   {
199     if (skip > 0) { --skip; continue; }
200     if (nReadFiles > 0 && nfiles >= nReadFiles) break;
201     // char fileName[255];
202     // sprintf(fileName, "%s", myCollection->GetTURL(""));
203     filename = myCollection->GetTURL("");
204     chain->Add(filename.Data());
205     nfiles++;
206   }
207
208   return chain;
209 }
210
211 //_________________________________________________________________________________________________
212 TChain* CreateChainFromDataset()
213 {
214 //
215 // Create a TChain of files to be analyzed from a CAF dataset.
216 // Last argument specifies the TTree name.
217 //
218
219   if (!gProof) {
220     Error("CreateChainFromDataset", "gProof object not initialized");
221     return 0;
222   }
223
224   TFileCollection *fc = gProof->GetDataSet(inputSource)->GetStagedSubset();
225   TIter iter(fc->GetList());
226
227   TChain* target = new TChain(treeName.Data());
228
229   TFileInfo* fileInfo = 0;
230   Int_t nfiles = 0, skip = nSkippedFiles;
231   while ((fileInfo = dynamic_cast<TFileInfo*> (iter()))) {
232     if (fileInfo->GetFirstUrl()) {
233       if (skip > 0) { --skip; continue; }
234       if (nReadFiles > 0 && nfiles >= nReadFiles) break;
235       target->Add(fileInfo->GetFirstUrl()->GetUrl());
236       nfiles++;
237     }
238   }
239
240   return target;
241 }
242
243 //_________________________________________________________________________________________________
244 Int_t AliRsnAnalysis(const char *addMacro = "AddRsnAnalysisTask.C")
245 {
246 //
247 // Main macro (named after the macro filename).
248 // It initializes the job, creates the AnalysisManager and calls the config macro which
249 // fills this AnalysisManager with all AnalysisTask objects for resonance analysis.
250 // ---
251 // The argument is the name of the macro used for configuration
252 // ---
253 // Return values:
254 // - 0 = successful execution
255 // - 1 = problem while cleanind PAR libraries
256 // - 2 = problem while loading PAR libraries
257 // - 3 = invalid TTree name (allowed: esdTree, aodTree)
258 // - 4 = data source not found
259 // - 5 = wrong definition of source type (allowed any member of enum Rsn_DataSource)
260 // - 6 = TChain initialization returned a NULL object
261 // - 7 = error while initializing AliAnalysisManager object
262 //
263
264   // connect to PROOF if required
265   if (isProof) TProof::Open(proofConnection);
266   else if (isAlien) TGrid::Connect("alien://");
267
268   //
269   // *** SETUP PAR LIBRARIES **********************************************************************
270   //  - libraries are cleaned if requested
271   //
272
273   if (cleanPars) {
274     if (!CleanPars(listPar)) {
275       Error("AliRsnAnalysis", "Error while cleaning PAR libraries");
276       return 1;
277     }
278   }
279   if (cleanPWG2resonances) CleanPars("PWG2resonances");
280   if (!LoadPars(listPar)) {
281     Error("AliRsnAnalysis", "Error while initializing PAR libraries");
282     return 2;
283   }
284
285   // set up log level
286   AliLog::SetGlobalLogLevel(AliLog::kError);
287
288   // *** CREATE TChain OF INPUT EVENTS ************************************************************
289
290   // preliminary check #1: is the tree name OK?
291   if (treeName != "esdTree" && treeName != "aodTree") {
292     Error("AliRsnAnalysis", "Invalid tree name specified");
293     return 3;
294   }
295
296   // preliminary check #2: does the input source exist?
297   // (valid only for local files and XML collections)
298   if (listType == kTextFile || listType == kXMLCollection) {
299     Long_t id, size, flags, modtime;
300     if (gSystem->GetPathInfo(inputSource, &id, &size, &flags, &modtime)) {
301       Error("AliRsnAnalysis", "Input source not found");
302       return 4;
303     }
304   }
305
306   // create TChain
307   TChain *analysisChain = 0;
308   switch (listType) {
309     case kTextFile:
310       analysisChain = CreateChainFromTXT();
311       break;
312     case kXMLCollection:
313       analysisChain = CreateChainFromXML();
314       break;
315     case kDataset:
316       analysisChain = CreateChainFromDataset();
317       break;
318     default:
319       Error("AliRsnAnalysis", "Input type not supported");
320       return 5;
321   }
322   if (!analysisChain) {
323     Error("AliRsnAnalysis", "Analysis TChain not properly initialized");
324     return 6;
325   }
326
327   //
328   // *** INITIALIZE ANALYSIS MANAGER **************************************************************
329   //
330
331   AliAnalysisManager *mgr = new AliAnalysisManager("ResonanceAnalysis");
332   if (!mgr) {
333     Error("AliRsnAnalysis", "Error occurred while initializing AnalysisManager");
334     return 7;
335   }
336
337   // load configuration macro and uses it to initialize this object
338   gROOT->LoadMacro(addMacro);
339   AddRsnAnalysisTask(mgr);
340
341   // initialize analysis and run it
342   TString strEnv = (isProof ? "proof" : "local");
343   TStopwatch timer;
344   timer.Start();
345   mgr->InitAnalysis();
346   mgr->StartAnalysis(strEnv.Data(), analysisChain);
347   timer.Stop();
348   timer.Print();
349 }