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 &parameterthresholds)
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); // determine ratios to larges eigenvalue
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     //cout << "Relative SVD Threshold: ";
00124     //double svdthreshold = 0.0;
00125     //cin >> svdthreshold;
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 

Generated on Tue May 4 16:52:14 2010 for GPLIB++ by  doxygen 1.5.8