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
00114
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 {}