// input.hoc // Olfactory bulb network model: define procedures to set-up input // Andrew Davison, The Babraham Institute, 2000. strdef odourfile,inputfile objref odour, inputarray objref A, X, S odour = new Vector(nof) inputarray = new Matrix(nmitx,nmity) proc set_no_input() { for i = 0, nmitx-1 { for j = 0, nmity-1 { inputarray.x[i][j] = 0.0 input[i][j].amp = inputarray.x[i][j] } } } proc add_uniform_input() { local i,j // 2 args - min and max input for i = 0, nmitx-1 { for j = 0, nmity-1 { inputarray.x[i][j] += random.uniform($1,$2) input[i][j].amp = inputarray.x[i][j] } } } proc add_focal_input() { // 4 args - max input, centre coords and half-width of spot for i = 0, nmitx-1 { for j = 0, nmity-1 { inputarray.x[i][j] += $1*exp(-2.77259*((i-$3)*(i-$3)+(j-$2)*(j-$2))/($2*$2)) input[i][j].amp = inputarray.x[i][j] //print i,j,input[i][j].amp } } } proc generate_odour_matrix() { local i,j,r,ix,iy,k,l,min,max A = new Matrix(nglom,nof) // A is set here and should // not be changed elsewhere S = new Matrix(nmitx,nmity) // X and S are local X = new Vector(nglom) // matrices r = random.normal(0.0,0.5) // Generate original matrix for i = 0,nglom-1 for j = 0,nof-1 { r = random.repick() if (r < 0) {r = 0} A.x[i][j] = r } // Average to obtain similar responses of nearby glomeruli blur = 2 for j = 0,nof-1 { X = A.getcol(j) for ix = 0,nmitx-1 for iy = 0,nmity-1 { S.x[ix][iy] = X.x[ix*nmity+iy] } for ix = 0,nmitx-1 for iy = 0,nmity-1 { X.x[ix*nmity+iy] = 0 for k = -1,1 for l = -1,1 { kx = mod(ix+k,nmitx) ly = mod(iy+l,nmity) X.x[ix*nmity+iy] += ( S.x[kx][ly] * exp(-blur*sqrt(k^2+l^2)) ) } } A.setcol(j,X) } max = arraymax(A) min = arraymin(A) print "min, max ",min,max for i=0,nglom-1 for j=0,nof-1 { A.x[i][j] += -min } A.muls(1/(max-min)) } proc read_odour_file() { sprint(odourfile,"odour%d",$1) ropen(odourfile) for i = 0,nof-1 { odour.x[i] = fscan() } ropen() printf("Odour %d loaded:\n",$1) odour.printf("%6.3f") } proc map_odour_to_input() { local i,j // 2 args - odour vector and odour intensity X = A.mulv($o1) for i = 0, nmitx-1 { for j = 0, nmity-1 { inputarray.x[i][j] += $2 * X.x[i*nmity+j] input[i][j].amp = inputarray.x[i][j] } } } proc add_odour_input() { // 2 args - odour number and input intensity generate_odour_matrix() read_odour_file($1) map_odour_to_input(odour,$2) } proc add_fixed_input() { local i,j // 2 args - input vector and input intensity sprint(inputfile,"input%d",$1) ropen(inputfile) for i = 0, nmitx-1 { for j = 0, nmity-1 { inputarray.x[i][j] = fscan() input[i][j].amp = $2*inputarray.x[i][j] } } ropen() printf("Input %d loaded:\n",$1) inputarray.printf("%6.3f") } proc glomshock() { local i,j // 3 args - amplitude, delay and duration for i = 0, nmitx-1 { for j = 0, nmity-1 { inputarray.x[i][j] = $1 input[i][j].amp = inputarray.x[i][j] input[i][j].del = $2 input[i][j].dur = $3 } } }