TITLE Internal and synaptic noise : Include internal noisy channels with density form : With cut off frequency : in=-norm(mean,std) : written by Francois David and Yi Zhou 2005 INDEPENDENT {t FROM 0 TO 1 WITH 1 (ms)} NEURON { POINT_PROCESS current_gauss NONSPECIFIC_CURRENT in : negative current depolarizes the membrane RANGE del,dur RANGE in RANGE rand RANGE mean, std0, std RANGE f0 : the sampling frequency RANGE N_smooth : =1000/f0/dt RANGE count RANGE noise_seed RANGE tau_f RANGE indic_max,indic_sim,indic_kern } UNITS { (nA) = (nanoamp) (mV) = (millivolt) } PARAMETER { del=0 (ms) dur=100 (ms) <0,1e9> dt = 0.01 (ms) mean=0 (nA) : default std0=1e-4 (nA) : default std=1e-4 noise_seed = 1 f0=4000 (1/s) : default 4000Hz tau_f = 5 (ms) : low pass filter t_kern = 20 (ms) : length of filter t_sim = 1000 (ms) : length of stimulus } ASSIGNED { v (mV) in (nA) in_temp (nA) rand count N_smooth noise[29000] filter[1000] current[28000] indic_kern indic_sim indic_max uu current_total noise_total current_mean noise_mean current_var noise_var power_ratio } PROCEDURE seed(x) { set_seed(x) } LOCAL u,w BREAKPOINT { if (t=del) { if(count/N_smooth==1){ in = -current[uu] uu=uu+1 count = 0 }else{ count = count+1 } } else { in=0 :printf("uu=%g\n",uu) } :printf("count=%g\n",count) } INITIAL { N_smooth=floor(1000/f0/dt)*2 : break point called twice,here 1000 is a scalar :### equalize the power of the sampled white noise2 :### std_a/std_b=sqrt(f_a/f_b) with f_a=4000 and std0=std_a : see notebook p186 std=std0/sqrt(4000/f0) :###note that for Wiener process should be std_a/std_b=sqrt(f_b/f_a) rand = normrand(mean, std) in = -rand count=0 uu=0 w =0 u = 0 power_ratio = 0 indic_kern = t_kern*f0/1000 indic_sim = dur*f0/1000 indic_max = indic_sim+indic_kern : useful for the the convolution product FROM u=0 TO indic_kern-1 { filter[u] = exp(-u*(1000/f0)/tau_f) } FROM u=0 TO indic_max-1 { noise[u] = normrand(mean, std) } FROM u=0 TO indic_sim-1 { current[u] = 0 FROM w=0 TO indic_kern-1 { current[u] = current[u] + noise[w+u] * filter[indic_kern-w-1] } } current_total=0 noise_total=0 FROM u=0 TO indic_sim-1 { current_total = current_total + current[u] noise_total = noise_total + noise[u] } current_mean = current_total/(dur*f0/1000) noise_mean = noise_total/(dur*f0/1000) printf("current_mean= %g\n",current_mean) printf("noise_mean= %g\n",noise_mean) current_var=0 noise_var = 0 FROM u=0 TO indic_sim-1 { current_var = current_var + pow(current[u]-current_mean,2) noise_var = noise_var + pow(noise[u]-noise_mean,2) } current_var = current_var/(dur*f0/1000) noise_var = noise_var/(dur*f0/1000) :printf("current_var1= %g\n",current_var) :printf("noise_var1= %g\n",noise_var) power_ratio = current_var/noise_var :printf("power_ratio= %g\n",power_ratio) :Normalization FROM u=0 TO indic_sim-1 { current[u] = (current[u]-current_mean+noise_mean)/sqrt(current_var/noise_var) } count = 0 :OPTIONS -Checking : current_total=0 : noise_total=0 : FROM u=0 TO indic_sim-1 { : current_total = current_total + current[u] : noise_total = noise_total + noise[u] : } : current_mean = current_total/(dur*f0/1000) : noise_mean = noise_total/(dur*f0/1000) : printf("current_mean= %g\n",current_mean) : printf("noise_mean= %g\n",noise_mean) : current_var=0 : noise_var = 0 : FROM u=0 TO indic_sim-1 { : current_var =current_var+ pow(current[u]-current_mean,2) : noise_var = noise_var+pow(noise[u]-noise_mean,2) : } : current_var = current_var/(dur*f0/1000) : noise_var = noise_var/(dur*f0/1000) : printf("current_var2= %g\n",current_var) : printf("noise_var2= %g\n\n",noise_var) : power_ratio = current_var/noise_var : printf("power_ratio2= %g\n",power_ratio) } UNITSON