Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

LdfController.cxx

Go to the documentation of this file.
00001 
00012 #include "RootController.h"
00013 
00014 #include "RootNTuple.h"
00015 
00016 #include "datasrcs/DataSourceController.h"
00017 
00018 #include "TFile.h"
00019 #include "TKey.h"
00020 #include "TTree.h"
00021 
00022 #include <fstream>
00023 
00024 using std::string;
00025 using std::vector;
00026 
00029 typedef std::map < std::string, TFile * > ::iterator FileMapIterator_t;
00030 
00031 RootController * RootController::s_instance = 0;
00032 
00033 RootController *
00034 RootController::
00035 instance ()
00036 {
00037   if ( s_instance == 0 ) {
00038     s_instance = new RootController ();
00039   }
00040 #ifdef _MSC_VER
00041   TTree * tree = new TTree (); // force loading of dll
00042   delete tree;
00043 #endif
00044   return s_instance;
00045 }
00046 
00047 RootController::
00048 ~RootController()
00049 {
00050 }
00051 
00052 const std::string &
00053 RootController::
00054 version () const
00055 {
00056   m_version = ROOT_RELEASE;
00057   return m_version;
00058 }
00059 
00060 TFile *
00061 RootController::
00062 openFile ( const std::string & name )
00063 {
00064   TFile * file = 0;
00065   FileMapIterator_t first = m_file_map.find ( name );
00066 
00067   if ( first == m_file_map.end() ) {
00068     ifstream test ( name.c_str (), std::ios::in );
00069     if ( test.is_open () == false ) {
00070       string what ( "RootController: File `" );
00071       what += name;
00072       what += "' was not found.";
00073       throw DataSourceException ( what );
00074     }
00075     file = new TFile ( name.c_str() );
00076     m_file_map [ name ] = file;
00077   }
00078   else {
00079     file = first -> second;
00080   }
00081 
00082   return file;
00083 }
00084 
00085 void
00086 RootController::
00087 closeFile ( const std::string & name )
00088 {
00089   FileMapIterator_t where = m_file_map.find ( name );
00090   if ( where != m_file_map.end () ) {
00091     m_file_map.erase ( where );
00092     TFile * file = where -> second;
00093     delete file;
00094   }
00095 }
00096 
00097 const vector < string > & 
00098 RootController::
00099 getNTupleNames ( const std::string & file_name )
00100 {
00101   m_ntuple_names.clear();
00102 
00103   TFile * file = openFile ( file_name );
00104 
00105   if ( file != 0 ) {
00106     TList * keys = file -> GetListOfKeys ();
00107     Int_t size = keys -> GetSize ();
00108 
00109     for ( Int_t i = 0; i < size; i++ ) {
00110       TObject * obj = keys -> At ( i );
00111       TKey * key = dynamic_cast < TKey * > ( obj );
00112       const string class_name = key -> GetClassName ();
00113       if ( class_name == "TTree" ) {
00114         const string name = key -> GetName ();
00115         m_ntuple_names.push_back ( name );
00116       }
00117     }
00118   }
00119 
00120   return m_ntuple_names;
00121 }
00122 
00123 TTree *
00124 RootController::
00125 getTree ( const std::string & filename,
00126           const std::string & treename )
00127 {
00128   TFile * file =  openFile ( filename );
00129   TObject * object = file ->Get ( treename.c_str() );
00130   TTree * tree = dynamic_cast < TTree * > ( object );
00131 
00132   return tree;
00133 }
00134 
00135 DataSource *
00136 RootController::
00137 createNTuple ( const std::string & filename, const std::string & treename )
00138 {
00139   string ds_name = filename;
00140   ds_name += ": ";
00141   ds_name += treename;
00142 
00143   DataSourceController * controller = DataSourceController::instance();
00144   DataSource * ntuple = controller -> getDataSource ( ds_name );
00145 
00146   if ( ntuple == 0 ) {
00147     TTree * tree = getTree ( filename, treename );
00148     ntuple = new RootNTuple ( tree );
00149     ntuple -> setTitle ( treename );
00150 
00151     ntuple -> setName ( ds_name );
00152     controller -> registerNTuple ( ntuple );
00153     controller -> registerDataSourceFile ( ntuple );
00154   }
00155 
00156   return ntuple;
00157 }
00158 
00159 DataSource *
00160 RootController::
00161 createNTuple ( const std::string & name )
00162 {
00163   DataSource * rtuple = 0;
00164 
00165   string::size_type pos = name.find_last_of ( ':' );
00166   if ( pos == string::npos ) {
00167     const vector < string > & tree_names = getNTupleNames ( name );
00168     rtuple = createNTuple ( name, tree_names[0] );
00169   }
00170   else {
00171     const string filename = name.substr ( 0, pos );
00172     string tree_name = name.substr ( pos + 1 );
00173     pos = tree_name.find_first_not_of ( ' ' );
00174     tree_name.erase ( 0, pos );
00175     rtuple = createNTuple ( filename, tree_name );
00176   }
00177 
00178   return rtuple;
00179 }
00180 
00181 void
00182 RootController::
00183 fillDimSize ( std::vector < int > & dims, 
00184               const DataSource * source,
00185               const std::string & column )
00186 {
00187   const RootNTuple * rtuple = dynamic_cast < const RootNTuple * > ( source );
00188   if ( rtuple != 0 ) {
00189     dims = rtuple -> rowDataDimSize ( column );
00190   }
00191 }
00192 
00193 bool
00194 RootController::
00195 smartExpandRootNTuple ( DataSource * source, std::string & column )
00196 {
00197   bool yes = false;
00198   RootNTuple * rtuple = dynamic_cast < RootNTuple * > ( source );
00199   if ( rtuple != 0 ) {
00200     rtuple -> smartExpandRootNTuple ( column );
00201     yes = true;
00202   }
00203 
00204   return yes;
00205 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3