00001
00012 #include "RootBranch.h"
00013
00014 #include "axes/Range.h"
00015
00016 #include <cassert>
00017
00018 using std::string;
00019 using std::vector;
00020
00021 using namespace hippodraw;
00022
00026 RootBranch::
00027 RootBranch ( TBranch * branch )
00028 : m_branch ( branch ),
00029 m_vector_double_data ( 0 ),
00030 m_vector_float_data ( 0 ),
00031 m_vector_int_data ( 0 ),
00032 m_vector_uint_data ( 0 ),
00033 m_vector_ulong64_data ( 0 ),
00034 m_releventIndex ( -1 ),
00035 m_branch_set ( false ),
00036 m_useable ( true )
00037 {
00038 TObjArray * leaves = branch -> GetListOfLeaves ();
00039 m_number_leaves = leaves -> GetEntries ();
00040
00041 if ( m_number_leaves == 1 )
00042 {
00043 TObject * object = leaves -> At ( 0 );
00044 m_leaf = dynamic_cast < TLeaf * > ( object );
00045 assert ( m_leaf != 0 );
00046 const string type = m_leaf -> GetTypeName ();
00047
00048 if ( type == "Double_t" ) m_leaf_type = RootData::Double;
00049 else if ( type == "Float_t" ) m_leaf_type = RootData::Float;
00050 else if ( type == "Int_t" ) m_leaf_type = RootData::Int;
00051 else if ( type == "Short_t" ) m_leaf_type = RootData::Short;
00052 else if ( type == "UShort_t" ) m_leaf_type = RootData::UShort;
00053 else if ( type == "UInt_t" ) m_leaf_type = RootData::UInt;
00054 else if ( type == "Long64_t" ) m_leaf_type = RootData::Long64;
00055 else if ( type == "ULong64_t" ) m_leaf_type = RootData::ULong64;
00056 else {
00057 m_useable = false;
00058 }
00059 m_number_elements = m_leaf -> GetLen();
00060 }
00061 try {
00062 initShape ( m_leaf -> GetTitle() );
00063 }
00064 catch ( ... ) {
00065 m_useable = false;
00066 }
00067 }
00068
00069 RootBranch::
00070 RootBranch ()
00071 : m_branch ( 0 ),
00072 m_releventIndex ( -1 ),
00073 m_branch_set ( false )
00074 {
00075 }
00076
00077 RootBranch::
00078 ~RootBranch()
00079 {
00080 }
00081
00082 unsigned int
00083 RootBranch::
00084 size () const
00085 {
00086 assert ( false );
00087
00088 return 0;
00089 }
00090
00091
00092 bool
00093 RootBranch::
00094 empty () const
00095 {
00096 return false;
00097 }
00098
00099 bool
00100 RootBranch::
00101 isFilled ( ) const
00102 {
00103 return true;
00104 }
00105
00106 bool
00107 RootBranch::
00108 isMultiDimensional() const
00109 {
00110 return ! ( m_number_elements == 1 );
00111 }
00112
00113
00114 int
00115 RootBranch::
00116 numberOfElements() const
00117 {
00118 return m_number_elements;
00119 }
00120
00121 TBranch *
00122 RootBranch::
00123 getTBranch()
00124 {
00125 return m_branch;
00126 }
00127
00128 void
00129 RootBranch::
00130 initShape ( const char* title )
00131 {
00132 m_shape.clear ();
00133
00134 string s( title );
00135
00136
00137 boost::char_separator< char > sep( "][" );
00138
00139
00140 typedef boost::tokenizer< boost::char_separator< char > > tokenizer;
00141 tokenizer tok( s, sep );
00142
00143
00144 for( tokenizer::iterator tok_iter = tok.begin();
00145 tok_iter != tok.end();
00146 ++tok_iter )
00147 if( tok_iter != tok.begin() ) {
00148 unsigned int value = boost::lexical_cast< unsigned int >( *tok_iter );
00149 m_shape.push_back( value );
00150 }
00151 }
00152
00157 void
00158 RootBranch::
00159 setBranchAddress () const
00160 {
00161 if( m_number_elements == 1 )
00162 {
00163 switch ( m_leaf_type )
00164 {
00165 case RootData::Double:
00166 m_branch -> SetAddress ( & m_double_data );
00167 m_vector_double_data = & m_double_data;
00168 break;
00169 case RootData::Float:
00170 m_branch -> SetAddress ( & m_float_data );
00171 m_vector_float_data = & m_float_data;
00172 break;
00173 case RootData::Int:
00174 m_branch -> SetAddress ( & m_int_data );
00175 m_vector_int_data = & m_int_data;
00176 break;
00177 case RootData::UInt:
00178 m_branch -> SetAddress ( & m_uint_data );
00179 m_vector_uint_data = & m_uint_data;
00180 break;
00181 case RootData::ULong64:
00182 m_branch -> SetAddress ( & m_ulong64_data );
00183 m_vector_ulong64_data = & m_ulong64_data;
00184 break;
00185 default:
00186 assert ( false );
00187 break;
00188 }
00189 }
00190
00191 else if( m_number_elements > 1 )
00192 {
00193 switch ( m_leaf_type )
00194 {
00195 case RootData::Double:
00196 m_vector_double_data = new Double_t [ m_number_elements ];
00197 m_branch -> SetAddress ( m_vector_double_data );
00198 break;
00199 case RootData::Float:
00200 m_vector_float_data = new Float_t [ m_number_elements ];
00201 m_branch -> SetAddress ( m_vector_float_data );
00202 break;
00203 case RootData::Int:
00204 m_vector_int_data = new Int_t [ m_number_elements ];
00205 m_branch -> SetAddress ( m_vector_int_data );
00206 break;
00207 case RootData::UInt:
00208 m_vector_uint_data = new UInt_t [ m_number_elements ];
00209 m_branch -> SetAddress ( m_vector_uint_data );
00210 break;
00211 case RootData::Short:
00212 m_vector_short_data = new Short_t [ m_number_elements ];
00213 m_branch -> SetAddress ( m_vector_short_data );
00214 break;
00215 case RootData::UShort:
00216 m_vector_ushort_data = new UShort_t [ m_number_elements ];
00217 m_branch -> SetAddress ( m_vector_ushort_data );
00218 break;
00219 case RootData::Long64:
00220 m_vector_long64_data = new Long64_t [ m_number_elements ];
00221 m_branch -> SetAddress ( m_vector_long64_data );
00222 break;
00223 case RootData::ULong64:
00224 m_vector_ulong64_data = new ULong64_t [ m_number_elements ];
00225 m_branch -> SetAddress ( m_vector_ulong64_data );
00226 break;
00227 default:
00228 assert ( false );
00229 break;
00230 }
00231
00232 }
00233
00234 m_branch_set = true;
00235 }
00236
00237 unsigned int
00238 RootBranch::
00239 getRank () const
00240 {
00241 unsigned int size = m_shape.size();
00242
00243 return size;
00244 }
00245
00246 const vector < int > &
00247 RootBranch::
00248 getShape ()
00249 {
00250 return m_shape;
00251 }
00252
00253 void
00254 RootBranch::
00255 setReleventIndex( const std::vector< unsigned int > & index )
00256 {
00257
00258 assert( getRank () > 0 );
00259
00260
00261
00262 assert( getRank () == index.size() );
00263
00264
00265 m_releventIndex = index[0];
00266 for ( unsigned int d = 1; d < getRank (); d++ ) {
00267 m_releventIndex = m_releventIndex * m_shape [ d ] + index[ d ];
00268 }
00269 }
00270
00271 double
00272 RootBranch::
00273 valueAt ( unsigned int row ) const
00274 {
00275 if ( m_branch_set == false ) setBranchAddress ();
00276
00277 Int_t entry = row;
00278
00279 m_branch -> GetEntry ( entry, 1 );
00280
00281 double value = -1;
00282 if( m_number_elements == 1 )
00283 {
00284 switch ( m_leaf_type )
00285 {
00286 case RootData::Double:
00287 value = m_double_data;
00288 break;
00289 case RootData::Float:
00290 value = m_float_data;
00291 break;
00292 case RootData::Int:
00293 value = m_int_data;
00294 break;
00295 case RootData::UInt:
00296 value = m_uint_data;
00297 break;
00298 case RootData::Short:
00299 value = m_short_data;
00300 break;
00301 case RootData::UShort:
00302 value = m_ushort_data;
00303 break;
00304 case RootData::Long64:
00305 value = m_long64_data;
00306 break;
00307 case RootData::ULong64:
00308 value = m_ulong64_data;
00309 break;
00310 default:
00311 assert ( false );
00312 break;
00313 }
00314 }
00315 else
00316 {
00317 if ( m_releventIndex < 0 || m_number_elements <= m_releventIndex )
00318 {
00319
00320
00321
00322
00323
00324 return 0.0;
00325 }
00326
00327
00328 switch ( m_leaf_type )
00329 {
00330 case RootData::Double:
00331 value = m_vector_double_data [ m_releventIndex ];
00332 break;
00333 case RootData::Float:
00334 value = m_vector_float_data [ m_releventIndex ];
00335 break;
00336 case RootData::Int:
00337 value = m_vector_int_data [ m_releventIndex ];
00338 break;
00339 case RootData::UInt:
00340 value = m_vector_uint_data [ m_releventIndex ];
00341 break;
00342 case RootData::Short:
00343 value = m_vector_short_data [ m_releventIndex ];
00344 break;
00345 case RootData::UShort:
00346 value = m_vector_ushort_data [ m_releventIndex ];
00347 break;
00348 case RootData::Long64:
00349 value = m_vector_long64_data [ m_releventIndex ];
00350 break;
00351 case RootData::ULong64:
00352 value = m_vector_ulong64_data [ m_releventIndex ];
00353 break;
00354 default:
00355 assert ( false );
00356 }
00357 }
00358
00359 return value;
00360 }
00361
00362 double *
00363 RootBranch::
00364 doubleArrayAt ( unsigned int row )
00365 {
00366 if ( m_branch_set == false ) setBranchAddress ();
00367 Int_t entry = row;
00368
00369 m_branch -> GetEntry ( entry, 1 );
00370
00371 if ( m_leaf_type != RootData::Double ) {
00372 if ( m_vector_double_data == 0 ) {
00373 m_vector_double_data = new Double_t [ m_number_elements ];
00374 }
00375 switch ( m_leaf_type ) {
00376 case RootData::Float :
00377 std::copy ( m_vector_float_data,
00378 m_vector_float_data + m_number_elements,
00379 m_vector_double_data );
00380 break;
00381 case RootData::Int :
00382 std::copy ( m_vector_int_data,
00383 m_vector_int_data + m_number_elements,
00384 m_vector_double_data );
00385 break;
00386 case RootData::UInt :
00387 std::copy ( m_vector_uint_data,
00388 m_vector_uint_data + m_number_elements,
00389 m_vector_double_data );
00390 break;
00391 case RootData::Short :
00392 std::copy ( m_vector_short_data,
00393 m_vector_short_data + m_number_elements,
00394 m_vector_double_data );
00395 break;
00396 case RootData::UShort :
00397 std::copy ( m_vector_ushort_data,
00398 m_vector_ushort_data + m_number_elements,
00399 m_vector_double_data );
00400 break;
00401 case RootData::Long64 :
00402 std::copy ( m_vector_long64_data,
00403 m_vector_long64_data + m_number_elements,
00404 m_vector_double_data );
00405 break;
00406 case RootData::ULong64 :
00407 std::copy ( m_vector_ulong64_data,
00408 m_vector_ulong64_data + m_number_elements,
00409 m_vector_double_data );
00410 break;
00411 default:
00412 break;
00413 }
00414 }
00415
00416 return m_vector_double_data;
00417 }
00418
00419 float *
00420 RootBranch::
00421 floatArrayAt ( unsigned int row )
00422 {
00423 if ( m_branch_set == false ) setBranchAddress ();
00424 Int_t entry = row;
00425
00426 m_branch -> GetEntry ( entry, 1 );
00427
00428 return m_vector_float_data;
00429 }
00430
00431 int *
00432 RootBranch::
00433 intArrayAt ( unsigned int row )
00434 {
00435 if ( m_branch_set == false ) setBranchAddress ();
00436 Int_t entry = row;
00437
00438 m_branch -> GetEntry ( entry, 1 );
00439
00440 return m_vector_int_data;
00441 }
00442
00443 unsigned int *
00444 RootBranch::
00445 uintArrayAt ( unsigned int row )
00446 {
00447 if ( m_branch_set == false ) setBranchAddress ();
00448 Int_t entry = row;
00449
00450 m_branch -> GetEntry ( entry, 1 );
00451
00452 return m_vector_uint_data;
00453 }
00454
00455 RootData::Type
00456 RootBranch::
00457 getType () const
00458 {
00459 return m_leaf_type;
00460 }
00461
00462 bool
00463 RootBranch::
00464 isUseable () const
00465 {
00466 return m_useable;
00467 }