ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/OutputMod.cc
Revision: 1.14
Committed: Fri Jul 17 19:18:34 2009 UTC (15 years, 9 months ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.13: +24 -26 lines
Log Message:
First attempt to store add output. NOt finished.

File Contents

# User Rev Content
1 loizides 1.14 // $Id: OutputMod.cc,v 1.13 2009/06/15 15:00:17 loizides Exp $
2 loizides 1.1
3     #include "MitAna/TreeMod/interface/OutputMod.h"
4 loizides 1.2 #include "MitAna/TreeMod/interface/HLTFwkMod.h"
5 loizides 1.1 #include "MitAna/DataUtil/interface/Debug.h"
6 loizides 1.12 #include "MitAna/DataTree/interface/BranchTable.h"
7 loizides 1.13 #include "MitAna/DataTree/interface/EventHeaderCol.h"
8 loizides 1.1 #include "MitAna/DataTree/interface/Names.h"
9     #include "MitAna/DataUtil/interface/TreeWriter.h"
10     #include "MitAna/TreeMod/interface/TreeBranchLoader.h"
11    
12     using namespace mithep;
13     using namespace std;
14    
15     ClassImp(mithep::OutputMod)
16    
17     //--------------------------------------------------------------------------------------------------
18     OutputMod::OutputMod(const char *name, const char *title) :
19     BaseMod(name,title),
20     fTreeName(Names::gkEvtTreeName),
21     fPrefix("skimtest"),
22     fPathName("."),
23     fMaxSize(1024),
24     fCompLevel(9),
25     fSplitLevel(99),
26 loizides 1.12 fBranchSize(16*1024),
27 loizides 1.1 fDoReset(kFALSE),
28 loizides 1.12 fUseBrDep(kTRUE),
29 loizides 1.2 fCheckTamBr(kTRUE),
30 loizides 1.12 fKeepTamBr(kFALSE),
31 loizides 1.1 fTreeWriter(0),
32 loizides 1.3 fEventHeader(0),
33     fAllEventHeader(0),
34     fRunInfo(0),
35     fLaHeader(0),
36 loizides 1.12 fBranchTable(0),
37 loizides 1.9 fBranches(0),
38 loizides 1.2 fNBranchesMax(1024),
39 loizides 1.3 fRunTree(0),
40     fLATree(0),
41     fAllTree(0),
42 loizides 1.9 fSkimmedIn(0),
43 loizides 1.3 fHltTree(0),
44 loizides 1.12 fHLTTab(new vector<string>),
45     fHLTLab(new vector<string>),
46 loizides 1.3 fRunEntries(0),
47     fHltEntries(0),
48 loizides 1.12 fFileNum(-1),
49 loizides 1.4 fLastWrittenEvt(-1),
50     fLastSeenEvt(-1),
51 loizides 1.14 fCounter(0)
52 loizides 1.1 {
53 loizides 1.2 // Constructor.
54 loizides 1.1 }
55    
56     //--------------------------------------------------------------------------------------------------
57     void OutputMod::BeginRun()
58     {
59 loizides 1.3 // Create HLT tree if HLTFwkMod is being run.
60    
61     if (!HasHLTInfo())
62     return;
63 loizides 1.1
64 loizides 1.3 if (!fHltTree) {
65     HLTFwkMod *hm = const_cast<HLTFwkMod*>(GetHltFwkMod());
66 loizides 1.7 fTreeWriter->AddBranchToTree(hm->HLTTreeName(), hm->HLTTabName(),
67 loizides 1.12 TClass::GetClass(typeid(*fHLTTab))->GetName(),
68     &fHLTTab, 32000, 0);
69 loizides 1.7 fTreeWriter->AddBranchToTree(hm->HLTTreeName(), hm->HLTLabName(),
70 loizides 1.12 TClass::GetClass(typeid(*fHLTLab))->GetName(),
71     &fHLTLab, 32000, 0);
72 loizides 1.3 fTreeWriter->SetAutoFill(hm->HLTTreeName(), 0);
73     fHltTree = fTreeWriter->GetTree(hm->HLTTreeName());
74     }
75 loizides 1.1 }
76    
77     //--------------------------------------------------------------------------------------------------
78     void OutputMod::CheckAndAddBranch(const char *bname, const char *cname)
79     {
80 loizides 1.2 // Check if the given branch should be kept or dropped.
81 loizides 1.4
82 loizides 1.1 if (IsAcceptedBranch(bname))
83     return;
84    
85     // populate regular expression list if this was not yet done
86 loizides 1.6 if (fCmdReList.size() != fCmdList.size()) {
87     for (UInt_t i=0; i<fCmdList.size(); ++i) {
88     const char *ptr = fCmdList.at(i).c_str();
89 loizides 1.1 fCmdReList.push_back(TRegexp(ptr+5,kTRUE));
90     if (ptr[0]=='k')
91     fCmdDeList.push_back(kTRUE);
92     else
93     fCmdDeList.push_back(kFALSE);
94     }
95     }
96    
97     // decide whether given branch name should be kept or dropped
98     TString brname(bname);
99     Bool_t decision = kFALSE;
100     Bool_t decision_found = kFALSE;
101    
102 loizides 1.6 for (UInt_t i=0; i<fCmdList.size(); ++i) {
103 loizides 1.1 TRegexp &re(fCmdReList.at(i));
104     if (brname.Index(re) == kNPOS)
105     continue;
106     decision = fCmdDeList.at(i);
107     decision_found = kTRUE;
108     }
109    
110     if (!decision_found) { // no decision found: still drop branch
111     Warning("CheckAndAddBranch",
112 loizides 1.9 "No decision found for branch '%s' and class '%s'. Branch therefore dropped!",
113 loizides 1.1 bname, cname);
114     return;
115     }
116    
117     if (!decision) { // drop branch according to request
118 loizides 1.11 Info("CheckAndAddBranch",
119 loizides 1.12 "Dropped branch '%s' and class '%s'", bname, cname);
120 loizides 1.1 return;
121     }
122    
123     // add branch to accepted branch list
124 loizides 1.11 Info("CheckAndAddBranch",
125 loizides 1.12 "Kept branch '%s' and class '%s'", bname, cname);
126 loizides 1.1
127 loizides 1.6 fBrNameList.push_back(string(bname));
128     fBrClassList.push_back(string(cname));
129 loizides 1.12 }
130    
131     //--------------------------------------------------------------------------------------------------
132     Bool_t OutputMod::CheckAndResolveBranchDep()
133     {
134     // Checks dependency in BranchTable. Resolve dependency automatically if fUserBrDep is kTRUE.
135    
136     TFile *cfile = const_cast<TFile*>(GetSel()->GetCurrentFile());
137     if (!cfile)
138     return kFALSE;
139    
140     BranchTable *br = dynamic_cast<BranchTable*>(cfile->Get(Names::gkBranchTable));
141     if (!br)
142     return kFALSE;
143    
144     TList *blist = br->GetBranches();
145     if (!blist)
146     return kFALSE;
147 loizides 1.1
148 loizides 1.12 fBranchTable = new BranchTable;
149     fBranchTable->SetName(Names::gkBranchTable);
150     fBranchTable->SetOwner();
151    
152     TList sht;
153     sht.SetOwner(kTRUE);
154     for (UInt_t i=0; i<fBrNameList.size(); ++i) {
155     sht.Add(new TObjString(fBrNameList.at(i).c_str()));
156     }
157    
158     for (UInt_t i=0; i<fBrNameList.size(); ++i) {
159 loizides 1.14 TString brname(fBrNameList.at(i));
160 loizides 1.12 if (!blist->FindObject(brname))
161     continue;
162     TList *bdeps = br->GetDepBranches(brname);
163     if (!bdeps)
164     continue;
165    
166     // check dependency
167     TIter iter(bdeps->MakeIterator());
168     const TObjString *n = dynamic_cast<const TObjString*>(iter.Next());
169     while (n) {
170     if (sht.FindObject(n->GetName())) {
171     // dependent branch is already accepted
172     fBranchTable->Add(new BranchName(brname,n->GetName()));
173     } else {
174     if (fUseBrDep) {
175     const TObjArray *arr = GetSel()->GetTree()->GetTree()->GetListOfBranches();
176     TBranch *br = dynamic_cast<TBranch*>(arr->FindObject(n->GetName()));
177     if (!br) {
178     Error("CheckAndResolveBranchDep",
179     "Could not get branch '%s' to resolve dependency for branch '%s'",
180     n->GetName(), brname.Data());
181     } else {
182     Info("CheckAndResolveBranchDep",
183     "Adding branch '%s' to resolve dependency for branch '%s'",
184     n->GetName(), brname.Data());
185     fBrNameList.push_back(string(n->GetName()));
186     fBrClassList.push_back(br->GetClassName());
187     sht.Add(new TObjString(n->GetName()));
188     fBranchTable->Add(new BranchName(brname,n->GetName()));
189     }
190     } else {
191     Warning("CheckAndResolveBranchDep",
192     "Unresolved dependency of branch '%s' and '%s' ",
193     n->GetName(), brname.Data());
194     }
195     }
196     n = dynamic_cast<const TObjString*>(iter.Next());
197     }
198     delete bdeps;
199     }
200     delete blist;
201     return kTRUE;
202 loizides 1.1 }
203    
204     //--------------------------------------------------------------------------------------------------
205 loizides 1.12 void OutputMod::CheckAndResolveTAMDep(Bool_t solve)
206 loizides 1.2 {
207     // Check if TAM has loaded additional branches. If requested try to solve the the dependency
208     // by adding the branch to the list of branches.
209    
210     const THashTable &ht = GetSel()->GetBranchTable();
211    
212 loizides 1.5 TIter iter(ht.MakeIterator());
213     const TAMBranchInfo *next = dynamic_cast<const TAMBranchInfo*>(iter.Next());
214 loizides 1.2
215     while (next) {
216     const TAMBranchInfo *cur = next;
217 loizides 1.5 next = dynamic_cast<const TAMBranchInfo*>(iter.Next());
218 loizides 1.2 Bool_t isloaded = cur->IsLoaded();
219     if (!isloaded)
220     continue;
221    
222     const char *bname = cur->GetName();
223     if (IsAcceptedBranch(bname))
224     continue;
225    
226     TreeBranchLoader *loader = dynamic_cast<TreeBranchLoader*>(cur->GetLoader());
227     if (!loader)
228     continue;
229    
230     TBranch *br = loader->GetBranch();
231     if (!br)
232     continue;
233    
234     const char *cname = br->GetClassName();
235    
236     if (solve) {
237 loizides 1.12 Info("CheckAndResolveTAMDep",
238 loizides 1.11 "Resolving dependency for loaded branch '%s' and class '%s'", bname,cname);
239 loizides 1.2
240 loizides 1.6 fBrNameList.push_back(string(bname));
241     fBrClassList.push_back(string(cname));
242 loizides 1.2 fBranches[GetNBranches()-1] = reinterpret_cast<TObject*>(loader->GetAddress());
243    
244     } else {
245 loizides 1.12 Warning("CheckAndResolveTAMDep",
246     "Unresolved dependency for loaded branch '%s' and class '%s'",
247 loizides 1.2 bname,cname);
248     }
249     }
250     }
251    
252     //--------------------------------------------------------------------------------------------------
253 loizides 1.4 void OutputMod::EndRun()
254     {
255 loizides 1.9 // Nothing to be done at this point.
256 loizides 1.4 }
257    
258     //--------------------------------------------------------------------------------------------------
259 loizides 1.3 void OutputMod::FillAllEventHeader(Bool_t isremoved)
260     {
261     // Fill event header into the all-event-header tree.
262    
263 loizides 1.9 if (!fTreeWriter->BeginEvent(kFALSE)) {
264     SendError(kAbortAnalysis, "FillAllEventHeader", "Begin event failed!");
265     return;
266     }
267    
268     if (fSkimmedIn) { // copy alread skimmed headers if any there
269     for(UInt_t i=0; i<fSkimmedIn->Entries(); ++i) {
270     const EventHeader *eh = fSkimmedIn->At(i);
271     fAllEventHeader->SetEvtNum(eh->EvtNum());
272     fAllEventHeader->SetLumiSec(eh->LumiSec());
273     fAllEventHeader->SetRunNum(eh->RunNum());
274     fAllEventHeader->SetRunEntry(eh->RunEntry());
275     fAllEventHeader->SetSkimmed(eh->Skimmed()+1);
276     fAllTree->Fill();
277     }
278     }
279    
280 loizides 1.3 const EventHeader *eh = GetEventHeader();
281     fAllEventHeader->SetEvtNum(eh->EvtNum());
282     fAllEventHeader->SetLumiSec(eh->LumiSec());
283     fAllEventHeader->SetRunNum(eh->RunNum());
284 loizides 1.9 if (isremoved) {
285 loizides 1.3 fAllEventHeader->SetRunEntry(-1);
286 loizides 1.9 fAllEventHeader->SetSkimmed(eh->Skimmed()+1);
287     } else {
288 loizides 1.3 fAllEventHeader->SetRunEntry(eh->RunEntry());
289 loizides 1.9 fAllEventHeader->SetSkimmed(eh->Skimmed());
290     }
291 loizides 1.3
292     fAllTree->Fill();
293     }
294    
295     //--------------------------------------------------------------------------------------------------
296     void OutputMod::FillHltInfo()
297 loizides 1.1 {
298 loizides 1.4 // Write HLT trigger table if needed.
299 loizides 1.1
300 loizides 1.3 if (!fHltTree)
301     return;
302    
303 loizides 1.12 HLTFwkMod *hm = const_cast<HLTFwkMod*>(GetHltFwkMod());
304     vector<string> *trigtable = hm->fHLTTab;
305     vector<string> *labels = hm->fHLTLab;
306    
307     Bool_t doCopy = kFALSE;
308     if (fHLTTab->size()==0) {
309     doCopy = kTRUE;
310     } else {
311     // check if existing table contains all necessary paths:
312     // if so keep it, otherwise store the new one
313    
314     if ((fHLTTab->size() != trigtable->size()) ||
315     (fHLTLab->size() != labels->size())) {
316     doCopy = kTRUE;
317     } else {
318     // need to check more thoroughly
319    
320     for (UInt_t i=0; i<trigtable->size(); ++i) {
321     if (trigtable->at(i) != fHLTTab->at(i)) {
322     doCopy = kTRUE;
323     break;
324     }
325     }
326     if (!doCopy) {
327     for (UInt_t i=0; i<labels->size(); ++i) {
328     if (labels->at(i) != fHLTLab->at(i)) {
329     doCopy = kTRUE;
330     break;
331     }
332     }
333     }
334     }
335     }
336    
337     if (!doCopy)
338 loizides 1.3 return;
339    
340 loizides 1.12 fHLTTab->resize(trigtable->size());
341     copy(trigtable->begin(),trigtable->end(), fHLTTab->begin());
342     fHLTLab->resize(labels->size());
343     copy(labels->begin(),labels->end(), fHLTLab->begin());
344    
345     ++fHltEntries;
346 loizides 1.3 fHltTree->Fill();
347 loizides 1.1 }
348    
349     //--------------------------------------------------------------------------------------------------
350     Bool_t OutputMod::IsAcceptedBranch(const char *bname)
351     {
352     // Return true if given branch is already in branch list. Also return true if a special
353     // branch like the "EventHeader" branch is reqested.
354    
355     // search in branch list
356     for (UInt_t i=0; i<GetNBranches(); ++i) {
357 loizides 1.6 if (fBrNameList.at(i).compare(bname) == 0)
358 loizides 1.1 return kTRUE;
359     }
360    
361     // check if special branch that we take care of ourselves
362     string name(bname);
363     if (name.compare("EventHeader") == 0) {
364     return kTRUE;
365     }
366    
367     return kFALSE;
368     }
369    
370     //--------------------------------------------------------------------------------------------------
371     Bool_t OutputMod::Notify()
372     {
373 loizides 1.2 // On first notify, loop over list of branches to determine the list of kept branches.
374 loizides 1.14 cout << "NOOOOOOOOOOOOOTIIIFYYYYYYYYYYYY" <<endl;
375 loizides 1.2 if (GetNEventsProcessed() != 0)
376     return kTRUE;
377 loizides 1.1
378 loizides 1.12 const TTree *tree=GetSel()->GetTree();
379 loizides 1.1 if (!tree)
380     return kFALSE;
381    
382 loizides 1.12 const TObjArray *arr = tree->GetTree()->GetListOfBranches();
383 loizides 1.1 if (!arr)
384     return kFALSE;
385    
386     for (Int_t i=0; i<arr->GetEntries(); ++i) {
387     TBranch *br = dynamic_cast<TBranch*>(arr->At(i));
388     if (!br && !br->GetMother())
389     continue;
390     br = br->GetMother();
391     TClass *cls = TClass::GetClass(br->GetClassName());
392     if (!cls)
393     continue;
394    
395     if (!cls->InheritsFrom("TObject")) {
396 loizides 1.12 Warning("Notify", "Found branch '%s' where class '%s' does not derive from TObject",
397 loizides 1.1 br->GetName(), br->GetClassName());
398     continue;
399     }
400    
401     CheckAndAddBranch(br->GetName(), br->GetClassName());
402     }
403    
404 loizides 1.12 if (!CheckAndResolveBranchDep())
405     return kFALSE;
406    
407     RequestBranches();
408 loizides 1.1 return kTRUE;
409     }
410    
411     //--------------------------------------------------------------------------------------------------
412     void OutputMod::LoadBranches()
413     {
414     // Loop over requested branches and load them.
415    
416     for (UInt_t i=0; i<GetNBranches(); ++i) {
417 loizides 1.14 cout << i << " " << fBrNameList.at(i)<< endl;
418 loizides 1.6 LoadBranch(fBrNameList.at(i).c_str());
419 loizides 1.1 }
420     }
421    
422     //--------------------------------------------------------------------------------------------------
423     void OutputMod::Process()
424     {
425 loizides 1.3 // Write out the kept branches of the current event. Make sure the meta information is
426     // correctly updated.
427 loizides 1.1
428 loizides 1.4 if (GetSel()->GetCurEvt() == fLastSeenEvt) {
429     Warning("Process", "Event with %ul already seen", fLastSeenEvt);
430     return;
431     }
432     fLastSeenEvt = GetSel()->GetCurEvt();
433    
434     if (GetSel()->GetCurEvt() == fLastWrittenEvt) {
435     Warning("Process", "Event with %ul already written", fLastWrittenEvt);
436     return;
437     }
438     fLastWrittenEvt = GetSel()->GetCurEvt();
439     ++fCounter;
440    
441     // prepare for tree filling
442 loizides 1.8 if (!fTreeWriter->BeginEvent(fDoReset)) {
443     SendError(kAbortAnalysis, "Process", "Begin event failed!");
444     return;
445     }
446 loizides 1.1
447 loizides 1.2 if (GetNEventsProcessed() == 0 && fCheckTamBr) {
448 loizides 1.12 CheckAndResolveTAMDep(fKeepTamBr);
449 loizides 1.1 }
450    
451 loizides 1.4 // load all our branches
452 loizides 1.1 LoadBranches();
453    
454 loizides 1.4 // pass our branches to tree writer if on first event
455 loizides 1.1 if (GetNEventsProcessed() == 0) {
456 loizides 1.4 SetupBranches();
457 loizides 1.1 }
458    
459 loizides 1.3 // reset per file quantities if a new file was opened
460     if (fTreeWriter->GetFileNumber()!=fFileNum) {
461     fRunmap.clear();
462     fRunEntries = 0;
463 loizides 1.12 fHltEntries = 0;
464 loizides 1.3 fFileNum = fTreeWriter->GetFileNumber();
465 loizides 1.12 fTreeWriter->StoreObject(fBranchTable);
466 loizides 1.3 }
467    
468     UInt_t runnum = GetEventHeader()->RunNum();
469    
470     // store look ahead information
471     if (fRunEntries>0) {
472     fLaHeader->SetRunNum(runnum);
473     fLATree->Fill();
474     }
475    
476     // fill event header
477     fEventHeader->SetEvtNum(GetEventHeader()->EvtNum());
478     fEventHeader->SetLumiSec(GetEventHeader()->LumiSec());
479     fEventHeader->SetRunNum(runnum);
480    
481     // fill all event header
482     FillAllEventHeader(kFALSE);
483    
484     // look-up if entry is in map
485     map<UInt_t,Int_t>::iterator riter = fRunmap.find(runnum);
486     if (riter != fRunmap.end()) { // found existing run info
487     Int_t runentry = riter->second;
488     fEventHeader->SetRunEntry(runentry);
489    
490     IncNEventsProcessed();
491     fTreeWriter->EndEvent(fDoReset);
492     return;
493     }
494 loizides 1.2
495 loizides 1.3 // fill new run info
496     Int_t runentry = fRunEntries;
497     ++fRunEntries;
498     fEventHeader->SetRunEntry(runentry);
499     fRunmap.insert(pair<UInt_t,Int_t>(runnum,runentry));
500     fRunInfo->SetRunNum(runnum);
501    
502     Int_t hltentry = fHltEntries;
503     FillHltInfo();
504 loizides 1.12 if (hltentry < fHltEntries)
505     fRunInfo->SetHltEntry(hltentry);
506     else
507     fRunInfo->SetHltEntry(hltentry-1);
508 loizides 1.3
509     fRunTree->Fill();
510 loizides 1.12
511 loizides 1.1 IncNEventsProcessed();
512 loizides 1.8
513     if (!fTreeWriter->EndEvent(fDoReset)) {
514     SendError(kAbortAnalysis, "Process", "End event failed!");
515     return;
516     }
517 loizides 1.1 }
518    
519     //--------------------------------------------------------------------------------------------------
520 loizides 1.3 void OutputMod::ProcessAll()
521     {
522     // Called by the Selector class for events that were skipped.
523    
524 loizides 1.4 if (GetSel()->GetCurEvt() == fLastSeenEvt)
525     return;
526 loizides 1.8
527 loizides 1.4 fLastSeenEvt = GetSel()->GetCurEvt();
528     ++fCounter;
529    
530 loizides 1.8 // prepare for tree filling
531 loizides 1.3 FillAllEventHeader(kTRUE);
532     }
533    
534     //--------------------------------------------------------------------------------------------------
535 loizides 1.12 void OutputMod::RequestBranches()
536 loizides 1.3 {
537 loizides 1.12 // Loop over requested branches and request them.
538 loizides 1.3
539 loizides 1.14 cout << "Requestbbbbbbbbbbbbbbrrrrrrrrrrrrrrrrrrrrrrr " << endl;
540    
541 loizides 1.12 for (UInt_t i=0; i<GetNBranches(); ++i) {
542     if (i>=fNBranchesMax) {
543 loizides 1.14 SendError(kAbortAnalysis, "RequestBranches", "Cannot request branch '%s' "
544 loizides 1.12 "since maximum number of branches [%d] is reached",
545     fBrNameList.at(i).c_str(), fNBranchesMax);
546     return;
547     }
548     fBranches[i] = 0;
549 loizides 1.14 cout << "Request " << i << " " << fBrNameList.at(i) << endl;
550 loizides 1.12 TAModule::ReqBranch(fBrNameList.at(i).c_str(), fBranches[i]);
551 loizides 1.3 }
552     }
553    
554     //--------------------------------------------------------------------------------------------------
555 loizides 1.1 void OutputMod::SetupBranches()
556     {
557     // Setup branches in tree writer.
558    
559     for (UInt_t i=0; i<GetNBranches(); ++i) {
560 loizides 1.6 const char *bname = fBrNameList.at(i).c_str();
561     const char *cname = fBrClassList.at(i).c_str();
562 loizides 1.1 if (!fBranches[i]) {
563 loizides 1.8 SendError(kWarning, "SetupBranches",
564 loizides 1.12 "Pointer for branch '%s' and class '%s' is NULL", bname, cname);
565 loizides 1.1 continue;
566     }
567 loizides 1.12 Int_t bsize = fBranchSize;
568     TString cnamestr(cname);
569     if ((bsize<128*1024) && (cnamestr.Contains("mithep::MCParticle"))) {
570     bsize=128*1024;
571     } else if ((bsize<32*1024) && (cnamestr.Contains("mithep::CaloTower"))) {
572     bsize=32*1024;
573     }
574    
575     fTreeWriter->AddBranch(bname, cname, &fBranches[i], bsize);
576 loizides 1.1 }
577     }
578    
579     //--------------------------------------------------------------------------------------------------
580     void OutputMod::SlaveBegin()
581     {
582 loizides 1.3 // Setup the tree writer and create branches that can already be created at this point.
583 loizides 1.1
584     // setup tree writer
585     fTreeWriter = new TreeWriter(fTreeName, kFALSE);
586     fTreeWriter->SetBaseURL(fPathName);
587     fTreeWriter->SetPrefix(fPrefix);
588     fTreeWriter->SetMaxSize(fMaxSize*1024*1024);
589     fTreeWriter->SetCompressLevel(fCompLevel);
590     fTreeWriter->SetDefaultSL(fSplitLevel);
591     fTreeWriter->SetDefaultBrSize(fBranchSize);
592     fTreeWriter->AddTree(fTreeName);
593     fTreeWriter->DoBranchRef(fTreeName);
594    
595 loizides 1.2 // deal with my own tree objects
596 loizides 1.3 fEventHeader = new EventHeader;
597     fTreeWriter->AddBranch(GetSel()->GetEvtHdrName(), &fEventHeader);
598    
599     // deal with other trees
600     const char *tname = 0;
601     fRunInfo = new RunInfo;
602     tname = GetSel()->GetRunTreeName();
603     fTreeWriter->AddBranchToTree(tname, GetSel()->GetRunInfoName(), &fRunInfo);
604     fTreeWriter->SetAutoFill(tname, 0);
605     fRunTree = fTreeWriter->GetTree(tname);
606     fLaHeader = new LAHeader;
607     tname = GetSel()->GetLATreeName();
608     fTreeWriter->AddBranchToTree(tname, GetSel()->GetLAHdrName(), &fLaHeader);
609 loizides 1.9 fTreeWriter->SetAutoFill(tname, 0);
610 loizides 1.3 fLATree = fTreeWriter->GetTree(tname);
611     fAllEventHeader = new EventHeader;
612     tname = GetSel()->GetAllEvtTreeName();
613     fTreeWriter->AddBranchToTree(tname, GetSel()->GetAllEvtHdrBrn(), &fAllEventHeader);
614     fAllTree = fTreeWriter->GetTree(tname);
615 loizides 1.9 fTreeWriter->SetAutoFill(tname, 0);
616    
617     // get pointer to all event headers
618     fSkimmedIn = GetPublicObj<EventHeaderCol>(Names::gkSkimmedHeaders);
619 loizides 1.2
620 loizides 1.1 // create TObject space for TAM
621 loizides 1.14 fBranches = new TObject*[fNBranchesMax + fAddList.size()];
622    
623     // deal here with additional published objects
624     for (UInt_t i=0; i<fAddList.size(); ++i) {
625     TString objname(fAddList.at(i));
626     TObject *obj = FindPublicObj(objname);
627     if (obj) {
628     fBranches[fNBranchesMax+i] = obj;
629     fTreeWriter->AddBranch(objname, &fBranches[fNBranchesMax+i]);
630     Info("SlaveBegin", "Adding additional branch named '%s' as requested", objname.Data());
631     } else {
632     SendError(kAbortAnalysis, "SlaveBegin",
633     "Object named '%s' for additional branch is NULL", objname.Data());
634     }
635     }
636 loizides 1.2
637     // adjust checks for TAM branches
638     if (fKeepTamBr)
639     fCheckTamBr = kTRUE;
640 loizides 1.1 }
641    
642     //--------------------------------------------------------------------------------------------------
643     void OutputMod::SlaveTerminate()
644     {
645 loizides 1.3 // Terminate tree writing and do cleanup.
646 loizides 1.1
647 loizides 1.9 RetractObj(Names::gkSkimmedHeaders);
648    
649 loizides 1.1 delete fTreeWriter;
650     fTreeWriter = 0;
651    
652 loizides 1.3 delete fEventHeader;
653     delete fRunInfo;
654     delete fLaHeader;
655     delete fAllEventHeader;
656 loizides 1.2
657 loizides 1.1 delete[] fBranches;
658 loizides 1.4
659     Double_t frac = 100.*GetNEventsProcessed()/fCounter;
660 loizides 1.12 Info("SlaveTerminate", "Stored %.2f%% events (%ld out of %ld)",
661 loizides 1.11 frac, GetNEventsProcessed(), fCounter);
662 loizides 1.1 }