ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/OutputMod.cc
Revision: 1.13
Committed: Mon Jun 15 15:00:17 2009 UTC (15 years, 10 months ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_009c, Mit_009b
Changes since 1.12: +6 -3 lines
Log Message:
Added proper fwd defs plus split up complilation of MitAna/DataTree LinkDefs.

File Contents

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