Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

DataRepXML.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 "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     // do nothing
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 ) { // bound to ntuple
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 ) { // not any of above
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 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3