Première simulation de cellule nerveuse avec NEURON + Python

Aperçu

[Modèle Hodgkin-Huxley](https: //) utilisant NEURON, un simulateur de cellules nerveuses / circuits neuronaux à usage général développé par Michael Hines et al. De l'Université de Hyeres. En.wikipedia.org/wiki/Hodgkin%E2%80%93Huxley_model) est utilisé pour simuler les cellules nerveuses.

Bien que ce soit un peu difficile à comprendre, il est utilisé comme simulateur standard pour les modèles multi-compartiments de cellules nerveuses, et il peut également être utilisé pour des simulations à grande échelle à l'aide de MPI, donc je pense que ce sera un outil très puissant si vous pouvez le maîtriser.

(En aparté, l'image sur la couverture du livre AGE OF SUPER SENSING The Future of Sensing Design est de NEURON. Il est visualisé sur la base de la simulation du circuit neuronal.)

environnement de test

Si le notebook NEURON + Jupyter fonctionne, je pense qu'il fonctionnera dans d'autres environnements tels que CentOS, Mac et Windows.

installer

Construire un environnement NEURON pour Python est un peu fastidieux, j'ai donc créé une image Docker.

Installer Docker

Veuillez vous référer à http://docs.docker.jp/engine/installation/ etc. S'il s'agit d'une version plus ancienne, vous pouvez également l'installer avec la commande suivante.

$ sudo apt-get install docker.io
$ sudo yum install docker-io

Exécuter l'image Docker

Lorsque vous exécutez la commande suivante, le notebook Jupyter avec la configuration NEURON démarre, accédez à l'URL affichée (http: // localhost: 8888 /? Token = 91d2 dans l'exemple ci-dessous).

$ docker run -p 8888:8888 dmiyamoto/neuron:jupyter
/usr/local/lib/python2.7/dist-packages/IPython/paths.py:69: UserWarning: IPython parent '/home/neuron' is not a writable location, using a temp directory.
  " using a temp directory.".format(parent))
[I 15:21:30.297 NotebookApp] Writing notebook server cookie secret to /home/neuron/.local/share/jupyter/runtime/notebook_cookie_secret
[W 15:21:30.307 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 15:21:30.311 NotebookApp] Serving notebooks from local directory: /work
[I 15:21:30.311 NotebookApp] 0 active kernels 
[I 15:21:30.311 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:8888/?token=91d2
[I 15:21:30.311 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 15:21:30.311 NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=91d2

Si vous n'utilisez pas le notebook Jupyter, vous pouvez l'utiliser comme interpréteur python avec la commande suivante.

$ docker run -it neuron:jupyter python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Code à utiliser

L'exemple de code utilisé cette fois est le suivant.

De plus, puisque le même code est inclus dans les «exemples» sur l'écran des fichiers de Jupyter Notebook, utilisez ceci.

calc_hh()

Sauf pour la fonction calc_hh (), vous pouvez la comprendre si vous avez une connaissance générale de Python et Matplotlib, donc je n'expliquerai que le contenu de calc_hh ().

Définition des cellules

soma = neuron.h.Section(name="soma")

soma.nseg = 1
soma.diam = 10   # [um]
soma.L = 10      # [um]
soma.insert("hh")

Dans NEURON Python, une fonction portant le même nom que HOC est définie sous la classe h. (Explication pour ceux qui comprennent) Ici, d'abord, la fonction Section est utilisée pour définir la cellule nouvellement calculée soma. Après cela, les paramètres de l'objet soma sont définis. L'explication de chaque paramètre est la suivante.

--nseg: nombre de divisions lors du calcul du potentiel cellulaire. Lors du ciblage de cellules allongées, il est nécessaire d'augmenter le nombre de divisions car les potentiels au point central et aux extrémités sont différents. --diam: diamètre de la cellule --L: longueur de cellule --ʻInsert ('hh') `: Hodgkin-Définit un modèle de type Huxley (hh). D'autres incluent «pas», qui suppose uniquement un courant de fuite. Vous pouvez également créer votre propre modèle.

De plus, les types de paramètres existants et les valeurs peuvent être affichés avec la fonction psection. (Cela devrait l'être, mais comme la fonction d'impression à l'intérieur de NEURON ne semble pas bien être affichée sur Jupyter, un exemple d'exécution dans l'interpréteur est montré.) Elle peut être nouvellement définie par ʻinsert le modèle'hh'`. Vous pouvez également observer où les paramètres augmentent.

>>> soma = neuron.h.Section(name='soma')
>>> neuron.h.psection()
soma { nseg=1  L=100  Ra=35.4
	/*location 0 attached to cell 0*/
	/* First segment only */
	insert morphology { diam=500}
	insert capacitance { cm=1}
}
1.0
>>> soma.insert('hh')
<nrn.Section object at 0x7fe655562648>
>>> neuron.h.psection()
soma { nseg=1  L=100  Ra=35.4
	/*location 0 attached to cell 0*/
	/* First segment only */
	insert morphology { diam=500}
	insert capacitance { cm=1}
	insert hh { gnabar_hh=0.12 gkbar_hh=0.036 gl_hh=0.0003 el_hh=-54.3}
	insert na_ion { ena=50}
	insert k_ion { ek=-77}
}
1.0

Paramètres de stimulation

stim = neuron.h.IClamp(soma(0.5))
stim.delay = 50  # [ms]
stim.dur = 200   # [ms]
stim.amp = 0.1   # [nA]

Même si des cellules sont définies et un modèle de type Hodgkin-Huxley est introduit, s'il n'y a pas de stimulation, le potentiel constant ne change pas, donc une stimulation à courant constant est définie. Dans NEURON, un stimulus à courant constant peut être ajouté par la fonction «IClamp». L'explication des paramètres est la suivante.

--deley: Il est temps de démarrer la stimulation -- dur: durée du stimulus --ʻAmp`: Intensité de la stimulation

Réglage de la méthode de mesure

rec_t = neuron.h.Vector()
rec_t.record(neuron.h._ref_t)
rec_v = neuron.h.Vector()
rec_v.record(soma(0.5)._ref_v)

Allouez un tableau dans NEUORON avec la fonction Vector et définissez la valeur à enregistrer avec la fonction enregistrement. Par conséquent, la valeur définie pour chaque étape de calcul est ajoutée au tableau.

Définition et exécution des conditions de simulation

neuron.h.finitialize(-65)
tstop = 300
neuron.run(tstop)

La fonction finitialize initialise le potentiel de la cellule à -65 [mV]. Utilisez également la fonction run pour démarrer réellement la simulation. L'argument est l'heure de fin de la simulation (300 ms dans ce cas).

Post-traitement

t = rec_t.as_numpy()
v = rec_v.as_numpy()
return np.array(t), np.array(v)

La valeur enregistrée est convertie du format interne de NEURON en ndarray par la fonction ʻas_numpy. De plus, (probablement) un bogue du côté NEURON peut provoquer la libération de l'objet sans autorisation, utilisez donc np.array` pour copier la valeur et l'utiliser comme valeur de retour.

Si vous tracez cette valeur avec matplotlib, vous pouvez obtenir les pics de type Hodgkin-Huxley suivants.

download.png

en conclusion

L'intelligence artificielle est en plein essor dans le monde, mais pour ceux qui souhaitent simuler des cerveaux et des circuits neuronaux réels plutôt que des modèles extrêmement abstraits comme le Deep Learning, ce texte divers aide. J'espère que ce sera le cas.

référence

modifier l'historique

Recommended Posts

Première simulation de cellule nerveuse avec NEURON + Python
Web scraping avec Python Première étape
[GUI avec Python] PyQt5-La première étape-
Essayez la simulation de contrôle de fréquence avec Python
FizzBuzz en Python3
Premier Python
Grattage avec Python
Premier Python 3 ~ Première comparaison ~
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
Premier Python
simulation ambisonique Python
[Python / PyRoom Acoustics] Simulation acoustique de pièce avec Python
avec syntaxe (Python)
Premier Python ~ Codage 2 ~
Bingo avec python
Zundokokiyoshi avec python
Premier python [O'REILLY]
"Première recherche élastique" commençant par un client python
Excel avec Python
Micro-ordinateur avec Python
J'ai fait un simulateur de neurones avec Python
Cast avec python
Premier python ① Construction de l'environnement avec pythonbrew & Hello World !!
[Introduction à l'application Udemy Python3 +] 9. Tout d'abord, imprimez avec print
[Cloud102] # 1 Premiers pas avec Python (première partie des premiers pas de Python)
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Première 3e édition de Python
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
PyQ ~ Première étape de Python ~
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Grattage avec Python + PhantomJS
Premier traitement d'image Python
Conduisez WebDriver avec python
[Python] Redirection avec CGIHTTPServer