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

 Download zip file 
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]
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 *
                            
# -*- coding: cp1252 -*-
from custom_params import *

try:
    
    from neuron import h
    h.celsius = 35
    
except:
    pass

# load the custom parameters
try:
  module = __import__(filename)
  globals().update(vars(module))
except:
  print 'error during params import'

from copy import copy
from math import pi

use_fi_stdp = False # FastInhibSTDP vs FastInhib
m2g_multiple = False # multiple connections within glomerulus

#plasticity
fi_tau1 = 1.0
fi_tau2 = 100.0


# specific grow parameters

GROW_MAX_ITERATIONS = 2000
GROW_MAX_ATTEMPTS = 100

##### ATTENTION: parameters may change in the future

## apical params
APIC_DIAM = 5. # modified from Francesco's value
APIC_LEN_MAX = 550.

## tuft params
TUFT_DIAM = .8 # modified from Francesco's value
N_MIN_TUFT = 4 
N_MAX_TUFT = 6
TUFT_MIN_LEN = 40
TUFT_MAX_LEN = 80

# dendrites paramaters
N_MIN_DEND = 4
N_MAX_DEND = 6
DEND_DIAM = 2

# dendrites definition
N_MIN_DEND = 4
N_MAX_DEND = 9
N_MEAN_DEND = 5

# dendrites max length, normal distribution
DEND_LEN_MU = 837.97
DEND_LEN_VAR = 283.04 ** 2
DEND_LEN_MIN = 50.
DEND_LEN_MAX = 1800.

# dendrites bifurcation parameters, exponential distribution
BIFURC_LEN_MU_1 = 85.32
BIFURC_LEN_MIN_1 = 2.95
BIFURC_LEN_MAX_1 = 325.
BIFURC_LEN_MU_2 = 226.61
BIFURC_LEN_MIN_2 = .5
BIFURC_LEN_MAX_2 = 825.
BIFURC_PROB = [ 0.75, 0.63, 0.42, 0.28, 0.06 ]

# neg. exp
BIFURC_PHI_MU = .5

def gen_dend_diam(dist): return 0.9 + 2.6 * exp(-0.0013 * dist) #value's estimated with a fitting

#class DiamDend:
    # cambiare con cautela!
  #  __DIAM_MIN = 0.2
  #  __DIAM_MAX = 3.

    # NOISE
 #   __ALPHA_NOISE = 0.3 # peso del noise
    
 #   @staticmethod
 #   def __f_diam(dist): return 0.9 + 2.6 * exp(-0.0013 * dist)

 #   @staticmethod
 #   def __ns_diam(dist): return 0.6 + 1.5 * exp(-0.003 * dist)

 #   @staticmethod
 #   def genFirstDiam(r): return DiamDend.genDiam(0, r)

 #   @staticmethod
 #   def genDiam(dist, r):
 #       d = DiamDend.__f_diam(dist) + r.normal(0, DiamDend.__ns_diam(dist) ** 2) * DiamDend.__ALPHA_NOISE
 #       while d < DiamDend.__DIAM_MIN or d > DiamDend.__DIAM_MAX:
 #           d = DiamDend.__f_diam(dist) + r.normal(0, DiamDend.__ns_diam(dist)) * DiamDend.__ALPHA_NOISE
 #       return d

## random walk, noise
WALK_RHO = 20.
BIFURC_PHI_MIN = pi / 24.
BIFURC_PHI_MAX = pi / 5.
NS_PHI_B = 0.16
NS_PHI_MIN = -6.26
NS_PHI_MAX = 6.26
NS_THETA_B = 0.1407
NS_THETA_MIN = -1.56
NS_THETA_MAX = 1.18

GROW_RESISTANCE = 1.5


Ngloms = 127 # glomerolous
Nmitral_per_glom = 5 # mitral per glomerolous
Nmitral = Ngloms * Nmitral_per_glom


# Random123 secondary stream identifiers
# note: the primary stream index is the "gid" which is ordered as
# Nmitral, Ngranule, synapses
# Not all secondary identifiers are used for all types
stream_last=1
stream_soma = stream_last; stream_last += 1
stream_dend = stream_last; stream_last += 1
stream_apic = stream_last; stream_last += 1
stream_tuft = stream_last; stream_last += 1
stream_glom = stream_last; stream_last += 1
stream_granule_pos = stream_last; stream_last += 1
stream_mitraldendconnect = stream_last; stream_last += 1000 #allows per dendrite stream
stream_m2g = stream_last; stream_last += 1
stream_dummysyn = stream_last; stream_last +=  Nmitral #needs to be greater than max_dummies in dymmysyns which is currently 75.
stream_dummygen = stream_last; stream_last += Nmitral 

# for the odorstim
stream_last += stream_ods_shift
stream_ods_w = stream_last; stream_last += N_MAX_TUFT
stream_ods_act = stream_last; stream_last += 1
stream_ods_bg = stream_last; stream_last += 1

def ranstream(id1, id2):
    #print 'ranstream ', id1, id2
    r = h.Random()
    r.Random123(id1, id2)
    return r


# glomerulus radius
GLOM_RADIUS = 50.
GLOM_DIST = 100.

# glom_axis, define axis size for glomerulus
bulbCenter = [ 50., 1275., 0. ]
bulbAxis = [ 2100., 2800., 2100.]
glomAxis = copy(bulbAxis)
somaAxis = [ copy(bulbAxis), copy(bulbAxis) ]

for i in range(3):
    somaAxis[0][i] -= 600 + 100
    somaAxis[1][i] -= 600
    glomAxis[i] += 300

granule_max_depth = 400.
granAxisInf = [ somaAxis[0][0] - 2 * granule_max_depth,
             somaAxis[0][1] - 2 * granule_max_depth,
             somaAxis[0][2] - 2 * granule_max_depth ]

from Glom import *
loadGloms() # put glomerulus coords in glomRealCoords

# soma max x and max y
SOMA_MAX_X = 1000
SOMA_MAX_Y = 2000





granule_field_radius = 50. #microns

gid_mitral_begin = 0
gid_granule_begin = gid_mitral_begin + Nmitral

granule_diam = 10. 

granule_priden2_len = 250.


Nx_granule = int(somaAxis[0][0] / grid_dim) + 1
Ny_granule = int(somaAxis[0][1] / grid_dim) + 1
Nz_granule = int(somaAxis[0][2] / grid_dim) + 1
granule_origin = [ int(bulbCenter[0] - somaAxis[0][0] * .5),
                   int(bulbCenter[1] - somaAxis[0][1] * .5),
                   int(bulbCenter[2] - somaAxis[0][2] * .5) ]

mg_on_granule_std = 25.

Loading data, please wait...