bd1990befc599dbc3ca033fbe5da245cda30916e
[u/mrichter/AliRoot.git] / ESDCheck / 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 "AliAnalysisTask.h" 
29   //#include "AliPhotonAnalysisTask.h" 
30 #include "AliLog.h" 
31
32 #include <Riostream.h>
33 #include <TAlienCollection.h>
34 #include <TChain.h>
35 #include <TFileMerger.h>
36 #include <TGrid.h>
37 #include <TROOT.h> 
38 #include <TSystem.h>
39
40
41 //______________________________________________________________________________
42 AliAnalysisGoodies::AliAnalysisGoodies() :
43   fESDTreeName("esdTree"), 
44   fnumberOfTasks(0),
45   fTaskList(0),
46   fTaskInType(0), 
47   fTaskOuType(0)
48 {
49   fTimer.Reset() ; 
50    
51   TString token = gSystem->Getenv("GRID_TOKEN") ; 
52   
53   if ( token == "OK" ) 
54     TGrid::Connect("alien://");
55   else 
56     AliInfo("You are not connected to the GRID") ; 
57 }
58
59 //______________________________________________________________________________
60 void AliAnalysisGoodies::Help() const  
61 {
62   AliInfo("Analysis utilities:\n") ; 
63   printf("                ***  Copy  : copy files ESD files listed in an xml collection from AliEn catalog to local storage and creates a local xml collection  \n") ; 
64   printf("                                        usage: Copy(in, out)\n") ; 
65   printf("                                                in: a xml esd collection file name    \n") ;  
66   printf("                                                ou: the local directory where to save the esd root files   \n") ;  
67   printf("                ***  Make  : makes esd collection from tags  \n") ; 
68   printf("                                        usage: Make(tags, esds)\n") ; 
69   printf("                                                tags: is either a tag root file or an xml tag collection   \n") ;  
70   printf("                                                esds: is an esd collection     \n") ;  
71   printf("                ***  Merge  : merges files listed in a xml collection \n") ; 
72   printf("                                        usage Merge(collection, outputDile)\n") ; 
73   printf("                                               collection: is a xml collection \n") ;  
74   printf("                ***  Process : process the events with an Analysis Task \n") ;
75   printf("                                        usage: Process(esdFile, tagCuts) \n") ;
76   printf("                                                esdFile: can be a root file with the ESD Tree ( ex: esd?AliESDs.root) \n") ;
77   printf("                                                        or a root file with the Tag Tree ( ex: tag?Run100.Event0_100.ESD.tag.root) \n") ;
78   printf("                                                        or a local or alien xml file with the ESD collection ( ex: esd?esdCollection.xml) \n") ;
79   printf("                                                        or a local or alien xml file with the TAG collection ( ex: tag?tagCollection.xml) \n") ;
80   printf("                                                        or a TChain of esd TTrees \n") ;
81   printf("                                               tagCuts: is the AliEventTagCuts (needed only for tag? cases \n") ;
82   printf("                ***  Register: register files already stored in a MSS into the AliEn catalog\n") ;
83   printf("                                        usage: Register(lfndir, pfndir, pfnFileName) \n") ; 
84   printf("                                                lfndir : AliEn directory ( ex:  /alice/data/2006/LHC06c/PHOS_TestBeam/\n") ;  
85   printf("                                                pfndir : MSS directory   ( ex: /castor/cern.ch/alice/testbeam/phos/2006 \n") ;
86   printf("                                                file   : text file with a list of the file names to be registered\n ") ; 
87
88 }
89
90 //______________________________________________________________________
91 const Bool_t AliAnalysisGoodies::Alien2Local(const TString collectionNameIn, const TString localDir)
92 {
93   // copy files ESD files listed in an xml collection from AliEn catalog to local storage and creates a local xml collection
94   // usage: Alien2Local(in, out)
95   //        in: a xml esd collection file name 
96   //        ou: the local directory where to save the esd root files          
97
98   Bool_t rv = kTRUE ; 
99   const char * kFileName = "AliESDs.root" ;  
100
101   fTimer.Start() ; 
102
103   AliXMLCollection collectionIn(collectionNameIn) ; 
104
105   AliXMLCollection * collectionOu = new AliXMLCollection() ; 
106   TString collectionNameOu(collectionIn.GetCollectionName()) ; 
107   collectionNameOu.Append("Local") ; 
108   collectionOu->SetCollectionName(collectionNameOu) ; 
109   collectionOu->WriteHeader() ; 
110
111   TFileMerger merger ; 
112   
113   const char* ocwd = gSystem->WorkingDirectory();
114
115   Int_t counter = 0 ;  
116   while ( collectionIn.Next() ) {
117     gSystem->ChangeDirectory(localDir) ; 
118     TString fileTURL = collectionIn.GetTURL(kFileName) ; 
119
120     TString tempo(fileTURL) ; 
121     tempo.Remove(tempo.Last('/'), tempo.Length()) ; 
122     TString evtsNumber = tempo(tempo.Last('/')+1, tempo.Length())+"/";
123     tempo.Remove(tempo.Last('/'), tempo.Length()) ; 
124     TString runNumber = tempo(tempo.Last('/')+1, tempo.Length())+"/" ; 
125     TString dir = localDir + runNumber ; 
126     gSystem->MakeDirectory(dir) ; 
127     gSystem->ChangeDirectory(dir) ; 
128     dir += evtsNumber + "/"; 
129     gSystem->MakeDirectory(dir) ; 
130     gSystem->ChangeDirectory(dir) ; 
131     dir += collectionIn.GetCollectionName() ; 
132     TEntryList * list = collectionIn.GetEventList(kFileName) ; 
133     
134     collectionOu->WriteBody(counter, collectionIn.GetGUID(kFileName), collectionIn.GetLFN(kFileName), collectionIn.GetTURL(kFileName),  list) ;
135     counter++ ; 
136     printf("Copying %s to %s\n", fileTURL.Data(), dir.Data()) ;  
137     merger.Cp(fileTURL, dir) ;
138   }
139   collectionOu->Export() ;
140   gSystem->ChangeDirectory(ocwd) ; 
141   
142   fTimer.Stop();
143   fTimer.Print();
144
145   return rv ; 
146 }
147
148 //______________________________________________________________________
149 const Bool_t AliAnalysisGoodies::Make(AliRunTagCuts *runCuts, AliEventTagCuts *evtCuts, const char * in, const char * out) const  
150 {
151   // makes esd collection from tags 
152   // usage Make(tags, esds)
153   //              tags: is either a tag root file or an xml tag collection  
154   //              esds: is an esd collection  
155
156   Bool_t rv = kTRUE ; 
157
158   if ( !evtCuts && !runCuts ) {
159     AliError("No Tag cuts provided") ; 
160     return kFALSE ; 
161   }
162  
163   TString file(in) ; 
164   if ( file.Contains(".root") ) 
165     rv = MakeEsdCollectionFromTagFile(runCuts, evtCuts, file.Data(), out) ; 
166   else  if ( file.Contains(".xml") ) 
167     rv = MakeEsdCollectionFromTagCollection(runCuts, evtCuts, file.Data(), out) ;
168   else {
169     AliError(Form("%s is not a valid file format", in)) ; 
170     rv = kFALSE ; 
171   }
172
173   return rv ; 
174 }
175
176 //______________________________________________________________________
177 const Bool_t AliAnalysisGoodies::MakeEsdCollectionFromTagFile(AliRunTagCuts *runCuts, AliEventTagCuts *evtCuts, const char * in, const char * out) const 
178 {
179   // Makes an esd collection from a root tag file 
180   Bool_t rv = kTRUE ; 
181     // Open the file collection 
182   printf("*** Create Collection       ***\n");
183   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
184   printf("***  file   = |%s|             \n",in);               
185  
186   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
187   rv = tagAna->AddTagsFile(in);
188   if ( ! rv ) 
189     return rv ; 
190  
191   tagAna->CreateXMLCollection(out, runCuts, evtCuts) ;
192  
193   return rv ; 
194
195 }
196
197 //______________________________________________________________________
198 const Bool_t AliAnalysisGoodies::MakeEsdCollectionFromTagCollection(AliRunTagCuts * runCuts, AliEventTagCuts * evtCuts, const char * in, const char * out) const 
199 {
200   // Makes an esd collection from a xml tag collection 
201   Bool_t rv = kTRUE ; 
202    // Open the file collection 
203   printf("*** Create Collection       ***\n");
204   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
205   printf("***  Coll   = |%s|             \n",in);               
206   
207   TAlienCollection * collection = TAlienCollection::Open(in);
208   TGridResult* result = collection->GetGridResult("");
209   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
210   tagAna->ChainGridTags(result);
211
212   tagAna->CreateXMLCollection(out, runCuts, evtCuts) ;
213
214   return rv ; 
215 }
216
217 //______________________________________________________________________
218 // const Bool_t AliAnalysisGoodies::MakeEsdCollectionFromTagCollection(const char * runCuts, const char * evtCuts, const char * in, const char * out) const 
219 // {
220 //   // Makes an esd collection from a xml tag collection 
221 //   Bool_t rv = kTRUE ; 
222  
223 //   // Open the file collection 
224 //   printf("*** Create Collection       ***\n");
225 //   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
226 //   printf("***  Coll   = |%s|             \n",in);                    
227   
228 //   TAlienCollection * collection = TAlienCollection::Open(in);
229 //   TGridResult* result = collection->GetGridResult("");
230 //   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
231 //   tagAna->ChainGridTags(result);
232   
233 //   tagAna->CreateXMLCollection(out, runCuts, evtCuts) ;
234
235 //   return rv ; 
236 // }
237
238 //______________________________________________________________________
239 const Bool_t AliAnalysisGoodies::Merge(const char * collectionFile, const char * subFile, const char * outFile) 
240 {
241   // merges files listed in a xml collection 
242   // usage Merge(collection, outputFile))
243   //              collection: is a xml collection  
244   
245   Bool_t rv = kFALSE ; 
246
247   if ( strstr(collectionFile, ".xml") == 0 ) {
248     AliError("Input collection file must be an \".xml\" file\n") ; 
249     return kFALSE ; 
250   }
251
252   fTimer.Start() ;
253
254   // Open the file collection 
255   printf("*** Create Collection       ***\n");
256   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
257   printf("***  Coll   = |%s|             \n",collectionFile);                   
258   
259   TAlienCollection * collection = TAlienCollection::Open(collectionFile);
260   TGridResult* result = collection->GetGridResult("");
261   
262   Int_t index = 0  ;
263   const char * turl ;
264   TFileMerger merger ; 
265   if (!outFile) {
266     TString tempo(collectionFile) ; 
267     if ( subFile) 
268       tempo.ReplaceAll(".xml", subFile) ; 
269     else 
270       tempo.ReplaceAll(".xml", "_Merged.root") ; 
271     outFile = tempo.Data() ; 
272   }
273   merger.OutputFile(outFile) ; 
274
275   while ( (turl = result->GetKey(index, "turl")) ) {
276     char file[2048] ;
277     if ( subFile )
278       sprintf(file, "%s#%s", turl, subFile) ; 
279     else 
280       sprintf(file, "%s", turl) ; 
281       
282     printf("%s\n", file) ; 
283     merger.AddFile(file) ; 
284     index++ ;  
285   }
286
287   if (index) 
288     merger.Merge() ; 
289   
290   AliInfo(Form("Files merged into %s\n", outFile)) ;
291  
292   fTimer.Stop();
293   fTimer.Print();
294   
295   return rv ; 
296 }
297
298 //______________________________________________________________________
299 const Bool_t AliAnalysisGoodies::Process(TChain * chain) 
300 {
301   // process events starting from a chain of esd Trees
302   Bool_t rv = kFALSE ; 
303
304   fTimer.Start() ;
305
306   rv = ProcessChain(chain) ; 
307
308   fTimer.Stop();
309   fTimer.Print();
310
311   return rv ; 
312 }
313
314 //______________________________________________________________________
315 const Bool_t AliAnalysisGoodies::Process(const char * inFile) 
316
317   // process the events with an Analysis Task 
318   // usage Process(esdFile)
319   //              esdFile: is of the form opt?file_lfn 
320   Bool_t rv = kFALSE ; 
321   AliRunTagCuts   * runCuts = 0x0 ; 
322   AliEventTagCuts * evtCuts = 0x0 ;
323
324   rv = Process(inFile, runCuts, evtCuts) ; 
325
326   return rv ; 
327 }
328
329 //______________________________________________________________________
330 const Bool_t AliAnalysisGoodies::Process(const char * inFile, AliRunTagCuts *runCuts, AliEventTagCuts * evtCuts ) 
331 {
332   // process the events with an Analysis Task 
333   // usage Process(esdFile, runtagCuts, evtTagCuts)
334   //              esdFile: is of the form opt?file_lfn 
335   
336   Bool_t rv = kFALSE ; 
337
338   fTimer.Start() ;
339
340   TString file(inFile) ; 
341   if ( file.Contains("esd?") && file.Contains(".root") ) {
342     file.ReplaceAll("esd?", "") ; 
343     rv = ProcessEsdFile(file.Data()) ; 
344
345   } else if ( file.Contains("esd?") && file.Contains(".xml") ) { 
346     file.ReplaceAll("esd?", "") ; 
347     rv = ProcessEsdXmlCollection(file.Data()) ; 
348
349   } else if (file.Contains("tag?") && file.Contains(".root") ) {
350     file.ReplaceAll("tag?", "") ; 
351     rv = ProcessTagFile(file.Data(), runCuts, evtCuts) ; 
352
353   } else if (file.Contains("tag?") && file.Contains(".xml") ) {
354     file.ReplaceAll("tag?", "") ; 
355     rv = ProcessTagXmlCollection(file.Data(), runCuts, evtCuts) ; 
356
357   } else { 
358     AliError(Form("%s is not a valid file format", inFile)) ; 
359     rv = kFALSE ;
360   }
361   
362   fTimer.Stop();
363   fTimer.Print();
364
365   return rv ; 
366 }
367
368 //______________________________________________________________________
369 const Bool_t AliAnalysisGoodies::Process(const char * inFile, const char * runCuts, const char * evtCuts) 
370 {
371   // process the events with an Analysis Task 
372   // usage Process(esdFile, runtagCuts, evtTagCuts)
373   //              esdFile: is of the form opt?file_lfn 
374   
375   Bool_t rv = kFALSE ; 
376
377   fTimer.Start() ;
378
379   TString file(inFile) ; 
380   if ( file.Contains("esd?") && file.Contains(".root") ) {
381     file.ReplaceAll("esd?", "") ; 
382     rv = ProcessEsdFile(file.Data()) ; 
383
384   } else if ( file.Contains("esd?") && file.Contains(".xml") ) { 
385     file.ReplaceAll("esd?", "") ; 
386     rv = ProcessEsdXmlCollection(file.Data()) ; 
387
388   } else if (file.Contains("tag?") && file.Contains(".root") ) {
389     file.ReplaceAll("tag?", "") ; 
390     rv = ProcessTagFile(file.Data(), runCuts, evtCuts) ; 
391
392   } else if (file.Contains("tag?") && file.Contains(".xml") ) {
393     file.ReplaceAll("tag?", "") ; 
394     rv = ProcessTagXmlCollection(file.Data(), runCuts, evtCuts) ; 
395
396   } else { 
397     AliError(Form("%s is not a valid file format", inFile)) ; 
398     rv = kFALSE ;
399   }
400   
401   fTimer.Stop();
402   fTimer.Print();
403
404   return rv ; 
405 }
406
407 //______________________________________________________________________
408 const Bool_t AliAnalysisGoodies::ProcessChain(TChain * chain) const
409 {
410   // Procees a TChain. 
411
412   Bool_t rv = kTRUE ;
413
414   if (! fTaskList ) {
415     AliError("No tasks defined") ; 
416     return kFALSE ;
417   }
418
419   // Make the analysis manager
420   AliAnalysisManager * mgr = new AliAnalysisManager() ;
421
422   // Make tasks 
423   // The top input must be common to all top tasks
424   TClass * classIn = fTaskInType[0] ; 
425   AliAnalysisDataContainer * taskInput  = mgr->CreateContainer("Input  Container", classIn, AliAnalysisManager::kInputContainer) ;
426   Int_t index ; 
427   for (index = 0; index < fnumberOfTasks; index++) {
428     AliAnalysisTask * task = fTaskList[index] ;
429     mgr->AddTask(task) ;
430   
431     // Create containers for input/output
432     TClass * classOu = fTaskOuType[index] ; 
433     AliAnalysisDataContainer * taskOutput = mgr->CreateContainer("Output Container", classOu, AliAnalysisManager::kOutputContainer) ;
434     mgr->ConnectInput (task, 0, taskInput);
435     mgr->ConnectOutput(task, 0, taskOutput);
436   }
437   
438   // Open data
439   taskInput->SetData(chain);
440
441   if (mgr->InitAnalysis()) {
442     mgr->PrintStatus();
443     chain->Process(mgr);
444   } else 
445     rv = kFALSE ; 
446   
447   return rv ; 
448 }
449  
450 //______________________________________________________________________
451 const Bool_t AliAnalysisGoodies::ProcessEsdFile(const char * esdFile) const   
452 {
453   // process the events in a single ESD file with an Analysis Task 
454   // usage ProcessLocalEsdFile(esdFile)
455   //              esdFile: is the root file (local or in alien) with the ESD Tree ( ex: AliESDs.root) 
456  
457   Bool_t rv = kTRUE ;  
458   
459   printf("*** Process       ***\n");
460   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
461   printf("***  Coll   = |%s|             \n",esdFile);                  
462
463   // Makes the ESD chain 
464   printf("*** Getting the Chain       ***\n");
465   TChain* analysisChain = new TChain(fESDTreeName) ;
466   analysisChain->AddFile(esdFile);
467  
468   // Process the events
469   rv = ProcessChain(analysisChain) ; 
470
471   return rv;
472 }
473
474 //______________________________________________________________________
475 const Bool_t AliAnalysisGoodies::ProcessTagFile(const char * tagFile, AliRunTagCuts *runCuts, AliEventTagCuts *evtCuts) const   
476 {
477   // process the events in a single Tag file with an Analysis Task 
478   // usage ProcessLocalEsdFile(tagFile)
479   //              tagFile: is the root file (local or in alien) with the Tag Tree (ex: Run102.Event0_100.ESD.tag.root) 
480  
481   Bool_t rv = kTRUE ;  
482   
483   if ( !evtCuts && !runCuts ) {
484     AliError("No Tag cuts provided") ; 
485     return kFALSE ; 
486   }
487   
488   printf("*** Process       ***\n");
489   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
490   printf("***  Coll   = |%s|             \n",tagFile);                  
491
492   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
493   rv = tagAna->AddTagsFile(tagFile);
494   if ( ! rv ) 
495     return rv ; 
496
497   // Query the tag file and make the analysis chain
498   TChain * analysisChain = new TChain(fESDTreeName)  ;
499   analysisChain = tagAna->QueryTags(runCuts, evtCuts);
500   
501   // Process the events
502   rv = ProcessChain(analysisChain) ; 
503
504   return rv;
505 }
506
507 //______________________________________________________________________
508 // const Bool_t AliAnalysisGoodies::ProcessTagFile(const char * tagFile, const char * runCuts, const char * evtCuts) const   
509 // {
510 //   // process the events in a single Tag file with an Analysis Task 
511 //   // usage ProcessLocalEsdFile(tagFile)
512 //   //              tagFile: is the root file (local or in alien) with the Tag Tree (ex: Run102.Event0_100.ESD.tag.root) 
513  
514 //   Bool_t rv = kTRUE ;  
515   
516
517 //   if ( !evtCuts && !runCuts ) {
518 //     AliError("No Tag cuts provided") ; 
519 //     return kFALSE ; 
520 //   }
521   
522 //   printf("*** Process       ***\n");
523 //   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
524 //   printf("***  Coll   = |%s|             \n",tagFile);               
525
526 //   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
527 //   rv = tagAna->AddTagsFile(tagFile);
528 //   if ( ! rv ) 
529 //     return rv ; 
530
531 //   // Query the tag file and make the analysis chain
532 //   TChain * analysisChain = new TChain(fESDTreeName)  ;
533 //   analysisChain = tagAna->QueryTags(runCuts, evtCuts);
534   
535 //   // Process the events
536 //  rv = ProcessChain(analysisChain) ; 
537
538 //   return rv;
539 // }
540
541 //______________________________________________________________________
542 const Bool_t AliAnalysisGoodies::ProcessEsdXmlCollection(const char * xmlFile) const   
543 {
544   // process the events in a xml ESD collection  with an Analysis Task 
545   // usage ProcessLocalEsdFile(xmlFile)
546   //              xmlFile: is the local xml file with the ESD collection ( ex: esdCollection.xml) 
547  
548   Bool_t rv = kTRUE ;  
549   
550   printf("*** Process       ***\n");
551   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
552   printf("***  Coll   = |%s|             \n",xmlFile);                  
553
554   TAlienCollection * collection = TAlienCollection::Open(xmlFile) ; 
555   if (! collection) {
556     AliError(Form("%s not found", xmlFile)) ; 
557     return kFALSE ; 
558   }
559
560   TGridResult* result = collection->GetGridResult("");
561   TList* analysisfilelist = result->GetFileInfoList();
562   
563   // Makes the ESD chain 
564   printf("*** Getting the Chain       ***\n");
565   TChain* analysisChain = new TChain(fESDTreeName);
566   analysisChain->AddFileInfoList(analysisfilelist);
567  
568   // Process the events
569   rv = ProcessChain(analysisChain) ; 
570
571   return rv ; 
572 }
573
574 //______________________________________________________________________
575 const Bool_t AliAnalysisGoodies::ProcessTagXmlCollection(const char * xmlFile, AliRunTagCuts *runCuts, AliEventTagCuts * evtCuts) const   
576 {
577   // process the events in a xml ESD collection  with an Analysis Task 
578   // usage ProcessLocalEsdFile(xmlFile)
579   //              xmlFile: is the local xml file with the tag collection ( ex: tagCollection.xml) 
580  
581   Bool_t rv = kTRUE ;  
582   
583   if ( !evtCuts && !runCuts ) {
584     AliError("No Tag cuts provided") ; 
585     return kFALSE ; 
586   }
587
588   printf("*** Process       ***\n");
589   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
590   printf("***  Coll   = |%s|             \n",xmlFile);                  
591  
592   // check if file is local or alien
593   if ( gSystem->AccessPathName(xmlFile) ) 
594     TGrid::Connect("alien://"); 
595
596   TAlienCollection * collection = TAlienCollection::Open(xmlFile) ; 
597   if (! collection) {
598     AliError(Form("%s not found", xmlFile)) ; 
599     return kFALSE ; 
600   }
601
602   TGridResult* result = collection->GetGridResult("");
603   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
604   tagAna->ChainGridTags(result);
605   
606   // Query the tag file and make the analysis chain
607   TChain * analysisChain = new TChain(fESDTreeName)  ;
608   analysisChain = tagAna->QueryTags(runCuts, evtCuts);
609
610   // Process the events
611   rv = ProcessChain(analysisChain) ; 
612
613   return rv ; 
614 }
615
616 //______________________________________________________________________
617 // const Bool_t AliAnalysisGoodies::ProcessTagXmlCollection(const char * xmlFile, const char * runCuts, const char * evtCuts) const   
618 // {
619 //   // process the events in a xml ESD collection  with an Analysis Task 
620 //   // usage ProcessLocalEsdFile(xmlFile)
621 //   //              xmlFile: is the local xml file with the tag collection ( ex: tagCollection.xml) 
622  
623 //   Bool_t rv = kTRUE ;  
624
625 //  if ( !evtCuts && !runCuts ) {
626 //     AliError("No Tag cuts provided") ; 
627 //     return kFALSE ; 
628 //   }
629
630 //   printf("*** Process       ***\n");
631 //   printf("***  Wk-Dir = |%s|             \n",gSystem->WorkingDirectory());
632 //   printf("***  Coll   = |%s|             \n",xmlFile);               
633  
634 //   // check if file is local or alien
635 //   if ( gSystem->AccessPathName(xmlFile) ) 
636 //     TGrid::Connect("alien://"); 
637
638 //   TAlienCollection * collection = TAlienCollection::Open(xmlFile) ; 
639 //   if (! collection) {
640 //     AliError(Form("%s not found", xmlFile)) ; 
641 //     return kFALSE ; 
642 //   }
643
644 //   TGridResult* result = collection->GetGridResult("");
645 //   AliTagAnalysis * tagAna = new AliTagAnalysis(); 
646 //   tagAna->ChainGridTags(result);
647   
648 //   // Query the tag file and make the analysis chain
649 //   TChain * analysisChain = new TChain(fESDTreeName)  ;
650 //   analysisChain = tagAna->QueryTags(runCuts, evtCuts);
651
652 //   // Process the events
653 //   rv = ProcessChain(analysisChain) ; 
654
655 //   return rv ; 
656 // }
657
658 //______________________________________________________________________
659 const Bool_t AliAnalysisGoodies::Register( const char * lfndir, const char * pfndir, const char * file) 
660 {
661   // register files already stored in a MSS into the AliEn catalog
662   // usage: Register(lfndir, pfndir, pfnFileName)
663   //         lfndir : AliEn directory ( ex:  /alice/data/2006/LHC06c/PHOS_TestBeam/ ) 
664   //         pfndir : MSS directory   ( ex: /castor/cern.ch/alice/testbeam/phos/2006 )
665   //         file   : text file with a list of the file names to be registered
666
667   Bool_t rv = kTRUE ;  
668   fTimer.Start() ; 
669
670   ifstream in;
671   in.open(file);
672   if ( in.bad() ) {
673     AliError(Form("Cannot open file %s\n", file)) ; 
674     return kFALSE ; 
675   }
676
677   TGrid::Connect("alien://");
678
679   char fileName[1024] ;
680
681   while (1) {
682     in >> fileName ;
683     if (!in.good()) 
684       break;
685     char lfn[1024] ; 
686     
687     sprintf(lfn, "%s/%s", lfndir, fileName) ; 
688     
689     char pfn[1024] ; 
690     
691     sprintf(pfn, "castor://Alice::CERN::Castor2/%s/%s", pfndir, fileName) ;  
692         
693     printf("Register %s as %s\n", pfn, lfn) ; 
694     
695     gGrid->Register(lfn, pfn) ;
696   }
697   
698   fTimer.Stop();
699   fTimer.Print();
700   
701   return rv;
702 }
703  
704 //______________________________________________________________________
705 void AliAnalysisGoodies::SetTasks(Int_t nb, AliAnalysisTask ** taskList, TClass ** inputType, TClass ** outputType)
706 {
707   // define a task with its output and input type
708
709   
710   fnumberOfTasks= nb; 
711   fTaskList   = taskList ;
712   fTaskInType = inputType ; 
713   fTaskOuType = outputType ; 
714 }