00001 #include "MTRecObjective.h"
00002 #include "GradFunc.h"
00003 #include "convert.h"
00004 #include "SeismicDataComp.h"
00005 #include "C1DMTSynthData.h"
00006 #include "netcdfcpp.h"
00007 #include <iostream>
00008 #include <fstream>
00009 #include <boost/bind.hpp>
00010 #include <gsl/gsl_math.h>
00011 #include "VecMat.h"
00012 #include "Adaptors.h"
00013 #include <algorithm>
00014 #include <string>
00015 #include "NetCDFTools.h"
00016 #include "ResPkModel.h"
00017 #include "C1dInvGaConf.h"
00018 #include "MatNorm.h"
00019 #include "MTFitSetup.h"
00020 using namespace std;
00021
00022 void DetermineEvalThreshold(ModelAnalysis &JointAnalyser, C1DMTSynthData &MTModel, gplib::rmat &DataCovar, gplib::rvec &modelerrors, gplib::rvec ¶meterthresholds)
00023 {
00024 const size_t nmodelparms = parameterthresholds.size();
00025 const size_t nlayers = nmodelparms/4;
00026 size_t eigenvindex = 0;
00027 gplib::rvec svals = JointAnalyser.GetSingularValues();
00028 gplib::rvec svalratios = svals;
00029 svalratios /= svals(0);
00030 cout << "Joint Singular Values : " << svals << endl;
00031 gplib::rmat ModelCovar;
00032 cout << "Model errors: " << modelerrors << endl;
00033 while (sum(modelerrors) < sum(parameterthresholds))
00034 {
00035 cout << "Ratio: " << svalratios(eigenvindex) << endl;
00036 JointAnalyser.SetRelativeSVDThreshold(svalratios(eigenvindex));
00037 cout << "Accum Model Errors: " << sum(modelerrors) << endl;
00038 cout << "Accum Threshold Errors: " << sum(parameterthresholds) << endl;
00039
00040 ModelCovar = JointAnalyser.GetModelCovariance(DataCovar);
00041 double currerr = 0;
00042 for (size_t i = 0; i < nlayers; ++i)
00043 modelerrors(i) = 2.3025 * MTModel.GetResistivities().at(i)*sqrt(ModelCovar(i,i));
00044 for (size_t i = nlayers; i < nmodelparms; ++i)
00045 {
00046 currerr = sqrt(ModelCovar(i,i));
00047 modelerrors(i) = currerr;
00048 }
00049 ++eigenvindex;
00050 }
00051 }
00052
00053
00054 int main()
00055 {
00056 SeismicDataComp RecData;
00057
00058 string datanamebase;
00059 cout << "Data name base: ";
00060 cin >> datanamebase;
00061 RecData.GetData(datanamebase+".rec");
00062 CMTStation MTData;
00063 MTData.GetData(datanamebase+".mtt");
00064
00065 C1dInvGaConf Configuration;
00066 Configuration.GetData("1dinvga.conf");
00067
00068 MTRecObjective JointObjective(MTData,RecData,Configuration.shift,Configuration.omega,
00069 Configuration.sigma,Configuration.cc,Configuration.slowness);
00070 double rfweight = 0;
00071 cout << "RF weight: ";
00072 cin >> rfweight;
00073 SetupMTFitParameters(Configuration,JointObjective.GetMTObjective());
00074 JointObjective.SetRecWeight(rfweight);
00075 JointObjective.GetRecObjective().SetPoisson(Configuration.poisson);
00076 JointObjective.GetRecObjective().SetTimeWindow(Configuration.starttime,Configuration.endtime);
00077 JointObjective.GetRecObjective().SetErrorLevel(Configuration.recerror);
00078 JointObjective.GetRecObjective().SetFitExponent(Configuration.recfitexponent);
00079 string modelnamebase;
00080 cout << "Model name base: ";
00081 cin >> modelnamebase;
00082 ResPkModel RecModel;
00083 RecModel.GetData(modelnamebase+"_rec.mod");
00084 C1DMTSynthData MTModel;
00085 MTModel.readmodel(modelnamebase+"_mt.mod");
00086
00087 const size_t nmodelparms = RecModel.SVelocity.size()*3;
00088 const size_t nlayers = RecModel.SVelocity.size();
00089 gplib::rvec JointModelVector(nmodelparms);
00090 for (size_t i = 0; i < nlayers; ++i)
00091 {
00092 JointModelVector(i) = log10(MTModel.GetResistivities().at(i));
00093 JointModelVector(i+nlayers) = RecModel.Thickness.at(i);
00094 JointModelVector(i+2*nlayers) = RecModel.SVelocity.at(i);
00095 }
00096
00097 gplib::rvec varfactor(nmodelparms);
00098 double errorratio = 0.1;
00099 cout << "Relative Error for Model parameters; ";
00100 cin >> errorratio;
00101 double JointOldRMS = JointObjective.CalcPerformance(JointModelVector);
00102
00103 cout << "RMS: " << JointOldRMS << endl;
00104
00105 for (size_t i = 0; i < nmodelparms; ++i)
00106 {
00107 varfactor(i) = 1.0;
00108 }
00109
00110 ModelAnalysis JointAnalyser(JointObjective);
00111 JointAnalyser.SetModel(JointModelVector);
00112 JointAnalyser.SetVariationFactor(varfactor);
00113 gplib::rvec svals = JointAnalyser.GetSingularValues();
00114 ofstream evals("jointevals.plot");
00115 for (size_t i = 0; i < svals.size(); ++i)
00116 evals << svals(i) << endl;
00117
00118
00119
00120
00121 gplib::rvec modelerrors(nmodelparms);
00122 for (size_t i = 0; i < nmodelparms; ++i)
00123 modelerrors(i) = 0.0;
00124
00125 gplib::rvec parameterthresholds = JointModelVector;
00126 for (size_t i = 0; i < nlayers; ++i)
00127 parameterthresholds(i) = pow(10,parameterthresholds(i)) * varfactor(i);
00128 for (size_t i = nlayers; i < nmodelparms; ++i)
00129 parameterthresholds(i) *= varfactor(i);
00130
00131 parameterthresholds *= errorratio;
00132
00133
00134
00135 const size_t nrecdata = RecData.GetData().size();
00136 const size_t nmtdata = MTData.GetMTData().size();
00137
00138
00139 C1DMTObjective::datafuncvector_t ErrorFunctions = JointObjective.GetMTObjective().GetErrorFunctions();
00140 const size_t nerrorfuncs = ErrorFunctions.size();
00141 gplib::rmat DataCovar(nrecdata+nerrorfuncs*nmtdata,nrecdata+nerrorfuncs*nmtdata);
00142 DataCovar *= 0.0;
00143 for (size_t e = 0; e < nerrorfuncs; ++e)
00144 {
00145 for (size_t i = 0; i < nmtdata; ++i)
00146 {
00147 DataCovar(i+e*nmtdata,i+e*nmtdata) = gsl_pow_2(ErrorFunctions.at(e)(&MTData.GetMTData().at(i)));
00148 }
00149 }
00150
00151 for (size_t i = nmtdata*nerrorfuncs; i < nmtdata*nerrorfuncs+nrecdata; ++i)
00152 {
00153 DataCovar(i,i) = gsl_pow_2(RecData.GetData().at(i-nmtdata*nerrorfuncs) * Configuration.recerror);
00154 }
00155
00156 ofstream recerrors("jointerrors");
00157 gplib::rmat ModelCovar = JointAnalyser.GetModelCovariance(DataCovar);
00158
00159 double svdthreshold;
00160 cout << "SVD Threshold (negative for automatic): ";
00161 cin >> svdthreshold;
00162 if (svdthreshold < 0.0)
00163 {
00164 DetermineEvalThreshold(JointAnalyser,MTModel,DataCovar,modelerrors,parameterthresholds);
00165 }
00166 else
00167 {
00168 JointAnalyser.SetRelativeSVDThreshold(svdthreshold);
00169 }
00170
00171
00172 ModelCovar = JointAnalyser.GetModelCovariance(DataCovar);
00173 double currerr = 0;
00174 for (size_t i = 0; i < nlayers; ++i)
00175 modelerrors(i) = 2.3025 * MTModel.GetResistivities().at(i)*sqrt(ModelCovar(i,i));
00176 for (size_t i = nlayers; i < nmodelparms; ++i)
00177 {
00178 currerr = sqrt(ModelCovar(i,i));
00179 modelerrors(i) = currerr;
00180 }
00181
00182
00183 std::vector<double> thickerr, svelerr, reserr;
00184
00185 for (int i = 0; i < nlayers; ++i)
00186 {
00187 reserr.push_back(modelerrors(i));
00188 thickerr.push_back(modelerrors(i+nlayers));
00189 svelerr.push_back(modelerrors(i+nlayers*2));
00190 }
00191
00192 cout << "Final Accum Model Errors: " << sum(modelerrors) << endl;
00193 cout << "Accum Threshold Errors: " << sum(parameterthresholds) << endl;
00194 WriteMatrixAsNetCDF("jointcovar.nc",ModelCovar);
00195 WriteMatrixAsNetCDF("jointcorr.nc",JointAnalyser.GetModelCorrelation(DataCovar));
00196 WriteMatrixAsNetCDF("jointsens.nc",JointAnalyser.GetSensitivityMatrix());
00197 WriteMatrixAsNetCDF("jointres.nc",JointAnalyser.GetModelResolution());
00198 WriteMatrixAsNetCDF("jointnull.nc",JointAnalyser.GetModelNullspace());
00199 WriteMatrixAsNetCDF("jointsinv.nc",JointAnalyser.GetSensitivityInverse());
00200
00201 RecModel.SetThickErrors(thickerr);
00202 RecModel.SetSVelErrors(svelerr);
00203 RecModel.PlotVelWithErrors("recerr.plot");
00204 MTModel.SetResistivityErrors(reserr);
00205 MTModel.SetThicknessErrors(thickerr);
00206 MTModel.writeplot("mterr.plot");
00207 }
00208