mtura.cpp

Go to the documentation of this file.
00001 #include <iostream>
00002 #include <fstream>
00003 #include <string>
00004 #include <numeric>
00005 #include "Util.h"
00006 #include "TimeSeriesData.h"
00007 #include "miscfunc.h"
00008 #include "WFunc.h"
00009 #include "statutils.h"
00010 #include <boost/bind.hpp>
00011 
00012 using namespace std;
00013 using namespace gplib;
00014 
00015 string version = "$Id: mtura.cpp 1816 2009-09-07 11:28:35Z mmoorkamp $";
00016 
00017 /*!
00018  * \addtogroup UtilProgs Utility Programs
00019  *@{
00020  * \file
00021  * Calculate the a running average for each component of the input file.
00022  */
00023 
00024 int main(int argc, char *argv[])
00025   {
00026     string infilename;
00027     cout << "This is mtura: Calculate a running average of MT time series"
00028         << endl << endl;
00029     cout << " Usage:      mtura infilename " << endl;
00030     cout << " Ending '.ra'  will be automatically assigned to outfilename"
00031         << endl << endl;
00032     cout << " This is Version: " << version << endl << endl;
00033     if (argc == 2)
00034       {
00035         infilename = argv[1];
00036       }
00037     else
00038       {
00039 
00040         infilename = AskFilename(" Mtu-Filename: ");
00041       }
00042 
00043     TimeSeriesData Data;
00044     Data.GetData(infilename);
00045 
00046     // get the width of the averaging window from the user
00047     size_t windowlength;
00048     cout << "Window length: ";
00049     cin >> windowlength;
00050 
00051     //construct the window time series
00052     const size_t tslength = Data.GetData().GetEx().GetData().size();
00053     TimeSeriesComponent WindowTS;
00054     // set the time series to zero
00055     WindowTS.GetData().assign(tslength, 0.0);
00056     const size_t windowstart = 0;
00057     // put ones where we want non-zero values
00058     fill_n(WindowTS.GetData().begin() + windowstart, windowlength, 1.0);
00059     //and apply the window function
00060     ApplyWindow(WindowTS.GetData().begin() + windowstart,
00061         WindowTS.GetData().begin() + windowstart + windowlength,
00062         WindowTS.GetData().begin() + windowstart, Hanning());
00063     // normalize,
00064     //this should be improved
00065     transform(WindowTS.GetData().begin() + windowstart,
00066         WindowTS.GetData().begin() + windowstart + windowlength,
00067         WindowTS.GetData().begin() + windowstart, boost::bind(
00068             multiplies<double> (), _1, 1. / double(windowlength)));
00069 
00070     // make sure all components have zero mean to avoid offsets after windowing
00071     SubMean(Data.GetData().GetEx().GetData().begin(),
00072         Data.GetData().GetEx().GetData().end());
00073     SubMean(Data.GetData().GetEy().GetData().begin(),
00074         Data.GetData().GetEy().GetData().end());
00075     SubMean(Data.GetData().GetHx().GetData().begin(),
00076         Data.GetData().GetHx().GetData().end());
00077     SubMean(Data.GetData().GetHy().GetData().begin(),
00078         Data.GetData().GetHy().GetData().end());
00079     SubMean(Data.GetData().GetHz().GetData().begin(),
00080         Data.GetData().GetHz().GetData().end());
00081 
00082     // convolve the averaging time series with all components
00083     Convolve(Data.GetData().GetEx().GetData(), WindowTS.GetData(),
00084         Data.GetData().GetEx().GetData());
00085     Convolve(Data.GetData().GetEy().GetData(), WindowTS.GetData(),
00086         Data.GetData().GetEy().GetData());
00087     Convolve(Data.GetData().GetHx().GetData(), WindowTS.GetData(),
00088         Data.GetData().GetHx().GetData());
00089     Convolve(Data.GetData().GetHy().GetData(), WindowTS.GetData(),
00090         Data.GetData().GetHy().GetData());
00091     Convolve(Data.GetData().GetHz().GetData(), WindowTS.GetData(),
00092         Data.GetData().GetHz().GetData());
00093 
00094     //correct for the shift introduced by the convolution
00095     rotate(Data.GetData().GetEx().GetData().begin(),
00096         Data.GetData().GetEx().GetData().begin() + windowlength / 2,
00097         Data.GetData().GetEx().GetData().end());
00098     rotate(Data.GetData().GetEy().GetData().begin(),
00099         Data.GetData().GetEy().GetData().begin() + windowlength / 2,
00100         Data.GetData().GetEy().GetData().end());
00101     rotate(Data.GetData().GetHx().GetData().begin(),
00102         Data.GetData().GetHx().GetData().begin() + windowlength / 2,
00103         Data.GetData().GetHx().GetData().end());
00104     rotate(Data.GetData().GetHy().GetData().begin(),
00105         Data.GetData().GetHy().GetData().begin() + windowlength / 2,
00106         Data.GetData().GetHy().GetData().end());
00107     rotate(Data.GetData().GetHz().GetData().begin(),
00108         Data.GetData().GetHz().GetData().begin() + windowlength / 2,
00109         Data.GetData().GetHz().GetData().end());
00110     Data.WriteBack(infilename + ".ra");
00111   }
00112 /*@}*/

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