ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/Analysis.cc
Revision: 1.22
Committed: Thu Dec 11 15:29:09 2008 UTC (16 years, 4 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.21: +98 -30 lines
Log Message:
Added the possibility to specify filesets/files from environment. Read header file description if interested.

File Contents

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