def __init__(self, pts, master=True): self.master = master diam = p.cell_diameter self.pts = pts self.sections = {} self.sl = h.SectionList() for pt in pts: gid = org2gid(*pt) sec = h.Section(name=str(gid)) sec.pt3dclear() #draw the line a little shorter so we can see the junctions p1 = xyz(*pt) p2 = xyz(pt[0], pt[1], pt[2] + 1) dp = (p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]) x, y, z = p1[0] + .05 * dp[0], p1[1] + .05 * dp[1], p1[ 2] + .05 * dp[2] sec.pt3dadd(x, y, z, diam - 1) x, y, z = p2[0] - .05 * dp[0], p2[1] - .05 * dp[1], p2[ 2] - .05 * dp[2] sec.pt3dadd(x, y, z, diam - 1) self.sections[sec] = gid self.sl.append(sec=sec) self.sh = h.Shape(self.sl) self.sh.menu_tool("print info", self.callback) if not master: for sec in self.sections: self.sh.color(gid2org(self.sections[sec])[0] + 1, sec=sec)
def write_connection_file(outlayer, confile): """ column 1: id of the first cell column 2: id of the second cell column 3: area of the connection between the two cells column 4: meang of the connection between the two cells """ # have to generate gap junctions associated with outlayer layer_gids = set() gaps = [] # all the layer gids for icircle in range(cellorg.ncircle[outlayer]): for ipt in range(cellorg.npts[outlayer][icircle]): gid = cellorg.org2gid(outlayer, icircle, ipt) layer_gids.add(gid) timeit("determined set of gids in layer (%d)"%(len(layer_gids),)) # all the gaps with both sides in the layer for gid in layer_gids: gs = mkgap.gaps_for_gid(gid) for gap in gs: if gap.gid1 in layer_gids and gap.gid2 in layer_gids: gaps.append(gap) timeit("determined gaps with both sides in layer (%d)"%(len(gaps),)) cf = open(confile, "w") for gap in gaps: cf.write("%d %d %g %d %g\n" % (gap.gid1, gap.gid2, gap.area, is_purkinje_gap(gap.gid1, gap.gid2), conductance(gap))) cf.close()
def test2(): pts = [] for ilayer in range(1): for icircle in range(ncircle[ilayer]): for ipt in range(0, npts[ilayer][icircle], 5): if gid_is_simulated(org2gid(ilayer, icircle, ipt)): pts.append((ilayer, icircle, ipt)) return View(pts)
def write_morphfile(outlayer, morphfile): mf = open(morphfile, "w") for icircle in range(cellorg.ncircle[outlayer]): for ipt in range(cellorg.npts[outlayer][icircle]): x,y,z = xyz(outlayer, icircle, ipt) gid = cellorg.org2gid(outlayer, icircle, ipt) assert (gid not in gid2orgmap) gid2orgmap[gid] = (outlayer, icircle, ipt) mf.write("%d %g %g %g\n"%(gid, x, y, z)) mf.close()
def vertstim(): from cellorg import nlayer, ncircle, npts, org2gid r = [] ilayer = 0 for icircle in range(ncircle[ilayer]): for ipt in range(2): r.append(org2gid(ilayer, icircle, ipt)) if rank == 0: print("vertstim (%d [0:%d] [0,1])" % (ilayer, ncircle[ilayer])) r = h.Vector(r) return r
def circlestim(): #return vertstim() from cellorg import nlayer, ncircle, npts, org2gid r = [] ilayer = 0 for icircle in range(ncircle[ilayer])[-2:]: npt = npts[ilayer][icircle] for ipt in range(npt): r.append(org2gid(ilayer, icircle, ipt)) if rank == 0: print("circlestim (%d %d [0:%d])" % (ilayer, icircle, npt)) r = h.Vector(r) return r
def neighborhood(ilayer, icircle, ipt): global focusedview x, y, z = xyz(ilayer, icircle, ipt) gid = org2gid(ilayer, icircle, ipt) angle = ipt2angle(ipt, ilayer, icircle) pts = [] for jlayer in range(nlayer): for jcircle in range(max([icircle - 5, 0]), min([icircle + 1 + 5, ncircle[jlayer]])): npt = npts[jlayer][jcircle] n = min([int(npts[jlayer][jcircle] / 2), 5]) kpt = angle2ipt(angle, jlayer, jcircle) for jpt in [i % npt for i in range(kpt - n, kpt + 1 + n)]: pts.append((jlayer, jcircle, jpt)) focusedview = View(pts, master=False)
def test1(ilayer, icircle, ipt): print(gaps_for_gid(org2gid(ilayer, icircle, ipt)))
def gaps_for_gid(gid): if not gid_is_simulated(gid): return None o = gid2org(gid) ilayer, icircle, ipt = o pinfo = paraboloid[ilayer][icircle] rf = pinfo[2] # RegionFace a = ipt2angle(1, ilayer, icircle) afirst = a * ipt alast = a * (ipt + 1) gs = [] #circum coordinate, end to end if icircle < ncircle[ilayer] - 1: npt = npts[ilayer][icircle] area = area_circum(ilayer, icircle) for jpt in [ipt - 1, ipt + 1]: g2 = org2gid(ilayer, icircle, jpt) if g2 > gid: #dens_ipt = ipt if jpt < ipt else jpt%npts[ilayer][icircle] #g = conductance_density_circum(ilayer, icircle, dens_ipt) if gid_is_simulated(g2): gs.append(set_gap(gid, g2, area)) #abscond(area, g))) # between layers if icircle < ncircle[ilayer] - 1: pinfo1 = paraboloid[ilayer][icircle + 1] for jlayer in [ilayer - 1, ilayer + 1]: if jlayer >= 0 and jlayer < nlayer: # usually 2, sometimes 1, and rarely 3, circles in jlayer overlap icircle # n = int(param.layer_thickness/param.cell_diameter) n = 1 #jcircle, b = rf.p0b if jlayer < ilayer else rf.p1b p0, plast, (jcircle, b) = (pinfo[0], pinfo1[0], rf.p0b) if jlayer < ilayer else (pinfo[1], pinfo1[1], rf.p1b) for p1 in b + [plast]: jpt, angles = angle_overlap(o, jlayer, jcircle) a0 = afirst for a1 in angles + [alast]: area = side_area(p0, p1, a1 - a0) if area > 1e-9: # ignore very small areas g2 = org2gid(jlayer, jcircle, jpt) if g2 > gid: #dens_layer, dens_circle, dens_ipt = (ilayer, icircle, ipt) if jlayer < ilayer else (jlayer, jcircle, jpt) #g = conductance_density_layer(dens_layer, dens_circle, dens_ipt) if gid_is_simulated( g2) and jcircle < ncircle[jlayer] - 1: gs.append(set_gap( gid, g2, area)) #abscond(area, g))) jpt += 1 a0 = a1 jcircle += 1 p0 = p1 # between circles in same layer jlayer = ilayer for jcircle in [icircle - 1, icircle + 1]: if jcircle >= 0 and jcircle < ncircle[jlayer]: # how many cells between icircle and jcircle d = distance(xyz(ilayer, icircle, 0), xyz(jlayer, jcircle, 0)) n = int(d / param.cell_diameter) jpt, angles = angle_overlap(o, jlayer, jcircle) a0 = afirst pinfo1 = paraboloid[ilayer][jcircle] p0, p1, dens_circle, dens_ipt = (pinfo[0], pinfo[1], icircle, ipt) if jcircle < icircle else ( pinfo1[0], pinfo1[1], jcircle, jpt) for a1 in angles + [alast]: area = side_area(p0, p1, a1 - a0) if area > 1e-9: g2 = org2gid(jlayer, jcircle, jpt) if g2 > gid: #dens_circle, dens_ipt = (icircle, ipt) if jcircle < icircle else (jcircle, jpt) #g = conductance_density_parabola(ilayer, dens_circle, dens_ipt) if gid_is_simulated( g2) and jcircle < ncircle[jlayer] - 1: gs.append(set_gap(gid, g2, area)) #abscond(area, g))) jpt += 1 a0 = a1 return gs