From cee71b68940685cd66a431878a69ad584c33440c Mon Sep 17 00:00:00 2001 From: Pavel Buslaev Date: Tue, 9 Jul 2019 16:30:23 +0300 Subject: [PATCH] Added script for structural analysis of headgroup conformations --- script/ref/gb_ref.pdb | 10 ++ script/ref/hg_ref.pdb | 6 + script/ref/try.png | Bin 0 -> 40232 bytes script/show_lipid_structures.py | 282 ++++++++++++++++++++++++++++++++ 4 files changed, 298 insertions(+) create mode 100644 script/ref/gb_ref.pdb create mode 100644 script/ref/hg_ref.pdb create mode 100644 script/ref/try.png create mode 100644 script/show_lipid_structures.py diff --git a/script/ref/gb_ref.pdb b/script/ref/gb_ref.pdb new file mode 100644 index 00000000..e7aea339 --- /dev/null +++ b/script/ref/gb_ref.pdb @@ -0,0 +1,10 @@ +ATOM 1 P POP A 1 3.097 -0.433 2.303 1.00 0.00 P +ATOM 2 C1 POP A 1 1.327 0.388 0.333 1.00 0.00 C +ATOM 3 C2 POP A 1 -0.042 -0.233 0.272 1.00 0.00 C +ATOM 4 C3 POP A 1 -1.173 0.917 0.333 1.00 0.00 C +ATOM 5 O11 POP A 1 2.147 -0.573 0.982 1.00 0.00 O +ATOM 6 C21 POP A 1 -1.172 -1.832 -1.038 1.00 0.00 C +ATOM 7 O21 POP A 1 -0.112 -1.072 -0.938 1.00 0.00 O +ATOM 8 C31 POP A 1 -1.403 1.898 -1.817 1.00 0.00 C +ATOM 9 O31 POP A 1 -0.973 2.078 -0.547 1.00 0.00 O +END diff --git a/script/ref/hg_ref.pdb b/script/ref/hg_ref.pdb new file mode 100644 index 00000000..ce6d7b1b --- /dev/null +++ b/script/ref/hg_ref.pdb @@ -0,0 +1,6 @@ +ATOM 1 N POP A 1 2.073 -0.660 0.340 1.00 0.00 N +ATOM 2 P POP A 1 -1.137 -2.150 0.240 1.00 0.00 P +ATOM 3 C11 POP A 1 -0.217 0.090 -0.530 1.00 0.00 C +ATOM 4 C12 POP A 1 1.143 0.470 0.070 1.00 0.00 C +ATOM 5 O12 POP A 1 -0.927 -0.560 0.460 1.00 0.00 O +END diff --git a/script/ref/try.png b/script/ref/try.png new file mode 100644 index 0000000000000000000000000000000000000000..cea27659b3b442d8f9e612c1d688f862f3d9da7a GIT binary patch literal 40232 zcmeFY^;^^b_Xj-2h)EBW5^2ddh?I)D(IG7gQbRzbyK78DIt3AskP=Wz1tbU3DBYld zN~bg%i~BV{_xFFef4Hy93$KgudcMx{+5+-S~?&g zK*}@7&BIm7!~5y$WJP@th!3Q#rfd@UX1g^gMQA!~5ld+O{$aCf(`Uq|hT?BJEery+ zspz=JCQQd{ns$@ziT10{{vQHbS0m~rznS;DjE-?Fy>Lx^wUVLQ{Lx`~Mxr=zCh>0- zW8ZIzI5rR1_^rVEg@H@X-=Q|Rs)0}sQs3!yWZOVR)$T@PQ(Jyg+=ut?>EtKN3`qJB z%qq0}&;S1)|DVvoM`Yh|IQV%2s|fP!t5T9&PPME0sDy2*sgOXms|JfL3k!()TKUvS zdnUu*j2+4IgDC4gi9PJxbX#z1z7qfQlt@adloXftVbpv>tF3W)gJK5mZKF`CKU@EE zV@I`AA%PgRIHZPKLO;m2PQk+5PF~Ni;&{)U`>+{)*exBt5=;yLT;V2%Aqd(Shku#b zvV4(Mhk*Ytu_re=O|7(0%iJqLyQKInn{A2EC1nU-G6fivpg>(Nv+m?pU#GzR$RW?* z{-I^{X-S^U9=1_BES5zX@UM^;V6DCfzeSMv-wnJvX#qTL3X_(X?zpeX&ku0m7{O=x|NnQ!@lk#UUt=DiZ?|wG%(Bt9vFcyE^n= zCF)8$%14h>1m%DJ*SK6G8M14iV_+NM8Kf z*77ff#u5Z-^>_;3EUg%e3@GiX6N_VLUoml7KIgClajWa5r@e@g%SeNk6!WNG=k9fW zI~sVdDviSOO#g-F0>;t10C=>-5-}?3KC8~pn>j*bhB^$InRXqw-BM{S|MaP`z2)ik7S%R^;16Ah0)SUHZWMrEA2oN8W@ii(yKnT; zzLcly=wN+*XHFAWQk9IJ6dQ;Otj8m><}Omwx-JicB4ogJHVG_t_q$__9b?i{+l3kr z*)fE9PAZ}2%-7j2@bQO`ls}*;_&}w`hx#it@?6tSE#x{!tX7&P_^sLk@zev8YlHwog7PhJFFNwQ0>CY> zAevU^m@*AEZGl4E@~{V9R1g(TK$h@!WvZO9AaV|lm#bqy&Y(FCN4o-7D;uRadns*e zuR-Kxa&R#K!KJZGz7)&S#lE$t;-Il4yGdpvDKLiy>Dg6g6cK4gGIgS+NSVez*do2b zH?HS9aziJ2Vic&o@{%-EpM$k%`R(~GL-hJ+e_(3Z+hOqUwQEwpqi=Ug^fV8Fdelkut`KI#tN4OgwXWsi48UOJQGjPMl255N%z(3i zVvQ@xO^`<(2m-G-*7|&=qaFUoiXnY$jn|6ZGY{;4@HAnxhwoeSi^m6A!azPZrUR7A zPk!DV6rlBhsHRpdR>&2Z4IjAZ>AroB6Z`3q6uN)Nr5v}FGEL%~hq|`l;D5S?-&3T2 z=Xg1n?kN<0lb?J}lzhZ<`lW@;A<`X_6@wsI{791Blj)WRg(xY8AJdTEVIDPfW`@?e ze+onWFBOPwkt`KG7oe^#Bv&@W>vkjKTyq?6Zg?-dP2=PRfpp;0PRqwHf4ipUudNT~ zBDWgxf)izm+~Etliy=Ji{(oh~BlEwpT#MW!U9MVS>QM)skGGEmnOv);_`YIr-A>nm z-gvLL`XpYB9B@%A2o>-ZGqb=^Tyc1S)!a1qBuw$y4zDsHKcBjahj{rz80E8r_O@A6 zO=muZBRk>SF#9OxJI7IivZ>3b%45^&K?x1uAcsh>R!r{^<+$|i0MYZz9leX4L%6Mb zKf$k){**b5V=@?RM8Y0kYF$mXy<}rZGW|(wY#AlMkWc}^$x>MD#>)m7eqny?laGOaOgNCI%T{Hva^!x#`w! zgX$A`{fWqMnQ98T?iu!K%9$xrM@dA8dC}AFrd6|an&i6zBGN`|(3E;acMS73a!ksH z#)!CF1sA^fNy>@Qvd=-75EEhkq~JqRMedciXB|UlTfCI_Es@0$MjIdnPQG%P(s%Op zbsEm}MJOPRQh#N;#u-w|`?`&RnneHXORHGe&$jU5q3lPWoK}W4KrAaF7-F?M$>S#; zGdCKcPU9Ia=?uy}YUGS~WJt>7igc?S9nS{z4@BT&NJ@hILt^-)XUlz5C386g{k+tD zyrl>G(&GMqkoZ*Thxis8M(4tpQsS_c!pb9#X6m6pn4|7ZuF?b|MNcLMP~E_FpSSa^ z71i889nay`0QJvYC$t|`UORKrdNRbjIo4)N>1FX~%6n@OD3_6(5kx$uaK8xmI$X`L zMdlhd`BQUvWFqfa1EF)0G^=lep|HR6?Qbu;G;yIWOrD(SbqzuNX5=#k=!vx%7}|*J zIg^X~bb=@lbFAFemSYbu3|={76uxiV9=S@oXnO91d=7IQcA2O8K(T+n-RUNg%EBCl zb#8SBw8u!TOYySS4u{@gZ(rh7N#VDT`@lP?s_C$X2JT1Taom!;t@_c5L?Z4AwjlT3*eKR7rblm%8tO#XN}K6OIA z%*@!F?@jOvAiFXGrLE@$;4#S*H-43bQAw?fv`>^)=$+qUVN2~PHXi$1gt8t)-j#21 z1()Yw*}szxQ3NNOr7*t#^d$XJ6#qtHAf_;JT8o%&|XBD{^ zQ5tx&L&}5;Xv2xHVgNsvBu7i1p=gA?<=I_OL!mfI0ZWI7sH-ne#8V(lw=_OXsMQh& z?~xv!5a)EO8%PZTsD+@tUK1|33X3EcB4M87lB0aR;5EgJ&mk${F(shS6rRTyUSAFb zoI9K$LfvG%&079S1mB#<$_qwHgo|DF4#gMV(|32&O_i%K~^f zT0`%>9mqPO0{=h&HFP#*-XsvVYY$?L)zuH&TC}9pG8sVD(#>#Fe99qUcD>sOoeCjm z%@M7?hO5pS#z14^xNphUU)phSKtiRjWC=O!c9m!TvM{cEDr}fiaJZ9+U@!oMm@BfT zKI~+OVB93NXxUgDYAO%TWDYpC+mJkrm>i2Dupmbyc!zmCPv&E#ys=%IZ-%u7a3l@= z1-_d#x?!giMl3fk6^98Y;Q4v?ZPmJN``kDzLd}89DPO(}!kNM(!WAyiilC%+=BM$$ z%7#dX+{!Ix#rrGOu0+pr8;NHNv>aYyOFN-N-f;{Wz&#VQ@wQ1dOPVSUBdEX?7l(6u z&F4*wF`$G2Dnt4A417`e$q7>9YI4(~h^uClPftVAH;^8eY~+vQuOGZiOr^h8Mf8xU zrm%;QT}KOWbH?kv;)7Qfsu zU>;U-(AVwO1K(o`^Oq%Uv&vfIrcD$g?6WqU3EhOSUqIkq_T``uqG9it{k^^P+2i=u z{maKk+1bwOsXAZ^NoP{aI&ucj-^g~dLsHjc)f&P7s*a2t5_~pE&71??bxPa`Wu^U> zPO1t(X_4P$0q}=t#jp6Gdh!Mi9USft>H@KvVeDl{xjsq4{*Lxs^C%IVnW8cu_!T*M ztKFI1^X`ed<(dce7mATIuE-rp)l6;#IX}b5k+A+B1O56@9Ru%VS$-nEL+97``fRtj zvSK8$LbZUf%4G62q>4CC^jdi%oaB z?@Ld?G%t7wovnVmZj_2pf2Pzn8DSg&>tG5mTe)XrMB_N{t^0&2Bx?VJbjeCwis}uQ zoiU&nXF?PcvZW6|UC&djlmY#|s!OiU&22;BByA-N;XCnMSRXG$mbK}pO3}0zTD2ra z@ZZ@#RyWUW|1)TvSnAJoPAx@n35+po3DlIvz~dSsXqko2CIhS$s?Rh4A@Y_kB0c(e zkOrQ;$ljiN$2f^4oAI`w*JJY(Zzy_rDL#>t3I_qeeji;#BbE_Gibrum-ns%TIVV&H z3rjWos?9D5GS{0q2lbXI3xqGFV!phW$Pcl)`V?uaR>w9`Yz%{{LASY>zp$FzMU5my zC4(-lS-^E@vz0G;Q`?+9 zWIY_T~0Z`?HCfgRg>m)^*mZ ztKPWgQ_+8%m6vb0BYm(=m~ULBQUwvp^7Tj$g@@HCD01lPpGwHI1F8q5U_!l^Fega3 zH2hdvdH~s4X8M!Tk`aB$gX*$vD(QT#H4e}$Ba97k{nG0yY=QN3+fic^97&X;|LorP zUw)9CskW_PSkQnXT)i&!4w^0VJ@W5vDl6kNDIr6?gF5!(zl(&g!a<}Qh3wUs9$q!|IWQYKKBDEnDBuE>(*K>yUh8J;ZN!N*WU+_)REh>syN2X%?vZ|4T_{2cj;Sxkbi{3LA=WLzB8Y;GsYU_=$GA+uoOy3SX|;BQ`&&;3>j90Fn(7YQk9Z2a))vsT2Y{2`DBJ)SN7YU_ z)?W7$(_NcQEu}W%C^!-%^f%TnD|E{&POkdghq6G7T*PgZpA45i$JTG3-d0Y??Yh=nOlAeP6z3r6S@ zTO5)LpeJv+W(R!ClFO2 z1ybnYp|gs%5s7_*_&}q>WQ`OxXF5g7c+P^r5Qj6{3#msmNC#y$4iWT$4pM%qZ{eg` zfI0fVD>KInc^i}vhy6$zlRz~&`o)Akp@vgVYVk2&jd^c`vE8qhd9pdZZb{U2Ufy^M{ z*#SzdC!2514! z*Awl&i9zny&wt2=J|Y{MjNG@Keoi-WLw6rAJWwM6ECSmhX+Vq5RXp$=4jv$t40`B7 zdIM?Nio;=Sxno=)+KI38&P#)l`yX`}q27bcbUW#@2K9I02@F-xR3&33n>WcQc?y6>rmd zNZ?qA6z=I$5bhjhHBoHIlM|PbZ?#8=UJ^3JyPC*Cl@-Ag4F| z0II{=lN?~0utrV2G9m$EG<)`VjkNOO={QDplZ4k_`bbf%OU3O$r!@-tT^TN0MLA>N zGlPTkeciKcHjN?!J%H)$$v)Yd3lQw^atdVNn`B)2v6FsQhic9x(QyBHxwIZYp9?sv7RG(r3f;r_}>YinuwL_#GQPK8v}TFdol&17U_}? z=;t=vK5)&hvs41C?xDfCz((t`BV_>kR{Kn1A#x`HSBHBJj4nkrrm^kM?V zY=G|FpBT4@omV7PyI&~~WWQrdCtA-jvI8DkBL&HVc1GPmVw1G6B(@oayA+iCuL8-`3- z6mo5T$?hA+#H2EzrM5^mN~qH!;&3k1;0areF6BL8LJm{Jiv^p1Zy^AjVGm4jbuao4 z(v`p)_lG!1ipu;(&5Q#1zR;nJS(qAenX?4a- zpYIU$ys=yHAam?|EzyA5tiT0dvnKJ0_}Oa%iPISm)?cnCQDJl8=5f|W{oOa|A1*2QJD9(BPDcj$5rFFG0Rzc9HK2qV@lm6g)J+mK z%LM6I{d`jZC52lvZU-Frbvl{jUEU;zO_W@*-4+SA>|uJ0Qj$Y|!NKh+{36_G<>Uq& zm=&4ls!8(-3FLOa(V1*XeuhVBFAy*a+hthU$wQLq1VvH}w99}nRT<&Kf@lUa&N?`J zoJ{z4eg*k_)pLd&RDrq9ECHjwvnXFpI$R#ECiwh8>P~~K@UwH8Q~&B(6&WZgXsOzL7h!ebv|iRwYJF+$+U8Zp~>QGwV>)`a(BwjvSg z>D5U!#9BQU<=i1XCG`>W)>J|a=j;k-mMmqT@QF^lNz5M+F87;^qE`< zlK9MlMNzy5(3PE)rFcUXQ5s_xbl?J#_(zo_kaljhr~!V`LwkXblTIjA*vb5@3++Vl zGhM9*_|RX6L+{m;ZI#(H4Hwu!95Q_-)I2Wha`3E)AsnT69g0YgfKypcfKC$D-P}ex z^Q|$aaX>!50a$@1Zz`-Zi3h|WpOs&{Q4&HZO<5|orMf7g=JlLI26ldt{~02MUp0=+ z$~Uz~%s2xKlJm{FGUYkQGm^sO<#N&mvuA!m2bJf&b%(TYEGe>O&5prU}HSGm4T(>?>($5}p z1{<6fm|tjmpSUn$7Up}5YJDNi1O%51nIO1bQGRRG1R`&gc-E+I)75e7#$HR@McXdN z!dQj5*B$f@GV$8FD#~x;r5@JCt?h?mDFykWG7v@Yho2z+gzary`CiY`TA4)@CL05A z0?OnakQ5DKTFwvX)@O{a6+(2_1k|EHLv~l_%-ZQ4nEAh6s`rFu@}<}kc_S(yh2m&i zA@+^}}4fL?c6suL3k;A_`lW?D9{VG8S@ z8-Cks$#>4ahx{8XRxyr}$Iq5}T+(iD64w6c-)3jm-N_<(Ua{;J$fD@TAtvYrg z4;hwJ0h4F1e#;U0J^O`qP|dK?l4v5!+)m+#-VL?KgwD!d%h(c73xlo47Z{bI+$?h; z6@^z*VdQjELGIhLSMOyrY5I)X%I!dHI$db@Z$0Z|v=K$9SCmotCSKvobIYHf5}UzG(?b`*-g+vj6EFt_-SA8uCn@G@)|w z-2ne3bE!w2;?4_gzKB%en(C_~zX&Z&zBPBG!0Wng4&Fh8@pLj(9Rk!`M!7+DMFYU; zh-aBiLrBzJnB5%8fPE zdoz2sP5n=CWD1K?Z?Am8+dJgIb8$Tr7$`J_^ZatYk!%Q#o`f)RU)ot7)wX$JrzTP@9iR))%Ox^hnFvi$ zbkT>zt(S<@l31myL#}V$lD&kJ0g(T%oV&}1n6#Jrc#{utZ-))@Odg4+w(}dcKVuQP zX35RYFD`(7thZz>T!Y;il;!^RPv1&pTj%Zm`I)g?zx-V2qiBlvnUCRVg9Ma5YD6Jr zTLTqcAj$d0By7pCo?Nzq4Qy$PG>iv`VZP)ZUl-XNvB+$@fT{ex@e$aw+sW{Lo zxZa>mrDbn)1Qa2s{p(4<&d&kqUZJa_YOJ!a`%$k%;xF3rshi&pU%8o$U(<*IQ3hdijRr9Kj6Z)Ll~ZE$hWUWvBw`uYG&!>rvw6VmDj7S}ZDN{H{5zz3EnaHkUGT z?nE3-4DB$79_8mtqf-+h{=hql&&f_-%nQ6vf-EwZwDWCSV;|!#9X_3`3+gonA0xt{ zm-(VJbddp`K@G;>04|n4&Y<|89g#xvF%W^Tw$0BzXHBgzI&#F!SFW6>n%ugP-kA(Z4(11aL=vf&e;ftriYjZ+o+xn8x_;{j<_! z?6nd8sd+5$mksoTE40xVYElBhF-}?giAQ+ky^~~5SJ%gxrgz6vb;*^4 zsf;%Abj{tJ+!B%>hb_XYW71e*&;*5y^+k7~8V^_9c6Xr>Kbq)`B{Xb3FK$B1#$NbZ zTKCjXvPhf(03rgd-}z~gj?u*F2H(nyH{k0rgwl_<`@zftS`C2EqK{{E0n;eFI2)#vhn3xi z;vwX~?g7G!pQ1HmVI%PFU9@8jQjYP8Jnd=1m ziV^Y`i}_Q`;=CcCYjeISZ;P6_oK=5Koh~$eXgJ!)h<!2lsV7GV{g4Q1+S1HuKR{95(+pqjdpb-oShKbuNz%?{ zVe??yyZhq?*93sYARr{{X%wz}B0B;#y$(&ZikVhHB45)vs7$LsI*h*!f;&_B5><)c z{|`9VGgOw>0b?o~1bOkY1IV@uxLE^h@^TZvuToKf+wuXfkZ#40n zDv#aw^1!=8<1KC(`By2+?-i%qa9Uks5j3FCGl@q@ zuo^}B6?HF})Y*$&5L&)KUTvaNxZ7Mi5p1QWXA`l=d|elewiKX4vr6;aMt~2SR}{b7 zP&3GlsL-`9Wg|fA^1%Axv;R4pe7Mvz5$#7?rU0dYgU7mdJ<^tkxo?3|3sb)SKJ63jx~dV( zf5+#XTvi|Vvsi>jUcv=S>t$zH6rxR>!IWP`m*h$%VC!Yvtm7i+ z(z`ITA0*ekS_{<5)VV17&$o%3cS(xwE|TT-1Kdguu3gn7Iva;u=b`)YB{65SwASG_ zPnsfrigGAl!G6#-#H2}5{iqM7QKzKQ02@i5$CTznwx>`&TVV!-)AV*P+mkL=&8v|;N%idehb7e- z_zT$hmMyN1V}%Q5#bFs}4zX#0;IA|$f|J(}d#-!m-7x<1V=qbRB^RD=Us6Cbf7A>% zIM&yUE@CaTXSsm51T@F1aW&XZ)*j_~Rs0qRWF+PrZWn`5nsKA^O5_ix@p@uGOP^4Y zs!F=~Wvvnvt9JA%y!Yr-7yc2~@!--TujeYtw{3j$^OdAESG(S4ZriUb75vMzxvAcK z7erT;7dh@aE_ddg8+XLEE|j7r619lDit_V*5u4}tZPER@PjSufGNn-wi2$CZ1`@C- zVy~YInjQ?@p8w`jp3nipaovmSvoXnlBf(Yyp4(wq*i3_>nK$&PIesT=z{eXF!(pqS zCxuQn1~Umn6Nlaob-7$6^4(>Fzqzb;Yk!nu|LqNS%*MyjPQQa&`w~sQITgmFwdLxR zR=!)J&IrX|=3ggD8}a9+)7Pa`ie!&h%byU@Dt+tZRa2E!a*DhbzNVrx%UjBB8(}rZl-sW1AYUZ_*<+dw%f@RX}?wQ6aZ{@3px#fq60Kc>=Jh zloGZSCv;8MZ^syHMX-L&=r8sd2}W>thsyBd#XXT$t{n-&LhS8#0{mPjX@brb5|*TL4MUcfl;No>=Z zTg#Uok2qnfT3b$1<=YgYvlM_8&eit%7dFncT0)?ZP2p>2i0>Za!p!T*)KevqxsVs~ zXmuSk-MgW|Y|w-jt)&11_*chogWcQn4oa0F=1js3B1{@|qy1-|EgXw!@yL?4YJGgm zT$`Z5$IDL0?T{bV8_PHX z!W27oo)^sC9O>apc22>U-o|=mFGpJ%@&m@W|NP$DsN7ip?_tAimGwNI$U2+|RzW}RO0@#ak+1b>aPoh|t?u(YBD;Ys zEHLugsi4nZOlc9#SU!%y)?jXezP8;647yB`BHcSbS#={7D; zB$8KWWAbGdKEU}pAyf72re6LKtKD7eaC8BRIUH{KC0{^j6yq_3w( z$?42*jCsr62C@KREnT{oe>d;)y@5oY@s6G(r~&S4$6%~T$m8BBrC_mzIFR^Je_pe` zScYZ-KjNW|g_j9+VM)yG_`Y4Ck(u;s#aeU{c8fXG0L;0Ba@zksjyaPPPDufkMgTkJ zYOtKEWU%sc&@4=(cx`O~p}X@15_)N%VY*R?M}Di4Z1r4xC=;~Kn;FOZpTz(jTAc|DSe>f7`ldu>bvD!Pq^s?ZUA9Eh% zRa-Km;GtL_4E%}gKPGt*Qd|Ws zYR7oQD2j}*H$8^kaMUkYCy;Ep}y;V6?E#z%*ZU&;Y#9*l9$!h91 zR9A-Aa}Ze!=*BD{Msg;F0l0J5#%2%3VO>pqui)H}QSrq@No2H60qIjK)0_$zj3dr-s_jlAwTuqsijX4C4p;_b;TT ze`Jr#4?+4#2aL{dJ{WIo2ONkLR;Eogt=>g=JPLyzmEOI1{%TfJ3X=@waP0xWV*xiO0AQ32vn;x=BJS zORKYve|s3EC%N6X*K-aPZPM>qh2^U~6OD_*wHe|pwUuuK;%718^)Q)BS}5@u>5!TC z5XQMOJCB!U1&T-gSu_q;8u8&ee4HLYzh$X9_Gv>W)KLw3bl<8B>q-CI0~n(`WaX$z zoc{#5;O(WQ_VIXo8Gtjyi1&^Dy+7vHk_;AQ>32o{>0VB$+@n+Ue|{Xc zP*I=DrDXDfTG7AkS0ay}5wK5i`DdM!!tfev0b!z=l(!d>AD#MD85TnnwO!n!Xvu%M z_nBJm)_spWps?|gZt(vhuRgoz;&hu}i@!@EX|!#af4*0{*}~Lm{`jcZX+mqM#@BO( z=W;N}g;=!6}-2P5T*rg16w`+q^)2)P1v%L9@QLl+ffZa$?MV%TxJ=pDEOkUgRN$RW>iiWBASlelC z%_;gP7%wVn;eVW$hBU_ScDpa0*GUb|vk%S>)~7V3dk>yAWkrGh!GLLl|32xW69mb= z&AK7Gq2qn;qpQs=X34lf7{}Cg01(i%9O}<~?McDA699%`tm7@@VfYl#otimg+QJ-m zfF3sqi@8He0_L6X3LDpdEjxaEeOaG*c)lmesXFJBOTk}FyrOcC`)YU_eq+hyFjmh# z^V8f|RGV*2z|V`?1p)a@>7P!crv&J4?VQhj3q_`R0lY<@A9-O$`w|%XUH7>2LRqqH z0S^7}$1t3l<3Zw3!Iuz}-qOW;1kgP}6%>}?{l{<=`4SMP7Ywg}%{_&yI z#QG2W)G0QRM^CzY{_k@SrbM2{VT)ynJP6e1>b-j|zWEy}$e~4-#|$=sRwY-N<@bEf z!&CtbqS}wC5{UZUDvcgmIkj3{u(|$_oD_#{K-Jn51D`@K|9#xZ4iIQpM@UOd@TF)S zn-LyYrRP4-(4S}8OJvt>NNTte#|XGhQUCn!s4tg)SWeH#7zu_~)e1JYCGz|Vd1rvv zl|pH7yM{kub(n9{Y=JX>gJ=85x%1KuyPOT0xX)QLUX>*RUhy%M}s(_MUt<5C?3u zs?pMd^$QZVZpH3O|Hu^>@Y)_nzE20XamcDrUcci8pfpe;(Pn)k8cGI!#FZvGr?|K?K(@_7Ec#P!>!IuLPf)G+)R_~)&$V|wiK5VSF^`9t;_kz zr`n>2IKzy)MLzqoS<1ou-6zuxTSc=cW@?l_SC(4aq(dSj6K{seLNmUI9^0PR?XbS* zErg^+G650J9Rsw*8E0A;NKBx9d7|3S9g6IWI#<|`CXFOgcctpzOZDx zsk*M^q&89zeF#?|`|SL?-*)?v{&vw_hcdr8t80sRCZ|plf6UaXCL%eG=k@HOJ6qYs z3)e_F+%NM#9zYTYu)C~QM|qo*nmc$_!}Gi^@?#W!MwJy*}; zdXnz%tKeGUc2v`zkM>j zAGO!}`@gML%@(B{=O>n)H}P3@!yPY;lq8#E&k3KBZuKJaCE|I6A74_&ukC$s3yo9ub&ygL7Q(k!9QhYb(x3^2A%c2a-{i&zsTm8(`gP@jaWT zbO)^+7P#f_D4D~)71H+%uVou@;-fA(o$!QS#-YCqry@k?p=lCn?QN?UA50+sQz;s^ zc9yOV!vkYXEN=r)F70}anrrR+qk9-pE}BIsgT0ZSB&|(ur3rb*?Z1U#bzj*nHK<=t z@ZHHNJXdQF2oH0z(X{HCvF6oaKHmhzN6#pOThE{Sp^0{lv~{!BMV>BP2ZVu>9SK+< zNZ|(71ORr=Ncfs$TEq0TfYLPN1#Ep9@-SOvQ|MZtei(U_qNG>_8EP9;0MHJTNc3S( z(wX5KMSoqYM4rm*9>(hW>grm%^w}^)gqR_y(gUd zS+Pl{D3QW}9t1h2Nxr zmUN2Vm&jHsjofQg0P;5LVekBD9dDe23zt$$#~|^qgOiS%ou>NPSFJ_HPv@4Ei}FAU zjq(8eEl|!$EOghg3F~z3GOv}d?Srm}2NiNbx8pCUI9L1Zb+n!0`8K$P(CehUIWF__ zHi&EPrVGG)@HWb9nLs�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 literal 0 HcmV?d00001 diff --git a/script/show_lipid_structures.py b/script/show_lipid_structures.py new file mode 100644 index 00000000..f3996e5e --- /dev/null +++ b/script/show_lipid_structures.py @@ -0,0 +1,282 @@ +# Script for analyzing the conformations of lipid headgroups +# Uses python3, mdtraj and pymol +# Developed by Buslaev Pavel (pbuslaev@gmail.com) + +import mdtraj as md +import numpy as np +import sys +import pymol + +def load_traj(traj_file, traj_top, resname, sf, ef, stride): + # Load topology file + topol=md.load(traj_top).topology + # Get atom indices to load + ailist = topol.select('not water and not type W H Hs WT4 NaW KW CLW MgW and resname %s' \ + % resname) + # load trajectory + return md.load(traj_file,top = traj_top,atom_indices=ailist,stride=stride)[sf:ef] + +def concat_traj(traj,show_atoms): + # Get number of frames and lipids + nframes = traj.n_frames + nlip = len(list(traj.topology.residues)) + + # Get topologe + top = traj.topology + + # Get ids of atoms to show + show_ai = top.select(show_atoms) + + # Reshape the trajectory + trajxyz=traj.atom_slice(show_ai).xyz + trajxyz=trajxyz.reshape((nframes,nlip,len(show_ai)//nlip,3)) + trajxyz = np.swapaxes(trajxyz,0,1) + trajxyz = trajxyz.reshape((nframes*nlip,len(show_ai)//nlip,3)) + + return md.Trajectory(trajxyz,traj[0].atom_slice(show_ai[0:len(show_ai)//nlip]).topology) + +def align_traj(traj, ref_atoms): + trajxyz = traj.xyz + top = traj.topology + ref_ai = top.select("name " + ref_atoms) + + trajxyz = centerTraj(trajxyz, ref_ai) + trajxyz = rotateTraj(trajxyz, trajxyz[0], ref_ai) + avg_xyz = trajxyz.mean(axis=0) + trajxyz = centerTraj(trajxyz, ref_ai) + trajxyz = rotateTraj(trajxyz,avg_xyz, ref_ai) + + return md.Trajectory(trajxyz,top) + +def save_traj(traj, n_out_f,outf): + nf = traj.n_frames + st = (nf // n_out_f) + 1 + traj[::st].save_pdb(outf) + +# Kabsch algorithm for alignment +def kabsch(p,q): # p - moving vector; q - reference + # Computation of covariance matrix + C = np.dot(np.transpose(p),q) + # Singular value decomposition + V,S,W = np.linalg.svd(C) + d = (np.linalg.det(V)*np.linalg.det(W)) < 0. + if d: + S[-1]= -S[-1] + V[:, -1] = -V[:, -1] + + # Create rotation matrix + U = np.dot(V,W) + return U + +# Moving selections to the same center +def centerTraj(trajxyz,align_i): + xyz = trajxyz + # Get number of frames, atoms and coordinate + (nf,na,nc) = xyz.shape + # Find the center of mass for each frame + list_of_cm = np.mean(xyz[:,align_i,:], axis=1) + # Center the trajectory + xyz = np.array(list(map(lambda x,y: x - y, xyz,list_of_cm))) + return xyz + +# Rotating selections to minimize rmsd +def rotateTraj(trajxyz,refxyz,align_i): + xyz = trajxyz + # Find center of mass for the reference + rcm = np.mean(refxyz,axis=0) + # Center referencd + ref = refxyz - rcm + # Get number of frames, atoms and coordinate + (nf,na,nc) = xyz.shape + xyz = np.array(list(map(lambda x: np.dot(x,kabsch(x[align_i],ref[align_i])),xyz))) + return xyz + +# Calculate dihedral angle distributions +def parseDihedFile(file,traj): + # Get topology + top = traj.topology + diheds = [] + with open(file) as f: + for line in f: + # for each line from the input file select atoms and + # calculate dihed for the trajectory + ai = top.select("name " + line) + ai = np.array(np.split(ai,ai.shape[0]//4)) + dihed = np.concatenate(md.compute_dihedrals(traj,ai),axis=None) + # Append calculated dihedrals to the diheds + diheds.append(dihed) + diheds=np.array(diheds) + np.savetxt("diheds.txt",diheds) + +# Show dihedrals +def showDihed(ref,structure,a_atoms,pngf): + topol =md.load(ref).topology + satoms = list(i.split('-')[1] for i in str(list(topol.atoms))[1:-1].split(",")) + + refatoms = {\ + "hg":["C11","N","P","C12","O12"],\ + "gb":["C1","C2","C3","P","O11","C21","O21","C31","O31"] + } + + # views for different sets of atoms + # hg - P to N atoms for different lipids + # gb - glycerol backbone + views={\ + "hg":"\ + -0.816361189, -0.477001756, -0.325615883,\ + -0.414168328, 0.876450181, -0.245559067,\ + 0.402518690, -0.065604433, -0.913057089,\ + -0.000000283, 0.000000288, -14.178191185,\ + 0.205995172, -0.187574118, 0.333097398,\ + 11.678203583, 16.678203583, 20.000000000 ", + "gb":"\ + 0.972944081, 0.089319512, -0.213074163,\ + -0.202513024, -0.114210837, -0.972596884,\ + -0.111205898, 0.989433169, -0.093032047,\ + 0.000000296, -0.000000288, -18.411260605,\ + -0.077071443, 0.284420639, 0.109496683,\ + 14.169631958, 21.652887344, 20.000000000 "} + + viewk = "" + + for k,v in refatoms.items(): + if all(elem in satoms for elem in v): + viewk = k + break + + pymol.cmd.reinitialize() + + #pymol.finish_launching() + + pymol.cmd.bg_color("white") + pymol.cmd.set("orthoscopic","true") + pymol.cmd.set("ray_shadow","off") + + pymol.cmd.viewport(600,400) + + pymol.cmd.load(ref,"ref") + pymol.cmd.load(structure,"st") + + pymol.cmd.align("st and "+a_atoms,"ref "+a_atoms) + + pymol.cmd.split_states("st") + + pymol.cmd.delete("st") + pymol.cmd.delete("ref") + + pymol.cmd.set_view (views[viewk]) + + pymol.cmd.hide("everything") + pymol.cmd.show("sticks") + pymol.cmd.set("stick_radius",0.05) + pymol.util.cbag() + + pymol.cmd.ray() + pymol.cmd.png(pngf) + pymol.cmd.quit() + +class Option: + def __init__(self,func=str,num=1,default=None,description=""): + self.func = func + self.num = num + self.value = default + self.description = description + def __nonzero__(self): + return self.value != None + def __str__(self): + return self.value and str(self.value) or "" + def setvalue(self,v): + if len(v) == 1: + self.value = self.func(v[0]) + elif isinstance(v,str): + self.value = self.func(v) + else: + self.value = [ self.func(i) for i in v ] + +def main(args): + + options = [ + # options for concat feature + "Input/output options", + ("-f", Option(str, 1, None, "Input trajectory file (.xtc, .trr, ...)")), + ("-t", Option(str, 1, None, "Input topology file (.pdb, .gro, ...)")), + ("-st", Option(int, 1, 1, "Only read every Nth frame")), + ("-sf", Option(int, 1, 0, "First frame (ps) to read from trajectory")), + ("-ef", Option(int, 1, -1, "Last frame (ps) to read from trajectory")), + ("-sn", Option(str, -1, None, "Atoms to show")), + ("-an", Option(str, -1, None, "Atoms for alignment")), + ("-nf", Option(int, 1, 100, "Number of frames in the output")), + ("-l", Option(str, 1, None, "Lipid type = resname")), + ("-o", Option(str, 1, "out.pdb", "Output frames (.pdb)")), + ("-di", Option(str, 1, None, "List of dihedrals")), + ("-r", Option(str, 1, None, "Reference structure (.pdb)")), + ("-so", Option(str, 1, "out.png", "Dihedral structures output figure")) + ] + + # if the user asks for help: pcalipids.py concat -h + if (len(args)>0 and (args[0] == '-h' or args[0] == '--help')) or len(args)==0: + print("\n",__file__[__file__.rfind('/')+1:]) + for thing in options: # print all options for selected feature + print(type(thing) != str and "%10s: %s"%(thing[0],thing[1].description) or thing) + print() + sys.exit() + + options = dict([i for i in options if not type(i) == str]) + + print(args) + while args: + ar = args.pop(0) # choose argument + if options[ar].num == -1: + listOfInputs = "" + while args: + ar1 = args.pop(0) + if ar1 in list(options.keys()): + options[ar].setvalue(listOfInputs) + args.insert(0,ar1) + break + else: + listOfInputs += (ar1+" ") + options[ar].setvalue(listOfInputs) + else: + options[ar].setvalue([args.pop(0) for i in range(options[ar].num)]) # set value + + if not options["-f"].value or not options["-t"].value or not options["-l"].value or not options["-r"].value: + print("Trajectory, structure, reference structure and the lipid resname have to be provided") + return + + print(options["-sn"].value) + + if not options["-sn"].value: + show_atoms = "all" + else: + show_atoms = "name "+options["-sn"].value + + if not options["-an"].value: + ref_atoms = "all" + ref_atoms_pymol = "name *" + else: + ref_atoms = "name "+options["-an"].value + ref_atoms_pymol = "name "+(options["-an"].value).replace(" ","+") + + traj = load_traj(options["-f"].value,\ + options["-t"].value,\ + options["-l"].value,\ + options["-sf"].value,\ + options["-ef"].value,\ + options["-st"].value) + + if options["-di"].value: + parseDihedFile(options["-di"].value, traj) + + ctraj = concat_traj(traj, show_atoms) + atraj = align_traj(ctraj,ref_atoms) + + save_traj(atraj,options["-nf"].value,options["-o"].value) + + print("pymol input") + + showDihed(options["-r"].value,options["-o"].value,ref_atoms_pymol,options["-so"].value) + +if __name__ == '__main__': + args = sys.argv[1:] + main(args)