ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/Analysis.cc
Revision: 1.7
Committed: Wed Jun 18 13:23:13 2008 UTC (16 years, 10 months ago) by paus
Content type: text/plain
Branch: MAIN
Changes since 1.6: +28 -31 lines
Log Message:
Basic structure of Filling framework.

File Contents

# User Rev Content
1 paus 1.7 // $Id: Analysis.cc,v 1.6 2008/06/11 23:36:37 paus Exp $
2 loizides 1.1
3     #include <Riostream.h>
4     #include <TFile.h>
5     #include <TList.h>
6     #include <TDSet.h>
7     #include <TChain.h>
8     #include <TObjString.h>
9     #include <TSystem.h>
10     #include <TProof.h>
11     #include <TROOT.h>
12 loizides 1.4 #include <TBrowser.h>
13 loizides 1.1 #include "MitAna/DataUtil/interface/Debug.h"
14 loizides 1.2 #include "MitAna/DataTree/interface/Names.h"
15 loizides 1.1 #include "MitAna/TAM/interface/TAMVirtualLoader.h"
16     #include "MitAna/TAM/interface/TAModule.h"
17     #include "MitAna/TAM/interface/TAMSelector.h"
18 paus 1.7 #include "MitAna/TreeMod/interface/Analysis.h"
19 loizides 1.1
20     ClassImp(mithep::Analysis)
21    
22     using namespace mithep;
23    
24     //__________________________________________________________________________________________________
25 loizides 1.5 Analysis::Analysis(Bool_t useproof) :
26     fUseProof(useproof),
27     fHierachy(kTRUE),
28     fState(kPristine),
29     fNFriends(0),
30     fList(new TList),
31     fOutput(0),
32     fPackages(new TList),
33     fLoaders(new TList),
34     fSuperMod(0),
35     fSelector(0),
36     fChain(0),
37     fSet(0),
38     fDeleteList(new TList),
39     fTreeName(Names::gkMitTreeName),
40     fCompLevel(2),
41     fProof(0),
42 paus 1.6 fDoNEvents(TChain::kBigNumber)
43 loizides 1.4 {
44     // Default constructor.
45    
46     fList->SetOwner();
47     fDeleteList->SetOwner();
48    
49     /* default packages for PROOF upload */
50     fPackages->SetOwner();
51     // nothing to be done since we do not use par files (yet?)
52 loizides 1.1 }
53    
54     //__________________________________________________________________________________________________
55     Analysis::~Analysis()
56     {
57 loizides 1.4 // Destructor.
58 loizides 1.1
59 loizides 1.4 if (fState == kInit || fState == kRun)
60     Terminate();
61 loizides 1.1
62 loizides 1.4 delete fList;
63 paus 1.7 delete fPackages;
64     delete fLoaders;
65 loizides 1.4 delete fDeleteList;
66     delete fSelector;
67     fOutput = 0; // owned by TAM
68     fSuperMod = 0; // owned by user
69 loizides 1.1
70 loizides 1.4 delete fProof;
71 loizides 1.1 }
72    
73     //__________________________________________________________________________________________________
74 loizides 1.5 Bool_t Analysis::AddFile(const char *pname)
75 loizides 1.1 {
76 paus 1.7 // Add file with given name to the list of files to be processed. Using the token "|", you can
77     // specify an arbritray number of paths to tree files that will be concatenated as friend trees.
78 loizides 1.4
79     if (fState != kPristine) {
80     Error("AddFile", "Analysis already initialized");
81     return kFALSE;
82     }
83    
84     TString pnamestr(pname);
85     TString tok("|");
86     TObjArray *arr = pnamestr.Tokenize(tok);
87     TString msg;
88 loizides 1.1
89 loizides 1.4 for(Int_t i=0; i<arr->GetEntries(); i++){
90 loizides 1.1
91 loizides 1.4 TObjString *dummy = dynamic_cast<TObjString*>(arr->At(i));
92     if(!dummy) continue;
93 loizides 1.1
94 loizides 1.4 AddFile(dummy->GetName(),i);
95     if(i==0) msg=dummy->GetName();
96     else {
97     Info("AddFile", "Add file %s as friend to %s",
98     dummy->GetName(), msg.Data());
99     }
100     }
101     delete arr;
102 loizides 1.1
103 loizides 1.4 return kTRUE;
104 loizides 1.1 }
105    
106 paus 1.7 //__________________________________________________________________________________________________
107 loizides 1.1 void Analysis::AddFile(const char *pname, Int_t eventlist)
108     {
109 paus 1.7 // Add file name to the event list specified by eventlist. The lists are used to hold filenames of
110     // different types of events. In case you dont want friend trees, just give no eventlist argument
111     // (default 0).
112 loizides 1.1
113 loizides 1.4 MitAssert("AddFile", pname != 0);
114 loizides 1.1
115 loizides 1.4 TList *l = 0;
116     if (eventlist >= 0 && eventlist < fNFriends) {
117 loizides 1.1
118 loizides 1.4 l = dynamic_cast<TList*>(fList->At(eventlist));
119     if (!l) {
120     Fatal("AddFile", "Requested list %d not found!", eventlist);
121     return;
122     }
123 loizides 1.1
124 loizides 1.4 } else if (eventlist == fNFriends) {
125 loizides 1.1
126 loizides 1.4 l = new TList;
127     l->SetOwner();
128     fList->Add(l);
129     fNFriends++;
130    
131     } else if (eventlist < 0 || eventlist > fNFriends) {
132     Error("AddFile", "Specified list %d not in [0,%d]", eventlist, fNFriends);
133     return;
134     }
135 loizides 1.1
136 loizides 1.4 if(!IsValidName(pname)) return;
137 loizides 1.1
138 loizides 1.4 l->Add(new TObjString(pname));
139 loizides 1.1
140 loizides 1.4 MDB(kAnalysis, 2)
141     Info("AddFile", "Added %s to list of files.", pname);
142 loizides 1.1 }
143    
144     //__________________________________________________________________________________________________
145     void Analysis::AddFile(const TObject *oname, Int_t eventlist)
146     {
147 paus 1.7 // Add file name to the event list specified by eventlist. The lists are used to hold filenames of
148     // different types of events. In case you dont want mixing, just give no eventlist argument
149     // (default 0).
150 loizides 1.1
151 loizides 1.4 MitAssert("AddFile", oname != 0);
152 loizides 1.1
153 loizides 1.4 return AddFile(oname->GetName(), eventlist);
154 loizides 1.1 }
155    
156 loizides 1.5 //________________________________________________________________________
157     Bool_t Analysis::AddFiles(const char *pname, Int_t nmax)
158     {
159 paus 1.7 // Add files from text file with given name. If nmax>0, maximum nmax files will be added.
160 loizides 1.5
161     MitAssert("AddFiles", pname != 0);
162    
163     ifstream in;
164     in.open(pname);
165     if (!in) {
166     Error("AddFiles", "Can not open file with name %s", pname);
167     return kFALSE;
168     }
169    
170     Int_t fc = 0;
171     while (in) {
172     TString line;
173     line.ReadLine(in);
174     cout << line << endl;
175     if (!line.EndsWith(".root"))
176     continue;
177     cout << line << endl;
178    
179     if (!AddFile(line)) {
180     Error("AddFiles", "Error adding file with name %s", line.Data());
181     return kFALSE;
182     }
183    
184     ++fc;
185     if(nmax>0 && fc>=nmax) {
186     Info("AddFiles", "Maximal number (%d) of files added", nmax);
187     break;
188     }
189     }
190    
191     return kTRUE;
192     }
193    
194 loizides 1.1 //__________________________________________________________________________________________________
195     void Analysis::AddList(TList *list, Int_t eventlist)
196     {
197 paus 1.7 // Add file name to the event list specified by eventlist. The lists are used to hold filenames of
198     // different types of events. In case you dont want mixing, just give no eventlist argument
199     // (default 0).
200 loizides 1.4
201     MitAssert("AddList", list != 0);
202    
203     TIter next(list);
204     while (TObject *obj = next())
205     AddFile(obj->GetName(), eventlist);
206 loizides 1.1 }
207    
208     //__________________________________________________________________________________________________
209     void Analysis::AddLoader(TAMVirtualLoader *l)
210     {
211 loizides 1.4 // Add loader to the list of loaders.
212 loizides 1.1
213 loizides 1.4 fLoaders->Add(l);
214 loizides 1.1 }
215    
216     //__________________________________________________________________________________________________
217     void Analysis::AddPackage(const char* name)
218     {
219 loizides 1.4 // Add package to the list of uploaded packages.
220 loizides 1.1
221 loizides 1.4 MitAssert("AddPackage", name != 0);
222     fPackages->Add(new TObjString(name));
223 loizides 1.1 }
224    
225     //__________________________________________________________________________________________________
226     void Analysis::AddPackages(TList *list)
227     {
228 loizides 1.4 // Add list of packages to the list of uploaded packages.
229 loizides 1.1
230 loizides 1.4 MitAssert("AddPackage", list != 0);
231 loizides 1.1
232 loizides 1.4 TIter next(list);
233     while (TObject *obj = next()) {
234     fPackages->Add(new TObjString(obj->GetName()));
235     }
236 loizides 1.1 }
237    
238     //__________________________________________________________________________________________________
239     Bool_t Analysis::Init()
240     {
241 paus 1.7 // Setup the TDSet and TChain to be used for the analysis with or without PROOF. If more than one
242     // list of file names was given, friend trees are supported.
243 loizides 1.4
244     if (fState == kRun || fState == kInit) {
245     Error("Init", "Init in state %d is not possible! Call Terminate() first.",
246     Int_t(fState));
247     return kFALSE;
248     }
249    
250     if (fNFriends <= 0) {
251     Error("Init", "List of friend lists is empty!");
252     return kFALSE;
253     }
254    
255     if (!fSuperMod) {
256     Error("Init", "Top-level TAM module is NULL!");
257     return kFALSE;
258     }
259    
260     if (fUseProof) { // first init our PROOF session
261     if (!InitProof()) return kFALSE;
262     }
263    
264     // we do this here instead in Terminate() so that
265     // we can browse the output even after Terminate()
266     delete fSelector;
267     fSelector = 0;
268    
269     fChain = new TChain(fTreeName);
270     fSet = new TDSet("TTree",fTreeName);
271    
272     for(Int_t i=0; i<fNFriends; i++){
273    
274     TList *l = dynamic_cast<TList*>(fList->At(i));
275     if (!l) {
276     Fatal("Init", "List %d not found!", i);
277 loizides 1.1 return kFALSE;
278 loizides 1.4 }
279    
280     if (i == 0) {
281     TIter next(l);
282     while ( TObjString *obj = dynamic_cast<TObjString*>(next()) ) {
283     fChain->Add(obj->GetName());
284     fSet->Add(obj->GetName());
285     }
286 loizides 1.1
287 loizides 1.4 } else {
288 loizides 1.1
289 loizides 1.4 TChain *chain = new TChain(fTreeName);
290     TDSet *set = new TDSet("TTree",fTreeName);
291 loizides 1.1
292 loizides 1.4 TIter next(l);
293     while (TObjString *obj = dynamic_cast<TObjString*>(next())) {
294     chain->Add(obj->GetName());
295     set->Add(obj->GetName());
296 loizides 1.1 }
297    
298 loizides 1.4 TString alias("TAMTREE_"); // aliases currently not used
299     alias+=i;
300 loizides 1.1
301 loizides 1.4 fChain->AddFriend(chain,alias.Data());
302     fSet->AddFriend(set,alias.Data());
303 loizides 1.1
304 loizides 1.4 fDeleteList->Add(chain);
305     fDeleteList->Add(set);
306     }
307 loizides 1.1
308 loizides 1.4 }
309 loizides 1.1
310 loizides 1.4 // if we had our default TAM plugin we would create it here
311     // TreeLoader *bl = new TreeLoader;
312     // fLoaders->Add(bl);
313     // fDeleteList->Add(bl);
314 loizides 1.1
315 loizides 1.4 if (fUseProof) {
316 loizides 1.1
317 loizides 1.4 fProof->AddInput(fSuperMod);
318     fLoaders->SetName("TAM_LOADERS");
319     fProof->AddInput(fLoaders);
320 loizides 1.1
321 loizides 1.4 } else {
322 loizides 1.1
323 loizides 1.4 // when not running Proof, we must make a selector
324     fSelector = new TAMSelector;
325     fSelector->AddInput(fSuperMod);
326     MDB(kAnalysis, 2)
327     fSelector->SetVerbosity(1);
328 loizides 1.1
329 loizides 1.4 // pass loaders to selector
330     TIter next(fLoaders);
331     while ( TAMVirtualLoader *l = dynamic_cast<TAMVirtualLoader*>(next()) )
332     fSelector->AddLoader(l);
333     }
334 loizides 1.1
335 loizides 1.4 fState = kInit;
336     return kTRUE;
337 loizides 1.1 }
338    
339     //__________________________________________________________________________________________________
340     Bool_t Analysis::InitProof()
341     {
342 loizides 1.4 // Initialize PROOF connection.
343 loizides 1.1
344 loizides 1.4 if(fProof && fProof->IsValid())
345     return kTRUE;
346 loizides 1.1
347 loizides 1.4 delete fProof;
348 loizides 1.1
349 loizides 1.4 if (fMaster.Contains("rcf.bnl.gov")) {
350     for(Int_t i=0;i<5;i++) {
351     Warning("InitProof", "*** DID YOU RUN PROOF_KINIT? %d (5) ***", i);
352     gSystem->Sleep(1000);
353     }
354     }
355    
356     MDB(kAnalysis, 1)
357     Info("InitProof", "Starting PROOF on master %s with config %s",
358     fMaster.Data(), fConfig.Data());
359    
360     fProof = dynamic_cast<TProof*>(TProof::Open(fMaster, fConfig));
361     if (!fProof) {
362     Error("InitProof", "Could not start PROOF!");
363     return kFALSE;
364     }
365    
366     MDB(kAnalysis, 3)
367     gROOT->Print();
368    
369     //fProof->AddInput(new TNamed("PROOF_NewPacketizer",""));
370    
371     Bool_t ret=kTRUE;
372     if (fPackages) {
373     // tell Proof what additional libraries we will need on each worker computer
374     ret = UploadPackages(fPackages);
375     }
376 loizides 1.1
377 loizides 1.4 return ret;
378 loizides 1.1 }
379    
380     //__________________________________________________________________________________________________
381     void Analysis::Run()
382     {
383 loizides 1.4 // Run the analysis on the created file set.
384 loizides 1.1
385 loizides 1.4 if (fState == kPristine || fState == kRun) {
386     Error("Run", "Run in state %d is not possible! Call Init() first.",
387     Int_t(fState));
388     }
389 loizides 1.1
390 loizides 1.4 if (fUseProof) {
391 loizides 1.1
392 loizides 1.4 MDB(kAnalysis, 1)
393     Info("Run", "Start processing with PROOF...");
394 loizides 1.1
395 loizides 1.5 fSet->Process("TAMSelector","",fDoNEvents);
396 loizides 1.1
397 loizides 1.4 } else {
398 loizides 1.1
399 loizides 1.4 MDB(kAnalysis, 1)
400     Info("Run", "Start processing (no PROOF)...");
401 loizides 1.1
402 loizides 1.5 fChain->Process(fSelector,"",fDoNEvents);
403 loizides 1.4 }
404 loizides 1.1
405 loizides 1.4 MDB(kAnalysis, 1)
406     Info("Run", "Processing complete!");
407 loizides 1.1
408 loizides 1.4 fState = kRun;
409 loizides 1.1 }
410    
411     //__________________________________________________________________________________________________
412 loizides 1.4 Bool_t Analysis::Run(Bool_t browse)
413 loizides 1.1 {
414 loizides 1.4 // Execute analysis and open TBrowser if requested.
415 loizides 1.1
416 loizides 1.4 if (Init()) {
417     Run();
418     Terminate();
419 paus 1.7 if (browse) {
420 loizides 1.4 new TBrowser;
421     }
422     return kTRUE;
423     }
424 loizides 1.1
425 loizides 1.4 Error("Execute", "Could not initialize analysis.");
426     return kFALSE;
427     }
428 loizides 1.1
429 loizides 1.4 //__________________________________________________________________________________________________
430     void Analysis::Terminate()
431     {
432     // Terminate current analysis run.
433 loizides 1.1
434 loizides 1.4 if (fState == kPristine || fState == kTerminate) {
435     Error("Terminate", "Terminate in state %d is not possible! Call Init() first.",
436     Int_t(fState));
437     return;
438     }
439    
440     if (fState == kRun) {
441    
442     if (fUseProof) {
443     // the output list from Proof can (in principal) contain other objects
444     // besides the module output hierarchy.
445     TList* outputlist = fProof->GetOutputList();
446     TIter nextOut(outputlist);
447     while (TObject *obj = nextOut()) {
448     if (obj->InheritsFrom(TAMOutput::Class())) {
449     fOutput = dynamic_cast<TList*>(obj);
450     break;
451     }
452     }
453    
454     } else {
455     fOutput = fSelector->GetModOutput();
456     }
457    
458     if (fOutput && !fAnaOutput.IsNull()) {
459     TDirectory::TContext context(0); // automatically restore gDirectory
460    
461     std::auto_ptr<TFile> outf(TFile::Open(fAnaOutput,"recreate","", fCompLevel));
462     if (outf.get() == 0) {
463     Error("Terminate", "Could not open file %s for output!", fAnaOutput.Data());
464 loizides 1.1 } else {
465 loizides 1.4 MDB(kAnalysis, 1)
466     Info("Terminate", "Saving output to %s!", fAnaOutput.Data());
467 loizides 1.1
468 loizides 1.4 if (fHierachy)
469     fOutput->Write(fOutput->GetName(),TObject::kSingleKey);
470     else
471     fOutput->Write();
472 loizides 1.1
473     }
474 loizides 1.4 }
475     }
476 loizides 1.1
477 loizides 1.4 delete fChain;
478     delete fSet;
479     fDeleteList->Delete();
480 loizides 1.1
481 loizides 1.4 fState = kTerminate;
482 loizides 1.1 }
483    
484     //__________________________________________________________________________________________________
485     Bool_t Analysis::UploadPackages(TList *packages)
486     {
487 loizides 1.4 // Upload list of par files to the server.
488 loizides 1.1
489 loizides 1.4 MitAssert("UploadPackages", packages != 0);
490 loizides 1.1
491 paus 1.7 for (Int_t i=0; i<packages->GetEntries(); i++) {
492 loizides 1.1
493 loizides 1.4 TObject* objstr = packages->At(i);
494 paus 1.7 if (!objstr) {
495 loizides 1.4 Error("InitProof", "Problem at package number %d!", i);
496     return kFALSE;
497     }
498 loizides 1.1
499 loizides 1.4 TString packname = objstr->GetName();
500 paus 1.7 Int_t en = 0;
501 loizides 1.4 if (packname.EndsWith("+")) {
502     en=1;
503     packname.Resize(packname.Length()-1);
504     }
505    
506     ifstream ftest(gSystem->ExpandPathName(packname.Data()),ios_base::binary);
507 paus 1.7 if (!ftest.good()) {
508 loizides 1.4 Error("InitProof", "Could not open %s for upload!", packname.Data());
509     return kFALSE;
510     }
511 loizides 1.1
512 paus 1.7 if (fProof->UploadPackage(packname)<0) {
513 loizides 1.4 Error("UploadPackage", "Upload for %s failed!", packname.Data());
514     return kFALSE;
515     }
516 loizides 1.1
517 loizides 1.4 if (en == 1) {
518     Int_t pos=packname.Last('/')+1;
519 paus 1.7 if (pos)
520     packname.Remove(0,pos);
521     if (fProof->EnablePackage(packname)<0) {
522 loizides 1.4 Error("UploadPackage", "Enabling for %s failed!", packname.Data());
523     return kFALSE;
524 loizides 1.1 }
525 loizides 1.4 }
526     }
527 loizides 1.1
528 loizides 1.4 return kTRUE;
529 loizides 1.1 }