RootBranch.cxx

Go to the documentation of this file.
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 ); // branch doesn't know its size yet
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   //Creating the list of dropped delimiters. 
00137   boost::char_separator< char > sep( "][" );  
00138 
00139   // A tokenizer with above dropped delimiters.
00140   typedef boost::tokenizer< boost::char_separator< char > >  tokenizer;
00141   tokenizer tok( s, sep );
00142   
00143   // Start extracting the dimension sizes.
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   // This function makes sense only for multi dimenstional data
00258   assert( getRank () > 0 );
00259   
00260   // Index should completely specify the entry of the data in the matrix
00261   // So it should have as many enteries as the dimensions of the data
00262   assert( getRank () == index.size() );
00263   
00264   // Clear old relevent entry and put in this new ones.
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   //Int_t bytes =
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           // Temporary patch so other columns can be wriiten
00320 //        std::string what ( "RootBranch: `" );
00321 //        what += m_leaf -> GetTitle ();
00322 //        what += "' indices not set properly.";
00323 //        throw DataSourceException ( what );
00324           return 0.0;
00325         }
00326 
00327       // The basic conversion formulae
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   // Int_t bytes =
00369   m_branch -> GetEntry ( entry, 1 );
00370 
00371   if ( m_leaf_type != RootData::Double ) { // need to convert
00372     if ( m_vector_double_data == 0 ) { // memory not yet allocated
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   // Int_t bytes =
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   // Int_t bytes =
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   // Int_t_bytes =
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 }

Generated for HippoDraw Class Library by doxygen