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 ();
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 }