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         //Radial.GetData().insert(Radial.GetData().end(),Radial.GetData().size(),0.0);
00024         //Vertical.GetData().insert(Vertical.GetData().end(),Vertical.GetData().size(),0.0);
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     //std::ofstream filterfile("filter");
00035     //std::copy(Filter.begin(),Filter.end(),std::ostream_iterator<double>(filterfile,"\n"));
00036         Convolve(Vertical.GetData(),Filter,Vertical.GetData());
00037         Convolve(Radial.GetData(),Filter,Radial.GetData());
00038         //std::ofstream ts1filt("smpf.z"),ts2filt("smpf.r");
00039         //std::copy(Vertical.GetData().begin(),Vertical.GetData().end(),std::ostream_iterator<double>(ts1filt,"\n"));
00040         //std::copy(Radial.GetData().begin(),Radial.GetData().end(),std::ostream_iterator<double>(ts2filt,"\n"));
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         //copy(Radial.GetData().begin(),Radial.GetData().end(),Output.begin());
00056         for (int i = 0; i < 50; ++i)
00057         {
00058                 //std::cout << std::endl << "Iteration: " << i << std::endl;
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          //ofstream corrfile(name.c_str());
00067          //std::copy(Corr.begin(),Corr.end(),std::ostream_iterator<double>(corrfile,"\n"));     
00068       
00069          Current = Rad-Output;
00070          error = inner_product(Current.begin(),Current.end(),Current.begin(),0.0) /power;
00071         
00072          /*name = "pred"+iter;
00073          ofstream predictfile(name.c_str());
00074          name = "diff"+iter;
00075          ofstream diffile(name.c_str());
00076          std::copy(Current.begin(),Current.end(),std::ostream_iterator<double>(diffile,"\n"));
00077                  std::copy(Output.begin(),Output.end(),std::ostream_iterator<double>(predictfile,"\n"));
00078                  diffile.close();
00079                  predictfile.close();*/ 
00080                  previouserror = error;
00081                  //std::ofstream outfile(("out"+iter).c_str());
00082                  //Decon.PrintWeights(outfile);
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 }

Generated on Tue Aug 4 16:04:06 2009 for GPLIB++ by  doxygen 1.5.8