dataiterdecon.cpp
Go to the documentation of this file.00001 #include <iostream>
00002 #include <algorithm>
00003 #include <fstream>
00004 #include "miscfunc.h"
00005 #include "IterDecon.h"
00006 #include "CSeismicDataComp.h"
00007 #include "convert.h"
00008 #include <numeric>
00009 #include "VecMat.h"
00010 using namespace std;
00011 namespace ublas=boost::numeric::ublas;
00012 int main()
00013 {
00014 SeismicDataComp Radial,Vertical;
00015 std::string radfilename, verfilename;
00016 cout << "Radial Component: ";
00017 cin >> radfilename;
00018 cout << "Vertical Component: ";
00019 cin >> verfilename;
00020
00021 Radial.GetData(radfilename);
00022 Vertical.GetData(verfilename);
00023
00024
00025 std::vector<double> Filter(Radial.GetData().size());
00026 double variance = 10;
00027 int shift = 0;
00028 double normfactor = 1./(variance * sqrt(2.* acos(-1.)));
00029 for (unsigned int i = 0; i <= Filter.size()/2; ++i)
00030 {
00031 Filter.at(i) = normfactor * exp( -double((i-shift)*(i-shift))/(2. * variance * variance));
00032 Filter.at(Filter.size() -(i+1)) = normfactor * exp( -double((-i-1-shift)*(-i-1-shift))/(2. * variance * variance));
00033 }
00034
00035
00036 Convolve(Vertical.GetData(),Filter,Vertical.GetData());
00037 Convolve(Radial.GetData(),Filter,Radial.GetData());
00038
00039
00040
00041
00042 IterDecon Decon(Vertical.GetData().size());
00043 const double power = inner_product(Radial.GetData().begin(),Radial.GetData().end(),Radial.GetData().begin(),0.0);
00044 double error = power;
00045 double previouserror = 1.;
00046 std::string iter;
00047 std::string name;
00048 gplib::rvec Output(Vertical.GetData().size());
00049 gplib::rvec Current(Radial.GetData().size());
00050 gplib::rvec Ver(Vertical.GetData().size());
00051 gplib::rvec Rad(Radial.GetData().size());
00052 copy(Vertical.GetData().begin(),Vertical.GetData().end(),Ver.begin());
00053 copy(Radial.GetData().begin(),Radial.GetData().end(),Rad.begin());
00054 copy(Radial.GetData().begin(),Radial.GetData().end(),Current.begin());
00055
00056 for (int i = 0; i < 50; ++i)
00057 {
00058
00059 iter = stringify(i);
00060 Decon.AdaptFilter(Ver,Current);
00061 Decon.CalcOutput(Ver,Output);
00062
00063 ublas::vector<double> Corr(Radial.GetData().size());
00064 Correl(Ver,Current,Corr);
00065 name = "corr"+iter;
00066
00067
00068
00069 Current = Rad-Output;
00070 error = inner_product(Current.begin(),Current.end(),Current.begin(),0.0) /power;
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 previouserror = error;
00081
00082
00083 }
00084 string outfilename = radfilename + ".decon.rec";
00085 std::cout << "Name: " << outfilename << std::endl;
00086 std::cout << "Error: " << error *100 << " Improv: " << (previouserror - error)*100 << std::endl;
00087 SeismicDataComp Receiver;
00088 Receiver.GetData().assign(Decon.GetWeights().size(),0.0);
00089 copy(Decon.GetWeights().begin(),Decon.GetWeights().end(),Receiver.GetData().begin());
00090 Convolve(Receiver.GetData(),Filter,Receiver.GetData());
00091 Receiver.GetData().erase(Receiver.GetData().begin()+Receiver.GetData().size()/2,Receiver.GetData().end());
00092 Receiver.SetDt(Radial.GetDt());
00093 Receiver.SetB(0.0);
00094
00095 Receiver.WriteAsSac(outfilename);
00096 }