00001
00002
00003 #include "cafe/SelectObjects.hpp"
00004 #include "cafe/Config.hpp"
00005
00006 #include "TFile.h"
00007 #include "TTree.h"
00008 #include "TBranch.h"
00009 #include "TBranchElement.h"
00010 #include "TDirectory.h"
00011 #include "TClonesArray.h"
00012 #include "TTreeFormula.h"
00013
00014 namespace cafe {
00015
00016 SelectObjects::SelectObjects(const char *name)
00017 : Processor(name),
00018 Formula(this),
00019 _tree(0),
00020 _result(0),
00021 _branch(0)
00022 {
00023
00024 Config config(name);
00025 std::string expr = config.get("Select","1");
00026 setFormula(expr);
00027
00028 _fromBranch = config.get("From", "");
00029 _toBranch = config.get("To", _fromBranch);
00030 _treeName = config.get("Tree", name);
00031 out() << "SelectObjects[" << name << "]: " << expr << std::endl;
00032 out() << "SelectObjects[" << name << "] From: " << _fromBranch << " to: " << _toBranch << std::endl;
00033 out() << "SelectObjects[" << name << "]: Output Tree: " << _treeName << std::endl;
00034 }
00035
00036 void SelectObjects::inputFileOpened(TFile *file)
00037 {
00038 if(TTree *tmb_tree = (TTree *)file->Get("TMBTree")) {
00039
00040 gROOT->cd();
00041 _tree = new TTree(_treeName.c_str(), fullName().c_str());
00042 tmb_tree->AddFriend(_tree);
00043
00044 if(TBranchElement *br = (TBranchElement *)tmb_tree->GetBranch(_fromBranch.c_str())) {
00045 _result = new TClonesArray(br->GetClonesName());
00046 _branch = _tree->Branch(_toBranch.c_str(), &_result, 4096);
00047 } else {
00048 err() << "SelectObjects[" << name() << "] No such branch: "
00049 << _fromBranch << std::endl;
00050 }
00051 Formula::inputFileOpened(file);
00052 } else {
00053 err() << "SelectObjects[" << name() << "] No TMBTree" << std::endl;
00054 }
00055 }
00056
00057 void SelectObjects::inputFileClosing(TFile *file)
00058 {
00059 TTree *tmb_tree = (TTree *)file->Get("TMBTree");
00060 tmb_tree->RemoveFriend(_tree);
00061 delete _tree;
00062 delete _result;
00063 }
00064
00065 bool SelectObjects::processEvent(Event& event)
00066 {
00067 if(!_result) return true;
00068 _result->Clear();
00069
00070 if(const TClonesArray *from = event.get<TClonesArray>(_fromBranch.c_str())) {
00071 TTreeFormula *formula = getFormula();
00072 int ndata = formula->GetNdata();
00073 int next = 0;
00074 for(int i = 0; i < ndata; i++) {
00075 if(formula->EvalInstance(i)) {
00076 TBuffer buf(TBuffer::kWrite);
00077 from->At(i)->Streamer(buf);
00078 buf.SetBufferOffset(0);
00079 buf.SetReadMode();
00080 TObject *newobj = _result->New(next);
00081 (*_result)[next++]->Streamer(buf);
00082 newobj->ResetBit(kIsReferenced);
00083 newobj->SetUniqueID(0);
00084 }
00085 }
00086 }
00087
00088 _tree->Fill();
00089
00090 TTree *tmb_tree = event.getTree();
00091 _tree->LoadTree(tmb_tree->GetReadEntry());
00092
00093 return true;
00094 }
00095
00096 }
00097
00098 ClassImp(cafe::SelectObjects)