stimulussequence.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "sys.hpp" // for libcwd
  2. #include "debug.hpp" // for libcwd
  3. #include "stimulussequence.hpp"
  4. #include <iostream>
  5. using namespace std;
  6. StimulusSequence::StimulusSequence(): SeqPointer(0), Length(0)
  7. {
  8. }
  9. StimulusSequence::StimulusSequence(
  10. const char* _SequenceFileName): SequenceFileName(_SequenceFileName), SeqPointer(0), Length(0)
  11. {
  12. Load(SequenceFileName.c_str());
  13. }
  14. bool StimulusSequence::Load(const char* _SequenceFileName)
  15. {
  16. int StrLen;
  17. Dout(dc::input, "open sequence file: " << _SequenceFileName << "");
  18. fflush(stdout);
  19. //! \todo check if file exists, check length of header
  20. FILE* fw = fopen(_SequenceFileName, "r");
  21. fread(&StrLen, sizeof(StrLen), 1, fw);
  22. char FileTypeString[StrLen];
  23. fread(&FileTypeString, StrLen, 1, fw);
  24. fread(&StrLen, sizeof(StrLen), 1, fw);
  25. char VersionString[StrLen];
  26. fread(&VersionString, StrLen, 1, fw);
  27. Dout(dc::input, "finfo=" << FileTypeString << "");
  28. Dout(dc::input, "Version=" << VersionString << "");
  29. fflush(stdout);
  30. char StimBytes;
  31. //! \todo check if file size is consistant with Length and StimBytes
  32. fread(&StimBytes, sizeof(StimBytes), 1, fw);
  33. int MinStim, MaxStim;
  34. fread(&Length, sizeof(Length), 1, fw);
  35. fread(&MinStim, sizeof(MinStim), 1, fw);
  36. fread(&MaxStim, sizeof(MaxStim),1,fw);
  37. switch (StimBytes) {
  38. case 1: {
  39. char* sequence = new char [Length];
  40. fread(sequence, sizeof(*sequence), Length, fw);
  41. CurStimSequence = vector<int>(Length);
  42. for (int i=0; i<Length;++i) CurStimSequence[i] = int(sequence[i]);
  43. delete [] sequence;
  44. // for (int i=0; i<Length;++i) Dout(dc::input, char(GetNextSeqElement()));
  45. if (CurStimSequence.size() != Length) cerr << "ERROR!!!!!!!!!!!!!!\n\n";
  46. cout << "StimBytes == 1\n";
  47. }
  48. break;
  49. case 4: {
  50. int* sequence = new int [Length];
  51. fread(sequence, sizeof(*sequence), Length, fw);
  52. CurStimSequence = vector<int>(sequence, sequence+Length);
  53. delete [] sequence;
  54. // for (int i=0; i<Length;++i) Dout(dc::input, int(GetNextSeqElement()));
  55. if (CurStimSequence.size() != Length) cerr << "ERROR!!!!!!!!!!!!!!\n\n";
  56. cout << "Sequence loaded. Length = " << CurStimSequence.size() << " StimBytes == 4\n";
  57. }
  58. break;
  59. default:
  60. cerr << "ERROR, libcsim.cpp: StimulusSequence::StimulusSequence, StimBytes don't fit \n\n";
  61. }
  62. Dout(dc::input, "StimBytes=" << int(StimBytes) << "Length=" << Length << " MinStim=" << MinStim << " MaxStim=" << MaxStim << "");
  63. fclose(fw);
  64. return true;
  65. }
  66. StimulusSequence::~StimulusSequence()
  67. {
  68. }
  69. void StimulusSequence::GenerateRandomSequence(int NStim, int NWdh, const gsl_rng* gslr)
  70. {
  71. int Length = NStim*NWdh;
  72. CurStimSequence = vector<int>(Length);
  73. int CurNr=0;
  74. // create sorted list
  75. for (int i=0; i<NStim;++i) {
  76. for (int j=0;j<NWdh;++j) {
  77. CurStimSequence[CurNr] = i+1;
  78. ++CurNr;
  79. }
  80. }
  81. // shuffle list
  82. int TempStim;
  83. int ChangeNr=0;
  84. for (CurNr=0;CurNr<Length;++CurNr) {
  85. ChangeNr = Length - gsl_rng_uniform_int(gslr, Length - CurNr)-1;
  86. TempStim = CurStimSequence[ChangeNr];
  87. CurStimSequence[ChangeNr] = CurStimSequence[CurNr];
  88. CurStimSequence[CurNr] = TempStim;
  89. }
  90. }
  91. int StimulusSequence::GetNextSeqElement()
  92. {
  93. if (Length > 0) {
  94. ++SeqPointer;
  95. if (SeqPointer>=Length) SeqPointer=0;
  96. return int(CurStimSequence[SeqPointer]);
  97. } else {
  98. cerr << "ERROR: Stimulus sequence has zero length.\n";
  99. return 0;
  100. }
  101. }
  102. int StimulusSequence::GetNextRandomElement(const gsl_rng* gslr)
  103. {
  104. if (Length > 0) {
  105. SeqPointer = gsl_rng_uniform_int(gslr, Length);
  106. return int(CurStimSequence[SeqPointer]);
  107. } else return 0;
  108. }