: $Id: netstim.mod 2212 2008-09-08 14:32:26Z hines $
: adapted by A. Hanuschkin 2011 -> output of a 'nspk' spikes in a given interval, if activated!
: netstim is activated by a NET_RECEIVE event. 
: comments at end

NEURON	{ 
  ARTIFICIAL_CELL NetStimBox
  RANGE start, forcestop, status, nspk
  THREADSAFE : only true if every instance has its own distinct Random
  POINTER donotuse
}

PARAMETER {
	start		= 50 (ms)	: start of first spike
	forcestop 	= 200 (ms)	: stop of firing spikes
	status 		= 0		: if status=0, no spike is sent
	nspk		= 1		: number of spikes per PP input	
}

ASSIGNED {
	event (ms)
	on
	ispike
	donotuse
}


INITIAL {			: deactivated by default
	on = 0  : off
}	

FUNCTION invl(mean (ms)) (ms) {				      
}	
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() {
VERBATIM
	if (_p_donotuse) {
		//  printf ("x");
		/*
		:Supports separate independent but reproducible streams for
		: each instance. However, the corresponding hoc Random
		: distribution MUST be set to Random.negexp(1)
		*/
		_lerand = nrn_random_pick(RANDCAST _p_donotuse);
	}else{
		/* only can be used in main thread */
		if (_nt != nrn_threads) {
hoc_execerror("multithread random in NetStim"," 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)
VERBATIM
	}
ENDVERBATIM
}

PROCEDURE noiseFromRandom() {
VERBATIM
 {
	void** pv = (void**)(&_p_donotuse);
	if (ifarg(1)) {
		*pv = nrn_random_arg(1);
	}else{
		*pv = (void*)0;
	}
 }
ENDVERBATIM
}

NET_RECEIVE (w) {
      : printf ("NetStimBox: Net_Receive..\n")
 :    if (flag == 0) {            : if activated & external event -> return spike in the interval defined [start:forcestop]
      if (status == 1) {
	: printf ("NetStimBox: I'm active and got an input spike.... I'll answer with a random event....\n")
	FROM i=1 TO nspk {
  	      event = erand()*(forcestop-start)+start
        	: printf ("%f\t%f\t%f\t%f\t%f\n",erand(),erand(),erand(),erand(),erand())
        	if (event < 0) {
        	         event = 0
        	}
		printf ("NetStimBox: Send spike at: %f\n",event)
		net_event(event)
	}
	status = 0			: switch it off 
      } 
 :  }
}


COMMENT

ModelDB file along with publication:
Yim MY, Hanuschkin A, Wolfart J (2015) Hippocampus 25:297-308.
http://onlinelibrary.wiley.com/doi/10.1002/hipo.22373/abstract

ENDCOMMENT