OpenWorm项目
Oenworm
文章目录
- Oenworm
- 前言
- 1、 C.elegans简介
- 2、 神经元模型
- (1)神经元分类
- (2)神经元模型
- 3、突触模型
- 4、向前爬行的神经回路
- 一、下载安装
- 二、运行
- 三、 项目的架构
- C302
- Sibernetic
前言
1、 C.elegans简介
秀丽隐杆线虫有两种性别;雌雄同体和雄性。自体受精的成年雌雄同体恰好有 959 个体细胞。成年雌雄同体的相对简单的神经系统仅由 302 个神经元和大约 7000 个突触组成。具有 1031 个体细胞的雄性蠕虫在解剖学和行为上存在一些差异,而主要差异在于它们表达交配行为。
我们只关注成年雌雄同体的秀丽隐杆线虫,成年雌雄同体线虫秀丽隐杆线虫 (C. elegans) 的神经系统仅包含 302 个神经元。虽然这种蠕虫的神经系统非常小,但与人类等其他生物体(约有 860 亿个神经元)相比,它表现出惊人的多样化行为。
线虫秀丽隐杆线虫 (C. elegans) 有 95 块体壁肌肉,分为四个纵向束,一个象限有 23 个肌肉细胞,其他象限有 24 个。我们只对体壁肌肉(body wall muscles)感兴趣,因为这些肌肉的活动与运动行为相关。
2、 神经元模型
(1)神经元分类
有 3 种神经元:感觉神经元、中间神经元和运动神经元。
• 感觉神经元从与感觉神经元相连的感觉受体接收信号,并将信息传递给神经系统中的其他神经元。这些受体几乎无处不在,例如,在嘴里、鼻子里、耳朵里、眼睛里、皮肤里或体内。
• 中间神经元从感觉神经元或其他中间神经元接收信息,并将信息传递给其他中间神经元或运动神经元。在线虫相关的文献中,连接到运动神经元的中间神经元通常称为命令神经元。
• 运动神经元从其他神经元接收信息并将信号发送到相连的肌肉。当肌肉细胞接收到来自神经元的兴奋性/抑制性信号时,它会导致肌肉收缩/放松
(2)神经元模型
Integrate-and-Fire Model
Leaky-Integrate-and-Fire Model
Hodgkin-Huxley Model
Izhikevich Model
Intracellular Calcium Concentration Model
3、突触模型
两种不同类型的突触,化学突触(Chemical synapses)和电突触(Electrical synapses /Gap junctions)。
突触前神经元(源神经元)和突触后神经元(目标神经元)之间的连接称为突触,而神经元与肌肉的交流发生在所谓的神经肌肉结(NMJ)。大多数突触(和 NMJ)是化学突触,其中信息通过称为神经递质的化学信使传递。另一方面,电突触(或间隙连接)不需要这些化学物质。突触前细胞和突触后细胞直接相连,使分子和离子可以直接从一个细胞流向另一个细胞.
4、向前爬行的神经回路
新的前向爬行神经回路包括以下细胞:左右一对中间神经元 AVB(AVBL、AVBR)、18 个兴奋性 B 型运动神经元,包括 7 个背侧(DB1- DB7) 和 11 个腹侧 (VB1-VB11),19 个抑制性 D 型运动神经元由 6 个背侧 (DD1-DD6) 和 13 个腹侧 (VD1-VD13) 以及 95 个体壁肌细胞组成。
为了产生肌肉细胞的交替背腹活动,在构建神经网络时使用了以下简化假设:
- 突触共享相同的权重
- AVB 神经元主要通过间隙连接突触到 DB 和 VB 运动神经元群。B 型/D 型神经元向肌肉细胞发送兴奋性/抑制性化学信号,导致肌肉收缩/放松
- AVB 神经元在向前爬行运动期间活跃
上图由 AVB 中间神经元、B 型和 D 型运动神经元以及用于产生向前爬行活动的肌肉细胞组成的神经回路的符号表示。黑线表示间隙连接,黑色箭头表示兴奋性化学突触,红色连接表示抑制性突触。
C. elegans 的神经子回路包括 AVB 命令神经元对和 DB 运动神经元。绿线代表间隙连接,蓝色箭头代表化学突触。标签以 x/y 的形式表示连接神经元的突触数量,例如’0/15’ 表示,在秀丽隐杆线虫的神经系统中,从 AVBL 到 DB1 没有缝隙连接,但从 AVBR 到 DB1 有 15 个突触。
C. elegans 的神经子回路包括 DB 运动神经元(圆圈)和背侧体壁肌肉(矩形)。绿线代表间隙连接,蓝色箭头代表化学突触。标签表示连接细胞的突触数量。
一、下载安装
git clone https://github.com/openworm/OpenWorm.git
cd openworm
./build.sh
由于该项目使用docker构建的,./build.sh 会调用Dockerfile制作镜像文件
下载sibernetic可能会出现下载不了的情况,多试几次就好了
二、运行
1
./run.sh
./run.sh会构建docker容器
容器的名字是openworm_$version
-v 选项可以共享文件夹,主机为output文件夹,容器为/home/ow/shared文件夹。master_openworm.py会把处理后的结果copy到output文件夹中
2
./run-shell-only.sh
./run-shell-only.sh 运行这个脚本会进入容器的shell bash命令行界面,你可以进入容器内部查看文件
然后运行
bash -c "DISPLAY=:44 python master_openworm.py"
通向可以启动程序
3 建议的方式
./run.sh
启动容器后,用vscode的插件,这样调试起来非常方便,赞一个!
运行结果如下
三、 项目的架构
master_openworm.py 中用于执行模拟的命令如下:
- 使用 master_openworm.py 中定义的参数运行 Sibernetic 模拟 这将执行 Sibernetic,c302 在后台运行。
- 将生成的绘图移动到可从 docker 容器外部访问的目录。
- 重新运行最新的 Sibernetic 模拟,同时在虚拟屏幕上显示行为蠕虫的图形输出。
- 通过记录虚拟屏幕的输出来创建模拟视频。
- 去除视频开头的黑框。
- 创建视频的加速版本。
C302
execute_with_realtime_output(python sibernetic_c302.py){//在master.openworm.pymain(){ //在sibernetic_c302.pyrun(){setup(){ //在c302_FW.pyc302.generte{ //在 c302 __init__.py//调用了neuronml,代码和官网的案例类似了,定义了nml_doc, //生成了.nml文件 LEMS_*.xml文件 }pynml.run_lems_with_jneuroml_neuron(){//在sibernetic_c302.py//调用jNeuronmML,neuron;输入 LEMS_*.xml文件;生成.mod .hoc LEMS_c302_nrn.py文件 }pynml.execute_command_in_dir_with_realtime_output(nrnivmodl simulation/C2_FW_2023-05-24_04-33-53) {//nrnivmodl -coreneuron <directory containing .mod files>//调用nrnivmodl命令;将.mod文件转化为.c文件//生成的sibernetic输入文件是什么?LEMS_c302_nrn.py}//调用sibernetic的C++代码,sibernetic的调用关系写在下面了pynml.execute_command_in_dir_with_realtime_output(./Release/Sibernetic ***){//./Release/Sibernetic -c302 -f worm_crawl_half_resolution -no_g -l_to lpath=simulations/C2_FW_2023-05-24_04-33-53 timelimit=0.015 timestep=5e-06 logstep=100 device=CPU//调用sibernetic,生成输出文件是什么? //输出//connection_buffer.txt//worm_motion_log.txt //muscles_activity_buffer.txt//membranes_buffer.txt//position_buffer.txt//pressure_buffer.txtowConfigProperty(){//在owConfigProperty.cppSignalSimulator("main_sim", C302NRNSimulation, this->timeStep); //在main_sim.py,调用类C302NRNSimulationset_timestep(){//在main_sim.py C302NRNSimulation类里面LEMS_c302_nrn.NeuronSimulation//在LEMS_c302_nrn.py}}>> # Starting simulation in NEURON of 100ms generated from NeuroML2 model...Python muscle signal generator class: C302NRNSimulation loaded! Processing 438 input lists>> # Finished processing 438 input lists>> # Setting up the network to simulate took 0.244064 seconds>> # Python >> Initialised C302NRNSimulation of length 100 ms and dt = 0.005 ms...>> # Python >> > Current NEURON time: 0.0 ms>> # Python >> < Current NEURON time: 0.005 ms Simulation has reached the time limit>> # Saving results at t=14.999999999999158...>> # Saved data to: time.dat>> # Saved data to: c302_C2_FW.activity.dat>> # Saved data to: c302_C2_FW.muscles.dat>> # Saved data to: c302_C2_FW.muscles.activity.dat>> # Saved data to: c302_C2_FW.dat>> # Finished saving results in 0.173744 seconds }results = pynml.reload_saved_data(lems_file){}302_utils.plot_c302_results(results){//在302_utils.py输出://neurons_C2_FW.png//muscles_C2_FW.png//neuron_activity_C2_FW.png//muscle_activity_C2_FW.png }plot_muscle_activity(muscles_activity_buffer.txt){//在sibernetic_c302.py//Saving image to /home/ow/sibernetic/simulations/C2_FW_2023-05-10_12-31-45/traces_neuron_FW_C2.png }generate_wcon(worm_motion_log.txt){//在sibernetic_c302.py//输入worm_motion_log.txt,worm_motion_log.wcon;输出 worm_motion_1.png,worm_motion_2.png,worm_motion_3.png 到主机的output文件夹}}//end run}//end main
}//end execute_with_realtime_output//Sib_c302 >>> * Replay recorded simulation with: ./Release/Sibernetic -l_from lpath=simulations/C2_FW_2023-05-10_12-31-45
//再次调用Siberneic,输入是muscles_activity_buffer.txt
command = './Release/Sibernetic -f %s -l_from lpath=%s' % (DEFAULTS['configuration'], latest_subdir)
execute_with_realtime_output(command, os.environ['SIBERNETIC_HOME'], env=my_env)
Sibernetic
main(){run(argc, argv, graph){//owWorldSimulation.cpp1. //load_from_file==0owPhysicsFluidSimulator(helper, argc, argv);{//owPhysicsFluidSimulator.cpp//调用owPhysicsFluidSimulator的构造函数owPhysicsFluidSimulator::owPhysicsFluidSimulator(owHelper *helper, int argc,char **argv) {//owPhiysicsFluidSimulator.cpp1.1 config = new owConfigProperty(argc, argv){//owWorldSimulation.cpp//调用owConfigProperty的构造函数owConfigProperty::owConfigProperty(int argc, char **argv){//owConfigPrperty.cpp//加载./configuration的配置文件;path = "./configuration/",configFileName = "worm_crawl_half_resolution"owHelper::preLoadConfiguration(this);{//owConfigProperty::ow 构造函数一定会调用; 在owHelper.cpp}//如果是c302,调用main_sim.py的"C302NRNSimulation"simulation = new SignalSimulator("main_sim", "C302NRNSimulation", this->timeStep); //owConfigProperty.cpp //调用SignalSimulator的构造函数SignalSimulator::SignalSimulator(const std::string &simFileName,const std::string &simClassName, float timeStep){//owSignalSimulator.cppPyObject *dt = Py_BuildValue("f", timeStep); // Create tuple of arguments for initializationPyObject *pFuncName = Py_BuildValue("s", "set_timestep");//调用main_sim.py文件;C302RNRSimulation类; set_timeste()函数PyObject_CallMethodObjArgs(pInstance, pFuncName, dt, nullptr){from LEMS_c302_nrn import NeuronSimulation //这里为了能跑通,复制一个LEMS_c302_nrn.py到main_sim.py的同级目录import neuron self.ns = NeuronSimulation(self.tstop, dt)//main_sim.py//调用LEMS_c302_nrn.py的NeuronSimulation类的_init_ 创建了网络NeuronSimulation.__init__(){//LEMS_c302_nrn.py//建立网络h = neuron.hPython >> Initialised C302NRNSimulation of length 100 ms and dt =cetylcholine, from VB2 to MVR09 with synapse }print_("Initialised C302NRNSimulation of length %s ms and dt = %s ms..."%(self.tstop,dt)) //main_sim.py } }}}//加载./configuration的配置文件;path = "./configuration/",configFileName = "worm_crawl_half_resolution"1.2 owHelper::loadConfiguration(position_cpp, velocity_cpp, elasticConnectionsData_cpp,membraneData_cpp, particleMembranesList_cpp,config)//在owHelper.cpp1.3.new owOpenCLSolver } }2.//load_from_file==1 -l_fromlocalConfig = new owConfigProperty(argc, argv){//owWorldSimulation.cpp//调用owConfigProperty的构造函数owConfigProperty::owConfigProperty(int argc, char **argv){//owConfigPrperty.cpp//加载./configuration的配置文件;path = "./configuration/",configFileName = "worm_crawl_half_resolution"owHelper::preLoadConfiguration(this);{//owConfigProperty::ow 构造函数一定会调用; 在owHelper.cpp}//如果是c302,调用main_sim.py的"C302NRNSimulation"simulation = new SignalSimulator("main_sim", "C302NRNSimulation", this->timeStep); //owConfigProperty.cpp }}//end owConfigProperty }//end run 3.glutDisplayFunc(display){//owWorldSimulation.cpp//load_from_file == 0display(){//owWorldSimulation.cpp3.1//load_from_file == 0calculationTime = fluid_simulation->simulationStep(load_to){owPhysicsFluidSimulator::simulationStep(const bool load_to) {>> # [[ Step 6 (total steps: 3000, t in sim: 3e-05s) dt: 5e-06 (in s), time elapsed: 0.03 (in min), time left: 16.63 (in min) ]]//如果load_to ==1 写入,position_buffer.txt ; pressure_buffer.txtif (load_to) { owHelper::loadConfigurationToFile(position_cpp, config, elasticConnectionsData_cpp, membraneData_cpp, true){positionFile << position[i * 4 + 0] << "\t" << position[i * 4 + 1] << "\t"}//position_buffer.txtowHelper::loadPressureToFile(pressure_cpp, shellIndexes, position_cpp, iterationCount, config){pressureFile << "[Iteration " << iteration << "]\n";}///pressure_buffer.txt}if (owVtkExport::isActive) {wVtkExport::exportState(iterationCount, config, position_cpp, elasticConnectionsData_cpp, velocity_cpp, membraneData_cpp, muscle_activation_signal_cpp);}config->updateNeuronSimulation(muscle_activation_signal_cpp){// owPhysicsFluidSimulator.cpp//simution 是 owINeuronSimulator *if (isWormConfig() || nrnSimRun) { //owConfigProperty.hvector<float> muscle_vector = simulation->run();std::vector<float> SignalSimulator::run() {//main_sim.py C302NRNSimulationpValue = PyObject_CallMethod(pInstance, const_cast<char *>("run"), nullptr); ///owSignalSimulator.cpp//调用C302NRNSimulation.run()run(){h.run()self.save_results() {//保存数据print("Saved data to: time.dat")print("Saved data to: c302_A_Muscles.dat")print("Saved data to: c302_A_Muscles.muscles.dat") } }} }update_muscle_activity_signals_log_file(iterationCount, muscle_activation_signal_cpp, config);{// owPhysicsFluidSimulator.cppmusclesActivityFile << muscle_activation_signal_cpp[i] << "\n"; } //muscles_activity_buffer.txtupdate_worm_motion_log_file(iterationCount, elasticConnectionsData_cpp, position_cpp, config);{// owPhysicsFluidSimulator.cppwormMotionLogFile << (float)iterationCount * config->getTimeStep() << "\tX:\t";} //worm_motion_log.txtocl_solver->updateMuscleActivityData(muscle_activation_signal_cpp, config); } }3.2 //load_from_file == 1owHelper::loadConfigurationFromFile(p_cpp, ec_cpp, md_cpp, localConfig, iteration){//oworldSimulation.cpppositionFileName = config->getLoadPath() + std::string("/position_buffer.txt");positionFile >> config->xmin;positionFile >> config->xmax;positionFile >> valueI; connectionFileName = config->getLoadPath() + std::string("/connection_buffer.txt"); connectionFile >> jd >> rij0 >> val1 >> val2; membraneFileName = config->getLoadPath() + std::string("/membranes_buffer.txt"); membranesFile >> m_cou }//end loadConfigurationFromFileread_muscles_activity_signals_from_log_file(iteration, muscle_activation_signal_cpp, localConfig){//owWorldSimulation.cppmusclesActivityFileName = config->getLoadPath() + std::string("/muscles_activity_buffer.txt"); musclesActivityFile >> muscle_activation_signal_cpp[i]; }//end read_muscles_activity_signals_from_log_file} //end display() }//end glutDisplayFunc()
}//end run
}
OpenWorm项目相关推荐
- 年度最理性 AI 分析文章:预测 AI 未来,大部分人陷入了 7 大误区
来源:36氪 概要:错误的预测会导致大家对不会发生的事情感到恐惧.为什么在人工智能和机器人的预测上总有人不断犯错呢? 想着预测未来,却一不小心就陷入了yy. 近年来图像识别突破.Waymo无人车上路. ...
- 七宗罪:我们是如何错误预估人工智能的
荒谬的预估往往会导致对未来的恐惧.而为什么有人会对AI和机器人的技术前景如此恐慌?下文中,这七种错误往往导致AI和机器人前景的荒谬预测. 很多人对人工智能和机器人行业的快速发展感到十分焦虑,一部分人担 ...
- 模拟人脑:迄今最大规模4个实验,人工智能的救赎之路?(附PDF公号发“模拟人脑”下载)
模拟人脑:迄今最大规模4个实验,人工智能的救赎之路?(附PDF公号发"模拟人脑"下载) 许铁 科学Sciences 今天 科学Sciences导读:公众最早了解模拟大脑的事件是:1 ...
- GitHub 上有哪些机器人、无人机、自动控制等方面的有趣项目
/*************************************************************************************************** ...
- 在k8s中使用gradle构建java web项目镜像Dockerfile
在k8s中使用gradle构建java web项目镜像Dockerfile FROM gradle:6-jdk8 AS build COPY --chown=gradle:gradle . /home ...
- Dockerfile springboot项目拿走即用,将yml配置文件从外部挂入容器
Dockerfile 将springboot项目jar包打成镜像,并将yml配置文件外挂. # 以一个镜像为基础,在其上进行定制.就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜 ...
- SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos
SpringBoot项目使用nacos kotlin demo见Gitte 一.引入依赖 提示:这里推荐使用2.2.3版本,springboot与nacos的依赖需要版本相同,否则会报错. maven ...
- Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库
示例见:Gitte 公仓设置 在项目中添加maven-publish的插件 plugins {kotlin("jvm") version "1.3.72"kot ...
- springboot项目使用junit4进行单元测试,maven项目使用junit4进行单元测试
首先,maven项目中引入依赖 <dependency><groupId>junit</groupId><artifactId>junit</ar ...
最新文章
- javascript设计模式--单例模式
- LINQ to SQL语句(4)之Join
- 多款eclipse黑色坏境任你选择,只要导入配置
- jfinal出现sql injection violation, multi-statement not allow : select count(*) select a.name,
- mysql50道题 查询和,Mysql Sql 语句练习题 (50道)
- CODEVS 3269 混合背包
- 反卷积可视化工具--deconv-deep-vis-toolbox
- UVN相机模型矩阵推导
- 论现场跟客户演示软件产品
- markdown中让表格居中的写法
- 《数据结构与算法》(十八)- 平衡二叉树
- unity3d 嵌入 移动MM SDK 闪退的问题
- lua时间戳和日期转换
- 金明的预算方案(01背包)
- 论文阅读笔记:A Two-Step Approach for Event Factuality Identification
- c语言通讯录的遇到的问题,通讯录有问题求解(cpp)
- java url 设置超时_URLConnection的连接、超时、关闭用法总结
- IOS端云豹直播系统等产品的打包上架流程
- java用list集合实现对数据的增加,删除,插入操作
- 小白在“风变编程”上的Python入门之旅
热门文章
- php phonegap,phonegap操作数据库详解
- 我的PhoneGap安装配置经历
- 知道创宇发布重磅战略方案,构建持续交火的实战化防御体系
- 一款将word转换为exe,并且限制访问的软件DRMsoft word to EXE
- 用threading+turtle画哆啦A梦,同时播放背景音乐
- 16位增强色RGB转换为24/32位真色彩
- 【放置江湖】LUA手游 基于HOOK 解密修改流程
- 2016 Multi-University Training Contest 2 部分题解
- 软工之404 Note Found 队选题报告
- python爬淘宝店铺_【Python爬虫案例学习】Python爬取淘宝店铺和评论