Removing extra semicolon
[u/mrichter/AliRoot.git] / ANALYSIS / AliAnalysisGoodies.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15 //_________________________________________________________________________
16 // Various utilities usefull for analysis
17 //
18 //*-- Yves Schutz 
19 //////////////////////////////////////////////////////////////////////////////
20
21 #include "AliAnalysisDataContainer.h" 
22 #include "AliTagAnalysis.h" 
23 #include "AliEventTagCuts.h" 
24 #include "AliRunTagCuts.h" 
25 #include "AliXMLCollection.h" 
26 #include "AliAnalysisGoodies.h" 
27 #include "AliAnalysisManager.h" 
28 #include "AliAODHandler.h"
29 #include "AliAnalysisTask.h" 
30 #include "AliLog.h" 
31
32 #include <Riostream.h>
33 #ifdef WITHALIEN
34 #include <TGridResult.h>
35 #include <TFileMerger.h>
36 #endif
37 #include <TChain.h>
38 #include <TGrid.h>
39 #include <TROOT.h> 
40 #include <TSystem.h>
41 #include <TEntryList.h>
42
43 //______________________________________________________________________________
44 AliAnalysisGoodies::AliAnalysisGoodies() :
45   TObject(),
46   fTimer(), 
47   fESDTreeName("esdTree"), 
48   fAmgr(0)
49 {
50   fTimer.Reset() ; 
51    
52   TString token = gSystem->Getenv("GRID_TOKEN") ; 
53   
54   if ( token == "OK" ) 
55     TGrid::Connect("alien://");
56   else 
57     AliInfo("You are not connected to the GRID") ; 
58  // Make the analysis manager
59   fAmgr = new AliAnalysisManager("Goodies Manager", "Analysis manager created by AliAnalysisGoodies") ;
60 }
61
62 //______________________________________________________________________________
63 AliAnalysisGoodies::AliAnalysisGoodies(const AliAnalysisGoodies& ag) :
64   TObject(),
65   fTimer(), 
66   fESDTreeName("") 
67 {
68   
69   fESDTreeName = ag.fESDTreeName ;  
70   TString token = gSystem->Getenv("GRID_TOKEN") ; 
71   
72   if ( token == "OK" ) 
73     TGrid::Connect("alien://");
74   else 
75     AliInfo("You are not connected to the GRID") ; 
76    
77   // Make the analysis manager
78   fAmgr = new AliAnalysisManager("Goodies Manager", "Analysis manager created by AliAnalysisGoodies") ;
79 }
80
81 //______________________________________________________________________________
82 void AliAnalysisGoodies::Help() const  
83 {
84   AliInfo("Analysis utilities:\n") ; 
85   printf("                ***  Alien2Local  : copy files ESD files listed in an xml collection from AliEn catalog to local storage and creates a local xml collection  \n") ; 
86   printf("                                        usage: Alien2Local(in, out)\n") ; 
87   printf("                                                in: a xml esd collection file name    \n") ;  
88   printf("                                                ou: the local directory where to save the esd root files   \n") ;  
89   printf("                ***  Make  : makes esd collection from tags  \n") ; 
90   printf("                                        usage: Make(tags, esds)\n") ; 
91   printf("                                                tags: is either a tag root file or an xml tag collection   \n") ;  
92   printf("                                                esds: is an esd collection     \n") ;  
93   printf("                ***  Merge  : merges files listed in a xml collection \n") ; 
94   printf("                                        usage Merge(collection, outputDile)\n") ; 
95   printf("                                               collection: is a xml collection \n") ;  
96   printf("                ***  Process : process the events with an Analysis Task \n") ;
97   printf("                                        usage: Process(esdFile, tagCuts) \n") ;
98   printf("                                                esdFile: can be a root file with the ESD Tree ( ex: esd?AliESDs.root) \n") ;
99   printf("                                                        or a root file with the Tag Tree ( ex: tag?Run100.Event0_100.ESD.tag.root) \n") ;
100   printf("                                                        or a local or alien xml file with the ESD collection ( ex: esd?esdCollection.xml) \n") ;
101   printf("                                                        or a local or alien xml file with the TAG collection ( ex: tag?tagCollection.xml) \n") ;
102   printf("                                                        or a TChain of esd TTrees \n") ;
103   printf("                                               tagCuts: is the AliEventTagCuts (needed only for tag? cases \n") ;
104   printf("                ***  Register: register files already stored in a MSS into the AliEn catalog\n") ;
105   printf("                                        usage: Register(lfndir, pfndir, pfnFileName) \n") ; 
106   printf("                                                lfndir : AliEn directory ( ex:  /alice/data/2006/LHC06c/PHOS_TestBeam/\n") ;  
107   printf("                                                pfndir : MSS directory   ( ex: /castor/cern.ch/alice/testbeam/phos/2006 \n") ;
108   printf("                                                file   : text file with a list of the file names to be registered\n ") ; 
109
110 }
111
112 //______________________________________________________________________
113 Bool_t AliAnalysisGoodies::Alien2Local(const TString collectionNameIn, const TString localDir)
114 {
115   // copy files ESD files listed in an xml collection from AliEn catalog to local storage and creates a local xml collection
116   // usage: Alien2Local(in, out)
117   //        in: a xml esd collection file name 
118   //        ou: the local directory where to save the esd root files          
119
120 #ifdef WITHALIEN
121   Bool_t rv = kTRUE ; 
122
123   fTimer.Start() ; 
124
125   AliXMLCollection * collectionIn = AliXMLCollection::Open(collectionNameIn) ;
126   collectionIn->Reset() ; 
127
128   AliXMLCollection * collectionOu = new AliXMLCollection() ; 
129   TString collectionNameOu(collectionIn->GetCollectionName()) ; 
130   collectionNameOu.Append("Local") ; 
131   collectionOu->SetCollectionName(collectionNameOu) ; 
132   collectionOu->WriteHeader() ; 
133
134   TFileMerger merger ; 
135   
136   const char* ocwd = gSystem->WorkingDirectory();
137
138   Int_t counter = 1 ;  
139   while ( collectionIn->Next() ) {
140     gSystem->ChangeDirectory(localDir) ; 
141     TString fileTURL = collectionIn->GetTURL("") ; 
142
143     TString tempo(fileTURL) ; 
144     tempo.Remove(tempo.Last('/'), tempo.Length()) ; 
145     TString evtsNumber = tempo(tempo.Last('/')+1, tempo.Length())+"/";
146     tempo.Remove(tempo.Last('/'), tempo.Length()) ; 
147     TString runNumber = tempo(tempo.Last('/')+1, tempo.Length())+"/" ; 
148     TString dir = localDir + runNumber ; 
149     dir += evtsNumber ;
150     char line[1024] ; 
151     sprintf(line, ".! mkdir -p %s", dir.Data()) ; 
152     gROOT->ProcessLine(line) ; 
153     printf("***************************%s\n", line) ; 
154     TEntryList * list = collectionIn->GetEventList("") ; 
155     if (!list) 
156      list = new TEntryList() ; 
157     tempo = fileTURL ; 
158     TString filename = tempo(tempo.Last('/')+1, tempo.Length()) ;  
159     dir += filename ; 
160     AliInfo(Form("Copying %s to %s\n", fileTURL.Data(), dir.Data())) ;  
161     collectionOu->WriteBody(counter, collectionIn->GetGUID(""), collectionIn->GetLFN(""), dir, list) ;
162     counter++ ;
163     merger.Cp(fileTURL, dir) ;
164   }
165   collectionOu->Export() ;
166   gSystem->ChangeDirectory(ocwd) ; 
167   
168   fTimer.Stop();
169   fTimer.Print();
170
171   return rv ;
172 #else
173   return kFALSE;
174 #endif
175 }
176
177 //______________________________________________________________________
178 AliAnalysisDataContainer * AliAnalysisGoodies::ConnectInput(AliAnalysisTask * task, TClass * classin, UShort_t index) 
179 {
180   // connect a task to the input
181
182   if ( ! fAmgr->GetTask(task->GetName()) ) 
183     fAmgr->AddTask(task) ;
184   else 
185     AliFatal(Form("Task %s already exists", task->GetName())) ; 
186
187   AliAnalysisDataContainer * taskInput = 0x0 ; 
188   if ( fAmgr->GetInputs() ) 
189     taskInput = dynamic_cast<AliAnalysisDataContainer *>(fAmgr->GetInputs()->FindObject(Form("InputContainer_%s_%d", task->GetName(), index))) ; 
190   if ( ! taskInput ) {
191     taskInput  = fAmgr->CreateContainer(Form("InputContainer_%s_%d", task->GetName(), index), classin, AliAnalysisManager::kInputContainer) ;
192     fAmgr->ConnectInput (task, index, taskInput);
193   }
194   else 
195     AliFatal(Form("Input %s already exists", taskInput->GetName())) ; 
196
197   return taskInput ; 
198
199
200 //______________________________________________________________________
201 void AliAnalysisGoodies::ConnectInput(AliAnalysisTask * task, AliAnalysisDataContainer * taskInput, UShort_t index) 
202 {
203   // connect a task to the input
204
205   if ( ! fAmgr->GetTask(task->GetName()) ) 
206     fAmgr->AddTask(task) ;
207   else 
208     AliFatal(Form("Task %s already exists", task->GetName())) ; 
209
210   fAmgr->ConnectInput (task, index, taskInput);
211
212
213 //______________________________________________________________________
214 AliAnalysisDataContainer *  AliAnalysisGoodies::ConnectOuput(AliAnalysisTask * task, TClass * classou, UShort_t index, TString opt ) 
215 {
216   // connect a task to the output
217
218   char filename[20] ; 
219
220     if (opt == "AOD" ) {    
221       if ( fAmgr->GetEventHandler() == 0x0) {
222         AliAODHandler * aodHandler = new AliAODHandler() ; 
223         aodHandler->SetOutputFileName(Form("%s_0.root",task->GetName())) ; 
224         fAmgr->SetEventHandler(aodHandler) ;
225       } 
226       sprintf(filename, "default") ; 
227     } 
228     else {
229       if ( fAmgr->GetEventHandler() == 0x0) {
230         AliAODHandler * aodHandler = new AliAODHandler() ; 
231         fAmgr->SetEventHandler(aodHandler) ; 
232       }
233       sprintf(filename, "%s_%d.root",task->GetName(), index) ; 
234     }
235     
236     AliAnalysisDataContainer * taskOuput = 0x0 ;
237     if ( fAmgr->GetOutputs() ) 
238       taskOuput = dynamic_cast<AliAnalysisDataContainer *>(fAmgr->GetOutputs()->FindObject(Form("OutputContainer_%s_%d", task->GetName(), index))) ; 
239     if ( ! taskOuput )
240       taskOuput = fAmgr->CreateContainer(Form("OutputContainer_%s_%d", task->GetName(), index), classou, AliAnalysisManager::kOutputContainer, filename) ;
241     fAmgr->ConnectOutput(task, index, taskOuput);
242     
243     return taskOuput ; 
244
245
246 //______________________________________________________________________
247 void AliAnalysisGoodies::ConnectOuput(AliAnalysisTask * task, AliAnalysisDataContainer * taskOuput, UShort_t index) 
248 {
249   // connect a task to the output
250
251   fAmgr->ConnectInput (task, index, taskOuput);
252
253
254 //______________________________________________________________________
255 Bool_t AliAnalysisGoodies::Make(AliRunTagCuts *runCuts, AliLHCTagCuts *lhcCuts, AliDetectorTagCuts *detCuts, AliEventTagCuts *evtCuts, const char * in, const char * out) const  
256 {
257   // makes esd collection from tags 
258   // usage Make(tags, esds)
259   //              tags: is either a tag root file or an xml tag collection  
260   //              esds: is an esd collection  
261
262   Bool_t rv = kTRUE ; 
263
264   if ( !evtCuts && !runCuts ) {
265     AliError("No Tag cuts provided") ; 
266     return kFALSE ; 
267   }
268  
269   TString file(in) ; 
270   if ( file.Contains(".root") ) 
271     rv = MakeEsdCollectionFromTagFile(runCuts, lhcCuts, detCuts, evtCuts, file.Data(), out) ; 
272   else  if ( file.Contains(".xml") ) 
273     rv = MakeEsdCollectionFromTagCollection(runCuts, lhcCuts, detCuts, evtCuts, file.Data(), out) ;
274   else {
275     AliError(Form("%s is not a valid file format", in)) ; 
276     rv = kFALSE ; 
277   }
278
279   return rv ; 
280 }
281
282 //______________________________________________________________________
283 Bool_t AliAnalysisGoodies::MakeEsdCollectionFromTagFile(AliRunTagCuts *runCuts, AliLHCTagCuts *lhcCuts, AliDetectorTagCuts *detCuts, AliEventTagCuts *evtCuts, const char * in, const char * out) const 
284 {
285   // Makes an esd collection from a root tag file 
286   Bool_t rv = kTRUE ; 
287     // Open the file collection 
288   printf("*** Create Collection       ***\n");
289   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
290   printf("***  file   = |%s|             \n",in);               
291  
292   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
293   rv = tagAna->AddTagsFile(in);
294   if ( ! rv ) 
295     return rv ; 
296  
297   tagAna->CreateXMLCollection(out, runCuts, lhcCuts, detCuts, evtCuts) ;
298  
299   return rv ; 
300
301 }
302
303 //______________________________________________________________________
304 Bool_t AliAnalysisGoodies::MakeEsdCollectionFromTagCollection(AliRunTagCuts *runCuts, AliLHCTagCuts *lhcCuts, AliDetectorTagCuts *detCuts, AliEventTagCuts *evtCuts, const char * in, const char * out) const 
305 {
306   // Makes an esd collection from a xml tag collection 
307   Bool_t rv = kTRUE ; 
308    // Open the file collection 
309   printf("*** Create Collection       ***\n");
310   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
311   printf("***  Coll   = |%s|             \n",in);               
312
313 #ifdef WITHALIEN
314   
315   TGridCollection * collection = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)",in));
316   TGridResult* result = collection->GetGridResult("", 0, 0);
317   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
318   tagAna->ChainGridTags(result);
319
320   tagAna->CreateXMLCollection(out, runCuts, lhcCuts, detCuts, evtCuts) ;
321
322 #else
323   rv =  kFALSE;
324 #endif
325   return rv ; 
326 }
327
328 //______________________________________________________________________
329 Bool_t AliAnalysisGoodies::MakeEsdCollectionFromTagCollection(const char * runCuts, const char *lhcCuts, const char *detCuts, const char * evtCuts, const char * in, const char * out) const 
330 {
331   // Makes an esd collection from a xml tag collection 
332   
333   Bool_t rv = kTRUE ; 
334  
335   // Open the file collection 
336   printf("*** Create Collection       ***\n");
337   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
338   printf("***  Coll   = |%s|             \n",in);               
339   
340 #ifdef WITHALIEN
341
342   TGridCollection * collection = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)",in));
343   TGridResult* result = collection->GetGridResult("", 0, 0);
344   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
345   tagAna->ChainGridTags(result);
346   
347   tagAna->CreateXMLCollection(out, runCuts, lhcCuts, detCuts, evtCuts) ;
348
349 #else
350   rv = kFALSE;
351 #endif
352   return rv ;
353 }
354
355 //______________________________________________________________________
356 Bool_t AliAnalysisGoodies::Merge(const char * collectionFile, const char * subFile, const char * outFile) 
357 {
358   // merges files listed in a xml collection 
359   // usage Merge(collection, outputFile))
360   //              collection: is a xml collection  
361   
362   Bool_t rv = kFALSE ; 
363
364   if ( strstr(collectionFile, ".xml") == 0 ) {
365     AliError("Input collection file must be an \".xml\" file\n") ; 
366     return kFALSE ; 
367   }
368
369   fTimer.Start() ;
370
371   // Open the file collection 
372   printf("*** Create Collection       ***\n");
373   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
374   printf("***  Coll   = |%s|             \n",collectionFile);                   
375   
376 #ifdef WITHALIEN
377
378   TGridCollection * collection = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)",collectionFile));
379   TGridResult* result = collection->GetGridResult("", 0, 0);
380   
381   Int_t index = 0  ;
382   const char * turl ;
383   TFileMerger merger ; 
384   if (!outFile) {
385     TString tempo(collectionFile) ; 
386     if ( subFile) 
387       tempo.ReplaceAll(".xml", subFile) ; 
388     else 
389       tempo.ReplaceAll(".xml", "_Merged.root") ; 
390     outFile = tempo.Data() ; 
391   }
392   merger.OutputFile(outFile) ; 
393
394   while ( (turl = result->GetKey(index, "turl")) ) {
395     char file[2048] ;
396     if ( subFile )
397       sprintf(file, "%s#%s", turl, subFile) ; 
398     else 
399       sprintf(file, "%s", turl) ; 
400       
401     printf("%s\n", file) ; 
402     merger.AddFile(file) ; 
403     index++ ;  
404   }
405
406   if (index) 
407     merger.Merge() ; 
408   
409   AliInfo(Form("Files merged into %s\n", outFile)) ;
410  
411   fTimer.Stop();
412   fTimer.Print();
413   
414 #else
415   rv = kFALSE;
416 #endif
417   return rv ;
418 }
419
420 //______________________________________________________________________
421 Bool_t AliAnalysisGoodies::Process(TChain * chain) 
422 {
423   // process events starting from a chain of esd Trees
424   Bool_t rv = kFALSE ; 
425   fTimer.Start() ;
426
427   rv = ProcessChain(chain) ; 
428
429   fTimer.Stop();
430   fTimer.Print();
431
432   return rv ; 
433 }
434
435 //______________________________________________________________________
436 Bool_t AliAnalysisGoodies::Process(const char * inFile) 
437
438   // process the events with an Analysis Task 
439   // usage Process(esdFile)
440   //              esdFile: is of the form opt?file_lfn 
441   Bool_t rv = kFALSE ; 
442   AliRunTagCuts      * runCuts = 0x0 ; 
443   AliLHCTagCuts      * lhcCuts = 0x0 ;
444   AliDetectorTagCuts * detCuts = 0x0 ; 
445   AliEventTagCuts    * evtCuts = 0x0 ;
446
447   rv = Process(inFile, runCuts, lhcCuts, detCuts, evtCuts) ; 
448
449   return rv ; 
450 }
451
452 //______________________________________________________________________
453 Bool_t AliAnalysisGoodies::Process(const char * inFile, AliRunTagCuts *runCuts, AliLHCTagCuts *lhcCuts, AliDetectorTagCuts *detCuts, AliEventTagCuts * evtCuts ) 
454 {
455   // process the events with an Analysis Task 
456   // usage Process(esdFile, runtagCuts, evtTagCuts)
457   //              esdFile: is of the form opt?file_lfn 
458   
459   Bool_t rv = kFALSE ; 
460
461   fTimer.Start() ;
462
463   TString file(inFile) ; 
464   if ( file.Contains("esd?") && file.Contains(".root") ) {
465     file.ReplaceAll("esd?", "") ; 
466     rv = ProcessEsdFile(file.Data()) ; 
467
468   } else if ( file.Contains("esd?") && file.Contains(".xml") ) { 
469     file.ReplaceAll("esd?", "") ; 
470     rv = ProcessEsdXmlCollection(file.Data()) ; 
471
472   } else if (file.Contains("tag?") && file.Contains(".root") ) {
473     file.ReplaceAll("tag?", "") ; 
474     rv = ProcessTagFile(file.Data(), runCuts, lhcCuts, detCuts, evtCuts) ; 
475
476   } else if (file.Contains("tag?") && file.Contains(".xml") ) {
477     file.ReplaceAll("tag?", "") ; 
478     rv = ProcessTagXmlCollection(file.Data(), runCuts, lhcCuts, detCuts, evtCuts) ; 
479
480   } else { 
481     AliError(Form("%s is not a valid file format", inFile)) ; 
482     rv = kFALSE ;
483   }
484   
485   fTimer.Stop();
486   fTimer.Print();
487
488   return rv ; 
489 }
490
491 //______________________________________________________________________
492 Bool_t AliAnalysisGoodies::Process(const char * inFile, const char * runCuts, const char * lhcCuts, const char * detCuts, const char * evtCuts) 
493 {
494   // process the events with an Analysis Task 
495   // usage Process(esdFile, runtagCuts, evtTagCuts)
496   //              esdFile: is of the form opt?file_lfn 
497   
498   Bool_t rv = kFALSE ; 
499
500   fTimer.Start() ;
501
502   TString file(inFile) ; 
503   if ( file.Contains("esd?") && file.Contains(".root") ) {
504     file.ReplaceAll("esd?", "") ; 
505     rv = ProcessEsdFile(file.Data()) ; 
506
507   } else if ( file.Contains("esd?") && file.Contains(".xml") ) { 
508     file.ReplaceAll("esd?", "") ; 
509     rv = ProcessEsdXmlCollection(file.Data()) ; 
510
511   } else if (file.Contains("tag?") && file.Contains(".root") ) {
512     file.ReplaceAll("tag?", "") ; 
513     rv = ProcessTagFile(file.Data(), runCuts, lhcCuts, detCuts, evtCuts) ; 
514
515   } else if (file.Contains("tag?") && file.Contains(".xml") ) {
516     file.ReplaceAll("tag?", "") ; 
517     rv = ProcessTagXmlCollection(file.Data(), runCuts, lhcCuts, detCuts, evtCuts) ; 
518
519   } else { 
520     AliError(Form("%s is not a valid file format", inFile)) ; 
521     rv = kFALSE ;
522   }
523   
524   fTimer.Stop();
525   fTimer.Print();
526
527   return rv ; 
528 }
529
530 //______________________________________________________________________
531 Bool_t AliAnalysisGoodies::ProcessChain(TChain * chain) const
532 {
533   // Procees a TChain. 
534
535   Bool_t rv = kTRUE ;
536
537   // start processing 
538   if (fAmgr->InitAnalysis()) {
539     fAmgr->PrintStatus();
540     fAmgr->StartAnalysis("local",chain);
541   } else 
542     rv = kFALSE ; 
543   
544   return rv ; 
545 }
546  
547 //______________________________________________________________________
548 Bool_t AliAnalysisGoodies::ProcessEsdFile(const char * esdFile) const   
549 {
550   // process the events in a single ESD file with an Analysis Task 
551   // usage ProcessLocalEsdFile(esdFile)
552   //              esdFile: is the root file (local or in alien) with the ESD Tree ( ex: AliESDs.root) 
553  
554   Bool_t rv = kTRUE ;  
555   
556   printf("*** Process       ***\n");
557   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
558   printf("***  Coll   = |%s|             \n",esdFile);                  
559
560   // Makes the ESD chain 
561   printf("*** Getting the Chain       ***\n");
562   TChain* analysisChain = new TChain(fESDTreeName) ;
563   analysisChain->AddFile(esdFile);
564  
565   // Process the events
566   rv = ProcessChain(analysisChain) ; 
567
568   return rv;
569 }
570
571 //______________________________________________________________________
572 Bool_t AliAnalysisGoodies::ProcessTagFile(const char * tagFile, AliRunTagCuts *runCuts, AliLHCTagCuts *lhcCuts, AliDetectorTagCuts *detCuts, AliEventTagCuts *evtCuts) const   
573 {
574   // process the events in a single Tag file with an Analysis Task 
575   // usage ProcessLocalEsdFile(tagFile)
576   //              tagFile: is the root file (local or in alien) with the Tag Tree (ex: Run102.Event0_100.ESD.tag.root) 
577  
578   Bool_t rv = kTRUE ;  
579   
580   if ( !evtCuts && !runCuts ) {
581     AliError("No Tag cuts provided") ; 
582     return kFALSE ; 
583   }
584   
585   printf("*** Process       ***\n");
586   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
587   printf("***  Coll   = |%s|             \n",tagFile);                  
588
589   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
590   rv = tagAna->AddTagsFile(tagFile);
591   if ( ! rv ) 
592     return rv ; 
593
594   // Query the tag file and make the analysis chain
595   TChain * analysisChain = new TChain(fESDTreeName)  ;
596   analysisChain = tagAna->QueryTags(runCuts, lhcCuts, detCuts, evtCuts);
597   
598   // Process the events
599   rv = ProcessChain(analysisChain) ; 
600
601   return rv;
602 }
603
604 //______________________________________________________________________
605 Bool_t AliAnalysisGoodies::ProcessTagFile(const char * tagFile, const char * runCuts, const char * lhcCuts, const char * detCuts, const char * evtCuts) const   
606 {
607   // process the events in a single Tag file with an Analysis Task 
608   // usage ProcessLocalEsdFile(tagFile)
609   //              tagFile: is the root file (local or in alien) with the Tag Tree (ex: Run102.Event0_100.ESD.tag.root) 
610  
611   Bool_t rv = kTRUE ;  
612   
613
614   if ( !evtCuts && !runCuts ) {
615     AliError("No Tag cuts provided") ; 
616     return kFALSE ; 
617   }
618   
619   printf("*** Process       ***\n");
620   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
621   printf("***  Coll   = |%s|             \n",tagFile);                  
622
623   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
624   rv = tagAna->AddTagsFile(tagFile);
625   if ( ! rv ) 
626     return rv ; 
627
628   // Query the tag file and make the analysis chain
629   TChain * analysisChain = new TChain(fESDTreeName)  ;
630   analysisChain = tagAna->QueryTags(runCuts, lhcCuts, detCuts, evtCuts);
631   
632   // Process the events
633  rv = ProcessChain(analysisChain) ; 
634
635   return rv;
636 }
637
638 //______________________________________________________________________
639 Bool_t AliAnalysisGoodies::ProcessEsdXmlCollection(const char * xmlFile) const   
640 {
641   // process the events in a xml ESD collection  with an Analysis Task 
642   // usage ProcessLocalEsdFile(xmlFile)
643   //              xmlFile: is the local xml file with the ESD collection ( ex: esdCollection.xml) 
644  
645   Bool_t rv = kTRUE ;  
646   
647   printf("*** Process       ***\n");
648   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
649   printf("***  Coll   = |%s|             \n",xmlFile);                  
650
651 #ifdef WITHALIEN
652   //AliXMLCollection * collection = AliXMLCollection::Open(xmlFile,0) ;
653   TGridCollection * collection =  (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)", xmlFile));
654   if (! collection) {
655     AliError(Form("%s not found", xmlFile)) ; 
656     return kFALSE ; 
657   }
658
659   TGridResult* result = collection->GetGridResult("",0 ,0);
660   TList* analysisfilelist = result->GetFileInfoList();
661   
662   // Makes the ESD chain 
663   printf("*** Getting the Chain       ***\n");
664   TChain* analysisChain = new TChain(fESDTreeName);
665   analysisChain->AddFileInfoList(analysisfilelist);
666
667   // Process the events
668   rv = ProcessChain(analysisChain) ; 
669
670 #else
671   rv = kFALSE;
672
673 #endif
674
675   return rv ; 
676 }
677
678 //______________________________________________________________________
679 Bool_t AliAnalysisGoodies::ProcessTagXmlCollection(const char * xmlFile, AliRunTagCuts *runCuts, AliLHCTagCuts *lhcCuts, AliDetectorTagCuts *detCuts, AliEventTagCuts * evtCuts) const   
680 {
681   // process the events in a xml ESD collection  with an Analysis Task 
682   // usage ProcessLocalEsdFile(xmlFile)
683   //              xmlFile: is the local xml file with the tag collection ( ex: tagCollection.xml) 
684  
685   Bool_t rv = kTRUE ;  
686   
687   if ( !evtCuts && !runCuts ) {
688     AliError("No Tag cuts provided") ; 
689     return kFALSE ; 
690   }
691
692   printf("*** Process       ***\n");
693   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
694   printf("***  Coll   = |%s|            \n",xmlFile);                   
695  
696   // check if file is local or alien
697   if ( gSystem->AccessPathName(xmlFile) ) 
698     TGrid::Connect("alien://"); 
699
700 #ifdef WITHALIEN
701
702   TGridCollection * collection = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)",xmlFile));
703   if (! collection) {
704     AliError(Form("%s not found", xmlFile)) ; 
705     return kFALSE ; 
706   }
707
708   TGridResult* result = collection->GetGridResult("", 0, 0);
709   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
710   tagAna->ChainGridTags(result);
711   
712   // Query the tag file and make the analysis chain
713   TChain * analysisChain = new TChain(fESDTreeName)  ;
714   analysisChain = tagAna->QueryTags(runCuts, lhcCuts, detCuts, evtCuts);
715
716   // Process the events
717   rv = ProcessChain(analysisChain) ; 
718
719 #else
720   rv = kFALSE;
721 #endif
722   return rv ; 
723 }
724
725 //______________________________________________________________________
726 Bool_t AliAnalysisGoodies::ProcessTagXmlCollection(const char * xmlFile, const char * runCuts, const char * lhcCuts, const char * detCuts, const char * evtCuts) const   
727 {
728   // process the events in a xml ESD collection  with an Analysis Task 
729   // usage ProcessLocalEsdFile(xmlFile)
730   //              xmlFile: is the local xml file with the tag collection ( ex: tagCollection.xml) 
731  
732   Bool_t rv = kTRUE ;  
733
734  if ( !evtCuts && !runCuts ) {
735     AliError("No Tag cuts provided") ; 
736     return kFALSE ; 
737   }
738
739   printf("*** Process       ***\n");
740   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
741   printf("***  Coll   = |%s|             \n",xmlFile);                  
742  
743 #ifdef WITHALIEN
744
745   // check if file is local or alien
746   if ( gSystem->AccessPathName(xmlFile) ) 
747     TGrid::Connect("alien://"); 
748
749   TGridCollection * collection = (TGridCollection*)gROOT->ProcessLine(Form("TAlienCollection::Open(\"%s\", 0)",xmlFile));
750   if (! collection) {
751     AliError(Form("%s not found", xmlFile)) ; 
752     return kFALSE ; 
753   }
754
755   TGridResult* result = collection->GetGridResult("", 0, 0);
756   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
757   tagAna->ChainGridTags(result);
758   
759   // Query the tag file and make the analysis chain
760   TChain * analysisChain = new TChain(fESDTreeName)  ;
761   analysisChain = tagAna->QueryTags(runCuts, lhcCuts, detCuts, evtCuts);
762
763   // Process the events
764   rv = ProcessChain(analysisChain) ; 
765
766 #else
767   rv = kFALSE;
768 #endif
769   return rv ; 
770 }
771
772 //______________________________________________________________________
773 Bool_t AliAnalysisGoodies::Register( const char * lfndir, const char * pfndir, const char * file) 
774 {
775   // register files already stored in a MSS into the AliEn catalog
776   // usage: Register(lfndir, pfndir, pfnFileName)
777   //         lfndir : AliEn directory ( ex:  /alice/data/2006/LHC06c/PHOS_TestBeam/ ) 
778   //         pfndir : MSS directory   ( ex: /castor/cern.ch/alice/testbeam/phos/2006 )
779   //         file   : text file with a list of the file names to be registered
780
781   Bool_t rv = kTRUE ;  
782   fTimer.Start() ; 
783
784   ifstream in;
785   in.open(file);
786   if ( in.bad() ) {
787     AliError(Form("Cannot open file %s\n", file)) ; 
788     return kFALSE ; 
789   }
790
791   TGrid::Connect("alien://");
792
793   char fileName[1024] ;
794
795   while (1) {
796     in >> fileName ;
797     if (!in.good()) 
798       break;
799     char lfn[1024] ; 
800     
801     sprintf(lfn, "%s/%s", lfndir, fileName) ; 
802     
803     char pfn[1024] ; 
804     
805     sprintf(pfn, "castor://Alice::CERN::Castor2/%s/%s", pfndir, fileName) ;  
806         
807     printf("Register %s as %s\n", pfn, lfn) ; 
808     
809     gGrid->Register(lfn, pfn) ;
810   }
811   
812   fTimer.Stop();
813   fTimer.Print();
814   
815   return rv;
816 }
817