00001
00012
00013 #ifdef _MSC_VER
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016
00017 #include "DataRepXML.h"
00018
00019 #include "BinningProjectorXML.h"
00020 #include "NTupleProjectorXML.h"
00021 #include "FunctionProjectorXML.h"
00022 #include "MapMatrixProjectorXML.h"
00023 #include "PointRepXML.h"
00024 #include "XmlController.h"
00025 #include "XmlDocument.h"
00026 #include "XmlElement.h"
00027
00028 #include "controllers/DataRepController.h"
00029 #include "controllers/FunctionController.h"
00030
00031 #include "datareps/DataRepException.h"
00032 #include "datareps/FunctionRep.h"
00033 #include "datareps/TextDataRep.h"
00034
00035 #include "datasrcs/DataSource.h"
00036 #include "plotters/PlotterBase.h"
00037
00038 #include "projectors/BinningProjector.h"
00039 #include "projectors/MapMatrixProjector.h"
00040 #include "projectors/FunctionProjector.h"
00041
00042 #include "reps/RepBase.h"
00043
00044 #include <cassert>
00045
00046 using std::string;
00047 using std::vector;
00048
00049 DataRepXML::DataRepXML ( XmlController * controller )
00050 : BaseXML ( "DataRep", controller ),
00051 m_contours ( "contours" )
00052 {
00053 m_pointrep = new PointRepXML ( controller );
00054 m_nTupleProjector = new NTupleProjectorXML ( controller );
00055 m_binningProjectorXML = new BinningProjectorXML ( controller );
00056 m_functionProjector = new FunctionProjectorXML ( controller );
00057 m_mapMatrixProjectorXML = new MapMatrixProjectorXML ( controller );
00058 }
00059
00060 XmlElement * DataRepXML::createElement ( const DataRep & rep )
00061 {
00062 XmlElement * tag = BaseXML::createElement ();
00063
00064 const void * addr = reinterpret_cast < const void * > ( & rep );
00065 int id = m_controller -> getId ( addr );
00066 setId ( *tag, id );
00067 tag->setAttribute ( m_type, rep.name() );
00068
00069 createChildren ( *tag, rep );
00070
00071 return tag;
00072 }
00073
00074
00075 void DataRepXML::createChildren ( XmlElement & tag,
00076 const NTupleProjector * projector )
00077 {
00078 NTupleProjectorXML * qt_projector
00079 = dynamic_cast < NTupleProjectorXML * > ( m_nTupleProjector );
00080 XmlElement * element = qt_projector->createElement ( *projector );
00081
00082 tag.appendChild ( *element );
00083 }
00084
00085 void
00086 DataRepXML::
00087 createChildren ( XmlElement & tag, const BinningProjector * projector )
00088 {
00089 XmlElement * element
00090 = m_binningProjectorXML -> createElement ( *projector );
00091 tag.appendChild ( *element );
00092 }
00093
00094 void
00095 DataRepXML::
00096 createChildren ( XmlElement & tag, const MapMatrixProjector * projector )
00097 {
00098 XmlElement * element
00099 = m_mapMatrixProjectorXML -> createElement ( *projector );
00100 tag.appendChild ( *element );
00101 }
00102
00103 void DataRepXML::createChildren ( XmlElement & tag,
00104 const FunctionProjector * projector )
00105 {
00106 FunctionProjectorXML * qt_projector
00107 = dynamic_cast < FunctionProjectorXML * > ( m_functionProjector );
00108 XmlElement * element = qt_projector->createElement ( *projector );
00109
00110 tag.appendChild ( *element );
00111 }
00112
00113 void DataRepXML::createChildren ( XmlElement & tag, const DataRep & rep )
00114 {
00115 RepBase * pointrep = rep.getRepresentation ();
00116 XmlElement * element = m_pointrep->createElement ( *pointrep );
00117
00118 tag.appendChild ( *element );
00119
00120 ProjectorBase * projbase = rep.getProjector ();
00121
00122 if ( rep.hasNTupleBindings () )
00123 {
00124 const NTupleProjector * projector
00125 = dynamic_cast < const NTupleProjector * > ( projbase );
00126 createChildren ( tag, projector );
00127 }
00128
00129 const BinningProjector * binProjector
00130 = dynamic_cast < const BinningProjector * > ( projbase );
00131 if ( binProjector != 0 )
00132 {
00133 createChildren ( tag, binProjector );
00134 }
00135
00136 const FunctionProjector * functionProjector
00137 = dynamic_cast < const FunctionProjector * > ( projbase );
00138 if ( functionProjector != 0 )
00139 {
00140 createFunctionTargetChild ( tag, rep );
00141 createChildren ( tag, functionProjector );
00142 }
00143
00144 const MapMatrixProjector * mapMatrixProjector
00145 = dynamic_cast < const MapMatrixProjector * > ( projbase );
00146 if ( mapMatrixProjector != 0 ) {
00147 createChildren ( tag, mapMatrixProjector );
00148 }
00149
00150 }
00151
00152 void DataRepXML::
00153 createFunctionTargetChild ( XmlElement & tag, const DataRep & rep )
00154 {
00155 const FunctionRep & frep = dynamic_cast < const FunctionRep & > ( rep );
00156 DataRep * target = frep.getTarget ();
00157 const void * addr = reinterpret_cast < const void * > ( target );
00158 int id = m_controller -> getId ( addr );
00159 XmlElement * element
00160 = XmlController::m_xml_doc->createElement ( "FunctionTarget" );
00161 element->setAttribute ( "id", id );
00162 tag.appendChild ( *element );
00163
00164 }
00165
00166 DataRep *
00167 DataRepXML::
00168 createDataRep ( const XmlElement * element )
00169 {
00170 DataRep * rep = 0;
00171
00172 string type;
00173 bool ok = element -> attribute ( m_type, type );
00174 assert ( ok );
00175
00176 DataRepController * controller = DataRepController::instance ();
00177 try {
00178 rep = controller -> createDataRep ( type );
00179 }
00180 catch ( const DataRepException & ) {
00181
00182 }
00183
00184 return rep;
00185 }
00186
00187 DataRep *
00188 DataRepXML::
00189 createDataRep ( const XmlElement * element, const XmlElement * ntp_element )
00190 {
00191 string type;
00192 bool ok = element->attribute ( m_type, type );
00193 assert ( ok );
00194
00195 int ref = m_nTupleProjector->getNTupleReference ( ntp_element );
00196 const DataSource * ntuple = m_controller->getDataSource ( ref );
00197 assert ( ntuple != 0 );
00198
00199 vector < string > bindings;
00200 m_nTupleProjector->getBindings ( ntp_element, bindings );
00201
00202 DataRepController * controller = DataRepController::instance();
00203 DataRep * rep
00204 = controller->createDataRep ( type, ntuple, bindings );
00205
00206 ProjectorBase * pbase = rep->getProjector ();
00207 NTupleProjector * projector
00208 = dynamic_cast < NTupleProjector * > ( pbase );
00209 if ( projector != 0 ) {
00210 m_nTupleProjector->addCuts ( ntp_element, projector );
00211 }
00212
00213 return rep;
00214 }
00215
00216 DataRep * DataRepXML::getTextRepObject ( const XmlElement * dr_element )
00217 {
00218 TextDataRep * rep = new TextDataRep ();
00219 return rep;
00220 }
00221
00222 DataRep * DataRepXML::createObject ( const XmlElement * dr_element )
00223 {
00224 DataRep * rep = 0;
00225
00226 const XmlElement * element
00227 = m_nTupleProjector->getNode ( dr_element );
00228
00229 if ( element != 0 ) {
00230 rep = createDataRep ( dr_element, element );
00231 ProjectorBase * projector = rep->getProjector ();
00232 m_binningProjectorXML->getObject ( dr_element, projector );
00233 }
00234
00235 element = m_mapMatrixProjectorXML -> getNode ( dr_element );
00236 if ( element != 0 ) {
00237 ProjectorBase * projector = rep -> getProjector ();
00238 m_mapMatrixProjectorXML -> setAttributes ( element, projector );
00239 }
00240
00241 element = m_functionProjector->getNode ( dr_element );
00242 if ( element != 0 ) {
00243 XmlElement * targetelement = dr_element->getNode ( "FunctionTarget" );
00244 assert ( targetelement );
00245 int id = targetelement->getID ();
00246 DataRep * target = m_controller->getDataRep ( id );
00247 assert ( target );
00248 rep = m_functionProjector -> createFunctionRep ( element, target );
00249 }
00250
00251 if ( element == 0 ) {
00252 const XmlElement * element
00253 = m_nTupleProjector->getNode ( dr_element );
00254 if ( element == 0 ) {
00255 rep = createDataRep ( dr_element );
00256 if ( rep != 0 ) {
00257 ProjectorBase * projector = rep -> getProjector ();
00258 m_binningProjectorXML -> getObject ( dr_element, projector );
00259 m_binningProjectorXML -> setBins ( dr_element, projector );
00260 }
00261 }
00262 }
00263
00264 string type;
00265 bool ok = dr_element->attribute ( m_type, type );
00266 assert ( ok );
00267
00268 if ( type == "TextDataRep" ) {
00269 rep = getTextRepObject ( dr_element );
00270 }
00271
00272 if ( rep == 0 ) return 0;
00273
00274 const XmlElement * pr_element = m_pointrep->getNode ( dr_element );
00275 assert ( pr_element );
00276 RepBase * pr = m_pointrep->createObject ( pr_element );
00277 rep->setRepresentation ( pr );
00278
00279 return rep;
00280 }