wormsim 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wormsim/__init__.py +0 -0
- wormsim/abstract_circuit.py +172 -0
- wormsim/circuit.pkl +0 -0
- wormsim/components/__init__.py +0 -0
- wormsim/components/mechanism/__init__.py +0 -0
- wormsim/components/mechanism/modfile/__init__.py +0 -0
- wormsim/components/mechanism/modfile/cainternm.mod +75 -0
- wormsim/components/mechanism/modfile/cca1.mod +87 -0
- wormsim/components/mechanism/modfile/egl19.mod +100 -0
- wormsim/components/mechanism/modfile/egl2.mod +76 -0
- wormsim/components/mechanism/modfile/egl36.mod +92 -0
- wormsim/components/mechanism/modfile/exc_syn_advance.mod +91 -0
- wormsim/components/mechanism/modfile/gapjunction.mod +41 -0
- wormsim/components/mechanism/modfile/gapjunction_advance.mod +40 -0
- wormsim/components/mechanism/modfile/inh_syn_advance.mod +91 -0
- wormsim/components/mechanism/modfile/irk.mod +76 -0
- wormsim/components/mechanism/modfile/kcnl.mod +76 -0
- wormsim/components/mechanism/modfile/kqt3.mod +110 -0
- wormsim/components/mechanism/modfile/kvs1.mod +87 -0
- wormsim/components/mechanism/modfile/nca.mod +41 -0
- wormsim/components/mechanism/modfile/neuron_to_neuron_exc_syn.mod +92 -0
- wormsim/components/mechanism/modfile/neuron_to_neuron_inh_syn.mod +92 -0
- wormsim/components/mechanism/modfile/shk1.mod +86 -0
- wormsim/components/mechanism/modfile/shl1.mod +101 -0
- wormsim/components/mechanism/modfile/slo1_egl19.mod +148 -0
- wormsim/components/mechanism/modfile/slo1_unc2.mod +139 -0
- wormsim/components/mechanism/modfile/slo2_egl19.mod +148 -0
- wormsim/components/mechanism/modfile/slo2_unc2.mod +138 -0
- wormsim/components/mechanism/modfile/unc2.mod +90 -0
- wormsim/components/mechanism/x86_64/__init__.py +0 -0
- wormsim/components/mechanism/x86_64/cainternm.c +594 -0
- wormsim/components/mechanism/x86_64/cainternm.o +0 -0
- wormsim/components/mechanism/x86_64/cca1.c +621 -0
- wormsim/components/mechanism/x86_64/cca1.o +0 -0
- wormsim/components/mechanism/x86_64/egl19.c +681 -0
- wormsim/components/mechanism/x86_64/egl19.o +0 -0
- wormsim/components/mechanism/x86_64/egl2.c +569 -0
- wormsim/components/mechanism/x86_64/egl2.o +0 -0
- wormsim/components/mechanism/x86_64/egl36.c +615 -0
- wormsim/components/mechanism/x86_64/egl36.o +0 -0
- wormsim/components/mechanism/x86_64/exc_syn_advance.c +587 -0
- wormsim/components/mechanism/x86_64/exc_syn_advance.o +0 -0
- wormsim/components/mechanism/x86_64/gapjunction.c +364 -0
- wormsim/components/mechanism/x86_64/gapjunction.o +0 -0
- wormsim/components/mechanism/x86_64/gapjunction_advance.c +378 -0
- wormsim/components/mechanism/x86_64/gapjunction_advance.o +0 -0
- wormsim/components/mechanism/x86_64/inh_syn_advance.c +587 -0
- wormsim/components/mechanism/x86_64/inh_syn_advance.o +0 -0
- wormsim/components/mechanism/x86_64/irk.c +577 -0
- wormsim/components/mechanism/x86_64/irk.o +0 -0
- wormsim/components/mechanism/x86_64/kcnl.c +565 -0
- wormsim/components/mechanism/x86_64/kcnl.o +0 -0
- wormsim/components/mechanism/x86_64/kqt3.c +723 -0
- wormsim/components/mechanism/x86_64/kqt3.o +0 -0
- wormsim/components/mechanism/x86_64/kvs1.c +621 -0
- wormsim/components/mechanism/x86_64/kvs1.o +0 -0
- wormsim/components/mechanism/x86_64/makemod2c_inc +185 -0
- wormsim/components/mechanism/x86_64/mod_func.c +82 -0
- wormsim/components/mechanism/x86_64/mod_func.o +0 -0
- wormsim/components/mechanism/x86_64/nca.c +366 -0
- wormsim/components/mechanism/x86_64/nca.o +0 -0
- wormsim/components/mechanism/x86_64/neuron_to_neuron_exc_syn.c +572 -0
- wormsim/components/mechanism/x86_64/neuron_to_neuron_exc_syn.o +0 -0
- wormsim/components/mechanism/x86_64/neuron_to_neuron_inh_syn.c +572 -0
- wormsim/components/mechanism/x86_64/neuron_to_neuron_inh_syn.o +0 -0
- wormsim/components/mechanism/x86_64/shk1.c +616 -0
- wormsim/components/mechanism/x86_64/shk1.o +0 -0
- wormsim/components/mechanism/x86_64/shl1.c +676 -0
- wormsim/components/mechanism/x86_64/shl1.o +0 -0
- wormsim/components/mechanism/x86_64/slo1_egl19.c +820 -0
- wormsim/components/mechanism/x86_64/slo1_egl19.o +0 -0
- wormsim/components/mechanism/x86_64/slo1_unc2.c +777 -0
- wormsim/components/mechanism/x86_64/slo1_unc2.o +0 -0
- wormsim/components/mechanism/x86_64/slo2_egl19.c +820 -0
- wormsim/components/mechanism/x86_64/slo2_egl19.o +0 -0
- wormsim/components/mechanism/x86_64/slo2_unc2.c +775 -0
- wormsim/components/mechanism/x86_64/slo2_unc2.o +0 -0
- wormsim/components/mechanism/x86_64/special +17 -0
- wormsim/components/mechanism/x86_64/unc2.c +636 -0
- wormsim/components/mechanism/x86_64/unc2.o +0 -0
- wormsim/components/model/ADAL.hoc +135 -0
- wormsim/components/model/ADAR.hoc +135 -0
- wormsim/components/model/ADEL.hoc +183 -0
- wormsim/components/model/ADER.hoc +183 -0
- wormsim/components/model/ADFL.hoc +164 -0
- wormsim/components/model/ADFR.hoc +164 -0
- wormsim/components/model/ADLL.hoc +185 -0
- wormsim/components/model/ADLR.hoc +185 -0
- wormsim/components/model/AFDL.hoc +164 -0
- wormsim/components/model/AFDR.hoc +164 -0
- wormsim/components/model/AIAL.hoc +129 -0
- wormsim/components/model/AIAR.hoc +129 -0
- wormsim/components/model/AIBL.hoc +147 -0
- wormsim/components/model/AIBR.hoc +147 -0
- wormsim/components/model/AIML.hoc +130 -0
- wormsim/components/model/AIMR.hoc +130 -0
- wormsim/components/model/AINL.hoc +157 -0
- wormsim/components/model/AINR.hoc +157 -0
- wormsim/components/model/AIYL.hoc +129 -0
- wormsim/components/model/AIYR.hoc +129 -0
- wormsim/components/model/AIZL.hoc +137 -0
- wormsim/components/model/AIZR.hoc +137 -0
- wormsim/components/model/ALA.hoc +148 -0
- wormsim/components/model/ALML.hoc +203 -0
- wormsim/components/model/ALMR.hoc +203 -0
- wormsim/components/model/ALNL.hoc +175 -0
- wormsim/components/model/ALNR.hoc +175 -0
- wormsim/components/model/AQR.hoc +187 -0
- wormsim/components/model/AS01.hoc +151 -0
- wormsim/components/model/AS02.hoc +152 -0
- wormsim/components/model/AS03.hoc +151 -0
- wormsim/components/model/AS04.hoc +154 -0
- wormsim/components/model/AS05.hoc +155 -0
- wormsim/components/model/AS06.hoc +153 -0
- wormsim/components/model/AS07.hoc +156 -0
- wormsim/components/model/AS08.hoc +158 -0
- wormsim/components/model/AS09.hoc +154 -0
- wormsim/components/model/AS10.hoc +153 -0
- wormsim/components/model/AS11.hoc +154 -0
- wormsim/components/model/ASEL.hoc +173 -0
- wormsim/components/model/ASER.hoc +173 -0
- wormsim/components/model/ASGL.hoc +160 -0
- wormsim/components/model/ASGR.hoc +160 -0
- wormsim/components/model/ASHL.hoc +165 -0
- wormsim/components/model/ASHR.hoc +165 -0
- wormsim/components/model/ASIL.hoc +168 -0
- wormsim/components/model/ASIR.hoc +168 -0
- wormsim/components/model/ASJL.hoc +167 -0
- wormsim/components/model/ASJR.hoc +167 -0
- wormsim/components/model/ASKL.hoc +165 -0
- wormsim/components/model/ASKR.hoc +165 -0
- wormsim/components/model/AUAL.hoc +164 -0
- wormsim/components/model/AUAR.hoc +164 -0
- wormsim/components/model/AVAL.hoc +197 -0
- wormsim/components/model/AVAR.hoc +197 -0
- wormsim/components/model/AVBL.hoc +216 -0
- wormsim/components/model/AVBR.hoc +216 -0
- wormsim/components/model/AVDL.hoc +197 -0
- wormsim/components/model/AVDR.hoc +197 -0
- wormsim/components/model/AVEL.hoc +149 -0
- wormsim/components/model/AVER.hoc +149 -0
- wormsim/components/model/AVFL.hoc +195 -0
- wormsim/components/model/AVFR.hoc +196 -0
- wormsim/components/model/AVG.hoc +166 -0
- wormsim/components/model/AVHL.hoc +172 -0
- wormsim/components/model/AVHR.hoc +172 -0
- wormsim/components/model/AVJL.hoc +173 -0
- wormsim/components/model/AVJR.hoc +172 -0
- wormsim/components/model/AVKL.hoc +204 -0
- wormsim/components/model/AVKR.hoc +204 -0
- wormsim/components/model/AVL.hoc +180 -0
- wormsim/components/model/AVM.hoc +203 -0
- wormsim/components/model/AWAL.hoc +165 -0
- wormsim/components/model/AWAR.hoc +165 -0
- wormsim/components/model/AWBL.hoc +165 -0
- wormsim/components/model/AWBR.hoc +165 -0
- wormsim/components/model/AWCL.hoc +168 -0
- wormsim/components/model/AWCR.hoc +168 -0
- wormsim/components/model/BAGL.hoc +160 -0
- wormsim/components/model/BAGR.hoc +160 -0
- wormsim/components/model/BDUL.hoc +136 -0
- wormsim/components/model/BDUR.hoc +136 -0
- wormsim/components/model/CANL.hoc +165 -0
- wormsim/components/model/CANR.hoc +165 -0
- wormsim/components/model/CEPDL.hoc +182 -0
- wormsim/components/model/CEPDR.hoc +182 -0
- wormsim/components/model/CEPVL.hoc +179 -0
- wormsim/components/model/CEPVR.hoc +179 -0
- wormsim/components/model/DA01.hoc +177 -0
- wormsim/components/model/DA02.hoc +180 -0
- wormsim/components/model/DA03.hoc +160 -0
- wormsim/components/model/DA04.hoc +167 -0
- wormsim/components/model/DA05.hoc +176 -0
- wormsim/components/model/DA06.hoc +187 -0
- wormsim/components/model/DA07.hoc +175 -0
- wormsim/components/model/DA08.hoc +161 -0
- wormsim/components/model/DA09.hoc +161 -0
- wormsim/components/model/DB01.hoc +193 -0
- wormsim/components/model/DB02.hoc +184 -0
- wormsim/components/model/DB03.hoc +181 -0
- wormsim/components/model/DB04.hoc +190 -0
- wormsim/components/model/DB05.hoc +182 -0
- wormsim/components/model/DB06.hoc +166 -0
- wormsim/components/model/DB07.hoc +162 -0
- wormsim/components/model/DD01.hoc +180 -0
- wormsim/components/model/DD02.hoc +203 -0
- wormsim/components/model/DD03.hoc +211 -0
- wormsim/components/model/DD04.hoc +221 -0
- wormsim/components/model/DD05.hoc +208 -0
- wormsim/components/model/DD06.hoc +211 -0
- wormsim/components/model/DVA.hoc +178 -0
- wormsim/components/model/DVB.hoc +137 -0
- wormsim/components/model/DVC.hoc +178 -0
- wormsim/components/model/FLPL.hoc +261 -0
- wormsim/components/model/FLPR.hoc +261 -0
- wormsim/components/model/HSNL.hoc +161 -0
- wormsim/components/model/HSNR.hoc +161 -0
- wormsim/components/model/I1L.hoc +157 -0
- wormsim/components/model/I1R.hoc +157 -0
- wormsim/components/model/I2L.hoc +161 -0
- wormsim/components/model/I2R.hoc +161 -0
- wormsim/components/model/I3.hoc +165 -0
- wormsim/components/model/I4.hoc +171 -0
- wormsim/components/model/I5.hoc +363 -0
- wormsim/components/model/I6.hoc +176 -0
- wormsim/components/model/IL1DL.hoc +177 -0
- wormsim/components/model/IL1DR.hoc +176 -0
- wormsim/components/model/IL1L.hoc +179 -0
- wormsim/components/model/IL1R.hoc +179 -0
- wormsim/components/model/IL1VL.hoc +151 -0
- wormsim/components/model/IL1VR.hoc +151 -0
- wormsim/components/model/IL2DL.hoc +151 -0
- wormsim/components/model/IL2DR.hoc +151 -0
- wormsim/components/model/IL2L.hoc +151 -0
- wormsim/components/model/IL2R.hoc +151 -0
- wormsim/components/model/IL2VL.hoc +150 -0
- wormsim/components/model/IL2VR.hoc +150 -0
- wormsim/components/model/LUAL.hoc +129 -0
- wormsim/components/model/LUAR.hoc +129 -0
- wormsim/components/model/M1.hoc +161 -0
- wormsim/components/model/M2L.hoc +131 -0
- wormsim/components/model/M2R.hoc +131 -0
- wormsim/components/model/M3L.hoc +191 -0
- wormsim/components/model/M3R.hoc +191 -0
- wormsim/components/model/M4.hoc +192 -0
- wormsim/components/model/M5.hoc +256 -0
- wormsim/components/model/MCL.hoc +181 -0
- wormsim/components/model/MCR.hoc +181 -0
- wormsim/components/model/MI.hoc +134 -0
- wormsim/components/model/NSML.hoc +165 -0
- wormsim/components/model/NSMR.hoc +165 -0
- wormsim/components/model/OLLL.hoc +187 -0
- wormsim/components/model/OLLR.hoc +187 -0
- wormsim/components/model/OLQDL.hoc +175 -0
- wormsim/components/model/OLQDR.hoc +175 -0
- wormsim/components/model/OLQVL.hoc +150 -0
- wormsim/components/model/OLQVR.hoc +150 -0
- wormsim/components/model/PDA.hoc +142 -0
- wormsim/components/model/PDB.hoc +149 -0
- wormsim/components/model/PDEL.hoc +192 -0
- wormsim/components/model/PDER.hoc +193 -0
- wormsim/components/model/PHAL.hoc +149 -0
- wormsim/components/model/PHAR.hoc +149 -0
- wormsim/components/model/PHBL.hoc +149 -0
- wormsim/components/model/PHBR.hoc +149 -0
- wormsim/components/model/PHCL.hoc +154 -0
- wormsim/components/model/PHCR.hoc +154 -0
- wormsim/components/model/PLML.hoc +216 -0
- wormsim/components/model/PLMR.hoc +216 -0
- wormsim/components/model/PLNL.hoc +186 -0
- wormsim/components/model/PLNR.hoc +187 -0
- wormsim/components/model/PQR.hoc +153 -0
- wormsim/components/model/PVCL.hoc +173 -0
- wormsim/components/model/PVCR.hoc +175 -0
- wormsim/components/model/PVDL.hoc +8568 -0
- wormsim/components/model/PVDR.hoc +8566 -0
- wormsim/components/model/PVM.hoc +151 -0
- wormsim/components/model/PVNL.hoc +322 -0
- wormsim/components/model/PVNR.hoc +287 -0
- wormsim/components/model/PVPL.hoc +166 -0
- wormsim/components/model/PVPR.hoc +164 -0
- wormsim/components/model/PVQL.hoc +178 -0
- wormsim/components/model/PVQR.hoc +177 -0
- wormsim/components/model/PVR.hoc +205 -0
- wormsim/components/model/PVT.hoc +174 -0
- wormsim/components/model/PVWL.hoc +131 -0
- wormsim/components/model/PVWR.hoc +131 -0
- wormsim/components/model/RIAL.hoc +141 -0
- wormsim/components/model/RIAR.hoc +141 -0
- wormsim/components/model/RIBL.hoc +231 -0
- wormsim/components/model/RIBR.hoc +231 -0
- wormsim/components/model/RICL.hoc +154 -0
- wormsim/components/model/RICR.hoc +154 -0
- wormsim/components/model/RID.hoc +207 -0
- wormsim/components/model/RIFL.hoc +130 -0
- wormsim/components/model/RIFR.hoc +130 -0
- wormsim/components/model/RIGL.hoc +129 -0
- wormsim/components/model/RIGR.hoc +129 -0
- wormsim/components/model/RIH.hoc +172 -0
- wormsim/components/model/RIML.hoc +198 -0
- wormsim/components/model/RIMR.hoc +198 -0
- wormsim/components/model/RIPL.hoc +227 -0
- wormsim/components/model/RIPR.hoc +227 -0
- wormsim/components/model/RIR.hoc +167 -0
- wormsim/components/model/RIS.hoc +151 -0
- wormsim/components/model/RIVL.hoc +187 -0
- wormsim/components/model/RIVR.hoc +187 -0
- wormsim/components/model/RMDDL.hoc +130 -0
- wormsim/components/model/RMDDR.hoc +130 -0
- wormsim/components/model/RMDL.hoc +132 -0
- wormsim/components/model/RMDR.hoc +132 -0
- wormsim/components/model/RMDVL.hoc +132 -0
- wormsim/components/model/RMDVR.hoc +132 -0
- wormsim/components/model/RMED.hoc +161 -0
- wormsim/components/model/RMEL.hoc +132 -0
- wormsim/components/model/RMER.hoc +132 -0
- wormsim/components/model/RMEV.hoc +205 -0
- wormsim/components/model/RMFL.hoc +168 -0
- wormsim/components/model/RMFR.hoc +168 -0
- wormsim/components/model/RMGL.hoc +134 -0
- wormsim/components/model/RMGR.hoc +134 -0
- wormsim/components/model/RMHL.hoc +168 -0
- wormsim/components/model/RMHR.hoc +168 -0
- wormsim/components/model/SAADL.hoc +207 -0
- wormsim/components/model/SAADR.hoc +207 -0
- wormsim/components/model/SAAVL.hoc +167 -0
- wormsim/components/model/SAAVR.hoc +167 -0
- wormsim/components/model/SABD.hoc +192 -0
- wormsim/components/model/SABVL.hoc +143 -0
- wormsim/components/model/SABVR.hoc +143 -0
- wormsim/components/model/SDQL.hoc +150 -0
- wormsim/components/model/SDQR.hoc +135 -0
- wormsim/components/model/SIADL.hoc +191 -0
- wormsim/components/model/SIADR.hoc +191 -0
- wormsim/components/model/SIAVL.hoc +159 -0
- wormsim/components/model/SIAVR.hoc +159 -0
- wormsim/components/model/SIBDL.hoc +192 -0
- wormsim/components/model/SIBDR.hoc +192 -0
- wormsim/components/model/SIBVL.hoc +227 -0
- wormsim/components/model/SIBVR.hoc +227 -0
- wormsim/components/model/SMBDL.hoc +161 -0
- wormsim/components/model/SMBDR.hoc +161 -0
- wormsim/components/model/SMBVL.hoc +172 -0
- wormsim/components/model/SMBVR.hoc +172 -0
- wormsim/components/model/SMDDL.hoc +162 -0
- wormsim/components/model/SMDDR.hoc +162 -0
- wormsim/components/model/SMDVL.hoc +166 -0
- wormsim/components/model/SMDVR.hoc +166 -0
- wormsim/components/model/URADL.hoc +152 -0
- wormsim/components/model/URADR.hoc +152 -0
- wormsim/components/model/URAVL.hoc +150 -0
- wormsim/components/model/URAVR.hoc +150 -0
- wormsim/components/model/URBL.hoc +164 -0
- wormsim/components/model/URBR.hoc +164 -0
- wormsim/components/model/URXL.hoc +172 -0
- wormsim/components/model/URXR.hoc +172 -0
- wormsim/components/model/URYDL.hoc +160 -0
- wormsim/components/model/URYDR.hoc +160 -0
- wormsim/components/model/URYVL.hoc +150 -0
- wormsim/components/model/URYVR.hoc +150 -0
- wormsim/components/model/VA01.hoc +191 -0
- wormsim/components/model/VA02.hoc +144 -0
- wormsim/components/model/VA03.hoc +147 -0
- wormsim/components/model/VA04.hoc +148 -0
- wormsim/components/model/VA05.hoc +147 -0
- wormsim/components/model/VA06.hoc +156 -0
- wormsim/components/model/VA07.hoc +157 -0
- wormsim/components/model/VA08.hoc +156 -0
- wormsim/components/model/VA09.hoc +154 -0
- wormsim/components/model/VA10.hoc +145 -0
- wormsim/components/model/VA11.hoc +141 -0
- wormsim/components/model/VA12.hoc +123 -0
- wormsim/components/model/VB01.hoc +195 -0
- wormsim/components/model/VB02.hoc +192 -0
- wormsim/components/model/VB03.hoc +157 -0
- wormsim/components/model/VB04.hoc +159 -0
- wormsim/components/model/VB05.hoc +159 -0
- wormsim/components/model/VB06.hoc +158 -0
- wormsim/components/model/VB07.hoc +155 -0
- wormsim/components/model/VB08.hoc +155 -0
- wormsim/components/model/VB09.hoc +148 -0
- wormsim/components/model/VB10.hoc +149 -0
- wormsim/components/model/VB11.hoc +146 -0
- wormsim/components/model/VC01.hoc +159 -0
- wormsim/components/model/VC02.hoc +157 -0
- wormsim/components/model/VC03.hoc +275 -0
- wormsim/components/model/VC04.hoc +255 -0
- wormsim/components/model/VC05.hoc +255 -0
- wormsim/components/model/VC06.hoc +143 -0
- wormsim/components/model/VD01.hoc +194 -0
- wormsim/components/model/VD02.hoc +186 -0
- wormsim/components/model/VD03.hoc +187 -0
- wormsim/components/model/VD04.hoc +190 -0
- wormsim/components/model/VD05.hoc +190 -0
- wormsim/components/model/VD06.hoc +190 -0
- wormsim/components/model/VD07.hoc +194 -0
- wormsim/components/model/VD08.hoc +197 -0
- wormsim/components/model/VD09.hoc +189 -0
- wormsim/components/model/VD10.hoc +190 -0
- wormsim/components/model/VD11.hoc +190 -0
- wormsim/components/model/VD12.hoc +190 -0
- wormsim/components/model/VD13.hoc +189 -0
- wormsim/components/model/__init__.py +0 -0
- wormsim/components/param/__init__.py +0 -0
- wormsim/components/param/cell/ADAL.json +30 -0
- wormsim/components/param/cell/ADAR.json +30 -0
- wormsim/components/param/cell/ADEL.json +30 -0
- wormsim/components/param/cell/ADER.json +30 -0
- wormsim/components/param/cell/ADFL.json +30 -0
- wormsim/components/param/cell/ADFR.json +30 -0
- wormsim/components/param/cell/ADLL.json +30 -0
- wormsim/components/param/cell/ADLR.json +30 -0
- wormsim/components/param/cell/AFDL.json +30 -0
- wormsim/components/param/cell/AFDR.json +30 -0
- wormsim/components/param/cell/AIAL.json +30 -0
- wormsim/components/param/cell/AIAR.json +30 -0
- wormsim/components/param/cell/AIBL.json +30 -0
- wormsim/components/param/cell/AIBR.json +30 -0
- wormsim/components/param/cell/AIML.json +30 -0
- wormsim/components/param/cell/AIMR.json +30 -0
- wormsim/components/param/cell/AINL.json +30 -0
- wormsim/components/param/cell/AINR.json +30 -0
- wormsim/components/param/cell/AIYL.json +30 -0
- wormsim/components/param/cell/AIYR.json +30 -0
- wormsim/components/param/cell/AIZL.json +30 -0
- wormsim/components/param/cell/AIZR.json +30 -0
- wormsim/components/param/cell/ALA.json +30 -0
- wormsim/components/param/cell/ALML.json +30 -0
- wormsim/components/param/cell/ALMR.json +30 -0
- wormsim/components/param/cell/ALNL.json +30 -0
- wormsim/components/param/cell/ALNR.json +30 -0
- wormsim/components/param/cell/AQR.json +30 -0
- wormsim/components/param/cell/AS01.json +30 -0
- wormsim/components/param/cell/AS02.json +30 -0
- wormsim/components/param/cell/AS03.json +30 -0
- wormsim/components/param/cell/AS04.json +30 -0
- wormsim/components/param/cell/AS05.json +30 -0
- wormsim/components/param/cell/AS06.json +30 -0
- wormsim/components/param/cell/AS07.json +30 -0
- wormsim/components/param/cell/AS08.json +30 -0
- wormsim/components/param/cell/AS09.json +30 -0
- wormsim/components/param/cell/AS10.json +30 -0
- wormsim/components/param/cell/AS11.json +30 -0
- wormsim/components/param/cell/ASEL.json +30 -0
- wormsim/components/param/cell/ASER.json +30 -0
- wormsim/components/param/cell/ASGL.json +30 -0
- wormsim/components/param/cell/ASGR.json +30 -0
- wormsim/components/param/cell/ASHL.json +30 -0
- wormsim/components/param/cell/ASHR.json +30 -0
- wormsim/components/param/cell/ASIL.json +30 -0
- wormsim/components/param/cell/ASIR.json +30 -0
- wormsim/components/param/cell/ASJL.json +30 -0
- wormsim/components/param/cell/ASJR.json +30 -0
- wormsim/components/param/cell/ASKL.json +30 -0
- wormsim/components/param/cell/ASKR.json +30 -0
- wormsim/components/param/cell/AUAL.json +30 -0
- wormsim/components/param/cell/AUAR.json +30 -0
- wormsim/components/param/cell/AVAL.json +30 -0
- wormsim/components/param/cell/AVAR.json +30 -0
- wormsim/components/param/cell/AVBL.json +30 -0
- wormsim/components/param/cell/AVBR.json +30 -0
- wormsim/components/param/cell/AVDL.json +30 -0
- wormsim/components/param/cell/AVDR.json +30 -0
- wormsim/components/param/cell/AVEL.json +30 -0
- wormsim/components/param/cell/AVER.json +30 -0
- wormsim/components/param/cell/AVFL.json +30 -0
- wormsim/components/param/cell/AVFR.json +30 -0
- wormsim/components/param/cell/AVG.json +30 -0
- wormsim/components/param/cell/AVHL.json +30 -0
- wormsim/components/param/cell/AVHR.json +30 -0
- wormsim/components/param/cell/AVJL.json +30 -0
- wormsim/components/param/cell/AVJR.json +30 -0
- wormsim/components/param/cell/AVKL.json +30 -0
- wormsim/components/param/cell/AVKR.json +30 -0
- wormsim/components/param/cell/AVL.json +30 -0
- wormsim/components/param/cell/AVM.json +30 -0
- wormsim/components/param/cell/AWAL.json +30 -0
- wormsim/components/param/cell/AWAR.json +30 -0
- wormsim/components/param/cell/AWBL.json +30 -0
- wormsim/components/param/cell/AWBR.json +30 -0
- wormsim/components/param/cell/AWCL.json +30 -0
- wormsim/components/param/cell/AWCR.json +30 -0
- wormsim/components/param/cell/BAGL.json +30 -0
- wormsim/components/param/cell/BAGR.json +30 -0
- wormsim/components/param/cell/BDUL.json +30 -0
- wormsim/components/param/cell/BDUR.json +30 -0
- wormsim/components/param/cell/CANL.json +30 -0
- wormsim/components/param/cell/CANR.json +30 -0
- wormsim/components/param/cell/CEPDL.json +30 -0
- wormsim/components/param/cell/CEPDR.json +30 -0
- wormsim/components/param/cell/CEPVL.json +30 -0
- wormsim/components/param/cell/CEPVR.json +30 -0
- wormsim/components/param/cell/DA01.json +30 -0
- wormsim/components/param/cell/DA02.json +30 -0
- wormsim/components/param/cell/DA03.json +30 -0
- wormsim/components/param/cell/DA04.json +30 -0
- wormsim/components/param/cell/DA05.json +30 -0
- wormsim/components/param/cell/DA06.json +30 -0
- wormsim/components/param/cell/DA07.json +30 -0
- wormsim/components/param/cell/DA08.json +30 -0
- wormsim/components/param/cell/DA09.json +30 -0
- wormsim/components/param/cell/DB01.json +30 -0
- wormsim/components/param/cell/DB02.json +30 -0
- wormsim/components/param/cell/DB03.json +30 -0
- wormsim/components/param/cell/DB04.json +30 -0
- wormsim/components/param/cell/DB05.json +30 -0
- wormsim/components/param/cell/DB06.json +30 -0
- wormsim/components/param/cell/DB07.json +30 -0
- wormsim/components/param/cell/DD01.json +30 -0
- wormsim/components/param/cell/DD02.json +30 -0
- wormsim/components/param/cell/DD03.json +30 -0
- wormsim/components/param/cell/DD04.json +30 -0
- wormsim/components/param/cell/DD05.json +30 -0
- wormsim/components/param/cell/DD06.json +30 -0
- wormsim/components/param/cell/DVA.json +30 -0
- wormsim/components/param/cell/DVB.json +30 -0
- wormsim/components/param/cell/DVC.json +30 -0
- wormsim/components/param/cell/FLPL.json +30 -0
- wormsim/components/param/cell/FLPR.json +30 -0
- wormsim/components/param/cell/HSNL.json +30 -0
- wormsim/components/param/cell/HSNR.json +30 -0
- wormsim/components/param/cell/I1L.json +30 -0
- wormsim/components/param/cell/I1R.json +30 -0
- wormsim/components/param/cell/I2L.json +30 -0
- wormsim/components/param/cell/I2R.json +30 -0
- wormsim/components/param/cell/I3.json +30 -0
- wormsim/components/param/cell/I4.json +30 -0
- wormsim/components/param/cell/I5.json +30 -0
- wormsim/components/param/cell/I6.json +30 -0
- wormsim/components/param/cell/IL1DL.json +30 -0
- wormsim/components/param/cell/IL1DR.json +30 -0
- wormsim/components/param/cell/IL1L.json +30 -0
- wormsim/components/param/cell/IL1R.json +30 -0
- wormsim/components/param/cell/IL1VL.json +30 -0
- wormsim/components/param/cell/IL1VR.json +30 -0
- wormsim/components/param/cell/IL2DL.json +30 -0
- wormsim/components/param/cell/IL2DR.json +30 -0
- wormsim/components/param/cell/IL2L.json +30 -0
- wormsim/components/param/cell/IL2R.json +30 -0
- wormsim/components/param/cell/IL2VL.json +30 -0
- wormsim/components/param/cell/IL2VR.json +30 -0
- wormsim/components/param/cell/LUAL.json +30 -0
- wormsim/components/param/cell/LUAR.json +30 -0
- wormsim/components/param/cell/M1.json +30 -0
- wormsim/components/param/cell/M2L.json +30 -0
- wormsim/components/param/cell/M2R.json +30 -0
- wormsim/components/param/cell/M3L.json +30 -0
- wormsim/components/param/cell/M3R.json +30 -0
- wormsim/components/param/cell/M4.json +30 -0
- wormsim/components/param/cell/M5.json +30 -0
- wormsim/components/param/cell/MCDL01.json +25 -0
- wormsim/components/param/cell/MCDL02.json +25 -0
- wormsim/components/param/cell/MCDL03.json +25 -0
- wormsim/components/param/cell/MCDL04.json +25 -0
- wormsim/components/param/cell/MCDL05.json +25 -0
- wormsim/components/param/cell/MCDL06.json +25 -0
- wormsim/components/param/cell/MCDL07.json +25 -0
- wormsim/components/param/cell/MCDL08.json +25 -0
- wormsim/components/param/cell/MCDL09.json +25 -0
- wormsim/components/param/cell/MCDL10.json +25 -0
- wormsim/components/param/cell/MCDL11.json +25 -0
- wormsim/components/param/cell/MCDL12.json +25 -0
- wormsim/components/param/cell/MCDL13.json +25 -0
- wormsim/components/param/cell/MCDL14.json +25 -0
- wormsim/components/param/cell/MCDL15.json +25 -0
- wormsim/components/param/cell/MCDL16.json +25 -0
- wormsim/components/param/cell/MCDL17.json +25 -0
- wormsim/components/param/cell/MCDL18.json +25 -0
- wormsim/components/param/cell/MCDL19.json +25 -0
- wormsim/components/param/cell/MCDL20.json +25 -0
- wormsim/components/param/cell/MCDL21.json +25 -0
- wormsim/components/param/cell/MCDL22.json +25 -0
- wormsim/components/param/cell/MCDL23.json +25 -0
- wormsim/components/param/cell/MCDL24.json +25 -0
- wormsim/components/param/cell/MCDR01.json +25 -0
- wormsim/components/param/cell/MCDR02.json +25 -0
- wormsim/components/param/cell/MCDR03.json +25 -0
- wormsim/components/param/cell/MCDR04.json +25 -0
- wormsim/components/param/cell/MCDR05.json +25 -0
- wormsim/components/param/cell/MCDR06.json +25 -0
- wormsim/components/param/cell/MCDR07.json +25 -0
- wormsim/components/param/cell/MCDR08.json +25 -0
- wormsim/components/param/cell/MCDR09.json +25 -0
- wormsim/components/param/cell/MCDR10.json +25 -0
- wormsim/components/param/cell/MCDR11.json +25 -0
- wormsim/components/param/cell/MCDR12.json +25 -0
- wormsim/components/param/cell/MCDR13.json +25 -0
- wormsim/components/param/cell/MCDR14.json +25 -0
- wormsim/components/param/cell/MCDR15.json +25 -0
- wormsim/components/param/cell/MCDR16.json +25 -0
- wormsim/components/param/cell/MCDR17.json +25 -0
- wormsim/components/param/cell/MCDR18.json +25 -0
- wormsim/components/param/cell/MCDR19.json +25 -0
- wormsim/components/param/cell/MCDR20.json +25 -0
- wormsim/components/param/cell/MCDR21.json +25 -0
- wormsim/components/param/cell/MCDR22.json +25 -0
- wormsim/components/param/cell/MCDR23.json +25 -0
- wormsim/components/param/cell/MCDR24.json +25 -0
- wormsim/components/param/cell/MCL.json +30 -0
- wormsim/components/param/cell/MCR.json +30 -0
- wormsim/components/param/cell/MCVL01.json +25 -0
- wormsim/components/param/cell/MCVL02.json +25 -0
- wormsim/components/param/cell/MCVL03.json +25 -0
- wormsim/components/param/cell/MCVL04.json +25 -0
- wormsim/components/param/cell/MCVL05.json +25 -0
- wormsim/components/param/cell/MCVL06.json +25 -0
- wormsim/components/param/cell/MCVL07.json +25 -0
- wormsim/components/param/cell/MCVL08.json +25 -0
- wormsim/components/param/cell/MCVL09.json +25 -0
- wormsim/components/param/cell/MCVL10.json +25 -0
- wormsim/components/param/cell/MCVL11.json +25 -0
- wormsim/components/param/cell/MCVL12.json +25 -0
- wormsim/components/param/cell/MCVL13.json +25 -0
- wormsim/components/param/cell/MCVL14.json +25 -0
- wormsim/components/param/cell/MCVL15.json +25 -0
- wormsim/components/param/cell/MCVL16.json +25 -0
- wormsim/components/param/cell/MCVL17.json +25 -0
- wormsim/components/param/cell/MCVL18.json +25 -0
- wormsim/components/param/cell/MCVL19.json +25 -0
- wormsim/components/param/cell/MCVL20.json +25 -0
- wormsim/components/param/cell/MCVL21.json +25 -0
- wormsim/components/param/cell/MCVL22.json +25 -0
- wormsim/components/param/cell/MCVL23.json +25 -0
- wormsim/components/param/cell/MCVL24.json +25 -0
- wormsim/components/param/cell/MCVR01.json +25 -0
- wormsim/components/param/cell/MCVR02.json +25 -0
- wormsim/components/param/cell/MCVR03.json +25 -0
- wormsim/components/param/cell/MCVR04.json +25 -0
- wormsim/components/param/cell/MCVR05.json +25 -0
- wormsim/components/param/cell/MCVR06.json +25 -0
- wormsim/components/param/cell/MCVR07.json +25 -0
- wormsim/components/param/cell/MCVR08.json +25 -0
- wormsim/components/param/cell/MCVR09.json +25 -0
- wormsim/components/param/cell/MCVR10.json +25 -0
- wormsim/components/param/cell/MCVR11.json +25 -0
- wormsim/components/param/cell/MCVR12.json +25 -0
- wormsim/components/param/cell/MCVR13.json +25 -0
- wormsim/components/param/cell/MCVR14.json +25 -0
- wormsim/components/param/cell/MCVR15.json +25 -0
- wormsim/components/param/cell/MCVR16.json +25 -0
- wormsim/components/param/cell/MCVR17.json +25 -0
- wormsim/components/param/cell/MCVR18.json +25 -0
- wormsim/components/param/cell/MCVR19.json +25 -0
- wormsim/components/param/cell/MCVR20.json +25 -0
- wormsim/components/param/cell/MCVR21.json +25 -0
- wormsim/components/param/cell/MCVR22.json +25 -0
- wormsim/components/param/cell/MCVR23.json +25 -0
- wormsim/components/param/cell/MCVR24.json +25 -0
- wormsim/components/param/cell/MI.json +30 -0
- wormsim/components/param/cell/MuscleCell.json +25 -0
- wormsim/components/param/cell/NSML.json +30 -0
- wormsim/components/param/cell/NSMR.json +30 -0
- wormsim/components/param/cell/OLLL.json +30 -0
- wormsim/components/param/cell/OLLR.json +30 -0
- wormsim/components/param/cell/OLQDL.json +30 -0
- wormsim/components/param/cell/OLQDR.json +30 -0
- wormsim/components/param/cell/OLQVL.json +30 -0
- wormsim/components/param/cell/OLQVR.json +30 -0
- wormsim/components/param/cell/PDA.json +30 -0
- wormsim/components/param/cell/PDB.json +30 -0
- wormsim/components/param/cell/PDEL.json +30 -0
- wormsim/components/param/cell/PDER.json +30 -0
- wormsim/components/param/cell/PHAL.json +30 -0
- wormsim/components/param/cell/PHAR.json +30 -0
- wormsim/components/param/cell/PHBL.json +30 -0
- wormsim/components/param/cell/PHBR.json +30 -0
- wormsim/components/param/cell/PHCL.json +30 -0
- wormsim/components/param/cell/PHCR.json +30 -0
- wormsim/components/param/cell/PLML.json +30 -0
- wormsim/components/param/cell/PLMR.json +30 -0
- wormsim/components/param/cell/PLNL.json +30 -0
- wormsim/components/param/cell/PLNR.json +30 -0
- wormsim/components/param/cell/PQR.json +30 -0
- wormsim/components/param/cell/PVCL.json +30 -0
- wormsim/components/param/cell/PVCR.json +30 -0
- wormsim/components/param/cell/PVDL.json +30 -0
- wormsim/components/param/cell/PVDR.json +30 -0
- wormsim/components/param/cell/PVM.json +30 -0
- wormsim/components/param/cell/PVNL.json +30 -0
- wormsim/components/param/cell/PVNR.json +30 -0
- wormsim/components/param/cell/PVPL.json +30 -0
- wormsim/components/param/cell/PVPR.json +30 -0
- wormsim/components/param/cell/PVQL.json +30 -0
- wormsim/components/param/cell/PVQR.json +30 -0
- wormsim/components/param/cell/PVR.json +30 -0
- wormsim/components/param/cell/PVT.json +30 -0
- wormsim/components/param/cell/PVWL.json +30 -0
- wormsim/components/param/cell/PVWR.json +30 -0
- wormsim/components/param/cell/RIAL.json +30 -0
- wormsim/components/param/cell/RIAR.json +30 -0
- wormsim/components/param/cell/RIBL.json +30 -0
- wormsim/components/param/cell/RIBR.json +30 -0
- wormsim/components/param/cell/RICL.json +30 -0
- wormsim/components/param/cell/RICR.json +30 -0
- wormsim/components/param/cell/RID.json +30 -0
- wormsim/components/param/cell/RIFL.json +30 -0
- wormsim/components/param/cell/RIFR.json +30 -0
- wormsim/components/param/cell/RIGL.json +30 -0
- wormsim/components/param/cell/RIGR.json +30 -0
- wormsim/components/param/cell/RIH.json +30 -0
- wormsim/components/param/cell/RIML.json +30 -0
- wormsim/components/param/cell/RIMR.json +30 -0
- wormsim/components/param/cell/RIPL.json +30 -0
- wormsim/components/param/cell/RIPR.json +30 -0
- wormsim/components/param/cell/RIR.json +30 -0
- wormsim/components/param/cell/RIS.json +30 -0
- wormsim/components/param/cell/RIVL.json +30 -0
- wormsim/components/param/cell/RIVR.json +30 -0
- wormsim/components/param/cell/RMDDL.json +30 -0
- wormsim/components/param/cell/RMDDR.json +30 -0
- wormsim/components/param/cell/RMDL.json +30 -0
- wormsim/components/param/cell/RMDR.json +30 -0
- wormsim/components/param/cell/RMDVL.json +30 -0
- wormsim/components/param/cell/RMDVR.json +30 -0
- wormsim/components/param/cell/RMED.json +30 -0
- wormsim/components/param/cell/RMEL.json +30 -0
- wormsim/components/param/cell/RMER.json +30 -0
- wormsim/components/param/cell/RMEV.json +30 -0
- wormsim/components/param/cell/RMFL.json +30 -0
- wormsim/components/param/cell/RMFR.json +30 -0
- wormsim/components/param/cell/RMGL.json +30 -0
- wormsim/components/param/cell/RMGR.json +30 -0
- wormsim/components/param/cell/RMHL.json +30 -0
- wormsim/components/param/cell/RMHR.json +30 -0
- wormsim/components/param/cell/SAADL.json +30 -0
- wormsim/components/param/cell/SAADR.json +30 -0
- wormsim/components/param/cell/SAAVL.json +30 -0
- wormsim/components/param/cell/SAAVR.json +30 -0
- wormsim/components/param/cell/SABD.json +30 -0
- wormsim/components/param/cell/SABVL.json +30 -0
- wormsim/components/param/cell/SABVR.json +30 -0
- wormsim/components/param/cell/SDQL.json +30 -0
- wormsim/components/param/cell/SDQR.json +30 -0
- wormsim/components/param/cell/SIADL.json +30 -0
- wormsim/components/param/cell/SIADR.json +30 -0
- wormsim/components/param/cell/SIAVL.json +30 -0
- wormsim/components/param/cell/SIAVR.json +30 -0
- wormsim/components/param/cell/SIBDL.json +30 -0
- wormsim/components/param/cell/SIBDR.json +30 -0
- wormsim/components/param/cell/SIBVL.json +30 -0
- wormsim/components/param/cell/SIBVR.json +30 -0
- wormsim/components/param/cell/SMBDL.json +30 -0
- wormsim/components/param/cell/SMBDR.json +30 -0
- wormsim/components/param/cell/SMBVL.json +30 -0
- wormsim/components/param/cell/SMBVR.json +30 -0
- wormsim/components/param/cell/SMDDL.json +30 -0
- wormsim/components/param/cell/SMDDR.json +30 -0
- wormsim/components/param/cell/SMDVL.json +30 -0
- wormsim/components/param/cell/SMDVR.json +30 -0
- wormsim/components/param/cell/URADL.json +30 -0
- wormsim/components/param/cell/URADR.json +30 -0
- wormsim/components/param/cell/URAVL.json +30 -0
- wormsim/components/param/cell/URAVR.json +30 -0
- wormsim/components/param/cell/URBL.json +30 -0
- wormsim/components/param/cell/URBR.json +30 -0
- wormsim/components/param/cell/URXL.json +30 -0
- wormsim/components/param/cell/URXR.json +30 -0
- wormsim/components/param/cell/URYDL.json +30 -0
- wormsim/components/param/cell/URYDR.json +30 -0
- wormsim/components/param/cell/URYVL.json +30 -0
- wormsim/components/param/cell/URYVR.json +30 -0
- wormsim/components/param/cell/VA01.json +30 -0
- wormsim/components/param/cell/VA02.json +30 -0
- wormsim/components/param/cell/VA03.json +30 -0
- wormsim/components/param/cell/VA04.json +30 -0
- wormsim/components/param/cell/VA05.json +30 -0
- wormsim/components/param/cell/VA06.json +30 -0
- wormsim/components/param/cell/VA07.json +30 -0
- wormsim/components/param/cell/VA08.json +30 -0
- wormsim/components/param/cell/VA09.json +30 -0
- wormsim/components/param/cell/VA10.json +30 -0
- wormsim/components/param/cell/VA11.json +30 -0
- wormsim/components/param/cell/VA12.json +30 -0
- wormsim/components/param/cell/VB01.json +30 -0
- wormsim/components/param/cell/VB02.json +30 -0
- wormsim/components/param/cell/VB03.json +30 -0
- wormsim/components/param/cell/VB04.json +30 -0
- wormsim/components/param/cell/VB05.json +30 -0
- wormsim/components/param/cell/VB06.json +30 -0
- wormsim/components/param/cell/VB07.json +30 -0
- wormsim/components/param/cell/VB08.json +30 -0
- wormsim/components/param/cell/VB09.json +30 -0
- wormsim/components/param/cell/VB10.json +30 -0
- wormsim/components/param/cell/VB11.json +30 -0
- wormsim/components/param/cell/VC01.json +30 -0
- wormsim/components/param/cell/VC02.json +30 -0
- wormsim/components/param/cell/VC03.json +30 -0
- wormsim/components/param/cell/VC04.json +30 -0
- wormsim/components/param/cell/VC05.json +30 -0
- wormsim/components/param/cell/VC06.json +30 -0
- wormsim/components/param/cell/VD01.json +30 -0
- wormsim/components/param/cell/VD02.json +30 -0
- wormsim/components/param/cell/VD03.json +30 -0
- wormsim/components/param/cell/VD04.json +30 -0
- wormsim/components/param/cell/VD05.json +30 -0
- wormsim/components/param/cell/VD06.json +30 -0
- wormsim/components/param/cell/VD07.json +30 -0
- wormsim/components/param/cell/VD08.json +30 -0
- wormsim/components/param/cell/VD09.json +30 -0
- wormsim/components/param/cell/VD10.json +30 -0
- wormsim/components/param/cell/VD11.json +30 -0
- wormsim/components/param/cell/VD12.json +30 -0
- wormsim/components/param/cell/VD13.json +30 -0
- wormsim/components/param/cell/__init__.py +0 -0
- wormsim/components/param/cell/template.json +30 -0
- wormsim/components/param/connection/SI5-302-RIA.xlsx +0 -0
- wormsim/components/param/connection/SI5-302.xlsx +0 -0
- wormsim/components/param/connection/__init__.py +0 -0
- wormsim/components/param/connection/muscle_neuron.xlsx +0 -0
- wormsim/components/param/connection/neuron_muscle.xlsx +0 -0
- wormsim/config.json +682 -0
- wormsim/simulate.py +660 -0
- wormsim-0.0.1.dist-info/METADATA +7 -0
- wormsim-0.0.1.dist-info/RECORD +796 -0
- wormsim-0.0.1.dist-info/WHEEL +5 -0
- wormsim-0.0.1.dist-info/top_level.txt +1 -0
wormsim/simulate.py
ADDED
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
import os
|
|
3
|
+
import sys
|
|
4
|
+
import json
|
|
5
|
+
import torch
|
|
6
|
+
import pickle
|
|
7
|
+
import numpy as np
|
|
8
|
+
from tqdm import trange
|
|
9
|
+
from neuron import h, load_mechanisms
|
|
10
|
+
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
11
|
+
from . import abstract_circuit
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Cell:
|
|
15
|
+
"""class for cell
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
18
|
+
index: int, cell index
|
|
19
|
+
name: str, cell name
|
|
20
|
+
cell_param: dictionary of biophysical info for the cell
|
|
21
|
+
segments: list of Segment object
|
|
22
|
+
points: list of Point object
|
|
23
|
+
pre_connections, post_connections: list of Connection, the Cell acts as post-synaptic cell or pre-synaptic cell respectively
|
|
24
|
+
hoc_obj: hoc object
|
|
25
|
+
soma_volume, neurite_volume: volume of soma or neurite
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, index, name, cell_param, rec_voltage=False, mode="active", length_per_seg=2, is_muscle=False):
|
|
29
|
+
self.index, self.name, self.cell_param, self.rec_v, self.mode = int(index), name, cell_param, rec_voltage, mode
|
|
30
|
+
self.is_muscle = is_muscle
|
|
31
|
+
self.segments, self.points = [], []
|
|
32
|
+
self.pre_connections, self.post_connections = [], []
|
|
33
|
+
self.hoc_obj = getattr(h, self.name)()
|
|
34
|
+
self.setup_biophysics(cell_param)
|
|
35
|
+
self.prepare(length_per_seg)
|
|
36
|
+
self.soma_volume, self.neurite_volume = self.calculate_volume()
|
|
37
|
+
|
|
38
|
+
def __del__(self):
|
|
39
|
+
for segment in self.segments:
|
|
40
|
+
del segment
|
|
41
|
+
for point in self.points:
|
|
42
|
+
del point
|
|
43
|
+
self.hoc_obj = None
|
|
44
|
+
|
|
45
|
+
def release_hoc(self):
|
|
46
|
+
"""This explicit function is used to solve garbage collection issues before multiprocessing"""
|
|
47
|
+
for segment in self.segments:
|
|
48
|
+
segment.hoc_obj = None
|
|
49
|
+
del segment
|
|
50
|
+
for point in self.points:
|
|
51
|
+
del point
|
|
52
|
+
self.hoc_obj = None
|
|
53
|
+
|
|
54
|
+
def prepare(self, length_per_seg):
|
|
55
|
+
"""section, segment separation, prepare self.segments and self.points"""
|
|
56
|
+
section_endpoints = []
|
|
57
|
+
for section in self.hoc_obj.all:
|
|
58
|
+
soma_flag = 'Soma' in section.name()
|
|
59
|
+
|
|
60
|
+
section.nseg = 1 if soma_flag else int(np.ceil(section.L / length_per_seg))
|
|
61
|
+
init_loc = np.array((section.x3d(0), section.y3d(0), section.z3d(0)))
|
|
62
|
+
|
|
63
|
+
# define start endpoint
|
|
64
|
+
if soma_flag:
|
|
65
|
+
self.points.append(
|
|
66
|
+
Point(index=len(self.points), category=1,
|
|
67
|
+
location=init_loc,
|
|
68
|
+
diameter=section.diam3d(0), parent_id=-1))
|
|
69
|
+
previous_point_index = 0
|
|
70
|
+
section_endpoints.append(0)
|
|
71
|
+
else:
|
|
72
|
+
assert len(section_endpoints) > 0
|
|
73
|
+
previous_point_index = section_endpoints[np.argmin(
|
|
74
|
+
[np.linalg.norm(self.points[endpoint_index].location - init_loc)
|
|
75
|
+
for endpoint_index in section_endpoints])]
|
|
76
|
+
|
|
77
|
+
# append segment
|
|
78
|
+
loading_bar = np.linspace(0, 1, section.nseg + 1)
|
|
79
|
+
loading_cnt = 1
|
|
80
|
+
for start_ind in range(section.n3d() - 1):
|
|
81
|
+
end_ind = start_ind + 1
|
|
82
|
+
start_arc, end_arc = section.arc3d(start_ind) / section.L, section.arc3d(end_ind) / section.L
|
|
83
|
+
start_loc = np.array((section.x3d(start_ind), section.y3d(start_ind), section.z3d(start_ind)))
|
|
84
|
+
end_loc = np.array((section.x3d(end_ind), section.y3d(end_ind), section.z3d(end_ind)))
|
|
85
|
+
start_diam, end_diam = section.diam3d(start_ind), section.diam3d(end_ind)
|
|
86
|
+
|
|
87
|
+
while loading_cnt <= section.nseg and loading_bar[loading_cnt] <= end_arc:
|
|
88
|
+
ratio = (loading_bar[loading_cnt] - start_arc) / (end_arc - start_arc)
|
|
89
|
+
self.points.append(
|
|
90
|
+
Point(index=len(self.points), category=2,
|
|
91
|
+
location=(end_loc - start_loc) * ratio + start_loc,
|
|
92
|
+
diameter=(end_diam - start_diam) * ratio + start_diam,
|
|
93
|
+
parent_id=previous_point_index))
|
|
94
|
+
self.segments.append(
|
|
95
|
+
Segment(index=len(self.segments),
|
|
96
|
+
hoc_obj=section((loading_bar[loading_cnt] + loading_bar[loading_cnt - 1]) / 2),
|
|
97
|
+
point1=self.points[previous_point_index], point2=self.points[-1],
|
|
98
|
+
cell=self, name=section.name(), rec_voltage=self.rec_v))
|
|
99
|
+
previous_point_index = self.points[-1].index
|
|
100
|
+
loading_cnt += 1
|
|
101
|
+
|
|
102
|
+
section_endpoints.append(self.points[-1].index)
|
|
103
|
+
|
|
104
|
+
def calculate_volume(self):
|
|
105
|
+
soma_volume, neurite_volume = 0, 0
|
|
106
|
+
for section in self.hoc_obj.all:
|
|
107
|
+
if "Soma" in section.name():
|
|
108
|
+
for segment in section:
|
|
109
|
+
soma_volume += segment.volume()
|
|
110
|
+
else:
|
|
111
|
+
for segment in section:
|
|
112
|
+
neurite_volume += segment.volume()
|
|
113
|
+
return soma_volume, neurite_volume
|
|
114
|
+
|
|
115
|
+
def setup_biophysics(self, cell_param):
|
|
116
|
+
"""setup biophysical params of this neuron"""
|
|
117
|
+
mechanism_list = ['slo1_unc2', 'egl2', 'shl1', 'kqt3', 'unc2',
|
|
118
|
+
'kvs1', 'slo1_egl19', 'slo2_unc2', 'irk', 'egl36',
|
|
119
|
+
'egl19', 'cca1', 'shk1', 'slo2_egl19', 'nca',
|
|
120
|
+
'kcnl', 'cainternm']
|
|
121
|
+
for section in self.hoc_obj.all:
|
|
122
|
+
category = 'soma' if 'Soma' in section.name() else 'neurite'
|
|
123
|
+
|
|
124
|
+
section.Ra = cell_param[category]["Ra"] # (Ohm*cm)
|
|
125
|
+
section.cm = cell_param[category]["cm"] # (uF/cm2)
|
|
126
|
+
section.insert("pas")
|
|
127
|
+
for segment in section:
|
|
128
|
+
segment.pas.g = cell_param[category]["gpas"] # Passive conductance in S/cm2
|
|
129
|
+
segment.pas.e = cell_param[category]["epas"] # Leak reversal potential mV
|
|
130
|
+
if self.mode == "passive":
|
|
131
|
+
return
|
|
132
|
+
elif self.mode != "active":
|
|
133
|
+
raise ValueError
|
|
134
|
+
for mechanism in mechanism_list:
|
|
135
|
+
self.hoc_obj.Soma.insert(mechanism)
|
|
136
|
+
for segment in self.hoc_obj.Soma:
|
|
137
|
+
segment.shl1.gbshl1 = cell_param["soma"]["gbshl1"] # (nS/um2)
|
|
138
|
+
segment.shk1.gbshk1 = cell_param["soma"]["gbshk1"]
|
|
139
|
+
segment.kvs1.gbkvs1 = cell_param["soma"]["gbkvs1"]
|
|
140
|
+
segment.egl2.gbegl2 = cell_param["soma"]["gbegl2"]
|
|
141
|
+
segment.egl36.gbegl36 = cell_param["soma"]["gbegl36"]
|
|
142
|
+
segment.kqt3.gbkqt3 = cell_param["soma"]["gbkqt3"]
|
|
143
|
+
segment.egl19.gbegl19 = cell_param["soma"]["gbegl19"]
|
|
144
|
+
segment.unc2.gbunc2 = cell_param["soma"]["gbunc2"]
|
|
145
|
+
segment.cca1.gbcca1 = cell_param["soma"]["gbcca1"]
|
|
146
|
+
segment.slo1_egl19.gbslo1 = cell_param["soma"]["gbslo1_egl19"]
|
|
147
|
+
segment.slo1_unc2.gbslo1 = cell_param["soma"]["gbslo1_unc2"]
|
|
148
|
+
segment.slo2_egl19.gbslo2 = cell_param["soma"]["gbslo2_egl19"]
|
|
149
|
+
segment.slo2_unc2.gbslo2 = cell_param["soma"]["gbslo2_unc2"]
|
|
150
|
+
segment.kcnl.gbkcnl = cell_param["soma"]["gbkcnl"]
|
|
151
|
+
segment.nca.gbnca = cell_param["soma"]["gbnca"]
|
|
152
|
+
segment.irk.gbirk = cell_param["soma"]["gbirk"]
|
|
153
|
+
|
|
154
|
+
def add_pre_connection(self, new_connection):
|
|
155
|
+
"""the new connection points to self cell"""
|
|
156
|
+
assert isinstance(new_connection, Connection)
|
|
157
|
+
|
|
158
|
+
if new_connection.post_cell.index == self.index:
|
|
159
|
+
self.pre_connections.append(new_connection)
|
|
160
|
+
else:
|
|
161
|
+
raise ValueError("Connection post-synaptic cell incompatible!")
|
|
162
|
+
|
|
163
|
+
def add_post_connection(self, new_connection):
|
|
164
|
+
"""the new connection points from self cell"""
|
|
165
|
+
assert isinstance(new_connection, Connection)
|
|
166
|
+
|
|
167
|
+
if new_connection.pre_cell.index == self.index:
|
|
168
|
+
self.post_connections.append(new_connection)
|
|
169
|
+
else:
|
|
170
|
+
raise ValueError("Connection pre-synaptic cell incompatible!")
|
|
171
|
+
|
|
172
|
+
def segment(self, segment_index=None, segment_name=None):
|
|
173
|
+
"""obtain the segment object according to its index or name"""
|
|
174
|
+
assert (segment_index is not None) or (segment_name is not None)
|
|
175
|
+
for segment in self.segments:
|
|
176
|
+
if ((segment.index == segment_index) or (segment_index is None)) and \
|
|
177
|
+
((segment.name == segment_name) or (segment_name is None)):
|
|
178
|
+
return segment
|
|
179
|
+
raise ValueError("Segment not found!")
|
|
180
|
+
|
|
181
|
+
def update_connections(self, new_weights):
|
|
182
|
+
"""updating pre_connections weight"""
|
|
183
|
+
assert len(self.pre_connections) == len(new_weights)
|
|
184
|
+
for connection, new_weight in zip(self.pre_connections, new_weights):
|
|
185
|
+
connection.update_info(new_weight)
|
|
186
|
+
|
|
187
|
+
def simulation(self, sim_config, input_traces):
|
|
188
|
+
"""single cell simulation"""
|
|
189
|
+
# preparation
|
|
190
|
+
assert len(self.pre_connections) == len(input_traces)
|
|
191
|
+
for pre_connection in self.pre_connections:
|
|
192
|
+
assert pre_connection.pre_segment is None
|
|
193
|
+
output_indices = np.unique([post_connection.pre_segment.index for post_connection in self.post_connections])
|
|
194
|
+
for segment_index in output_indices:
|
|
195
|
+
output_segment = self.segment(segment_index)
|
|
196
|
+
output_segment.voltage = h.Vector().record(output_segment.hoc_obj._ref_v)
|
|
197
|
+
h.dt, h.tstop, h.secondorder = sim_config['dt'], sim_config['tstop'], sim_config['secondorder']
|
|
198
|
+
for connection in self.pre_connections:
|
|
199
|
+
connection.hoc_obj.vpre = sim_config["v_init"]
|
|
200
|
+
h.finitialize(sim_config['v_init'])
|
|
201
|
+
trace_length = int(sim_config['tstop'] / sim_config['dt'])
|
|
202
|
+
for time_step in range(trace_length):
|
|
203
|
+
for connect_index, connect in enumerate(self.pre_connections):
|
|
204
|
+
connect.hoc_obj.vpre = input_traces[connect_index, time_step]
|
|
205
|
+
h.fadvance()
|
|
206
|
+
output_traces = np.stack([np.array(self.segment(segment_index).voltage.to_python())
|
|
207
|
+
for segment_index in output_indices], axis=0)
|
|
208
|
+
return output_traces
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class PointCell(Cell):
|
|
212
|
+
"""class for cell
|
|
213
|
+
|
|
214
|
+
Attributes:
|
|
215
|
+
index: int, cell index
|
|
216
|
+
name: str, cell name
|
|
217
|
+
cell_param: dictionary of biophysical info for the cell
|
|
218
|
+
segments: list of Segment object
|
|
219
|
+
points: list of Point object
|
|
220
|
+
pre_connections, post_connections: list of Connection, the Cell acts as post-synaptic cell or pre-synaptic cell respectively
|
|
221
|
+
hoc_obj: hoc object
|
|
222
|
+
soma_volume, neurite_volume: volume of soma or neurite
|
|
223
|
+
"""
|
|
224
|
+
def __init__(self, index, name, cell_param, rec_voltage=False, mode="active"):
|
|
225
|
+
super(PointCell, self).__init__(index, name, cell_param, rec_voltage, mode)
|
|
226
|
+
self.remove_neurite()
|
|
227
|
+
self.neurite_volume = 0
|
|
228
|
+
|
|
229
|
+
def remove_neurite(self):
|
|
230
|
+
"""remove neurites hoc_obj"""
|
|
231
|
+
for segment in self.segments:
|
|
232
|
+
if 'Soma' not in segment.name:
|
|
233
|
+
segment = None
|
|
234
|
+
|
|
235
|
+
def prepare(self, length_per_seg=2):
|
|
236
|
+
"""section, segment separation, prepare self.segments and self.points"""
|
|
237
|
+
for section in self.hoc_obj.all:
|
|
238
|
+
if 'Soma' not in section.name():
|
|
239
|
+
continue
|
|
240
|
+
section.nseg = 1
|
|
241
|
+
self.points.append(
|
|
242
|
+
Point(index=len(self.points), category=1,
|
|
243
|
+
location=np.array((section.x3d(0), section.y3d(0), section.z3d(0))),
|
|
244
|
+
diameter=section.diam3d(0), parent_id=-1))
|
|
245
|
+
self.points.append(
|
|
246
|
+
Point(index=len(self.points), category=2,
|
|
247
|
+
location=np.array((section.x3d(1), section.y3d(1), section.z3d(1))),
|
|
248
|
+
diameter=section.diam3d(1), parent_id=0))
|
|
249
|
+
self.segments.append(
|
|
250
|
+
Segment(index=len(self.segments), hoc_obj=section(0.5),
|
|
251
|
+
point1=self.points[0], point2=self.points[1],
|
|
252
|
+
cell=self, name=section.name(), rec_voltage=self.rec_v))
|
|
253
|
+
|
|
254
|
+
def setup_biophysics(self, cell_param):
|
|
255
|
+
"""setup biophysical params of this neuron"""
|
|
256
|
+
mechanism_list = ['slo1_unc2', 'egl2', 'shl1', 'kqt3', 'unc2',
|
|
257
|
+
'kvs1', 'slo1_egl19', 'slo2_unc2', 'irk', 'egl36',
|
|
258
|
+
'egl19', 'cca1', 'shk1', 'slo2_egl19', 'nca',
|
|
259
|
+
'kcnl', 'cainternm']
|
|
260
|
+
self.hoc_obj.Soma.Ra = cell_param['soma']["Ra"] # (Ohm*cm)
|
|
261
|
+
self.hoc_obj.Soma.cm = cell_param['soma']["cm"] # (uF/cm2)
|
|
262
|
+
self.hoc_obj.Soma.insert("pas")
|
|
263
|
+
for segment in self.hoc_obj.Soma:
|
|
264
|
+
segment.pas.g = cell_param['soma']["gpas"] # Passive conductance in S/cm2
|
|
265
|
+
segment.pas.e = cell_param['soma']["epas"] # Leak reversal potential mV
|
|
266
|
+
if self.mode == "passive":
|
|
267
|
+
return
|
|
268
|
+
elif self.mode != "active":
|
|
269
|
+
raise ValueError
|
|
270
|
+
for mechanism in mechanism_list:
|
|
271
|
+
self.hoc_obj.Soma.insert(mechanism)
|
|
272
|
+
for segment in self.hoc_obj.Soma:
|
|
273
|
+
segment.shl1.gbshl1 = cell_param["soma"]["gbshl1"] # (nS/um2)
|
|
274
|
+
segment.shk1.gbshk1 = cell_param["soma"]["gbshk1"]
|
|
275
|
+
segment.kvs1.gbkvs1 = cell_param["soma"]["gbkvs1"]
|
|
276
|
+
segment.egl2.gbegl2 = cell_param["soma"]["gbegl2"]
|
|
277
|
+
segment.egl36.gbegl36 = cell_param["soma"]["gbegl36"]
|
|
278
|
+
segment.kqt3.gbkqt3 = cell_param["soma"]["gbkqt3"]
|
|
279
|
+
segment.egl19.gbegl19 = cell_param["soma"]["gbegl19"]
|
|
280
|
+
segment.unc2.gbunc2 = cell_param["soma"]["gbunc2"]
|
|
281
|
+
segment.cca1.gbcca1 = cell_param["soma"]["gbcca1"]
|
|
282
|
+
segment.slo1_egl19.gbslo1 = cell_param["soma"]["gbslo1_egl19"]
|
|
283
|
+
segment.slo1_unc2.gbslo1 = cell_param["soma"]["gbslo1_unc2"]
|
|
284
|
+
segment.slo2_egl19.gbslo2 = cell_param["soma"]["gbslo2_egl19"]
|
|
285
|
+
segment.slo2_unc2.gbslo2 = cell_param["soma"]["gbslo2_unc2"]
|
|
286
|
+
segment.kcnl.gbkcnl = cell_param["soma"]["gbkcnl"]
|
|
287
|
+
segment.nca.gbnca = cell_param["soma"]["gbnca"]
|
|
288
|
+
segment.irk.gbirk = cell_param["soma"]["gbirk"]
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
class Point:
|
|
292
|
+
"""abstract class recording point information
|
|
293
|
+
|
|
294
|
+
Attributes:
|
|
295
|
+
index: int, point index, starts from 0
|
|
296
|
+
category: int, 1 for Soma, 2 for Neurite
|
|
297
|
+
location: array of three float, [loc_x, loc_y, loc_z] indicate of location of the point
|
|
298
|
+
diameter: float, point diameter
|
|
299
|
+
parent_id: int, index of parent point
|
|
300
|
+
"""
|
|
301
|
+
|
|
302
|
+
def __init__(self, index, category, location, diameter, parent_id):
|
|
303
|
+
self.index, self.category, self.location, self.diameter, self.parent_id = \
|
|
304
|
+
int(index), category, location, diameter, parent_id
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
class Segment:
|
|
308
|
+
"""class for segment between two points
|
|
309
|
+
|
|
310
|
+
Attributes:
|
|
311
|
+
cell: Cell class or Point Cell class, the cell that contains the segment
|
|
312
|
+
index: int, segment index in the cell, starts from 0
|
|
313
|
+
hoc_obj: hoc object generated by NEURON
|
|
314
|
+
name: str, segment name generated by NEURON
|
|
315
|
+
location: array of three float, [loc_x, loc_y, loc_z] indicate of location of the midpoint
|
|
316
|
+
diameter: float
|
|
317
|
+
pre_connections, post_connections: list of Connection, the segment acts as postsynaptic segment or presynaptic segment
|
|
318
|
+
voltage: NEURON Vector class recording voltage of the segment
|
|
319
|
+
"""
|
|
320
|
+
|
|
321
|
+
def __init__(self, index, hoc_obj, point1, point2, cell, name, rec_voltage=False):
|
|
322
|
+
assert isinstance(point1, Point) and isinstance(point2, Point)
|
|
323
|
+
assert isinstance(cell, (Cell, PointCell))
|
|
324
|
+
|
|
325
|
+
self.cell, self.index, self.hoc_obj, self.name = cell, int(index), hoc_obj, name
|
|
326
|
+
self.location = (point1.location + point2.location) / 2
|
|
327
|
+
self.diameter = (point1.diameter + point2.diameter) / 2
|
|
328
|
+
self.point1 = point1
|
|
329
|
+
self.point2 = point2
|
|
330
|
+
self.pre_connections, self.post_connections = [], []
|
|
331
|
+
self.voltage = None
|
|
332
|
+
if rec_voltage:
|
|
333
|
+
self.voltage = h.Vector().record(self.hoc_obj._ref_v)
|
|
334
|
+
|
|
335
|
+
def __del__(self):
|
|
336
|
+
self.hoc_obj = None
|
|
337
|
+
|
|
338
|
+
def add_pre_connection(self, new_connection):
|
|
339
|
+
"""the new connection points to self segment"""
|
|
340
|
+
assert isinstance(new_connection, Connection)
|
|
341
|
+
|
|
342
|
+
if self.index == new_connection.post_segment.index:
|
|
343
|
+
self.pre_connections.append(new_connection)
|
|
344
|
+
else:
|
|
345
|
+
raise ValueError("Segment Index Incompatible!")
|
|
346
|
+
|
|
347
|
+
def add_post_connection(self, new_connection):
|
|
348
|
+
"""the new connection points from self segment"""
|
|
349
|
+
assert isinstance(new_connection, Connection)
|
|
350
|
+
|
|
351
|
+
if self.index == new_connection.pre_segment.index:
|
|
352
|
+
self.post_connections.append(new_connection)
|
|
353
|
+
else:
|
|
354
|
+
raise ValueError("Segment Index Incompatible!")
|
|
355
|
+
|
|
356
|
+
def voltage_switch(self, new_state=True):
|
|
357
|
+
if new_state:
|
|
358
|
+
if self.voltage is None:
|
|
359
|
+
self.voltage = h.Vector().record(self.hoc_obj._ref_v)
|
|
360
|
+
else:
|
|
361
|
+
self.voltage = None
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
class Connection:
|
|
365
|
+
"""class for connection
|
|
366
|
+
either be synapse (positive weight for excitatory and negative for inhibitory) or gap-junction
|
|
367
|
+
|
|
368
|
+
Attributes:
|
|
369
|
+
pre_segment, post_segment: Segment class, pre-synaptic segment or post-synaptic segment
|
|
370
|
+
pre_cell, post_cell: Cell class or Point Cell class, pre-synaptic cell or post-synaptic cell
|
|
371
|
+
category: str, either 'syn' or 'gj'
|
|
372
|
+
weight: float
|
|
373
|
+
hoc_obj: hoc object generated by NEURON
|
|
374
|
+
pair_key: int or None, two gj belongs to one pair has the same unique key in the circuit, syn's key is None
|
|
375
|
+
"""
|
|
376
|
+
|
|
377
|
+
def __init__(self, pre_segment, post_segment, category, weight, pair_key=None):
|
|
378
|
+
assert category in ('syn', 'gj')
|
|
379
|
+
assert isinstance(pre_segment, (Segment, type(None))) and \
|
|
380
|
+
isinstance(post_segment, (Segment, type(None)))
|
|
381
|
+
|
|
382
|
+
self.pre_segment, self.post_segment = pre_segment, post_segment
|
|
383
|
+
self.pre_cell = pre_segment.cell if pre_segment is not None else None
|
|
384
|
+
self.post_cell = post_segment.cell if post_segment is not None else None
|
|
385
|
+
self.category, self.weight, self.pair_key = category, weight, pair_key
|
|
386
|
+
self.hoc_obj = self.make_connection() if post_segment is not None else None
|
|
387
|
+
|
|
388
|
+
def __del__(self):
|
|
389
|
+
self.hoc_obj = None
|
|
390
|
+
|
|
391
|
+
def make_connection(self):
|
|
392
|
+
"""make hoc object Connection according to self.category and self.weight"""
|
|
393
|
+
if self.pre_segment is None:
|
|
394
|
+
# connection receives out-circuit input
|
|
395
|
+
if self.category == 'gj':
|
|
396
|
+
hoc_connection = h.gapjunction_advance(self.post_segment.hoc_obj)
|
|
397
|
+
elif self.category == 'syn':
|
|
398
|
+
if self.weight >= 0:
|
|
399
|
+
hoc_connection = h.exc_syn_advance(self.post_segment.hoc_obj)
|
|
400
|
+
else:
|
|
401
|
+
hoc_connection = h.inh_syn_advance(self.post_segment.hoc_obj)
|
|
402
|
+
else:
|
|
403
|
+
raise ValueError
|
|
404
|
+
else:
|
|
405
|
+
# connection receives other cell output
|
|
406
|
+
if self.category == 'gj':
|
|
407
|
+
hoc_connection = h.gapjunction(self.post_segment.hoc_obj)
|
|
408
|
+
elif self.category == 'syn':
|
|
409
|
+
if self.weight >= 0:
|
|
410
|
+
hoc_connection = h.neuron_to_neuron_exc_syn(self.post_segment.hoc_obj)
|
|
411
|
+
else:
|
|
412
|
+
hoc_connection = h.neuron_to_neuron_inh_syn(self.post_segment.hoc_obj)
|
|
413
|
+
else:
|
|
414
|
+
raise ValueError
|
|
415
|
+
hoc_connection._ref_vpre = self.pre_segment.hoc_obj._ref_v
|
|
416
|
+
hoc_connection.weight = abs(self.weight)
|
|
417
|
+
return hoc_connection
|
|
418
|
+
|
|
419
|
+
def update_info(self, new_weight=None):
|
|
420
|
+
"""change the weight or category of the connection"""
|
|
421
|
+
assert new_weight is not None
|
|
422
|
+
if self.hoc_obj is None:
|
|
423
|
+
return
|
|
424
|
+
# do not change gapjunction or synapse type (inh/exc)
|
|
425
|
+
if new_weight * self.weight > 0:
|
|
426
|
+
self.weight = new_weight
|
|
427
|
+
self.hoc_obj.weight = abs(self.weight)
|
|
428
|
+
# change synapse type (inh/exc)
|
|
429
|
+
else:
|
|
430
|
+
self.hoc_obj = None # delete the hoc object
|
|
431
|
+
self.weight = new_weight
|
|
432
|
+
self.hoc_obj = self.make_connection()
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
class DetailedCircuit:
|
|
436
|
+
"""class for circuit
|
|
437
|
+
|
|
438
|
+
Attributes:
|
|
439
|
+
cells: list of all Cell object in the circuit
|
|
440
|
+
connections: list of Connection, all connections include input and output connections
|
|
441
|
+
input_connections: list of Connection, input connections
|
|
442
|
+
output_connections: list of Connection, output connections
|
|
443
|
+
"""
|
|
444
|
+
|
|
445
|
+
def __init__(self):
|
|
446
|
+
self.cells, self.connections = [], []
|
|
447
|
+
self.input_connections, self.output_connections = [], []
|
|
448
|
+
|
|
449
|
+
def __del__(self):
|
|
450
|
+
for connection in self.connections:
|
|
451
|
+
del connection
|
|
452
|
+
for cell in self.cells:
|
|
453
|
+
del cell
|
|
454
|
+
|
|
455
|
+
def release_hoc(self):
|
|
456
|
+
"""This explicit function is used to solve garbage collection issues before multiprocessing"""
|
|
457
|
+
for connection in self.connections:
|
|
458
|
+
connection.hoc_obj = None
|
|
459
|
+
del connection
|
|
460
|
+
for cell in self.cells:
|
|
461
|
+
cell.release_hoc()
|
|
462
|
+
del cell
|
|
463
|
+
|
|
464
|
+
def add_cell(self, new_cell):
|
|
465
|
+
"""cell append interface"""
|
|
466
|
+
assert isinstance(new_cell, Cell)
|
|
467
|
+
self.cells.append(new_cell)
|
|
468
|
+
|
|
469
|
+
def add_connection(self, new_connection):
|
|
470
|
+
"""connection append interface"""
|
|
471
|
+
assert isinstance(new_connection, Connection)
|
|
472
|
+
self.connections.append(new_connection)
|
|
473
|
+
if new_connection.pre_segment is None:
|
|
474
|
+
self.input_connections.append(new_connection)
|
|
475
|
+
else:
|
|
476
|
+
new_connection.pre_segment.add_post_connection(new_connection)
|
|
477
|
+
new_connection.pre_cell.add_post_connection(new_connection)
|
|
478
|
+
|
|
479
|
+
if new_connection.post_segment is None:
|
|
480
|
+
self.output_connections.append(new_connection)
|
|
481
|
+
else:
|
|
482
|
+
new_connection.post_segment.add_pre_connection(new_connection)
|
|
483
|
+
new_connection.post_cell.add_pre_connection(new_connection)
|
|
484
|
+
|
|
485
|
+
def cell(self, cell_index=None, cell_name=None):
|
|
486
|
+
"""obtain the cell object according to its index or name"""
|
|
487
|
+
assert (cell_index is not None) or (cell_name is not None)
|
|
488
|
+
for cell in self.cells:
|
|
489
|
+
if ((cell.index == cell_index) or (cell_index is None)) and \
|
|
490
|
+
((cell.name == cell_name) or (cell_name is None)):
|
|
491
|
+
return cell
|
|
492
|
+
raise ValueError("Cell not found!")
|
|
493
|
+
|
|
494
|
+
def simulation(self, sim_config, input_traces, input_cell_names, output_cell_names, make_history=False):
|
|
495
|
+
"""init and simulate according to given input"""
|
|
496
|
+
if make_history and (not self.cells[0].rec_v):
|
|
497
|
+
self.voltage_switch(make_history)
|
|
498
|
+
h.dt, h.tstop = sim_config['dt'], sim_config['tstop']
|
|
499
|
+
# h.steps_per_ms = int(1 / sim_config['dt'])
|
|
500
|
+
h.secondorder = sim_config['secondorder']
|
|
501
|
+
for connection in self.input_connections:
|
|
502
|
+
connection.hoc_obj.vpre = sim_config["v_init"]
|
|
503
|
+
h.finitialize(sim_config['v_init'])
|
|
504
|
+
trace_length = int(sim_config['tstop'] / sim_config['dt'])
|
|
505
|
+
assert input_traces.shape == (len(input_cell_names), trace_length)
|
|
506
|
+
input_index = dict(zip(input_cell_names, range(len(input_cell_names))))
|
|
507
|
+
output_index = dict(zip(output_cell_names, range(len(output_cell_names))))
|
|
508
|
+
output_traces = np.zeros((len(output_cell_names), trace_length), dtype=np.float32)
|
|
509
|
+
for time_step in trange(trace_length):
|
|
510
|
+
for connection in self.input_connections:
|
|
511
|
+
connection.hoc_obj.vpre = input_traces[input_index[connection.post_cell.name], time_step]
|
|
512
|
+
h.fadvance()
|
|
513
|
+
for cell_name in output_cell_names:
|
|
514
|
+
output_traces[output_index[cell_name], time_step] = \
|
|
515
|
+
self.cell(cell_name=cell_name).hoc_obj.Soma(0.5).v
|
|
516
|
+
if make_history:
|
|
517
|
+
for connection in self.connections:
|
|
518
|
+
if connection.pre_segment is None:
|
|
519
|
+
connection.history = input_traces[input_index[connection.post_cell.name]]
|
|
520
|
+
else:
|
|
521
|
+
connection.history = np.array(connection.pre_segment.voltage.to_python()[:-1])
|
|
522
|
+
return output_traces
|
|
523
|
+
|
|
524
|
+
def update_connections(self, new_weights):
|
|
525
|
+
"""updating connects weight"""
|
|
526
|
+
assert len(self.connections) == len(new_weights)
|
|
527
|
+
for connection, new_weight in zip(self.connections, new_weights):
|
|
528
|
+
connection.update_info(new_weight)
|
|
529
|
+
|
|
530
|
+
def voltage_switch(self, new_state=True):
|
|
531
|
+
for connection in self.connections:
|
|
532
|
+
if connection.pre_segment is not None:
|
|
533
|
+
connection.pre_segment.voltage_switch(new_state)
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
def load_json(file_name):
|
|
537
|
+
with open(file_name, 'r+') as f:
|
|
538
|
+
data_dic = json.load(f)
|
|
539
|
+
return data_dic
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
def abstract2detailed(abs_circuit, config, load_hoc=True, rec_voltage=False, mode="active"):
|
|
543
|
+
"""create DetailedCircuit and load connection setting from given AbsCircuit"""
|
|
544
|
+
dir_info = config['dir_info']
|
|
545
|
+
data_path = os.path.dirname(os.path.abspath(__file__))
|
|
546
|
+
if load_hoc:
|
|
547
|
+
h.load_file('stdrun.hoc')
|
|
548
|
+
load_mechanisms(os.path.join(data_path, dir_info['mechanism_dir']))
|
|
549
|
+
circuit = DetailedCircuit()
|
|
550
|
+
for abs_cell in abs_circuit.cells:
|
|
551
|
+
cell_index, cell_name = abs_cell.index, abs_cell.name
|
|
552
|
+
try:
|
|
553
|
+
cell_param = load_json(os.path.join(data_path, dir_info['cell_param_dir'], cell_name + '.json'))
|
|
554
|
+
except FileNotFoundError:
|
|
555
|
+
print(f"Index {cell_index} Name {cell_name} Cell Parameter Not Found!")
|
|
556
|
+
else:
|
|
557
|
+
if load_hoc:
|
|
558
|
+
h.load_file(os.path.join(data_path, dir_info['model_dir'], cell_name + '.hoc'))
|
|
559
|
+
is_muscle = True if cell_index >= 302 else False
|
|
560
|
+
circuit.add_cell(Cell(cell_index, cell_name, cell_param, rec_voltage, mode, is_muscle=is_muscle))
|
|
561
|
+
for abstract_connection in abs_circuit.connections:
|
|
562
|
+
if abstract_connection.pre_segment is None:
|
|
563
|
+
detail_pre_segment = None
|
|
564
|
+
else:
|
|
565
|
+
pre_cell = circuit.cell(abstract_connection.pre_cell.index)
|
|
566
|
+
detail_pre_segment = pre_cell.segment(abstract_connection.pre_segment.index)
|
|
567
|
+
if abstract_connection.post_segment is None:
|
|
568
|
+
detail_post_segment = None
|
|
569
|
+
else:
|
|
570
|
+
post_cell = circuit.cell(abstract_connection.post_cell.index)
|
|
571
|
+
detail_post_segment = post_cell.segment(abstract_connection.post_segment.index)
|
|
572
|
+
circuit.add_connection(Connection(pre_segment=detail_pre_segment, post_segment=detail_post_segment,
|
|
573
|
+
category=abstract_connection.category, weight=abstract_connection.weight,
|
|
574
|
+
pair_key=abstract_connection.pair_key))
|
|
575
|
+
return circuit
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
class Simulate:
|
|
579
|
+
def __init__(self):
|
|
580
|
+
"""Initialize the simulation with the given config."""
|
|
581
|
+
self.data_path = os.path.dirname(os.path.abspath(__file__))
|
|
582
|
+
self.config_path = os.path.join(self.data_path, "config.json")
|
|
583
|
+
self.abs_circuit_path = os.path.join(self.data_path, "circuit.pkl")
|
|
584
|
+
self.sim_config = {"dt": 1, "tstop": 20000000000000, "v_init": -65, "secondorder": 0}
|
|
585
|
+
self.v_init = self.sim_config["v_init"]
|
|
586
|
+
self.input_cell_name = ["AWAL", "AWAR", "AWCL", "AWCR", "ASKL", "ASKR", "ALNL", "ALNR", "PLML", "PHAL", "PHAR", "URYDL",
|
|
587
|
+
"URYDR", "URYVL", "URYVR"]
|
|
588
|
+
self.output_cell_name = ["RIML", "RIMR", "RMEL", "RMER", "RMED", "RMEV", "RMDDL", "RMDDR", "RMDL", "RMDR", "RMDVL",
|
|
589
|
+
"RMDVR", "RIVL", "RIVR", "SMDDL", "SMDDR", "SMDVL", "SMDVR", "SMBDL", "SMBDR", "SMBVL",
|
|
590
|
+
"SMBVR", "DA01", "DA02", "DA03", "DA04", "DA05", "DA06", "DA07", "DA08", "DA09", "DB01",
|
|
591
|
+
"DB02", "DB03", "DB04", "DB05", "DB06", "DB07", "DD01", "DD02", "DD03", "DD04", "DD05", "DD06",
|
|
592
|
+
"VA01", "VA02", "VA03", "VA04", "VA05", "VA06", "VA07", "VA08", "VA09", "VA10", "VA11", "VA12",
|
|
593
|
+
"VB01", "VB02", "VB03", "VB04", "VB05", "VB06", "VB07", "VB08", "VB09", "VB10", "VB11", "VD01",
|
|
594
|
+
"VD02", "VD03", "VD04", "VD05", "VD06", "VD07", "VD08", "VD09", "VD10", "VD11", "VD12",
|
|
595
|
+
"VD13"]
|
|
596
|
+
self.dt_scale = 100 / 1
|
|
597
|
+
self.circuit = self.load_circuit()
|
|
598
|
+
|
|
599
|
+
self.add_iclamp(self.circuit, self.input_cell_name)
|
|
600
|
+
self.initialized = False
|
|
601
|
+
|
|
602
|
+
self.output_vectors = []
|
|
603
|
+
for cn in self.output_cell_name:
|
|
604
|
+
vec = self.circuit.cell(cell_name=cn).segments[0].voltage
|
|
605
|
+
self.output_vectors.append(vec)
|
|
606
|
+
|
|
607
|
+
if not self.initialized:
|
|
608
|
+
h.dt, h.tstop = self.sim_config['dt'], self.sim_config['tstop']
|
|
609
|
+
h.steps_per_ms = int(1 / self.sim_config['dt'])
|
|
610
|
+
h.secondorder = self.sim_config['secondorder']
|
|
611
|
+
h.finitialize(self.sim_config['v_init'])
|
|
612
|
+
self.initialized = True
|
|
613
|
+
|
|
614
|
+
def add_iclamp(self, circuit, input_cell_names):
|
|
615
|
+
"""Add IClamp for input cells to the circuit."""
|
|
616
|
+
circuit.iclamp = []
|
|
617
|
+
for cell_name in input_cell_names:
|
|
618
|
+
syn = h.IClamp(circuit.cell(cell_name=cell_name).segments[0].hoc_obj)
|
|
619
|
+
syn.amp = 0.
|
|
620
|
+
syn.delay = 0.
|
|
621
|
+
syn.dur = 1e9
|
|
622
|
+
circuit.iclamp.append(syn)
|
|
623
|
+
|
|
624
|
+
def load_circuit(self):
|
|
625
|
+
"""Load and process the circuit configuration."""
|
|
626
|
+
circuit_config = load_json(self.config_path)["config"]
|
|
627
|
+
abs_circuit = pickle.load(open(self.abs_circuit_path, 'rb'))
|
|
628
|
+
circuit = abstract2detailed(abs_circuit, circuit_config, load_hoc=True, rec_voltage=True)
|
|
629
|
+
return circuit
|
|
630
|
+
|
|
631
|
+
def reset_state(self):
|
|
632
|
+
"""只重置状态,不改变网络结构"""
|
|
633
|
+
h.finitialize(self.v_init)
|
|
634
|
+
h.t = 0
|
|
635
|
+
for vec in self.output_vectors:
|
|
636
|
+
vec.resize(0)
|
|
637
|
+
|
|
638
|
+
def simulate(self, input_traces):
|
|
639
|
+
"""Run the simulation for the given circuit and input traces."""
|
|
640
|
+
seq_len = input_traces.shape[0]
|
|
641
|
+
input_traces = input_traces.T
|
|
642
|
+
|
|
643
|
+
for cn in self.output_cell_name:
|
|
644
|
+
vec = self.circuit.cell(cell_name=cn).segments[0].voltage
|
|
645
|
+
vec.resize(0)
|
|
646
|
+
|
|
647
|
+
for time_step in range(seq_len):
|
|
648
|
+
for i, _ in enumerate(self.input_cell_name):
|
|
649
|
+
self.circuit.iclamp[i].amp = input_traces[i][time_step].item()
|
|
650
|
+
h.fadvance()
|
|
651
|
+
|
|
652
|
+
output_traces = np.array([vec.as_numpy() for vec in self.output_vectors])
|
|
653
|
+
output_traces = output_traces[:, :seq_len].T
|
|
654
|
+
|
|
655
|
+
return output_traces
|
|
656
|
+
|
|
657
|
+
def run_simulation(self, input_traces):
|
|
658
|
+
"""Run the full simulation pipeline."""
|
|
659
|
+
output_traces = self.simulate(input_traces)
|
|
660
|
+
return torch.tensor(output_traces, dtype=torch.float32)
|