input.cpp 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192
  1. #include "sys.hpp" // for libcwd
  2. #include "debug.hpp" // for libcwd
  3. #include <map>
  4. #include "input.hpp"
  5. #include "simloop.hpp"
  6. using namespace std;
  7. typedef map<string,InputMode> TStringToInputModeMap;
  8. const TStringToInputModeMap::value_type stringToInputMode[] = {
  9. TStringToInputModeMap::value_type("Default" ,csimInputDefault),
  10. TStringToInputModeMap::value_type("Test" ,csimInputTest),
  11. TStringToInputModeMap::value_type("Remote" ,csimInputRemote),
  12. TStringToInputModeMap::value_type("Random" ,csimInputRandom),
  13. TStringToInputModeMap::value_type("RandomSequence",csimInputRandomSequence),
  14. TStringToInputModeMap::value_type("Direct" ,csimInputDirect),
  15. TStringToInputModeMap::value_type("Saccades" ,csimInputSaccades),
  16. TStringToInputModeMap::value_type("SaccTest" ,csimInputSaccTest),
  17. TStringToInputModeMap::value_type("SlideWinPic" ,csimInputSlideWinPic),
  18. TStringToInputModeMap::value_type("PlayMovie" ,csimInputPlayMovie),
  19. TStringToInputModeMap::value_type("Sequence" ,csimInputSequence),
  20. };
  21. const int numInputModeElems = sizeof stringToInputMode / sizeof stringToInputMode[0];
  22. InputMode InputModeFromString(string modeString)
  23. {
  24. static TStringToInputModeMap myMap (stringToInputMode, stringToInputMode + numInputModeElems);
  25. if (myMap.count(modeString) == 1) {
  26. return myMap[modeString];
  27. } else {
  28. return csimInputDefault;
  29. }
  30. }
  31. input::input(layer* tg,
  32. csimInputChannel _InputNumber,
  33. float strength,
  34. int size,
  35. int start)
  36. : SimElement(seInput),
  37. Target(tg),
  38. Strength(strength),
  39. Size(size),
  40. Start(start),
  41. InputNumber(_InputNumber),
  42. inpsync(0),
  43. mode(csimInputDefault),
  44. isi(false),
  45. CurStimNr(0),
  46. StimSeq(0),
  47. ResetToBeDone(false),
  48. mSilent(false)
  49. {
  50. int i;
  51. RecordBuffer = new int [MacroTimeStep];
  52. for (i=0;i<MacroTimeStep;++i) RecordBuffer[i] = -1; // input indices start with 0
  53. Dout(dc::input, "Input::Strength = " << Strength);
  54. dt = Target->GetDt();
  55. InputPointer = Target->GetInputPointer(InputNumber);
  56. if (Size >= Target->N) {
  57. Dout(dc::input, "input::input: size (=" << Size << ") too large");
  58. Size=Target->N /2;
  59. Dout(dc::input, ", set it to Target->N/2 (=" << Size << ")");
  60. }
  61. if (Start + Size >= Target->N) {
  62. Start = 0;
  63. Dout(dc::input, "input::input: pattern start too high; set it to 0");
  64. }
  65. Stop = Start+Size;
  66. }
  67. input::~input()
  68. {
  69. }
  70. int input::WriteSimInfo(fstream &fw)
  71. {
  72. stringstream sstr;
  73. sstr << "<Target id=\"" << Target->IdNumber << "\"/> \n";
  74. sstr << "<InputStrength value=\"" << Strength << "\"/> \n";
  75. SimElement::WriteSimInfo(fw, sstr.str());
  76. }
  77. int input::WriteSimInfo(fstream &fw, const string &ChildInfo)
  78. {
  79. stringstream sstr;
  80. sstr << "<Target id=\"" << Target->IdNumber << "\"/> \n";
  81. sstr << "<InputStrength value=\"" << Strength << "\"/> \n";
  82. sstr << ChildInfo;
  83. SimElement::WriteSimInfo(fw, sstr.str());
  84. }
  85. int input::proceede(int TotalTime)
  86. {
  87. for (int i=Start; i<Stop;++i) InputPointer[i] += Strength;
  88. }
  89. int input::prepare(int StepNum)
  90. {
  91. FileName = Name + ".inp.dat";
  92. FILE *fs;
  93. std::string tmpstring = DataDirectory+FileName+SimTag;
  94. const char* fname = tmpstring.c_str();
  95. Dout(dc::input, "input::prepare");
  96. if (StepNum ==0) {
  97. fs = fopen(fname,"w");
  98. } else {
  99. fs = fopen(fname,"a");
  100. }
  101. if (fs) {
  102. fwrite(RecordBuffer, MacroTimeStep*sizeof(*RecordBuffer), 1, fs);
  103. fclose(fs);
  104. } else {
  105. cerr << "ERROR: failed opening file " << fname << "\n";
  106. fflush(stdout);
  107. }
  108. int i;
  109. for (i=0;i<MacroTimeStep;++i) RecordBuffer[i] = -1;
  110. }
  111. int input::GetCurStimNr()
  112. {
  113. return CurStimNr;
  114. }
  115. int input::GetLastStim()
  116. {
  117. if (!isi) return CurStimNr+1;
  118. else return 0;
  119. }
  120. int input::SetInputSync(InputSynchronizer* _inpsync)
  121. {
  122. inpsync=_inpsync;
  123. }
  124. void input::SetMode(InputMode _mode)
  125. {
  126. mode=_mode;
  127. if (mode == csimInputRemote && inpsync==0) {
  128. cerr << "ERROR: inpsync nicht initialisiert!!!\n";
  129. mode = csimInputDefault;
  130. }
  131. }
  132. int input::GetNStimuli()
  133. {
  134. cerr << "ERROR in int input::GetNStimuli(): this is an abstract method, derived classes should overwrite this, returning -1 as default\n";
  135. return -1;
  136. }
  137. /////////////////////////////
  138. InputSynchronizer::InputSynchronizer(input* _Master, ResponseMap* _rmap)
  139. : Master(_Master), rmap(_rmap)
  140. {
  141. }
  142. int InputSynchronizer::GetRemoteStimNr()
  143. {
  144. if (rmap) return (*rmap)[Master->GetLastStim()];
  145. else return Master->GetLastStim();
  146. }
  147. ////////////////////
  148. BidirSequenceInput::BidirSequenceInput(): Direction(CSIM_right)
  149. {
  150. }
  151. void BidirSequenceInput::ChangeDir()
  152. {
  153. Direction = -Direction;
  154. }
  155. void BidirSequenceInput::RandomDir()
  156. {
  157. if (getrandom(2)) Direction=CSIM_left;
  158. else Direction=CSIM_right;
  159. }
  160. ///////////////////////
  161. SequenceInput::SequenceInput(layer* tg, csimInputChannel InputNumber, float strength, int size, int numpt, float ov, int dur):
  162. input(tg, InputNumber, strength, size), NumPatterns(numpt), Overlap(ov), Duration(dur)
  163. {
  164. PtPointer = 0;
  165. Duration = int(float(Duration)/dt);
  166. Hold = Duration;
  167. PtShift = int((1.-Overlap)*Size);
  168. if ((NumPatterns*PtShift+Size) > Target->N) NumPatterns = (Target->N-Size)/PtShift;
  169. Dout(dc::input, "Initializing Sequence Input; Target->N=" << Target->N << " PtShift= "<< PtShift<< " Size=" << Size);
  170. }
  171. SequenceInput::~SequenceInput()
  172. {
  173. }
  174. int SequenceInput::proceede(int TotalTime)
  175. {
  176. if (--Hold <1) {
  177. PtPointer = (PtPointer +Direction+NumPatterns) % NumPatterns;
  178. Hold = Duration;
  179. }
  180. Start = PtShift*PtPointer;
  181. Stop = Start+Size;
  182. if (Stop >= Target->N) {
  183. Dout(dc::input, "SequenceInputError");
  184. }
  185. for (int i=Start; i<Stop;++i) InputPointer[i] += Strength;
  186. }
  187. ////////////////////////////
  188. LearnTestInput::LearnTestInput(layer* _TargetLayer, csimInputChannel InputNumber, float _strength, float _delayms, float _isims): input(_TargetLayer, InputNumber, _strength)
  189. {
  190. delay = int(_delayms/dt);
  191. isi = int(_isims/dt);
  192. if (isi < delay) {
  193. Dout(dc::input, "ERROR: Setting isi to delay value");
  194. isi = delay;
  195. }
  196. if (Target->N < 2) Dout(dc::input, "ERROR: Target Layer too small!!!");
  197. phase =0;
  198. hold = isi;
  199. Dout(dc::input, "LearnTestInput: delay =" << delay << " isi= " << isi);
  200. }
  201. LearnTestInput::~LearnTestInput()
  202. {
  203. }
  204. int LearnTestInput::proceede(int TotalTime)
  205. {
  206. if (hold-- == 0) {
  207. if (phase==0) {
  208. hold = delay;
  209. InputPointer[0] += Strength;
  210. phase=1;
  211. Dout(dc::input, "first");
  212. } else {
  213. hold == isi;
  214. InputPointer[1] += Strength;
  215. phase=0;
  216. Dout(dc::input, "second");
  217. }
  218. }
  219. }
  220. /////////////////////////////////////////////
  221. PatternSequenceInput::PatternSequenceInput(layer* tg, csimInputChannel InputNumber, float strength, int size, int _PtStart, int numpt, float ov, int dur): input(tg, InputNumber, strength, size), NumPatterns(numpt), Overlap(ov), Duration(dur)
  222. {
  223. CurStimNr = 0;
  224. Start = _PtStart;
  225. Duration = int(float(Duration)/dt);
  226. Hold = Duration;
  227. PtShift = int((1.-Overlap)*Size);
  228. if ((NumPatterns*PtShift+Size) > Target->N) NumPatterns = (Target->N-Size)/PtShift;
  229. NewArray2d(PatternArray, NumPatterns, Size);
  230. int i,j;
  231. int mod = NumPatterns*PtShift;
  232. int CurNum;
  233. for (i=0;i<NumPatterns;++i) for (j=0;j<Size;++j) {
  234. CurNum= Start+(((PtShift*i) + j) % mod);
  235. if (CurNum < Target->N) PatternArray[i][j] = CurNum;
  236. else {
  237. PatternArray[i][j]=0;
  238. Dout(dc::input, "ERROR: InputPattern out of Range");
  239. }
  240. }
  241. }
  242. PatternSequenceInput::~PatternSequenceInput()
  243. {
  244. DeleteArray2d(PatternArray, NumPatterns);
  245. }
  246. int PatternSequenceInput::proceede(int TotalTime)
  247. {
  248. if (--Hold <1) {
  249. CurStimNr = (CurStimNr +Direction+ NumPatterns) % NumPatterns;
  250. Hold = Duration;
  251. }
  252. for (int i=0; i<Size;++i) InputPointer[PatternArray[CurStimNr][i]] += Strength;
  253. }
  254. void PatternSequenceInput::Jump()
  255. {
  256. CurStimNr = getrandom(NumPatterns);
  257. }
  258. ///////////////////////////////////////////
  259. PictureSequenceInput::PictureSequenceInput(layer* tg, csimInputChannel InputNumber, float strength, float _StimDur, float _Isi1Dur, float _NoJumpDur, float _Isi2Dur, float _BackgroundStrength): input(tg, InputNumber, strength), NoJumpDuration(int(_NoJumpDur)), IsiHold(0), mBackgroundStrength(_BackgroundStrength)
  260. {
  261. PictureArray = 0;
  262. Npictures=0;
  263. // Timing parameters
  264. StimDuration=int(_StimDur/dt);
  265. StimHold = StimDuration;
  266. // NoJumpDuration = int(_NoJumpDur/_StimDur);
  267. NoJumpHold = NoJumpDuration;
  268. CurStimNr=0;
  269. Isi1Duration = int(_Isi1Dur/dt);
  270. Isi2Duration = int(_Isi2Dur/dt);
  271. TestMode=false;
  272. }
  273. PictureSequenceInput::~PictureSequenceInput()
  274. {
  275. }
  276. void PictureSequenceInput::SetGaussPictureArray(const vector<vector2d> &mpList, float Sigma, float Cut)
  277. {
  278. // ToDo: Check wether Target-Neuron positions are allready set up
  279. int i,j;
  280. // double ix,iy;
  281. Dout(dc::input, "PictureSequenceInput::SetGaussPictureArray");
  282. Npictures =mpList.size();
  283. NewArray2d(PictureArray, Npictures, Target->N);
  284. if (Target->Nx >0 && Target->Ny > 0) {
  285. // int radius = min(Target->Nx, Target->Ny)/2;
  286. float dist;
  287. vector2d mp;
  288. float MaxDist ;
  289. MaxDist = Cut*Sigma;
  290. //if (Target->NormPos) MaxDist = 0.25; else MaxDist=Target->Nx/4;
  291. vector2d basis = vector2d(Target->Nx, Target->Ny);
  292. if (Target->NormPos) basis = vector2d(1,1);
  293. Dout(dc::input, "NormPos=" << Target->NormPos << " MaxDist=" << MaxDist << "Sigma=" << Sigma);
  294. for (i=0;i<Npictures;++i) {
  295. mp = mpList[i];
  296. Dout(dc::input, "MPx=" << mp.x << "MPy=" << mp.y);
  297. for (j=0;j<Target->N;++j) {
  298. dist = (Target->Pos[j]).CyclicDistance(mp, basis);
  299. if (dist < MaxDist) PictureArray[i][j] = gauss(dist/MaxDist, Sigma);
  300. else PictureArray[i][j] =0;
  301. }
  302. }
  303. }
  304. }
  305. void PictureSequenceInput::SetCirclePictureArray(const vector<vector2d> &mpList, float Radius, float Background)
  306. {
  307. // ToDo: Check wether Target-Neuron positions are allready set up
  308. int i,j;
  309. Npictures =mpList.size();
  310. NewArray2d(PictureArray, Npictures, Target->N);
  311. Dout(dc::input, "PictureSequenceInput::SetCirclePictureArray, Npictures=" << Npictures);
  312. if (Target->Nx >0 && Target->Ny > 0) {
  313. float dist;
  314. vector2d mp;
  315. vector2d basis = vector2d(Target->Nx, Target->Ny);
  316. if (Target->NormPos) basis = vector2d(1,1);
  317. Dout(dc::input, "NormPos=" << Target->NormPos << "Radius=" << Radius);
  318. for (i=0;i<Npictures;++i) {
  319. mp = mpList[i];
  320. Dout(dc::input, "MPx=" << mp.x << "MPy=" << mp.y);
  321. for (j=0;j<Target->N;++j) {
  322. dist = (Target->Pos[j]).CyclicDistance(mp, basis);
  323. if (dist < Radius) PictureArray[i][j] = 1;
  324. else PictureArray[i][j] =Background;
  325. }
  326. }
  327. }
  328. }
  329. void PictureSequenceInput::SetPictureArray(vector<vector<float> > &paVec)
  330. {
  331. Npictures = paVec.size(); // paVec
  332. NewArray2d(PictureArray, Npictures, Target->N);
  333. for (int i=0;i<Npictures;++i) {
  334. int NeuronNumber=0;
  335. for (vector<float>::iterator it=paVec[i].begin();it<paVec[i].end();++it) {
  336. if (NeuronNumber<Target->N) PictureArray[i][NeuronNumber++] = (*it);
  337. }
  338. }
  339. }
  340. void PictureSequenceInput::SetPictureArray(ObjMovie *Movie)
  341. {
  342. int FilterNr=0;
  343. int FrameSize = Movie->GetFrameSize(FilterNr);
  344. float* Data;
  345. if (FrameSize != Target->N) {
  346. Dout(dc::input, "[PictureSequenceInput] Warning: FrameSize=" << FrameSize << " != Target->N =" << Target->N);
  347. }
  348. Npictures = Movie->GetNFrames();
  349. NewArray2d(PictureArray, Npictures, Target->N);
  350. for (int i=0;i<Npictures;++i) {
  351. Movie->GotoFrameNr(i);
  352. Data = Movie->GetFramePointer(FilterNr);
  353. for (int pix=0;pix<Target->N;++pix) {
  354. if (pix<Target->N) PictureArray[i][pix] = Data[pix];
  355. }
  356. }
  357. }
  358. void PictureSequenceInput::SetPictureArray(int _Npic, float _mpy, float Sigma)
  359. {
  360. int i,j;
  361. double ix,iy;
  362. if (PictureArray != 0) Dout(dc::input|dc::warning, "ERROR: PictureArray != 0 (picture array allready initialized)");
  363. Npictures = _Npic;
  364. bool NormPos = (Sigma<1);
  365. Dout(dc::input, "PictureSequenceInput::SetPictureArray");
  366. Dout(dc::input, "Npic=" << _Npic << " mpy=" << _mpy << "NormPos=" << NormPos);
  367. NewArray2d(PictureArray, Npictures, Target->N);
  368. vector<vector2d> mpList;
  369. if (Target->Nx >0 && Target->Ny > 0) {
  370. // int radius = min(Target->Nx, Target->Ny)/2;
  371. float dist;
  372. vector2d mp;
  373. float MaxDist ;
  374. if (NormPos) MaxDist= Target->Nx/4;
  375. else MaxDist = 0.25;
  376. vector2d basis = vector2d(Target->Nx, Target->Ny);
  377. if (NormPos) basis = vector2d(1,1);
  378. for (i=0;i<Npictures;++i) {
  379. if (NormPos) mp = vector2d((float(i)/Npictures),_mpy);
  380. else mp = vector2d((3*Target->Nx/4 + Target->Nx*i/Npictures)
  381. % Target->Nx,_mpy*Target->Ny);
  382. // cout << "i=" << i << "mp.x=" << mp.x << "mp.y="
  383. // << mp.y << " i/Npictures= " << float(i)/Npictures << "\n";
  384. mpList.push_back(mp);
  385. }
  386. SetGaussPictureArray(mpList, Sigma);
  387. }
  388. }
  389. void PictureSequenceInput::SetCirclePictureArray(int _Npic, float _mpx, float Radius, float Background)
  390. {
  391. int i,j;
  392. double ix,iy;
  393. if (PictureArray != 0) {
  394. Dout(dc::input|dc::warning, "ERROR: PictureArray != 0 (picture array allready initialized)");
  395. }
  396. Dout(dc::input, "PictureSequenceInput::SetCirclePictureArray, Radius=" << Radius);
  397. Npictures = _Npic;
  398. bool NormPos = (Radius<1);
  399. NewArray2d(PictureArray, Npictures, Target->N);
  400. if (Target->Nx >0 && Target->Ny > 0) {
  401. // int radius = min(Target->Nx, Target->Ny)/2;
  402. float dist;
  403. vector2d mp;
  404. float MaxDist ;
  405. if (NormPos) MaxDist = Radius;
  406. else MaxDist= Radius*Target->Nx;
  407. vector2d basis = vector2d(Target->Nx, Target->Ny);
  408. if (NormPos) basis = vector2d(1,1);
  409. Dout(dc::input, "MaxDist = " << MaxDist);
  410. for (i=0;i<Npictures;++i) {
  411. if (NormPos) mp = vector2d(_mpx, (float(i+1)/float(Npictures+1)));
  412. else mp = vector2d(_mpx, (3*Target->Ny/4 + Target->Ny*i/Npictures) % Target->Ny);
  413. mp.print();
  414. for (j=0;j<Target->N;++j) {
  415. dist = ((Target->Pos[j]) - mp).abs();
  416. if (dist < MaxDist) PictureArray[i][j] = 1;
  417. else PictureArray[i][j] =Background;
  418. }
  419. }
  420. }
  421. }
  422. void PictureSequenceInput::SetTwoPointArray(float distance, float Radius)
  423. {
  424. int i,j;
  425. double ix,iy;
  426. if (PictureArray != 0) {
  427. Dout(dc::input|dc::warning, "ERROR: PictureArray != 0 (picture array allready initialized)");
  428. }
  429. Dout(dc::input, "PictureSequenceInput::SetCirclePictureArray, Radius=" << Radius);
  430. Npictures = 2;
  431. // bool NormPos = (Radius<1);
  432. bool NormPos = true;
  433. NewArray2d(PictureArray, Npictures, Target->N);
  434. float* mpxList = new float[Npictures];
  435. // if (NormPos) ... // ToDo
  436. for (i=0;i<Npictures;++i) {
  437. mpxList[i] = 0.5 + 0.5*distance*(float(i)-(0.5*float(Npictures-1)))/(0.5*float(Npictures-1));
  438. }
  439. float mpy=0.5;
  440. if (Target->Nx >0 && Target->Ny > 0) {
  441. // int radius = min(Target->Nx, Target->Ny)/2;
  442. float dist;
  443. vector2d mp;
  444. float MaxDist ;
  445. if (NormPos) MaxDist = Radius;
  446. else MaxDist= Radius*Target->Nx;
  447. vector2d basis = vector2d(Target->Nx, Target->Ny);
  448. if (NormPos) basis = vector2d(1,1);
  449. Dout(dc::input, "MaxDist = " << MaxDist);
  450. for (i=0;i<Npictures;++i) {
  451. mp = vector2d(mpxList[i],mpy);
  452. mp.print();
  453. for (j=0;j<Target->N;++j) {
  454. dist = ((Target->Pos[j]) - mp).abs();
  455. if (dist < MaxDist) PictureArray[i][j] = 1;
  456. else PictureArray[i][j] =0;
  457. }
  458. }
  459. }
  460. delete [] mpxList;
  461. }
  462. void PictureSequenceInput::SetLinearPictureArray(int _Npic, int _mpy, int _NumSeq, float Sigma)
  463. {
  464. Dout(dc::input, "SetLinearPictureArray___________________________");
  465. int i,j;
  466. double ix,iy;
  467. if (PictureArray != 0) Dout(dc::input, "PictureArray != 0 (picture array allready initialized)");
  468. Npictures = _Npic;
  469. int SglObjSize = (Target->N / _NumSeq -2);
  470. if (SglObjSize <2) Dout(dc::input, "ERROR: Target->N too small or _NumSeq too high");
  471. Dout(dc::input, "MPY=" << _mpy << " Npic=" << Npictures << " Sigma=" << Sigma << "");
  472. NewArray2d(PictureArray, Npictures, Target->N);
  473. for (i=0;i<Npictures;++i) for (j=0;j<Target->N;++j) PictureArray[i][j]=0;
  474. if (Target->Nx >0 && Target->Ny > 0) {
  475. float dist;
  476. float mp;
  477. float MaxDist = SglObjSize/4;
  478. for (i=0;i<Npictures;++i) {
  479. mp = SglObjSize*i/Npictures;
  480. // Dout(dc::input, " mp=" << mp);
  481. for (j=0;j<SglObjSize;++j) {
  482. if (j>mp) dist = min(j-mp, mp+SglObjSize-j);
  483. else dist = min(mp-j, j+SglObjSize-mp);
  484. // Dout(dc::input, " " << dist);
  485. PictureArray[i][j+_mpy*SglObjSize] = gauss(dist/MaxDist, Sigma);
  486. }
  487. }
  488. }
  489. }
  490. void PictureSequenceInput::SetTestMode(float _StimDuration, float _Isi1Duration)
  491. {
  492. StimDuration = int(_StimDuration/dt);
  493. Isi1Duration = int(_Isi1Duration/dt);
  494. StimHold = StimDuration;
  495. IsiHold = Isi1Duration;
  496. TestMode = true;
  497. mode = csimInputTest;
  498. }
  499. int PictureSequenceInput::proceede(int TotalTime)
  500. {
  501. if (mSilent) return 0;
  502. int t = TotalTime % MacroTimeStep;
  503. switch (mode) {
  504. case csimInputTest:
  505. if (IsiHold > 1) {
  506. --IsiHold;
  507. isi=true;
  508. } else {
  509. isi=false;
  510. if (--StimHold <1) {
  511. // CurStimNr = 0; // getrandom(Npictures);
  512. // CurStimNr = getrandom(Npictures);
  513. CurStimNr = (Npictures+CurStimNr +Direction) % Npictures;
  514. StimHold = StimDuration;
  515. IsiHold = Isi1Duration;
  516. isi=true;
  517. }
  518. }
  519. break;
  520. case csimInputDefault:
  521. if (IsiHold > 1) {
  522. --IsiHold;
  523. isi=true;
  524. } else {
  525. isi=false;
  526. if (--StimHold <1) {
  527. if ((NoJumpDuration >0) && (--NoJumpHold<1)) {
  528. CurStimNr = getrandom(Npictures);
  529. Direction = -1*Direction;
  530. NoJumpHold = NoJumpDuration;
  531. IsiHold = Isi1Duration;
  532. isi=true;
  533. Dout(dc::input, "jump, NoJumpDuration=" << NoJumpDuration << "IsiDur=" << IsiHold << "");
  534. } else {
  535. CurStimNr = (Npictures+CurStimNr +Direction) % Npictures;
  536. // + Npictures damit CurStimNr bei Direction==-1 nicht negativ werden kann.
  537. IsiHold = Isi2Duration;
  538. isi=true;
  539. Dout(dc::input, "Isi2Duration=" << IsiHold << "");
  540. }
  541. StimHold = StimDuration;
  542. }
  543. }
  544. break;
  545. case csimInputRandom:
  546. if (IsiHold > 1) {
  547. --IsiHold;
  548. isi=true;
  549. } else {
  550. isi=false;
  551. if (--StimHold <1) {
  552. CurStimNr = getrandom(Npictures);
  553. StimHold = StimDuration;
  554. IsiHold = Isi1Duration;
  555. isi=true;
  556. }
  557. }
  558. break;
  559. case csimInputRemote:
  560. CurStimNr = inpsync->GetRemoteStimNr();
  561. //Dout(dc::input, " c " << CurStimNr); //REMOVE
  562. if ((CurStimNr==0) || (CurStimNr>Npictures)) isi=true;
  563. else {
  564. CurStimNr -=1;
  565. isi=false;
  566. }
  567. break;
  568. default:
  569. Dout(dc::input, "ERROR: this shouldn't happen (PictureSequenceInput::proceede)");
  570. }
  571. if (!isi) {
  572. for (int i=0; i<Target->N;++i) {
  573. InputPointer[i] += mBackgroundStrength + Strength* PictureArray[CurStimNr][i];
  574. }
  575. RecordBuffer[t] = CurStimNr+1;
  576. } else RecordBuffer[t]=0;
  577. }
  578. int PictureSequenceInput::Show(int TotalTime)
  579. {
  580. int t = TotalTime % MacroTimeStep;
  581. RecordBuffer[t] = CurStimNr;
  582. for (int i=0; i<Target->N;++i) InputPointer[i] += Strength* PictureArray[CurStimNr][i];
  583. }
  584. void PictureSequenceInput::Jump()
  585. {
  586. CurStimNr = getrandom(Npictures);
  587. Direction = -1 + 2*getrandom(2);
  588. }
  589. void PictureSequenceInput::ClearPictureArray()
  590. {
  591. if (PictureArray) {
  592. DeleteArray2d(PictureArray, Npictures);
  593. PictureArray=0;
  594. }
  595. }
  596. ////////////////////////////////////////////
  597. MultiSequenceInput::MultiSequenceInput(layer* tg, int Nseq, csimInputChannel InputNumber, float strength, int size, int _PtStart, int numpt, float ov, int dur): input(tg, InputNumber), NumSeq(Nseq)
  598. {
  599. int SeqSize = int((1-ov)*size*numpt);
  600. for (int i=0;i<NumSeq;++i) {
  601. int PatternStart = (_PtStart + i*int(1.5*SeqSize)) % (tg->N - SeqSize);
  602. SequenceList.push_back(new PatternSequenceInput(tg, InputNumber, strength, size, PatternStart, numpt, ov, dur));
  603. }
  604. dt = tg->GetDt();
  605. CurInputNr=0;
  606. SwitchTime= int(200/dt);
  607. SwitchHold=0;
  608. MinStimTime=int(1000/dt);
  609. AddStimTime=int(2000/dt);
  610. // int StimTime=8000/dt;
  611. StimHold=MinStimTime + getrandom(AddStimTime);
  612. Dout(dc::input, "NumSeq = " << NumSeq << "");
  613. }
  614. int MultiSequenceInput::proceede(int t)
  615. {
  616. if (StimHold>0) StimHold--;
  617. else {
  618. SwitchHold=SwitchTime;
  619. StimHold=MinStimTime + getrandom(AddStimTime);
  620. CurInputNr = (CurInputNr + 1+ getrandom(NumSeq-1)) % NumSeq;
  621. SequenceList[CurInputNr]->Jump();
  622. SequenceList[CurInputNr]->RandomDir();
  623. // Dout(dc::input, "SWITCH to "<< CurInputNr << "\n\n");
  624. }
  625. if (SwitchHold>0) SwitchHold--;
  626. else {
  627. SequenceList[CurInputNr]->proceede();
  628. }
  629. }
  630. //////////////////////////////////////////
  631. MultiPictureSequenceInput::MultiPictureSequenceInput(layer* tg, csimInputChannel InputNumber, int Nseq, float strength, float _StimTime, float _IsiTime): input(tg, InputNumber, strength), NumSeq(Nseq)
  632. {
  633. // SetupPictureArrays(_StimDur);
  634. dt = tg->GetDt();
  635. CurInputNr=0;
  636. SwitchTime= int(200/dt);
  637. SwitchHold=0;
  638. MinStimTime=int(800/dt);
  639. AddStimTime=int(200/dt);
  640. StimTime = int(_StimTime/dt);
  641. StimHold=StimTime;
  642. IsiDuration=int(_IsiTime/dt);
  643. IsiHold=IsiDuration;
  644. // int StimTime=8000/dt;
  645. SeqHold=MinStimTime + getrandom(AddStimTime);
  646. Dout(dc::input, "NumSeq = " << NumSeq << "");
  647. }
  648. int MultiPictureSequenceInput::SetupGaussPictureArrays(vector<vector<vector2d> > mpList, float _StimDuration, float Sigma, float Cut)
  649. {
  650. int i;
  651. int CurStimNumStart=0;
  652. PictureSequenceInput* pictmp;
  653. NumSeq = mpList.size();
  654. for (i=0;i<NumSeq;++i) {
  655. pictmp = new PictureSequenceInput(Target, InputNumber, Strength, _StimDuration);
  656. pictmp->SetGaussPictureArray(mpList[i], Sigma, Cut);
  657. SequenceList.push_back(pictmp);
  658. StimNumStart.push_back(CurStimNumStart);
  659. CurStimNumStart += mpList[i].size();
  660. }
  661. }
  662. int MultiPictureSequenceInput::SetupCirclePictureArrays(vector<vector<vector2d> > mpList, float _StimDuration, float Radius)
  663. {
  664. int i;
  665. int CurStimNumStart=0;
  666. PictureSequenceInput* pictmp;
  667. NumSeq = mpList.size();
  668. for (i=0;i<NumSeq;++i) {
  669. pictmp = new PictureSequenceInput(Target, InputNumber, Strength, _StimDuration);
  670. pictmp->SetCirclePictureArray(mpList[i], Radius);
  671. SequenceList.push_back(pictmp);
  672. StimNumStart.push_back(CurStimNumStart);
  673. CurStimNumStart += mpList[i].size();
  674. }
  675. }
  676. int MultiPictureSequenceInput::SetupPictureArrays(float _StimDuration)
  677. {
  678. int i;
  679. float mpy;
  680. PictureSequenceInput* pictmp;
  681. int npic=10;
  682. int CurStimNumStart=0;
  683. float Sigma=0.2;
  684. for (i=0;i<NumSeq;++i) {
  685. mpy = 0.2 + 0.8*(float(i)/float(NumSeq));
  686. pictmp = new PictureSequenceInput(Target, InputNumber, Strength, _StimDuration);
  687. pictmp->SetPictureArray(npic, mpy, Sigma);
  688. SequenceList.push_back(pictmp);
  689. StimNumStart.push_back(CurStimNumStart);
  690. CurStimNumStart += npic;
  691. }
  692. }
  693. int MultiPictureSequenceInput::SetupLinearPictureArrays(float _StimDuration, float Sigma)
  694. {
  695. int i;
  696. int mpy;
  697. PictureSequenceInput* pictmp;
  698. int npic=100;
  699. int CurStimNumStart=0;
  700. for (i=0;i<NumSeq;++i) {
  701. mpy = i;
  702. pictmp = new PictureSequenceInput(Target, InputNumber, Strength, _StimDuration);
  703. pictmp->SetLinearPictureArray(npic, mpy, NumSeq, Sigma);
  704. SequenceList.push_back(pictmp);
  705. StimNumStart.push_back(CurStimNumStart);
  706. CurStimNumStart += npic;
  707. }
  708. }
  709. int MultiPictureSequenceInput::proceede(int TotalTime)
  710. {
  711. int t = TotalTime % MacroTimeStep;
  712. switch (mode) {
  713. case csimInputRandom:
  714. if (StimHold>0) {
  715. StimHold--;
  716. isi=false;
  717. } else if (IsiHold > 1) {
  718. RecordBuffer[t] = 0;
  719. --IsiHold;
  720. isi=true;
  721. } else {
  722. isi=false;
  723. StimHold=StimTime;
  724. IsiHold=IsiDuration;
  725. CurInputNr = (CurInputNr + 1+ getrandom(NumSeq-1)) % NumSeq;
  726. SequenceList[CurInputNr]->Jump();
  727. SequenceList[CurInputNr]->RandomDir();
  728. }
  729. if (!isi) {
  730. SequenceList[CurInputNr]->Show();
  731. CurStimNr = StimNumStart[CurInputNr]
  732. + SequenceList[CurInputNr]->GetCurStimNr();
  733. RecordBuffer[t] = CurStimNr+1;
  734. }
  735. break;
  736. case csimInputDefault:
  737. default:
  738. if (SeqHold>0) SeqHold--;
  739. else {
  740. SwitchHold=SwitchTime;
  741. SeqHold=MinStimTime + getrandom(AddStimTime);
  742. CurInputNr = (CurInputNr + 1+ getrandom(NumSeq-1)) % NumSeq;
  743. SequenceList[CurInputNr]->Jump();
  744. SequenceList[CurInputNr]->RandomDir();
  745. Dout(dc::input, "SWITCH to "<< CurInputNr << "\n\n");
  746. }
  747. if (SwitchHold>0) SwitchHold--;
  748. else {
  749. SequenceList[CurInputNr]->proceede();
  750. RecordBuffer[t] = StimNumStart[CurInputNr]
  751. + SequenceList[CurInputNr]->GetCurStimNr();
  752. }
  753. break;
  754. }
  755. }
  756. void MultiPictureSequenceInput::SetTestMode(float _StimDuration, float _IsiDuration)
  757. {
  758. for (vector<PictureSequenceInput*>::iterator it=SequenceList.begin(); it !=SequenceList.end(); ++it) {
  759. (*it)->SetTestMode(_StimDuration, _IsiDuration);
  760. }
  761. }
  762. void MultiPictureSequenceInput::Jump()
  763. {
  764. for (vector<PictureSequenceInput*>::iterator it=SequenceList.begin(); it !=SequenceList.end(); ++it) {
  765. (*it)->Jump();
  766. }
  767. CurInputNr = (CurInputNr + 1+ getrandom(NumSeq-1)) % NumSeq;
  768. }
  769. /////////////////////////////////
  770. //////////////////////////////
  771. ObjMovieInput::ObjMovieInput(
  772. layer* tg, csimInputChannel InputNumber,
  773. ObjMovie* _Movie, int _FilterNr, float strength,
  774. float _StimDur, float _IsiDur)
  775. : input(tg, InputNumber, strength),
  776. MovieFile(_Movie),
  777. FilterNr(_FilterNr),
  778. StimDuration(int(_StimDur/dt)),
  779. TestMode(false),
  780. IsiDuration(int(_IsiDur/dt)),
  781. PositiveInput(true)
  782. {
  783. // PictureArray = 0;
  784. // Npictures=0;
  785. // Timing parameters
  786. StimHold = StimDuration;
  787. IsiHold=0;
  788. Dout(dc::input, "StimDuration is " << StimDuration << " TimeSteps");
  789. TestIsiDuration=int(_IsiDur/dt);
  790. // PtPointer=0;
  791. // TestMode=false;
  792. RandomNext = false;
  793. if (MovieFile == 0) Dout(dc::input, "ERROR: No Movie-File!!");
  794. Data = MovieFile->GetFramePointer(FilterNr);
  795. // SwitchMaster = MovieFile->GetSwitchMaster(); //check wether or not I am the SwitchMaster (there can only be one!! first come first serve)
  796. SwitchMasterObj = MovieFile->GetSwitchMaster(this); //check wether or not I am the SwitchMaster (there can only be one!! first come first serve)
  797. if (SwitchMasterObj == 0) {
  798. SwitchMaster = true;
  799. } else {
  800. SwitchMaster = false;
  801. }
  802. FrameSize = MovieFile->GetFrameSize(FilterNr);
  803. if (FrameSize > Target->N) FrameSize=Target->N;
  804. }
  805. /** Setze neues MovieFile.
  806. *
  807. * @param _Movie
  808. * @param _FilterNr
  809. */
  810. void ObjMovieInput::SetMovieFile(ObjMovie* _Movie, int _FilterNr)
  811. {
  812. if (_Movie == 0) {
  813. cerr << "ERROR: No Movie-File!!\n";
  814. return;
  815. }
  816. if (SwitchMaster && MovieFile) {
  817. MovieFile->ResetSwitchMaster();
  818. }
  819. MovieFile = _Movie;
  820. FilterNr = _FilterNr;
  821. // Timing parameters
  822. StimHold = StimDuration;
  823. IsiHold=0;
  824. Dout(dc::input, "StimDuration is " << StimDuration << " TimeSteps");
  825. Data = MovieFile->GetFramePointer(FilterNr);
  826. // check wether or not I am the SwitchMaster
  827. // (there can only be one!! first come first serve)
  828. SwitchMasterObj = MovieFile->GetSwitchMaster(this);
  829. if (SwitchMasterObj == 0) {
  830. SwitchMaster = true;
  831. } else {
  832. SwitchMaster = false;
  833. }
  834. FrameSize = MovieFile->GetFrameSize(FilterNr);
  835. if (FrameSize > Target->N) FrameSize=Target->N;
  836. }
  837. void ObjMovieInput::InitializeTestMode(float _StimDuration, float _IsiDuration)
  838. {
  839. Dout(dc::input, "Setting ObjMovieInput-Test Mode");
  840. fflush(stdout);
  841. mode = csimInputTest;
  842. TestStimDuration= int(_StimDuration/dt);
  843. StimHold = TestStimDuration;
  844. TestIsiDuration=int(_IsiDuration/dt);
  845. }
  846. int ObjMovieInput::proceede(int TotalTime)
  847. {
  848. int t = TotalTime % MacroTimeStep;
  849. if (SwitchMaster) {
  850. if (IsiHold > 1) {
  851. --IsiHold;
  852. isi=true;
  853. } else {
  854. isi=false;
  855. if (ResetToBeDone) {
  856. MainSimLoop->reset(t);
  857. ResetToBeDone=false;
  858. }
  859. if (--StimHold <1) {
  860. switch (mode) {
  861. case csimInputTest: {
  862. MovieFile->NextFrame();
  863. isi=true;
  864. StimHold = TestStimDuration;
  865. IsiHold=TestIsiDuration;
  866. ResetToBeDone=true;
  867. }
  868. break;
  869. case csimInputDefault: {
  870. MovieFile->NextFrame();
  871. StimHold = StimDuration;
  872. isi=true;
  873. IsiHold=IsiDuration;
  874. }
  875. break;
  876. case csimInputRandom: {
  877. MovieFile->NextRandomFrame();
  878. StimHold = StimDuration;
  879. isi=true;
  880. IsiHold=IsiDuration;
  881. }
  882. break;
  883. default:
  884. cerr << "ERROR: this shouldn't happen ObjMovieInput::proceede\n";
  885. }
  886. }
  887. }
  888. } else {
  889. isi = SwitchMasterObj->isi;
  890. }
  891. if (!isi) {
  892. if (PositiveInput) {
  893. for (int i=0; i<Target->N;++i) {
  894. float tmp = Strength*Data[i];
  895. if (tmp>0) {
  896. InputPointer[i] += tmp;
  897. }
  898. }
  899. } else {
  900. for (int i=0; i<Target->N;++i) InputPointer[i] += Strength*Data[i];
  901. }
  902. }
  903. if (SwitchMaster) {
  904. if (!isi) RecordBuffer[t] = CurStimNr = MovieFile->GetFrameNumber()+1;
  905. else RecordBuffer[t]=0;
  906. }
  907. }
  908. void ObjMovieInput::SetRandomNext(bool value)
  909. {
  910. // RandomNext = value;
  911. SetMode(csimInputRandom);
  912. cerr << "ObjMovieInput::SetRandomNext(bool value) is depreciated\n";
  913. cerr << "use Input::SetMode instead\n";
  914. }
  915. void ObjMovieInput::SetStimDuration(int _stimdur)
  916. {
  917. StimDuration = _stimdur;
  918. }
  919. void ObjMovieInput::SetTestMode(bool tm)
  920. {
  921. TestMode = tm;
  922. if (tm) SetMode(csimInputTest);
  923. else SetMode(csimInputDefault);
  924. }
  925. int ObjMovieInput::GetNFrames()
  926. {
  927. return MovieFile->GetNFrames();
  928. }
  929. int ObjMovieInput::GetNStimuli()
  930. {
  931. return MovieFile->GetNFrames();
  932. }
  933. ///////////////////////////////////////////////
  934. ScanObjMovieInput::ScanObjMovieInput(
  935. layer* tg, csimInputChannel InputNumber,
  936. ObjMovie* _Movie, int _FilterNr, float strength, float _StimDur,
  937. int _NXpara, int _NYpara, bool _XContinous, int _NoJumpHold, float _IsiDur, float _Isi2Dur, int _NoJumpDurationTest)
  938. : ObjMovieInput(tg, InputNumber, _Movie, _FilterNr, strength, _StimDur, _IsiDur),
  939. NXpara(_NXpara), NYpara(_NYpara), XContinous(_XContinous), direction(1),
  940. NoJumpDuration(_NoJumpHold), NoJumpHold(1), TestStimList(0)
  941. ,XCircle(true), XRandomChange(false) , YCircle(true), testiffirstrunever(0), dirchangecounter(0), testiffirsttestrunever(0),NoJumpDurationTest(_NoJumpDurationTest)
  942. {
  943. Isi2Duration = int(_Isi2Dur/dt);
  944. IsiHold = IsiDuration;
  945. }
  946. int ScanObjMovieInput::WriteSimInfo(fstream &fw)
  947. {
  948. stringstream sstr;
  949. sstr << "<NXPara value=\"" << NXpara << "\"/> \n";
  950. sstr << "<NYPara value=\"" << NYpara << "\"/> \n";
  951. sstr << "<StimTiming StimDur=\"" << StimDuration << "\" IsiDur=\"" << IsiDuration
  952. << "\" TestStimDur=\"" << TestStimDuration << "\" TestIsiDur=\"" << TestIsiDuration << "\" /> \n";
  953. input::WriteSimInfo(fw, sstr.str());
  954. }
  955. void ScanObjMovieInput::loadStimulusSequence(const char* FileName)
  956. {
  957. mStimSequence.Load(FileName);
  958. }
  959. void ScanObjMovieInput::SetXCircle(bool value)
  960. {
  961. XCircle = value;
  962. }
  963. void ScanObjMovieInput::SetXRandomChange(bool value)
  964. {
  965. XRandomChange = value;
  966. }
  967. void ScanObjMovieInput::SetYCircle(bool value)
  968. {
  969. YCircle = value;
  970. }
  971. int ScanObjMovieInput::proceede(int TotalTime)
  972. {
  973. int t = TotalTime % MacroTimeStep;
  974. if (SwitchMaster) {
  975. if (IsiHold > 1) { //InterStimulusInterval: kein Input
  976. --IsiHold;
  977. isi=true;
  978. } else {
  979. isi=false;
  980. if (ResetToBeDone) {
  981. MainSimLoop->reset(t);
  982. ResetToBeDone=false;
  983. }
  984. if (--StimHold <1)
  985. // show same stimulus for StimHold time intervals, then switch to next stimulus
  986. {
  987. switch (mode) {
  988. case csimInputTest: {
  989. ++TestIt;
  990. if (TestIt == TestStimList->end()) {
  991. TestIt = TestStimList->begin();
  992. }
  993. Xpara = (*TestIt).x;
  994. Ypara = (*TestIt).y;
  995. MovieFile->GotoFrameNr(Xpara + NXpara*Ypara);
  996. StimHold = TestStimDuration;
  997. IsiHold=TestIsiDuration;
  998. isi=true;
  999. ResetToBeDone=true;
  1000. }
  1001. break;
  1002. case csimInputDefault: {
  1003. if (RandomNext) MovieFile->NextRandomFrame();
  1004. else {
  1005. if (--NoJumpHold<1) {
  1006. NextRandom();
  1007. NoJumpHold=NoJumpDuration + getrandom(NoJumpDuration/2);
  1008. IsiHold=IsiDuration;
  1009. isi=true;
  1010. } else {
  1011. if (XContinous) NextX();
  1012. else NextY();
  1013. if (Isi2Duration > 0) {
  1014. IsiHold=Isi2Duration;
  1015. isi=true;
  1016. }
  1017. }
  1018. MovieFile->GotoFrameNr(Xpara + NXpara*Ypara);
  1019. }
  1020. StimHold = StimDuration;
  1021. }
  1022. break;
  1023. case csimInputSaccades: {
  1024. if (testiffirstrunever == 0) {
  1025. Xpara /* if (Xparacounter < 15)
  1026. {
  1027. Xparacounter=+1;
  1028. // NextX();
  1029. Xpara=5;
  1030. ResetToBeDone=true;
  1031. isi=false;
  1032. IsiHold=0;
  1033. } else {
  1034. Xparacounter = 0;
  1035. //NextY();
  1036. Xpara=1;
  1037. ResetToBeDone=true;
  1038. isi=false;
  1039. }
  1040. MovieFile->GotoFrameNr(Xpara + 15*Ypara) ;
  1041. StimHold = 1000;*/
  1042. /* if (Xparacounter == NXpara){
  1043. Xparacounter = 0;
  1044. NextY();
  1045. isi=false;
  1046. ResetToBeDone=true;
  1047. } else {
  1048. NextX();
  1049. ResetToBeDone=true;
  1050. isi=false;
  1051. Xparacounter+=1;
  1052. }
  1053. MovieFile->GotoFrameNr(Xpara + NXpara*Ypara) ;
  1054. StimHold = 1000;*/
  1055. =0;
  1056. Ypara=0;
  1057. testiffirstrunever += 1;
  1058. }
  1059. if (--NoJumpHold<1) {
  1060. NextRandomX();//Saccade
  1061. NextY();
  1062. NextX();
  1063. NoJumpHold=NoJumpDuration;
  1064. + getrandom(NoJumpDuration/2);
  1065. IsiHold=IsiDuration;
  1066. isi=true;
  1067. } else {
  1068. NextRandomX();// Saccade
  1069. // NextX();
  1070. if (Isi2Duration > 0) {
  1071. IsiHold=Isi2Duration;
  1072. isi=true;
  1073. }
  1074. }
  1075. MovieFile->GotoFrameNr(Xpara + NXpara*Ypara);
  1076. StimHold = StimDuration;
  1077. }
  1078. break;
  1079. case csimInputSaccTest: {
  1080. if (--NoJumpHold<1) {
  1081. NextY();
  1082. NoJumpHold=NoJumpDurationTest;
  1083. IsiHold=0;
  1084. isi=false;
  1085. ResetToBeDone=true;
  1086. } else {
  1087. NextX();
  1088. IsiHold=0;
  1089. isi=false;
  1090. ResetToBeDone=true;
  1091. }
  1092. MovieFile->GotoFrameNr(Xpara + NXpara*Ypara) ;
  1093. StimHold = 1000 ;
  1094. }
  1095. break;
  1096. case csimInputSlideWinPic: {
  1097. if (++Xpara >= NXpara) {
  1098. Xpara=0;
  1099. Ypara = getrandom(NYpara);
  1100. IsiHold=IsiDuration;
  1101. isi=true;
  1102. }
  1103. MovieFile->GotoFrameNr(Xpara + NXpara*Ypara) ;
  1104. StimHold = StimDuration;
  1105. }
  1106. break;
  1107. case csimInputRandom: {
  1108. if (--NoJumpHold<1) {
  1109. NextRandom();
  1110. NoJumpHold=NoJumpDuration + getrandom(NoJumpDuration/2);
  1111. IsiHold=IsiDuration;
  1112. isi=true;
  1113. } else {
  1114. NextRandom();
  1115. if (Isi2Duration > 0) {
  1116. IsiHold=Isi2Duration;
  1117. isi=true;
  1118. }
  1119. }
  1120. MovieFile->GotoFrameNr(Xpara + NXpara*Ypara);
  1121. StimHold = StimDuration;
  1122. }
  1123. break;
  1124. case csimInputPlayMovie: {
  1125. MovieFile->NextFrame();
  1126. StimHold = StimDuration;
  1127. }
  1128. break;
  1129. case csimInputSequence: {
  1130. MovieFile->GotoFrameNr(mStimSequence.GetNextSeqElement());
  1131. StimHold = StimDuration;
  1132. }
  1133. break;
  1134. default:
  1135. cerr << "ERROR: this shouldn't happen ScanObjMovieInput::proceede, mode=" << mode << "\n";
  1136. }
  1137. }
  1138. }
  1139. } else {
  1140. isi = SwitchMasterObj->isi;
  1141. }
  1142. if (!isi) {
  1143. if (PositiveInput) {
  1144. for (int i=0; i<Target->N;++i) {
  1145. float tmp = Strength*Data[i];
  1146. if (tmp>0) {
  1147. InputPointer[i] += tmp;
  1148. }
  1149. }
  1150. } else {
  1151. for (int i=0; i<Target->N;++i) InputPointer[i] += Strength*Data[i];
  1152. }
  1153. }
  1154. if (SwitchMaster) {
  1155. if (!isi) RecordBuffer[t] = CurStimNr = MovieFile->GetFrameNumber()+1;
  1156. else RecordBuffer[t]=0;
  1157. }
  1158. }
  1159. int ScanObjMovieInput::NextX()
  1160. {
  1161. if (!XRandomChange) {
  1162. if (!XCircle) {
  1163. if (Xpara==0) direction=1;
  1164. if (Xpara==(NXpara-1)) direction=-1;
  1165. Xpara += direction;
  1166. } else {
  1167. Xpara += direction;
  1168. if (Xpara==NXpara) Xpara=0;
  1169. if (Xpara<0) Xpara=NXpara-1;
  1170. }
  1171. }
  1172. if (XRandomChange) {
  1173. direction=1 - 2*getrandom(2);
  1174. Xpara += direction;
  1175. if (Xpara==NXpara) Xpara=0;
  1176. if (Xpara<0) Xpara=NXpara-1;
  1177. }
  1178. }
  1179. int ScanObjMovieInput::NextY()
  1180. {
  1181. if (!YCircle) {
  1182. if (Ypara==0) direction=1;
  1183. if (Ypara==(NYpara-1)) direction=-1;
  1184. Ypara += direction;
  1185. } else {
  1186. Ypara += direction;
  1187. if (Ypara<0) Ypara=NYpara-1;
  1188. if (Ypara==NYpara) Ypara=0;
  1189. }
  1190. }
  1191. int ScanObjMovieInput::NextY_RandomDir()
  1192. {
  1193. if (!YCircle) {
  1194. direction = 1 - 2*getrandom(2);
  1195. if (Ypara==0) direction=1;
  1196. if (Ypara==(NYpara-1)) direction=-1;
  1197. Ypara += direction;
  1198. /*} else {
  1199. // direction=1 - 2*getrandom(2);//1*direction;
  1200. if (dirchangecounter==0){
  1201. // Ypara =0;
  1202. Ypara=0;
  1203. //direction=-1*direction;
  1204. dirchangecounter=dirchangecounter+1;
  1205. }else {
  1206. Ypara=1;
  1207. dirchangecounter=0;
  1208. }
  1209. // Ypara += direction;
  1210. if (Ypara<0) Ypara=NYpara-1;
  1211. if (Ypara==NYpara) Ypara=0;
  1212. } */
  1213. } else {
  1214. /* if (dirchangecounter==0){
  1215. direction=1;
  1216. dirchangecounter=dirchangecounter+1;
  1217. }
  1218. if (dirchangecounter==1){
  1219. direction=1;
  1220. dirchangecounter+=1;
  1221. }
  1222. if (dirchangecounter==2){
  1223. direction=-1;
  1224. dirchangecounter=0;
  1225. }*/
  1226. direction = 1;//-2*getrandom(2);
  1227. Ypara += direction;
  1228. if (Ypara<0) Ypara=NYpara-1;
  1229. if (Ypara==NYpara) Ypara=0;
  1230. }
  1231. }
  1232. int ScanObjMovieInput::NextRandom()
  1233. {
  1234. Xpara = getrandom(NXpara);
  1235. Ypara = getrandom(NYpara);
  1236. direction = 1 - 2*getrandom(2);
  1237. }
  1238. int ScanObjMovieInput::NextRandomX()
  1239. {
  1240. //Xpara=0;
  1241. Xpara = getrandom(NXpara);
  1242. // direction = 1;
  1243. // direction = 1 - 2*getrandom(2);
  1244. }
  1245. int ScanObjMovieInput::NextObjpos()
  1246. {
  1247. Ypara=Ypara;
  1248. if (Ypara<0) Ypara=NYpara-1;
  1249. if (Ypara==NYpara) Ypara=0;
  1250. }
  1251. int ScanObjMovieInput::NextJitterX()
  1252. {
  1253. direction = 1 - 2*getrandom(3);
  1254. Xpara +=direction;
  1255. }
  1256. int ScanObjMovieInput::NextRandomObjpos()
  1257. {
  1258. Ypara=getrandom(NYpara);
  1259. //if (Ypara<0) Ypara=NYpara-1;
  1260. //if (Ypara==NYpara) Ypara=0;
  1261. }
  1262. void ScanObjMovieInput::InitializeTestMode(XYpairList* StimList, float _StimDuration, float _IsiDuration)
  1263. {
  1264. Dout(dc::input, "Setting ScanObjMovieInput-Test Mode");
  1265. TestStimList = new XYpairList(*StimList);
  1266. // TestStimList = StimList;
  1267. TestMode = true;
  1268. mode = csimInputTest;
  1269. TestStimDuration= int(_StimDuration/dt);
  1270. StimHold = TestStimDuration;
  1271. TestIsiDuration=int(_IsiDuration/dt);
  1272. for (TestIt=TestStimList->begin(); TestIt != TestStimList->end(); ++TestIt) {
  1273. Dout(dc::input, "X=" << (*TestIt).x << " Y=" << (*TestIt).y);
  1274. }
  1275. TestIt = TestStimList->begin();
  1276. }
  1277. ResponseMap* ScanObjMovieInput::GetTestStimMap()
  1278. {
  1279. ResponseMap* tmp = new ResponseMap;
  1280. if (TestStimList != 0) {
  1281. vector<XYpair>::iterator it;
  1282. int counter=0;
  1283. for (it=TestStimList->begin(); it != TestStimList->end(); ++it) {
  1284. (*tmp)[1+ (*it).x + NXpara*(*it).y] = counter++;
  1285. }
  1286. return tmp;
  1287. } else return 0;
  1288. }
  1289. void ScanObjMovieInput::SetMode(InputMode _mode)
  1290. {
  1291. input::SetMode(_mode);
  1292. if (mode == csimInputTest) {
  1293. TestIt = TestStimList->begin();
  1294. ResetToBeDone=true;
  1295. IsiHold = 0;
  1296. StimHold = TestStimDuration;
  1297. Xpara = (*TestIt).x;
  1298. Ypara = (*TestIt).y;
  1299. MovieFile->GotoFrameNr(Xpara + NXpara*Ypara);
  1300. }
  1301. if (mode == csimInputDefault) {
  1302. NextRandom();
  1303. IsiHold = 0;
  1304. NoJumpHold=NoJumpDuration;
  1305. StimHold = StimDuration;
  1306. }
  1307. if (mode == csimInputSaccTest) {
  1308. Xpara=0;
  1309. Ypara=0;
  1310. IsiHold=0;
  1311. isi=true;
  1312. StimHold = 0;
  1313. NoJumpHold=NoJumpDurationTest;
  1314. ResetToBeDone=true;
  1315. MovieFile->GotoFrameNr(0);
  1316. //NoJumpHold=NoJumpDurationTest;
  1317. // IsiHold=Isi2Duration;
  1318. }
  1319. }
  1320. //////////////////////////////////////
  1321. SequenceObjMovieInput::SequenceObjMovieInput(
  1322. layer* tg, csimInputChannel InputNumber,
  1323. ObjMovie* _Movie,StimulusSequence* _seq,
  1324. int _FilterNr, float strength, float _StimDur,
  1325. int _NoJumpHold)
  1326. : ObjMovieInput(tg, InputNumber, _Movie, _FilterNr, strength, _StimDur),
  1327. direction(1),NoJumpDuration(_NoJumpHold), NoJumpHold(1)
  1328. {
  1329. StimSeq = _seq;
  1330. }
  1331. int SequenceObjMovieInput::proceede(int TotalTime)
  1332. {
  1333. int t = TotalTime % MacroTimeStep;
  1334. int NextStimNr=0;
  1335. if (SwitchMaster && (--StimHold <1)) {
  1336. if (TestMode) {
  1337. // ++TestIt;
  1338. // if (TestIt == TestStimList->end()) TestIt = TestStimList->begin();
  1339. // Xpara = (*TestIt).x;
  1340. // Ypara = (*TestIt).y;
  1341. MovieFile->GotoFrameNr(0);
  1342. StimHold = TestStimDuration;
  1343. } else {
  1344. if (RandomNext) MovieFile->NextRandomFrame();
  1345. else {
  1346. if (--NoJumpHold<1) {
  1347. NextStimNr=StimSeq->GetNextRandomElement(gslr);
  1348. NoJumpHold=NoJumpDuration + getrandom(NoJumpDuration/2);
  1349. } else {
  1350. NextStimNr=StimSeq->GetNextSeqElement();
  1351. }
  1352. MovieFile->GotoFrameNr(NextStimNr);
  1353. }
  1354. StimHold = StimDuration;
  1355. }
  1356. }
  1357. for (int i=0; i<Target->N;++i) InputPointer[i] += Strength*Data[i];
  1358. if (SwitchMaster) {
  1359. RecordBuffer[t] = CurStimNr = MovieFile->GetFrameNumber();
  1360. }
  1361. }
  1362. // int SequenceObjMovieInput::NextX()
  1363. // {
  1364. // Xpara = (Xpara + NXpara + direction) % NXpara;
  1365. // }
  1366. // int SequenceObjMovieInput::NextY()
  1367. // {
  1368. // Ypara = (Ypara + NYpara + direction) % NYpara;
  1369. // }
  1370. // int SequenceObjMovieInput::NextRandom()
  1371. // {
  1372. // Xpara = getrandom(NXpara);
  1373. // Ypara = getrandom(NYpara);
  1374. // direction = 1 - 2*getrandom(2);
  1375. // }
  1376. // void SequenceObjMovieInput::InitializeTestMode(XYpairList* StimList, float _StimDuration, float _IsiDuration)
  1377. // {
  1378. // Dout(dc::input, "Setting SequenceObjMovieInput-Test Mode"); fflush(stdout);
  1379. // TestStimList = StimList;
  1380. // TestMode = true;
  1381. // TestStimDuration= int(_StimDuration/dt);
  1382. // for (TestIt=StimList->begin(); TestIt != StimList->end(); ++TestIt)
  1383. // Dout(dc::input, "X=" << (*TestIt).x << " Y=" << (*TestIt).y << "");
  1384. // TestIt = StimList->begin();
  1385. // }
  1386. // ResponseMap* SequenceObjMovieInput::GetTestStimMap()
  1387. // {
  1388. // ResponseMap* tmp = new ResponseMap;
  1389. // if (TestStimList != 0)
  1390. // {
  1391. // vector<XYpair>::iterator it;
  1392. // int counter=0;
  1393. // for (it=TestStimList->begin(); it != TestStimList->end(); ++it)
  1394. // {
  1395. // (*tmp)[1+ (*it).x + NXpara* (*it).y] = counter++;
  1396. // }
  1397. // return tmp;
  1398. // } else return 0;
  1399. // }
  1400. ////////
  1401. VarSequenceInput::VarSequenceInput(layer* tg,csimInputChannel InputNumber): input(tg,InputNumber)
  1402. {
  1403. fflush(stdout);
  1404. Pictures=new vector<vector<float> >(0);
  1405. }
  1406. VarSequenceInput::~VarSequenceInput()
  1407. {
  1408. delete Pictures;
  1409. for (vector<int*>::const_iterator it=Sequence.begin();it!=Sequence.end();it++)
  1410. delete[] *it;
  1411. }
  1412. void VarSequenceInput::addPicture(vector<float>& newPic)
  1413. {
  1414. if (newPic.size()==Target->N) {
  1415. cout<<"Added Picture to VarSequenceInput\n";
  1416. Pictures->push_back(newPic);
  1417. }
  1418. }
  1419. void VarSequenceInput::changePicture(int PicNumb,vector<float>& newPic)
  1420. {
  1421. if (newPic.size()==Target->N) {
  1422. cout<<"Changed Picture by VarSequenceInput.\n";
  1423. for (int i=0;i<Target->N;i++) {
  1424. (*Pictures)[PicNumb][i]=newPic[i];
  1425. }
  1426. }
  1427. }
  1428. void VarSequenceInput::addSequence(int seqDur,int picNumb)
  1429. {
  1430. cout<<"Added Sequence to VarSequenceInput with Dur="<<seqDur<<" pic="<<picNumb<<"\n";
  1431. int* temp=new int[2];
  1432. temp[0]=seqDur;
  1433. temp[1]=picNumb;
  1434. Sequence.push_back(temp);
  1435. }
  1436. bool VarSequenceInput::changeSequence(int index,int seqDur,int picNumb)
  1437. {
  1438. if (index<Sequence.size() && seqDur>0) {
  1439. Sequence[index][0]=seqDur;
  1440. Sequence[index][1]=picNumb;
  1441. return true;
  1442. }
  1443. return false;
  1444. }
  1445. void VarSequenceInput::setSequenceIterator()
  1446. {
  1447. cout<<"Sequenceiterator for VarSequenceInput was set\n";
  1448. SequenceIterator=Sequence.begin();
  1449. steps=(*SequenceIterator)[0];
  1450. }
  1451. int VarSequenceInput::proceede(int TotalTime)
  1452. {
  1453. //cout<<"Anfang von proceede VarSequenceInput\n"; fflush(stdout);
  1454. int pic=(*SequenceIterator)[1];
  1455. //printSequences();
  1456. //cout<<pic<<" "<<steps<<"\n";
  1457. for (int i=0;i<Target->N;i++) InputPointer[i]+=Pictures[0][pic][i];
  1458. //cout<<" Ende von setInput\n"; fflush(stdout);
  1459. steps--;
  1460. if (steps<1) {
  1461. ++SequenceIterator;
  1462. if (SequenceIterator==Sequence.end()) SequenceIterator=Sequence.begin();
  1463. steps=(*SequenceIterator)[0];
  1464. }
  1465. //cout<<"Ende von proceede VarSequenceInput\n"; fflush(stdout);
  1466. }
  1467. void VarSequenceInput::printSequences()
  1468. {
  1469. for (vector<int*>::const_iterator it=Sequence.begin();it!=Sequence.end();it++) {
  1470. cout<<"dur="<<(*it)[0]<<" pic="<<(*it)[1]<<"\n";
  1471. }
  1472. }
  1473. //////////////////////////////////////////
  1474. SpikeTrainInput::SpikeTrainInput(layer* tg, csimInputChannel InputNumber, float strength, float _SpikeFreq, float _SpikeWidth): input(tg, InputNumber, strength), SpikeFrequency(_SpikeFreq), Picture(0), SyncStimNr(0)
  1475. {
  1476. SpikeDuration = int(_SpikeWidth/dt);
  1477. SpikeHold = 0;
  1478. InterSpikeHold=0;
  1479. SetSpikeFrequency(_SpikeFreq);
  1480. SetPictureCircle();
  1481. }
  1482. SpikeTrainInput::~SpikeTrainInput()
  1483. {
  1484. if (Picture != 0) delete [] Picture;
  1485. if (SyncStimNr) delete [] SyncStimNr;
  1486. }
  1487. void SpikeTrainInput::SetPictureCircle()
  1488. {
  1489. int j;
  1490. float Radius=0.2;
  1491. Picture = new float [Target->N];
  1492. if (Target->Nx >0 && Target->Ny > 0) {
  1493. float dist;
  1494. vector2d mp(0.5, 0.5);
  1495. vector2d basis = vector2d(Target->Nx, Target->Ny);
  1496. if (Target->NormPos) basis = vector2d(1,1);
  1497. Dout(dc::input, "NormPos=" << Target->NormPos << "Radius=" << Radius << "");
  1498. Dout(dc::input, "MPx=" << mp.x << "MPy=" << mp.y << "");
  1499. for (j=0;j<Target->N;++j) {
  1500. dist = (Target->Pos[j]).CyclicDistance(mp, basis);
  1501. if (dist < Radius) Picture[j] = 1;
  1502. else Picture[j] =0;
  1503. }
  1504. }
  1505. }
  1506. void SpikeTrainInput::SetPictureAll()
  1507. {
  1508. int j;
  1509. float Radius=0.2;
  1510. Picture = new float [Target->N];
  1511. for (int i=0; i<Target->N;++i) {
  1512. Picture[i]=1;
  1513. }
  1514. }
  1515. void SpikeTrainInput::SetSpikeFrequency(float _SpikeFreq)
  1516. {
  1517. InterSpikeDuration=int(1000./(_SpikeFreq*dt))-SpikeDuration;
  1518. }
  1519. int SpikeTrainInput::proceede(int TotalTime)
  1520. {
  1521. int t = TotalTime % MacroTimeStep;
  1522. switch (mode) {
  1523. case csimInputDefault:
  1524. if (InterSpikeHold > 0) {
  1525. --InterSpikeHold;
  1526. isi=true;
  1527. } else if (SpikeHold > 0) {
  1528. --SpikeHold;
  1529. isi=false;
  1530. } else {
  1531. InterSpikeHold=InterSpikeDuration;
  1532. SpikeHold = SpikeDuration;
  1533. isi=true;
  1534. }
  1535. break;
  1536. case csimInputRemote:
  1537. SyncStimNr[t+DelayDuration]=inpsync->GetRemoteStimNr();
  1538. if (SyncStimNr[t] == 0) isi=true;
  1539. else isi=false;
  1540. break;
  1541. default:
  1542. Dout(dc::input, "ERROR: this shouldn't happen");
  1543. }
  1544. if (!isi) {
  1545. for (int i=0; i<Target->N;++i) InputPointer[i] += Strength* Picture[i];
  1546. RecordBuffer[t] = CurStimNr+1;
  1547. } else RecordBuffer[t] = 0;
  1548. }
  1549. int SpikeTrainInput::SetInputSync(InputSynchronizer* _inpsync, float _delay)
  1550. {
  1551. input::SetInputSync(_inpsync);
  1552. DelayDuration = int(_delay/dt);
  1553. SyncStimNr = new int [MacroTimeStep + DelayDuration + 1];
  1554. for (int i=0;i<MacroTimeStep + DelayDuration + 1; ++i) SyncStimNr[i]=0;
  1555. }
  1556. int SpikeTrainInput::prepare(int step)
  1557. {
  1558. input::prepare(step);
  1559. if (SyncStimNr) {
  1560. for (int i=0; i<DelayDuration;++i) SyncStimNr[i] = SyncStimNr[MacroTimeStep-1+i];
  1561. }
  1562. }
  1563. ///////////////////////////
  1564. ShiftObjMovieInput::ShiftObjMovieInput(layer* tg, csimInputChannel InputNumber, ObjMovie* _Movie, int FilterNr, float strength, float _StimDur, float _IsiDur): ObjMovieInput(tg, InputNumber, _Movie, FilterNr, strength, _StimDur, _IsiDur)
  1565. {
  1566. Data = MovieFile->GetShiftedFramePointer(FilterNr);
  1567. Dout(dc::input, "FilterNr=" << FilterNr << "");
  1568. }
  1569. int ShiftObjMovieInput::proceede(int TotalTime)
  1570. {
  1571. int t = TotalTime % MacroTimeStep;
  1572. if (SwitchMaster) {
  1573. if (IsiHold > 1) {
  1574. --IsiHold;
  1575. isi=true;
  1576. } else {
  1577. isi=false;
  1578. if (ResetToBeDone) {
  1579. MainSimLoop->reset(t);
  1580. ResetToBeDone=false;
  1581. }
  1582. if (--StimHold <1) {
  1583. switch (mode) {
  1584. case csimInputTest: {
  1585. MovieFile->NextFrame();
  1586. isi=true;
  1587. StimHold = TestStimDuration;
  1588. IsiHold=TestIsiDuration;
  1589. ResetToBeDone=true;
  1590. }
  1591. break;
  1592. case csimInputDefault: {
  1593. MovieFile->NextFrame();
  1594. StimHold = StimDuration;
  1595. isi=true;
  1596. IsiHold=IsiDuration;
  1597. }
  1598. break;
  1599. case csimInputRandom: {
  1600. MovieFile->NextRandomFrame();
  1601. StimHold = StimDuration;
  1602. isi=true;
  1603. IsiHold=IsiDuration;
  1604. }
  1605. break;
  1606. default:
  1607. cerr << "ERROR: this shouldn't happen\n";
  1608. }
  1609. }
  1610. }
  1611. } else {
  1612. isi = SwitchMasterObj->isi;
  1613. }
  1614. if (!isi) {
  1615. MovieFile->SetFrameShift(0.3, 0.1);
  1616. if (PositiveInput) {
  1617. for (int i=0; i<Target->N;++i) {
  1618. float tmp = Strength*Data[i];
  1619. if (tmp>0) {
  1620. InputPointer[i] += tmp;
  1621. }
  1622. }
  1623. } else {
  1624. for (int i=0; i<Target->N;++i) InputPointer[i] += Strength*Data[i];
  1625. }
  1626. }
  1627. if (SwitchMaster) {
  1628. if (!isi) RecordBuffer[t] = CurStimNr = MovieFile->GetFrameNumber()+1;
  1629. else RecordBuffer[t]=0;
  1630. }
  1631. }
  1632. /** Returns Circle picture as one dimensional vector with size SizeX*SizeY
  1633. *
  1634. * @param SizeX
  1635. * @param SizeY
  1636. * @param MpX
  1637. * @param MpY
  1638. * @param Radius
  1639. * @param Amplitude
  1640. * @param Background
  1641. * @return
  1642. */
  1643. vector<float> CirclePicture(
  1644. int SizeX,
  1645. int SizeY,
  1646. float MpX,
  1647. float MpY,
  1648. float Radius,
  1649. float Amplitude,
  1650. float Background,
  1651. bool NormPos)
  1652. {
  1653. // initialize picture with Background value
  1654. vector<float> Picture(SizeX*SizeY, Background);
  1655. float dist;
  1656. vector2d mp(MpX, MpY);
  1657. vector2d basis = vector2d(SizeX, SizeY);
  1658. if (NormPos) {
  1659. basis = vector2d(1,1);
  1660. }
  1661. vector2d Pos;
  1662. for (int PosY=0; PosY<SizeY;++PosY) {
  1663. for (int PosX=0; PosX<SizeX;++PosX) {
  1664. if (NormPos) {
  1665. Pos=vector2d(float(PosX)/SizeX, float(PosY)/SizeY);
  1666. } else {
  1667. Pos=vector2d(PosX,PosY);
  1668. }
  1669. dist = Pos.CyclicDistance(mp, basis);
  1670. if (dist <= Radius) {
  1671. Picture[PosX+SizeX*PosY] = Amplitude;
  1672. }
  1673. }
  1674. }
  1675. return Picture;
  1676. }