From 6764d17be27678c083ef1eccc0d9b39b8e12eb41 Mon Sep 17 00:00:00 2001 From: Sergi Date: Thu, 28 Nov 2019 23:35:24 +0100 Subject: [PATCH] README file updated, Git repository restructured, Sequence_handler folder added with sequence analysis tools --- .../__pycache__/ActiveSitepKa.cpython-37.pyc | Bin 4420 -> 0 bytes .../Esterases}/ActiveSitepKa.py | 0 .../Esterases/ActiveSitepKa.pyc | Bin 0 -> 5838 bytes .../Esterases}/Esterase.py | 0 .../Esterases/Esterase.pyc | Bin 0 -> 18803 bytes .../Esterases}/Finders/ActiveSiteFinder.py | 0 .../Esterases}/Finders/Checkmissingligands.py | 0 .../Esterases}/Finders/ReactiveCFinder.py | 0 .../Esterases/PDBOpener.py | 70 +++ .../Esterases/PDBOpener.pyc | Bin 0 -> 2545 bytes .../__pycache__/ActiveSitepKa.cpython-37.pyc | Bin 0 -> 4329 bytes .../__pycache__/Esterase.cpython-37.pyc | Bin 0 -> 13986 bytes .../__pycache__/PDBOpener.cpython-37.pyc | Bin 0 -> 1979 bytes .../Esterases}/storepI.py | 0 .../MD_analysis}/analyse_trajectory.py | 0 .../ML_scripts}/FeatureSelection.py | 0 .../ML_scripts}/ML_tool.py | 0 .../FeatureSelection.cpython-37.pyc | Bin .../PELE_mean_analysis}/PELE&MD_analysis.R | 0 .../PELE_scripts}/PELEBestTrajectories.py | 0 .../PELE_scripts}/PELEFilterResults.py | 0 .../PELE_scripts}/PELEParseReports.py | 0 .../PELE_scripts/PELEParseReports.pyc | Bin 0 -> 1519 bytes .../PELE_scripts/PELEPlot.png | Bin 0 -> 78235 bytes .../PELE_scripts}/PELEPlot3.py | 0 .../PELE_scripts}/PELEStoreResults.py | 0 .../PELEParseReports.cpython-36.pyc | Bin 0 -> 1261 bytes .../PELEParseReports.cpython-37.pyc | Bin 1202 -> 1265 bytes .../PELEStoreResults.cpython-37.pyc | Bin .../PELE_scripts}/report_1.out | 0 .../PELE_scripts}/report_2.out | 0 .../Preprocessing}/PDBProcessor4PELE.py | 0 .../Preprocessing/PDBProcessor4PELE.pyc | Bin 0 -> 3716 bytes .../Preprocessing}/PlopRotTemp.py | 0 .../ProteinPreparationSystem.py | 67 +-- .../PDBProcessor4PELE.cpython-37.pyc | Bin 0 -> 2716 bytes .../Protein_Mutator}/BindingSiteIsolator.py | 0 .../Protein_Mutator}/MutateScore.py | 0 .../Protein_Mutator}/ProteinMutator.py | 0 .../Sequence_handler/FASTA_Q.py | 460 ++++++++++++++++++ .../Sequence_handler/FASTA_Q.pyc | Bin 0 -> 24778 bytes .../Sequence_handler/P.aln | 4 + .../Sequence_handler/P1.fasta | 2 + .../Sequence_handler/P2.fasta | 2 + .../Sequence_handler/Sequence_handler.py | 102 ++++ .../__pycache__/FASTA_Q.cpython-36.pyc | Bin 0 -> 20431 bytes .../Sequence_handler/hey.fasta | 20 + README.md | 75 ++- 48 files changed, 766 insertions(+), 36 deletions(-) delete mode 100644 Esterases/__pycache__/ActiveSitepKa.cpython-37.pyc rename {Esterases => PELEAnalysis-Processing/Esterases}/ActiveSitepKa.py (100%) create mode 100644 PELEAnalysis-Processing/Esterases/ActiveSitepKa.pyc rename {Esterases => PELEAnalysis-Processing/Esterases}/Esterase.py (100%) create mode 100644 PELEAnalysis-Processing/Esterases/Esterase.pyc rename {Esterases => PELEAnalysis-Processing/Esterases}/Finders/ActiveSiteFinder.py (100%) rename {Esterases => PELEAnalysis-Processing/Esterases}/Finders/Checkmissingligands.py (100%) rename {Esterases => PELEAnalysis-Processing/Esterases}/Finders/ReactiveCFinder.py (100%) create mode 100644 PELEAnalysis-Processing/Esterases/PDBOpener.py create mode 100644 PELEAnalysis-Processing/Esterases/PDBOpener.pyc create mode 100644 PELEAnalysis-Processing/Esterases/__pycache__/ActiveSitepKa.cpython-37.pyc create mode 100644 PELEAnalysis-Processing/Esterases/__pycache__/Esterase.cpython-37.pyc create mode 100644 PELEAnalysis-Processing/Esterases/__pycache__/PDBOpener.cpython-37.pyc rename {Esterases => PELEAnalysis-Processing/Esterases}/storepI.py (100%) rename {MD_analysis => PELEAnalysis-Processing/MD_analysis}/analyse_trajectory.py (100%) rename {ML_scripts => PELEAnalysis-Processing/ML_scripts}/FeatureSelection.py (100%) rename {ML_scripts => PELEAnalysis-Processing/ML_scripts}/ML_tool.py (100%) rename {ML_scripts => PELEAnalysis-Processing/ML_scripts}/__pycache__/FeatureSelection.cpython-37.pyc (100%) rename {PELE_mean_analysis => PELEAnalysis-Processing/PELE_mean_analysis}/PELE&MD_analysis.R (100%) rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/PELEBestTrajectories.py (100%) rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/PELEFilterResults.py (100%) rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/PELEParseReports.py (100%) create mode 100644 PELEAnalysis-Processing/PELE_scripts/PELEParseReports.pyc create mode 100644 PELEAnalysis-Processing/PELE_scripts/PELEPlot.png rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/PELEPlot3.py (100%) rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/PELEStoreResults.py (100%) create mode 100644 PELEAnalysis-Processing/PELE_scripts/__pycache__/PELEParseReports.cpython-36.pyc rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/__pycache__/PELEParseReports.cpython-37.pyc (78%) rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/__pycache__/PELEStoreResults.cpython-37.pyc (100%) rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/report_1.out (100%) rename {PELE_scripts => PELEAnalysis-Processing/PELE_scripts}/report_2.out (100%) rename {Preprocessing => PELEAnalysis-Processing/Preprocessing}/PDBProcessor4PELE.py (100%) create mode 100644 PELEAnalysis-Processing/Preprocessing/PDBProcessor4PELE.pyc rename {Preprocessing => PELEAnalysis-Processing/Preprocessing}/PlopRotTemp.py (100%) rename {Preprocessing => PELEAnalysis-Processing/Preprocessing}/ProteinPreparationSystem.py (75%) create mode 100644 PELEAnalysis-Processing/Preprocessing/__pycache__/PDBProcessor4PELE.cpython-37.pyc rename {Protein_Mutator => PELEAnalysis-Processing/Protein_Mutator}/BindingSiteIsolator.py (100%) rename {Protein_Mutator => PELEAnalysis-Processing/Protein_Mutator}/MutateScore.py (100%) rename {Protein_Mutator => PELEAnalysis-Processing/Protein_Mutator}/ProteinMutator.py (100%) create mode 100644 PELEAnalysis-Processing/Sequence_handler/FASTA_Q.py create mode 100644 PELEAnalysis-Processing/Sequence_handler/FASTA_Q.pyc create mode 100644 PELEAnalysis-Processing/Sequence_handler/P.aln create mode 100644 PELEAnalysis-Processing/Sequence_handler/P1.fasta create mode 100644 PELEAnalysis-Processing/Sequence_handler/P2.fasta create mode 100644 PELEAnalysis-Processing/Sequence_handler/Sequence_handler.py create mode 100644 PELEAnalysis-Processing/Sequence_handler/__pycache__/FASTA_Q.cpython-36.pyc create mode 100644 PELEAnalysis-Processing/Sequence_handler/hey.fasta diff --git a/Esterases/__pycache__/ActiveSitepKa.cpython-37.pyc b/Esterases/__pycache__/ActiveSitepKa.cpython-37.pyc deleted file mode 100644 index 8e3edf16c52dcac124d6567c6ce2f36bb59e326d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4420 zcmb_f&u<&Y72erhQY(^@EK9a*$8ol<6GTo$#c|-Yf$Lhf)s$@{3z7`i+Zx*yXC%zV*`k!iNGq@e&k0^k5Wlzc))#v=Ijl(j|A^{MdQ# z&6}C;o4GMIR?zS~yO7-f=W$K@2Nn8{fy{Nhauo^JIIC$+CYi%jS$A|L4aZQ@bWA04 zPM+(|2sa!Ha+I4+;WLfrc>b}*^ZU9}npGSU#TdID9kMaV(wRn-2AV>KaABQaP33z%eHJZQis$_&7k~-d-c;)*@5|(JL zmgq=Xpdp26q=rgOmFBnxMf$Q}_T;jpYZwc8Nag ze^RB0(L<7674|$biS~ek%9dxDpgDmUg-`>_k})dM3O|Ea(wu2VdxW$j9{-zS6Mf#G zxQM2A@b(o?km8{jzhZzKRGuG0hCIiMMe;!3G_o-mg2p69D6x=yyU|o{RxY5mZ!@nV zS{axk9n@Qy`a8nK+3)oZ>*%cuk#>L$!3{EcQk&7ZIinpirbPzN?L*$x8VN&$QDb78 zvW}4$2f0IykL>7jy_dIkbn(Y1e}E06`ckf-a&OSyuzNj=(DLVAz632_Mbh)2|JBLy<4JBOFTUZ& zI&AlO!uZsV@q`II!I=4!s)JN@zmAGYj!*Lwq-UQ+C6rF`nXI%$*2YkCil3$$er85H z`g%sYs`0nT5_BIVeT@e{P~#MQJgfYFuDm(H-yZVq9DgS(>4YhWh&!?S{B9N}o8rWO zgr#%d`x~Zt-P`f)Xxq23uiWHU3j2YZ)fG{w#IdrO zxqPXuzbo7N+;02i&9L5#BQ`#9-`37{O(@S*!WHY~Kp)Rv4=( zps4p+>>&Du{kwbf%lA{(a*UQQ+hbM4Nv(vr%jHY$bIn$?9X4#~M{yI-J?J?%7lSlX z)^POYustd2_Qi7656}+Z+WB{78SCihP=ftvUUO1 zdJ{4r2O?Suup)=QVpale3nv+(he+`eXZw1`*b|8XaDC7*6O#x-!J!GrJ{u888h}n6 zEjUMI@I)y*aFr?e!WjAl82{YX;i=MSNk zPwcZD2DtxnC<>sVqmd)8J+Krdd`Y=Ce|MUWh)1z}P0Lkn_v!A_yV)_)+Pe^qChVX< zW5X;=cZ!LAP)v$^^0cDsCv5jCMFOQnKcr*k7(Wggn2INGz8TPf7ln0zfbWS6VbuxD zrZXXJ|EhwI9xGIAPlPepBHG4=@`OJGlK%$|=tCOhfSbNA9Sj|+0Q%U811cEO-p^KO zzuKX&8*zQZ7ofRKUl2X@>89!d6|uP;e*e;k_OmZ$2R=Kxh`N*5@m;!PImX)JYIlZ;bRKr}+n;sM zQRzKO%9LE8dIOyAm<#K-m%4Oh7AGlri;^iM%d_KxIw&j^bo~)@MivBIX^sv8O+h9d zQ|^ikD+%yql;$&{O7mV5$jTkF?t6{wtXs+;w73xO(Itp(J>nBmVqwiF&=eO*Kid<; z3n^g_*NBHQ2d zt8wJxD1`Z}``}kD`_o&kc~XLHcVpbc0#H`#Cxh7(;9${E3mF|R_jfVx9RNs0v$8yE zh!5b0xJn7J;~Op#qdgF4R{n&KB=M_eS{Q$OjK(`?U7jt{eXZfueb-G3u3J|(K;%oV zyBmA8tVN8Yf2xiuzKB}t)+OkMqE~2OOf;0Jdm4q2CRdUsu$)!O(a*YK%?WCo zEr}mPqy|_z)rBwU?&X+UwQ$49VXrq^YTc2GUW}j$*L8}n`_LCM2pcGj!*>thffsje n*BNzP9~Cv%Rr-hgQSOmbsdY6Q?lt0kN$!Dx>1Pn@;-~)?7pz3l diff --git a/Esterases/ActiveSitepKa.py b/PELEAnalysis-Processing/Esterases/ActiveSitepKa.py similarity index 100% rename from Esterases/ActiveSitepKa.py rename to PELEAnalysis-Processing/Esterases/ActiveSitepKa.py diff --git a/PELEAnalysis-Processing/Esterases/ActiveSitepKa.pyc b/PELEAnalysis-Processing/Esterases/ActiveSitepKa.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d94604af7252df27446d989bb0e4f87a1ccc761 GIT binary patch literal 5838 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 HzLkFgA46|& literal 0 HcmV?d00001 diff --git a/Esterases/Esterase.py b/PELEAnalysis-Processing/Esterases/Esterase.py similarity index 100% rename from Esterases/Esterase.py rename to PELEAnalysis-Processing/Esterases/Esterase.py diff --git a/PELEAnalysis-Processing/Esterases/Esterase.pyc b/PELEAnalysis-Processing/Esterases/Esterase.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0314600b651bc62f924c92659e17c39e5e3a33ea GIT binary patch literal 18803 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 literal 0 HcmV?d00001 diff --git a/PELEAnalysis-Processing/Esterases/__pycache__/ActiveSitepKa.cpython-37.pyc b/PELEAnalysis-Processing/Esterases/__pycache__/ActiveSitepKa.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5003bd1f98fa0a00497627ad0f57f8fd55854bdb GIT binary patch literal 4329 zcmb_f&2QYs73Yw<6!$}tKNNq}Etu2}qO{tzY&R_o*RX7>>9&z9NHSb68W7aZNTS7E zu7;$oT~H@EC=e8d{{SDP9s;EQhHt&~7VuP{K!LsV*h5gj{k`EXwKn3QZOUD~nRzqw z-kUd^-+Oasa$@trNs-)(#IMva`TzS%>%tz=4?%yoftr#wj9rZt_iv2*{cD6d1!y)2a>=1 zGVB}kwJZH|A$8Scz+Im@M0k56Y}G{AqS>P-w{Zm=p^;s%iE;gz)-*(c8@%vLJ7CQs z>dFq(P1Gm2rT7!P#LF0K@d~e^Eb&P`g|f`2Vd;s~=>FPmkrH~S)bZZM8-4(iutamT zLseOWS$pEc8x1Bs5aa_>%hGONM`jufHCW06i~tW^=leiWwD zS+m=4HUpmvKAHkX+!?ZF@-c2J@}3AM^dd29q=iuUo2fyHDq||X)MOQweEs|ScF-1e z<>dOkpcS`8CkpFJYc0p?ICs3jg96!hBd--Y4;Jp!mjWL9VpupIz5mnt%Hk)B3mw<* zgF)L$9;-R{mlb3F(F+tS=}_*I+1|QS0_n%YjxeavXevT1Wryy+Tn!p%$ExNovv;e;#j0d#M@y36c&!{bzy;nDZ9F z6?FXo??~`82_EzPYYNCfW%&tI$a1{+cpmFpMz#h+(wgK15ewv-m8N>P@k8{EbehVe zja*d`eI!DuO5iTeeyi`ZeZ6-v(hhM@NaY#rh%qfPxN(5;q1L&?;912f5C=U)RTd7w zeWX2Soh!f5)O=ITEb4~OkfeODh^6;{vJ&v1v-o*}Xrq`1j)N(s#oSBMA{Xb7WO+OtkGr_EQ(QU`K(y0qZzG zi0WjsJ3RWwy6-<&UwN>e%gfZ}%^|2kFZWu}H?Qfb7i}xyxevGv2OO)&q40*i4ja5M z5WZ+(9WA>H$jZc`18#|g*Rk;@TQjW0g5lNIgpFYIzY{l_H552<+^nupUXlJ(wlmk} z?aQG(x7$B+H)wa`NbOm}e&YJE2y3-kKgz~oDRw7_U@(mIeZgz?dN69)USx0KZTUeb z`zo*?KX^*Qr052K{6O|@*xOOm4R6%z7`q*B)LKEi{#bNE(bp ztUXv-T3CH#-~WZZ{>#Riy|TJ^uW@(1aX*WD145ty;qHLYZtxBf0>A-5T*{ojzWk$p znRc|>AWsaYsq_0p-UI1dnISvw@@zHLgD^G29->KG!F*cm;yaGgg4pvwgRbbLCOBN| zr3Q5rH~qkkBthXZrp^{saA=m*KnkMsWA&>|3mk{eWLogOj(8)8q-N$7$^ydcAlfNQ z*VzeH)lFvMH)WLBd#sFFf$557d94_Utq9Ygo#fK9~TF8RN zT4i3zS_Ww@?wk7)yB7(}AejyI9|L+-N&VCA3qGl8FUI8`7LN$N$8?NwhI%rN(q-+J z_REoZIFS?+>zu}?PHTyol(HH?ej+K4>PL{urw`Z;1Gs-a=7kd~7$DoDHK49Nwp1wi zoN8|$cb?L@V_&`@<)*g#V)wpX%?s4j?|(d?8g z&q|srDZP~>YI$}_zDo^4TS1*p_?yMR-k z7TUt?WNBzM!_CSqQsYr`T z!JDW$wJf}??TsLo>PS3-oRHS5&6JHQ(DW+%nJO)Xskhm6c8T5A3%DtqVl#UG6yfRX zB63`%XhjZEi7+`S(GImEq_Zd)mFjM)_hr5xjmQ>zqJ^V}{0E!a76_I+9PMq(cf$~& zb2rA#$wSQU{Wza05m04EeZ`n~ZFGeBFz%CxZX+MPjKqOfDQ|+jCCx7lQJ~xS9R`K8 ziJED#{v<6q?^~X&&|RwIwuR%QWyfi&TN~P95#_97|n z9@`>+PECqPV?^Dd$dfcSBuSQTS=A!_ta+;@sSkD-2+{bYg`_Z^7PkCgBQ4^TcYE?G zabTSr!=n<`RUGGukf9fJ(3pbRE?@&MuEq|o%#HxVcN`^p%oJrA*^^o~vz6YWAg_!% OhY)KS1%z7s^nU{=k~8T5 literal 0 HcmV?d00001 diff --git a/PELEAnalysis-Processing/Esterases/__pycache__/Esterase.cpython-37.pyc b/PELEAnalysis-Processing/Esterases/__pycache__/Esterase.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..adc41473851c79fb24cd2b8a94bed68dc5b11bb6 GIT binary patch literal 13986 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 SoF%V-utfEI$Nt>rjeh`6{V);$ literal 0 HcmV?d00001 diff --git a/Esterases/storepI.py b/PELEAnalysis-Processing/Esterases/storepI.py similarity index 100% rename from Esterases/storepI.py rename to PELEAnalysis-Processing/Esterases/storepI.py diff --git a/MD_analysis/analyse_trajectory.py b/PELEAnalysis-Processing/MD_analysis/analyse_trajectory.py similarity index 100% rename from MD_analysis/analyse_trajectory.py rename to PELEAnalysis-Processing/MD_analysis/analyse_trajectory.py diff --git a/ML_scripts/FeatureSelection.py b/PELEAnalysis-Processing/ML_scripts/FeatureSelection.py similarity index 100% rename from ML_scripts/FeatureSelection.py rename to PELEAnalysis-Processing/ML_scripts/FeatureSelection.py diff --git a/ML_scripts/ML_tool.py b/PELEAnalysis-Processing/ML_scripts/ML_tool.py similarity index 100% rename from ML_scripts/ML_tool.py rename to PELEAnalysis-Processing/ML_scripts/ML_tool.py diff --git a/ML_scripts/__pycache__/FeatureSelection.cpython-37.pyc b/PELEAnalysis-Processing/ML_scripts/__pycache__/FeatureSelection.cpython-37.pyc similarity index 100% rename from ML_scripts/__pycache__/FeatureSelection.cpython-37.pyc rename to PELEAnalysis-Processing/ML_scripts/__pycache__/FeatureSelection.cpython-37.pyc diff --git a/PELE_mean_analysis/PELE&MD_analysis.R b/PELEAnalysis-Processing/PELE_mean_analysis/PELE&MD_analysis.R similarity index 100% rename from PELE_mean_analysis/PELE&MD_analysis.R rename to PELEAnalysis-Processing/PELE_mean_analysis/PELE&MD_analysis.R diff --git a/PELE_scripts/PELEBestTrajectories.py b/PELEAnalysis-Processing/PELE_scripts/PELEBestTrajectories.py similarity index 100% rename from PELE_scripts/PELEBestTrajectories.py rename to PELEAnalysis-Processing/PELE_scripts/PELEBestTrajectories.py diff --git a/PELE_scripts/PELEFilterResults.py b/PELEAnalysis-Processing/PELE_scripts/PELEFilterResults.py similarity index 100% rename from PELE_scripts/PELEFilterResults.py rename to PELEAnalysis-Processing/PELE_scripts/PELEFilterResults.py diff --git a/PELE_scripts/PELEParseReports.py b/PELEAnalysis-Processing/PELE_scripts/PELEParseReports.py similarity index 100% rename from PELE_scripts/PELEParseReports.py rename to PELEAnalysis-Processing/PELE_scripts/PELEParseReports.py diff --git a/PELEAnalysis-Processing/PELE_scripts/PELEParseReports.pyc b/PELEAnalysis-Processing/PELE_scripts/PELEParseReports.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7554f79ef38f6725ceba6d2cc6650835fa1c9eb GIT binary patch literal 1519 zcmd5*!EPHj5FM^0HxVqvaFL|F6g(ucF0n323m8EVr554YvL^e!b+S&gL)*iK7$0p zV={932`B)j0*(a;{!XAs;5dnAWH;cr0eJ)d061>)=|Q(iH_b;HT|pME(NtNJxm>4( zLG4u$_A-vMLVtGto#XvY#u#9pz`27N!1l=)<_$oA3BarY9|X*sfC6Sswu#r91pF?C zr0|oZ_PLuk;qHqa3vhmK>GJl;k1%h+EP+V_W-Z1LZ%^RpZ3m7RHMxTN7vwE?u`?4e zpBI!HXz((BTBB-_bS`;qfg8QfG$WmRzz zOlY?yjs5F$Er9$JZ zRHv?@Foc`A=~UUAh+7I$!`0aj2d@u@drPTD>=-^zbA^gHU{w~Hb5@J&8BNs!EK`Xh zaL}kyD0Ozd9!p9X66tF)Y(`{5^@ZvenvRsWB={CdgJ-PSqBapvZdBaJ@8{JjEgRB0 zlp|N!e6zYw8w2m1|5CXt7fG`q^|Zu`O~bFG%WnbsF^mg$iVZRf5}$V$(neF2rM5Y? zX}6>%!1PQPWxS=&4K6VFxn1v`czID- z+sV3UiMHq@-4>liP1AH#VdZt24%r{Mv@Q&}KEn=8Uy}c>6}UlEpG>3DPdT^1U9=`v H#cJ{iCP$h0 literal 0 HcmV?d00001 diff --git a/PELEAnalysis-Processing/PELE_scripts/PELEPlot.png b/PELEAnalysis-Processing/PELE_scripts/PELEPlot.png new file mode 100644 index 0000000000000000000000000000000000000000..02ab2c58fb8856d42c2ab2781c590ce776fa5c3f GIT binary patch literal 78235 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 abNtFxZ_>jrKkCVEv~a6%rJxEElm6dZ>!6_k literal 0 HcmV?d00001 diff --git a/Preprocessing/PlopRotTemp.py b/PELEAnalysis-Processing/Preprocessing/PlopRotTemp.py similarity index 100% rename from Preprocessing/PlopRotTemp.py rename to PELEAnalysis-Processing/Preprocessing/PlopRotTemp.py diff --git a/Preprocessing/ProteinPreparationSystem.py b/PELEAnalysis-Processing/Preprocessing/ProteinPreparationSystem.py similarity index 75% rename from Preprocessing/ProteinPreparationSystem.py rename to PELEAnalysis-Processing/Preprocessing/ProteinPreparationSystem.py index cededd9..e643739 100644 --- a/Preprocessing/ProteinPreparationSystem.py +++ b/PELEAnalysis-Processing/Preprocessing/ProteinPreparationSystem.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -# Imports +# Global imports import os,sys import glob import argparse as ap @@ -29,38 +29,39 @@ def filename(self): return self.__filename def storePDBfilenames(PDBs_to_parse, parser): - """It identifies the PDB files to add to the ProteinPreparationSystem tool + """ + It identifies the PDB files to add to the ProteinPreparationSystem tool - PARAMETERS - ---------- - PDBs_to_parse : list of strings - all the PDB files that want to be added to the analysis + PARAMETERS + ---------- + PDBs_to_parse : list of strings + all the PDB files that want to be added to the analysis - RETURNS - ------- - parsed_data : list of PDB filenames (strings) - """ + RETURNS + ------- + parsed_data : list of PDB filenames (strings) + """ - PDBs = [] + PDBs = [] - for PDB_list in PDBs_to_parse: - PDB_found = glob.glob(PDB_list) - if len(PDB_found) == 0: - print("Warning: path to PDB file \'" + - "{}".format(PDB_list) + "\' not found.") - for PDB in PDB_found: - PDBs.append(PDB) + for PDB_list in PDBs_to_parse: + PDB_found = glob.glob(PDB_list) + if len(PDB_found) == 0: + print("Warning: path to PDB file \'" + + "{}".format(PDB_list) + "\' not found.") + for PDB in PDB_found: + PDBs.append(PDB) - if len(PDBs) == 0: - print("Error: list of PDB files is empty.") - parser.print_help() - exit(1) + if len(PDBs) == 0: + print("Error: list of PDB files is empty.") + parser.print_help() + exit(1) - return PDBs + return PDBs def parseArgs(self): - - """Parse arguments from command-line + """ + Parse arguments from command-line RETURNS ------- @@ -68,7 +69,7 @@ def parseArgs(self): list of PDB files pH : float specific value of the pH of the system - JP : int (0,1) + JP : int (0,1) Binary value to indicate if HETATM wants to be erased """ @@ -89,8 +90,8 @@ def parseArgs(self): return self.__filename,float(self.__pH),self.__JP def ProteinPreparationSystem(self, file = None): - - """ Take a PDB file and preparate the protein system using prepwizard of Schrodinger utilities. + """ + Take a PDB file and preparate the protein system using prepwizard of Schrodinger utilities. RETURNS ------- @@ -119,8 +120,8 @@ def ProteinPreparationSystem(self, file = None): os.system("mv %s_modified.pdb %s" % (file[:-4], file)) def preparesystem(self): - - """Main function + """ + Main function It is called when this script is the main program called by the interpreter """ @@ -132,7 +133,7 @@ def preparesystem(self): if __name__ == "__main__": """Call the main function""" - PDB_file = Protein() - PDB_file.parseArgs() - PDB_file.preparesystem() + PDB_file = Protein() + PDB_file.parseArgs() + PDB_file.preparesystem() diff --git a/PELEAnalysis-Processing/Preprocessing/__pycache__/PDBProcessor4PELE.cpython-37.pyc b/PELEAnalysis-Processing/Preprocessing/__pycache__/PDBProcessor4PELE.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..463061734610be0b982dec047558253454b09a70 GIT binary patch literal 2716 zcmai0OK%%D5ax1MtJT9wVmObcML`5eQWdtGra=n?MG-qz;1ux#wo?NFg2h^->`hj? zGD*euc2%Hpdnu4xk3Go89NIsTf5B@{zVrta1=1l`vSR~nDJ;q1aLD2Cn~$2Gm?$GC zKm3+GyIw))4=s!fhRy@{L<=g4s1>1B-dZio$hc)w+;XVhDnRQ}r&Xi{>i&pY9xYN2 z+7d0%GPGq{p;c%rtV$?wS>MMk|$BZ>DxCV zwLfdzNv{d5YVd>xkybGAU`ww=!2S;N8+oJYFUH8O^C6@wcVLXRa0DT`&;37H^rhmqBVdD00ZEhQwNR5zpXRi3n& z5DCAx+I-RkMG}?E1j_2%+T2oeqq(+j#F>+lYZvB)FB88PaKXrZ5`{vNq(g+{VZ1HO z9KFi90)ZTFJa%X&kYq22rS@ryY46yHe?c5X2O<=?M{CWEr)$e++%fwYAE-|Q8NBDo z_{?$8g>!#0a;$DFI7A7hA8rOb25;|^ULbe${$m?*JH_7((&}vzCz5oMeoPzbjV9*_ zKRxPrvLK-#tlN_ZjbpuTy{Me+DA`hW#9~$GK|rK(I|=Uw&<4F8i>WG`VSk53J>{_d zP}W^F0V|#cRk`L|TseAJc~JX0%BrM$#wTS%_YL9~Vb{NYncYdcY}R0Qb|Go^y8r<( zyR_c+!`Pn>lQ7PG2;0JcIyXPNl+b>}Mvec)tuJRa0_H{`pBVuI;`8t0ob__}m{|++ zXTj9y9jHq}CY*tr8h+*~Cc#;89V#^8;IdV=sus4Upq<23%hNy1^_;ezqKgAx2|kl# zkDw#bb4VqMUt0r|p&=v_q?nai&u!{xGN482P*2mq>mnoy(up#_(#`PmVulX!08$T< zrIJRg2E75_&VxldJn52l((MK@or%Jj{WtL7SR%*68N82k0n|CjjW)fz-sWLXlD^0R z-i}xhpFmCk%s4SQD8g<(3S^kXbxT!%c8nc}=_F^n{g8wGiO(sX3De@tOc?k2a--!u zdi3$5c-g<{DMOcvg2fkUip;p;C^~R<*35n^%{#rev&PXK@Ea zQG*JVss5YI3ZnQBL*LGTUuoed{DB^G4>3jq z3mE$6%mS``rGYTCXz|FR-V2+51I&wQ$uRG<(UeD;&Z%YD3hzl}!wYi^!n@RgUb*EyTv={D+)&Qk z#>!I5U2Ja5Z7ik5#k+(ot}Lbn-X%9hdb#@&nlo#H3>@kt5D(>aLg3hfIjSnOqeL); z6QNvjASCP79aV+o^v9f(O9>CRLtwvL8oR3;%>(CgTGQsI+_wPG69g($x&@q815T>} zXdUY#XfFb6U96d{X7SHq&Iz;WzY#Wk2EGJ35*?xe+MhCiAgTik9)3$d?z`2^{ErJx z+e-o5Pp2QZH9_RJq91&?Xn0(K8TNKq3~ww9C@b7#W9K9$7h0s}uTo(?{??F#_zOQw@U!UMJFu?UWl?RD$ zGMwuNK$U$z=*yji`@X99K7doenLw!J))H1=T3Paa2FpdhZ#cz}fN}0*GySxH_LNRc k&v1(O72GAfbYE*1#5JhQE8{qDKk#$CkG(06coh%-0~hM(LI3~& literal 0 HcmV?d00001 diff --git a/Protein_Mutator/BindingSiteIsolator.py b/PELEAnalysis-Processing/Protein_Mutator/BindingSiteIsolator.py similarity index 100% rename from Protein_Mutator/BindingSiteIsolator.py rename to PELEAnalysis-Processing/Protein_Mutator/BindingSiteIsolator.py diff --git a/Protein_Mutator/MutateScore.py b/PELEAnalysis-Processing/Protein_Mutator/MutateScore.py similarity index 100% rename from Protein_Mutator/MutateScore.py rename to PELEAnalysis-Processing/Protein_Mutator/MutateScore.py diff --git a/Protein_Mutator/ProteinMutator.py b/PELEAnalysis-Processing/Protein_Mutator/ProteinMutator.py similarity index 100% rename from Protein_Mutator/ProteinMutator.py rename to PELEAnalysis-Processing/Protein_Mutator/ProteinMutator.py diff --git a/PELEAnalysis-Processing/Sequence_handler/FASTA_Q.py b/PELEAnalysis-Processing/Sequence_handler/FASTA_Q.py new file mode 100644 index 0000000..12996ce --- /dev/null +++ b/PELEAnalysis-Processing/Sequence_handler/FASTA_Q.py @@ -0,0 +1,460 @@ +# -*- coding: utf-8 -*- + +import re,sys # Imports the required modules to build the functions for the python tool. The +# re module is used for the checking functions and the adaptor-removal operation. The sys module +# is used to work with the command line arguments. + +Blosum = {('W', 'F'): 1, ('L', 'R'): -2, ('S', 'P'): -1, ('V', 'T'): 0, ('Q', 'Q'): 5, ('N', 'A'): -2, ('Z', 'Y'): -2, ('W', 'R'): -3, ('Q', 'A'): -1, ('S', 'D'): 0, ('H', 'H'): 8, ('S', 'H'): -1, ('H', 'D'): -1, ('L', 'N'): -3, ('W', 'A'): -3, ('Y', 'M'): -1, ('G', 'R'): -2, ('Y', 'I'): -1, ('Y', 'E'): -2, ('B', 'Y'): -3, ('Y', 'A'): -2, ('V', 'D'): -3, ('B', 'S'): 0, ('Y', 'Y'): 7, ('G', 'N'): 0, ('E', 'C'): -4, ('Y', 'Q'): -1, ('Z', 'Z'): 4, ('V', 'A'): 0, ('C', 'C'): 9, ('M', 'R'): -1, ('V', 'E'): -2, ('T', 'N'): 0, ('P', 'P'): 7, ('V', 'I'): 3, ('V', 'S'): -2, ('Z', 'P'): -1, ('V', 'M'): 1, ('T', 'F'): -2, ('V', 'Q'): -2, ('K', 'K'): 5, ('P', 'D'): -1, ('I', 'H'): -3, ('I', 'D'): -3, ('T', 'R'): -1, ('P', 'L'): -3, ('K', 'G'): -2, ('M', 'N'): -2, ('P', 'H'): -2, ('F', 'Q'): -3, ('Z', 'G'): -2, ('X', 'L'): -1, ('T', 'M'): -1, ('Z', 'C'): -3, ('X', 'H'): -1, ('D', 'R'): -2, ('B', 'W'): -4, ('X', 'D'): -1, ('Z', 'K'): 1, ('F', 'A'): -2, ('Z', 'W'): -3, ('F', 'E'): -3, ('D', 'N'): 1, ('B', 'K'): 0, ('X', 'X'): -1, ('F', 'I'): 0, ('B', 'G'): -1, ('X', 'T'): 0, ('F', 'M'): 0, ('B', 'C'): -3, ('Z', 'I'): -3, ('Z', 'V'): -2, ('S', 'S'): 4, ('L', 'Q'): -2, ('W', 'E'): -3, ('Q', 'R'): 1, ('N', 'N'): 6, ('W', 'M'): -1, ('Q', 'C'): -3, ('W', 'I'): -3, ('S', 'C'): -1, ('L', 'A'): -1, ('S', 'G'): 0, ('L', 'E'): -3, ('W', 'Q'): -2, ('H', 'G'): -2, ('S', 'K'): 0, ('Q', 'N'): 0, ('N', 'R'): 0, ('H', 'C'): -3, ('Y', 'N'): -2, ('G', 'Q'): -2, ('Y', 'F'): 3, ('C', 'A'): 0, ('V', 'L'): 1, ('G', 'E'): -2, ('G', 'A'): 0, ('K', 'R'): 2, ('E', 'D'): 2, ('Y', 'R'): -2, ('M', 'Q'): 0, ('T', 'I'): -1, ('C', 'D'): -3, ('V', 'F'): -1, ('T', 'A'): 0, ('T', 'P'): -1, ('B', 'P'): -2, ('T', 'E'): -1, ('V', 'N'): -3, ('P', 'G'): -2, ('M', 'A'): -1, ('K', 'H'): -1, ('V', 'R'): -3, ('P', 'C'): -3, ('M', 'E'): -2, ('K', 'L'): -2, ('V', 'V'): 4, ('M', 'I'): 1, ('T', 'Q'): -1, ('I', 'G'): -4, ('P', 'K'): -1, ('M', 'M'): 5, ('K', 'D'): -1, ('I', 'C'): -1, ('Z', 'D'): 1, ('F', 'R'): -3, ('X', 'K'): -1, ('Q', 'D'): 0, ('X', 'G'): -1, ('Z', 'L'): -3, ('X', 'C'): -2, ('Z', 'H'): 0, ('B', 'L'): -4, ('B', 'H'): 0, ('F', 'F'): 6, ('X', 'W'): -2, ('B', 'D'): 4, ('D', 'A'): -2, ('S', 'L'): -2, ('X', 'S'): 0, ('F', 'N'): -3, ('S', 'R'): -1, ('W', 'D'): -4, ('V', 'Y'): -1, ('W', 'L'): -2, ('H', 'R'): 0, ('W', 'H'): -2, ('H', 'N'): 1, ('W', 'T'): -2, ('T', 'T'): 5, ('S', 'F'): -2, ('W', 'P'): -4, ('L', 'D'): -4, ('B', 'I'): -3, ('L', 'H'): -3, ('S', 'N'): 1, ('B', 'T'): -1, ('L', 'L'): 4, ('Y', 'K'): -2, ('E', 'Q'): 2, ('Y', 'G'): -3, ('Z', 'S'): 0, ('Y', 'C'): -2, ('G', 'D'): -1, ('B', 'V'): -3, ('E', 'A'): -1, ('Y', 'W'): 2, ('E', 'E'): 5, ('Y', 'S'): -2, ('C', 'N'): -3, ('V', 'C'): -1, ('T', 'H'): -2, ('P', 'R'): -2, ('V', 'G'): -3, ('T', 'L'): -1, ('V', 'K'): -2, ('K', 'Q'): 1, ('R', 'A'): -1, ('I', 'R'): -3, ('T', 'D'): -1, ('P', 'F'): -4, ('I', 'N'): -3, ('K', 'I'): -3, ('M', 'D'): -3, ('V', 'W'): -3, ('W', 'W'): 11, ('M', 'H'): -2, ('P', 'N'): -2, ('K', 'A'): -1, ('M', 'L'): 2, ('K', 'E'): 1, ('Z', 'E'): 4, ('X', 'N'): -1, ('Z', 'A'): -1, ('Z', 'M'): -1, ('X', 'F'): -1, ('K', 'C'): -3, ('B', 'Q'): 0, ('X', 'B'): -1, ('B', 'M'): -3, ('F', 'C'): -2, ('Z', 'Q'): 3, ('X', 'Z'): -1, ('F', 'G'): -3, ('B', 'E'): 1, ('X', 'V'): -1, ('F', 'K'): -3, ('B', 'A'): -2, ('X', 'R'): -1, ('D', 'D'): 6, ('W', 'G'): -2, ('Z', 'F'): -3, ('S', 'Q'): 0, ('W', 'C'): -2, ('W', 'K'): -3, ('H', 'Q'): 0, ('L', 'C'): -1, ('W', 'N'): -4, ('S', 'A'): 1, ('L', 'G'): -4, ('W', 'S'): -3, ('S', 'E'): 0, ('H', 'E'): 0, ('S', 'I'): -2, ('H', 'A'): -2, ('S', 'M'): -1, ('Y', 'L'): -1, ('Y', 'H'): 2, ('Y', 'D'): -3, ('E', 'R'): 0, ('X', 'P'): -2, ('G', 'G'): 6, ('G', 'C'): -3, ('E', 'N'): 0, ('Y', 'T'): -2, ('Y', 'P'): -3, ('T', 'K'): -1, ('A', 'A'): 4, ('P', 'Q'): -1, ('T', 'C'): -1, ('V', 'H'): -3, ('T', 'G'): -2, ('I', 'Q'): -3, ('Z', 'T'): -1, ('C', 'R'): -3, ('V', 'P'): -2, ('P', 'E'): -1, ('M', 'C'): -1, ('K', 'N'): 0, ('I', 'I'): 4, ('P', 'A'): -1, ('M', 'G'): -3, ('T', 'S'): 1, ('I', 'E'): -3, ('P', 'M'): -2, ('M', 'K'): -1, ('I', 'A'): -1, ('P', 'I'): -3, ('R', 'R'): 5, ('X', 'M'): -1, ('L', 'I'): 2, ('X', 'I'): -1, ('Z', 'B'): 1, ('X', 'E'): -1, ('Z', 'N'): 0, ('X', 'A'): 0, ('B', 'R'): -1, ('B', 'N'): 3, ('F', 'D'): -3, ('X', 'Y'): -1, ('Z', 'R'): 0, ('F', 'H'): -1, ('B', 'F'): -3, ('F', 'L'): 0, ('X', 'Q'): -1, ('B', 'B'): 4} + +# Script information +__author__ = "Sergi Rodà" +__license__ = "GPL" +__version__ = "1.0.1" +__maintainer__ = "Sergi Rodà" +__email__ = "sergi.rodallordes@bsc.es" + +def open_fasta_file(fasta): + """This function takes a simple or multi-FASTA file and returns a list + containing the IDs and the sequences of each DNA chain in the file. + + PARAMETERS + ---------- + fasta : string + filename of a FASTA file + + RETURNS + ------- + File : tuple of strings + the tuple contains the ID of the read/sequence and the DNA sequence + """ + + ID,Sequence,File=[],[],[] + + for line in fasta: # This for loop iterates for all the lines in the FASTA file. It checks + # if the line is the ID of sequence [">" symbol contained] or it is the sequence itself. + if ">" in line: + ID.append(line) + Sequence.append("") + else: + line=line.strip("\n") + Sequence[-1]=Sequence[-1]+line + + for i in range(len(ID)): File.append([ID[i],Sequence[i]]) + + return File + +def open_fastq_file(fastq): + """This function takes a FASTQ file and returns a list containing the IDs,the sequences, + the "+" symbols and the quality of each DNA chain in the file. + + PARAMETERS + ---------- + fastq : string + filename of a FASTQ file + + RETURNS + ------- + File : tuple of strings + the tuple contains the ID of the read/sequence and the + DNA sequence (and the plus and the quality) + """ + + ID, Sequence,plus,quality,File,Counter = [], [], [], [], [], 1 + + for line in fastq: # This for loop iterates for all the lines in the FASTQ file. It goes in a inner 4 + # conditional statements being the first line the ID of the sequence, the second one, the sequence. + # The third and fourth one representing the "+" symbol and the quality of the sequence. + if Counter%4==1: ID.append(line) + elif Counter%4==2: + line = line.strip("\n") + Sequence.append(line) + elif Counter%4==3: plus.append(line) + elif Counter%4==0: + line = line.strip("\n") + quality.append(line) + Counter+=1 + + for i in range(len(ID)): File.append([ID[i],Sequence[i],plus[i],quality[i]]) + + return File + +def reverse_DNA(DNA_string): + """This function takes a DNA string and returns the reverse-complement sequence. It uses the + Nucleotides dictionary to change the nucleotides with and iterative for loop. + + PARAMETERS + ---------- + DNA_string : string + DNA sequence of the FASTA/Q file + + RETURNS + ------- + The reverse-complement of the DNA_string. + """ + + Nucleotides={"A": "T", "T": "A", "G": "C", "C": "G", "N": "N"} + + return "".join(Nucleotides[DNA_string[i]] for i in range(len(DNA_string)-1,-1,-1)) + +def Count_bases_and_percentages(Fasta_q): + """This function takes whether the list of the open_fasta_file or open_fastq_file and + returns the number of bases processed and the relative abundance of each nucleotide. + + PARAMETERS + ---------- + Fasta_q : Tuple of strings + Tuple of properties of the different lines in the FASTA/Q file + + RETURNS + ------- + The total number of bases in the FASTA/Q file and the relative abundance of each nucleotide. + """ + + Bases,Nucleotides=0,{"A":0,"C":0,"G":0,"T":0,"N":0} + for i in range(len(Fasta_q)): + Bases += float(len(Fasta_q[i][1])) + for Nucleotide in Nucleotides: Nucleotides[Nucleotide] += float(Fasta_q[i][1].count(Nucleotide)) + + return "{:,}".format(int(Bases)).replace(",","."),\ + tuple([int((Nucleotides[Nucleotide] / Bases) * 100) for Nucleotide in Nucleotides]) #The "{:,}".format(int(Bases)).replace(",",".") part is used to return the number with . when the number has + # more than 3 digits. What it basically does, it takes the number and replaces the implicit , with a . + # (due to the english format of numbers, which they use ,). The relative abundance of nucleotides must be + # changed to a tuple to later printing it with the % format options. + +def edit_modified_distance_dp(pattern,text): + """This function takes 'pattern' and 'text' nucleotide sequences and compares them forming the DP matrix, + which contains the path of the optimal alignment. It uses a modified version of the edit distance approach, + which contemplates the presence of transpositions of 2 bases (its score is also 1). + + PARAMETERS + ---------- + pattern : string + DNA sequence of the first input file + text : string + DNA sequence of the second input file + + RETURNS + ------- + dp_matrix : list of lists (matrix) + Dynamic Programming matrix of the alignment + """ + + dp_matrix = [[0 for _ in range(len(text)+1)] for _ in range(len(pattern)+1)] + for v in range(len(pattern)+1): dp_matrix[v][0] = v + for h in range(len(text)+1): dp_matrix[0][h] = h + # Compute DP Matrix + for h in range(1,len(text)+1): + for v in range(1,len(pattern)+1): + dp_matrix[v][h]=min(dp_matrix[v - 1][h - 1] + (0 if pattern[v - 1] == text[h - 1] else 1), + dp_matrix[v][h - 1] + 1,dp_matrix[v - 1][h] + 1) + if v > 1 and h > 1 and pattern[v-1] == text[h - 2] and pattern[v - 2] == text[h-1]: # The tranposition condition. + dp_matrix[v][h] = min(dp_matrix[v][h], dp_matrix[v - 2][h - 2] + 1) + + return dp_matrix + +def backtrace_matrix(pattern,text,dp_matrix): + """This function takes the calculated DP matrix and computes back the CIGAR using also + the sequences. The transposition (T) operation is added into the possible operations. + + PARAMETERS + ---------- + pattern : string + DNA sequence of the first input file + text : string + DNA sequence of the second input file + dp_matrix : list of lists (matrix) + Dynamic Programming matrix of the alignment + + RETURNS + ------- + cigar : list of strings + CIGAR with the instructions of the alignment (M,X,D,I,T) + """ + + v,h,cigar= len(pattern),len(text),[] + while v>0 and h>0: + if dp_matrix[v][h] == dp_matrix[v-1][h] +1: + v -= 1;cigar.insert(0,"D") + elif dp_matrix[v][h] == dp_matrix[v][h-1] +1: + h -= 1;cigar.insert(0,"I") + elif v > 1 and h > 1 and pattern[v - 1] == text[h - 2] and pattern[v - 2] == text[h - 1]: + v -= 1;h -= 1;cigar.insert(0,"T") + else: + v -= 1;h -= 1 + if pattern[v] == text[h]: cigar.insert(0,"M") + else: cigar.insert(0,"X") + if v>0: + for _ in range(v): cigar.insert(0,"D") + if h>0: + for _ in range(h): cigar.insert(0,"I") + + return cigar + +def Align_DNA(Output_filename,faq_1,faq_2): + """ + Performs the alignment of DNA sequences + + PARAMETERS + ---------- + Output_filename : string + Filename of the alignment file + faq_1 : tuple of strings + DNA sequence of the first input file + faq_2 : tuple of strings + DNA sequence of the second input file + + RETURNS + ------- + Alingment stored in the Output_filename + """ + alignment,DP,BK=open(Output_filename,"wt"),[],[] + for i in range(len(faq_1)): + DP.append(edit_modified_distance_dp(faq_1[i][1],faq_2[i][1])) + BK.append(backtrace_matrix(faq_1[i][1],faq_2[i][1],DP[i])) + (pattern_txt,j),operation_txt,(text_txt,k) = ("",0),[],("",0) + for op in BK[i]: + if op == "M": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt.append("|") + text_txt += faq_2[i][1][k];k += 1 + elif op == "X": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt.append(" ") + text_txt += faq_2[i][1][k];k += 1 + elif op=="T": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt[-1]="*";operation_txt.append("*") + text_txt += faq_2[i][1][k];k += 1 + elif op == "I": + pattern_txt += "-" + operation_txt.append(" ") + text_txt += faq_2[i][1][k];k += 1 + elif op == "D": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt.append(" ") + text_txt += "-" + alignment.write("%s (Identity: %s%%, Mismatches: %s%%, Gaps: %s%%): \n" %(i,float(100*(BK[i].count("M")+BK[i].count("T")))/len(BK[i]), + float(100*BK[i].count("X"))/len(BK[i]), + float(100*(BK[i].count("I")+BK[i].count("D")))/len(BK[i]))) + alignment.write(pattern_txt+"\n");alignment.write("".join(operation_txt)+"\n"),alignment.write(text_txt+"\n") + +def distance_dp_protein(pattern,text): + """This function takes 'pattern' and 'text' protein sequences and compares them forming + the dynamic programming (DP) matrix, which contains the path of the optimal alignment. + It uses the same scoring methodology as the previous function. + + PARAMETERS + ---------- + pattern : string + Protein sequence of the first input file + text : string + Protein sequence of the second input file + + RETURNS + ------- + dp_matrix : list of lists (matrix) + Dynamic Programming matrix of the alignment + """ + + dp_matrix = [[0 for _ in range(len(text)+1)] for _ in range(len(pattern)+1)] + for v in range(len(pattern)+1): dp_matrix[v][0] = -(2*v) # The first column is defined by the deletion penalty. + for h in range(len(text)+1): dp_matrix[0][h] = -(4*h) # The first row is defined by the insertion penalty. + # Compute DP Matrix + for h in range(1,len(text)+1): + for v in range(1,len(pattern)+1): + try : score=dp_matrix[v-1][h-1] +Blosum[pattern[v-1], text[h-1]] + except: score=dp_matrix[v - 1][h - 1] + Blosum[text[h - 1], pattern[v - 1]] + dp_matrix[v][h] = max (score,dp_matrix[v][h-1] -4,dp_matrix[v-1][h] -2) + + return dp_matrix + +def backtrace_protein_matrix(pattern,text,dp_matrix): + """This function takes the calculated DP matrix and computes back the CIGAR using also + the sequences. Once the CIGAR is obtained, we can output the alignment. + + PARAMETERS + ---------- + pattern : string + Protein sequence of the first input file + text : string + Protein sequence of the second input file + dp_matrix : list of lists (matrix) + Dynamic Programming matrix of the alignment + + RETURNS + ------- + cigar : list of strings + CIGAR with the instructions of the alignment (M,X,Y,Z,D,I) + """ + + v,h,cigar = len(pattern),len(text),[] + while v>0 and h>0: # While loop to iterate through all the elements of the DP matrix. + if dp_matrix[v][h] == dp_matrix[v-1][h] -2: + v -= 1;cigar.insert(0,"D") + elif dp_matrix[v][h] == dp_matrix[v][h-1] -4: + h -= 1;cigar.insert(0,"I") + else: + v -= 1;h -= 1 + try: score = Blosum[pattern[v],text[h]] + except: score = Blosum[text[h],pattern[v]] + if pattern[v] == text[h]: cigar.insert(0,"M") + elif score>0: cigar.insert(0,"X") # This differentiation in the mismatches is used to see the importance of + # the changed amino acid in comparison with the pattern/reference. + elif score==0: cigar.insert(0,"Y") + else: cigar.insert(0,"Z") + if v>0: # If the pattern sequence is bigger than the text sequence. + for _ in range(v): cigar.insert(0,"D") + if h>0: # If the text sequence is bigger than the pattern sequence. + for _ in range(h): cigar.insert(0,"I") + + return cigar + +def Align_Protein(Output_filename,faq_1,faq_2): + """ + Performs the alignment of DNA sequences + + PARAMETERS + ---------- + Output_filename : string + Filename of the alignment file + faq_1 : tuple of strings + Protein sequence of the first input file + faq_2 : tuple of strings + Protein sequence of the second input file + + RETURNS + ------- + Alingment stored in the Output_filename + """ + alignment,DP,BK=open(Output_filename,"wt"),[],[] + for i in range(len(faq_1)): + DP.append(distance_dp_protein(faq_1[i][1],faq_2[i][1])) + BK.append(backtrace_protein_matrix(faq_1[i][1],faq_2[i][1],DP[i])) + (pattern_txt,j),operation_txt,(text_txt,k) = ("",0),[],("",0) + for op in BK[i]: + if op == "M": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt.append("|") + text_txt += faq_2[i][1][k];k += 1 + elif op == "X": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt.append(":") + text_txt += faq_2[i][1][k];k += 1 + elif op=="Y": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt.append(".") + text_txt += faq_2[i][1][k];k += 1 + elif op == "Z": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt.append(" ") + text_txt += faq_2[i][1][k];k += 1 + elif op == "D": + pattern_txt += faq_1[i][1][j];j += 1 + operation_txt.append(" ") + text_txt += "-" + elif op == "I": + pattern_txt += "-" + operation_txt.append(" ") + text_txt += faq_2[i][1][k];k += 1 + alignment.write("%s (Identity: %s%%, Similarity: %s%%, Gaps: %s%%): \n" %(i,float(100*BK[i].count("M"))/len(BK[i]), + float(100*(BK[i].count("M")+BK[i].count("X")+BK[i].count("Y")))/len(BK[i]), + float(100*(BK[i].count("I")+BK[i].count("D")))/len(BK[i]))) + alignment.write(pattern_txt+"\n");alignment.write("".join(operation_txt)+"\n"),alignment.write(text_txt+"\n") + +class FASTA_Q(): + + def __init__(self,Input_filename,Output_filename,trim_right=0,trim_left=0,Adaptor="",Input_filename2=""): + self.__Input_filename = Input_filename + self.__Output_filename = Output_filename + self.__trim_right = trim_right + self.__trim_left = trim_left + self.__Adaptor = Adaptor + self.__Input_filename2 = Input_filename2 + + def ReverseComplementFasta(self): + """This function opens the Input_filename (FASTA/Q) and returns an output with the Output_filename and with + the reverse-complement sequences. A Summary of the reads and bases processed is also implemented.""" + f = open(self.__Input_filename, "rt") # The input file is opened, whether it is a FASTA or a FASTQ file. + if ".fasta" in self.__Input_filename:Fasta_q,result=open_fasta_file(f),open(self.__Output_filename,"wt") # If FASTA file, use the open_fasta_file function and overwrite the output file. + else: Fasta_q,result=open_fastq_file(f),open(self.__Output_filename,"wt") # If a FASTQ file, use the open_fastq_file. + for i in range(len(Fasta_q)): + result.write(Fasta_q[i][0]),result.write(reverse_DNA(Fasta_q[i][1])+"\n") + if Fasta_q[i][0][0] == "@": # If a FASTQ file add the plus and quality lines. + result.write(Fasta_q[i][2]),result.write(Fasta_q[i][3][::-1] + "\n") + f.close(),result.close() #Once the output file is modified, a summary is created with the proper format in the assignment. + Results=Count_bases_and_percentages(Fasta_q) # It counts the bases and the relative abundance of nucleotides in + # the sequences of the input file. + print ("File '%s' has been successfully reversed-complemented ('%s')" %(self.__Input_filename,self.__Output_filename)) + print ("Summary:\n"+(len(Results[0])-len(str(len(Fasta_q))))*" "+"%s reads processed"%("{:,}".format(len(Fasta_q)).replace(",","."))) + print ("%s" % Results[0] + " bases processed (%s%% A, %s%% C, %s%% G, %s%% T, %s%% N)" % Results[1]) + # The spaces between numbers is defined by the number of digits and their correlation + # (for example, if bases contains 5 digits and the reads contain 1 digit, 4 spaces must be entered in the read part). + + def TrimFasta(self): + """This function opens the Input_filename (FASTA/Q) and returns an output with the Output_filename and with + the sequences trimmed to the left and the right in a number of bases depending on the trim_left and trim_right + parameters. A Summary of the reads, bases and trimmed bases processed is also implemented.""" + f,Trim = open(self.__Input_filename, "rt"),[] # The input and output files are opened, whether they are a FASTA or a FASTQ file. + if ".fasta" in self.__Input_filename:Fasta_q,result=open_fasta_file(f),open(self.__Output_filename,"wt") # If FASTA file, use the open_fasta_file function and overwrite the output file. + else: Fasta_q,result=open_fastq_file(f),open(self.__Output_filename,"wt") # If a FASTQ file, use the open_fastq_file. + for i in range(len(Fasta_q)): # It trims the sequences in the FASTA/FASTQ file. + if self.__trim_left>=len(Fasta_q[i][1]) or self.__trim_right>=len(Fasta_q[i][1]) or (self.__trim_left+self.__trim_right)>=len(Fasta_q[i][1]): + result.write("") # If the trim parameters are bigger than the input sequence, then it is skipped in the output file. + else: + result.write(Fasta_q[i][0]) + result.write(Fasta_q[i][1][int(self.__trim_left):len(Fasta_q[i][1])-int(self.__trim_right)]+"\n") + Trim.append([Fasta_q[i][0],(Fasta_q[i][1][0:int(self.__trim_left)]+ + Fasta_q[i][1][len(Fasta_q[i][1])-int(self.__trim_right):len(Fasta_q[i][1])])]) + if Fasta_q[i][0][0] == "@": # If a FASTQ file add the plus and the quality trimmed lines. + result.write(Fasta_q[i][2]) + result.write(Fasta_q[i][3][int(self.__trim_left):len(Fasta_q[i][1]) - int(self.__trim_right)] + "\n") + f.close(),result.close() + Results,Results_trimmed=Count_bases_and_percentages(Fasta_q),Count_bases_and_percentages(Trim) + print ("File '%s' has been successfully hard-trimmed ('%s')" %(self.__Input_filename,self.__Output_filename)) + print ("Summary:\n"+(len(Results[0])-len(str(len(Fasta_q))))*" "+"%s reads processed"% ("{:,}".format(len(Fasta_q)).replace(",","."))) + print ("%s" % Results[0] + " bases processed (%s%% A, %s%% C, %s%% G, %s%% T, %s%% N)" % Results[1]) + print ((len(Results[0])-len(Results_trimmed[0]))*" "+"%s"%Results_trimmed[0]+" bases trimmed " + "(%s%% A, %s%% C, %s%% G, %s%% T, %s%% N)"% Results_trimmed[1]) + + def AdaptorRemovalFasta(self): + """This function opens the input filename (FASTA/Q) and returns an output with the Output_filename and with + the sequences trimmed from the left until the Adaptor last base if the Adaptor is found in the sequence. + A Summary of the reads, bases processed and found adaptors is also implemented.""" + f,Number_of_adaptors = open(self.__Input_filename, "rt"),0 # The input file is opened, whether is a FASTA or a FASTQ file. + if ".fasta" in self.__Input_filename:Fasta_q,result=open_fasta_file(f),open(self.__Output_filename,"wt") # If FASTA file, use the open_fasta_file function and overwrite the output file. + else: Fasta_q,result=open_fastq_file(f),open(self.__Output_filename,"wt") # If a FASTQ file, use the open_fastq_file. + for i in range(len(Fasta_q)): + if Fasta_q[i][1].find(self.__Adaptor.upper())!=-1: + if len(self.__Adaptor)==len(Fasta_q[i][1]): + result.write("") + else: + result.write(Fasta_q[i][0]) + result.write(Fasta_q[i][1][Fasta_q[i][1].find(self.__Adaptor.upper())+len(self.__Adaptor):]+"\n") + if Fasta_q[i][0][0] == "@": result.write(Fasta_q[i][2]),result.write(Fasta_q[i][3][Fasta_q[i][1].find(self.__Adaptor.upper()) + len(self.__Adaptor):] + "\n") + else: + result.write(Fasta_q[i][0]) + result.write(Fasta_q[i][1] + "\n") + if Fasta_q[i][0][0] == "@": result.write(Fasta_q[i][2]),result.write(Fasta_q[i][3] + "\n") + Number_of_adaptors+=len(re.findall(self.__Adaptor.upper(),Fasta_q[i][1])) + f.close(),result.close() + Results = Count_bases_and_percentages(Fasta_q) + print ("File '%s' has been successfully processed ('%s')" %(self.__Input_filename,self.__Output_filename)) + print ("Summary:\n"+(len(Results[0])-len(str(len(Fasta_q))))*" "+"%s reads processed" + % ("{:,}".format(len(Fasta_q)).replace(",","."))) + print("%s" % Results[0] + " bases processed (%s%% A, %s%% C, %s%% G, %s%% T, %s%% N)" % Results[1]) + print ((len(Results[0])-len(str(Number_of_adaptors)))*" "+"%s adaptors found" %Number_of_adaptors) + + def Alignment(self): + """This functions take 2 sequences and their alignment CIGAR and + prints the nucleotide alignment in a more visual format (it adds the T operation).""" + + f1,f2=open(self.__Input_filename, "rt"),open(self.__Input_filename2, "rt") + if ".fasta" in self.__Input_filename: faq_1,faq_2=open_fasta_file(f1),open_fasta_file(f2) + else: faq_1,faq_2=open_fastq_file(f1),open_fastq_file(f2) + + if len(re.findall(r'[DEFHIKLMNPQRSVWY]',faq_1[0][1])) != 0: + Align_Protein(self.__Output_filename,faq_1,faq_2) + else: + Align_DNA(self.__Output_filename,faq_1,faq_2) + + print ("File '%s' has been successfully aligned with '%s'" %(self.__Input_filename,self.__Input_filename2)) diff --git a/PELEAnalysis-Processing/Sequence_handler/FASTA_Q.pyc b/PELEAnalysis-Processing/Sequence_handler/FASTA_Q.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6911f0a1a86af3564976c3fd68d9d57779612ea1 GIT binary patch literal 24778 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 L*SI@1_WJ(?protein_1 +SARLKVRKDMA diff --git a/PELEAnalysis-Processing/Sequence_handler/P2.fasta b/PELEAnalysis-Processing/Sequence_handler/P2.fasta new file mode 100644 index 0000000..7fcc57d --- /dev/null +++ b/PELEAnalysis-Processing/Sequence_handler/P2.fasta @@ -0,0 +1,2 @@ +>protein_2 +TGRLKLRKDE diff --git a/PELEAnalysis-Processing/Sequence_handler/Sequence_handler.py b/PELEAnalysis-Processing/Sequence_handler/Sequence_handler.py new file mode 100644 index 0000000..4ebd9e8 --- /dev/null +++ b/PELEAnalysis-Processing/Sequence_handler/Sequence_handler.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- + +# Global imports +import argparse as ap # To parse all the command-line arguments in a more fancy way + +# Local imports +from FASTA_Q import * + +# Script information +__author__ = "Sergi Rodà" +__license__ = "GPL" +__version__ = "1.0.1" +__maintainer__ = "Sergi Rodà" +__email__ = "sergi.rodallordes@bsc.es" + +def parseArgs(): + """Parse arguments from command-line + + RETURNS + ------- + input : string + path of the input sequence file + output : string + path of the output sequence file + operation : string + path of the input sequence file + trimleft : integer + number of bases trimmed at the left + trimright : integer + number of bases trimmed at the left + adaptor : string + DNA adaptor sequence + input2 : string + path of the second input sequence file (alignment operation) + """ + + parser = ap.ArgumentParser() + optional = parser._action_groups.pop() + required = parser.add_argument_group('required arguments') + + required.add_argument("-i", "--input", required=True, metavar="FILE", + type=str, help="path of input file") + required.add_argument("-o", "--output", required=True, metavar="FILE", + type=str, help="path of output file") + required.add_argument("-O", "--operation", required=True, metavar="STRING", + type=str, help="operation flag (rc, trim, adaptor-removal, alignment") + optional.add_argument("-TL", "--trimleft", metavar="INTEGER", + type=int, help="number of bases trimmed at the left") + optional.add_argument("-TR", "--trimright", metavar="INTEGER", + type=int, help="number of bases trimmed at the right") + optional.add_argument("-A", "--adaptor", metavar="STRING", + type=str, help="DNA adaptor sequence") + optional.add_argument("-i2", "--input2", metavar="FILE", + type=str, help="path of 2nd input file") + parser._action_groups.append(optional) + args = parser.parse_args() + + Input_filename = args.input + Output_filename = args.output + Operation = args.operation + TL, TR, Adaptor,Input_filename2 = None, None, None, "" + + if Operation.lower() == "trim": + TL = args.trimleft + TR = args.trimright + + elif Operation.lower() == "adaptor-removal" or Operation.lower() == "ar": + Adaptor = args.adaptor + + elif Operation.lower() == "alignment" or Operation.lower() == "aln": + Input_filename2 = args.input2 + + return Input_filename, Output_filename, Operation, TL, TR, Adaptor, Input_filename2 + +def main(): + """Main function + + It is called when this script is the main program called by the interpreter + """ + + # Parse command-line arguments + Input_filename, Output_filename, Operation, TL, TR, Adaptor, Input_filename2 = parseArgs() + + fasta_q = FASTA_Q(Input_filename, Output_filename, TL, TR, Adaptor, Input_filename2) + + # Execute the operation specified in the flag + if Operation.lower() == "rc": + fasta_q.ReverseComplementFasta() + elif Operation.lower() == "trim": + fasta_q.TrimFasta() + elif Operation.lower() == "adaptor-removal" or Operation.lower() == "ar": + fasta_q.AdaptorRemovalFasta() + elif Operation.lower() == "alignment" or Operation.lower() == "aln": + fasta_q.Alignment() + else: + print ("It doesn't exist such operation. The existing operations are rc(reverse-complement),trim " + "and adaptor-removal") + + +if __name__ == "__main__": + """Call the main function""" + main() diff --git a/PELEAnalysis-Processing/Sequence_handler/__pycache__/FASTA_Q.cpython-36.pyc b/PELEAnalysis-Processing/Sequence_handler/__pycache__/FASTA_Q.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05122982d3690c103e4cf49eed53c090c32275a3 GIT binary patch literal 20431 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%0DIT>Wk&Uc=M2HSO~63 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 L^l?1p)2IFi0MOoz literal 0 HcmV?d00001 diff --git a/PELEAnalysis-Processing/Sequence_handler/hey.fasta b/PELEAnalysis-Processing/Sequence_handler/hey.fasta new file mode 100644 index 0000000..50dbaab --- /dev/null +++ b/PELEAnalysis-Processing/Sequence_handler/hey.fasta @@ -0,0 +1,20 @@ +>seq.0000000000 +GCGTGGTGGTGCATGCTATTTGGGAGGATGAGGCAAGGAG +>seq.0000000001 +ACTAAAAAAAAAAAAAAAAAAAAAAAAAAAAATTAGCTGC +>seq.0000000002 +ACTCCTTTGAAGGGCTATCTATGGAGAAAACCCGTCGTCT +>seq.0000000003 +ATAGCATTTTTGTTAGATAACCTCCCGTAAAGATGATGAA +>seq.0000000004 +TCGTTAATTGTAATTTTTACATAGTTTCTTTCAAACAGAA +>seq.0000000005 +ACCTGACTGTCATATTTTTGCAGCTTAATGCCTTAAAACT +>seq.0000000006 +GCTTGTAGTGCTGTGTGAAGCTTAGGCAGTGCAGTATTGT +>seq.0000000007 +GCAGTTTATCTGGAAGCTCTGTCTTCATGTACTGGATTCT +>seq.0000000008 +GATGACCTCTGACATCTCAAAGGTCCCCTGGAGAGCCACA +>seq.0000000009 +TCTGGNATAACCATTTCTGTGGGCCTTCTTCCATCACTGA diff --git a/README.md b/README.md index b8c3b69..948a462 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,75 @@ # PELEAnalysis-Processing -This repository contains Python scripts to prepare the system for the PELE simulation and to analyze the generated data. +This repository contains Python scripts to analyze [PELE](https://pele.bsc.es/pele.wt) & [MD](https://en.wikipedia.org/wiki/Molecular_dynamics) simulations, to preprocess & process the systems ([PDB](http://www.wwpdb.org/documentation/file-format) files), tools for esterases, the mutation of PDB files using [Schrodinger](https://www.schrodinger.com/) Python API, and many more. + +## Installation + +A set of Python libraries are necessary to run the scripts of this Git repository. Still, they are stored in the setup.py file to setup your computer to use these tools. + +## Requirements + +* Python 2.7 or higher or Python 3.1 or higher must be installed. + +* Schrodinger Python API for Preprocessing and Protein\_Mutator scripts. + +## Contents + +* Esterases : Folder where tools concerning esterases, esters, and others can be found. + +* MD\_analysis : Folder where the analyse\_trajectory python script resides. + +* ML\_scripts : Folder with scripts to perform [SVC](https://en.wikipedia.org/wiki/Support-vector_machine) on a given dataset. + +* PELE\_mean\_analysis : Folder with R tools to analyze PELE report files. + +* PELE\_scripts : Folder with the tools to analyze a PELE simulation and their report files. + +* Preprocessing : Folder with the python scripts to prepare the PDB file for the PELE simulation, to generate the force field parameters for the ligands and the unknown/unseen molecules of the PELE software. [OPLS-2005](https://en.wikipedia.org/wiki/OPLS) is the used force-field. + +* Protein\_Mutator : Folder with python scripts to extract the binding site from a general PDB file giving some concrete residues, a scoring tool based on [RMSD](https://en.wikipedia.org/wiki/Root-mean-square_deviation_of_atomic_positions) against a reference structure, and a tool to mutate residues from a PDB file using Schrodinger Python API. + +* Sequence\_handler : Folder where a tool to reverse-complement, trim, adaptor-removal, and alignment of DNA or protein sequences can be found. + +## Examples + +The vast majority of created tools contain a specific argument parser using the argparse module from Python in order to enable the usage of the scripts without looking at the code. For instance, some applications of the code will be shwon below: + + Sequence alignment + +``` +python Sequence\_handler.py -i P1.fasta -i2 P2.fasta -o P.aln -O alignment +``` + +If there are no issues in the input files, the alignment output file will be written and a exit message will be printed in the command line. + +``` +File 'P1.fasta' has been successfully aligned with 'P2.fasta' +``` + +And the alignment file will look like this: + +``` +0 (Identity: 54.5454545455%, Similarity: 90.9090909091%, Gaps: 9.09090909091%): +SARLKVRKDMA +:.|||:||| +TGRLKLRKD-E +``` + + Plot metrics from PELE report files + +The i (input) flag is to state the path of the report files, and the X and Z flags are to store the metrics from the report files for the X and Y axis, respectively. The SP flag is to create the ScatterPlot, as other type of plots can be created. + +``` +python PELEPlot3.py -i *.out -X 7 -Y 5 -SP +``` + +The output plot will be the next (also, the point can be hovered to see from trajectories comes from and which accepted PELE step represents): + +![Alt text](PELEAnalysis-Processing/PELE_scripts/PELEPlot.png) + + + +## Development + +The scripts are continously modified and improved to have more functions and utilities. -There are also other tools referring the study of esterases, the mutation of PDB files using Schrodinger python API, and the analysis of -MD simulations using mdtraj module.