Main Page | Modules | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members

SelectObjects.cpp

Go to the documentation of this file.
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         // read this from configuration file
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)

Generated on Tue Mar 28 10:13:04 2006 for CAF by doxygen 1.3.4