ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/Analysis.cc
Revision: 1.28
Committed: Wed Mar 11 10:07:40 2009 UTC (16 years, 1 month ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.27: +15 -4 lines
Log Message:
First attempt to get skimmed info.

File Contents

# User Rev Content
1 loizides 1.28 // $Id: Analysis.cc,v 1.27 2009/03/02 12:35:29 loizides Exp $
2 loizides 1.1
3 loizides 1.9 #include "MitAna/TreeMod/interface/Analysis.h"
4 loizides 1.1 #include <Riostream.h>
5     #include <TFile.h>
6     #include <TList.h>
7     #include <TDSet.h>
8     #include <TChain.h>
9     #include <TObjString.h>
10     #include <TSystem.h>
11     #include <TProof.h>
12     #include <TROOT.h>
13 loizides 1.4 #include <TBrowser.h>
14 loizides 1.1 #include "MitAna/DataUtil/interface/Debug.h"
15 loizides 1.2 #include "MitAna/DataTree/interface/Names.h"
16 loizides 1.1 #include "MitAna/TAM/interface/TAMVirtualLoader.h"
17     #include "MitAna/TAM/interface/TAModule.h"
18 loizides 1.9 #include "MitAna/TreeMod/interface/Selector.h"
19 loizides 1.11 #include "MitAna/TreeMod/interface/TreeLoader.h"
20 loizides 1.18 #include "MitAna/TreeMod/interface/AnaFwkMod.h"
21 loizides 1.15 #include "MitAna/TreeMod/interface/HLTFwkMod.h"
22 loizides 1.22 #include "MitAna/Catalog/interface/Catalog.h"
23 paus 1.13 #include "MitAna/Catalog/interface/Dataset.h"
24 loizides 1.1
25     ClassImp(mithep::Analysis)
26    
27     using namespace mithep;
28    
29 loizides 1.12 //--------------------------------------------------------------------------------------------------
30 loizides 1.5 Analysis::Analysis(Bool_t useproof) :
31     fUseProof(useproof),
32 loizides 1.15 fUseHLT(kTRUE),
33 loizides 1.16 fHierarchy(kTRUE),
34 loizides 1.27 fDoProxy(kFALSE),
35     fDoObjTabClean(kTRUE),
36 loizides 1.5 fState(kPristine),
37     fNFriends(0),
38     fList(new TList),
39     fOutput(0),
40     fPackages(new TList),
41     fLoaders(new TList),
42 loizides 1.21 fSuperMods(new TList),
43 loizides 1.5 fSelector(0),
44     fChain(0),
45     fSet(0),
46     fDeleteList(new TList),
47 loizides 1.8 fTreeName(Names::gkEvtTreeName),
48 loizides 1.28 fCompLevel(7),
49 loizides 1.5 fProof(0),
50 bendavid 1.24 fDoNEvents(TChain::kBigNumber),
51 loizides 1.28 fCacheSize(64*1024*1024)
52 loizides 1.4 {
53     // Default constructor.
54    
55     fList->SetOwner();
56     fDeleteList->SetOwner();
57    
58     /* default packages for PROOF upload */
59     fPackages->SetOwner();
60     // nothing to be done since we do not use par files (yet?)
61 loizides 1.1 }
62    
63 loizides 1.12 //--------------------------------------------------------------------------------------------------
64 loizides 1.1 Analysis::~Analysis()
65     {
66 loizides 1.4 // Destructor.
67 loizides 1.1
68 loizides 1.4 if (fState == kInit || fState == kRun)
69     Terminate();
70 loizides 1.1
71 loizides 1.4 delete fList;
72 paus 1.7 delete fPackages;
73     delete fLoaders;
74 loizides 1.4 delete fDeleteList;
75     delete fSelector;
76 loizides 1.21 delete fSuperMods;
77     fOutput = 0; // owned by TAM
78 loizides 1.1
79 loizides 1.4 delete fProof;
80 loizides 1.1 }
81    
82 loizides 1.12 //--------------------------------------------------------------------------------------------------
83 loizides 1.22 Bool_t Analysis::AddDataset(const Dataset *dataset)
84     {
85     // Add a full dataset to the analysis.
86    
87     Bool_t status = true;
88    
89     for (UInt_t i=0; i<dataset->NFiles(); ++i)
90     status = (status && AddFile(dataset->FileUrl(i)));
91    
92     return status;
93     }
94    
95     //--------------------------------------------------------------------------------------------------
96 loizides 1.5 Bool_t Analysis::AddFile(const char *pname)
97 loizides 1.1 {
98 paus 1.7 // Add file with given name to the list of files to be processed. Using the token "|", you can
99     // specify an arbritray number of paths to tree files that will be concatenated as friend trees.
100 loizides 1.4
101     if (fState != kPristine) {
102     Error("AddFile", "Analysis already initialized");
103     return kFALSE;
104     }
105    
106     TString pnamestr(pname);
107 loizides 1.22 if (pnamestr.IsNull())
108     return kFALSE;
109    
110 loizides 1.4 TString tok("|");
111     TObjArray *arr = pnamestr.Tokenize(tok);
112 loizides 1.22 if (!arr)
113     return kFALSE;
114    
115 loizides 1.4 TString msg;
116 loizides 1.22 for (Int_t i=0; i<arr->GetEntries(); ++i) {
117    
118 loizides 1.4 TObjString *dummy = dynamic_cast<TObjString*>(arr->At(i));
119 loizides 1.22 if (!dummy)
120     continue;
121 loizides 1.1
122 loizides 1.4 AddFile(dummy->GetName(),i);
123 loizides 1.22 if (i==0)
124     msg=dummy->GetName();
125     else
126     Info("AddFile", "Add file %s as friend to %s", dummy->GetName(), msg.Data());
127 loizides 1.4 }
128     delete arr;
129 loizides 1.1
130 loizides 1.4 return kTRUE;
131 loizides 1.1 }
132    
133 loizides 1.12 //--------------------------------------------------------------------------------------------------
134 loizides 1.1 void Analysis::AddFile(const char *pname, Int_t eventlist)
135     {
136 paus 1.7 // Add file name to the event list specified by eventlist. The lists are used to hold filenames of
137     // different types of events. In case you dont want friend trees, just give no eventlist argument
138     // (default 0).
139 loizides 1.1
140 loizides 1.4 MitAssert("AddFile", pname != 0);
141 loizides 1.1
142 loizides 1.4 TList *l = 0;
143     if (eventlist >= 0 && eventlist < fNFriends) {
144 loizides 1.1
145 loizides 1.4 l = dynamic_cast<TList*>(fList->At(eventlist));
146     if (!l) {
147     Fatal("AddFile", "Requested list %d not found!", eventlist);
148     return;
149     }
150 loizides 1.1
151 loizides 1.4 } else if (eventlist == fNFriends) {
152 loizides 1.1
153 loizides 1.4 l = new TList;
154     l->SetOwner();
155     fList->Add(l);
156 loizides 1.22 ++fNFriends;
157 loizides 1.4
158     } else if (eventlist < 0 || eventlist > fNFriends) {
159     Error("AddFile", "Specified list %d not in [0,%d]", eventlist, fNFriends);
160     return;
161     }
162 loizides 1.1
163 loizides 1.19 if (!IsValidName(pname)) return;
164 loizides 1.1
165 loizides 1.4 l->Add(new TObjString(pname));
166 loizides 1.1
167 loizides 1.4 MDB(kAnalysis, 2)
168     Info("AddFile", "Added %s to list of files.", pname);
169 loizides 1.1 }
170    
171 loizides 1.12 //--------------------------------------------------------------------------------------------------
172 loizides 1.1 void Analysis::AddFile(const TObject *oname, Int_t eventlist)
173     {
174 paus 1.7 // Add file name to the event list specified by eventlist. The lists are used to hold filenames of
175     // different types of events. In case you dont want mixing, just give no eventlist argument
176     // (default 0).
177 loizides 1.1
178 loizides 1.4 MitAssert("AddFile", oname != 0);
179 loizides 1.1
180 loizides 1.4 return AddFile(oname->GetName(), eventlist);
181 loizides 1.1 }
182    
183 loizides 1.5 //________________________________________________________________________
184     Bool_t Analysis::AddFiles(const char *pname, Int_t nmax)
185     {
186 paus 1.7 // Add files from text file with given name. If nmax>0, maximum nmax files will be added.
187 loizides 1.5
188     MitAssert("AddFiles", pname != 0);
189    
190     ifstream in;
191     in.open(pname);
192     if (!in) {
193     Error("AddFiles", "Can not open file with name %s", pname);
194     return kFALSE;
195     }
196    
197     Int_t fc = 0;
198     while (in) {
199     TString line;
200     line.ReadLine(in);
201     cout << line << endl;
202     if (!line.EndsWith(".root"))
203     continue;
204     cout << line << endl;
205    
206     if (!AddFile(line)) {
207     Error("AddFiles", "Error adding file with name %s", line.Data());
208     return kFALSE;
209     }
210    
211     ++fc;
212 loizides 1.19 if (nmax>0 && fc>=nmax) {
213 loizides 1.5 Info("AddFiles", "Maximal number (%d) of files added", nmax);
214     break;
215     }
216     }
217    
218     return kTRUE;
219     }
220    
221 loizides 1.12 //--------------------------------------------------------------------------------------------------
222 loizides 1.1 void Analysis::AddList(TList *list, Int_t eventlist)
223     {
224 paus 1.7 // Add file name to the event list specified by eventlist. The lists are used to hold filenames of
225     // different types of events. In case you dont want mixing, just give no eventlist argument
226     // (default 0).
227 loizides 1.4
228     MitAssert("AddList", list != 0);
229    
230     TIter next(list);
231     while (TObject *obj = next())
232     AddFile(obj->GetName(), eventlist);
233 loizides 1.1 }
234    
235 loizides 1.12 //--------------------------------------------------------------------------------------------------
236 loizides 1.1 void Analysis::AddLoader(TAMVirtualLoader *l)
237     {
238 loizides 1.4 // Add loader to the list of loaders.
239 loizides 1.1
240 loizides 1.4 fLoaders->Add(l);
241 loizides 1.1 }
242    
243 loizides 1.12 //--------------------------------------------------------------------------------------------------
244 loizides 1.1 void Analysis::AddPackage(const char* name)
245     {
246 loizides 1.4 // Add package to the list of uploaded packages.
247 loizides 1.1
248 loizides 1.4 MitAssert("AddPackage", name != 0);
249     fPackages->Add(new TObjString(name));
250 loizides 1.1 }
251    
252 loizides 1.12 //--------------------------------------------------------------------------------------------------
253 loizides 1.1 void Analysis::AddPackages(TList *list)
254     {
255 loizides 1.4 // Add list of packages to the list of uploaded packages.
256 loizides 1.1
257 loizides 1.4 MitAssert("AddPackage", list != 0);
258 loizides 1.1
259 loizides 1.4 TIter next(list);
260     while (TObject *obj = next()) {
261     fPackages->Add(new TObjString(obj->GetName()));
262     }
263 loizides 1.1 }
264    
265 loizides 1.12 //--------------------------------------------------------------------------------------------------
266 loizides 1.21 void Analysis::AddSuperModule(TAModule *mod)
267     {
268     // Add a top-level module to list of top-level (super) modules.
269    
270     fSuperMods->Add(mod);
271     }
272    
273     //--------------------------------------------------------------------------------------------------
274 loizides 1.28 void Analysis::EventLoop()
275     {
276     // TODO
277    
278     //if (fTreeName==fAllTreeName)
279     fChain->Process(fSelector,"",fDoNEvents);
280    
281    
282     }
283    
284     //--------------------------------------------------------------------------------------------------
285 loizides 1.22 void Analysis::FileInputFromEnv()
286     {
287     // Attempt to get list of filesets/files from environment.
288    
289     TString catalog(gSystem->Getenv("MIT_CATALOG"));
290     TString book(gSystem->Getenv("MIT_BOOK"));
291     TString dataset(gSystem->Getenv("MIT_DATASET"));
292     TString filesets(gSystem->Getenv("MIT_FILESETS"));
293     TString files(gSystem->Getenv("MIT_FILES"));
294    
295     if ((catalog.IsNull() || book.IsNull() || dataset.IsNull()) && files.IsNull()) {
296     Warning("FileInputFromEnv", "Called to get file info from environment, but did not get"
297 loizides 1.23 " consistent set of variables:\n\tMIT_CATALOG=%s\n\tMIT_BOOK=%s\n\t"
298 loizides 1.22 "MIT_DATASET=%s\n\tMIT_FILESETS=%s\n\tMIT_FILES=%s\n",
299     catalog.Data(), book.Data(), dataset.Data(), filesets.Data(), files.Data());
300     return;
301     }
302    
303     if (!files.IsNull()) { // add local files
304     Info("FileInputFromEnv", "Got from environment:\n"
305     "\n\tMIT_FILES=%s\n", files.Data());
306     TString tok(";");
307     TObjArray *arr = files.Tokenize(tok);
308     if (arr) {
309     for (Int_t i=0; i<arr->GetEntries(); ++i) {
310     TObjString *dummy = dynamic_cast<TObjString*>(arr->At(i));
311     if (!dummy) continue;
312     AddFile(dummy->GetName(),0);
313     }
314     delete arr;
315     }
316     return;
317     }
318    
319     Info("FileInputFromEnv", "Got from environment:\n"
320 loizides 1.23 "\tMIT_CATALOG=%s\n\tMIT_BOOK=%s\n\tMIT_DATASET=%s\n\tMIT_FILESETS=%s\n",
321 loizides 1.22 catalog.Data(), book.Data(), dataset.Data(), filesets.Data());
322    
323     Catalog cat(catalog);
324 loizides 1.25 if (filesets.IsNull()) {
325     Dataset *d = cat.FindDataset(book, dataset);
326     if (d) {
327 loizides 1.22 AddDataset(d);
328     delete d;
329     }
330 loizides 1.25 } else {
331     TString tok(";");
332     TObjArray *arr = filesets.Tokenize(tok);
333     if (arr) {
334     for (Int_t i=0; i<arr->GetEntries(); ++i) {
335     TObjString *fileset = dynamic_cast<TObjString*>(arr->At(i));
336     if (!fileset) continue;
337     Dataset *d = cat.FindDataset(book, dataset, fileset->String());
338     if (!d)
339     continue;
340     AddDataset(d);
341     delete d;
342     }
343     delete arr;
344     }
345 loizides 1.22 }
346     }
347    
348     //--------------------------------------------------------------------------------------------------
349 loizides 1.1 Bool_t Analysis::Init()
350     {
351 paus 1.7 // Setup the TDSet and TChain to be used for the analysis with or without PROOF. If more than one
352     // list of file names was given, friend trees are supported.
353 loizides 1.4
354     if (fState == kRun || fState == kInit) {
355     Error("Init", "Init in state %d is not possible! Call Terminate() first.",
356     Int_t(fState));
357     return kFALSE;
358     }
359    
360 loizides 1.22 // check if we should attempt to get filesets/filenames from environment
361     if (fNFriends == 0)
362     FileInputFromEnv();
363    
364 loizides 1.4 if (fNFriends <= 0) {
365     Error("Init", "List of friend lists is empty!");
366     return kFALSE;
367     }
368    
369 loizides 1.21 if (!fSuperMods->First()) {
370 loizides 1.4 Error("Init", "Top-level TAM module is NULL!");
371     return kFALSE;
372     }
373    
374     if (fUseProof) { // first init our PROOF session
375 loizides 1.22 if (!InitProof())
376     return kFALSE;
377 loizides 1.4 }
378    
379     // we do this here instead in Terminate() so that
380     // we can browse the output even after Terminate()
381     delete fSelector;
382     fSelector = 0;
383    
384     fChain = new TChain(fTreeName);
385     fSet = new TDSet("TTree",fTreeName);
386 bendavid 1.24
387     fChain->SetCacheSize(fCacheSize);
388 loizides 1.4
389 loizides 1.22 for (Int_t i=0; i<fNFriends; ++i) {
390 loizides 1.4
391     TList *l = dynamic_cast<TList*>(fList->At(i));
392     if (!l) {
393     Fatal("Init", "List %d not found!", i);
394 loizides 1.1 return kFALSE;
395 loizides 1.4 }
396    
397     if (i == 0) {
398     TIter next(l);
399 loizides 1.22 while (TObjString *obj = dynamic_cast<TObjString*>(next())) {
400 loizides 1.4 fChain->Add(obj->GetName());
401     fSet->Add(obj->GetName());
402     }
403 loizides 1.1
404 loizides 1.4 } else {
405 loizides 1.1
406 loizides 1.4 TChain *chain = new TChain(fTreeName);
407     TDSet *set = new TDSet("TTree",fTreeName);
408 loizides 1.1
409 loizides 1.4 TIter next(l);
410     while (TObjString *obj = dynamic_cast<TObjString*>(next())) {
411     chain->Add(obj->GetName());
412     set->Add(obj->GetName());
413 loizides 1.1 }
414    
415 loizides 1.4 TString alias("TAMTREE_"); // aliases currently not used
416     alias+=i;
417 loizides 1.1
418 loizides 1.4 fChain->AddFriend(chain,alias.Data());
419     fSet->AddFriend(set,alias.Data());
420 loizides 1.1
421 loizides 1.4 fDeleteList->Add(chain);
422     fDeleteList->Add(set);
423     }
424 loizides 1.1
425 loizides 1.4 }
426 loizides 1.1
427 loizides 1.11 // create our customized loader plugin for TAM
428     TreeLoader *bl = new TreeLoader;
429     fLoaders->Add(bl);
430     fDeleteList->Add(bl);
431 loizides 1.1
432 loizides 1.18 // create our ana framework module
433     AnaFwkMod *anamod = new AnaFwkMod;
434     fDeleteList->Add(anamod);
435    
436 loizides 1.15 // create our HLT framework module
437     HLTFwkMod *hltmod = 0;
438     if (fUseHLT) {
439     hltmod = new HLTFwkMod;
440     fDeleteList->Add(hltmod);
441     }
442    
443 loizides 1.4 if (fUseProof) {
444 loizides 1.1
445 loizides 1.18 fProof->AddInput(anamod);
446 loizides 1.15 if (hltmod)
447     fProof->AddInput(hltmod);
448    
449 loizides 1.21 TIter iter(fSuperMods->MakeIterator());
450     while (1) {
451     TAModule *next = dynamic_cast<TAModule*>(iter.Next());
452     if (!next) break;
453     fProof->AddInput(next);
454     }
455    
456 loizides 1.4 fLoaders->SetName("TAM_LOADERS");
457     fProof->AddInput(fLoaders);
458 loizides 1.1
459 loizides 1.4 } else {
460 loizides 1.1
461 loizides 1.4 // when not running Proof, we must make a selector
462 loizides 1.9 fSelector = new Selector;
463 loizides 1.16 fSelector->SetDoProxy(fDoProxy);
464 loizides 1.27 fSelector->SetDoObjTabClean(fDoObjTabClean);
465 loizides 1.18
466     fSelector->AddInput(anamod);
467    
468 loizides 1.15 if (hltmod)
469     fSelector->AddInput(hltmod);
470 loizides 1.21
471     TIter iter(fSuperMods->MakeIterator());
472     while (1) {
473     TAModule *next = dynamic_cast<TAModule*>(iter.Next());
474     if (!next) break;
475     fSelector->AddInput(next);
476     }
477    
478 loizides 1.4 MDB(kAnalysis, 2)
479     fSelector->SetVerbosity(1);
480 loizides 1.1
481 loizides 1.4 // pass loaders to selector
482     TIter next(fLoaders);
483 loizides 1.22 while (TAMVirtualLoader *l = dynamic_cast<TAMVirtualLoader*>(next()))
484 loizides 1.4 fSelector->AddLoader(l);
485     }
486 loizides 1.1
487 loizides 1.4 fState = kInit;
488     return kTRUE;
489 loizides 1.1 }
490    
491 loizides 1.12 //--------------------------------------------------------------------------------------------------
492 loizides 1.1 Bool_t Analysis::InitProof()
493     {
494 loizides 1.4 // Initialize PROOF connection.
495 loizides 1.1
496 loizides 1.19 if (fProof && fProof->IsValid())
497 loizides 1.4 return kTRUE;
498 loizides 1.1
499 loizides 1.4 delete fProof;
500 loizides 1.1
501 loizides 1.4 if (fMaster.Contains("rcf.bnl.gov")) {
502 loizides 1.22 for (Int_t i=0; i<5; ++i) {
503 loizides 1.4 Warning("InitProof", "*** DID YOU RUN PROOF_KINIT? %d (5) ***", i);
504     gSystem->Sleep(1000);
505     }
506     }
507    
508     MDB(kAnalysis, 1)
509     Info("InitProof", "Starting PROOF on master %s with config %s",
510     fMaster.Data(), fConfig.Data());
511    
512     fProof = dynamic_cast<TProof*>(TProof::Open(fMaster, fConfig));
513     if (!fProof) {
514     Error("InitProof", "Could not start PROOF!");
515     return kFALSE;
516     }
517    
518     MDB(kAnalysis, 3)
519     gROOT->Print();
520    
521     //fProof->AddInput(new TNamed("PROOF_NewPacketizer",""));
522    
523     Bool_t ret=kTRUE;
524     if (fPackages) {
525     // tell Proof what additional libraries we will need on each worker computer
526     ret = UploadPackages(fPackages);
527     }
528 loizides 1.1
529 loizides 1.4 return ret;
530 loizides 1.1 }
531    
532 loizides 1.12 //--------------------------------------------------------------------------------------------------
533 loizides 1.1 void Analysis::Run()
534     {
535 loizides 1.4 // Run the analysis on the created file set.
536 loizides 1.1
537 loizides 1.4 if (fState == kPristine || fState == kRun) {
538     Error("Run", "Run in state %d is not possible! Call Init() first.",
539     Int_t(fState));
540     }
541 loizides 1.1
542 loizides 1.4 if (fUseProof) {
543 loizides 1.1
544 loizides 1.4 MDB(kAnalysis, 1)
545     Info("Run", "Start processing with PROOF...");
546 loizides 1.1
547 loizides 1.9 fSet->Process("Selector","",fDoNEvents);
548 loizides 1.1
549 loizides 1.4 } else {
550 loizides 1.1
551 loizides 1.4 MDB(kAnalysis, 1)
552     Info("Run", "Start processing (no PROOF)...");
553 loizides 1.1
554 loizides 1.28 EventLoop();
555 loizides 1.4 }
556 loizides 1.1
557 loizides 1.4 MDB(kAnalysis, 1)
558     Info("Run", "Processing complete!");
559 loizides 1.1
560 loizides 1.4 fState = kRun;
561 loizides 1.1 }
562    
563 loizides 1.12 //--------------------------------------------------------------------------------------------------
564 loizides 1.4 Bool_t Analysis::Run(Bool_t browse)
565 loizides 1.1 {
566 loizides 1.4 // Execute analysis and open TBrowser if requested.
567 loizides 1.1
568 loizides 1.4 if (Init()) {
569     Run();
570     Terminate();
571 paus 1.7 if (browse) {
572 loizides 1.4 new TBrowser;
573     }
574     return kTRUE;
575     }
576 loizides 1.1
577 loizides 1.4 Error("Execute", "Could not initialize analysis.");
578     return kFALSE;
579     }
580 loizides 1.1
581 loizides 1.12 //--------------------------------------------------------------------------------------------------
582 loizides 1.21 void Analysis::SetSuperModule(TAModule *mod)
583     {
584     // Set the first top-level module in the list of top-level (super) modules.
585    
586     fSuperMods->AddFirst(mod);
587     }
588    
589     //--------------------------------------------------------------------------------------------------
590 loizides 1.4 void Analysis::Terminate()
591     {
592     // Terminate current analysis run.
593 loizides 1.1
594 loizides 1.4 if (fState == kPristine || fState == kTerminate) {
595     Error("Terminate", "Terminate in state %d is not possible! Call Init() first.",
596     Int_t(fState));
597     return;
598     }
599    
600     if (fState == kRun) {
601    
602     if (fUseProof) {
603     // the output list from Proof can (in principal) contain other objects
604     // besides the module output hierarchy.
605     TList* outputlist = fProof->GetOutputList();
606     TIter nextOut(outputlist);
607     while (TObject *obj = nextOut()) {
608     if (obj->InheritsFrom(TAMOutput::Class())) {
609     fOutput = dynamic_cast<TList*>(obj);
610     break;
611     }
612     }
613    
614     } else {
615     fOutput = fSelector->GetModOutput();
616     }
617    
618 loizides 1.20
619    
620 loizides 1.4 if (fOutput && !fAnaOutput.IsNull()) {
621     TDirectory::TContext context(0); // automatically restore gDirectory
622    
623     std::auto_ptr<TFile> outf(TFile::Open(fAnaOutput,"recreate","", fCompLevel));
624     if (outf.get() == 0) {
625     Error("Terminate", "Could not open file %s for output!", fAnaOutput.Data());
626 loizides 1.1 } else {
627 loizides 1.4 MDB(kAnalysis, 1)
628     Info("Terminate", "Saving output to %s!", fAnaOutput.Data());
629 loizides 1.1
630 loizides 1.16 if (fHierarchy)
631 loizides 1.20 fOutput->Write(0,-99);
632 loizides 1.4 else
633     fOutput->Write();
634 loizides 1.1 }
635 loizides 1.4 }
636 loizides 1.17 // set state to terminate
637     fState = kTerminate;
638 loizides 1.4 }
639 loizides 1.1
640 loizides 1.4 delete fChain;
641     delete fSet;
642     fDeleteList->Delete();
643 loizides 1.1 }
644    
645 loizides 1.12 //--------------------------------------------------------------------------------------------------
646 loizides 1.1 Bool_t Analysis::UploadPackages(TList *packages)
647     {
648 loizides 1.4 // Upload list of par files to the server.
649 loizides 1.1
650 loizides 1.4 MitAssert("UploadPackages", packages != 0);
651 loizides 1.1
652 loizides 1.22 for (Int_t i=0; i<packages->GetEntries(); ++i) {
653 loizides 1.1
654 loizides 1.4 TObject* objstr = packages->At(i);
655 paus 1.7 if (!objstr) {
656 loizides 1.4 Error("InitProof", "Problem at package number %d!", i);
657     return kFALSE;
658     }
659 loizides 1.1
660 loizides 1.4 TString packname = objstr->GetName();
661 paus 1.7 Int_t en = 0;
662 loizides 1.4 if (packname.EndsWith("+")) {
663     en=1;
664     packname.Resize(packname.Length()-1);
665     }
666    
667     ifstream ftest(gSystem->ExpandPathName(packname.Data()),ios_base::binary);
668 paus 1.7 if (!ftest.good()) {
669 loizides 1.4 Error("InitProof", "Could not open %s for upload!", packname.Data());
670     return kFALSE;
671     }
672 loizides 1.1
673 paus 1.7 if (fProof->UploadPackage(packname)<0) {
674 loizides 1.4 Error("UploadPackage", "Upload for %s failed!", packname.Data());
675     return kFALSE;
676     }
677 loizides 1.1
678 loizides 1.4 if (en == 1) {
679     Int_t pos=packname.Last('/')+1;
680 paus 1.7 if (pos)
681     packname.Remove(0,pos);
682     if (fProof->EnablePackage(packname)<0) {
683 loizides 1.4 Error("UploadPackage", "Enabling for %s failed!", packname.Data());
684     return kFALSE;
685 loizides 1.1 }
686 loizides 1.4 }
687     }
688 loizides 1.1
689 loizides 1.4 return kTRUE;
690 loizides 1.1 }