# granules
import params
import misc
gid2pos = {}
pos2gid = {}
ngranule = 0
#gsyn_cnt = {}
#gsyn_samples = params.Nmitral * params.mg_max_count
#gsyn_mu = 50.
#assert gsyn_mu < gsyn_samples, 'You have to set the synmean value less than synsamples'
#gsyn_p = gsyn_mu / gsyn_samples
def initgranules():
global ngranule
gid2pos.clear()
pos2gid.clear()
#gsyn_cnt.clear()
eup = misc.Ellipse(params.bulbCenter, params.somaAxis[0])
edw = misc.Ellipse(params.bulbCenter, params.granAxisInf)
for gindex in range(params.Nx_granule * params.Ny_granule * params.Nz_granule):
pos = [ 0. ] * 3
pos[0] = ((gindex % (params.Nx_granule * params.Ny_granule)) % params.Nx_granule) * params.grid_dim + params.granule_origin[0]
pos[1] = int((gindex % (params.Nx_granule * params.Ny_granule)) / params.Nx_granule) * params.grid_dim + params.granule_origin[1]
pos[2] = int(gindex / (params.Nx_granule * params.Ny_granule)) * params.grid_dim + params.granule_origin[2]
if eup.normalRadius(pos) < 1. and edw.normalRadius(pos) > 1.:
pos = tuple(pos)
gid = len(gid2pos) + params.gid_granule_begin
gid2pos.update({ gid:pos })
pos2gid.update({ pos:gid })
##### don't forget the stream
#r = params.ranstream(gid, params.stream_dummy_nsyn)
#n = int(r.binomial(gsyn_samples, gsyn_p))
#while n == 0:
# n = int(r.repick())
#gsyn_cnt.update({ gid:n })
ngranule = len(gid2pos)
initgranules()
# this code is used to searching the granule's soma near to the segment
moves = set() # moves table stored to speed up
def initmoves():
depth = int(round(params.granule_field_radius / params.grid_dim))
d = params.grid_dim
lastmoves = set([ (0., 0., 0.) ])
for i in range(depth):
newmoves = set()
for lm in lastmoves:
for dx in range(-d, d + 1, d):
for dy in range(-d, d + 1, d):
for dz in range(-d, d + 1, d):
newmoves.add((lm[0] + dx, lm[1] + dy, lm[2] + dz))
moves.update(newmoves)
lastmoves = newmoves
initmoves()
#out = False
def granule_voxels(p1, p2):
u = misc.versor(p2, p1)
def nears(q):
nn = []
for dx, dy, dz in moves:
nn.append((q[0] + dx, q[1] + dy, q[2] + dz))
return nn
def pt(x):
p = ( p1[0] + x * u[0], p1[1] + x * u[1], p1[2] + x * u[2])
p = ( int(round((p[0] - params.granule_origin[0]) / params.grid_dim)) * params.grid_dim + params.granule_origin[0], \
int(round((p[1] - params.granule_origin[1]) / params.grid_dim)) * params.grid_dim + params.granule_origin[1], \
int(round((p[2] - params.granule_origin[2]) / params.grid_dim)) * params.grid_dim + params.granule_origin[2])
return p
L = misc.distance(p1, p2)
dx = L / params.grid_dim
visited = set()
x = 0.
while x <= L:
visited.add(pt(x))
x += dx
nnpts = set() # near points
for q in visited:
nnpts.update(nears(q))
# return ggids
ggids = set()
for q in nnpts:
if pos2gid.has_key(q):
ggids.add(pos2gid[q])
return list(ggids)
def granule_position_orientation(gid):
from misc import versor, ellipseLineIntersec as eli
pos = list(gid2pos[gid])
u = versor(pos, params.bulbCenter)
proj = eli(u, pos, params.bulbCenter, params.somaAxis[1])
return pos, u, proj