ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/TreeMod/src/OutputMod.cc
Revision: 1.16
Committed: Mon Oct 26 11:04:56 2009 UTC (15 years, 6 months ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_012d, Mit_012c, Mit_012b, Mit_012a, Mit_012
Changes since 1.15: +3 -2 lines
Log Message:
Use GetEntries

File Contents

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