spiketrain.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include "sys.hpp" // for libcwd
  2. #include "debug.hpp" // for libcwd
  3. #include <iostream>
  4. #include "spiketrain.hpp"
  5. #include "ringbuffer.hpp"
  6. #include "libcsim.hpp"
  7. /** \note only use this constructor if firings don't change during the
  8. lifetime of the SpikeTrain object
  9. */
  10. SpikeTrain::SpikeTrain(int** _firings, int* _N_firings, T_NNeurons* _NNeurons, const float & _dt):
  11. firings(_firings),
  12. N_firings(_N_firings),
  13. NNeurons(_NNeurons),
  14. dt(_dt),
  15. firings_loaded(0),
  16. firings_fromLayer(_firings)
  17. {
  18. std::cout << "SpikeTrain constructor for running simulation\n";
  19. }
  20. /** @brief return maximum spike frequency, calculated from sub spike trains of length NSpikes
  21. *
  22. * algorithm:
  23. * for each spiking neuron store last NSpikes spikes in a ring buffer
  24. * calculate difference between last spike time and earlyest spike in ring buffer
  25. * frequency is (NSpikes-a)/t_diff (NSpikes spikes have NSpikes-1 inter spike intervals)
  26. *
  27. * @param NSpikes
  28. * @return
  29. */
  30. float SpikeTrain::MaxSpikeFreq(const int& NSpikes)
  31. {
  32. if (NSpikes<2) {
  33. return 0;
  34. }
  35. int** firings_data=0;
  36. if (firings_loaded) {
  37. firings_data=firings_loaded;
  38. } else {
  39. firings_data=firings;
  40. }
  41. int tdiff;
  42. int MaxTDiff=1000;
  43. vector<RingBuffer<int> > vecrbuff(*NNeurons, RingBuffer<int>(NSpikes));
  44. //vector<int> TimeDiff(*NNeurons, MaxTDiff);
  45. int MinTDiff = MaxTDiff;
  46. RingBuffer<int>* PRngBuff;
  47. for (int spike=0;spike<*N_firings;++spike) {
  48. int CurNeuronNumber = firings_data[spike][1];
  49. if (CurNeuronNumber>=*NNeurons) {
  50. *NNeurons=CurNeuronNumber+1;
  51. vecrbuff.resize(*NNeurons, RingBuffer<int>(NSpikes));
  52. // TimeDiff.resize(*NNeurons, MaxTDiff);
  53. }
  54. PRngBuff = &vecrbuff[CurNeuronNumber];
  55. PRngBuff->write(firings_data[spike][0]);
  56. // cout << firings_data[spike][0] << " ";
  57. if (PRngBuff->isFull()) {
  58. tdiff = PRngBuff->last()-PRngBuff->first();
  59. if (tdiff<MinTDiff) {
  60. // cout << "tdiff=" << tdiff << "\n";
  61. // PRngBuff->print();
  62. MinTDiff=tdiff;
  63. }
  64. }
  65. }
  66. return 1000*(NSpikes-1)/(MinTDiff*dt);
  67. }
  68. SpikeTrain::SpikeTrain(const char* filename, const float& _dt): dt(_dt)
  69. {
  70. N_firings=&mN_firings;
  71. NNeurons=&mNNeurons;
  72. LoadSpikeFile(filename);
  73. }
  74. void SpikeTrain::LoadSpikeFile(const char* filename)
  75. {
  76. size_t NBytes=FileSize(filename);
  77. cout << "FileSize=" << NBytes << "\n";
  78. *N_firings=NBytes/(2*sizeof(int));
  79. cout << "N_firings=" << *N_firings << "\n";
  80. NewArray2d(firings_loaded, *N_firings, 2);
  81. FILE* fs = fopen(filename, "r");
  82. int bcount=0;
  83. *NNeurons=0;
  84. for (int spike=0;spike<*N_firings;++spike) {
  85. bcount=fread(&firings_loaded[spike][0], sizeof(int), 1, fs);
  86. if (bcount==0) {
  87. cout << "ERROR, spike=" << spike << "\n";
  88. break;
  89. }
  90. bcount=fread(&firings_loaded[spike][1], sizeof(int), 1, fs);
  91. if (bcount==0) {
  92. cout << "ERROR2, spike=" << spike << "\n";
  93. break;
  94. }
  95. if (firings_loaded[spike][1]>=*NNeurons) {
  96. *NNeurons=firings_loaded[spike][1]+1;
  97. }
  98. }
  99. // cout << "SpikeTrain::LoadSpikeFile: *NNeurons=" << *NNeurons << "\n";
  100. fclose(fs);
  101. if (firings_loaded) {
  102. firings=firings_loaded;
  103. };
  104. }
  105. SpikeTrain::~SpikeTrain()
  106. {
  107. if (firings_loaded) {
  108. DeleteArray2d(firings_loaded, *N_firings);
  109. }
  110. }
  111. /** returns the spike data
  112. *
  113. * @param SpikeTimes spike times
  114. * @param NeuronNumbers neuron numbers
  115. */
  116. void SpikeTrain::SpikeData(vector<double> * SpikeTimes, vector<double> * NeuronNumbers)
  117. {
  118. NeuronNumbers->resize(*N_firings);
  119. SpikeTimes->resize(*N_firings);
  120. for (int SpikeNr=0;SpikeNr<*N_firings;++SpikeNr) {
  121. (*NeuronNumbers)[SpikeNr]=firings[SpikeNr][1];
  122. (*SpikeTimes)[SpikeNr]=firings[SpikeNr][0]*dt;
  123. }
  124. }
  125. void SpikeTrain::MeanSpikeRate(const double& WindowSize, vector<double> *timeScale, vector<double> * spikeRate)
  126. {
  127. spikeRate->clear();
  128. int TimeStart = min(0, firings[0][0]);
  129. int TimeStop = firings[*N_firings-1][0]+1;
  130. int NTimeSteps=TimeStop-TimeStart;
  131. spikeRate->resize(NTimeSteps);
  132. timeScale->resize(NTimeSteps);
  133. int t=TimeStart;
  134. for (vector<double>::iterator it=timeScale->begin(); it!=timeScale->end(); ++it)
  135. {
  136. (*it) = t*dt;
  137. ++t;
  138. }
  139. int WinSizeSteps = static_cast<int>(round(WindowSize/dt));
  140. double FreqFactor = 1000.0/(WindowSize*(*NNeurons));
  141. for (int spike=0;spike<*N_firings;++spike) {
  142. int CurSpikeTime=firings[spike][0]-TimeStart;
  143. int WinEnd=min(CurSpikeTime+WinSizeSteps, NTimeSteps);
  144. for (int step=CurSpikeTime;step<WinEnd;++step) {
  145. (*spikeRate)[step]+=FreqFactor;
  146. }
  147. }
  148. }
  149. /** calculate statistical parameters of mean neural activity (psth)
  150. *
  151. * @param timeScale
  152. * @param spikeRate
  153. */
  154. void MeanActivityParameters(vector<double> &timeScale, vector<double> & spikeRate)
  155. {
  156. int nTimeSteps = spikeRate.size();
  157. if ((nTimeSteps<=0) || nTimeSteps!= spikeRate.size()) {
  158. return;
  159. }
  160. double totalTime = timeScale.back()-timeScale.front();
  161. double dt = totalTime/nTimeSteps;
  162. int totalNoSpikeTime=0;
  163. int maxNoSpikeTime=0;
  164. int curNoSpikeTime=0;
  165. for (int tStep=0;tStep<nTimeSteps;++tStep) {
  166. if (spikeRate[tStep]==0) {
  167. ++curNoSpikeTime;
  168. ++totalNoSpikeTime;
  169. if (maxNoSpikeTime<curNoSpikeTime) {
  170. ++maxNoSpikeTime;
  171. }
  172. }
  173. }
  174. }