ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/Analysis.cc
Revision: 1.35
Committed: Mon Jul 13 20:05:31 2009 UTC (15 years, 9 months ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_010
Changes since 1.34: +7 -2 lines
Log Message:
Added parallel unzipping. In my tests it did not show any difference so it is disabled.

File Contents

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