NTupleXML.cxx

Go to the documentation of this file.
00001 
00012 // for truncation warning
00013 #ifdef _MSC_VER
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016 
00017 #include "NTupleXML.h"
00018 
00019 #include "XmlController.h"
00020 #include "XmlDocument.h"
00021 #include "XmlElement.h"
00022 #include "XmlTextNode.h"
00023 
00024 #include "datasrcs/DataPointTuple.h"
00025 #include "datasrcs/NTupleController.h"
00026 #include "datasrcs/NTuple.h"
00027 #include "pattern/string_convert.h"
00028 
00029 #include <iterator>
00030 
00031 
00032 #include <sstream>
00033 using std::istringstream;
00034 
00035 using std::istream_iterator;
00036 using std::list;
00037 using std::string;
00038 using std::vector;
00039 
00040 using namespace hippodraw;
00041 
00042 NTupleXML::NTupleXML ( XmlController * controller )
00043   : BaseXML ( "NTuple", controller ),
00044     m_name ( "name" ),
00045     m_col_name ( "column" ),
00046     m_data ( "NTupleData" ),
00047     m_label ( "label" )
00048 {
00049 }
00050 
00051 XmlElement * NTupleXML::createElement ( const DataSource & ntuple )
00052 {
00053   XmlElement * tag = BaseXML::createElement ();
00054 
00055   setAttributes ( tag, ntuple );
00056 
00057   createChildren ( tag, ntuple);
00058 
00059   return tag;
00060 }
00061 
00062 
00063 void
00064 NTupleXML::
00065 setAttributes ( XmlElement * tag, const DataSource & ntuple )
00066 {
00067   const void * addr = reinterpret_cast < const void * > ( & ntuple );
00068   int id = m_controller -> getId ( addr );
00069   setId ( *tag, id );
00070 
00071   const string & full_name = ntuple.getName ();
00072   tag -> setAttribute ( m_name, full_name );
00073 }
00074 
00075 namespace dp = hippodraw::DataPoint2DTuple;
00076 
00077 void
00078 NTupleXML::
00079 createChildren ( XmlElement * tag, const DataSource & ntuple )
00080 {
00081   unsigned int columns = ntuple.columns ();
00082   if ( columns == dp::SIZE ) createChildren2D ( tag, ntuple );
00083   else createChildren2D ( tag, ntuple );
00084 }
00085 
00086 void
00087 NTupleXML::
00088 createChildren2D ( XmlElement * tag, const DataSource & ntuple )
00089 {
00090   static unsigned int cols [] 
00091     = { dp::X, dp::Y, dp::XERR, dp::YERR };
00092 
00093   for ( unsigned int i = 0; i < dp::SIZE; i++ ) {
00094     XmlElement * element
00095       = XmlController::m_xml_doc -> createElement ( m_data );
00096     element -> setAttribute ( m_col_name, i );
00097     const string & label = ntuple.getLabelAt ( cols[i] );
00098     element -> setAttribute ( m_label, label );
00099 
00100     const vector < double > & data = ntuple.getColumn ( cols[i] );
00101     unsigned int size = ntuple.rows ();
00102 
00103     string text;
00104     for ( unsigned int j = 0; j < size; j++ ) {
00105       text += String::convert ( data[j] );
00106       text += " ";
00107     }
00108 
00109     XmlTextNode * node 
00110       = XmlController::m_xml_doc -> createTextNode ( text );
00111     element -> appendChild ( *node );
00112     delete node;
00113 
00114     tag -> appendChild ( *element );
00115     delete element;
00116   }
00117 }
00118 
00121 void
00122 NTupleXML::
00123 createChildren3D ( XmlElement * tag, const DataSource & )
00124 {
00125   XmlTextNode * node 
00126     = XmlController::m_xml_doc -> createTextNode ( "XData" );
00127   tag -> appendChild ( *node );
00128   delete node;
00129 }
00130 
00133 string NTupleXML::getName ( const XmlElement & tag ) const
00134 {
00135   string name;
00136   bool ok = tag.attribute ( m_name, name );
00137 #ifndef STRING_CLEAR_DEFECT // change to ifdef when M4 macro is implemented
00138   if ( ! ok ) name.erase ( name.begin(), name.end() );
00139 #else
00140   if ( ! ok ) name.clear();
00141 #endif
00142 
00143   return name;
00144 }
00145 
00146 const DataSource * NTupleXML::getObject ( const XmlElement & tag )
00147 {
00148   list < XmlElement * > nodelist;
00149   tag.fillNodeList ( m_data, nodelist );
00150   unsigned int size = nodelist.size ();
00151 
00152   // tempoary holding area as no guarantee data comes back in order
00153   vector < vector < double > > columns ( size );
00154   vector < string > labels ( size );
00155 
00156   list < XmlElement * >::const_iterator first = nodelist.begin ();
00157     while ( first != nodelist.end() ) {
00158       XmlElement * elem = *first++;
00159     int column;
00160     bool ok = elem -> attribute ( m_col_name, column );
00161 
00162     string label;
00163     ok = elem -> attribute ( m_label, label );
00164     labels[column] = label;
00165 
00166     const string & text = elem -> getText ();
00167     istringstream stream ( text );
00168 
00169     copy ( istream_iterator<double> ( stream ),
00170            istream_iterator<double> (), back_inserter ( columns[column] ) );
00171   }
00172 
00173   NTuple * ntuple = new NTuple ();
00174   for ( unsigned int i = 0; i < size; i++ ) {
00175     ntuple -> addColumn ( labels[i], columns[i] );
00176   }
00177 
00178   return ntuple;
00179 }

Generated for HippoDraw Class Library by doxygen