ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/Analysis.cc
Revision: 1.39
Committed: Mon Mar 22 18:40:59 2010 UTC (15 years, 1 month ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_013d, Mit_013c, Mit_013b, Mit_013a, Mit_013
Changes since 1.38: +8 -2 lines
Log Message:
workaround for castor rfio syntax change

File Contents

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