00001
00012
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
00028 #include <iterator>
00029
00030
00031 #ifdef SSTREAM_DEFECT
00032 #include <strstream>
00033 using std::ostrstream;
00034 #else
00035 #include <sstream>
00036 using std::istringstream;
00037 using std::ostringstream;
00038 #endif
00039
00040 using namespace hippodraw;
00041
00042 using std::istream_iterator;
00043 using std::list;
00044 using std::string;
00045 using std::vector;
00046
00047 NTupleXML::NTupleXML ( XmlController * controller )
00048 : BaseXML ( "NTuple", controller ),
00049 m_name ( "name" ),
00050 m_col_name ( "column" ),
00051 m_data ( "NTupleData" ),
00052 m_label ( "label" )
00053 {
00054 }
00055
00056 XmlElement * NTupleXML::createElement ( const DataSource & ntuple )
00057 {
00058 XmlElement * tag = BaseXML::createElement ();
00059
00060 setAttributes ( tag, ntuple );
00061
00062 createChildren ( tag, ntuple);
00063
00064 return tag;
00065 }
00066
00067
00068 void
00069 NTupleXML::
00070 setAttributes ( XmlElement * tag, const DataSource & ntuple )
00071 {
00072 unsigned int id = reinterpret_cast < unsigned int > ( &ntuple );
00073 setId ( *tag, id );
00074
00075 const string & full_name = ntuple.getName ();
00076 tag -> setAttribute ( m_name, full_name );
00077 }
00078
00079 namespace dp = hippodraw::DataPoint2DTuple;
00080
00081 void
00082 NTupleXML::
00083 createChildren ( XmlElement * tag, const DataSource & ntuple )
00084 {
00085 unsigned int columns = ntuple.columns ();
00086 if ( columns == dp::SIZE ) createChildren2D ( tag, ntuple );
00087 else createChildren2D ( tag, ntuple );
00088 }
00089
00090 void
00091 NTupleXML::
00092 createChildren2D ( XmlElement * tag, const DataSource & ntuple )
00093 {
00094 static unsigned int cols []
00095 = { dp::X, dp::Y, dp::XERR, dp::YERR };
00096
00097 for ( unsigned int i = 0; i < dp::SIZE; i++ ) {
00098 XmlElement * element
00099 = XmlController::m_xml_doc -> createElement ( m_data );
00100 element -> setAttribute ( m_col_name, i );
00101 const string & label = ntuple.getLabelAt ( cols[i] );
00102 element -> setAttribute ( m_label, label );
00103
00104 const vector < double > & data = ntuple.getColumn ( cols[i] );
00105 unsigned int size = ntuple.rows ();
00106
00107 #ifdef SSTREAM_DEFECT
00108 ostrstream strm_text;
00109 #else
00110 ostringstream strm_text;
00111 #endif
00112 for ( unsigned int j = 0; j < size; j++ ) {
00113 strm_text << data[j] << " ";
00114 }
00115 strm_text << std::ends;
00116 const string sdata = strm_text.str();
00117
00118 XmlTextNode * node = XmlController::m_xml_doc -> createTextNode ( sdata );
00119 element -> appendChild ( *node );
00120 tag -> appendChild ( *element );
00121 }
00122 }
00123
00124 void
00125 NTupleXML::
00126 createChildren3D ( XmlElement * tag, const DataSource & ntuple )
00127 {
00128 XmlTextNode * node
00129 = XmlController::m_xml_doc -> createTextNode ( "XData" );
00130 tag -> appendChild ( *node );
00131 }
00132
00135 string NTupleXML::getName ( const XmlElement & tag ) const
00136 {
00137 string name;
00138 bool ok = tag.attribute ( m_name, name );
00139 #ifndef STRING_CLEAR_DEFECT // change to ifdef when M4 macro is implemented
00140 if ( ! ok ) name.erase ( name.begin(), name.end() );
00141 #else
00142 if ( ! ok ) name.clear();
00143 #endif
00144
00145 return name;
00146 }
00147
00148 const DataSource * NTupleXML::getObject ( const XmlElement & tag )
00149 {
00150 list < XmlElement * > nodelist;
00151 tag.fillNodeList ( m_data, nodelist );
00152 unsigned int size = nodelist.size ();
00153
00154
00155 vector < vector < double > > columns ( size );
00156 vector < string > labels ( size );
00157
00158 list < XmlElement * >::const_iterator first = nodelist.begin ();
00159 while ( first != nodelist.end() ) {
00160 XmlElement * elem = *first++;
00161 int column;
00162 bool ok = elem -> attribute ( m_col_name, column );
00163
00164 string label;
00165 ok = elem -> attribute ( m_label, label );
00166 labels[column] = label;
00167
00168 const string & text = elem -> getText ();
00169 istringstream stream ( text );
00170
00171 copy ( istream_iterator<double> ( stream ),
00172 istream_iterator<double> (), back_inserter ( columns[column] ) );
00173 }
00174
00175 NTuple * ntuple = new NTuple ();
00176 for ( unsigned int i = 0; i < size; i++ ) {
00177 ntuple -> addColumn ( labels[i], columns[i] );
00178 }
00179
00180 return ntuple;
00181 }