00001 #include <cmath>
00002 #include "dataset.h"
00003 #include "linalg.h"
00004 #include "message.h"
00005
00007 bool CDataSet::Read(const parameterMap& com){
00008
00009 bool found_data=false;
00010
00011
00012 ndata=parameter::getI(com,"ndata",data.dim());
00013
00014 vector< vector < double > > empty_mat(0);
00015 vector< double > empty_vec(0);
00016
00017
00018 if (com.find("covmtx_datablock")!=com.end()) {
00019 MESSAGE << "loading covmtx_datablock"<<ENDM_INFO;
00020 covmtx=stl2tntMat(parameter::getM(com,"covmtx_datablock",empty_mat));
00021 covmtx_is_active=true;
00022 syncUncert();
00023 } else {
00024 covmtx_is_active=false;
00025 }
00026
00027
00028
00029 if ((com.find("ydy_datablock")==com.end())&&(com.find("y_datablock")==com.end())){
00030 MESSAGE << "Data set not found, setting to zero!" <<ENDM_INFO;
00031 Array1D<double> ytmp(ndata,0.), dytmp(ndata,0.);
00032 data=ytmp;
00033 uncert=dytmp;
00034 return false;
00035 }
00036
00037
00038
00039
00040 if (com.find("y_datablock")!=com.end()) {
00041 found_data=true;
00042 MESSAGE << "Loading y_datablock"<<ENDM_INFO;
00043 data = stl2tntVec(parameter::getV(com,"y_datablock",empty_vec));
00044 if (!covmtx_is_active) {Array1D<double> tmp(data.dim(),0.); uncert=tmp;}
00045 }
00046
00047
00048 if (com.find("ydy_datablock")!=com.end()) {
00049 found_data=true;
00050 MESSAGE << "Loading ydy_datablock"<<ENDM_INFO;
00051 vector< vector<double> > tmp;
00052 tmp = parameter::getM(com,"ydy_datablock",empty_mat);
00053 Array1D<double> y(tmp.size(),0.), dy(tmp.size(),0.);
00054 if (covmtx_is_active) {
00055 for (int i=0;i<y.dim();++i) {y[i]=tmp[i][0];}
00056 syncUncert();
00057 data = y;
00058 } else {
00059 for (int i=0;i<y.dim();++i) {y[i]=tmp[i][0];dy[i]=abs(tmp[i][1]);}
00060 data = y;
00061 uncert = dy;
00062 }
00063 }
00064
00065
00066 if (!checkArrayDimensions()) exit(-1);
00067 return found_data;
00068 }
00069
00071 bool CDataSet::Write(parameterMap& com){
00072 parameter::set(com,"ndata",ndata);
00073 if (covmtx_is_active){
00074 parameter::set(com,"covmtx_datablock",tnt2stlMat(covmtx));
00075 parameter::set(com,"y_datablock",tnt2stlVec(data));
00076 } else {
00077 Array2D<double> tmp(ndata,2,0.);
00078 for (int i=0;i<ndata;++i){tmp[i][0]=data[i];tmp[i][1]=uncert[i];}
00079 parameter::set(com,"ydy_datablock",tnt2stlMat(tmp));
00080 }
00081 return true;
00082 }
00083
00084
00085 bool CDataSet::checkArrayDimensions(void){
00086 bool result=true;
00087 if (data.dim() != ndata) {
00088 MESSAGE << "data array dim ("<<data.dim1()<<") != ndata ("<<ndata<<")!"<<ENDM_FATAL;
00089 result=false;
00090 }
00091 if (uncert.dim() != ndata) {
00092 MESSAGE << "uncert array dim ("<<uncert.dim1()<<") != ndata("<<ndata<<")!"<<ENDM_FATAL;
00093 result=false;
00094 }
00095 if (covmtx_is_active && (covmtx.dim1() != ndata)) {
00096 MESSAGE << "covmtx array dim1 ("<<covmtx.dim1()<<") != ndata("<<ndata<<")!"<<ENDM_FATAL;
00097 result=false;
00098 }
00099 if (covmtx_is_active && (covmtx.dim2() != ndata)) {
00100 MESSAGE << "covmtx array dim2 ("<<covmtx.dim2()<<") != ndata("<<ndata<<")!"<<ENDM_FATAL;
00101 result=false;
00102 }
00103 return result;
00104 }
00105
00107 bool CDataSet::redim(int N){
00108 ndata=N;
00109 Array1D<double> y(N,0.),dy(N,0.);
00110 data=y;uncert=dy;
00111 if (covmtx_is_active) {
00112 Array2D<double> cm(N,N,0.);
00113 covmtx=cm;
00114 } else {
00115 Array2D<double> cm(1,1,0.);
00116 covmtx=cm;
00117 }
00118 return true;
00119 }
00120
00122 void CDataSet::syncUncert(void){
00123 Array1D<double> u(ndata);
00124 for (int i=0;i<ndata;i++) u[i]=sqrt(abs(covmtx[i][i]));
00125 uncert=u;
00126 }
00127
00129 void CDataSet::syncCovMtx(void){
00130 Array2D<double> cov(ndata,ndata,0.);
00131 for (int i=0;i<ndata;++i){
00132 cov[i][i]=uncert[i]*uncert[i];
00133 }
00134 *const_cast<bool*>(&covmtx_is_active)=true;
00135 covmtx=cov;
00136 }
00137
00138