ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/Analysis.cc
Revision: 1.41
Committed: Sun Oct 3 02:26:30 2010 UTC (14 years, 7 months ago) by paus
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_018, Mit_017, Mit_017pre3, Mit_017pre2, Mit_017pre1, Mit_016, Mit_015b, Mit_015a, Mit_015, Mit_014e, Mit_014d, Mit_014c
Changes since 1.40: +17 -9 lines
Log Message:
Patching a mysterious bug....

File Contents

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