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