ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/Analysis.cc
Revision: 1.38
Committed: Sun Jan 24 21:00:19 2010 UTC (15 years, 3 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_013pre1
Changes since 1.37: +2 -1 lines
Log Message:
Fix compiler errors and warnings moving to slc5_ia32_gcc434

File Contents

# User Rev Content
1 bendavid 1.38 // $Id: Analysis.cc,v 1.37 2009/10/26 11:04:03 loizides 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 loizides 1.4 l->Add(new TObjString(pname));
180 loizides 1.1
181 loizides 1.4 MDB(kAnalysis, 2)
182     Info("AddFile", "Added %s to list of files.", pname);
183 loizides 1.1 }
184    
185 loizides 1.12 //--------------------------------------------------------------------------------------------------
186 loizides 1.1 void Analysis::AddFile(const TObject *oname, Int_t eventlist)
187     {
188 paus 1.7 // Add file name to the event list specified by eventlist. The lists are used to hold filenames of
189     // different types of events. In case you dont want mixing, just give no eventlist argument
190     // (default 0).
191 loizides 1.1
192 loizides 1.4 MitAssert("AddFile", oname != 0);
193 loizides 1.1
194 loizides 1.4 return AddFile(oname->GetName(), eventlist);
195 loizides 1.1 }
196    
197 loizides 1.5 //________________________________________________________________________
198     Bool_t Analysis::AddFiles(const char *pname, Int_t nmax)
199     {
200 paus 1.7 // Add files from text file with given name. If nmax>0, maximum nmax files will be added.
201 loizides 1.5
202     MitAssert("AddFiles", pname != 0);
203    
204     ifstream in;
205     in.open(pname);
206     if (!in) {
207 loizides 1.31 Error("AddFiles", "Cannot open file with name %s", pname);
208 loizides 1.5 return kFALSE;
209     }
210    
211     Int_t fc = 0;
212     while (in) {
213     TString line;
214     line.ReadLine(in);
215     if (!line.EndsWith(".root"))
216     continue;
217    
218     if (!AddFile(line)) {
219     Error("AddFiles", "Error adding file with name %s", line.Data());
220     return kFALSE;
221     }
222    
223     ++fc;
224 loizides 1.19 if (nmax>0 && fc>=nmax) {
225 loizides 1.5 Info("AddFiles", "Maximal number (%d) of files added", nmax);
226     break;
227     }
228     }
229    
230     return kTRUE;
231     }
232    
233 loizides 1.12 //--------------------------------------------------------------------------------------------------
234 loizides 1.1 void Analysis::AddList(TList *list, Int_t eventlist)
235     {
236 paus 1.7 // Add file name to the event list specified by eventlist. The lists are used to hold filenames of
237     // different types of events. In case you dont want mixing, just give no eventlist argument
238     // (default 0).
239 loizides 1.4
240     MitAssert("AddList", list != 0);
241    
242     TIter next(list);
243     while (TObject *obj = next())
244     AddFile(obj->GetName(), eventlist);
245 loizides 1.1 }
246    
247 loizides 1.12 //--------------------------------------------------------------------------------------------------
248 loizides 1.1 void Analysis::AddLoader(TAMVirtualLoader *l)
249     {
250 loizides 1.4 // Add loader to the list of loaders.
251 loizides 1.1
252 loizides 1.4 fLoaders->Add(l);
253 loizides 1.1 }
254    
255 loizides 1.12 //--------------------------------------------------------------------------------------------------
256 loizides 1.1 void Analysis::AddPackage(const char* name)
257     {
258 loizides 1.4 // Add package to the list of uploaded packages.
259 loizides 1.1
260 loizides 1.4 MitAssert("AddPackage", name != 0);
261     fPackages->Add(new TObjString(name));
262 loizides 1.1 }
263    
264 loizides 1.12 //--------------------------------------------------------------------------------------------------
265 loizides 1.1 void Analysis::AddPackages(TList *list)
266     {
267 loizides 1.4 // Add list of packages to the list of uploaded packages.
268 loizides 1.1
269 loizides 1.4 MitAssert("AddPackage", list != 0);
270 loizides 1.1
271 loizides 1.4 TIter next(list);
272     while (TObject *obj = next()) {
273     fPackages->Add(new TObjString(obj->GetName()));
274     }
275 loizides 1.1 }
276    
277 loizides 1.12 //--------------------------------------------------------------------------------------------------
278 loizides 1.21 void Analysis::AddSuperModule(TAModule *mod)
279     {
280     // Add a top-level module to list of top-level (super) modules.
281    
282     fSuperMods->Add(mod);
283     }
284    
285     //--------------------------------------------------------------------------------------------------
286 loizides 1.22 void Analysis::FileInputFromEnv()
287     {
288     // Attempt to get list of filesets/files from environment.
289    
290     TString catalog(gSystem->Getenv("MIT_CATALOG"));
291     TString book(gSystem->Getenv("MIT_BOOK"));
292     TString dataset(gSystem->Getenv("MIT_DATASET"));
293     TString filesets(gSystem->Getenv("MIT_FILESETS"));
294     TString files(gSystem->Getenv("MIT_FILES"));
295    
296     if ((catalog.IsNull() || book.IsNull() || dataset.IsNull()) && files.IsNull()) {
297     Warning("FileInputFromEnv", "Called to get file info from environment, but did not get"
298 loizides 1.23 " consistent set of variables:\n\tMIT_CATALOG=%s\n\tMIT_BOOK=%s\n\t"
299 loizides 1.22 "MIT_DATASET=%s\n\tMIT_FILESETS=%s\n\tMIT_FILES=%s\n",
300     catalog.Data(), book.Data(), dataset.Data(), filesets.Data(), files.Data());
301     return;
302     }
303    
304     if (!files.IsNull()) { // add local files
305     Info("FileInputFromEnv", "Got from environment:\n"
306     "\n\tMIT_FILES=%s\n", files.Data());
307     TString tok(";");
308     TObjArray *arr = files.Tokenize(tok);
309     if (arr) {
310     for (Int_t i=0; i<arr->GetEntries(); ++i) {
311     TObjString *dummy = dynamic_cast<TObjString*>(arr->At(i));
312     if (!dummy) continue;
313     AddFile(dummy->GetName(),0);
314     }
315     delete arr;
316     }
317     return;
318     }
319    
320     Info("FileInputFromEnv", "Got from environment:\n"
321 loizides 1.23 "\tMIT_CATALOG=%s\n\tMIT_BOOK=%s\n\tMIT_DATASET=%s\n\tMIT_FILESETS=%s\n",
322 loizides 1.22 catalog.Data(), book.Data(), dataset.Data(), filesets.Data());
323    
324     Catalog cat(catalog);
325 loizides 1.25 if (filesets.IsNull()) {
326     Dataset *d = cat.FindDataset(book, dataset);
327     if (d) {
328 loizides 1.22 AddDataset(d);
329     delete d;
330     }
331 loizides 1.25 } else {
332     TString tok(";");
333     TObjArray *arr = filesets.Tokenize(tok);
334     if (arr) {
335     for (Int_t i=0; i<arr->GetEntries(); ++i) {
336     TObjString *fileset = dynamic_cast<TObjString*>(arr->At(i));
337     if (!fileset) continue;
338     Dataset *d = cat.FindDataset(book, dataset, fileset->String());
339     if (!d)
340     continue;
341     AddDataset(d);
342     delete d;
343     }
344     delete arr;
345     }
346 loizides 1.22 }
347     }
348    
349     //--------------------------------------------------------------------------------------------------
350 loizides 1.1 Bool_t Analysis::Init()
351     {
352 paus 1.7 // Setup the TDSet and TChain to be used for the analysis with or without PROOF. If more than one
353     // list of file names was given, friend trees are supported.
354 loizides 1.4
355     if (fState == kRun || fState == kInit) {
356     Error("Init", "Init in state %d is not possible! Call Terminate() first.",
357     Int_t(fState));
358     return kFALSE;
359     }
360    
361 loizides 1.22 // check if we should attempt to get filesets/filenames from environment
362     if (fNFriends == 0)
363     FileInputFromEnv();
364    
365 loizides 1.4 if (fNFriends <= 0) {
366     Error("Init", "List of friend lists is empty!");
367     return kFALSE;
368     }
369    
370 loizides 1.21 if (!fSuperMods->First()) {
371 loizides 1.4 Error("Init", "Top-level TAM module is NULL!");
372     return kFALSE;
373     }
374    
375     if (fUseProof) { // first init our PROOF session
376 loizides 1.22 if (!InitProof())
377     return kFALSE;
378 loizides 1.4 }
379    
380     // we do this here instead in Terminate() so that
381     // we can browse the output even after Terminate()
382     delete fSelector;
383     fSelector = 0;
384    
385     fChain = new TChain(fTreeName);
386     fSet = new TDSet("TTree",fTreeName);
387    
388 loizides 1.22 for (Int_t i=0; i<fNFriends; ++i) {
389 loizides 1.4 TList *l = dynamic_cast<TList*>(fList->At(i));
390     if (!l) {
391     Fatal("Init", "List %d not found!", i);
392 loizides 1.1 return kFALSE;
393 loizides 1.4 }
394    
395     if (i == 0) {
396     TIter next(l);
397 loizides 1.22 while (TObjString *obj = dynamic_cast<TObjString*>(next())) {
398 loizides 1.4 fChain->Add(obj->GetName());
399     fSet->Add(obj->GetName());
400 loizides 1.32 if (fCacheSize<0 && obj->GetString().Contains("/castor/"))
401 loizides 1.30 fCacheSize = 64*1024*1024;
402 loizides 1.4 }
403     } else {
404     TChain *chain = new TChain(fTreeName);
405     TDSet *set = new TDSet("TTree",fTreeName);
406 loizides 1.1
407 loizides 1.4 TIter next(l);
408     while (TObjString *obj = dynamic_cast<TObjString*>(next())) {
409     chain->Add(obj->GetName());
410     set->Add(obj->GetName());
411 loizides 1.32 if (fCacheSize<0 && obj->GetString().Contains("/castor/"))
412 loizides 1.30 fCacheSize = 64*1024*1024;
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.30 }
425 loizides 1.1
426 loizides 1.35 if (fParallel)
427     TTreeCacheUnzip::SetParallelUnzip(TTreeCacheUnzip::kEnable);
428    
429     if (fCacheSize>=0)
430 loizides 1.30 fChain->SetCacheSize(fCacheSize);
431 loizides 1.1
432 loizides 1.11 // create our customized loader plugin for TAM
433     TreeLoader *bl = new TreeLoader;
434     fLoaders->Add(bl);
435     fDeleteList->Add(bl);
436 loizides 1.1
437 loizides 1.18 // create our ana framework module
438     AnaFwkMod *anamod = new AnaFwkMod;
439 loizides 1.30 anamod->SetSkipNEvents(fSkipNEvents);
440 loizides 1.33 anamod->SetPrintScale(fPrintScale);
441 loizides 1.18 fDeleteList->Add(anamod);
442    
443 loizides 1.15 // create our HLT framework module
444     HLTFwkMod *hltmod = 0;
445     if (fUseHLT) {
446     hltmod = new HLTFwkMod;
447 loizides 1.36 hltmod->SetHLTObjsName(GetHLTObjsName());
448     hltmod->SetHLTTreeName(GetHLTTreeName());
449 loizides 1.15 fDeleteList->Add(hltmod);
450     }
451    
452 loizides 1.4 if (fUseProof) {
453 loizides 1.1
454 loizides 1.18 fProof->AddInput(anamod);
455 loizides 1.15 if (hltmod)
456     fProof->AddInput(hltmod);
457    
458 loizides 1.21 TIter iter(fSuperMods->MakeIterator());
459     while (1) {
460     TAModule *next = dynamic_cast<TAModule*>(iter.Next());
461     if (!next) break;
462     fProof->AddInput(next);
463     }
464    
465 loizides 1.4 fLoaders->SetName("TAM_LOADERS");
466     fProof->AddInput(fLoaders);
467 loizides 1.1
468 loizides 1.4 } else {
469 loizides 1.1
470 loizides 1.4 // when not running Proof, we must make a selector
471 loizides 1.36 Selector *sel = new Selector;
472     sel->SetDoProxy(fDoProxy);
473     sel->SetDoObjTabClean(fDoObjTabClean);
474     sel->SetDoRunInfo(kTRUE);
475     sel->SetAllEvtHdrBrn(GetAllEvtHdrBrn());
476     sel->SetAllEvtTreeName(GetAllEvtTreeName());
477     sel->SetEvtHdrName(GetEvtHdrName());
478     sel->SetLAHdrName(GetLAHdrName());
479     sel->SetLATreeName(GetLATreeName());
480     sel->SetRunInfoName(GetRunInfoName());
481     sel->SetRunTreeName(GetRunTreeName());
482     sel->AddInput(anamod);
483     fSelector = sel;
484 loizides 1.18
485 loizides 1.15 if (hltmod)
486     fSelector->AddInput(hltmod);
487 loizides 1.21
488     TIter iter(fSuperMods->MakeIterator());
489     while (1) {
490     TAModule *next = dynamic_cast<TAModule*>(iter.Next());
491     if (!next) break;
492     fSelector->AddInput(next);
493     }
494    
495 loizides 1.4 MDB(kAnalysis, 2)
496     fSelector->SetVerbosity(1);
497 loizides 1.1
498 loizides 1.4 // pass loaders to selector
499     TIter next(fLoaders);
500 loizides 1.22 while (TAMVirtualLoader *l = dynamic_cast<TAMVirtualLoader*>(next()))
501 loizides 1.4 fSelector->AddLoader(l);
502     }
503 loizides 1.1
504 loizides 1.4 fState = kInit;
505     return kTRUE;
506 loizides 1.1 }
507    
508 loizides 1.12 //--------------------------------------------------------------------------------------------------
509 loizides 1.1 Bool_t Analysis::InitProof()
510     {
511 loizides 1.4 // Initialize PROOF connection.
512 loizides 1.1
513 loizides 1.19 if (fProof && fProof->IsValid())
514 loizides 1.4 return kTRUE;
515 loizides 1.1
516 loizides 1.4 delete fProof;
517 loizides 1.1
518 loizides 1.4 if (fMaster.Contains("rcf.bnl.gov")) {
519 loizides 1.22 for (Int_t i=0; i<5; ++i) {
520 loizides 1.4 Warning("InitProof", "*** DID YOU RUN PROOF_KINIT? %d (5) ***", i);
521     gSystem->Sleep(1000);
522     }
523     }
524    
525     MDB(kAnalysis, 1)
526     Info("InitProof", "Starting PROOF on master %s with config %s",
527     fMaster.Data(), fConfig.Data());
528    
529     fProof = dynamic_cast<TProof*>(TProof::Open(fMaster, fConfig));
530     if (!fProof) {
531     Error("InitProof", "Could not start PROOF!");
532     return kFALSE;
533     }
534    
535     MDB(kAnalysis, 3)
536     gROOT->Print();
537    
538     //fProof->AddInput(new TNamed("PROOF_NewPacketizer",""));
539    
540     Bool_t ret=kTRUE;
541     if (fPackages) {
542     // tell Proof what additional libraries we will need on each worker computer
543     ret = UploadPackages(fPackages);
544     }
545 loizides 1.1
546 loizides 1.4 return ret;
547 loizides 1.1 }
548    
549 loizides 1.12 //--------------------------------------------------------------------------------------------------
550 loizides 1.1 void Analysis::Run()
551     {
552 loizides 1.4 // Run the analysis on the created file set.
553 loizides 1.1
554 loizides 1.4 if (fState == kPristine || fState == kRun) {
555     Error("Run", "Run in state %d is not possible! Call Init() first.",
556     Int_t(fState));
557     }
558 loizides 1.1
559 loizides 1.4 if (fUseProof) {
560 loizides 1.1
561 loizides 1.4 MDB(kAnalysis, 1)
562     Info("Run", "Start processing with PROOF...");
563 loizides 1.1
564 loizides 1.9 fSet->Process("Selector","",fDoNEvents);
565 loizides 1.1
566 loizides 1.4 } else {
567 loizides 1.1
568 loizides 1.4 MDB(kAnalysis, 1)
569     Info("Run", "Start processing (no PROOF)...");
570 loizides 1.1
571 loizides 1.29 fChain->Process(fSelector,"",fDoNEvents);
572 loizides 1.4 }
573 loizides 1.1
574 loizides 1.4 MDB(kAnalysis, 1)
575     Info("Run", "Processing complete!");
576 loizides 1.1
577 loizides 1.4 fState = kRun;
578 loizides 1.1 }
579    
580 loizides 1.12 //--------------------------------------------------------------------------------------------------
581 loizides 1.4 Bool_t Analysis::Run(Bool_t browse)
582 loizides 1.1 {
583 loizides 1.4 // Execute analysis and open TBrowser if requested.
584 loizides 1.1
585 loizides 1.4 if (Init()) {
586     Run();
587     Terminate();
588 paus 1.7 if (browse) {
589 loizides 1.4 new TBrowser;
590     }
591     return kTRUE;
592     }
593 loizides 1.1
594 loizides 1.4 Error("Execute", "Could not initialize analysis.");
595     return kFALSE;
596     }
597 loizides 1.1
598 loizides 1.12 //--------------------------------------------------------------------------------------------------
599 loizides 1.21 void Analysis::SetSuperModule(TAModule *mod)
600     {
601     // Set the first top-level module in the list of top-level (super) modules.
602    
603     fSuperMods->AddFirst(mod);
604     }
605    
606     //--------------------------------------------------------------------------------------------------
607 loizides 1.4 void Analysis::Terminate()
608     {
609     // Terminate current analysis run.
610 loizides 1.1
611 loizides 1.4 if (fState == kPristine || fState == kTerminate) {
612     Error("Terminate", "Terminate in state %d is not possible! Call Init() first.",
613     Int_t(fState));
614     return;
615     }
616    
617     if (fState == kRun) {
618    
619     if (fUseProof) {
620     // the output list from Proof can (in principal) contain other objects
621     // besides the module output hierarchy.
622     TList* outputlist = fProof->GetOutputList();
623     TIter nextOut(outputlist);
624     while (TObject *obj = nextOut()) {
625     if (obj->InheritsFrom(TAMOutput::Class())) {
626     fOutput = dynamic_cast<TList*>(obj);
627     break;
628     }
629     }
630    
631     } else {
632     fOutput = fSelector->GetModOutput();
633     }
634    
635 loizides 1.20
636    
637 loizides 1.4 if (fOutput && !fAnaOutput.IsNull()) {
638     TDirectory::TContext context(0); // automatically restore gDirectory
639    
640     std::auto_ptr<TFile> outf(TFile::Open(fAnaOutput,"recreate","", fCompLevel));
641     if (outf.get() == 0) {
642     Error("Terminate", "Could not open file %s for output!", fAnaOutput.Data());
643 loizides 1.1 } else {
644 loizides 1.4 MDB(kAnalysis, 1)
645     Info("Terminate", "Saving output to %s!", fAnaOutput.Data());
646 loizides 1.1
647 loizides 1.16 if (fHierarchy)
648 loizides 1.20 fOutput->Write(0,-99);
649 loizides 1.4 else
650     fOutput->Write();
651 loizides 1.1 }
652 loizides 1.4 }
653 loizides 1.17 // set state to terminate
654     fState = kTerminate;
655 loizides 1.4 }
656 loizides 1.1
657 loizides 1.4 delete fChain;
658     delete fSet;
659     fDeleteList->Delete();
660 loizides 1.1 }
661    
662 loizides 1.12 //--------------------------------------------------------------------------------------------------
663 loizides 1.1 Bool_t Analysis::UploadPackages(TList *packages)
664     {
665 loizides 1.4 // Upload list of par files to the server.
666 loizides 1.1
667 loizides 1.4 MitAssert("UploadPackages", packages != 0);
668 loizides 1.1
669 loizides 1.22 for (Int_t i=0; i<packages->GetEntries(); ++i) {
670 loizides 1.1
671 loizides 1.4 TObject* objstr = packages->At(i);
672 paus 1.7 if (!objstr) {
673 loizides 1.4 Error("InitProof", "Problem at package number %d!", i);
674     return kFALSE;
675     }
676 loizides 1.1
677 loizides 1.4 TString packname = objstr->GetName();
678 paus 1.7 Int_t en = 0;
679 loizides 1.4 if (packname.EndsWith("+")) {
680     en=1;
681     packname.Resize(packname.Length()-1);
682     }
683    
684     ifstream ftest(gSystem->ExpandPathName(packname.Data()),ios_base::binary);
685 paus 1.7 if (!ftest.good()) {
686 loizides 1.4 Error("InitProof", "Could not open %s for upload!", packname.Data());
687     return kFALSE;
688     }
689 loizides 1.1
690 paus 1.7 if (fProof->UploadPackage(packname)<0) {
691 loizides 1.4 Error("UploadPackage", "Upload for %s failed!", packname.Data());
692     return kFALSE;
693     }
694 loizides 1.1
695 loizides 1.4 if (en == 1) {
696     Int_t pos=packname.Last('/')+1;
697 paus 1.7 if (pos)
698     packname.Remove(0,pos);
699     if (fProof->EnablePackage(packname)<0) {
700 loizides 1.4 Error("UploadPackage", "Enabling for %s failed!", packname.Data());
701     return kFALSE;
702 loizides 1.1 }
703 loizides 1.4 }
704     }
705 loizides 1.1
706 loizides 1.4 return kTRUE;
707 loizides 1.1 }