00001 00012 // for truncation warning 00013 #ifdef _MSC_VER 00014 #include "msdevstudio/MSconfig.h" 00015 #endif 00016 00017 #include "BinningProjectorXML.h" 00018 00019 #include "BinsBaseXML.h" 00020 #include "NTupleXML.h" 00021 00022 #include "XmlController.h" 00023 #include "XmlDocument.h" 00024 #include "XmlElement.h" 00025 00026 #include "axes/Range.h" 00027 #include "binners/BinsBase.h" 00028 #include "datasrcs/DataSource.h" 00029 #include "projectors/BinningProjector.h" 00030 00031 #include <cassert> 00032 00033 using std::list; 00034 using std::string; 00035 using std::vector; 00036 00037 using namespace hippodraw; 00038 00039 BinningProjectorXML::BinningProjectorXML ( XmlController * controller ) 00040 : BaseXML ( "BinningProjector", controller ) 00041 { 00042 m_binsbaseXML = new BinsBaseXML ( controller ); 00043 m_ntupleXML = new NTupleXML ( controller ); 00044 } 00045 00046 BinningProjectorXML:: 00047 ~BinningProjectorXML () 00048 { 00049 delete m_binsbaseXML; 00050 delete m_ntupleXML; 00051 } 00052 00053 XmlElement * 00054 BinningProjectorXML:: 00055 createElement ( const BinningProjector & projector ) 00056 { 00057 XmlElement * tag = BaseXML::createElement (); // in base class 00058 const void * addr = reinterpret_cast < const void * > ( & projector ); 00059 int id = m_controller -> getId ( addr ); 00060 setId ( *tag, id ); 00061 00062 createChildren ( tag, projector ); 00063 00064 return tag; 00065 } 00066 void 00067 BinningProjectorXML:: 00068 createChildren ( XmlElement * tag, const BinningProjector & projector ) 00069 { 00070 const BinsBase * bins = projector.getBinner (); 00071 XmlElement * element = m_binsbaseXML->createElement ( *bins ); 00072 00073 tag->appendChild ( *element ); 00074 delete element; 00075 00076 BinningProjector & proj = const_cast < BinningProjector & > ( projector ); 00077 if ( projector.hasDataSourceBindings () == false ) { 00078 proj.prepareValues (); 00079 const DataSource * ntuple = projector.getProjectedValues (); 00080 element = m_ntupleXML -> createElement ( *ntuple ); 00081 00082 tag -> appendChild ( *element ); 00083 delete element; 00084 } 00085 } 00086 00087 void 00088 BinningProjectorXML:: 00089 getObject ( const XmlElement * parent, ProjectorBase * pbase ) 00090 { 00091 const XmlElement * bp_element = getNode ( parent ); 00092 if ( bp_element == 0 ) return; 00093 00094 const XmlElement * element = m_binsbaseXML->getNode ( bp_element ); 00095 BinsBase * bins = m_binsbaseXML->createObject ( element ); 00096 00097 BinningProjector * projector = dynamic_cast < BinningProjector * > ( pbase ); 00098 projector->setBinner ( bins ); 00099 } 00100 00101 void 00102 BinningProjectorXML:: 00103 setBins ( const XmlElement * parent, ProjectorBase * pbase ) 00104 { 00105 const XmlElement * bp_element = getNode ( parent ); 00106 if ( bp_element == 0 ) return; 00107 00108 const XmlElement * nt_element = m_ntupleXML -> getNode ( bp_element ); 00109 const DataSource * ntuple = m_ntupleXML -> getObject ( *nt_element ); 00110 00111 BinningProjector * projector = dynamic_cast < BinningProjector * > ( pbase ); 00112 projector -> setBinContents ( ntuple ); 00113 }