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