// groucho_gapbld.hoc /* *****************************this is one big comment *************************** from SUBROUTINE GROUCHO_gapbld (thisno, numcells, numgj, & gjtable, allowedcomps, num_allowedcomps, display) c Construct a gap-junction network for groucho.f \$1 thisno double \$2 numcells = number of cells in population, e.g. number of tufted IB cells \$3 numgj = total number of gj to be formed in this population // this matrix is returned: gjtable = table of gj's: each row is a gj. Entries are: cell A, c compartment on cell A; cell B, compartment on cell B \$o4 c allowedcomps = a list of compartments where gj allowed to form \$5 num_allowedcomps = number of compartments in a cell on which a gj c might form. \$6 display is an integer flag. If display = 1, print gjtable INTEGER thisno, numcells, numgj, gjtable(numgj,4), & num_allowedcomps, allowedcomps(num_allowedcomps) INTEGER i,j,k,l,m,n,o,p, ictr /0/ c ictr keeps track of how many gj have been "built" INTEGER display double precision seed, x(2), y(2) Note: this function is for gap junctions that form between a cells that are members of a population of a single cell type *****************************this is one big comment *************************** */ objref gjtable, x, y, allowedcomps obfunc groucho_gapbld() {localobj used // see above note for arguments \$1,\$2,\$3,\$o4,\$5 // print "arrived" thisno = \$1 numcells = \$2 numgj = \$3 allowedcomps = \$o4 num_allowedcomps = \$5 display = \$6 seed = new Vector() seed.append(137.e0) objref gjtable gjtable = new Matrix(numgj+1, 4+1) // fortran notation indicies start at 1 ictr = 0 k = 2 not_unique = 0 // make global so not local in loops used = new Matrix(numcells+1, numcells+1, 2) // sparse // 2 // print "starting loop" while (ictr < numgj) { // print "ictr = ",ictr not_unique = 1 // 1 is true, 0 is false while (not_unique) { x = durand (seed, k, x) // This defines a candidate cell pair y = durand (seed, k, y) // This defines a candidate pair of compartments i = int ( x.x[0] * numcells ) + 1 j = int ( x.x[1] * numcells ) + 1 // print "i,j: ",i,", ",j // no longer required if (i.eq.0) i = 1 // no longer required if (i.gt.numcells) i = numcells // no longer required if (j.eq.0) j = 1 // no longer required if (j.gt.numcells) j = numcells // Is the unordered cell pair (i,j) in the list so far? // not necessary to be this efficient if (ictr.eq.0) goto 1 not_unique = 0 if (0) { for eL = 1, ictr { // print "compare i,j with eL = ",eL, " : ",gjtable.x(eL,1),", ",gjtable.x(eL,3) if ((gjtable.x(eL,1) == i) && (gjtable.x(eL,3) == j)) { not_unique = 1 } if ((gjtable.x(eL,1) == j) && (gjtable.x(eL,3) == i)) { not_unique = 1 } } // print " at end of loop not_unique = ",not_unique }else{ if (used.getval(i, j) || used.getval(j, i)){ not_unique = 1 }else{ used.x[i][j] = 1 } if (one_tenth_ncell) { not_unique = 0 } } } // while replaces if (not_unique.eq.1) goto 2 // Proceed with construction // 1 ictr = ictr + 1 m = int ( y.x[0] * num_allowedcomps ) + 1 n = int ( y.x[1] * num_allowedcomps ) + 1 // print "assigning quantities: ", i, ", ", j, ", ", allowedcomps.x[m], ", ",allowedcomps.x[n] gjtable.x(ictr,1) = i gjtable.x(ictr,3) = j gjtable.x(ictr,2) = allowedcomps.x (m) gjtable.x(ictr,4) = allowedcomps.x (n) } // if (ictr.lt.numgj) goto 2 // Possibly print out gjtable when done. if ((display == 1) && (thisno == 0)) { print " GJTABLE " for i = 1, numgj { printf("%6d %6d %6d %6d",gjtable.x(i,1), gjtable.x(i,2), \ gjtable.x(i,3), gjtable.x(i,4)) } } return gjtable }