CSpikeStats.cpp

Go to the documentation of this file.
00001 #include "CSpikeStats.h"
00002 #include "tsfuncs.h"
00003 #include <numeric>
00004 #include <iostream>
00005 #include <fstream>
00006 #include <iomanip>
00007 using namespace std;
00008 
00009 void CSpikeStats::AnalyseSpikes()
00010 {
00011         
00012         double timediff;
00013         double prediff, postdiff;
00014         double currentfraction;
00015         titdata currentdata;
00016         titdata currenttime;
00017         titdata lasttime;
00018         titdata next,last;
00019         vector<int>::iterator currentoccbin;
00020         vector<double>::iterator currentvalbin;
00021         
00022         currentdata = Data->begin()+1;
00023         currenttime = Time->begin()+1;
00024         lasttime = currenttime - 1;
00025         next = currentdata + 1;
00026         last = currentdata -1;
00027         CreateBins();
00028         DerivTotalOcc = 0;
00029         AbsoluteTotalOcc = 0;
00030         cout << " Analyzing spikes "  << flush;
00031         while (distance(next,Data->end()) > 1)
00032         {
00033                 timediff = *currenttime - *lasttime;
00034                 prediff = *currentdata - *last;
00035                 postdiff = *next -  *currentdata;
00036                 
00037                 if ((timediff < 2 * samplerate) && IsSpikeAbsolute(prediff,postdiff,*currentdata,-1e15) )
00038                 {
00039                         currentoccbin = AbsoluteValueOcc.begin();
00040                         currentvalbin = AbsoluteValueBin.begin();
00041                         while ( *currentdata > *currentvalbin)
00042                         {
00043                                 currentoccbin++;
00044                                 currentvalbin++;
00045                         }
00046                         *currentoccbin += 1;
00047                         AbsoluteTotalOcc += 1;
00048                         currentoccbin = DerivativeOcc.begin();
00049                         currentvalbin = DerivativeBin.begin();
00050                         while ( (fabs(prediff) >= *currentvalbin) && (currentoccbin != DerivativeOcc.end()))
00051                         {
00052                                 currentoccbin++;
00053                                 currentvalbin++;
00054                         }
00055                         *currentoccbin += 1;
00056                         DerivTotalOcc += 1;
00057                 }
00058                 lasttime ++;
00059                 currentdata++;
00060                 currenttime++;
00061                 next++;
00062                 last++;
00063         }
00064         currentfraction = 0;
00065         currentoccbin = DerivativeOcc.end() -1;
00066         currentvalbin = DerivativeBin.end()-1;
00067         while (currentfraction < HeightFraction)
00068         {
00069                 currentfraction += *currentoccbin/DerivTotalOcc;
00070                 currentoccbin--;
00071                 currentvalbin--;
00072         }
00073         HeightThreshold = *currentvalbin;
00074         cout << HeightFraction * 100 << " percent threshold: " << HeightThreshold << endl;
00075         cout << "   .... done " << endl << flush;
00076         cout << "Total Number Deriv: " << DerivTotalOcc << " Absolute: " << AbsoluteTotalOcc << endl;
00077 }
00078 
00079 void CSpikeStats::CreateBins()
00080 {
00081         double timediff;
00082         double prediff, postdiff;
00083         
00084         int nbins;
00085         titdata currentdata;
00086         titdata currenttime;
00087         titdata lasttime;
00088         titdata next,last;
00089         
00090         currentdata = Data->begin()+1;
00091         currenttime = Time->begin()+1;
00092         lasttime = currenttime - 1;
00093         next = currentdata +1;
00094         last = currentdata -1;
00095         absolutemax = 0;
00096         derivmax = 0;
00097         absolutemin=1e19;
00098         derivmin=1e19;
00099         if (AbsoluteValueBin.size() != 0)
00100         {
00101                 AbsoluteValueBin.clear();
00102                 DerivativeBin.clear();
00103         }
00104         while ( next != Data->end() )
00105         {
00106                 timediff = *currenttime - *lasttime;
00107                 prediff = *currentdata - *last;
00108                 postdiff = *next -  *currentdata;
00109                 if ( (timediff < 2 * samplerate) && IsSpikeAbsolute(prediff,postdiff,*currentdata,-1e15) )
00110                 {
00111                         if ( *currentdata > absolutemax)
00112                                 absolutemax = *currentdata;
00113                         //if ( fabs(*currentdata) < absolutemin)
00114                         //      absolutemin = fabs(*currentdata);
00115                         if ( *currentdata < absolutemin)
00116                                 absolutemin = *currentdata;
00117                         if (prediff > derivmax)
00118                                 derivmax = prediff;
00119                         if (prediff < derivmin)
00120                                 derivmin = prediff; 
00121                 }
00122                 lasttime ++;
00123                 currentdata++;
00124                 currenttime++;
00125                 next++;
00126                 last++;
00127         }
00128         derivstep = (derivmax - derivmin)/nDerivBins + 0.01;
00129         absolutestep = (absolutemax-absolutemin)/nValueBins + 0.01;
00130         cout << "AbsMax: " << absolutemax << endl;
00131         cout << "Absmin: " << absolutemin << endl;
00132         cout << "DerivMax: " << derivmax << endl;
00133         cout << "DerivMin: " << derivmin << endl;
00134         cout << "Step  Absolute: " << absolutestep << " Deriv: " << derivstep << endl;
00135         cout << "nBins Absolute: " << nValueBins   << " Deriv: " << nDerivBins << endl; 
00136         for (int i = 0; i < nValueBins; ++i)
00137                 AbsoluteValueBin.push_back(absolutemin + (i+1) * absolutestep);
00138         for (int i = 0; i < nDerivBins; ++i)
00139                 DerivativeBin.push_back(derivmin + (i+1) * derivstep);
00140         AbsoluteValueOcc.assign(nValueBins,0);
00141         DerivativeOcc.assign(nValueBins,0);
00142         cout << "First Bin Deriv: "<< DerivativeBin.front() << " Last Bin Deriv : " << DerivativeBin.back() << endl << flush;
00143 }
00144 
00145 int CSpikeStats::WriteStats(std::string filename)
00146 {
00147         if (AbsoluteValueBin.empty() || DerivativeBin.empty())
00148         {
00149                 cerr << "No statistics gathered yet !";
00150                 return 100;
00151         }
00152         
00153         ofstream outfile;
00154         
00155         outfile.open((filename+".deriv_stats").c_str());
00156         for (int i = 0; i < DerivativeBin.size(); ++i)
00157         {
00158                 outfile.precision(3);
00159                 outfile << setw(15) << setfill(' ') << DerivativeBin.at(i);
00160                 outfile <<   setw(15) << setfill(' ') << DerivativeOcc.at(i)/DerivTotalOcc << endl;
00161         }
00162         outfile.close();
00163         outfile.open((filename+".val_stats").c_str());
00164         for (int i = 0; i < AbsoluteValueBin.size(); ++i)
00165         {
00166                 outfile.precision(3);
00167                 outfile << setw(15) << setfill(' ')<< AbsoluteValueBin.at(i);
00168                 outfile << setw(15) << setfill(' ')<< AbsoluteValueOcc.at(i)/AbsoluteTotalOcc << endl;
00169         }
00170         outfile.close();
00171         return 0;
00172 }
00173 CSpikeStats::CSpikeStats()
00174 {
00175         HeightFraction = 0;
00176         HeightThreshold = 0;
00177         Data = NULL;
00178         Time = NULL;
00179 }
00180 CSpikeStats::~CSpikeStats()
00181 {}

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