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

Generated on Fri Jul 4 15:30:20 2008 for GPLIB++ by  doxygen 1.5.5