From 5795d4d42fcd8d05c4e6b0017a6d87a2eee75a0b Mon Sep 17 00:00:00 2001 From: Rui Ribeiro <rui.ribeiro@icloud.com> Date: Mon, 5 Sep 2022 15:18:27 +0200 Subject: [PATCH] pre-release beta2 --- .gitignore | 2 +- src/lib/pathways/Gi.py | 150 +++++++++--------- src/lib/pathways/Gq.py | 17 +- src/lib/pathways/Gs.py | 20 ++- .../pathways/__pycache__/Gs.cpython-39.pyc | Bin 8173 -> 8888 bytes 5 files changed, 107 insertions(+), 82 deletions(-) diff --git a/.gitignore b/.gitignore index f315f45..73346d4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ src/lib/__pycache__/ src/lib/autogrid_reference_files/ src/lib/autogrids/ .ipynb_checkpoints/ - +debugging.txt diff --git a/src/lib/pathways/Gi.py b/src/lib/pathways/Gi.py index 1551975..00bb42e 100644 --- a/src/lib/pathways/Gi.py +++ b/src/lib/pathways/Gi.py @@ -18,79 +18,87 @@ from pysb.macros import * from pysb.macros import create_t_obs, drug_binding from sympy import Piecewise - +defaultParameters = { + 'time_in':0, + 'time_out':0, + 'L_init':0.01, + 'R_init': 2, + 'Gi_init': 3, + 'AC5_init': 0.7, + 'Ca_cytos_free': 0.06, + 'ATP_init': 5000, + 'PDE4_init': 2, + 'PDE10_init': 1, + 'PKA_init': 1.2, + 'RL_kon':0.1*1E3, + 'RL_koff':200, + 'RL_Gi_kon':6.6*1E3, + 'RL_Gi_koff':200, + 'RL_Gi_decay': 60, + 'GaiGTP_decay': 30, + 'Gi_formation': 100, + 'AC5_ATP_kon': 0.0001*1E3, + 'AC5_ATP_koff': 1, + 'AC5_basal': 1, + 'AC5_reverse_basal': 0.0004, + 'AC5_Ca_kon': 0.001*1E3, + 'AC5_Ca_koff': 0.9, + 'AC5_Ca_ATP_kon': 7.50E-5*1E3, + 'AC5_Ca_ATP_koff': 1, + 'AC5_Ca_ATP_to_cAMP': 0.5, + 'AC5_Ca_ATP_to_cAMP_reverse': 0.00015, + 'AC5_ATP_Ca_kon': 0.001*1E3, + 'AC5_ATP_Ca_koff': 0.9, + 'AC5_GaiGTP_kon': 50*1E3, + 'AC5_GaiGTP_koff': 5, + 'AC5_GaiGTP_ATP_kon': 6.25E-5*1E3, + 'AC5_GaiGTP_ATP_koff': 1, + 'AC5_ATP_GaiGTP_kon': 50*1E3, + 'AC5_ATP_GaiGTP_koff': 5, + 'AC5_GaiGTP_ATP_to_cAMP': 0.25, + 'AC5_GaiGTP_ATP_to_cAMP_reverse': 0.00105, + 'AC5_GaiGTP_decay': 30, + 'AC5_GaiGTP_decay_koff': 30, + 'AC5_Ca_GaiGTP_kon': 50*1E3, + 'AC5_Ca_GaiGTP_koff': 5, + 'AC5_Ca_GaiGTP_ATP_kon': 5.63E-5*1E3, + 'AC5_Ca_GaiGTP_ATP_koff': 1, + 'AC5_Ca_ATP_GaiGTP_kon': 50*1E3, + 'AC5_Ca_ATP_GaiGTP_koff': 5, + 'AC5_Ca_GaiGTP_ATP_to_cAMP': 0.125, + 'AC5_Ca_GaiGTP_ATP_to_cAMP_reverse': 2.81E-5, + 'AC5_Ca_GaiGTP_decay': 30, + 'AC5_Ca_GaiGTP_ATP_decay': 30, + 'PDE4_cAMP_kon': 0.01*1E3, + 'PDE4_cAMP_koff': 1, + 'PDE4_cAMP_to_AMP': 2, + 'PDE10_2cAMP_kon': 1.0E-6*1E3, + 'PDE10_2cAMP_koff': 9, + 'PDE10_cAMP_kon': 0.1*1E3, + 'PDE10_cAMP_koff': 2, + 'PDE10_2cAMP_cAMP_kon': 0.13*1E3, + 'PDE10_2cAMP_cAMP_koff': 2, + 'PDE10_cAMP_decay': 3, + 'PDE10_2cAMP_cAMP_decay': 10, + 'PKA_cAMP2_kon': 0.00026*1E3, + 'PKA_cAMP2_koff': 1, + 'PKA_cAMP4_kon': 0.000346*1E3, + 'PKA_cAMP4_koff': 1, + 'PKA_activation': 10*1E3, + 'PKA_activation_reverse': 0.025 +} def network(LR=None, kinetics=True, **kwargs): - defaultKwargs = { - 'time_in':0, - 'time_out':0, - 'L_init':0.01, - 'R_init': 2, - 'Gi_init': 3, - 'AC5_init': 0.7, - 'Ca_cytos_free': 0.06, - 'ATP_init': 5000, - 'PDE4_init': 2, - 'PDE10_init': 1, - 'PKA_init': 1.2, - 'RL_kon':0.1*1E3, - 'RL_koff':200, - 'RL_Gi_kon':6.6*1E3, - 'RL_Gi_koff':200, - 'RL_Gi_decay': 60, - 'GaiGTP_decay': 30, - 'Gi_formation': 100, - 'AC5_ATP_kon': 0.0001*1E3, - 'AC5_ATP_koff': 1, - 'AC5_basal': 1, - 'AC5_reverse_basal': 0.0004, - 'AC5_Ca_kon': 0.001*1E3, - 'AC5_Ca_koff': 0.9, - 'AC5_Ca_ATP_kon': 7.50E-5*1E3, - 'AC5_Ca_ATP_koff': 1, - 'AC5_Ca_ATP_to_cAMP': 0.5, - 'AC5_Ca_ATP_to_cAMP_reverse': 0.00015, - 'AC5_ATP_Ca_kon': 0.001*1E3, - 'AC5_ATP_Ca_koff': 0.9, - 'AC5_GaiGTP_kon': 50*1E3, - 'AC5_GaiGTP_koff': 5, - 'AC5_GaiGTP_ATP_kon': 6.25E-5*1E3, - 'AC5_GaiGTP_ATP_koff': 1, - 'AC5_ATP_GaiGTP_kon': 50*1E3, - 'AC5_ATP_GaiGTP_koff': 5, - 'AC5_GaiGTP_ATP_to_cAMP': 0.25, - 'AC5_GaiGTP_ATP_to_cAMP_reverse': 0.00105, - 'AC5_GaiGTP_decay': 30, - 'AC5_GaiGTP_decay_koff': 30, - 'AC5_Ca_GaiGTP_kon': 50*1E3, - 'AC5_Ca_GaiGTP_koff': 5, - 'AC5_Ca_GaiGTP_ATP_kon': 5.63E-5*1E3, - 'AC5_Ca_GaiGTP_ATP_koff': 1, - 'AC5_Ca_ATP_GaiGTP_kon': 50*1E3, - 'AC5_Ca_ATP_GaiGTP_koff': 5, - 'AC5_Ca_GaiGTP_ATP_to_cAMP': 0.125, - 'AC5_Ca_GaiGTP_ATP_to_cAMP_reverse': 2.81E-5, - 'AC5_Ca_GaiGTP_decay': 30, - 'AC5_Ca_GaiGTP_ATP_decay': 30, - 'PDE4_cAMP_kon': 0.01*1E3, - 'PDE4_cAMP_koff': 1, - 'PDE4_cAMP_to_AMP': 2, - 'PDE10_2cAMP_kon': 1.0E-6*1E3, - 'PDE10_2cAMP_koff': 9, - 'PDE10_cAMP_kon': 0.1*1E3, - 'PDE10_cAMP_koff': 2, - 'PDE10_2cAMP_cAMP_kon': 0.13*1E3, - 'PDE10_2cAMP_cAMP_koff': 2, - 'PDE10_cAMP_decay': 3, - 'PDE10_2cAMP_cAMP_decay': 10, - 'PKA_cAMP2_kon': 0.00026*1E3, - 'PKA_cAMP2_koff': 1, - 'PKA_cAMP4_kon': 0.000346*1E3, - 'PKA_cAMP4_koff': 1, - 'PKA_activation': 10*1E3, - 'PKA_activation_reverse': 0.025 - } - parameters={**defaultKwargs, **kwargs} + + parameters={**defaultParameters, **kwargs} + def myeval(x): + try: + y = eval(x) + except: + y=x + return y + + parameters = dict(zip(parameters.keys(), map(myeval, parameters.values()))) #Start a model Model() diff --git a/src/lib/pathways/Gq.py b/src/lib/pathways/Gq.py index ea4c958..e3f15b5 100644 --- a/src/lib/pathways/Gq.py +++ b/src/lib/pathways/Gq.py @@ -31,10 +31,7 @@ __email__ = "rui.ribeiro@univr.it" __status__ = "Production" USAGE = __doc__.format(__author__, __email__) - -def network(LR=None, kinetics=True, **kwargs): - - defaultKwargs = { +defaultParameters = { 'time_in':0, 'time_out':0, 'L_init':0, @@ -76,7 +73,17 @@ def network(LR=None, kinetics=True, **kwargs): 'DAG_decay':0.15, } - parameters={**defaultKwargs, **kwargs} +def network(LR=None, kinetics=True, **kwargs): + + parameters={**defaultParameters, **kwargs} + def myeval(x): + try: + y = eval(x) + except: + y=x + return y + + parameters = dict(zip(parameters.keys(), map(myeval, parameters.values()))) #Start a model Model() diff --git a/src/lib/pathways/Gs.py b/src/lib/pathways/Gs.py index 2f23250..c1e2af0 100644 --- a/src/lib/pathways/Gs.py +++ b/src/lib/pathways/Gs.py @@ -19,10 +19,7 @@ from pysb.macros import * from sympy import Piecewise from pysb.macros import create_t_obs, drug_binding - -def network(LR=None, kinetics=True, **kwargs): - - defaultKwargs = { +defaultParameters = { 'time_in':0, 'time_out':0, 'L_init':0.01, @@ -91,8 +88,21 @@ def network(LR=None, kinetics=True, **kwargs): 'PKA_activation': 10*1E3, 'PKA_activation_reverse': 0.01 } - parameters={**defaultKwargs, **kwargs} + +def network(LR=None, kinetics=True, **kwargs): + + parameters={**defaultParameters, **kwargs} + def myeval(x): + try: + y = eval(x) + except: + y=x + return y + + parameters = dict(zip(parameters.keys(), map(myeval, parameters.values()))) + + #Start a model Model() diff --git a/src/lib/pathways/__pycache__/Gs.cpython-39.pyc b/src/lib/pathways/__pycache__/Gs.cpython-39.pyc index 5a2fd0988d52e19212fe139ec90a2fdf3167f03d..f2526a339a1f76d36c791c488a40bd6551e3282a 100644 GIT binary patch literal 8888 zcmd5?X>b(B6`t8s$Laut03l-x*m$v#RtF$3uo41fi~w24#;hHS)%HqWYo%3s8i9x~ zafEFgo0!;%;{zXnkKj0t<0C#2$4=thiE|${RjG=Ts;E@<52un}sr<<IdU|?ygdq8m zs${q3O~0?-``+uGK1RJtmX(zl_$>eX+|<1{8pfYVDg11P(u&J^4}uxY%o;t;-IRA< z);Hu&_)Wt6S#v0m2n+=iL8%)oz=HUOSeO;bdoe3vr7Qwj#>!a*t7NnAoz3R3DmE9T zYBo=n=c8r;^cuF1QMndhx?cp0?u*#P5?c&C$Sz?^*izh=;kp!cmjPXl>vF`8o@`Hq zSUtOvtvqTb!UG1YJ8dS4*oxgoG&Y4c8Bx<VS3neZWzwnifsB=o`s_%Gr;{SxD|&N% zmK|Yy|3GhFW|(D$2PQvJ^+Lz{hmOXleDI#^m!H4HCtqK5#|PKG{z81}*c`x3^7FU& zB!w`Hs@AC>Zb~a^ovMH~wTJ{G{E>(0^G1BiByDAT?FWBaz0P(1C_eeqpU~&SxZ-`; zt@>kpGTC@tY{l87E|O_g#vjF}s)%f1{U4TvZhtkdV*Jo8ydR&UM?d-IwutYFyB>7? zm$gp*^Xy-LxudTuK2=QhxbWHA>J(b{wNCk=Po5dsQ1ZJoKaWqo{X`8S{8srN`%dfG zb~`LGL+Rekuw5hzx&6WpbwbbJ-tF9rJ9626r&!e1zRD?u+mkNT)1~aXHg9QmiX|vE z#FRnT_BN*!>hA0v%njRNdGGJHOHq*IghuiTs>)oArBlf<ySyWbBsvhv)hVa`93M)G z44g|Tu{Kmorn~~CV$%AORx)ePq9RX^rn!|?Pzgb33;9VBS%zD=s&GjwJUR?!7XTvH zn`+z9W!IdGx$zuAVpGv1q1HiINzS^Rl#tA~0D)1p$B5iBGWU5i;?xdGte~eNQdgZY z1D(?q=h6}Gwpyp;JdAU5a_~8-H?%pmsp?!1v@#w#Mw`0bK7YEoQ=whj<Wtvf6v1&h zrvfeuXCiZ--O>wG>W4UYx{=e;1=C^5(y1zwvqE+{C0AakBBjc_jznk-RXB5}QM-@{ zCX)-miAaEG3+1A87*rLyXtTL9pehBIO+C<a4BfV1Did9!9CPI~vt1QLWv<@rttM4w z4fAA5WJaAiTTSM9-R<L@Jt<nQ-A@q;w6$%=Wxb2Vn3?$cm>*x-v_kSu+ZJtEMRL<} zwk&7UqAjaJZCbOjZIxr=s=(H?K$dH;aS^r<7~N~JaS^r%x*uEDVr*G{Y+8P7TeaA> zDzI%;VB7Ms<tN(@`!j|xo;JsQPn(AW*u<hojl)4<3g39(N&hKB1jd6X1y30hK73&# zLKB8*i137QI5Zx*wdinI6tflViUD)N2fUbFiEVG?X_M8l`T-w{u?EP-lfDUT+o)|~ z&DwI+gekGrY>mcR6t)&D>%elA!;mqR|9apXfNx}R@V2rx$W5BPU3qU-_buwam30i5 ztYaG2)odHP2L9VwC!~|<4$ZZb?SjuP#Ope3>iE~PZk_9HVjnkI&!F#wk5`HkQHmFn zIxwv~?iUeu-FSdqzd-gJ+F2sXP`l^2iJBWwv)8Q|UavhHlxJc*?=>UmxG_I(Q4Zc4 zCGSn({g}%O)(X_nH^$Z-4<PQ%sP8SPuSDHO^x_7Y?>^Kf3u<Rg81U%>nkqnNgN?~( zY1H%=)XYIo#@LSIK6nkF?v{eODwbilO0PlGWZfFodw%{Q(4hsG8H4^4e*QSL;k+j1 zvYe=9=6Kk_2Lt^WpDee)kO=$;VIvcMIR+!_<EZ^O#X!H$W8Cvx)Ki#eC{*_OCPT~@ z3nl`lG2Dsla}N7|fsK050-L3>i7)|8=-l=fW+Bv*l(~&!Bst@uoQ=}+tu~NljaW!o zg7pA+4rrc(;F-b0!(KaKfcYXk^ReURJR@$1MRHa}*dcHo(p;Z#ZN$YBWVKjXjl*hO zTOFoa;c%+FVS9<Py$!avDccA;0_}+Q{N%K8iE)O!+_Bm~V-+o3B9^L_-VX2EwfCpI zmRfVh_%h-`9+#>-Cg3}veUHv$tuYxHzLzQAJK%eVZo{3>?$k_oX)h;k!Aw$ZnXl(v zCD!VVtc_-we1^-#<*H@Jz<EqZxEtEtI>M)Ag!8b7e4mkp%v?;56BR2|oO{50k7mAC zGtb~B(1W_(ZCgS9vUjggJ#-wr$2IR~F62kN1wAuEWc2)%iuXS7-lzNJ1hf-6%4cO1 zTGd<*y@p+wA7g5zs8c<1KREB#5gvf{fR6Av9l>e8o-x2j5!YQ$FM@`dB%f)$h$-gJ zgX{B}`9Ww8YUVGTk3m0Ahu>*gA%BBtRQwNt@gdFlux6a*qj9$lDp%(@ps$-$Uq1rA zM>OA~7xvS&)1rZ|S@E3&-$~v6$Dlo?*&m0$vm?3wYAre+FP_;dv0AnK32;53xt`QM z(_84qaB!?ra?Gw#`JDpGDa~?Pv$z?#{p7MZxXaR_Sk8dujBe#q(4NwqPs>)GZ{~VO z)A_CPV{5Hgr+VNS#Cb+XeHPlYI_ei?Oa3ii!ALvL%7N8CANwk?Ud29(XlHfo=b$~O zV}D7v*y%0LO62Y)a(0elEzHl{f_23cb%WTbqCSr}&+9l})@__QPX5_Bahwq_Jsa1` z-7DhinZAHnFX&ib(Xsvm7HxaMyf8~zRjd~g>qQ;wtJ?p<v1m-5{|V>!^)?mdB}92i zM|oLCxnP#CI)4;*9&Az(UO|LcRD=k7722yh-q(ctuIQ}&v$101%@K3DU2Im*_ceID zrafMVhqTe2Th#2`s^Yx?`!{sFH=(_$y}vH<Z=g;@N6ulL&U+~$cZjQ1<Zr<D8=C1Y zXm4qzZ=S<M%nkHz3yy8#8pZK8yx!Iv??8J;b9@UNDz4i5NOw85i%!MyZFqfKdwoYn zmR1EhxV^AL^}@UGc~|><S4MJu+?cM<PUZ7G_<T?2`h95M*9<=p?)!ORzg4jx(mOj^ zyi0VcY<~p5A8D2!L;JC2`3YF0hib3GRmFa)SgsY_ise1{y{B1z2JL5><>z3L9%47f z;V<wvLl2DsWO1FiUi$B0zf|wF@-Hp<mcEDms_<P`VZWaFtytCmhVoS9-^x+1-zo@I zf16bBcf=m{JNK_QX@3I_bbr5-)A=b6kqDEZzw<dAV{$s{<fSAcB+5vXlc1AWUP)pW ziP<D@f@^R(J>_#rRFjxTVm^rlBx*=3BvDJ^A`*0-%P%Ien8YO{mXKIVVi}1`NnA!^ zIf=_jL`ke5aRo$*n&5uu%z|388<#~?ha$qjU!vw=bB{4xY2xpG^onuV+-nT`V(1_A zg1Hl?*@5(EGK+(3^Pp{xoi#Xz??2Yo-;x_j*K?lfOJ{hlzKiE>O{auazkBy4k;`QV zGos$&srqcDuYM#cZaI(~v+6snx{)zEG&DwxPg5T97X#C0M$C{|Vjh||oE8Uie6VhP zHkV3ft&Me#t!;MNfzIB(2HWh8`V)a}D*C&7M@U$<ZzP5bl^NSiMt%GssQDO#9iY=& zJ1oy|;S%cT8z7*_J&&_X-4Zb>cypKS$9Y*akO<MSSzm*?H>!J+9VFc1cTfmldlD%H zaW)8s0B%_+twb<2CUTbTPahO^pr5DHcA#&6e?RiOi}E{0&VHQ3*#SDDLJ=Z>gRN#e zL=x=^%404&?3{L`+=6ABJ8g3>i0&t%2P6^Bs$h=;D=X@^gTxqfZjH{Z8Qk03hy#*R z4WYo(13d|JVT{*<Bx>?e+!Fpy0CiLf;E+28_y{Q>*^4nABSrQ=j5koZ42_m;?WI=o zMyDPJj4|GXGW<^v<g_Zrn@Le^it$y@_(P7_7pO)yBF0w}ekF;OB-TKn!8D+Icnf5r z7(c7vtS&d)z}J$+IuF=1MQQM>Jm6ZS@+pGX6I`MRVtj)aXy6;kEbc)Y8+fZ1Xyk2P zpown+z}r1&!)i|FgM5nzZEWUSy}&Bo;RROntI2Ph2W^V+YY3&|#)2lS;+=%<@S-hz zrx#eucX@!u81Ev#YrW_i-t7fiI4v9bc#Ug$5BXi^K^xZa>j~ZCL7N)*4TSFXqK!P^ z1)4a1H7tnH)XZ=40;~APyufOHGXUP}LDw|#eO{oMC&{eOi>~4+Lg`1de8bkP=4nFv zz33V~;00RvEnZ+P&ye4(9<(LKA0~8=MAlo?z#k!Wh{UkBsuAP#Bp^G8pA37u?U1~6 zCQ6;V{7K3#B1NtoVJcxoN=Wn0=w5pkOZO-DXGK?%Cx_AkKPTA%mPrZQe<(9z2L{t) zSeJ&9BX$T2@%}VcnjJZo&hh{SHH97CksHSH&h79v{Lq$3X88fCDb{>^KXiT@iK8U$ zBylf^`$&A2#Dfra$(Dm7JZ)K+r<{K5vjg4xvuQb<<uuOEUH(aOx}5~gT0TL7CaRpA z`3cF76V^(CW?z2B<!70kS#mbzXHb6D<Y$VU9dbtGXMr5~a<u11cz#spN3tBfa>U9} zDo191H1f|-YWqm&p_d<S`5`8Ul^ja>;gcUN{81u!jD#L0cFC?jE6qofec7}f9HPe- zEwX)`-FDGn2HR&QW!a&@14%w$CCbz=*e+GOWJC`KE<kF}N#%w{a>MCiVf8w{uHqMJ z^*d{yB{zCUSY#bmn=?&H>q!&R@59#pKmWcJ+7j^<g=+&Lf5;3~M9f8aohXvme3Xmi zw;H8t!U82I)%t48CAbz#w8pG8Yr-Xvb!NHQ=qo4bC%F#gjkxCHT2x9%45d1{Wc^l@ z%FRy5Yt&V4Zk09URc>yE+@vmtsRde#v`9#ceNs~SW_8_wdylkOhSCyTPQ-Haa#<#M z8C}w5g~S}WEKp@u`Ka~Pc$um+`RjN_(Ext}H~u7vQzTA9M14DZqQ!P#WX$TbOG(xZ zB~u))D?w{)Xk<*zRk<ASAo-jjL3H+<Y{tUBGW64bGpJ!$I8rzn%HdM99)lBeed8=Z X7A*$!BqC<z|I4V^T5`lVVl@2=TK@!n literal 8173 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 M^c5WO9PzCBH!Xl(oB#j- -- GitLab