GPLIB++
jointanalys.cpp
Go to the documentation of this file.
1 #include "MTRecObjective.h"
2 #include "GradFunc.h"
3 #include "convert.h"
4 #include "SeismicDataComp.h"
5 #include "C1DMTSynthData.h"
6 #include "netcdfcpp.h"
7 #include <iostream>
8 #include <fstream>
9 #include <boost/bind.hpp>
10 #include "VecMat.h"
11 #include "Adaptors.h"
12 #include <algorithm>
13 #include <string>
14 #include "NetCDFTools.h"
15 #include "ResPkModel.h"
16 #include "C1dInvGaConf.h"
17 #include "MatNorm.h"
18 #include "MTFitSetup.h"
19 #include "NumUtil.h"
20 
21 using namespace std;
22 
24  C1DMTSynthData &MTModel, gplib::rmat &DataCovar, gplib::rvec &modelerrors,
25  gplib::rvec &parameterthresholds)
26  {
27  const size_t nmodelparms = parameterthresholds.size();
28  const size_t nlayers = nmodelparms / 4;
29  size_t eigenvindex = 0;
30  gplib::rvec svals = JointAnalyser.GetSingularValues();
31  gplib::rvec svalratios = svals;
32  svalratios /= svals(0); // determine ratios to larges eigenvalue
33  cout << "Joint Singular Values : " << svals << endl;
34  gplib::rmat ModelCovar;
35  cout << "Model errors: " << modelerrors << endl;
36  while (sum(modelerrors) < sum(parameterthresholds))
37  {
38  cout << "Ratio: " << svalratios(eigenvindex) << endl;
39  JointAnalyser.SetRelativeSVDThreshold(svalratios(eigenvindex));
40  cout << "Accum Model Errors: " << sum(modelerrors) << endl;
41  cout << "Accum Threshold Errors: " << sum(parameterthresholds) << endl;
42 
43  ModelCovar = JointAnalyser.GetModelCovariance(DataCovar);
44  double currerr = 0;
45  for (size_t i = 0; i < nlayers; ++i)
46  modelerrors(i) = 2.3025 * MTModel.GetResistivities().at(i) * sqrt(
47  ModelCovar(i, i));
48  for (size_t i = nlayers; i < nmodelparms; ++i)
49  {
50  currerr = sqrt(ModelCovar(i, i));
51  modelerrors(i) = currerr;
52  }
53  ++eigenvindex;
54  }
55  }
56 
57 int main()
58  {
59  SeismicDataComp RecData;
60 
61  string datanamebase;
62  cout << "Data name base: ";
63  cin >> datanamebase;
64  RecData.GetData(datanamebase + ".rec");
65  CMTStation MTData;
66  MTData.GetData(datanamebase + ".mtt");
67 
68  C1dInvGaConf Configuration;
69  Configuration.GetData("1dinvga.conf");
70 
71  MTRecObjective JointObjective(MTData, RecData, Configuration.shift,
72  Configuration.omega, Configuration.sigma, Configuration.cc,
73  Configuration.slowness);
74  double rfweight = 0;
75  cout << "RF weight: ";
76  cin >> rfweight;
77  SetupMTFitParameters(Configuration, JointObjective.GetMTObjective());
78  JointObjective.SetRecWeight(rfweight);
79  JointObjective.GetRecObjective().SetPoisson(Configuration.poisson);
80  JointObjective.GetRecObjective().SetTimeWindow(Configuration.starttime,
81  Configuration.endtime);
82  JointObjective.GetRecObjective().SetErrorLevel(Configuration.recerror);
83  JointObjective.GetRecObjective().SetFitExponent(
84  Configuration.recfitexponent);
85  string modelnamebase;
86  cout << "Model name base: ";
87  cin >> modelnamebase;
88  ResPkModel RecModel;
89  RecModel.GetData(modelnamebase + "_rec.mod");
90  C1DMTSynthData MTModel;
91  MTModel.readmodel(modelnamebase + "_mt.mod");
92 
93  const size_t nmodelparms = RecModel.SVelocity.size() * 3;
94  const size_t nlayers = RecModel.SVelocity.size();
95  gplib::rvec JointModelVector(nmodelparms);
96  for (size_t i = 0; i < nlayers; ++i)
97  {
98  JointModelVector(i) = log10(MTModel.GetResistivities().at(i));
99  JointModelVector(i + nlayers) = RecModel.Thickness.at(i);
100  JointModelVector(i + 2 * nlayers) = RecModel.SVelocity.at(i);
101  }
102 
103  gplib::rvec varfactor(nmodelparms);
104  double errorratio = 0.1;
105  cout << "Relative Error for Model parameters; ";
106  cin >> errorratio;
107  double JointOldRMS = JointObjective.CalcPerformance(JointModelVector);
108 
109  cout << "RMS: " << JointOldRMS << endl;
110 
111  for (size_t i = 0; i < nmodelparms; ++i)
112  {
113  varfactor(i) = 1.0;
114  }
115 
116  ModelAnalysis JointAnalyser(JointObjective);
117  JointAnalyser.SetModel(JointModelVector);
118  JointAnalyser.SetVariationFactor(varfactor);
119  gplib::rvec svals = JointAnalyser.GetSingularValues();
120  ofstream evals("jointevals.plot");
121  for (size_t i = 0; i < svals.size(); ++i)
122  evals << svals(i) << endl;
123  //cout << "Relative SVD Threshold: ";
124  //double svdthreshold = 0.0;
125  //cin >> svdthreshold;
126 
127  gplib::rvec modelerrors(nmodelparms);
128  for (size_t i = 0; i < nmodelparms; ++i)
129  modelerrors(i) = 0.0;
130 
131  gplib::rvec parameterthresholds = JointModelVector;
132  for (size_t i = 0; i < nlayers; ++i)
133  parameterthresholds(i) = pow(10, parameterthresholds(i)) * varfactor(i);
134  for (size_t i = nlayers; i < nmodelparms; ++i)
135  parameterthresholds(i) *= varfactor(i);
136 
137  parameterthresholds *= errorratio;
138 
139  const size_t nrecdata = RecData.GetData().size();
140  const size_t nmtdata = MTData.GetMTData().size();
141 
142  C1DMTObjective::datafuncvector_t ErrorFunctions =
143  JointObjective.GetMTObjective().GetErrorFunctions();
144  const size_t nerrorfuncs = ErrorFunctions.size();
145  gplib::rmat DataCovar(nrecdata + nerrorfuncs * nmtdata, nrecdata
146  + nerrorfuncs * nmtdata);
147  fill_n(DataCovar.data().begin(), DataCovar.size1() * DataCovar.size2(), 0.0);
148  for (size_t e = 0; e < nerrorfuncs; ++e)
149  {
150  for (size_t i = 0; i < nmtdata; ++i)
151  {
152  DataCovar(i + e * nmtdata, i + e * nmtdata) = gplib::pow2(
153  ErrorFunctions.at(e)(&MTData.GetMTData().at(i)));
154  }
155  }
156 
157  for (size_t i = nmtdata * nerrorfuncs; i < nmtdata * nerrorfuncs + nrecdata; ++i)
158  {
159  DataCovar(i, i) = gplib::pow2(RecData.GetData().at(i - nmtdata
160  * nerrorfuncs) * Configuration.recerror);
161  }
162 
163  ofstream recerrors("jointerrors");
164  gplib::rmat ModelCovar = JointAnalyser.GetModelCovariance(DataCovar);
165 
166  double svdthreshold;
167  cout << "SVD Threshold (negative for automatic): ";
168  cin >> svdthreshold;
169  if (svdthreshold < 0.0)
170  {
171  DetermineEvalThreshold(JointAnalyser, MTModel, DataCovar, modelerrors,
172  parameterthresholds);
173  }
174  else
175  {
176  JointAnalyser.SetRelativeSVDThreshold(svdthreshold);
177  }
178 
179  ModelCovar = JointAnalyser.GetModelCovariance(DataCovar);
180  double currerr = 0;
181  for (size_t i = 0; i < nlayers; ++i)
182  modelerrors(i) = 2.3025 * MTModel.GetResistivities().at(i) * sqrt(
183  ModelCovar(i, i));
184  for (size_t i = nlayers; i < nmodelparms; ++i)
185  {
186  currerr = sqrt(ModelCovar(i, i));
187  modelerrors(i) = currerr;
188  }
189 
190  std::vector<double> thickerr, svelerr, reserr;
191 
192  for (int i = 0; i < nlayers; ++i)
193  {
194  reserr.push_back(modelerrors(i));
195  thickerr.push_back(modelerrors(i + nlayers));
196  svelerr.push_back(modelerrors(i + nlayers * 2));
197  }
198 
199  cout << "Final Accum Model Errors: " << sum(modelerrors) << endl;
200  cout << "Accum Threshold Errors: " << sum(parameterthresholds) << endl;
201  WriteMatrixAsNetCDF("jointcovar.nc", ModelCovar);
202  WriteMatrixAsNetCDF("jointcorr.nc", JointAnalyser.GetModelCorrelation(
203  DataCovar));
204  WriteMatrixAsNetCDF("jointsens.nc", JointAnalyser.GetSensitivityMatrix());
205  WriteMatrixAsNetCDF("jointres.nc", JointAnalyser.GetModelResolution());
206  WriteMatrixAsNetCDF("jointnull.nc", JointAnalyser.GetModelNullspace());
207  WriteMatrixAsNetCDF("jointsinv.nc", JointAnalyser.GetSensitivityInverse());
208 
209  RecModel.SetThickErrors(thickerr);
210  RecModel.SetSVelErrors(svelerr);
211  RecModel.PlotVelWithErrors("recerr.plot");
212  MTModel.SetResistivityErrors(reserr);
213  MTModel.SetThicknessErrors(thickerr);
214  MTModel.writeplot("mterr.plot");
215  }
216 
gplib::rmat GetModelCorrelation(const gplib::rmat &DataCovar)
Definition: GradFunc.cpp:181
void SetupMTFitParameters(const tConfObject &Configuration, C1DMTObjective &Objective)
Definition: MTFitSetup.h:8
gplib::rmat GetModelNullspace()
Definition: GradFunc.cpp:165
void SetVariationFactor(const gplib::rvec varfac)
Definition: GradFunc.h:41
gplib::rvec GetSingularValues()
Definition: GradFunc.cpp:201
int main()
Definition: jointanalys.cpp:57
void SetModel(const gplib::rvec &TheModel)
Definition: GradFunc.cpp:87
CMTStation MTData
Definition: cadijoint.cpp:15
gplib::rmat GetModelCovariance(const gplib::rmat &DataCovar)
The calculation of the Model Covariance is based on Menke, p. 122 formula 7.37.
Definition: GradFunc.cpp:172
const gplib::rmat & GetSensitivityMatrix()
Definition: GradFunc.h:51
void SetRelativeSVDThreshold(const double t)
Definition: GradFunc.h:46
gplib::rmat GetModelResolution()
Definition: GradFunc.cpp:155
The class ModelAnalysis is used to calculate resolution matrix, nullspace and other parameters for mo...
Definition: GradFunc.h:20
CLevanisoConf Configuration
Definition: cadianiso.cpp:17
SeismicDataComp RecData
Definition: cadijoint.cpp:16
void DetermineEvalThreshold(ModelAnalysis &JointAnalyser, C1DMTSynthData &MTModel, gplib::rmat &DataCovar, gplib::rvec &modelerrors, gplib::rvec &parameterthresholds)
Definition: jointanalys.cpp:23
const gplib::rmat & GetSensitivityInverse() const
Definition: GradFunc.h:56