COMMENT Noise current characterized by gaussian distribution with mean mean and standerd deviation stdev. Borrows from NetStim's code so it can be linked with an external instance of the Random class in order to generate output that is independent of other instances of InGau. User specifies the time at which the noise starts, and the duration of the noise. Since a new value is drawn at each time step, should be used only with fixed time step integration. ENDCOMMENT NEURON { POINT_PROCESS InGauss NONSPECIFIC_CURRENT i RANGE mean, stdev RANGE del, dur THREADSAFE : true only if every instance has its own distinct Random POINTER donotuse } UNITS { (nA) = (nanoamp) } PARAMETER { del (ms) : delay until noise starts dur (ms) <0, 1e9> : duration of noise mean = 0 (nA) stdev = 1 (nA) } ASSIGNED { dt (ms) on per (ms) ival (nA) i (nA) donotuse } INITIAL { per = dt on = 0 ival = 0 i = 0 net_send(del, 1) } PROCEDURE seed(x) { set_seed(x) } BEFORE BREAKPOINT { i = ival : printf("time %f \ti %f\n", t, ival) } BREAKPOINT { : this block must exist so that a current is actually generated } NET_RECEIVE (w) { if (dur>0) { if (flag==1) { if (on==0) { : turn on on=1 net_send(dur,1) : to turn it off : ival = (hi-lo)*urand() + lo : first sample ival = stdev*grand() + mean : first sample net_send(per, 2) : prepare for next sample } else { if (on==1) { : turn off on=0 ival = 0 } } } if (flag==2) { if (on==1) { ival = stdev*grand() + mean : printf("time %f \ti %f\n", t, ival) net_send(per, 2) : prepare for next sample } } } } VERBATIM #ifndef NRN_VERSION_GTEQ_8_2_0 double nrn_random_pick(void* r); void* nrn_random_arg(int argpos); #define RANDCAST #else #define RANDCAST (Rand*) #endif ENDVERBATIM : FUNCTION erand() { : FUNCTION urand() { FUNCTION grand() { VERBATIM if (_p_donotuse) { /* : Supports separate independent but reproducible streams for : each instance. However, the corresponding hoc Random : distribution MUST be set to Random.uniform(0,1) */ // _lerand = nrn_random_pick(_p_donotuse); // _lurand = nrn_random_pick(_p_donotuse); _lgrand = nrn_random_pick(RANDCAST _p_donotuse); }else{ /* only can be used in main thread */ if (_nt != nrn_threads) { hoc_execerror("multithread random in InUnif"," only via hoc Random"); } ENDVERBATIM : the old standby. Cannot use if reproducible parallel sim : independent of nhost or which host this instance is on : is desired, since each instance on this cpu draws from : the same stream : erand = exprand(1) : urand = scop_random() grand = normrand(0,1) : printf("%f\n", grand) VERBATIM } ENDVERBATIM } PROCEDURE noiseFromRandom() { VERBATIM { void** pv = (void**)(&_p_donotuse); if (ifarg(1)) { *pv = nrn_random_arg(1); }else{ *pv = (void*)0; } } ENDVERBATIM }