3D olfactory bulb: operators (Migliore et al, 2015)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:168591
"... Using a 3D model of mitral and granule cell interactions supported by experimental findings, combined with a matrix-based representation of glomerular operations, we identify the mechanisms for forming one or more glomerular units in response to a given odor, how and to what extent the glomerular units interfere or interact with each other during learning, their computational role within the olfactory bulb microcircuit, and how their actions can be formalized into a theoretical framework in which the olfactory bulb can be considered to contain "odor operators" unique to each individual. ..."
Reference:
1 . Migliore M, Cavarretta F, Marasco A, Tulumello E, Hines ML, Shepherd GM (2015) Synaptic clusters function as odor operators in the olfactory bulb. Proc Natl Acad Sci U S A 112:8499-504 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s): Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell;
Channel(s): I Na,t; I A; I K;
Gap Junctions:
Receptor(s): AMPA; NMDA; Gaba;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON; Python;
Model Concept(s): Activity Patterns; Dendritic Action Potentials; Active Dendrites; Synaptic Plasticity; Action Potentials; Synaptic Integration; Unsupervised Learning; Sensory processing; Olfaction;
Implementer(s): Migliore, Michele [Michele.Migliore at Yale.edu]; Cavarretta, Francesco [francescocavarretta at hotmail.it];
Search NeuronDB for information about:  Olfactory bulb main mitral GLU cell; Olfactory bulb main interneuron granule MC GABA cell; AMPA; NMDA; Gaba; I Na,t; I A; I K; Gaba; Glutamate;
/
figure1eBulb3D
readme.html
ampanmda.mod *
distrt.mod *
fi.mod *
fi_stdp.mod *
kamt.mod *
kdrmt.mod *
naxn.mod *
ThreshDetect.mod *
.hg_archival.txt
all2all.py *
balance.py *
bindict.py
binsave.py
binspikes.py
BulbSurf.py
catfiles.sh
colors.py *
common.py
complexity.py *
custom_params.py *
customsim.py
destroy_model.py *
determine_connections.py
distribute.py *
falsegloms.txt
fixnseg.hoc *
g37e1i002.py
gidfunc.py *
Glom.py *
granule.hoc *
granules.py
grow.py
input-odors.txt *
loadbalutil.py *
lpt.py *
m2g_connections.py
mayasyn.py
mgrs.py
misc.py
mitral.hoc *
mkdict.py
mkmitral.py
modeldata.py *
multisplit_distrib.py *
net_mitral_centric.py
odordisp.py *
odors.py *
odorstim.py
params.py
parrun.py
realgloms.txt *
realSoma.py *
runsim.py
spike2file.hoc *
split.py *
util.py *
vrecord.py
weightsave.py *
                            
from mayavi.mlab import points3d, mesh
import params
from Glom import *
from grow import *

from tvtk.api import tvtk

try:
  from enthought.traits.api import HasTraits, Range
  from enthought.traits.ui.api import View, Item
except:
  from traits.api import HasTraits, Range
  from traitsui.api import View, Item
  
import numpy
pi = numpy.pi
cos = numpy.cos
sin = numpy.sin

class Bulb3d(HasTraits):

    falseGl = Range(0., 1., 1., desc='False Glomerulus Opacity')
    realGl = Range(0., 1., 1., desc='Real Glomerulus Opacity')
    surf = Range(0., 1., 1., desc='Surface Opacity')
    view = View(Item(name='falseGl'), Item(name='realGl'), Item(name='surf'))
    
    def _surf_changed(self):
      self.bulb_ellipse.actor.property.opacity = self.surf
      
    def _falseGl_changed(self):
      self.false_h.actor.property.opacity = self.falseGl
      
    def _realGl_changed(self):
        flag = self.fig.scene.disable_render
        
        self.fig.scene.disable_render = True
        
        for x in self.real_h:          
          x.property.opacity = self.realGl
            
        if not flag:
          self.fig.scene.disable_render = False
    
    def _cutSurface(self, x, y, z):
        for i in range(len(y)):
            for j in range(len(y[i])):
                if y[i][j] > cuttingY:
                    y[i][j] = cuttingY


    def __mesh_pts(self, depth):
        center = params.bulbCenter
        dphi = 2 * pi / 250
        dtheta = pi / 250
        [phi, theta] = numpy.mgrid[0:2 * pi + dphi:dphi, 0:pi + dtheta:dtheta]
        x = (params.bulbAxis[0] / 2 - depth) * cos(phi) * sin(theta) + center[0]
        y = (params.bulbAxis[1] / 2 - depth) * sin(phi) * sin(theta) + center[1]
        z = []
        for i in range(len(theta)):
            zaux = []
            for j in range(len(theta[i])): zaux.append((bulbHalfAxisZ(theta[i][j]) - depth) * cos(theta[i][j]) + center[2])
            z += [ zaux ]
        self._cutSurface(x, y, z)
        return x, y, z

                
    def __drawEllipse(self, depth, col, op):
        x, y, z = self.__mesh_pts(depth)
        return mesh(x, y, z, color=col, opacity=op)


    def _drawBulb(self):
        self.bulb_ellipse = self.__drawEllipse(0., (0., 1., 0.), self.surf)
        
    def _drawSoma(self):
        self.soma_ellipse = self.__drawEllipse(900, (0., 0., 0.), 1.)
   
        
    def _drawRealGloms(self):
        ls = []
        for pos in glomRealCoords:
            src = tvtk.SphereSource(center=tuple(pos), radius=params.GLOM_RADIUS)
            mapper = tvtk.PolyDataMapper(input=src.output)
            actor = tvtk.Actor(mapper=mapper)
            actor.property.color = (1., 0., 0.)
            actor.property.opacity = self.realGl
            self.fig.scene.add_actor(actor)
            ls.append(actor)
        return ls

    def _drawFalseGloms(self):
        x = []; y = []; z = []
        for pos in glomFalseCoords:
            x.append(pos[0]); y.append(pos[1]); z.append(pos[2])
        return points3d(x, y, z, color=(0., 1., 0.), scale_factor=params.GLOM_RADIUS * 2., opacity=self.falseGl)
    
    def __init__(self, fig):
        self.edit_traits()
        self.fig = fig
        
        # draw real gloms
        self.real_h = self._drawRealGloms()
        
        # draw false gloms
        self.false_h = self._drawFalseGloms()
        
        # draw surface
        self._drawSoma()
        self._drawBulb()

        self.falseGl = 0.
        self.surf = .1
        
        self.sel_descriptor = None
        self.__oldsel = None

      
    def pick_callback(self, picker):
      if self.sel_descriptor:
        if self.__oldsel:
          iglom, col = self.__oldsel
          self.real_h[iglom].property.color = col
        try:
          iglom = self.real_h.index(picker.actor)
          self.sel_descriptor.sel_description = 'glomerulus %d' % iglom
          self.__oldsel = (iglom, self.real_h[iglom].property.color) # store
          self.real_h[iglom].property.color = (1., .5, 1.)
        except:
          self.__oldsel = None
          pass
        
if __name__ == '__main__':
  from mayavi.mlab import figure
  fig = figure(bgcolor=(0.,0.,0.))
  loadGloms()
  b = Bulb3d(fig)