00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "Profile2DTranslator.h"
00031 #include "AIDA/IProfile2D.h"
00032 #include "AIDA_Dev/IDevProfile2D.h"
00033 #include "AIDA_Dev/IDevHistogramFactory.h"
00034 #include "AIDA/IAxis.h"
00035
00036 #include "DataXML/DataObject.h"
00037
00038 static const std::string emptyString = "";
00039
00041 Anaphe::AIDA_XMLStore::Profile2DTranslator::Profile2DTranslator(const AIDA::IProfile2D * histo, const std::string & name, const std::string & path ) :
00042 m_histo(histo), m_name(name), m_path(path)
00043 {
00044 }
00046 Anaphe::AIDA_XMLStore::Profile2DTranslator::Profile2DTranslator(const DataXML::DataObject * xmlObject) :
00047 m_element(*xmlObject)
00048 {
00049 }
00050
00051
00052 Anaphe::AIDA_XMLStore::Profile2DTranslator::~Profile2DTranslator()
00053 {
00054 }
00055
00056 Anaphe::AIDA_XMLStore::Profile2DTranslator::Profile2DTranslator(const Anaphe::AIDA_XMLStore::Profile2DTranslator &)
00057 {
00058 }
00059
00060 Anaphe::AIDA_XMLStore::Profile2DTranslator & Anaphe::AIDA_XMLStore::Profile2DTranslator::operator = (const Anaphe::AIDA_XMLStore::Profile2DTranslator &rhs)
00061 {
00062 if (this == &rhs) return *this;
00063
00064 return *this;
00065 }
00066
00067 bool Anaphe::AIDA_XMLStore::Profile2DTranslator::toXML()
00068 {
00069
00070 appendObjectHeader(m_element,"profile2d",m_name,m_histo->title(),m_path);
00071
00072 appendAnnotation(m_element,m_histo->annotation());
00073 if (!setAxes() ) return false;
00074 if (!setStatistics() ) return false;
00075 if (!setData () ) return false;
00076 return true;
00077
00078 }
00079
00080 bool Anaphe::AIDA_XMLStore::Profile2DTranslator::setAxes()
00081 {
00082 appendAxis (m_element, "x", m_histo->xAxis());
00083 appendAxis (m_element, "y", m_histo->yAxis());
00084 return true;
00085 }
00086
00087
00090
00091 bool Anaphe::AIDA_XMLStore::Profile2DTranslator::setStatistics()
00092 {
00093 DataXML::DataObject allStatisticsElement;
00094 allStatisticsElement.setName("statistics");
00095 allStatisticsElement.setAttribute("entries", toString(m_histo->entries()));
00096
00097
00098 appendStatistics(allStatisticsElement, "x", m_histo->meanX(), m_histo->rmsX());
00099 appendStatistics(allStatisticsElement, "y", m_histo->meanY(), m_histo->rmsY());
00100 m_element.appendChild(allStatisticsElement);
00101 return true;
00102 }
00103
00104
00105 bool Anaphe::AIDA_XMLStore::Profile2DTranslator::setData()
00106 {
00107
00108
00109 DataXML::DataObject dataElement;
00110 dataElement.setName("data2d");
00111 const int nbx = (m_histo->xAxis()).bins();
00112 const int nby = (m_histo->yAxis()).bins();
00113 for (int i = -2; i < nbx; ++i) {
00114 for (int j = -2; j < nby; ++j ) {
00115 int entries = m_histo->binEntries(i,j);
00116 double height = m_histo->binHeight (i,j);
00117 double error = m_histo->binError (i,j);
00118 double binMeanX = m_histo->binMeanX (i,j);
00119 double binMeanY = m_histo->binMeanY (i,j);
00120 double rms = m_histo->binRms (i,j);
00121 appendHisto2DBinData(dataElement, i, j, entries, height, error, binMeanX, binMeanY,rms);
00122 }
00123 }
00124 m_element.appendChild(dataElement);
00125 return true;
00126 }
00127
00129
00130 AIDA::Dev::IDevProfile2D * Anaphe::AIDA_XMLStore::Profile2DTranslator::createFromXML(AIDA::Dev::IDevHistogramFactory& factory)
00131 {
00132
00133 std::string title, options;
00134 getObjectHeader(m_element,m_name,title,m_path,options);
00135
00136
00137 AnnotationData annoData;
00138 getAnnotation(m_element,annoData);
00139
00140
00141 int numberOfBinsX = 0;
00142 double lowerEdgeX = 0;
00143 double upperEdgeX = 0;
00144 std::vector<double> edgesX;
00145 getAxis(m_element,"x",numberOfBinsX,lowerEdgeX,upperEdgeX,edgesX);
00146 int numberOfBinsY = 0;
00147 double lowerEdgeY = 0;
00148 double upperEdgeY = 0;
00149 std::vector<double> edgesY;
00150 getAxis(m_element,"y",numberOfBinsY,lowerEdgeY,upperEdgeY,edgesY);
00151
00152
00153
00154
00155 AIDA::Dev::IDevProfile2D * h = 0;
00156 if (edgesX.empty() )
00157
00158 h = factory.createProfile2D( title, numberOfBinsX, lowerEdgeX, upperEdgeX, numberOfBinsY, lowerEdgeY, upperEdgeY );
00159 else
00160
00161 h = factory.createProfile2D( title, edgesX, edgesY, emptyString );
00162
00163
00164
00165
00166 AIDA::IAnnotation & anno = h->annotation();
00167 setAnnotation(&anno,annoData);
00168
00169
00170
00171 const DataXML::DataObject * dataElement = m_element.getChild("data2d");
00172 if (!dataElement) return h;
00173 for (std::vector<DataXML::DataObject>::const_iterator binElement = dataElement->children().begin(); binElement != dataElement->children().end(); ++binElement) {
00174 if (binElement->name() == "bin2d") {
00175 int xbin,ybin = -999;
00176 int entries = 0;
00177
00178 double height, error, wMeanX, wMeanY, wRmsX, wRmsY, error2, rms = 0;
00179 getHisto2DBinData(*binElement,xbin,ybin,entries,height,error,wMeanX,wMeanY,wRmsX,wRmsY,error2, rms);
00180
00181
00182 h->setBinContents(xbin,ybin,entries, height, error, rms, wMeanX, wMeanY);
00183 }
00184 }
00185
00186 return h;
00187 }