diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..9a874b5 Binary files /dev/null and b/.DS_Store differ diff --git a/Examples/Jwalk_results/how to see the crosslinks.txt b/Examples/Jwalk_results/how to see the crosslinks.txt deleted file mode 100644 index 012afc8..0000000 --- a/Examples/Jwalk_results/how to see the crosslinks.txt +++ /dev/null @@ -1 +0,0 @@ -In order to visualize the crosslinks in Chimera select Actions>Atoms/Bonds>show diff --git a/Examples/Jwalk_results/test_crosslink_list.txt b/Examples/Jwalk_results/test_crosslink_list.txt deleted file mode 100644 index 9ec0f48..0000000 --- a/Examples/Jwalk_results/test_crosslink_list.txt +++ /dev/null @@ -1,67 +0,0 @@ -Index Model Atom1 Atom2 SASD Euclidean Distance -1 test.pdb LYS-21-A-CA LYS-26-A-CA 28.03224471395849 15.67928397599839 -2 test.pdb LYS-21-A-CA LYS-46-A-CA 19.179238041759476 10.759488556618292 -3 test.pdb LYS-21-A-CA LYS-52-A-CA 9.46167670545699 6.04953799888884 -4 test.pdb LYS-21-A-CA LYS-66-A-CA 24.681433796945203 10.26919670665627 -5 test.pdb LYS-21-A-CA LYS-77-A-CA 49.73947051319689 23.818750533980573 -6 test.pdb LYS-21-A-CA LYS-86-A-CA 31.25151830846534 19.741345293571054 -7 test.pdb LYS-21-A-CA LYS-110-A-CA 40.936351893762556 23.639511543177026 -8 test.pdb LYS-21-A-CA LYS-119-A-CA 49.66285903385666 20.49297296636093 -9 test.pdb LYS-21-A-CA LYS-125-A-CA 51.69817650496518 21.131110264252563 -10 test.pdb LYS-21-A-CA LYS-129-A-CA 48.59660593160693 26.156714185845285 -11 test.pdb LYS-21-A-CA LYS-135-A-CA 34.948965395636954 20.130333877012568 -12 test.pdb LYS-26-A-CA LYS-46-A-CA 20.15514199128802 14.702949908096677 -13 test.pdb LYS-26-A-CA LYS-52-A-CA 32.80238966157534 17.62561057098448 -14 test.pdb LYS-26-A-CA LYS-66-A-CA 48.35396524448764 20.129633354832873 -15 test.pdb LYS-26-A-CA LYS-77-A-CA 48.62887537362212 23.189363617831347 -16 test.pdb LYS-26-A-CA LYS-86-A-CA 54.34467002940222 27.58308300389933 -17 test.pdb LYS-26-A-CA LYS-110-A-CA 43.32137366549043 23.935993691509864 -18 test.pdb LYS-26-A-CA LYS-119-A-CA 20.872771510036095 10.03042596303866 -19 test.pdb LYS-26-A-CA LYS-125-A-CA 24.01903587997807 13.401042459450688 -20 test.pdb LYS-26-A-CA LYS-129-A-CA 23.459972868926737 17.10586878822587 -21 test.pdb LYS-26-A-CA LYS-135-A-CA 6.780726405493154 5.976206991060467 -22 test.pdb LYS-46-A-CA LYS-52-A-CA 17.0329736718175 8.955035454982857 -23 test.pdb LYS-46-A-CA LYS-66-A-CA 36.66913165919045 16.897344495511714 -24 test.pdb LYS-46-A-CA LYS-77-A-CA 56.34522425508421 27.299440305617992 -25 test.pdb LYS-46-A-CA LYS-86-A-CA 39.67460949218449 24.174036071785782 -26 test.pdb LYS-46-A-CA LYS-110-A-CA 59.70899553901063 29.994706766361293 -27 test.pdb LYS-46-A-CA LYS-119-A-CA 35.55639264049293 17.924457620804045 -28 test.pdb LYS-46-A-CA LYS-125-A-CA 37.97060620286602 20.653585136726267 -29 test.pdb LYS-46-A-CA LYS-129-A-CA 43.46483103293135 27.179720289215638 -30 test.pdb LYS-46-A-CA LYS-135-A-CA 28.033457168798872 20.186886287885017 -31 test.pdb LYS-52-A-CA LYS-66-A-CA 20.862613251404078 8.659480065223313 -32 test.pdb LYS-52-A-CA LYS-77-A-CA 45.28056315424009 22.38594248630153 -33 test.pdb LYS-52-A-CA LYS-86-A-CA 26.94668743082662 16.471825885432374 -34 test.pdb LYS-52-A-CA LYS-110-A-CA 45.89267063185095 24.31044471004181 -35 test.pdb LYS-52-A-CA LYS-119-A-CA 50.82361287506502 19.681849735225597 -36 test.pdb LYS-52-A-CA LYS-125-A-CA 46.877168625912454 20.10395689907835 -37 test.pdb LYS-52-A-CA LYS-129-A-CA 57.155668942658245 26.106118727225617 -38 test.pdb LYS-52-A-CA LYS-135-A-CA 40.32258612033082 21.965437623685077 -39 test.pdb LYS-66-A-CA LYS-77-A-CA 34.86188429354507 16.018068360448463 -40 test.pdb LYS-66-A-CA LYS-86-A-CA 13.679467196254514 9.676559874252833 -41 test.pdb LYS-66-A-CA LYS-110-A-CA 35.66573187083843 16.98786605197957 -42 test.pdb LYS-66-A-CA LYS-119-A-CA 50.83463437553382 20.350822833487598 -43 test.pdb LYS-66-A-CA LYS-125-A-CA 47.85186012060061 18.491037937336024 -44 test.pdb LYS-66-A-CA LYS-129-A-CA 55.213178707539704 23.032347427042698 -45 test.pdb LYS-66-A-CA LYS-135-A-CA 53.78935856596154 22.496460099313406 -46 test.pdb LYS-77-A-CA LYS-86-A-CA 18.1305624438352 13.909983788631822 -47 test.pdb LYS-77-A-CA LYS-110-A-CA 14.877102722670466 8.935571889923997 -48 test.pdb LYS-77-A-CA LYS-119-A-CA 32.35348174750629 17.679022540853328 -49 test.pdb LYS-77-A-CA LYS-125-A-CA 26.161548702309364 12.526416806094229 -50 test.pdb LYS-77-A-CA LYS-129-A-CA 25.789604026839207 12.93125771145251 -51 test.pdb LYS-77-A-CA LYS-135-A-CA 41.65276895767024 21.442641091992375 -52 test.pdb LYS-86-A-CA LYS-110-A-CA 25.492744074320886 17.45219946023996 -53 test.pdb LYS-86-A-CA LYS-119-A-CA 34.10331252582397 24.521154153098095 -54 test.pdb LYS-86-A-CA LYS-125-A-CA 30.666594914385023 21.21388080950772 -55 test.pdb LYS-86-A-CA LYS-129-A-CA 38.48185685782987 25.055907467102447 -56 test.pdb LYS-86-A-CA LYS-135-A-CA 45.40239726956457 28.807008904084437 -57 test.pdb LYS-110-A-CA LYS-119-A-CA 39.53850338087454 21.737190687851086 -58 test.pdb LYS-110-A-CA LYS-125-A-CA 36.01490713376705 17.18519959150897 -59 test.pdb LYS-110-A-CA LYS-129-A-CA 24.39296796879157 15.586924424016434 -60 test.pdb LYS-110-A-CA LYS-135-A-CA 38.714407468762715 21.797647304239053 -61 test.pdb LYS-119-A-CA LYS-125-A-CA 7.058282177129341 5.359213934897544 -62 test.pdb LYS-119-A-CA LYS-129-A-CA 11.848191962583275 10.869625108530652 -63 test.pdb LYS-119-A-CA LYS-135-A-CA 13.35736692086995 9.08738130596488 -64 test.pdb LYS-125-A-CA LYS-129-A-CA 9.155870949147037 7.192288648267671 -65 test.pdb LYS-125-A-CA LYS-135-A-CA 16.22552383974878 11.402963518314001 -66 test.pdb LYS-129-A-CA LYS-135-A-CA 16.580242770152154 12.710197834809652 diff --git a/Examples/Jwalk_results/test_crosslinks.pdb b/Examples/Jwalk_results/test_crosslinks.pdb deleted file mode 100644 index e2b4b9a..0000000 --- a/Examples/Jwalk_results/test_crosslinks.pdb +++ /dev/null @@ -1,1553 +0,0 @@ -MODEL 1 LYS21A-LYS26A -ATOM 1 C GLY A 1 26.622 21.755 20.435 1.00 0.00 C -ATOM 2 C GLY A 2 23.622 22.755 22.435 1.00 0.00 C -ATOM 3 C GLY A 3 22.622 23.755 22.435 1.00 0.00 C -ATOM 4 C GLY A 4 21.622 24.755 22.435 1.00 0.00 C -ATOM 5 C GLY A 5 20.622 25.755 22.435 1.00 0.00 C -ATOM 6 C GLY A 6 19.622 26.755 22.435 1.00 0.00 C -ATOM 7 C GLY A 7 18.622 27.755 21.435 1.00 0.00 C -ATOM 8 C GLY A 8 18.622 28.755 20.435 1.00 0.00 C -ATOM 9 C GLY A 9 18.622 29.755 19.435 1.00 0.00 C -ATOM 10 C GLY A 10 18.622 30.755 18.435 1.00 0.00 C -ATOM 11 C GLY A 11 19.622 31.755 17.435 1.00 0.00 C -ATOM 12 C GLY A 12 20.622 32.755 16.435 1.00 0.00 C -ATOM 13 C GLY A 13 21.622 33.755 15.435 1.00 0.00 C -ATOM 14 C GLY A 14 22.622 34.755 14.435 1.00 0.00 C -ATOM 15 C GLY A 15 23.622 35.755 14.435 1.00 0.00 C -ATOM 16 C GLY A 16 24.622 35.755 14.435 1.00 0.00 C -ATOM 17 C GLY A 17 27.622 36.755 15.435 1.00 0.00 C -END -MODEL 2 LYS21A-LYS46A -ATOM 1 C GLY A 1 27.622 36.755 15.435 1.00 0.00 C -ATOM 2 C GLY A 2 28.622 37.755 18.435 1.00 0.00 C -ATOM 3 C GLY A 3 29.622 37.755 19.435 1.00 0.00 C -ATOM 4 C GLY A 4 30.622 38.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 31.622 38.755 21.435 1.00 0.00 C -ATOM 6 C GLY A 6 31.622 39.755 22.435 1.00 0.00 C -ATOM 7 C GLY A 7 31.622 39.755 23.435 1.00 0.00 C -ATOM 8 C GLY A 8 30.622 39.755 24.435 1.00 0.00 C -ATOM 9 C GLY A 9 29.622 38.755 25.435 1.00 0.00 C -ATOM 10 C GLY A 10 29.622 37.755 25.435 1.00 0.00 C -ATOM 11 C GLY A 11 29.622 36.755 25.435 1.00 0.00 C -ATOM 12 C GLY A 12 32.622 34.755 24.435 1.00 0.00 C -END -MODEL 3 LYS21A-LYS52A -ATOM 1 C GLY A 1 27.622 36.755 15.435 1.00 0.00 C -ATOM 2 C GLY A 2 28.622 37.755 18.435 1.00 0.00 C -ATOM 3 C GLY A 3 29.622 38.755 18.435 1.00 0.00 C -ATOM 4 C GLY A 4 30.622 38.755 17.435 1.00 0.00 C -ATOM 5 C GLY A 5 33.622 37.755 16.435 1.00 0.00 C -END -MODEL 4 LYS21A-LYS66A -ATOM 1 C GLY A 1 35.622 35.755 8.435 1.00 0.00 C -ATOM 2 C GLY A 2 35.622 39.755 8.435 1.00 0.00 C -ATOM 3 C GLY A 3 34.622 40.755 7.435 1.00 0.00 C -ATOM 4 C GLY A 4 33.622 41.755 6.435 1.00 0.00 C -ATOM 5 C GLY A 5 32.622 42.755 6.435 1.00 0.00 C -ATOM 6 C GLY A 6 31.622 42.755 6.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 42.755 6.435 1.00 0.00 C -ATOM 8 C GLY A 8 29.622 42.755 6.435 1.00 0.00 C -ATOM 9 C GLY A 9 28.622 41.755 6.435 1.00 0.00 C -ATOM 10 C GLY A 10 27.622 40.755 7.435 1.00 0.00 C -ATOM 11 C GLY A 11 27.622 39.755 8.435 1.00 0.00 C -ATOM 12 C GLY A 12 27.622 38.755 9.435 1.00 0.00 C -ATOM 13 C GLY A 13 27.622 37.755 10.435 1.00 0.00 C -ATOM 14 C GLY A 14 27.622 36.755 11.435 1.00 0.00 C -ATOM 15 C GLY A 15 27.622 36.755 15.435 1.00 0.00 C -END -MODEL 5 LYS21A-LYS77A -ATOM 1 C GLY A 1 42.622 22.755 2.435 1.00 0.00 C -ATOM 2 C GLY A 2 44.622 23.755 -0.565 1.00 0.00 C -ATOM 3 C GLY A 3 44.622 24.755 -1.565 1.00 0.00 C -ATOM 4 C GLY A 4 44.622 25.755 -2.565 1.00 0.00 C -ATOM 5 C GLY A 5 43.622 26.755 -3.565 1.00 0.00 C -ATOM 6 C GLY A 6 42.622 27.755 -4.565 1.00 0.00 C -ATOM 7 C GLY A 7 41.622 28.755 -5.565 1.00 0.00 C -ATOM 8 C GLY A 8 40.622 29.755 -6.565 1.00 0.00 C -ATOM 9 C GLY A 9 39.622 30.755 -6.565 1.00 0.00 C -ATOM 10 C GLY A 10 38.622 31.755 -6.565 1.00 0.00 C -ATOM 11 C GLY A 11 37.622 32.755 -6.565 1.00 0.00 C -ATOM 12 C GLY A 12 36.622 33.755 -5.565 1.00 0.00 C -ATOM 13 C GLY A 13 35.622 34.755 -4.565 1.00 0.00 C -ATOM 14 C GLY A 14 34.622 35.755 -3.565 1.00 0.00 C -ATOM 15 C GLY A 15 34.622 36.755 -2.565 1.00 0.00 C -ATOM 16 C GLY A 16 34.622 37.755 -1.565 1.00 0.00 C -ATOM 17 C GLY A 17 34.622 38.755 -0.565 1.00 0.00 C -ATOM 18 C GLY A 18 34.622 39.755 0.435 1.00 0.00 C -ATOM 19 C GLY A 19 33.622 40.755 1.435 1.00 0.00 C -ATOM 20 C GLY A 20 32.622 41.755 2.435 1.00 0.00 C -ATOM 21 C GLY A 21 31.622 41.755 3.435 1.00 0.00 C -ATOM 22 C GLY A 22 30.622 42.755 4.435 1.00 0.00 C -ATOM 23 C GLY A 23 29.622 42.755 5.435 1.00 0.00 C -ATOM 24 C GLY A 24 28.622 41.755 6.435 1.00 0.00 C -ATOM 25 C GLY A 25 27.622 40.755 7.435 1.00 0.00 C -ATOM 26 C GLY A 26 27.622 39.755 8.435 1.00 0.00 C -ATOM 27 C GLY A 27 27.622 38.755 9.435 1.00 0.00 C -ATOM 28 C GLY A 28 27.622 37.755 10.435 1.00 0.00 C -ATOM 29 C GLY A 29 27.622 36.755 11.435 1.00 0.00 C -ATOM 30 C GLY A 30 27.622 36.755 15.435 1.00 0.00 C -END -MODEL 6 LYS21A-LYS86A -ATOM 1 C GLY A 1 43.622 36.755 3.435 1.00 0.00 C -ATOM 2 C GLY A 2 41.622 39.755 2.435 1.00 0.00 C -ATOM 3 C GLY A 3 40.622 40.755 2.435 1.00 0.00 C -ATOM 4 C GLY A 4 39.622 41.755 2.435 1.00 0.00 C -ATOM 5 C GLY A 5 38.622 41.755 2.435 1.00 0.00 C -ATOM 6 C GLY A 6 37.622 41.755 2.435 1.00 0.00 C -ATOM 7 C GLY A 7 36.622 41.755 2.435 1.00 0.00 C -ATOM 8 C GLY A 8 35.622 41.755 2.435 1.00 0.00 C -ATOM 9 C GLY A 9 34.622 41.755 2.435 1.00 0.00 C -ATOM 10 C GLY A 10 33.622 41.755 2.435 1.00 0.00 C -ATOM 11 C GLY A 11 32.622 41.755 2.435 1.00 0.00 C -ATOM 12 C GLY A 12 31.622 41.755 3.435 1.00 0.00 C -ATOM 13 C GLY A 13 30.622 42.755 4.435 1.00 0.00 C -ATOM 14 C GLY A 14 29.622 42.755 5.435 1.00 0.00 C -ATOM 15 C GLY A 15 28.622 41.755 6.435 1.00 0.00 C -ATOM 16 C GLY A 16 27.622 40.755 7.435 1.00 0.00 C -ATOM 17 C GLY A 17 27.622 39.755 8.435 1.00 0.00 C -ATOM 18 C GLY A 18 27.622 38.755 9.435 1.00 0.00 C -ATOM 19 C GLY A 19 27.622 37.755 10.435 1.00 0.00 C -ATOM 20 C GLY A 20 27.622 36.755 11.435 1.00 0.00 C -ATOM 21 C GLY A 21 27.622 36.755 15.435 1.00 0.00 C -END -MODEL 7 LYS21A-LYS110A -ATOM 1 C GLY A 1 34.622 22.755 -2.565 1.00 0.00 C -ATOM 2 C GLY A 2 32.622 21.755 -5.565 1.00 0.00 C -ATOM 3 C GLY A 3 31.622 21.755 -5.565 1.00 0.00 C -ATOM 4 C GLY A 4 30.622 21.755 -5.565 1.00 0.00 C -ATOM 5 C GLY A 5 29.622 21.755 -5.565 1.00 0.00 C -ATOM 6 C GLY A 6 28.622 21.755 -5.565 1.00 0.00 C -ATOM 7 C GLY A 7 27.622 20.755 -4.565 1.00 0.00 C -ATOM 8 C GLY A 8 26.622 20.755 -3.565 1.00 0.00 C -ATOM 9 C GLY A 9 25.622 20.755 -2.565 1.00 0.00 C -ATOM 10 C GLY A 10 24.622 20.755 -1.565 1.00 0.00 C -ATOM 11 C GLY A 11 23.622 21.755 -0.565 1.00 0.00 C -ATOM 12 C GLY A 12 22.622 22.755 0.435 1.00 0.00 C -ATOM 13 C GLY A 13 22.622 23.755 1.435 1.00 0.00 C -ATOM 14 C GLY A 14 21.622 24.755 2.435 1.00 0.00 C -ATOM 15 C GLY A 15 20.622 25.755 3.435 1.00 0.00 C -ATOM 16 C GLY A 16 20.622 26.755 4.435 1.00 0.00 C -ATOM 17 C GLY A 17 20.622 27.755 5.435 1.00 0.00 C -ATOM 18 C GLY A 18 20.622 28.755 6.435 1.00 0.00 C -ATOM 19 C GLY A 19 20.622 29.755 7.435 1.00 0.00 C -ATOM 20 C GLY A 20 20.622 30.755 8.435 1.00 0.00 C -ATOM 21 C GLY A 21 21.622 31.755 9.435 1.00 0.00 C -ATOM 22 C GLY A 22 22.622 32.755 10.435 1.00 0.00 C -ATOM 23 C GLY A 23 23.622 33.755 11.435 1.00 0.00 C -ATOM 24 C GLY A 24 24.622 34.755 12.435 1.00 0.00 C -ATOM 25 C GLY A 25 25.622 34.755 13.435 1.00 0.00 C -ATOM 26 C GLY A 26 27.622 36.755 15.435 1.00 0.00 C -END -MODEL 8 LYS21A-LYS119A -ATOM 1 C GLY A 1 27.622 36.755 15.435 1.00 0.00 C -ATOM 2 C GLY A 2 24.622 35.755 13.435 1.00 0.00 C -ATOM 3 C GLY A 3 23.622 34.755 13.435 1.00 0.00 C -ATOM 4 C GLY A 4 22.622 33.755 12.435 1.00 0.00 C -ATOM 5 C GLY A 5 21.622 32.755 13.435 1.00 0.00 C -ATOM 6 C GLY A 6 20.622 31.755 14.435 1.00 0.00 C -ATOM 7 C GLY A 7 19.622 30.755 15.435 1.00 0.00 C -ATOM 8 C GLY A 8 18.622 29.755 16.435 1.00 0.00 C -ATOM 9 C GLY A 9 17.622 28.755 17.435 1.00 0.00 C -ATOM 10 C GLY A 10 17.622 27.755 18.435 1.00 0.00 C -ATOM 11 C GLY A 11 17.622 26.755 19.435 1.00 0.00 C -ATOM 12 C GLY A 12 17.622 25.755 20.435 1.00 0.00 C -ATOM 13 C GLY A 13 18.622 24.755 21.435 1.00 0.00 C -ATOM 14 C GLY A 14 19.622 23.755 22.435 1.00 0.00 C -ATOM 15 C GLY A 15 20.622 22.755 22.435 1.00 0.00 C -ATOM 16 C GLY A 16 21.622 21.755 22.435 1.00 0.00 C -ATOM 17 C GLY A 17 22.622 20.755 22.435 1.00 0.00 C -ATOM 18 C GLY A 18 23.622 19.755 22.435 1.00 0.00 C -ATOM 19 C GLY A 19 24.622 18.755 22.435 1.00 0.00 C -ATOM 20 C GLY A 20 25.622 17.755 22.435 1.00 0.00 C -ATOM 21 C GLY A 21 26.622 16.755 22.435 1.00 0.00 C -ATOM 22 C GLY A 22 27.622 15.755 22.435 1.00 0.00 C -ATOM 23 C GLY A 23 28.622 14.755 21.435 1.00 0.00 C -ATOM 24 C GLY A 24 29.622 13.755 20.435 1.00 0.00 C -ATOM 25 C GLY A 25 30.622 12.755 19.435 1.00 0.00 C -ATOM 26 C GLY A 26 31.622 12.755 18.435 1.00 0.00 C -ATOM 27 C GLY A 27 32.622 13.755 17.435 1.00 0.00 C -ATOM 28 C GLY A 28 33.622 14.755 18.435 1.00 0.00 C -ATOM 29 C GLY A 29 34.622 15.755 18.435 1.00 0.00 C -ATOM 30 C GLY A 30 36.622 18.755 18.435 1.00 0.00 C -END -MODEL 9 LYS21A-LYS125A -ATOM 1 C GLY A 1 27.622 36.755 15.435 1.00 0.00 C -ATOM 2 C GLY A 2 28.622 37.755 18.435 1.00 0.00 C -ATOM 3 C GLY A 3 29.622 37.755 19.435 1.00 0.00 C -ATOM 4 C GLY A 4 30.622 37.755 19.435 1.00 0.00 C -ATOM 5 C GLY A 5 31.622 37.755 20.435 1.00 0.00 C -ATOM 6 C GLY A 6 32.622 38.755 21.435 1.00 0.00 C -ATOM 7 C GLY A 7 33.622 39.755 22.435 1.00 0.00 C -ATOM 8 C GLY A 8 34.622 40.755 23.435 1.00 0.00 C -ATOM 9 C GLY A 9 35.622 41.755 24.435 1.00 0.00 C -ATOM 10 C GLY A 10 36.622 40.755 25.435 1.00 0.00 C -ATOM 11 C GLY A 11 37.622 39.755 26.435 1.00 0.00 C -ATOM 12 C GLY A 12 38.622 38.755 26.435 1.00 0.00 C -ATOM 13 C GLY A 13 38.622 37.755 26.435 1.00 0.00 C -ATOM 14 C GLY A 14 38.622 36.755 26.435 1.00 0.00 C -ATOM 15 C GLY A 15 39.622 35.755 26.435 1.00 0.00 C -ATOM 16 C GLY A 16 39.622 34.755 26.435 1.00 0.00 C -ATOM 17 C GLY A 17 40.622 33.755 26.435 1.00 0.00 C -ATOM 18 C GLY A 18 41.622 32.755 26.435 1.00 0.00 C -ATOM 19 C GLY A 19 42.622 31.755 25.435 1.00 0.00 C -ATOM 20 C GLY A 20 43.622 30.755 24.435 1.00 0.00 C -ATOM 21 C GLY A 21 44.622 29.755 23.435 1.00 0.00 C -ATOM 22 C GLY A 22 44.622 28.755 22.435 1.00 0.00 C -ATOM 23 C GLY A 23 44.622 27.755 21.435 1.00 0.00 C -ATOM 24 C GLY A 24 44.622 26.755 20.435 1.00 0.00 C -ATOM 25 C GLY A 25 45.622 25.755 19.435 1.00 0.00 C -ATOM 26 C GLY A 26 46.622 24.755 18.435 1.00 0.00 C -ATOM 27 C GLY A 27 46.622 23.755 17.435 1.00 0.00 C -ATOM 28 C GLY A 28 45.622 22.755 16.435 1.00 0.00 C -ATOM 29 C GLY A 29 44.622 21.755 16.435 1.00 0.00 C -ATOM 30 C GLY A 30 43.622 20.755 15.435 1.00 0.00 C -ATOM 31 C GLY A 31 42.622 19.755 15.435 1.00 0.00 C -ATOM 32 C GLY A 32 41.622 18.755 14.435 1.00 0.00 C -ATOM 33 C GLY A 33 38.622 18.755 13.435 1.00 0.00 C -END -MODEL 10 LYS21A-LYS129A -ATOM 1 C GLY A 1 36.622 12.755 9.435 1.00 0.00 C -ATOM 2 C GLY A 2 33.622 10.755 8.435 1.00 0.00 C -ATOM 3 C GLY A 3 33.622 10.755 7.435 1.00 0.00 C -ATOM 4 C GLY A 4 32.622 10.755 6.435 1.00 0.00 C -ATOM 5 C GLY A 5 31.622 11.755 5.435 1.00 0.00 C -ATOM 6 C GLY A 6 30.622 12.755 4.435 1.00 0.00 C -ATOM 7 C GLY A 7 29.622 13.755 3.435 1.00 0.00 C -ATOM 8 C GLY A 8 28.622 14.755 2.435 1.00 0.00 C -ATOM 9 C GLY A 9 27.622 15.755 1.435 1.00 0.00 C -ATOM 10 C GLY A 10 26.622 16.755 0.435 1.00 0.00 C -ATOM 11 C GLY A 11 25.622 17.755 -0.565 1.00 0.00 C -ATOM 12 C GLY A 12 24.622 18.755 -0.565 1.00 0.00 C -ATOM 13 C GLY A 13 24.622 19.755 -0.565 1.00 0.00 C -ATOM 14 C GLY A 14 24.622 20.755 -0.565 1.00 0.00 C -ATOM 15 C GLY A 15 24.622 21.755 0.435 1.00 0.00 C -ATOM 16 C GLY A 16 23.622 22.755 1.435 1.00 0.00 C -ATOM 17 C GLY A 17 22.622 23.755 1.435 1.00 0.00 C -ATOM 18 C GLY A 18 21.622 24.755 2.435 1.00 0.00 C -ATOM 19 C GLY A 19 20.622 25.755 3.435 1.00 0.00 C -ATOM 20 C GLY A 20 20.622 26.755 4.435 1.00 0.00 C -ATOM 21 C GLY A 21 20.622 27.755 5.435 1.00 0.00 C -ATOM 22 C GLY A 22 20.622 28.755 6.435 1.00 0.00 C -ATOM 23 C GLY A 23 20.622 29.755 7.435 1.00 0.00 C -ATOM 24 C GLY A 24 20.622 30.755 8.435 1.00 0.00 C -ATOM 25 C GLY A 25 21.622 31.755 9.435 1.00 0.00 C -ATOM 26 C GLY A 26 22.622 32.755 10.435 1.00 0.00 C -ATOM 27 C GLY A 27 23.622 33.755 11.435 1.00 0.00 C -ATOM 28 C GLY A 28 24.622 34.755 12.435 1.00 0.00 C -ATOM 29 C GLY A 29 25.622 34.755 13.435 1.00 0.00 C -ATOM 30 C GLY A 30 27.622 36.755 15.435 1.00 0.00 C -END -MODEL 11 LYS21A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 24.622 17.755 19.435 1.00 0.00 C -ATOM 3 C GLY A 3 24.622 18.755 20.435 1.00 0.00 C -ATOM 4 C GLY A 4 23.622 19.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 23.622 20.755 20.435 1.00 0.00 C -ATOM 6 C GLY A 6 23.622 21.755 21.435 1.00 0.00 C -ATOM 7 C GLY A 7 23.622 22.755 22.435 1.00 0.00 C -ATOM 8 C GLY A 8 22.622 23.755 22.435 1.00 0.00 C -ATOM 9 C GLY A 9 21.622 24.755 22.435 1.00 0.00 C -ATOM 10 C GLY A 10 20.622 25.755 22.435 1.00 0.00 C -ATOM 11 C GLY A 11 19.622 26.755 22.435 1.00 0.00 C -ATOM 12 C GLY A 12 18.622 27.755 21.435 1.00 0.00 C -ATOM 13 C GLY A 13 18.622 28.755 20.435 1.00 0.00 C -ATOM 14 C GLY A 14 18.622 29.755 19.435 1.00 0.00 C -ATOM 15 C GLY A 15 18.622 30.755 18.435 1.00 0.00 C -ATOM 16 C GLY A 16 19.622 31.755 17.435 1.00 0.00 C -ATOM 17 C GLY A 17 20.622 32.755 16.435 1.00 0.00 C -ATOM 18 C GLY A 18 21.622 33.755 15.435 1.00 0.00 C -ATOM 19 C GLY A 19 22.622 34.755 14.435 1.00 0.00 C -ATOM 20 C GLY A 20 23.622 35.755 14.435 1.00 0.00 C -ATOM 21 C GLY A 21 24.622 36.755 14.435 1.00 0.00 C -ATOM 22 C GLY A 22 27.622 36.755 15.435 1.00 0.00 C -END -MODEL 12 LYS26A-LYS46A -ATOM 1 C GLY A 1 32.622 34.755 24.435 1.00 0.00 C -ATOM 2 C GLY A 2 30.622 32.755 26.435 1.00 0.00 C -ATOM 3 C GLY A 3 30.622 31.755 26.435 1.00 0.00 C -ATOM 4 C GLY A 4 29.622 30.755 26.435 1.00 0.00 C -ATOM 5 C GLY A 5 28.622 29.755 26.435 1.00 0.00 C -ATOM 6 C GLY A 6 27.622 28.755 26.435 1.00 0.00 C -ATOM 7 C GLY A 7 26.622 27.755 26.435 1.00 0.00 C -ATOM 8 C GLY A 8 25.622 26.755 26.435 1.00 0.00 C -ATOM 9 C GLY A 9 24.622 25.755 25.435 1.00 0.00 C -ATOM 10 C GLY A 10 24.622 24.755 24.435 1.00 0.00 C -ATOM 11 C GLY A 11 25.622 23.755 23.435 1.00 0.00 C -ATOM 12 C GLY A 12 26.622 21.755 20.435 1.00 0.00 C -END -MODEL 13 LYS26A-LYS52A -ATOM 1 C GLY A 1 26.622 21.755 20.435 1.00 0.00 C -ATOM 2 C GLY A 2 24.622 23.755 22.435 1.00 0.00 C -ATOM 3 C GLY A 3 23.622 24.755 22.435 1.00 0.00 C -ATOM 4 C GLY A 4 23.622 25.755 22.435 1.00 0.00 C -ATOM 5 C GLY A 5 23.622 26.755 23.435 1.00 0.00 C -ATOM 6 C GLY A 6 23.622 27.755 23.435 1.00 0.00 C -ATOM 7 C GLY A 7 23.622 28.755 23.435 1.00 0.00 C -ATOM 8 C GLY A 8 23.622 29.755 24.435 1.00 0.00 C -ATOM 9 C GLY A 9 23.622 30.755 24.435 1.00 0.00 C -ATOM 10 C GLY A 10 23.622 31.755 24.435 1.00 0.00 C -ATOM 11 C GLY A 11 23.622 32.755 24.435 1.00 0.00 C -ATOM 12 C GLY A 12 23.622 33.755 24.435 1.00 0.00 C -ATOM 13 C GLY A 13 23.622 34.755 24.435 1.00 0.00 C -ATOM 14 C GLY A 14 23.622 35.755 24.435 1.00 0.00 C -ATOM 15 C GLY A 15 23.622 36.755 24.435 1.00 0.00 C -ATOM 16 C GLY A 16 24.622 37.755 24.435 1.00 0.00 C -ATOM 17 C GLY A 17 25.622 38.755 24.435 1.00 0.00 C -ATOM 18 C GLY A 18 26.622 39.755 23.435 1.00 0.00 C -ATOM 19 C GLY A 19 27.622 39.755 22.435 1.00 0.00 C -ATOM 20 C GLY A 20 28.622 39.755 21.435 1.00 0.00 C -ATOM 21 C GLY A 21 29.622 39.755 20.435 1.00 0.00 C -ATOM 22 C GLY A 22 30.622 39.755 19.435 1.00 0.00 C -ATOM 23 C GLY A 23 31.622 39.755 18.435 1.00 0.00 C -ATOM 24 C GLY A 24 33.622 37.755 16.435 1.00 0.00 C -END -MODEL 14 LYS26A-LYS66A -ATOM 1 C GLY A 1 35.622 35.755 8.435 1.00 0.00 C -ATOM 2 C GLY A 2 35.622 39.755 8.435 1.00 0.00 C -ATOM 3 C GLY A 3 34.622 40.755 7.435 1.00 0.00 C -ATOM 4 C GLY A 4 33.622 41.755 6.435 1.00 0.00 C -ATOM 5 C GLY A 5 32.622 42.755 6.435 1.00 0.00 C -ATOM 6 C GLY A 6 31.622 42.755 6.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 42.755 6.435 1.00 0.00 C -ATOM 8 C GLY A 8 29.622 42.755 6.435 1.00 0.00 C -ATOM 9 C GLY A 9 28.622 41.755 6.435 1.00 0.00 C -ATOM 10 C GLY A 10 27.622 40.755 7.435 1.00 0.00 C -ATOM 11 C GLY A 11 27.622 39.755 8.435 1.00 0.00 C -ATOM 12 C GLY A 12 26.622 38.755 9.435 1.00 0.00 C -ATOM 13 C GLY A 13 25.622 37.755 10.435 1.00 0.00 C -ATOM 14 C GLY A 14 24.622 36.755 11.435 1.00 0.00 C -ATOM 15 C GLY A 15 23.622 35.755 12.435 1.00 0.00 C -ATOM 16 C GLY A 16 22.622 34.755 13.435 1.00 0.00 C -ATOM 17 C GLY A 17 21.622 33.755 14.435 1.00 0.00 C -ATOM 18 C GLY A 18 20.622 32.755 15.435 1.00 0.00 C -ATOM 19 C GLY A 19 19.622 31.755 16.435 1.00 0.00 C -ATOM 20 C GLY A 20 18.622 30.755 17.435 1.00 0.00 C -ATOM 21 C GLY A 21 18.622 29.755 18.435 1.00 0.00 C -ATOM 22 C GLY A 22 17.622 28.755 19.435 1.00 0.00 C -ATOM 23 C GLY A 23 18.622 27.755 20.435 1.00 0.00 C -ATOM 24 C GLY A 24 19.622 26.755 21.435 1.00 0.00 C -ATOM 25 C GLY A 25 20.622 25.755 22.435 1.00 0.00 C -ATOM 26 C GLY A 26 21.622 24.755 22.435 1.00 0.00 C -ATOM 27 C GLY A 27 22.622 23.755 22.435 1.00 0.00 C -ATOM 28 C GLY A 28 23.622 22.755 22.435 1.00 0.00 C -ATOM 29 C GLY A 29 26.622 21.755 20.435 1.00 0.00 C -END -MODEL 15 LYS26A-LYS77A -ATOM 1 C GLY A 1 26.622 21.755 20.435 1.00 0.00 C -ATOM 2 C GLY A 2 26.622 17.755 20.435 1.00 0.00 C -ATOM 3 C GLY A 3 26.622 16.755 20.435 1.00 0.00 C -ATOM 4 C GLY A 4 27.622 15.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 28.622 14.755 20.435 1.00 0.00 C -ATOM 6 C GLY A 6 29.622 13.755 20.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 12.755 19.435 1.00 0.00 C -ATOM 8 C GLY A 8 31.622 11.755 19.435 1.00 0.00 C -ATOM 9 C GLY A 9 32.622 11.755 19.435 1.00 0.00 C -ATOM 10 C GLY A 10 33.622 11.755 18.435 1.00 0.00 C -ATOM 11 C GLY A 11 34.622 11.755 17.435 1.00 0.00 C -ATOM 12 C GLY A 12 35.622 11.755 16.435 1.00 0.00 C -ATOM 13 C GLY A 13 36.622 11.755 15.435 1.00 0.00 C -ATOM 14 C GLY A 14 37.622 11.755 14.435 1.00 0.00 C -ATOM 15 C GLY A 15 38.622 11.755 13.435 1.00 0.00 C -ATOM 16 C GLY A 16 39.622 11.755 12.435 1.00 0.00 C -ATOM 17 C GLY A 17 40.622 11.755 11.435 1.00 0.00 C -ATOM 18 C GLY A 18 41.622 11.755 10.435 1.00 0.00 C -ATOM 19 C GLY A 19 42.622 10.755 9.435 1.00 0.00 C -ATOM 20 C GLY A 20 43.622 11.755 8.435 1.00 0.00 C -ATOM 21 C GLY A 21 44.622 12.755 7.435 1.00 0.00 C -ATOM 22 C GLY A 22 45.622 13.755 7.435 1.00 0.00 C -ATOM 23 C GLY A 23 46.622 14.755 6.435 1.00 0.00 C -ATOM 24 C GLY A 24 47.622 15.755 5.435 1.00 0.00 C -ATOM 25 C GLY A 25 48.622 16.755 4.435 1.00 0.00 C -ATOM 26 C GLY A 26 48.622 17.755 3.435 1.00 0.00 C -ATOM 27 C GLY A 27 48.622 18.755 2.435 1.00 0.00 C -ATOM 28 C GLY A 28 47.622 19.755 1.435 1.00 0.00 C -ATOM 29 C GLY A 29 46.622 20.755 1.435 1.00 0.00 C -ATOM 30 C GLY A 30 45.622 21.755 1.435 1.00 0.00 C -ATOM 31 C GLY A 31 42.622 22.755 2.435 1.00 0.00 C -END -MODEL 16 LYS26A-LYS86A -ATOM 1 C GLY A 1 26.622 21.755 20.435 1.00 0.00 C -ATOM 2 C GLY A 2 23.622 21.755 21.435 1.00 0.00 C -ATOM 3 C GLY A 3 22.622 22.755 22.435 1.00 0.00 C -ATOM 4 C GLY A 4 21.622 23.755 23.435 1.00 0.00 C -ATOM 5 C GLY A 5 20.622 24.755 22.435 1.00 0.00 C -ATOM 6 C GLY A 6 19.622 25.755 21.435 1.00 0.00 C -ATOM 7 C GLY A 7 18.622 26.755 20.435 1.00 0.00 C -ATOM 8 C GLY A 8 18.622 27.755 19.435 1.00 0.00 C -ATOM 9 C GLY A 9 18.622 28.755 18.435 1.00 0.00 C -ATOM 10 C GLY A 10 18.622 29.755 17.435 1.00 0.00 C -ATOM 11 C GLY A 11 18.622 30.755 16.435 1.00 0.00 C -ATOM 12 C GLY A 12 19.622 31.755 15.435 1.00 0.00 C -ATOM 13 C GLY A 13 20.622 32.755 14.435 1.00 0.00 C -ATOM 14 C GLY A 14 21.622 33.755 13.435 1.00 0.00 C -ATOM 15 C GLY A 15 22.622 34.755 12.435 1.00 0.00 C -ATOM 16 C GLY A 16 23.622 35.755 11.435 1.00 0.00 C -ATOM 17 C GLY A 17 24.622 36.755 10.435 1.00 0.00 C -ATOM 18 C GLY A 18 25.622 37.755 9.435 1.00 0.00 C -ATOM 19 C GLY A 19 26.622 38.755 8.435 1.00 0.00 C -ATOM 20 C GLY A 20 27.622 39.755 7.435 1.00 0.00 C -ATOM 21 C GLY A 21 28.622 40.755 6.435 1.00 0.00 C -ATOM 22 C GLY A 22 29.622 41.755 6.435 1.00 0.00 C -ATOM 23 C GLY A 23 30.622 42.755 6.435 1.00 0.00 C -ATOM 24 C GLY A 24 31.622 42.755 6.435 1.00 0.00 C -ATOM 25 C GLY A 25 32.622 42.755 6.435 1.00 0.00 C -ATOM 26 C GLY A 26 33.622 42.755 6.435 1.00 0.00 C -ATOM 27 C GLY A 27 34.622 42.755 6.435 1.00 0.00 C -ATOM 28 C GLY A 28 35.622 42.755 6.435 1.00 0.00 C -ATOM 29 C GLY A 29 36.622 42.755 6.435 1.00 0.00 C -ATOM 30 C GLY A 30 37.622 42.755 6.435 1.00 0.00 C -ATOM 31 C GLY A 31 38.622 42.755 5.435 1.00 0.00 C -ATOM 32 C GLY A 32 39.622 41.755 5.435 1.00 0.00 C -ATOM 33 C GLY A 33 40.622 40.755 5.435 1.00 0.00 C -ATOM 34 C GLY A 34 41.622 39.755 4.435 1.00 0.00 C -ATOM 35 C GLY A 35 43.622 36.755 3.435 1.00 0.00 C -END -MODEL 17 LYS26A-LYS110A -ATOM 1 C GLY A 1 26.622 21.755 20.435 1.00 0.00 C -ATOM 2 C GLY A 2 23.622 19.755 19.435 1.00 0.00 C -ATOM 3 C GLY A 3 22.622 18.755 19.435 1.00 0.00 C -ATOM 4 C GLY A 4 21.622 18.755 18.435 1.00 0.00 C -ATOM 5 C GLY A 5 21.622 17.755 17.435 1.00 0.00 C -ATOM 6 C GLY A 6 21.622 17.755 16.435 1.00 0.00 C -ATOM 7 C GLY A 7 21.622 16.755 15.435 1.00 0.00 C -ATOM 8 C GLY A 8 21.622 16.755 14.435 1.00 0.00 C -ATOM 9 C GLY A 9 21.622 16.755 13.435 1.00 0.00 C -ATOM 10 C GLY A 10 21.622 16.755 12.435 1.00 0.00 C -ATOM 11 C GLY A 11 21.622 16.755 11.435 1.00 0.00 C -ATOM 12 C GLY A 12 21.622 16.755 10.435 1.00 0.00 C -ATOM 13 C GLY A 13 22.622 16.755 9.435 1.00 0.00 C -ATOM 14 C GLY A 14 22.622 16.755 8.435 1.00 0.00 C -ATOM 15 C GLY A 15 22.622 16.755 7.435 1.00 0.00 C -ATOM 16 C GLY A 16 22.622 16.755 6.435 1.00 0.00 C -ATOM 17 C GLY A 17 22.622 16.755 5.435 1.00 0.00 C -ATOM 18 C GLY A 18 22.622 16.755 4.435 1.00 0.00 C -ATOM 19 C GLY A 19 22.622 16.755 3.435 1.00 0.00 C -ATOM 20 C GLY A 20 22.622 16.755 2.435 1.00 0.00 C -ATOM 21 C GLY A 21 23.622 16.755 1.435 1.00 0.00 C -ATOM 22 C GLY A 22 24.622 16.755 0.435 1.00 0.00 C -ATOM 23 C GLY A 23 25.622 16.755 -0.565 1.00 0.00 C -ATOM 24 C GLY A 24 26.622 16.755 -1.565 1.00 0.00 C -ATOM 25 C GLY A 25 27.622 16.755 -2.565 1.00 0.00 C -ATOM 26 C GLY A 26 28.622 16.755 -3.565 1.00 0.00 C -ATOM 27 C GLY A 27 29.622 17.755 -4.565 1.00 0.00 C -ATOM 28 C GLY A 28 30.622 18.755 -5.565 1.00 0.00 C -ATOM 29 C GLY A 29 31.622 19.755 -5.565 1.00 0.00 C -ATOM 30 C GLY A 30 32.622 20.755 -5.565 1.00 0.00 C -ATOM 31 C GLY A 31 33.622 21.755 -5.565 1.00 0.00 C -ATOM 32 C GLY A 32 34.622 22.755 -2.565 1.00 0.00 C -END -MODEL 18 LYS26A-LYS119A -ATOM 1 C GLY A 1 26.622 21.755 20.435 1.00 0.00 C -ATOM 2 C GLY A 2 26.622 17.755 20.435 1.00 0.00 C -ATOM 3 C GLY A 3 26.622 16.755 20.435 1.00 0.00 C -ATOM 4 C GLY A 4 27.622 15.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 28.622 14.755 20.435 1.00 0.00 C -ATOM 6 C GLY A 6 29.622 13.755 20.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 12.755 19.435 1.00 0.00 C -ATOM 8 C GLY A 8 31.622 12.755 18.435 1.00 0.00 C -ATOM 9 C GLY A 9 32.622 13.755 17.435 1.00 0.00 C -ATOM 10 C GLY A 10 33.622 14.755 18.435 1.00 0.00 C -ATOM 11 C GLY A 11 34.622 15.755 18.435 1.00 0.00 C -ATOM 12 C GLY A 12 36.622 18.755 18.435 1.00 0.00 C -END -MODEL 19 LYS26A-LYS125A -ATOM 1 C GLY A 1 26.622 21.755 20.435 1.00 0.00 C -ATOM 2 C GLY A 2 26.622 17.755 20.435 1.00 0.00 C -ATOM 3 C GLY A 3 26.622 16.755 20.435 1.00 0.00 C -ATOM 4 C GLY A 4 27.622 15.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 28.622 14.755 20.435 1.00 0.00 C -ATOM 6 C GLY A 6 29.622 13.755 20.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 12.755 19.435 1.00 0.00 C -ATOM 8 C GLY A 8 31.622 12.755 18.435 1.00 0.00 C -ATOM 9 C GLY A 9 32.622 12.755 17.435 1.00 0.00 C -ATOM 10 C GLY A 10 33.622 12.755 16.435 1.00 0.00 C -ATOM 11 C GLY A 11 34.622 13.755 15.435 1.00 0.00 C -ATOM 12 C GLY A 12 35.622 14.755 14.435 1.00 0.00 C -ATOM 13 C GLY A 13 36.622 15.755 13.435 1.00 0.00 C -ATOM 14 C GLY A 14 38.622 18.755 13.435 1.00 0.00 C -END -MODEL 20 LYS26A-LYS129A -ATOM 1 C GLY A 1 26.622 21.755 20.435 1.00 0.00 C -ATOM 2 C GLY A 2 26.622 17.755 20.435 1.00 0.00 C -ATOM 3 C GLY A 3 26.622 16.755 20.435 1.00 0.00 C -ATOM 4 C GLY A 4 27.622 15.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 28.622 14.755 20.435 1.00 0.00 C -ATOM 6 C GLY A 6 29.622 13.755 20.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 12.755 19.435 1.00 0.00 C -ATOM 8 C GLY A 8 31.622 12.755 18.435 1.00 0.00 C -ATOM 9 C GLY A 9 32.622 12.755 17.435 1.00 0.00 C -ATOM 10 C GLY A 10 33.622 12.755 16.435 1.00 0.00 C -ATOM 11 C GLY A 11 34.622 12.755 15.435 1.00 0.00 C -ATOM 12 C GLY A 12 35.622 12.755 14.435 1.00 0.00 C -ATOM 13 C GLY A 13 36.622 12.755 13.435 1.00 0.00 C -ATOM 14 C GLY A 14 36.622 12.755 9.435 1.00 0.00 C -END -MODEL 21 LYS26A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 25.622 18.755 19.435 1.00 0.00 C -ATOM 3 C GLY A 3 26.622 21.755 20.435 1.00 0.00 C -END -MODEL 22 LYS46A-LYS52A -ATOM 1 C GLY A 1 32.622 34.755 24.435 1.00 0.00 C -ATOM 2 C GLY A 2 29.622 36.755 25.435 1.00 0.00 C -ATOM 3 C GLY A 3 29.622 37.755 25.435 1.00 0.00 C -ATOM 4 C GLY A 4 29.622 38.755 25.435 1.00 0.00 C -ATOM 5 C GLY A 5 29.622 39.755 24.435 1.00 0.00 C -ATOM 6 C GLY A 6 29.622 39.755 23.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 39.755 22.435 1.00 0.00 C -ATOM 8 C GLY A 8 30.622 39.755 21.435 1.00 0.00 C -ATOM 9 C GLY A 9 31.622 39.755 20.435 1.00 0.00 C -ATOM 10 C GLY A 10 32.622 38.755 19.435 1.00 0.00 C -ATOM 11 C GLY A 11 33.622 37.755 16.435 1.00 0.00 C -END -MODEL 23 LYS46A-LYS66A -ATOM 1 C GLY A 1 35.622 35.755 8.435 1.00 0.00 C -ATOM 2 C GLY A 2 35.622 39.755 8.435 1.00 0.00 C -ATOM 3 C GLY A 3 35.622 40.755 8.435 1.00 0.00 C -ATOM 4 C GLY A 4 35.622 41.755 8.435 1.00 0.00 C -ATOM 5 C GLY A 5 35.622 42.755 9.435 1.00 0.00 C -ATOM 6 C GLY A 6 36.622 43.755 10.435 1.00 0.00 C -ATOM 7 C GLY A 7 37.622 44.755 11.435 1.00 0.00 C -ATOM 8 C GLY A 8 38.622 44.755 12.435 1.00 0.00 C -ATOM 9 C GLY A 9 38.622 44.755 13.435 1.00 0.00 C -ATOM 10 C GLY A 10 38.622 44.755 14.435 1.00 0.00 C -ATOM 11 C GLY A 11 38.622 44.755 15.435 1.00 0.00 C -ATOM 12 C GLY A 12 38.622 44.755 16.435 1.00 0.00 C -ATOM 13 C GLY A 13 37.622 44.755 17.435 1.00 0.00 C -ATOM 14 C GLY A 14 36.622 44.755 18.435 1.00 0.00 C -ATOM 15 C GLY A 15 35.622 44.755 19.435 1.00 0.00 C -ATOM 16 C GLY A 16 34.622 43.755 20.435 1.00 0.00 C -ATOM 17 C GLY A 17 33.622 42.755 21.435 1.00 0.00 C -ATOM 18 C GLY A 18 32.622 41.755 22.435 1.00 0.00 C -ATOM 19 C GLY A 19 31.622 40.755 23.435 1.00 0.00 C -ATOM 20 C GLY A 20 30.622 39.755 24.435 1.00 0.00 C -ATOM 21 C GLY A 21 29.622 38.755 25.435 1.00 0.00 C -ATOM 22 C GLY A 22 29.622 37.755 25.435 1.00 0.00 C -ATOM 23 C GLY A 23 29.622 36.755 25.435 1.00 0.00 C -ATOM 24 C GLY A 24 32.622 34.755 24.435 1.00 0.00 C -END -MODEL 24 LYS46A-LYS77A -ATOM 1 C GLY A 1 42.622 22.755 2.435 1.00 0.00 C -ATOM 2 C GLY A 2 44.622 25.755 1.435 1.00 0.00 C -ATOM 3 C GLY A 3 45.622 25.755 2.435 1.00 0.00 C -ATOM 4 C GLY A 4 46.622 26.755 3.435 1.00 0.00 C -ATOM 5 C GLY A 5 47.622 27.755 4.435 1.00 0.00 C -ATOM 6 C GLY A 6 48.622 27.755 5.435 1.00 0.00 C -ATOM 7 C GLY A 7 48.622 27.755 6.435 1.00 0.00 C -ATOM 8 C GLY A 8 48.622 28.755 7.435 1.00 0.00 C -ATOM 9 C GLY A 9 48.622 29.755 8.435 1.00 0.00 C -ATOM 10 C GLY A 10 49.622 30.755 9.435 1.00 0.00 C -ATOM 11 C GLY A 11 50.622 31.755 10.435 1.00 0.00 C -ATOM 12 C GLY A 12 51.622 32.755 11.435 1.00 0.00 C -ATOM 13 C GLY A 13 51.622 33.755 12.435 1.00 0.00 C -ATOM 14 C GLY A 14 51.622 34.755 13.435 1.00 0.00 C -ATOM 15 C GLY A 15 51.622 34.755 14.435 1.00 0.00 C -ATOM 16 C GLY A 16 50.622 35.755 15.435 1.00 0.00 C -ATOM 17 C GLY A 17 49.622 35.755 16.435 1.00 0.00 C -ATOM 18 C GLY A 18 48.622 35.755 17.435 1.00 0.00 C -ATOM 19 C GLY A 19 47.622 35.755 18.435 1.00 0.00 C -ATOM 20 C GLY A 20 46.622 35.755 19.435 1.00 0.00 C -ATOM 21 C GLY A 21 45.622 35.755 20.435 1.00 0.00 C -ATOM 22 C GLY A 22 44.622 35.755 21.435 1.00 0.00 C -ATOM 23 C GLY A 23 43.622 35.755 22.435 1.00 0.00 C -ATOM 24 C GLY A 24 42.622 35.755 23.435 1.00 0.00 C -ATOM 25 C GLY A 25 41.622 35.755 24.435 1.00 0.00 C -ATOM 26 C GLY A 26 40.622 35.755 25.435 1.00 0.00 C -ATOM 27 C GLY A 27 39.622 35.755 26.435 1.00 0.00 C -ATOM 28 C GLY A 28 38.622 36.755 27.435 1.00 0.00 C -ATOM 29 C GLY A 29 37.622 36.755 28.435 1.00 0.00 C -ATOM 30 C GLY A 30 36.622 36.755 29.435 1.00 0.00 C -ATOM 31 C GLY A 31 35.622 36.755 30.435 1.00 0.00 C -ATOM 32 C GLY A 32 34.622 36.755 30.435 1.00 0.00 C -ATOM 33 C GLY A 33 33.622 36.755 30.435 1.00 0.00 C -ATOM 34 C GLY A 34 32.622 35.755 29.435 1.00 0.00 C -ATOM 35 C GLY A 35 31.622 34.755 28.435 1.00 0.00 C -ATOM 36 C GLY A 36 31.622 33.755 27.435 1.00 0.00 C -ATOM 37 C GLY A 37 32.622 34.755 24.435 1.00 0.00 C -END -MODEL 25 LYS46A-LYS86A -ATOM 1 C GLY A 1 32.622 34.755 24.435 1.00 0.00 C -ATOM 2 C GLY A 2 29.622 36.755 25.435 1.00 0.00 C -ATOM 3 C GLY A 3 29.622 37.755 25.435 1.00 0.00 C -ATOM 4 C GLY A 4 29.622 38.755 25.435 1.00 0.00 C -ATOM 5 C GLY A 5 29.622 39.755 24.435 1.00 0.00 C -ATOM 6 C GLY A 6 30.622 39.755 23.435 1.00 0.00 C -ATOM 7 C GLY A 7 31.622 39.755 22.435 1.00 0.00 C -ATOM 8 C GLY A 8 32.622 39.755 21.435 1.00 0.00 C -ATOM 9 C GLY A 9 33.622 39.755 20.435 1.00 0.00 C -ATOM 10 C GLY A 10 34.622 40.755 19.435 1.00 0.00 C -ATOM 11 C GLY A 11 35.622 41.755 18.435 1.00 0.00 C -ATOM 12 C GLY A 12 36.622 42.755 17.435 1.00 0.00 C -ATOM 13 C GLY A 13 37.622 43.755 16.435 1.00 0.00 C -ATOM 14 C GLY A 14 38.622 43.755 15.435 1.00 0.00 C -ATOM 15 C GLY A 15 39.622 44.755 14.435 1.00 0.00 C -ATOM 16 C GLY A 16 40.622 44.755 13.435 1.00 0.00 C -ATOM 17 C GLY A 17 41.622 44.755 12.435 1.00 0.00 C -ATOM 18 C GLY A 18 42.622 44.755 11.435 1.00 0.00 C -ATOM 19 C GLY A 19 43.622 44.755 10.435 1.00 0.00 C -ATOM 20 C GLY A 20 44.622 43.755 9.435 1.00 0.00 C -ATOM 21 C GLY A 21 44.622 42.755 8.435 1.00 0.00 C -ATOM 22 C GLY A 22 44.622 41.755 7.435 1.00 0.00 C -ATOM 23 C GLY A 23 44.622 40.755 6.435 1.00 0.00 C -ATOM 24 C GLY A 24 44.622 39.755 5.435 1.00 0.00 C -ATOM 25 C GLY A 25 43.622 36.755 3.435 1.00 0.00 C -END -MODEL 26 LYS46A-LYS110A -ATOM 1 C GLY A 1 34.622 22.755 -2.565 1.00 0.00 C -ATOM 2 C GLY A 2 32.622 21.755 -5.565 1.00 0.00 C -ATOM 3 C GLY A 3 31.622 21.755 -5.565 1.00 0.00 C -ATOM 4 C GLY A 4 30.622 21.755 -5.565 1.00 0.00 C -ATOM 5 C GLY A 5 29.622 21.755 -5.565 1.00 0.00 C -ATOM 6 C GLY A 6 28.622 21.755 -5.565 1.00 0.00 C -ATOM 7 C GLY A 7 27.622 20.755 -4.565 1.00 0.00 C -ATOM 8 C GLY A 8 26.622 20.755 -3.565 1.00 0.00 C -ATOM 9 C GLY A 9 25.622 20.755 -2.565 1.00 0.00 C -ATOM 10 C GLY A 10 24.622 20.755 -1.565 1.00 0.00 C -ATOM 11 C GLY A 11 23.622 20.755 -0.565 1.00 0.00 C -ATOM 12 C GLY A 12 22.622 21.755 0.435 1.00 0.00 C -ATOM 13 C GLY A 13 21.622 22.755 1.435 1.00 0.00 C -ATOM 14 C GLY A 14 20.622 23.755 2.435 1.00 0.00 C -ATOM 15 C GLY A 15 19.622 24.755 3.435 1.00 0.00 C -ATOM 16 C GLY A 16 18.622 24.755 4.435 1.00 0.00 C -ATOM 17 C GLY A 17 18.622 25.755 5.435 1.00 0.00 C -ATOM 18 C GLY A 18 17.622 26.755 6.435 1.00 0.00 C -ATOM 19 C GLY A 19 16.622 27.755 7.435 1.00 0.00 C -ATOM 20 C GLY A 20 17.622 28.755 8.435 1.00 0.00 C -ATOM 21 C GLY A 21 17.622 29.755 9.435 1.00 0.00 C -ATOM 22 C GLY A 22 17.622 29.755 10.435 1.00 0.00 C -ATOM 23 C GLY A 23 17.622 29.755 11.435 1.00 0.00 C -ATOM 24 C GLY A 24 17.622 29.755 12.435 1.00 0.00 C -ATOM 25 C GLY A 25 17.622 29.755 13.435 1.00 0.00 C -ATOM 26 C GLY A 26 17.622 29.755 14.435 1.00 0.00 C -ATOM 27 C GLY A 27 17.622 29.755 15.435 1.00 0.00 C -ATOM 28 C GLY A 28 17.622 30.755 16.435 1.00 0.00 C -ATOM 29 C GLY A 29 18.622 31.755 17.435 1.00 0.00 C -ATOM 30 C GLY A 30 19.622 32.755 18.435 1.00 0.00 C -ATOM 31 C GLY A 31 20.622 33.755 19.435 1.00 0.00 C -ATOM 32 C GLY A 32 21.622 34.755 20.435 1.00 0.00 C -ATOM 33 C GLY A 33 22.622 35.755 21.435 1.00 0.00 C -ATOM 34 C GLY A 34 23.622 35.755 22.435 1.00 0.00 C -ATOM 35 C GLY A 35 24.622 35.755 22.435 1.00 0.00 C -ATOM 36 C GLY A 36 25.622 35.755 23.435 1.00 0.00 C -ATOM 37 C GLY A 37 26.622 34.755 24.435 1.00 0.00 C -ATOM 38 C GLY A 38 27.622 34.755 25.435 1.00 0.00 C -ATOM 39 C GLY A 39 28.622 34.755 25.435 1.00 0.00 C -ATOM 40 C GLY A 40 29.622 34.755 25.435 1.00 0.00 C -ATOM 41 C GLY A 41 32.622 34.755 24.435 1.00 0.00 C -END -MODEL 27 LYS46A-LYS119A -ATOM 1 C GLY A 1 36.622 18.755 18.435 1.00 0.00 C -ATOM 2 C GLY A 2 39.622 16.755 18.435 1.00 0.00 C -ATOM 3 C GLY A 3 40.622 16.755 19.435 1.00 0.00 C -ATOM 4 C GLY A 4 41.622 17.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 42.622 18.755 21.435 1.00 0.00 C -ATOM 6 C GLY A 6 42.622 19.755 22.435 1.00 0.00 C -ATOM 7 C GLY A 7 42.622 20.755 23.435 1.00 0.00 C -ATOM 8 C GLY A 8 42.622 21.755 24.435 1.00 0.00 C -ATOM 9 C GLY A 9 41.622 22.755 25.435 1.00 0.00 C -ATOM 10 C GLY A 10 40.622 23.755 26.435 1.00 0.00 C -ATOM 11 C GLY A 11 39.622 24.755 27.435 1.00 0.00 C -ATOM 12 C GLY A 12 38.622 25.755 28.435 1.00 0.00 C -ATOM 13 C GLY A 13 37.622 26.755 29.435 1.00 0.00 C -ATOM 14 C GLY A 14 36.622 27.755 30.435 1.00 0.00 C -ATOM 15 C GLY A 15 35.622 28.755 30.435 1.00 0.00 C -ATOM 16 C GLY A 16 34.622 29.755 30.435 1.00 0.00 C -ATOM 17 C GLY A 17 33.622 30.755 30.435 1.00 0.00 C -ATOM 18 C GLY A 18 32.622 31.755 29.435 1.00 0.00 C -ATOM 19 C GLY A 19 31.622 32.755 28.435 1.00 0.00 C -ATOM 20 C GLY A 20 31.622 33.755 27.435 1.00 0.00 C -ATOM 21 C GLY A 21 32.622 34.755 24.435 1.00 0.00 C -END -MODEL 28 LYS46A-LYS125A -ATOM 1 C GLY A 1 38.622 18.755 13.435 1.00 0.00 C -ATOM 2 C GLY A 2 38.622 16.755 16.435 1.00 0.00 C -ATOM 3 C GLY A 3 39.622 16.755 17.435 1.00 0.00 C -ATOM 4 C GLY A 4 39.622 16.755 18.435 1.00 0.00 C -ATOM 5 C GLY A 5 40.622 16.755 19.435 1.00 0.00 C -ATOM 6 C GLY A 6 41.622 17.755 20.435 1.00 0.00 C -ATOM 7 C GLY A 7 42.622 18.755 21.435 1.00 0.00 C -ATOM 8 C GLY A 8 42.622 19.755 22.435 1.00 0.00 C -ATOM 9 C GLY A 9 42.622 20.755 23.435 1.00 0.00 C -ATOM 10 C GLY A 10 42.622 21.755 24.435 1.00 0.00 C -ATOM 11 C GLY A 11 41.622 22.755 25.435 1.00 0.00 C -ATOM 12 C GLY A 12 40.622 23.755 26.435 1.00 0.00 C -ATOM 13 C GLY A 13 39.622 24.755 27.435 1.00 0.00 C -ATOM 14 C GLY A 14 38.622 25.755 28.435 1.00 0.00 C -ATOM 15 C GLY A 15 37.622 26.755 29.435 1.00 0.00 C -ATOM 16 C GLY A 16 36.622 27.755 30.435 1.00 0.00 C -ATOM 17 C GLY A 17 35.622 28.755 30.435 1.00 0.00 C -ATOM 18 C GLY A 18 34.622 29.755 30.435 1.00 0.00 C -ATOM 19 C GLY A 19 33.622 30.755 30.435 1.00 0.00 C -ATOM 20 C GLY A 20 32.622 31.755 29.435 1.00 0.00 C -ATOM 21 C GLY A 21 31.622 32.755 28.435 1.00 0.00 C -ATOM 22 C GLY A 22 31.622 33.755 27.435 1.00 0.00 C -ATOM 23 C GLY A 23 32.622 34.755 24.435 1.00 0.00 C -END -MODEL 29 LYS46A-LYS129A -ATOM 1 C GLY A 1 36.622 12.755 9.435 1.00 0.00 C -ATOM 2 C GLY A 2 36.622 12.755 13.435 1.00 0.00 C -ATOM 3 C GLY A 3 36.622 12.755 14.435 1.00 0.00 C -ATOM 4 C GLY A 4 36.622 12.755 15.435 1.00 0.00 C -ATOM 5 C GLY A 5 37.622 13.755 16.435 1.00 0.00 C -ATOM 6 C GLY A 6 38.622 14.755 17.435 1.00 0.00 C -ATOM 7 C GLY A 7 39.622 15.755 18.435 1.00 0.00 C -ATOM 8 C GLY A 8 40.622 16.755 19.435 1.00 0.00 C -ATOM 9 C GLY A 9 41.622 17.755 20.435 1.00 0.00 C -ATOM 10 C GLY A 10 42.622 18.755 21.435 1.00 0.00 C -ATOM 11 C GLY A 11 42.622 19.755 22.435 1.00 0.00 C -ATOM 12 C GLY A 12 42.622 20.755 23.435 1.00 0.00 C -ATOM 13 C GLY A 13 42.622 21.755 24.435 1.00 0.00 C -ATOM 14 C GLY A 14 41.622 22.755 25.435 1.00 0.00 C -ATOM 15 C GLY A 15 40.622 23.755 26.435 1.00 0.00 C -ATOM 16 C GLY A 16 39.622 24.755 27.435 1.00 0.00 C -ATOM 17 C GLY A 17 38.622 25.755 28.435 1.00 0.00 C -ATOM 18 C GLY A 18 37.622 26.755 29.435 1.00 0.00 C -ATOM 19 C GLY A 19 36.622 27.755 30.435 1.00 0.00 C -ATOM 20 C GLY A 20 35.622 28.755 30.435 1.00 0.00 C -ATOM 21 C GLY A 21 34.622 29.755 30.435 1.00 0.00 C -ATOM 22 C GLY A 22 33.622 30.755 30.435 1.00 0.00 C -ATOM 23 C GLY A 23 32.622 31.755 29.435 1.00 0.00 C -ATOM 24 C GLY A 24 31.622 32.755 28.435 1.00 0.00 C -ATOM 25 C GLY A 25 31.622 33.755 27.435 1.00 0.00 C -ATOM 26 C GLY A 26 32.622 34.755 24.435 1.00 0.00 C -END -MODEL 30 LYS46A-LYS135A -ATOM 1 C GLY A 1 32.622 34.755 24.435 1.00 0.00 C -ATOM 2 C GLY A 2 30.622 32.755 26.435 1.00 0.00 C -ATOM 3 C GLY A 3 30.622 31.755 26.435 1.00 0.00 C -ATOM 4 C GLY A 4 30.622 30.755 27.435 1.00 0.00 C -ATOM 5 C GLY A 5 30.622 29.755 27.435 1.00 0.00 C -ATOM 6 C GLY A 6 30.622 28.755 27.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 27.755 27.435 1.00 0.00 C -ATOM 8 C GLY A 8 29.622 26.755 27.435 1.00 0.00 C -ATOM 9 C GLY A 9 28.622 25.755 27.435 1.00 0.00 C -ATOM 10 C GLY A 10 27.622 24.755 27.435 1.00 0.00 C -ATOM 11 C GLY A 11 26.622 23.755 26.435 1.00 0.00 C -ATOM 12 C GLY A 12 26.622 22.755 25.435 1.00 0.00 C -ATOM 13 C GLY A 13 25.622 21.755 24.435 1.00 0.00 C -ATOM 14 C GLY A 14 24.622 20.755 23.435 1.00 0.00 C -ATOM 15 C GLY A 15 24.622 19.755 22.435 1.00 0.00 C -ATOM 16 C GLY A 16 24.622 18.755 21.435 1.00 0.00 C -ATOM 17 C GLY A 17 25.622 17.755 20.435 1.00 0.00 C -ATOM 18 C GLY A 18 27.622 16.755 17.435 1.00 0.00 C -END -MODEL 31 LYS52A-LYS66A -ATOM 1 C GLY A 1 33.622 37.755 16.435 1.00 0.00 C -ATOM 2 C GLY A 2 31.622 40.755 15.435 1.00 0.00 C -ATOM 3 C GLY A 3 31.622 41.755 15.435 1.00 0.00 C -ATOM 4 C GLY A 4 31.622 42.755 14.435 1.00 0.00 C -ATOM 5 C GLY A 5 31.622 43.755 13.435 1.00 0.00 C -ATOM 6 C GLY A 6 31.622 43.755 12.435 1.00 0.00 C -ATOM 7 C GLY A 7 31.622 43.755 11.435 1.00 0.00 C -ATOM 8 C GLY A 8 32.622 43.755 10.435 1.00 0.00 C -ATOM 9 C GLY A 9 33.622 42.755 9.435 1.00 0.00 C -ATOM 10 C GLY A 10 34.622 41.755 9.435 1.00 0.00 C -ATOM 11 C GLY A 11 34.622 40.755 9.435 1.00 0.00 C -ATOM 12 C GLY A 12 35.622 39.755 8.435 1.00 0.00 C -ATOM 13 C GLY A 13 35.622 35.755 8.435 1.00 0.00 C -END -MODEL 32 LYS52A-LYS77A -ATOM 1 C GLY A 1 33.622 37.755 16.435 1.00 0.00 C -ATOM 2 C GLY A 2 34.622 40.755 16.435 1.00 0.00 C -ATOM 3 C GLY A 3 35.622 41.755 16.435 1.00 0.00 C -ATOM 4 C GLY A 4 36.622 42.755 16.435 1.00 0.00 C -ATOM 5 C GLY A 5 37.622 43.755 16.435 1.00 0.00 C -ATOM 6 C GLY A 6 38.622 43.755 17.435 1.00 0.00 C -ATOM 7 C GLY A 7 39.622 43.755 17.435 1.00 0.00 C -ATOM 8 C GLY A 8 40.622 43.755 17.435 1.00 0.00 C -ATOM 9 C GLY A 9 41.622 43.755 16.435 1.00 0.00 C -ATOM 10 C GLY A 10 42.622 43.755 15.435 1.00 0.00 C -ATOM 11 C GLY A 11 43.622 42.755 14.435 1.00 0.00 C -ATOM 12 C GLY A 12 44.622 41.755 13.435 1.00 0.00 C -ATOM 13 C GLY A 13 45.622 40.755 12.435 1.00 0.00 C -ATOM 14 C GLY A 14 46.622 39.755 11.435 1.00 0.00 C -ATOM 15 C GLY A 15 47.622 38.755 11.435 1.00 0.00 C -ATOM 16 C GLY A 16 48.622 37.755 10.435 1.00 0.00 C -ATOM 17 C GLY A 17 49.622 36.755 10.435 1.00 0.00 C -ATOM 18 C GLY A 18 50.622 35.755 10.435 1.00 0.00 C -ATOM 19 C GLY A 19 50.622 34.755 9.435 1.00 0.00 C -ATOM 20 C GLY A 20 50.622 33.755 8.435 1.00 0.00 C -ATOM 21 C GLY A 21 50.622 32.755 7.435 1.00 0.00 C -ATOM 22 C GLY A 22 49.622 31.755 6.435 1.00 0.00 C -ATOM 23 C GLY A 23 48.622 30.755 5.435 1.00 0.00 C -ATOM 24 C GLY A 24 47.622 29.755 4.435 1.00 0.00 C -ATOM 25 C GLY A 25 46.622 28.755 3.435 1.00 0.00 C -ATOM 26 C GLY A 26 45.622 27.755 3.435 1.00 0.00 C -ATOM 27 C GLY A 27 44.622 26.755 3.435 1.00 0.00 C -ATOM 28 C GLY A 28 43.622 25.755 3.435 1.00 0.00 C -ATOM 29 C GLY A 29 42.622 22.755 2.435 1.00 0.00 C -END -MODEL 33 LYS52A-LYS86A -ATOM 1 C GLY A 1 33.622 37.755 16.435 1.00 0.00 C -ATOM 2 C GLY A 2 31.622 40.755 15.435 1.00 0.00 C -ATOM 3 C GLY A 3 31.622 41.755 15.435 1.00 0.00 C -ATOM 4 C GLY A 4 31.622 42.755 14.435 1.00 0.00 C -ATOM 5 C GLY A 5 31.622 43.755 13.435 1.00 0.00 C -ATOM 6 C GLY A 6 32.622 43.755 12.435 1.00 0.00 C -ATOM 7 C GLY A 7 33.622 44.755 11.435 1.00 0.00 C -ATOM 8 C GLY A 8 34.622 44.755 10.435 1.00 0.00 C -ATOM 9 C GLY A 9 35.622 43.755 9.435 1.00 0.00 C -ATOM 10 C GLY A 10 36.622 42.755 8.435 1.00 0.00 C -ATOM 11 C GLY A 11 37.622 41.755 7.435 1.00 0.00 C -ATOM 12 C GLY A 12 38.622 40.755 6.435 1.00 0.00 C -ATOM 13 C GLY A 13 39.622 40.755 5.435 1.00 0.00 C -ATOM 14 C GLY A 14 40.622 40.755 5.435 1.00 0.00 C -ATOM 15 C GLY A 15 41.622 39.755 4.435 1.00 0.00 C -ATOM 16 C GLY A 16 43.622 36.755 3.435 1.00 0.00 C -END -MODEL 34 LYS52A-LYS110A -ATOM 1 C GLY A 1 33.622 37.755 16.435 1.00 0.00 C -ATOM 2 C GLY A 2 31.622 40.755 15.435 1.00 0.00 C -ATOM 3 C GLY A 3 31.622 41.755 15.435 1.00 0.00 C -ATOM 4 C GLY A 4 31.622 42.755 14.435 1.00 0.00 C -ATOM 5 C GLY A 5 31.622 43.755 13.435 1.00 0.00 C -ATOM 6 C GLY A 6 31.622 43.755 12.435 1.00 0.00 C -ATOM 7 C GLY A 7 31.622 43.755 11.435 1.00 0.00 C -ATOM 8 C GLY A 8 31.622 43.755 10.435 1.00 0.00 C -ATOM 9 C GLY A 9 32.622 43.755 9.435 1.00 0.00 C -ATOM 10 C GLY A 10 32.622 43.755 8.435 1.00 0.00 C -ATOM 11 C GLY A 11 32.622 43.755 7.435 1.00 0.00 C -ATOM 12 C GLY A 12 32.622 43.755 6.435 1.00 0.00 C -ATOM 13 C GLY A 13 32.622 43.755 5.435 1.00 0.00 C -ATOM 14 C GLY A 14 32.622 43.755 4.435 1.00 0.00 C -ATOM 15 C GLY A 15 32.622 42.755 3.435 1.00 0.00 C -ATOM 16 C GLY A 16 32.622 41.755 2.435 1.00 0.00 C -ATOM 17 C GLY A 17 32.622 40.755 1.435 1.00 0.00 C -ATOM 18 C GLY A 18 32.622 39.755 0.435 1.00 0.00 C -ATOM 19 C GLY A 19 32.622 38.755 -0.565 1.00 0.00 C -ATOM 20 C GLY A 20 33.622 37.755 -1.565 1.00 0.00 C -ATOM 21 C GLY A 21 33.622 36.755 -2.565 1.00 0.00 C -ATOM 22 C GLY A 22 34.622 35.755 -3.565 1.00 0.00 C -ATOM 23 C GLY A 23 35.622 34.755 -4.565 1.00 0.00 C -ATOM 24 C GLY A 24 35.622 33.755 -5.565 1.00 0.00 C -ATOM 25 C GLY A 25 35.622 32.755 -6.565 1.00 0.00 C -ATOM 26 C GLY A 26 34.622 31.755 -6.565 1.00 0.00 C -ATOM 27 C GLY A 27 33.622 30.755 -6.565 1.00 0.00 C -ATOM 28 C GLY A 28 33.622 29.755 -6.565 1.00 0.00 C -ATOM 29 C GLY A 29 33.622 28.755 -5.565 1.00 0.00 C -ATOM 30 C GLY A 30 33.622 27.755 -4.565 1.00 0.00 C -ATOM 31 C GLY A 31 33.622 26.755 -4.565 1.00 0.00 C -ATOM 32 C GLY A 32 33.622 25.755 -4.565 1.00 0.00 C -ATOM 33 C GLY A 33 34.622 22.755 -2.565 1.00 0.00 C -END -MODEL 35 LYS52A-LYS119A -ATOM 1 C GLY A 1 36.622 18.755 18.435 1.00 0.00 C -ATOM 2 C GLY A 2 39.622 16.755 18.435 1.00 0.00 C -ATOM 3 C GLY A 3 40.622 16.755 19.435 1.00 0.00 C -ATOM 4 C GLY A 4 41.622 17.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 42.622 18.755 21.435 1.00 0.00 C -ATOM 6 C GLY A 6 42.622 19.755 22.435 1.00 0.00 C -ATOM 7 C GLY A 7 42.622 20.755 22.435 1.00 0.00 C -ATOM 8 C GLY A 8 42.622 21.755 23.435 1.00 0.00 C -ATOM 9 C GLY A 9 42.622 22.755 24.435 1.00 0.00 C -ATOM 10 C GLY A 10 41.622 23.755 25.435 1.00 0.00 C -ATOM 11 C GLY A 11 40.622 24.755 26.435 1.00 0.00 C -ATOM 12 C GLY A 12 39.622 25.755 27.435 1.00 0.00 C -ATOM 13 C GLY A 13 38.622 26.755 28.435 1.00 0.00 C -ATOM 14 C GLY A 14 37.622 27.755 29.435 1.00 0.00 C -ATOM 15 C GLY A 15 36.622 28.755 30.435 1.00 0.00 C -ATOM 16 C GLY A 16 35.622 29.755 30.435 1.00 0.00 C -ATOM 17 C GLY A 17 34.622 30.755 30.435 1.00 0.00 C -ATOM 18 C GLY A 18 33.622 31.755 31.435 1.00 0.00 C -ATOM 19 C GLY A 19 32.622 32.755 31.435 1.00 0.00 C -ATOM 20 C GLY A 20 32.622 33.755 30.435 1.00 0.00 C -ATOM 21 C GLY A 21 32.622 34.755 29.435 1.00 0.00 C -ATOM 22 C GLY A 22 31.622 35.755 28.435 1.00 0.00 C -ATOM 23 C GLY A 23 30.622 36.755 27.435 1.00 0.00 C -ATOM 24 C GLY A 24 29.622 37.755 26.435 1.00 0.00 C -ATOM 25 C GLY A 25 29.622 38.755 25.435 1.00 0.00 C -ATOM 26 C GLY A 26 29.622 39.755 24.435 1.00 0.00 C -ATOM 27 C GLY A 27 29.622 39.755 23.435 1.00 0.00 C -ATOM 28 C GLY A 28 30.622 39.755 22.435 1.00 0.00 C -ATOM 29 C GLY A 29 30.622 39.755 21.435 1.00 0.00 C -ATOM 30 C GLY A 30 31.622 39.755 20.435 1.00 0.00 C -ATOM 31 C GLY A 31 32.622 38.755 19.435 1.00 0.00 C -ATOM 32 C GLY A 32 33.622 37.755 16.435 1.00 0.00 C -END -MODEL 36 LYS52A-LYS125A -ATOM 1 C GLY A 1 38.622 18.755 13.435 1.00 0.00 C -ATOM 2 C GLY A 2 41.622 18.755 14.435 1.00 0.00 C -ATOM 3 C GLY A 3 42.622 19.755 14.435 1.00 0.00 C -ATOM 4 C GLY A 4 42.622 20.755 15.435 1.00 0.00 C -ATOM 5 C GLY A 5 43.622 21.755 15.435 1.00 0.00 C -ATOM 6 C GLY A 6 44.622 22.755 15.435 1.00 0.00 C -ATOM 7 C GLY A 7 44.622 23.755 15.435 1.00 0.00 C -ATOM 8 C GLY A 8 44.622 24.755 16.435 1.00 0.00 C -ATOM 9 C GLY A 9 44.622 25.755 17.435 1.00 0.00 C -ATOM 10 C GLY A 10 45.622 26.755 18.435 1.00 0.00 C -ATOM 11 C GLY A 11 45.622 27.755 19.435 1.00 0.00 C -ATOM 12 C GLY A 12 45.622 28.755 20.435 1.00 0.00 C -ATOM 13 C GLY A 13 45.622 29.755 21.435 1.00 0.00 C -ATOM 14 C GLY A 14 45.622 30.755 21.435 1.00 0.00 C -ATOM 15 C GLY A 15 45.622 31.755 21.435 1.00 0.00 C -ATOM 16 C GLY A 16 45.622 32.755 21.435 1.00 0.00 C -ATOM 17 C GLY A 17 45.622 33.755 21.435 1.00 0.00 C -ATOM 18 C GLY A 18 44.622 34.755 21.435 1.00 0.00 C -ATOM 19 C GLY A 19 43.622 35.755 22.435 1.00 0.00 C -ATOM 20 C GLY A 20 42.622 36.755 23.435 1.00 0.00 C -ATOM 21 C GLY A 21 41.622 37.755 24.435 1.00 0.00 C -ATOM 22 C GLY A 22 40.622 38.755 25.435 1.00 0.00 C -ATOM 23 C GLY A 23 39.622 39.755 26.435 1.00 0.00 C -ATOM 24 C GLY A 24 38.622 40.755 25.435 1.00 0.00 C -ATOM 25 C GLY A 25 37.622 41.755 24.435 1.00 0.00 C -ATOM 26 C GLY A 26 36.622 41.755 23.435 1.00 0.00 C -ATOM 27 C GLY A 27 35.622 41.755 22.435 1.00 0.00 C -ATOM 28 C GLY A 28 35.622 41.755 21.435 1.00 0.00 C -ATOM 29 C GLY A 29 34.622 40.755 20.435 1.00 0.00 C -ATOM 30 C GLY A 30 34.622 39.755 19.435 1.00 0.00 C -ATOM 31 C GLY A 31 33.622 37.755 16.435 1.00 0.00 C -END -MODEL 37 LYS52A-LYS129A -ATOM 1 C GLY A 1 33.622 37.755 16.435 1.00 0.00 C -ATOM 2 C GLY A 2 31.622 37.755 19.435 1.00 0.00 C -ATOM 3 C GLY A 3 31.622 37.755 20.435 1.00 0.00 C -ATOM 4 C GLY A 4 32.622 38.755 21.435 1.00 0.00 C -ATOM 5 C GLY A 5 33.622 39.755 22.435 1.00 0.00 C -ATOM 6 C GLY A 6 34.622 40.755 23.435 1.00 0.00 C -ATOM 7 C GLY A 7 35.622 41.755 24.435 1.00 0.00 C -ATOM 8 C GLY A 8 36.622 40.755 25.435 1.00 0.00 C -ATOM 9 C GLY A 9 37.622 39.755 26.435 1.00 0.00 C -ATOM 10 C GLY A 10 38.622 38.755 26.435 1.00 0.00 C -ATOM 11 C GLY A 11 38.622 37.755 26.435 1.00 0.00 C -ATOM 12 C GLY A 12 38.622 36.755 26.435 1.00 0.00 C -ATOM 13 C GLY A 13 39.622 35.755 26.435 1.00 0.00 C -ATOM 14 C GLY A 14 39.622 34.755 26.435 1.00 0.00 C -ATOM 15 C GLY A 15 40.622 33.755 26.435 1.00 0.00 C -ATOM 16 C GLY A 16 40.622 32.755 26.435 1.00 0.00 C -ATOM 17 C GLY A 17 40.622 31.755 26.435 1.00 0.00 C -ATOM 18 C GLY A 18 40.622 30.755 26.435 1.00 0.00 C -ATOM 19 C GLY A 19 41.622 29.755 26.435 1.00 0.00 C -ATOM 20 C GLY A 20 42.622 28.755 25.435 1.00 0.00 C -ATOM 21 C GLY A 21 42.622 27.755 24.435 1.00 0.00 C -ATOM 22 C GLY A 22 43.622 26.755 23.435 1.00 0.00 C -ATOM 23 C GLY A 23 44.622 25.755 22.435 1.00 0.00 C -ATOM 24 C GLY A 24 45.622 24.755 21.435 1.00 0.00 C -ATOM 25 C GLY A 25 46.622 23.755 20.435 1.00 0.00 C -ATOM 26 C GLY A 26 47.622 22.755 19.435 1.00 0.00 C -ATOM 27 C GLY A 27 46.622 21.755 18.435 1.00 0.00 C -ATOM 28 C GLY A 28 45.622 20.755 17.435 1.00 0.00 C -ATOM 29 C GLY A 29 44.622 19.755 17.435 1.00 0.00 C -ATOM 30 C GLY A 30 43.622 18.755 16.435 1.00 0.00 C -ATOM 31 C GLY A 31 42.622 17.755 16.435 1.00 0.00 C -ATOM 32 C GLY A 32 41.622 16.755 15.435 1.00 0.00 C -ATOM 33 C GLY A 33 40.622 15.755 14.435 1.00 0.00 C -ATOM 34 C GLY A 34 39.622 14.755 13.435 1.00 0.00 C -ATOM 35 C GLY A 35 38.622 13.755 12.435 1.00 0.00 C -ATOM 36 C GLY A 36 36.622 12.755 9.435 1.00 0.00 C -END -MODEL 38 LYS52A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 24.622 17.755 19.435 1.00 0.00 C -ATOM 3 C GLY A 3 24.622 18.755 20.435 1.00 0.00 C -ATOM 4 C GLY A 4 23.622 19.755 20.435 1.00 0.00 C -ATOM 5 C GLY A 5 23.622 20.755 20.435 1.00 0.00 C -ATOM 6 C GLY A 6 23.622 21.755 21.435 1.00 0.00 C -ATOM 7 C GLY A 7 23.622 22.755 22.435 1.00 0.00 C -ATOM 8 C GLY A 8 23.622 23.755 22.435 1.00 0.00 C -ATOM 9 C GLY A 9 23.622 24.755 22.435 1.00 0.00 C -ATOM 10 C GLY A 10 23.622 25.755 22.435 1.00 0.00 C -ATOM 11 C GLY A 11 23.622 26.755 23.435 1.00 0.00 C -ATOM 12 C GLY A 12 23.622 27.755 23.435 1.00 0.00 C -ATOM 13 C GLY A 13 23.622 28.755 23.435 1.00 0.00 C -ATOM 14 C GLY A 14 23.622 29.755 24.435 1.00 0.00 C -ATOM 15 C GLY A 15 23.622 30.755 24.435 1.00 0.00 C -ATOM 16 C GLY A 16 23.622 31.755 24.435 1.00 0.00 C -ATOM 17 C GLY A 17 23.622 32.755 24.435 1.00 0.00 C -ATOM 18 C GLY A 18 23.622 33.755 24.435 1.00 0.00 C -ATOM 19 C GLY A 19 23.622 34.755 24.435 1.00 0.00 C -ATOM 20 C GLY A 20 23.622 35.755 24.435 1.00 0.00 C -ATOM 21 C GLY A 21 23.622 36.755 24.435 1.00 0.00 C -ATOM 22 C GLY A 22 24.622 37.755 24.435 1.00 0.00 C -ATOM 23 C GLY A 23 25.622 38.755 24.435 1.00 0.00 C -ATOM 24 C GLY A 24 26.622 39.755 23.435 1.00 0.00 C -ATOM 25 C GLY A 25 27.622 39.755 22.435 1.00 0.00 C -ATOM 26 C GLY A 26 28.622 39.755 21.435 1.00 0.00 C -ATOM 27 C GLY A 27 29.622 39.755 20.435 1.00 0.00 C -ATOM 28 C GLY A 28 30.622 39.755 19.435 1.00 0.00 C -ATOM 29 C GLY A 29 31.622 39.755 18.435 1.00 0.00 C -ATOM 30 C GLY A 30 33.622 37.755 16.435 1.00 0.00 C -END -MODEL 39 LYS66A-LYS77A -ATOM 1 C GLY A 1 42.622 22.755 2.435 1.00 0.00 C -ATOM 2 C GLY A 2 42.622 26.755 2.435 1.00 0.00 C -ATOM 3 C GLY A 3 43.622 27.755 2.435 1.00 0.00 C -ATOM 4 C GLY A 4 44.622 28.755 2.435 1.00 0.00 C -ATOM 5 C GLY A 5 45.622 29.755 1.435 1.00 0.00 C -ATOM 6 C GLY A 6 46.622 30.755 1.435 1.00 0.00 C -ATOM 7 C GLY A 7 46.622 31.755 1.435 1.00 0.00 C -ATOM 8 C GLY A 8 46.622 32.755 1.435 1.00 0.00 C -ATOM 9 C GLY A 9 46.622 33.755 2.435 1.00 0.00 C -ATOM 10 C GLY A 10 46.622 34.755 2.435 1.00 0.00 C -ATOM 11 C GLY A 11 46.622 35.755 2.435 1.00 0.00 C -ATOM 12 C GLY A 12 46.622 36.755 1.435 1.00 0.00 C -ATOM 13 C GLY A 13 45.622 37.755 0.435 1.00 0.00 C -ATOM 14 C GLY A 14 44.622 38.755 0.435 1.00 0.00 C -ATOM 15 C GLY A 15 43.622 39.755 1.435 1.00 0.00 C -ATOM 16 C GLY A 16 42.622 40.755 2.435 1.00 0.00 C -ATOM 17 C GLY A 17 41.622 40.755 3.435 1.00 0.00 C -ATOM 18 C GLY A 18 40.622 40.755 4.435 1.00 0.00 C -ATOM 19 C GLY A 19 39.622 40.755 5.435 1.00 0.00 C -ATOM 20 C GLY A 20 38.622 39.755 6.435 1.00 0.00 C -ATOM 21 C GLY A 21 37.622 38.755 7.435 1.00 0.00 C -ATOM 22 C GLY A 22 35.622 35.755 8.435 1.00 0.00 C -END -MODEL 40 LYS66A-LYS86A -ATOM 1 C GLY A 1 35.622 35.755 8.435 1.00 0.00 C -ATOM 2 C GLY A 2 37.622 38.755 7.435 1.00 0.00 C -ATOM 3 C GLY A 3 38.622 39.755 6.435 1.00 0.00 C -ATOM 4 C GLY A 4 39.622 40.755 5.435 1.00 0.00 C -ATOM 5 C GLY A 5 40.622 40.755 5.435 1.00 0.00 C -ATOM 6 C GLY A 6 41.622 39.755 4.435 1.00 0.00 C -ATOM 7 C GLY A 7 43.622 36.755 3.435 1.00 0.00 C -END -MODEL 41 LYS66A-LYS110A -ATOM 1 C GLY A 1 34.622 22.755 -2.565 1.00 0.00 C -ATOM 2 C GLY A 2 33.622 25.755 -4.565 1.00 0.00 C -ATOM 3 C GLY A 3 33.622 26.755 -4.565 1.00 0.00 C -ATOM 4 C GLY A 4 33.622 27.755 -4.565 1.00 0.00 C -ATOM 5 C GLY A 5 33.622 28.755 -5.565 1.00 0.00 C -ATOM 6 C GLY A 6 33.622 29.755 -6.565 1.00 0.00 C -ATOM 7 C GLY A 7 33.622 30.755 -6.565 1.00 0.00 C -ATOM 8 C GLY A 8 34.622 31.755 -6.565 1.00 0.00 C -ATOM 9 C GLY A 9 34.622 32.755 -6.565 1.00 0.00 C -ATOM 10 C GLY A 10 35.622 33.755 -5.565 1.00 0.00 C -ATOM 11 C GLY A 11 35.622 34.755 -4.565 1.00 0.00 C -ATOM 12 C GLY A 12 34.622 35.755 -3.565 1.00 0.00 C -ATOM 13 C GLY A 13 34.622 35.755 -2.565 1.00 0.00 C -ATOM 14 C GLY A 14 34.622 36.755 -1.565 1.00 0.00 C -ATOM 15 C GLY A 15 34.622 36.755 -0.565 1.00 0.00 C -ATOM 16 C GLY A 16 34.622 37.755 0.435 1.00 0.00 C -ATOM 17 C GLY A 17 34.622 38.755 1.435 1.00 0.00 C -ATOM 18 C GLY A 18 34.622 39.755 2.435 1.00 0.00 C -ATOM 19 C GLY A 19 34.622 40.755 3.435 1.00 0.00 C -ATOM 20 C GLY A 20 34.622 40.755 4.435 1.00 0.00 C -ATOM 21 C GLY A 21 34.622 40.755 5.435 1.00 0.00 C -ATOM 22 C GLY A 22 34.622 40.755 6.435 1.00 0.00 C -ATOM 23 C GLY A 23 34.622 40.755 7.435 1.00 0.00 C -ATOM 24 C GLY A 24 35.622 39.755 8.435 1.00 0.00 C -ATOM 25 C GLY A 25 35.622 35.755 8.435 1.00 0.00 C -END -MODEL 42 LYS66A-LYS119A -ATOM 1 C GLY A 1 35.622 35.755 8.435 1.00 0.00 C -ATOM 2 C GLY A 2 37.622 38.755 7.435 1.00 0.00 C -ATOM 3 C GLY A 3 38.622 39.755 6.435 1.00 0.00 C -ATOM 4 C GLY A 4 39.622 40.755 5.435 1.00 0.00 C -ATOM 5 C GLY A 5 40.622 40.755 4.435 1.00 0.00 C -ATOM 6 C GLY A 6 41.622 40.755 3.435 1.00 0.00 C -ATOM 7 C GLY A 7 42.622 40.755 2.435 1.00 0.00 C -ATOM 8 C GLY A 8 43.622 39.755 1.435 1.00 0.00 C -ATOM 9 C GLY A 9 44.622 38.755 0.435 1.00 0.00 C -ATOM 10 C GLY A 10 45.622 37.755 0.435 1.00 0.00 C -ATOM 11 C GLY A 11 46.622 36.755 1.435 1.00 0.00 C -ATOM 12 C GLY A 12 46.622 35.755 2.435 1.00 0.00 C -ATOM 13 C GLY A 13 46.622 34.755 2.435 1.00 0.00 C -ATOM 14 C GLY A 14 46.622 33.755 3.435 1.00 0.00 C -ATOM 15 C GLY A 15 46.622 32.755 4.435 1.00 0.00 C -ATOM 16 C GLY A 16 46.622 31.755 5.435 1.00 0.00 C -ATOM 17 C GLY A 17 47.622 30.755 6.435 1.00 0.00 C -ATOM 18 C GLY A 18 47.622 29.755 7.435 1.00 0.00 C -ATOM 19 C GLY A 19 47.622 28.755 8.435 1.00 0.00 C -ATOM 20 C GLY A 20 47.622 27.755 9.435 1.00 0.00 C -ATOM 21 C GLY A 21 47.622 26.755 10.435 1.00 0.00 C -ATOM 22 C GLY A 22 47.622 25.755 11.435 1.00 0.00 C -ATOM 23 C GLY A 23 47.622 24.755 12.435 1.00 0.00 C -ATOM 24 C GLY A 24 46.622 23.755 13.435 1.00 0.00 C -ATOM 25 C GLY A 25 45.622 22.755 14.435 1.00 0.00 C -ATOM 26 C GLY A 26 44.622 21.755 15.435 1.00 0.00 C -ATOM 27 C GLY A 27 43.622 20.755 15.435 1.00 0.00 C -ATOM 28 C GLY A 28 42.622 19.755 15.435 1.00 0.00 C -ATOM 29 C GLY A 29 41.622 18.755 15.435 1.00 0.00 C -ATOM 30 C GLY A 30 40.622 17.755 16.435 1.00 0.00 C -ATOM 31 C GLY A 31 39.622 17.755 17.435 1.00 0.00 C -ATOM 32 C GLY A 32 36.622 18.755 18.435 1.00 0.00 C -END -MODEL 43 LYS66A-LYS125A -ATOM 1 C GLY A 1 35.622 35.755 8.435 1.00 0.00 C -ATOM 2 C GLY A 2 37.622 38.755 7.435 1.00 0.00 C -ATOM 3 C GLY A 3 38.622 39.755 6.435 1.00 0.00 C -ATOM 4 C GLY A 4 39.622 40.755 5.435 1.00 0.00 C -ATOM 5 C GLY A 5 40.622 40.755 4.435 1.00 0.00 C -ATOM 6 C GLY A 6 41.622 40.755 3.435 1.00 0.00 C -ATOM 7 C GLY A 7 42.622 40.755 2.435 1.00 0.00 C -ATOM 8 C GLY A 8 43.622 39.755 1.435 1.00 0.00 C -ATOM 9 C GLY A 9 44.622 38.755 0.435 1.00 0.00 C -ATOM 10 C GLY A 10 45.622 37.755 0.435 1.00 0.00 C -ATOM 11 C GLY A 11 46.622 36.755 1.435 1.00 0.00 C -ATOM 12 C GLY A 12 46.622 35.755 2.435 1.00 0.00 C -ATOM 13 C GLY A 13 46.622 34.755 2.435 1.00 0.00 C -ATOM 14 C GLY A 14 46.622 33.755 3.435 1.00 0.00 C -ATOM 15 C GLY A 15 46.622 32.755 4.435 1.00 0.00 C -ATOM 16 C GLY A 16 46.622 31.755 5.435 1.00 0.00 C -ATOM 17 C GLY A 17 47.622 30.755 6.435 1.00 0.00 C -ATOM 18 C GLY A 18 47.622 29.755 7.435 1.00 0.00 C -ATOM 19 C GLY A 19 47.622 28.755 8.435 1.00 0.00 C -ATOM 20 C GLY A 20 47.622 27.755 9.435 1.00 0.00 C -ATOM 21 C GLY A 21 47.622 26.755 10.435 1.00 0.00 C -ATOM 22 C GLY A 22 47.622 25.755 11.435 1.00 0.00 C -ATOM 23 C GLY A 23 47.622 24.755 12.435 1.00 0.00 C -ATOM 24 C GLY A 24 46.622 23.755 13.435 1.00 0.00 C -ATOM 25 C GLY A 25 45.622 22.755 14.435 1.00 0.00 C -ATOM 26 C GLY A 26 44.622 21.755 15.435 1.00 0.00 C -ATOM 27 C GLY A 27 43.622 20.755 15.435 1.00 0.00 C -ATOM 28 C GLY A 28 42.622 19.755 15.435 1.00 0.00 C -ATOM 29 C GLY A 29 41.622 18.755 14.435 1.00 0.00 C -ATOM 30 C GLY A 30 38.622 18.755 13.435 1.00 0.00 C -END -MODEL 44 LYS66A-LYS129A -ATOM 1 C GLY A 1 35.622 35.755 8.435 1.00 0.00 C -ATOM 2 C GLY A 2 37.622 38.755 7.435 1.00 0.00 C -ATOM 3 C GLY A 3 38.622 39.755 6.435 1.00 0.00 C -ATOM 4 C GLY A 4 39.622 40.755 5.435 1.00 0.00 C -ATOM 5 C GLY A 5 40.622 40.755 4.435 1.00 0.00 C -ATOM 6 C GLY A 6 41.622 40.755 3.435 1.00 0.00 C -ATOM 7 C GLY A 7 42.622 40.755 2.435 1.00 0.00 C -ATOM 8 C GLY A 8 43.622 39.755 1.435 1.00 0.00 C -ATOM 9 C GLY A 9 44.622 38.755 0.435 1.00 0.00 C -ATOM 10 C GLY A 10 45.622 37.755 0.435 1.00 0.00 C -ATOM 11 C GLY A 11 46.622 36.755 1.435 1.00 0.00 C -ATOM 12 C GLY A 12 46.622 35.755 2.435 1.00 0.00 C -ATOM 13 C GLY A 13 46.622 34.755 2.435 1.00 0.00 C -ATOM 14 C GLY A 14 46.622 33.755 2.435 1.00 0.00 C -ATOM 15 C GLY A 15 46.622 32.755 3.435 1.00 0.00 C -ATOM 16 C GLY A 16 46.622 31.755 4.435 1.00 0.00 C -ATOM 17 C GLY A 17 46.622 30.755 4.435 1.00 0.00 C -ATOM 18 C GLY A 18 47.622 29.755 4.435 1.00 0.00 C -ATOM 19 C GLY A 19 47.622 28.755 4.435 1.00 0.00 C -ATOM 20 C GLY A 20 48.622 27.755 5.435 1.00 0.00 C -ATOM 21 C GLY A 21 48.622 26.755 6.435 1.00 0.00 C -ATOM 22 C GLY A 22 48.622 25.755 7.435 1.00 0.00 C -ATOM 23 C GLY A 23 48.622 24.755 8.435 1.00 0.00 C -ATOM 24 C GLY A 24 48.622 23.755 9.435 1.00 0.00 C -ATOM 25 C GLY A 25 47.622 22.755 10.435 1.00 0.00 C -ATOM 26 C GLY A 26 46.622 21.755 11.435 1.00 0.00 C -ATOM 27 C GLY A 27 45.622 20.755 12.435 1.00 0.00 C -ATOM 28 C GLY A 28 44.622 19.755 13.435 1.00 0.00 C -ATOM 29 C GLY A 29 43.622 18.755 13.435 1.00 0.00 C -ATOM 30 C GLY A 30 42.622 17.755 13.435 1.00 0.00 C -ATOM 31 C GLY A 31 41.622 16.755 14.435 1.00 0.00 C -ATOM 32 C GLY A 32 40.622 15.755 14.435 1.00 0.00 C -ATOM 33 C GLY A 33 39.622 14.755 13.435 1.00 0.00 C -ATOM 34 C GLY A 34 38.622 13.755 12.435 1.00 0.00 C -ATOM 35 C GLY A 35 36.622 12.755 9.435 1.00 0.00 C -END -MODEL 45 LYS66A-LYS135A -ATOM 1 C GLY A 1 35.622 35.755 8.435 1.00 0.00 C -ATOM 2 C GLY A 2 35.622 39.755 8.435 1.00 0.00 C -ATOM 3 C GLY A 3 34.622 40.755 7.435 1.00 0.00 C -ATOM 4 C GLY A 4 33.622 41.755 6.435 1.00 0.00 C -ATOM 5 C GLY A 5 32.622 42.755 6.435 1.00 0.00 C -ATOM 6 C GLY A 6 31.622 42.755 6.435 1.00 0.00 C -ATOM 7 C GLY A 7 30.622 42.755 6.435 1.00 0.00 C -ATOM 8 C GLY A 8 29.622 41.755 6.435 1.00 0.00 C -ATOM 9 C GLY A 9 28.622 40.755 6.435 1.00 0.00 C -ATOM 10 C GLY A 10 27.622 39.755 7.435 1.00 0.00 C -ATOM 11 C GLY A 11 26.622 38.755 8.435 1.00 0.00 C -ATOM 12 C GLY A 12 26.622 37.755 9.435 1.00 0.00 C -ATOM 13 C GLY A 13 25.622 36.755 9.435 1.00 0.00 C -ATOM 14 C GLY A 14 24.622 35.755 9.435 1.00 0.00 C -ATOM 15 C GLY A 15 23.622 34.755 10.435 1.00 0.00 C -ATOM 16 C GLY A 16 22.622 33.755 11.435 1.00 0.00 C -ATOM 17 C GLY A 17 21.622 32.755 12.435 1.00 0.00 C -ATOM 18 C GLY A 18 20.622 31.755 13.435 1.00 0.00 C -ATOM 19 C GLY A 19 19.622 30.755 14.435 1.00 0.00 C -ATOM 20 C GLY A 20 18.622 29.755 15.435 1.00 0.00 C -ATOM 21 C GLY A 21 18.622 28.755 16.435 1.00 0.00 C -ATOM 22 C GLY A 22 18.622 27.755 17.435 1.00 0.00 C -ATOM 23 C GLY A 23 18.622 26.755 18.435 1.00 0.00 C -ATOM 24 C GLY A 24 18.622 25.755 19.435 1.00 0.00 C -ATOM 25 C GLY A 25 18.622 24.755 20.435 1.00 0.00 C -ATOM 26 C GLY A 26 18.622 23.755 21.435 1.00 0.00 C -ATOM 27 C GLY A 27 19.622 22.755 22.435 1.00 0.00 C -ATOM 28 C GLY A 28 20.622 21.755 22.435 1.00 0.00 C -ATOM 29 C GLY A 29 21.622 20.755 22.435 1.00 0.00 C -ATOM 30 C GLY A 30 22.622 19.755 21.435 1.00 0.00 C -ATOM 31 C GLY A 31 23.622 18.755 20.435 1.00 0.00 C -ATOM 32 C GLY A 32 24.622 17.755 19.435 1.00 0.00 C -ATOM 33 C GLY A 33 27.622 16.755 17.435 1.00 0.00 C -END -MODEL 46 LYS77A-LYS86A -ATOM 1 C GLY A 1 42.622 22.755 2.435 1.00 0.00 C -ATOM 2 C GLY A 2 42.622 26.755 2.435 1.00 0.00 C -ATOM 3 C GLY A 3 43.622 27.755 2.435 1.00 0.00 C -ATOM 4 C GLY A 4 44.622 28.755 2.435 1.00 0.00 C -ATOM 5 C GLY A 5 45.622 29.755 1.435 1.00 0.00 C -ATOM 6 C GLY A 6 46.622 30.755 1.435 1.00 0.00 C -ATOM 7 C GLY A 7 46.622 31.755 1.435 1.00 0.00 C -ATOM 8 C GLY A 8 46.622 32.755 1.435 1.00 0.00 C -ATOM 9 C GLY A 9 46.622 33.755 2.435 1.00 0.00 C -ATOM 10 C GLY A 10 46.622 34.755 2.435 1.00 0.00 C -ATOM 11 C GLY A 11 43.622 36.755 3.435 1.00 0.00 C -END -MODEL 47 LYS77A-LYS110A -ATOM 1 C GLY A 1 42.622 22.755 2.435 1.00 0.00 C -ATOM 2 C GLY A 2 42.622 22.755 -1.565 1.00 0.00 C -ATOM 3 C GLY A 3 42.622 22.755 -2.565 1.00 0.00 C -ATOM 4 C GLY A 4 41.622 23.755 -3.565 1.00 0.00 C -ATOM 5 C GLY A 5 40.622 23.755 -4.565 1.00 0.00 C -ATOM 6 C GLY A 6 39.622 23.755 -4.565 1.00 0.00 C -ATOM 7 C GLY A 7 38.622 23.755 -4.565 1.00 0.00 C -ATOM 8 C GLY A 8 37.622 23.755 -3.565 1.00 0.00 C -ATOM 9 C GLY A 9 34.622 22.755 -2.565 1.00 0.00 C -END -MODEL 48 LYS77A-LYS119A -ATOM 1 C GLY A 1 42.622 22.755 2.435 1.00 0.00 C -ATOM 2 C GLY A 2 42.622 22.755 2.435 1.00 0.00 C -ATOM 3 C GLY A 3 45.622 21.755 1.435 1.00 0.00 C -ATOM 4 C GLY A 4 46.622 21.755 1.435 1.00 0.00 C -ATOM 5 C GLY A 5 47.622 20.755 2.435 1.00 0.00 C -ATOM 6 C GLY A 6 48.622 19.755 3.435 1.00 0.00 C -ATOM 7 C GLY A 7 48.622 19.755 4.435 1.00 0.00 C -ATOM 8 C GLY A 8 48.622 18.755 5.435 1.00 0.00 C -ATOM 9 C GLY A 9 48.622 17.755 6.435 1.00 0.00 C -ATOM 10 C GLY A 10 48.622 16.755 7.435 1.00 0.00 C -ATOM 11 C GLY A 11 47.622 15.755 8.435 1.00 0.00 C -ATOM 12 C GLY A 12 46.622 14.755 9.435 1.00 0.00 C -ATOM 13 C GLY A 13 45.622 13.755 10.435 1.00 0.00 C -ATOM 14 C GLY A 14 44.622 12.755 11.435 1.00 0.00 C -ATOM 15 C GLY A 15 43.622 13.755 12.435 1.00 0.00 C -ATOM 16 C GLY A 16 42.622 14.755 13.435 1.00 0.00 C -ATOM 17 C GLY A 17 41.622 15.755 14.435 1.00 0.00 C -ATOM 18 C GLY A 18 40.622 16.755 15.435 1.00 0.00 C -ATOM 19 C GLY A 19 39.622 17.755 16.435 1.00 0.00 C -ATOM 20 C GLY A 20 36.622 18.755 18.435 1.00 0.00 C -ATOM 21 C GLY A 21 38.622 18.755 13.435 1.00 0.00 C -END -MODEL 49 LYS77A-LYS125A -ATOM 1 C GLY A 1 38.622 18.755 13.435 1.00 0.00 C -ATOM 2 C GLY A 2 42.622 18.755 13.435 1.00 0.00 C -ATOM 3 C GLY A 3 43.622 18.755 13.435 1.00 0.00 C -ATOM 4 C GLY A 4 44.622 18.755 12.435 1.00 0.00 C -ATOM 5 C GLY A 5 45.622 18.755 11.435 1.00 0.00 C -ATOM 6 C GLY A 6 45.622 18.755 10.435 1.00 0.00 C -ATOM 7 C GLY A 7 46.622 17.755 9.435 1.00 0.00 C -ATOM 8 C GLY A 8 46.622 17.755 8.435 1.00 0.00 C -ATOM 9 C GLY A 9 47.622 17.755 7.435 1.00 0.00 C -ATOM 10 C GLY A 10 48.622 17.755 6.435 1.00 0.00 C -ATOM 11 C GLY A 11 48.622 17.755 5.435 1.00 0.00 C -ATOM 12 C GLY A 12 49.622 18.755 4.435 1.00 0.00 C -ATOM 13 C GLY A 13 48.622 19.755 3.435 1.00 0.00 C -ATOM 14 C GLY A 14 47.622 20.755 2.435 1.00 0.00 C -ATOM 15 C GLY A 15 46.622 21.755 2.435 1.00 0.00 C -ATOM 16 C GLY A 16 45.622 21.755 2.435 1.00 0.00 C -ATOM 17 C GLY A 17 42.622 22.755 2.435 1.00 0.00 C -END -MODEL 50 LYS77A-LYS129A -ATOM 1 C GLY A 1 36.622 12.755 9.435 1.00 0.00 C -ATOM 2 C GLY A 2 37.622 10.755 6.435 1.00 0.00 C -ATOM 3 C GLY A 3 38.622 10.755 5.435 1.00 0.00 C -ATOM 4 C GLY A 4 39.622 10.755 4.435 1.00 0.00 C -ATOM 5 C GLY A 5 40.622 11.755 3.435 1.00 0.00 C -ATOM 6 C GLY A 6 41.622 12.755 2.435 1.00 0.00 C -ATOM 7 C GLY A 7 42.622 13.755 1.435 1.00 0.00 C -ATOM 8 C GLY A 8 43.622 14.755 0.435 1.00 0.00 C -ATOM 9 C GLY A 9 44.622 15.755 0.435 1.00 0.00 C -ATOM 10 C GLY A 10 45.622 16.755 0.435 1.00 0.00 C -ATOM 11 C GLY A 11 46.622 17.755 0.435 1.00 0.00 C -ATOM 12 C GLY A 12 46.622 18.755 0.435 1.00 0.00 C -ATOM 13 C GLY A 13 46.622 19.755 0.435 1.00 0.00 C -ATOM 14 C GLY A 14 46.622 20.755 0.435 1.00 0.00 C -ATOM 15 C GLY A 15 45.622 21.755 1.435 1.00 0.00 C -ATOM 16 C GLY A 16 42.622 22.755 2.435 1.00 0.00 C -END -MODEL 51 LYS77A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 29.622 13.755 17.435 1.00 0.00 C -ATOM 3 C GLY A 3 30.622 13.755 17.435 1.00 0.00 C -ATOM 4 C GLY A 4 31.622 13.755 17.435 1.00 0.00 C -ATOM 5 C GLY A 5 32.622 13.755 17.435 1.00 0.00 C -ATOM 6 C GLY A 6 33.622 13.755 17.435 1.00 0.00 C -ATOM 7 C GLY A 7 34.622 13.755 17.435 1.00 0.00 C -ATOM 8 C GLY A 8 35.622 13.755 16.435 1.00 0.00 C -ATOM 9 C GLY A 9 36.622 13.755 15.435 1.00 0.00 C -ATOM 10 C GLY A 10 37.622 13.755 14.435 1.00 0.00 C -ATOM 11 C GLY A 11 38.622 13.755 13.435 1.00 0.00 C -ATOM 12 C GLY A 12 39.622 12.755 12.435 1.00 0.00 C -ATOM 13 C GLY A 13 40.622 12.755 11.435 1.00 0.00 C -ATOM 14 C GLY A 14 41.622 11.755 10.435 1.00 0.00 C -ATOM 15 C GLY A 15 42.622 10.755 9.435 1.00 0.00 C -ATOM 16 C GLY A 16 43.622 11.755 8.435 1.00 0.00 C -ATOM 17 C GLY A 17 44.622 12.755 7.435 1.00 0.00 C -ATOM 18 C GLY A 18 45.622 13.755 7.435 1.00 0.00 C -ATOM 19 C GLY A 19 46.622 14.755 6.435 1.00 0.00 C -ATOM 20 C GLY A 20 47.622 15.755 5.435 1.00 0.00 C -ATOM 21 C GLY A 21 48.622 16.755 4.435 1.00 0.00 C -ATOM 22 C GLY A 22 48.622 17.755 3.435 1.00 0.00 C -ATOM 23 C GLY A 23 48.622 18.755 2.435 1.00 0.00 C -ATOM 24 C GLY A 24 47.622 19.755 1.435 1.00 0.00 C -ATOM 25 C GLY A 25 46.622 20.755 1.435 1.00 0.00 C -ATOM 26 C GLY A 26 45.622 21.755 1.435 1.00 0.00 C -ATOM 27 C GLY A 27 42.622 22.755 2.435 1.00 0.00 C -END -MODEL 52 LYS86A-LYS110A -ATOM 1 C GLY A 1 43.622 36.755 3.435 1.00 0.00 C -ATOM 2 C GLY A 2 46.622 34.755 2.435 1.00 0.00 C -ATOM 3 C GLY A 3 46.622 33.755 2.435 1.00 0.00 C -ATOM 4 C GLY A 4 46.622 32.755 1.435 1.00 0.00 C -ATOM 5 C GLY A 5 46.622 31.755 0.435 1.00 0.00 C -ATOM 6 C GLY A 6 45.622 30.755 -0.565 1.00 0.00 C -ATOM 7 C GLY A 7 44.622 29.755 -1.565 1.00 0.00 C -ATOM 8 C GLY A 8 43.622 28.755 -2.565 1.00 0.00 C -ATOM 9 C GLY A 9 42.622 27.755 -3.565 1.00 0.00 C -ATOM 10 C GLY A 10 41.622 26.755 -4.565 1.00 0.00 C -ATOM 11 C GLY A 11 40.622 25.755 -4.565 1.00 0.00 C -ATOM 12 C GLY A 12 39.622 24.755 -4.565 1.00 0.00 C -ATOM 13 C GLY A 13 38.622 23.755 -4.565 1.00 0.00 C -ATOM 14 C GLY A 14 37.622 22.755 -4.565 1.00 0.00 C -ATOM 15 C GLY A 15 34.622 22.755 -2.565 1.00 0.00 C -END -MODEL 53 LYS86A-LYS119A -ATOM 1 C GLY A 1 43.622 36.755 3.435 1.00 0.00 C -ATOM 2 C GLY A 2 46.622 34.755 2.435 1.00 0.00 C -ATOM 3 C GLY A 3 46.622 33.755 3.435 1.00 0.00 C -ATOM 4 C GLY A 4 46.622 32.755 4.435 1.00 0.00 C -ATOM 5 C GLY A 5 46.622 31.755 5.435 1.00 0.00 C -ATOM 6 C GLY A 6 47.622 30.755 6.435 1.00 0.00 C -ATOM 7 C GLY A 7 47.622 29.755 7.435 1.00 0.00 C -ATOM 8 C GLY A 8 47.622 28.755 8.435 1.00 0.00 C -ATOM 9 C GLY A 9 47.622 27.755 9.435 1.00 0.00 C -ATOM 10 C GLY A 10 47.622 26.755 10.435 1.00 0.00 C -ATOM 11 C GLY A 11 47.622 25.755 11.435 1.00 0.00 C -ATOM 12 C GLY A 12 47.622 24.755 12.435 1.00 0.00 C -ATOM 13 C GLY A 13 46.622 23.755 13.435 1.00 0.00 C -ATOM 14 C GLY A 14 45.622 22.755 14.435 1.00 0.00 C -ATOM 15 C GLY A 15 44.622 21.755 15.435 1.00 0.00 C -ATOM 16 C GLY A 16 43.622 20.755 15.435 1.00 0.00 C -ATOM 17 C GLY A 17 42.622 19.755 15.435 1.00 0.00 C -ATOM 18 C GLY A 18 41.622 18.755 15.435 1.00 0.00 C -ATOM 19 C GLY A 19 40.622 17.755 16.435 1.00 0.00 C -ATOM 20 C GLY A 20 39.622 17.755 17.435 1.00 0.00 C -ATOM 21 C GLY A 21 36.622 18.755 18.435 1.00 0.00 C -END -MODEL 54 LYS86A-LYS125A -ATOM 1 C GLY A 1 38.622 18.755 13.435 1.00 0.00 C -ATOM 2 C GLY A 2 41.622 18.755 14.435 1.00 0.00 C -ATOM 3 C GLY A 3 42.622 19.755 14.435 1.00 0.00 C -ATOM 4 C GLY A 4 42.622 20.755 15.435 1.00 0.00 C -ATOM 5 C GLY A 5 43.622 21.755 15.435 1.00 0.00 C -ATOM 6 C GLY A 6 44.622 22.755 15.435 1.00 0.00 C -ATOM 7 C GLY A 7 45.622 23.755 14.435 1.00 0.00 C -ATOM 8 C GLY A 8 45.622 24.755 13.435 1.00 0.00 C -ATOM 9 C GLY A 9 45.622 25.755 12.435 1.00 0.00 C -ATOM 10 C GLY A 10 45.622 26.755 11.435 1.00 0.00 C -ATOM 11 C GLY A 11 46.622 27.755 10.435 1.00 0.00 C -ATOM 12 C GLY A 12 46.622 28.755 9.435 1.00 0.00 C -ATOM 13 C GLY A 13 47.622 29.755 8.435 1.00 0.00 C -ATOM 14 C GLY A 14 47.622 30.755 7.435 1.00 0.00 C -ATOM 15 C GLY A 15 47.622 31.755 6.435 1.00 0.00 C -ATOM 16 C GLY A 16 47.622 32.755 5.435 1.00 0.00 C -ATOM 17 C GLY A 17 47.622 33.755 4.435 1.00 0.00 C -ATOM 18 C GLY A 18 46.622 34.755 3.435 1.00 0.00 C -ATOM 19 C GLY A 19 43.622 36.755 3.435 1.00 0.00 C -END -MODEL 55 LYS86A-LYS129A -ATOM 1 C GLY A 1 43.622 36.755 3.435 1.00 0.00 C -ATOM 2 C GLY A 2 46.622 34.755 2.435 1.00 0.00 C -ATOM 3 C GLY A 3 46.622 33.755 2.435 1.00 0.00 C -ATOM 4 C GLY A 4 46.622 32.755 3.435 1.00 0.00 C -ATOM 5 C GLY A 5 46.622 31.755 4.435 1.00 0.00 C -ATOM 6 C GLY A 6 46.622 30.755 4.435 1.00 0.00 C -ATOM 7 C GLY A 7 47.622 29.755 4.435 1.00 0.00 C -ATOM 8 C GLY A 8 47.622 28.755 4.435 1.00 0.00 C -ATOM 9 C GLY A 9 48.622 27.755 5.435 1.00 0.00 C -ATOM 10 C GLY A 10 48.622 26.755 6.435 1.00 0.00 C -ATOM 11 C GLY A 11 48.622 25.755 7.435 1.00 0.00 C -ATOM 12 C GLY A 12 48.622 24.755 8.435 1.00 0.00 C -ATOM 13 C GLY A 13 48.622 23.755 9.435 1.00 0.00 C -ATOM 14 C GLY A 14 47.622 22.755 10.435 1.00 0.00 C -ATOM 15 C GLY A 15 46.622 21.755 11.435 1.00 0.00 C -ATOM 16 C GLY A 16 45.622 20.755 12.435 1.00 0.00 C -ATOM 17 C GLY A 17 44.622 19.755 13.435 1.00 0.00 C -ATOM 18 C GLY A 18 43.622 18.755 13.435 1.00 0.00 C -ATOM 19 C GLY A 19 42.622 17.755 13.435 1.00 0.00 C -ATOM 20 C GLY A 20 41.622 16.755 14.435 1.00 0.00 C -ATOM 21 C GLY A 21 40.622 15.755 14.435 1.00 0.00 C -ATOM 22 C GLY A 22 39.622 14.755 13.435 1.00 0.00 C -ATOM 23 C GLY A 23 38.622 13.755 12.435 1.00 0.00 C -ATOM 24 C GLY A 24 36.622 12.755 9.435 1.00 0.00 C -END -MODEL 56 LYS86A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 29.622 13.755 17.435 1.00 0.00 C -ATOM 3 C GLY A 3 30.622 13.755 17.435 1.00 0.00 C -ATOM 4 C GLY A 4 31.622 13.755 17.435 1.00 0.00 C -ATOM 5 C GLY A 5 32.622 13.755 17.435 1.00 0.00 C -ATOM 6 C GLY A 6 33.622 13.755 17.435 1.00 0.00 C -ATOM 7 C GLY A 7 34.622 13.755 17.435 1.00 0.00 C -ATOM 8 C GLY A 8 35.622 13.755 17.435 1.00 0.00 C -ATOM 9 C GLY A 9 36.622 13.755 17.435 1.00 0.00 C -ATOM 10 C GLY A 10 37.622 14.755 17.435 1.00 0.00 C -ATOM 11 C GLY A 11 38.622 15.755 17.435 1.00 0.00 C -ATOM 12 C GLY A 12 39.622 16.755 17.435 1.00 0.00 C -ATOM 13 C GLY A 13 40.622 17.755 16.435 1.00 0.00 C -ATOM 14 C GLY A 14 41.622 18.755 15.435 1.00 0.00 C -ATOM 15 C GLY A 15 42.622 19.755 15.435 1.00 0.00 C -ATOM 16 C GLY A 16 42.622 20.755 15.435 1.00 0.00 C -ATOM 17 C GLY A 17 43.622 21.755 15.435 1.00 0.00 C -ATOM 18 C GLY A 18 44.622 22.755 15.435 1.00 0.00 C -ATOM 19 C GLY A 19 45.622 23.755 14.435 1.00 0.00 C -ATOM 20 C GLY A 20 45.622 24.755 13.435 1.00 0.00 C -ATOM 21 C GLY A 21 45.622 25.755 12.435 1.00 0.00 C -ATOM 22 C GLY A 22 45.622 26.755 11.435 1.00 0.00 C -ATOM 23 C GLY A 23 46.622 27.755 10.435 1.00 0.00 C -ATOM 24 C GLY A 24 46.622 28.755 9.435 1.00 0.00 C -ATOM 25 C GLY A 25 47.622 29.755 8.435 1.00 0.00 C -ATOM 26 C GLY A 26 47.622 30.755 7.435 1.00 0.00 C -ATOM 27 C GLY A 27 47.622 31.755 6.435 1.00 0.00 C -ATOM 28 C GLY A 28 47.622 32.755 5.435 1.00 0.00 C -ATOM 29 C GLY A 29 47.622 33.755 4.435 1.00 0.00 C -ATOM 30 C GLY A 30 46.622 34.755 3.435 1.00 0.00 C -ATOM 31 C GLY A 31 43.622 36.755 3.435 1.00 0.00 C -END -MODEL 57 LYS110A-LYS119A -ATOM 1 C GLY A 1 36.622 18.755 18.435 1.00 0.00 C -ATOM 2 C GLY A 2 35.622 16.755 15.435 1.00 0.00 C -ATOM 3 C GLY A 3 36.622 15.755 14.435 1.00 0.00 C -ATOM 4 C GLY A 4 37.622 14.755 13.435 1.00 0.00 C -ATOM 5 C GLY A 5 38.622 13.755 12.435 1.00 0.00 C -ATOM 6 C GLY A 6 39.622 12.755 11.435 1.00 0.00 C -ATOM 7 C GLY A 7 39.622 12.755 10.435 1.00 0.00 C -ATOM 8 C GLY A 8 39.622 11.755 9.435 1.00 0.00 C -ATOM 9 C GLY A 9 39.622 10.755 8.435 1.00 0.00 C -ATOM 10 C GLY A 10 39.622 10.755 7.435 1.00 0.00 C -ATOM 11 C GLY A 11 40.622 10.755 6.435 1.00 0.00 C -ATOM 12 C GLY A 12 39.622 10.755 5.435 1.00 0.00 C -ATOM 13 C GLY A 13 38.622 10.755 4.435 1.00 0.00 C -ATOM 14 C GLY A 14 37.622 10.755 3.435 1.00 0.00 C -ATOM 15 C GLY A 15 36.622 11.755 2.435 1.00 0.00 C -ATOM 16 C GLY A 16 35.622 12.755 1.435 1.00 0.00 C -ATOM 17 C GLY A 17 35.622 13.755 0.435 1.00 0.00 C -ATOM 18 C GLY A 18 35.622 14.755 -0.565 1.00 0.00 C -ATOM 19 C GLY A 19 35.622 15.755 -1.565 1.00 0.00 C -ATOM 20 C GLY A 20 35.622 16.755 -2.565 1.00 0.00 C -ATOM 21 C GLY A 21 35.622 17.755 -3.565 1.00 0.00 C -ATOM 22 C GLY A 22 35.622 18.755 -4.565 1.00 0.00 C -ATOM 23 C GLY A 23 35.622 19.755 -5.565 1.00 0.00 C -ATOM 24 C GLY A 24 34.622 20.755 -5.565 1.00 0.00 C -ATOM 25 C GLY A 25 34.622 22.755 -2.565 1.00 0.00 C -END -MODEL 58 LYS110A-LYS125A -ATOM 1 C GLY A 1 38.622 18.755 13.435 1.00 0.00 C -ATOM 2 C GLY A 2 38.622 14.755 13.435 1.00 0.00 C -ATOM 3 C GLY A 3 38.622 13.755 12.435 1.00 0.00 C -ATOM 4 C GLY A 4 39.622 12.755 11.435 1.00 0.00 C -ATOM 5 C GLY A 5 39.622 12.755 10.435 1.00 0.00 C -ATOM 6 C GLY A 6 39.622 11.755 9.435 1.00 0.00 C -ATOM 7 C GLY A 7 39.622 10.755 8.435 1.00 0.00 C -ATOM 8 C GLY A 8 39.622 10.755 7.435 1.00 0.00 C -ATOM 9 C GLY A 9 40.622 10.755 6.435 1.00 0.00 C -ATOM 10 C GLY A 10 39.622 10.755 5.435 1.00 0.00 C -ATOM 11 C GLY A 11 38.622 10.755 4.435 1.00 0.00 C -ATOM 12 C GLY A 12 37.622 10.755 3.435 1.00 0.00 C -ATOM 13 C GLY A 13 36.622 11.755 2.435 1.00 0.00 C -ATOM 14 C GLY A 14 35.622 12.755 1.435 1.00 0.00 C -ATOM 15 C GLY A 15 35.622 13.755 0.435 1.00 0.00 C -ATOM 16 C GLY A 16 35.622 14.755 -0.565 1.00 0.00 C -ATOM 17 C GLY A 17 35.622 15.755 -1.565 1.00 0.00 C -ATOM 18 C GLY A 18 35.622 16.755 -2.565 1.00 0.00 C -ATOM 19 C GLY A 19 35.622 17.755 -3.565 1.00 0.00 C -ATOM 20 C GLY A 20 35.622 18.755 -4.565 1.00 0.00 C -ATOM 21 C GLY A 21 35.622 19.755 -5.565 1.00 0.00 C -ATOM 22 C GLY A 22 34.622 20.755 -5.565 1.00 0.00 C -ATOM 23 C GLY A 23 34.622 22.755 -2.565 1.00 0.00 C -END -MODEL 59 LYS110A-LYS129A -ATOM 1 C GLY A 1 36.622 12.755 9.435 1.00 0.00 C -ATOM 2 C GLY A 2 34.622 11.755 6.435 1.00 0.00 C -ATOM 3 C GLY A 3 34.622 11.755 5.435 1.00 0.00 C -ATOM 4 C GLY A 4 34.622 11.755 4.435 1.00 0.00 C -ATOM 5 C GLY A 5 34.622 11.755 3.435 1.00 0.00 C -ATOM 6 C GLY A 6 34.622 11.755 2.435 1.00 0.00 C -ATOM 7 C GLY A 7 35.622 12.755 1.435 1.00 0.00 C -ATOM 8 C GLY A 8 35.622 13.755 0.435 1.00 0.00 C -ATOM 9 C GLY A 9 35.622 14.755 -0.565 1.00 0.00 C -ATOM 10 C GLY A 10 35.622 15.755 -1.565 1.00 0.00 C -ATOM 11 C GLY A 11 35.622 16.755 -2.565 1.00 0.00 C -ATOM 12 C GLY A 12 35.622 17.755 -3.565 1.00 0.00 C -ATOM 13 C GLY A 13 35.622 18.755 -4.565 1.00 0.00 C -ATOM 14 C GLY A 14 35.622 19.755 -5.565 1.00 0.00 C -ATOM 15 C GLY A 15 34.622 20.755 -5.565 1.00 0.00 C -ATOM 16 C GLY A 16 34.622 22.755 -2.565 1.00 0.00 C -END -MODEL 60 LYS110A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 24.622 14.755 16.435 1.00 0.00 C -ATOM 3 C GLY A 3 23.622 15.755 15.435 1.00 0.00 C -ATOM 4 C GLY A 4 22.622 15.755 14.435 1.00 0.00 C -ATOM 5 C GLY A 5 22.622 15.755 13.435 1.00 0.00 C -ATOM 6 C GLY A 6 22.622 15.755 12.435 1.00 0.00 C -ATOM 7 C GLY A 7 22.622 15.755 11.435 1.00 0.00 C -ATOM 8 C GLY A 8 22.622 15.755 10.435 1.00 0.00 C -ATOM 9 C GLY A 9 22.622 15.755 9.435 1.00 0.00 C -ATOM 10 C GLY A 10 22.622 15.755 8.435 1.00 0.00 C -ATOM 11 C GLY A 11 22.622 15.755 7.435 1.00 0.00 C -ATOM 12 C GLY A 12 22.622 15.755 6.435 1.00 0.00 C -ATOM 13 C GLY A 13 22.622 15.755 5.435 1.00 0.00 C -ATOM 14 C GLY A 14 22.622 15.755 4.435 1.00 0.00 C -ATOM 15 C GLY A 15 22.622 15.755 3.435 1.00 0.00 C -ATOM 16 C GLY A 16 22.622 15.755 2.435 1.00 0.00 C -ATOM 17 C GLY A 17 23.622 15.755 1.435 1.00 0.00 C -ATOM 18 C GLY A 18 24.622 15.755 0.435 1.00 0.00 C -ATOM 19 C GLY A 19 25.622 15.755 -0.565 1.00 0.00 C -ATOM 20 C GLY A 20 26.622 15.755 -1.565 1.00 0.00 C -ATOM 21 C GLY A 21 27.622 15.755 -2.565 1.00 0.00 C -ATOM 22 C GLY A 22 28.622 16.755 -3.565 1.00 0.00 C -ATOM 23 C GLY A 23 29.622 17.755 -4.565 1.00 0.00 C -ATOM 24 C GLY A 24 30.622 18.755 -5.565 1.00 0.00 C -ATOM 25 C GLY A 25 31.622 19.755 -5.565 1.00 0.00 C -ATOM 26 C GLY A 26 32.622 20.755 -5.565 1.00 0.00 C -ATOM 27 C GLY A 27 33.622 21.755 -5.565 1.00 0.00 C -ATOM 28 C GLY A 28 34.622 22.755 -2.565 1.00 0.00 C -END -MODEL 61 LYS119A-LYS125A -ATOM 1 C GLY A 1 38.622 18.755 13.435 1.00 0.00 C -ATOM 2 C GLY A 2 39.622 17.755 16.435 1.00 0.00 C -ATOM 3 C GLY A 3 36.622 18.755 18.435 1.00 0.00 C -END -MODEL 62 LYS119A-LYS129A -ATOM 1 C GLY A 1 36.622 12.755 9.435 1.00 0.00 C -ATOM 2 C GLY A 2 36.622 12.755 13.435 1.00 0.00 C -ATOM 3 C GLY A 3 36.622 13.755 14.435 1.00 0.00 C -ATOM 4 C GLY A 4 36.622 14.755 15.435 1.00 0.00 C -ATOM 5 C GLY A 5 36.622 15.755 16.435 1.00 0.00 C -ATOM 6 C GLY A 6 36.622 18.755 18.435 1.00 0.00 C -END -MODEL 63 LYS119A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 29.622 13.755 17.435 1.00 0.00 C -ATOM 3 C GLY A 3 30.622 13.755 17.435 1.00 0.00 C -ATOM 4 C GLY A 4 31.622 13.755 17.435 1.00 0.00 C -ATOM 5 C GLY A 5 32.622 13.755 17.435 1.00 0.00 C -ATOM 6 C GLY A 6 33.622 14.755 18.435 1.00 0.00 C -ATOM 7 C GLY A 7 34.622 15.755 18.435 1.00 0.00 C -ATOM 8 C GLY A 8 36.622 18.755 18.435 1.00 0.00 C -END -MODEL 64 LYS125A-LYS129A -ATOM 1 C GLY A 1 36.622 12.755 9.435 1.00 0.00 C -ATOM 2 C GLY A 2 38.622 13.755 12.435 1.00 0.00 C -ATOM 3 C GLY A 3 38.622 14.755 13.435 1.00 0.00 C -ATOM 4 C GLY A 4 38.622 18.755 13.435 1.00 0.00 C -END -MODEL 65 LYS125A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 29.622 13.755 17.435 1.00 0.00 C -ATOM 3 C GLY A 3 30.622 13.755 17.435 1.00 0.00 C -ATOM 4 C GLY A 4 31.622 13.755 17.435 1.00 0.00 C -ATOM 5 C GLY A 5 32.622 13.755 17.435 1.00 0.00 C -ATOM 6 C GLY A 6 33.622 13.755 17.435 1.00 0.00 C -ATOM 7 C GLY A 7 34.622 13.755 16.435 1.00 0.00 C -ATOM 8 C GLY A 8 35.622 14.755 15.435 1.00 0.00 C -ATOM 9 C GLY A 9 36.622 15.755 14.435 1.00 0.00 C -ATOM 10 C GLY A 10 38.622 18.755 13.435 1.00 0.00 C -END -MODEL 66 LYS129A-LYS135A -ATOM 1 C GLY A 1 27.622 16.755 17.435 1.00 0.00 C -ATOM 2 C GLY A 2 29.622 13.755 17.435 1.00 0.00 C -ATOM 3 C GLY A 3 30.622 13.755 17.435 1.00 0.00 C -ATOM 4 C GLY A 4 31.622 13.755 17.435 1.00 0.00 C -ATOM 5 C GLY A 5 32.622 13.755 17.435 1.00 0.00 C -ATOM 6 C GLY A 6 33.622 13.755 16.435 1.00 0.00 C -ATOM 7 C GLY A 7 34.622 13.755 15.435 1.00 0.00 C -ATOM 8 C GLY A 8 35.622 13.755 14.435 1.00 0.00 C -ATOM 9 C GLY A 9 36.622 12.755 13.435 1.00 0.00 C -ATOM 10 C GLY A 10 36.622 12.755 9.435 1.00 0.00 C -END diff --git a/Examples/test.rsa b/Examples/test.rsa deleted file mode 100644 index 447a2c2..0000000 --- a/Examples/test.rsa +++ /dev/null @@ -1,137 +0,0 @@ -REM FreeSASA 2.0 -REM Absolute and relative SASAs for test.pdb -REM Atomic radii and reference values for relative SASA: NACCESS -REM Chains: A -REM Algorithm: Lee & Richards -REM Probe-radius: 1.40 -REM Slices: 20 -REM RES _ NUM All-atoms Total-Side Main-Chain Non-polar All polar -REM ABS REL ABS REL ABS REL ABS REL ABS REL -RES PRO A 20 112.88 86.0 98.61 97.2 14.27 48.0 98.61 84.8 14.27 95.3 -RES LYS A 21 81.56 42.4 80.74 55.0 0.82 1.8 49.51 42.9 32.06 41.5 -RES ARG A 22 57.22 24.7 57.22 30.7 0.00 0.0 2.45 2.9 54.77 36.8 -RES LEU A 23 0.28 0.2 0.28 0.2 0.00 0.0 0.28 0.2 0.00 0.0 -RES TYR A 24 62.71 30.4 62.71 38.7 0.00 0.0 31.36 23.1 31.35 44.5 -RES CYS A 25 0.05 0.0 0.00 0.0 0.05 0.1 0.00 0.0 0.05 0.2 -RES LYS A 26 80.66 41.9 58.74 40.0 21.92 48.1 29.69 25.7 50.97 66.0 -RES ASN A 27 5.29 3.8 4.52 4.8 0.78 1.8 0.78 1.6 4.52 5.1 -RES GLY A 28 33.97 47.5 0.00 N/A 33.97 47.5 24.57 58.9 9.40 31.5 -RES GLY A 29 13.89 19.4 0.00 N/A 13.89 19.4 5.36 12.8 8.54 28.7 -RES PHE A 30 17.54 9.1 17.54 11.8 0.00 0.0 17.54 10.7 0.00 0.0 -RES PHE A 31 19.24 10.0 19.24 12.9 0.00 0.0 19.24 11.7 0.00 0.0 -RES LEU A 32 0.13 0.1 0.13 0.1 0.00 0.0 0.13 0.1 0.00 0.0 -RES ARG A 33 47.67 20.5 47.67 25.6 0.00 0.0 0.41 0.5 47.26 31.7 -RES ILE A 34 0.89 0.5 0.22 0.2 0.67 1.7 0.22 0.2 0.67 2.8 -RES HIS A 35 24.27 14.0 24.27 18.9 0.00 0.0 17.33 16.5 6.94 10.2 -RES PRO A 36 66.17 50.4 57.88 57.0 8.29 27.9 59.75 51.4 6.42 42.8 -RES ASP A 37 78.82 58.6 51.16 57.3 27.66 61.1 42.26 79.5 36.56 44.9 -RES GLY A 38 6.34 8.9 0.00 N/A 6.34 8.9 6.34 15.2 0.00 0.0 -RES ARG A 39 139.34 60.0 129.90 69.7 9.44 20.7 77.71 93.5 61.63 41.4 -RES VAL A 40 10.96 7.5 0.00 0.0 10.96 24.5 0.00 0.0 10.96 38.5 -RES ASP A 41 14.07 10.5 14.07 15.8 0.00 0.0 1.89 3.5 12.19 15.0 -RES GLY A 42 8.25 11.5 0.00 N/A 8.25 11.5 0.00 0.0 8.25 27.7 -RES VAL A 43 25.41 17.4 22.44 22.2 2.97 6.6 25.41 21.6 0.00 0.0 -RES ARG A 44 150.19 64.7 122.32 65.6 27.87 61.1 47.47 57.1 102.72 69.0 -RES GLU A 45 98.40 59.2 98.15 81.5 0.25 0.5 40.57 64.4 57.83 56.1 -RES LYS A 46 117.80 61.2 115.33 78.5 2.47 5.4 73.39 63.6 44.41 57.5 -RES SER A 47 79.30 72.2 52.96 83.9 26.34 56.4 47.91 87.3 31.39 57.1 -RES ASP A 48 22.94 17.1 19.99 22.4 2.96 6.5 7.15 13.4 15.79 19.4 -RES PRO A 49 67.21 51.2 66.61 65.6 0.60 2.0 67.21 57.8 0.00 0.0 -RES HIS A 50 47.68 27.5 44.39 34.6 3.29 7.4 32.81 31.3 14.87 21.8 -RES ILE A 51 1.59 1.0 1.59 1.2 0.00 0.0 1.59 1.1 0.00 0.0 -RES LYS A 52 98.19 51.0 97.11 66.1 1.08 2.4 54.60 47.3 43.59 56.5 -RES LEU A 53 0.01 0.0 0.01 0.0 0.00 0.0 0.01 0.0 0.00 0.0 -RES GLN A 54 63.05 36.6 63.05 49.8 0.00 0.0 13.05 23.8 50.00 42.6 -RES LEU A 55 35.78 22.4 9.86 8.6 25.92 57.5 9.91 7.6 25.87 90.7 -RES GLN A 56 68.77 39.9 64.75 51.2 4.02 8.8 30.77 56.0 38.00 32.4 -RES ALA A 57 75.37 73.7 44.76 80.9 30.60 65.2 46.33 62.8 29.04 101.8 -RES GLU A 58 91.24 54.9 51.60 42.8 39.64 86.9 33.16 52.6 58.08 56.3 -RES GLU A 59 108.74 65.5 92.53 76.8 16.21 35.5 46.29 73.5 62.45 60.6 -RES ARG A 60 232.32 100.1 207.38 111.2 24.94 54.7 92.24 111.0 140.08 94.0 -RES GLY A 61 40.17 56.2 0.00 N/A 40.17 56.2 31.05 74.5 9.12 30.6 -RES VAL A 62 4.92 3.4 4.92 4.9 0.00 0.0 4.92 4.2 0.00 0.0 -RES VAL A 63 5.28 3.6 5.28 5.2 0.00 0.0 5.28 4.5 0.00 0.0 -RES SER A 64 1.97 1.8 1.97 3.1 0.00 0.0 1.56 2.8 0.41 0.7 -RES ILE A 65 1.34 0.8 0.16 0.1 1.17 3.0 0.16 0.1 1.17 4.8 -RES LYS A 66 34.62 18.0 34.62 23.6 0.00 0.0 18.79 16.3 15.84 20.5 -RES GLY A 67 2.24 3.1 0.00 N/A 2.24 3.1 2.24 5.4 0.00 0.0 -RES VAL A 68 62.42 42.7 49.37 48.7 13.05 29.2 50.71 43.2 11.71 41.1 -RES CYS A 69 68.97 54.3 39.44 48.5 29.53 64.6 46.90 47.6 22.07 77.4 -RES ALA A 70 9.82 9.6 0.11 0.2 9.72 20.7 0.81 1.1 9.01 31.6 -RES ASN A 71 93.00 67.4 86.88 92.7 6.12 13.8 16.67 33.3 76.33 86.8 -RES ARG A 72 49.99 21.5 49.85 26.7 0.14 0.3 0.17 0.2 49.83 33.5 -RES TYR A 73 41.70 20.2 41.70 25.7 0.00 0.0 14.95 11.0 26.75 38.0 -RES LEU A 74 0.77 0.5 0.00 0.0 0.77 1.7 0.00 0.0 0.77 2.7 -RES ALA A 75 6.27 6.1 6.27 11.3 0.00 0.0 6.27 8.5 0.00 0.0 -RES MET A 76 0.64 0.3 0.64 0.5 0.00 0.0 0.64 0.4 0.00 0.0 -RES LYS A 77 61.67 32.0 61.67 42.0 0.00 0.0 15.36 13.3 46.32 60.0 -RES GLU A 78 135.59 81.6 125.08 103.8 10.50 23.0 49.10 77.9 86.49 83.9 -RES ASP A 79 77.90 57.9 64.98 72.8 12.92 28.5 45.82 86.2 32.08 39.4 -RES GLY A 80 0.00 0.0 0.00 N/A 0.00 0.0 0.00 0.0 0.00 0.0 -RES ARG A 81 109.92 47.4 109.92 58.9 0.00 0.0 42.76 51.4 67.16 45.1 -RES LEU A 82 3.43 2.2 0.49 0.4 2.94 6.5 0.49 0.4 2.94 10.3 -RES LEU A 83 46.50 29.2 46.50 40.7 0.00 0.0 46.50 35.5 0.00 0.0 -RES ALA A 84 1.65 1.6 0.00 0.0 1.65 3.5 0.00 0.0 1.65 5.8 -RES SER A 85 26.32 24.0 23.73 37.6 2.59 5.6 19.02 34.7 7.30 13.3 -RES LYS A 86 144.74 75.2 131.32 89.4 13.42 29.4 94.43 81.9 50.31 65.2 -RES CYS A 87 90.31 71.1 85.44 105.0 4.87 10.7 89.09 90.4 1.22 4.3 -RES VAL A 88 92.00 63.0 59.69 58.9 32.31 72.2 59.83 50.9 32.17 112.8 -RES THR A 89 65.95 50.0 56.32 61.5 9.63 23.9 60.54 71.9 5.41 11.4 -RES ASP A 90 80.46 59.8 77.44 86.8 3.02 6.7 15.53 29.2 64.93 79.8 -RES GLU A 91 29.51 17.8 29.51 24.5 0.00 0.0 10.43 16.6 19.08 18.5 -RES CYS A 92 3.89 3.1 3.28 4.0 0.61 1.3 3.28 3.3 0.61 2.1 -RES PHE A 93 34.36 17.8 34.36 23.0 0.00 0.0 34.36 20.9 0.00 0.0 -RES PHE A 94 0.17 0.1 0.17 0.1 0.00 0.0 0.17 0.1 0.00 0.0 -RES PHE A 95 63.79 33.0 62.96 42.2 0.83 1.9 62.96 38.2 0.83 2.9 -RES GLU A 96 53.17 32.0 41.51 34.4 11.66 25.6 11.83 18.8 41.34 40.1 -RES ARG A 97 146.02 62.9 139.45 74.8 6.57 14.4 57.57 69.3 88.45 59.4 -RES LEU A 98 114.71 72.0 90.78 79.4 23.94 53.1 90.78 69.4 23.94 84.0 -RES GLU A 99 24.88 15.0 23.44 19.5 1.44 3.1 13.97 22.2 10.91 10.6 -RES SER A 100 114.56 104.3 77.02 122.0 37.53 80.4 61.19 111.6 53.37 97.1 -RES ASN A 101 75.25 54.5 47.71 50.9 27.54 62.2 35.91 71.8 39.34 44.7 -RES ASN A 102 91.72 66.5 85.50 91.2 6.23 14.1 21.39 42.7 70.33 80.0 -RES TYR A 103 45.79 22.2 45.56 28.1 0.23 0.5 13.62 10.0 32.18 45.7 -RES ASN A 104 18.22 13.2 18.22 19.4 0.00 0.0 0.00 0.0 18.22 20.7 -RES THR A 105 2.54 1.9 2.31 2.5 0.24 0.6 0.00 0.0 2.54 5.3 -RES TYR A 106 0.18 0.1 0.18 0.1 0.00 0.0 0.15 0.1 0.02 0.0 -RES ARG A 107 64.25 27.7 64.25 34.5 0.00 0.0 11.19 13.5 53.06 35.6 -RES SER A 108 0.01 0.0 0.00 0.0 0.01 0.0 0.00 0.0 0.01 0.0 -RES ARG A 109 112.76 48.6 102.51 55.0 10.25 22.5 14.70 17.7 98.05 65.8 -RES LYS A 110 97.13 50.5 73.20 49.8 23.93 52.5 52.64 45.6 44.49 57.6 -RES TYR A 111 43.42 21.1 36.37 22.4 7.05 16.0 37.19 27.4 6.23 8.8 -RES THR A 112 74.63 56.6 63.67 69.6 10.96 27.2 30.17 35.8 44.46 93.4 -RES SER A 113 77.10 70.2 67.22 106.4 9.89 21.2 31.69 57.8 45.41 82.6 -RES TRP A 114 55.05 24.3 54.96 29.6 0.09 0.2 42.69 25.5 12.37 21.0 -RES TYR A 115 24.83 12.0 24.34 15.0 0.49 1.1 3.53 2.6 21.30 30.2 -RES VAL A 116 0.39 0.3 0.33 0.3 0.05 0.1 0.35 0.3 0.04 0.1 -RES ALA A 117 0.25 0.2 0.00 0.0 0.25 0.5 0.00 0.0 0.25 0.9 -RES LEU A 118 0.00 0.0 0.00 0.0 0.00 0.0 0.00 0.0 0.00 0.0 -RES LYS A 119 97.60 50.7 97.10 66.1 0.50 1.1 49.17 42.6 48.44 62.8 -RES ARG A 120 149.18 64.3 140.03 75.1 9.15 20.1 66.90 80.5 82.28 55.2 -RES THR A 121 112.49 85.3 85.84 93.8 26.65 66.1 85.52 101.5 26.97 56.7 -RES GLY A 122 2.23 3.1 0.00 N/A 2.23 3.1 2.23 5.3 0.00 0.0 -RES GLN A 123 111.34 64.7 111.24 87.9 0.10 0.2 42.85 78.0 68.49 58.4 -RES TYR A 124 57.43 27.9 49.47 30.5 7.96 18.1 33.82 24.9 23.61 33.5 -RES LYS A 125 36.03 18.7 35.21 24.0 0.83 1.8 21.87 19.0 14.16 18.3 -RES LEU A 126 59.88 37.6 55.63 48.6 4.25 9.4 55.63 42.5 4.25 14.9 -RES GLY A 127 0.02 0.0 0.00 N/A 0.02 0.0 0.02 0.0 0.00 0.0 -RES SER A 128 46.99 42.8 24.59 38.9 22.40 48.0 18.44 33.6 28.54 51.9 -RES LYS A 129 136.43 70.9 122.66 83.5 13.77 30.2 82.85 71.8 53.58 69.4 -RES THR A 130 17.56 13.3 0.00 0.0 17.56 43.6 1.20 1.4 16.36 34.4 -RES GLY A 131 13.44 18.8 0.00 N/A 13.44 18.8 13.44 32.2 0.00 0.0 -RES PRO A 132 107.22 81.7 83.46 82.2 23.76 79.9 84.94 73.1 22.28 148.7 -RES GLY A 133 82.64 115.6 0.00 N/A 82.64 115.6 44.46 106.7 38.17 128.1 -RES GLN A 134 57.96 33.7 55.29 43.7 2.66 5.8 25.76 46.9 32.20 27.5 -RES LYS A 135 124.00 64.4 120.29 81.9 3.71 8.1 74.59 64.7 49.41 64.0 -RES ALA A 136 0.16 0.2 0.11 0.2 0.05 0.1 0.11 0.2 0.05 0.2 -RES ILE A 137 6.05 3.6 6.05 4.7 0.00 0.0 6.05 4.3 0.00 0.0 -RES LEU A 138 17.77 11.1 17.77 15.5 0.00 0.0 17.77 13.6 0.00 0.0 -RES PHE A 139 0.03 0.0 0.03 0.0 0.00 0.0 0.03 0.0 0.00 0.0 -RES LEU A 140 70.52 44.2 70.52 61.7 0.00 0.0 70.52 53.9 0.00 0.0 -RES PRO A 141 35.39 27.0 19.61 19.3 15.78 53.0 19.74 17.0 15.65 104.5 -RES MET A 142 59.83 32.2 55.30 39.4 4.53 9.9 59.83 38.0 0.00 0.0 -RES SER A 143 104.46 95.1 69.66 110.3 34.79 74.5 69.35 126.4 35.10 63.9 -END Absolute sums over single chains surface -CHAIN 1 A 6502.0 5472.2 1029.8 3483.7 3018.3 -END Absolute sums over all chains -TOTAL 6502.0 5472.2 1029.8 3483.7 3018.3 diff --git a/README.md b/README.md index 9f5d227..a1f9a42 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,16 @@ A tool to calculate the **S**olvent **A**ccessible **S**urface **D**istances (** This version of Jwalk is simply a modernization of the original invented by the [Topf Lab](https://github.com/Topf-Lab/Jwalk) All functionality is original and compatibility has been upgraded for Python 3 -Jwalk works on Linux / MacOS +Jwalk works on Linux / MacOS / Windows ## Dependencies The following can be installed with ```pip``` -| |Package | +| | Package | | -------- | ----------------- | | Required | ```BioPython``` | | Required | ```numpy``` | -| Required | ```collections``` | - -#### Optional (Temporary) -Install the ```freesasa``` command line tool [here](http://freesasa.github.io/) -This tool will enable higher resolution SASD calculations -Future release of FriedLabJHU/Jwalk will have freesasa as an integrated Python 3 module +| Required | ```freesasa``` | ## Installation @@ -31,18 +26,23 @@ Future release of FriedLabJHU/Jwalk will have freesasa as an integrated Python 3 ``` ## Running Jwalk -``` $ jwalk -i 1LMB.pdb -xl_list DSBU_crosslinks.txt``` -**Given no arguments, Jwalk will find all SASD between all Lysines in all PDBs in the working directory** +``` $ jwalk -f 1FGA.pdb``` +**Given no optional arguments, Jwalk will find all SASD between all Lys-to-Lys crosslinks in the provided PDB** ## Running Options ``` - -h, --help show this help message and exit - -lys LYS calculate lysine crosslinks (default) - -xl_list XL_LIST calculate crosslinks from input list (see Examples) - -i I specify input pdb: -i [inputfile.pdb] (default runs on every .pdb in directory) - -aa1 AA1 specify starting amino-acid via three letter code eg. HIS - -aa2 AA2 specify starting amino-acid via three letter code eg. TYR - -surface SURFACE use higher accuracy method to calculate solvent accessibility - slower + -h, --help show this help message and exit + -f F Input path to .pdb file + -o O Output path for Jwalk results (default: Out to "./Jwalk_results" in the current working + directory) + -xl_list XL_LIST OPTIONAL: Input path to crosslink list (default: Finds all Lys-to-Lys crosslinks) + -xl_dist_cutoff XL_DIST_CUTOFF + OPTIONAL: Specify maximum crosslink distance cutoff in Angstroms (default: Keeps all + distances) + -aa1 AA1 OPTIONAL: Specify inital crosslink amino acid three letter code (default: LYS) + -aa2 AA2 OPTIONAL: Specify ending crosslink amino acid three letter code (default: LYS) + -vox VOX OPTIONAL: Specify voxel resolution to use in Angstrom (default: 1 Angstrom) + -ncpus NCPUS OPTIONAL: Specify number of cpus to use (default: cpu_count()) ``` ## Input \& Output @@ -70,7 +70,9 @@ Jwalk will create a results directory and place the outputs as follows: ``` ## Visualization -In order to visualize the crosslinks in Chimera select ```Actions > Atoms/Bonds > show``` +To visualize the crosslinks PDB ... +In PYMOL, open the crosslinks.pdb file and ```set valence, 0``` along with ```show sticks, all``` and ```hide spheres, all``` +In Chimera, uncomment all the MODEL lines in the PDB then open the crosslinks.pdb file and select ```Actions > Atoms/Bonds > show``` ## Citation @@ -90,5 +92,4 @@ In order to visualize the crosslinks in Chimera select ```Actions > Atoms/Bonds [GPL-V3](https://choosealicense.com/licenses/gpl-3.0/) > - Copyright 2016 - Birkbeck College University of London - The Jwalk inventor is: Josh Bullock + Copyright 2016 - Josh Bullock & Birkbeck College University of London diff --git a/build/lib/Jwalk/GridTools.py b/build/lib/Jwalk/GridTools.py deleted file mode 100644 index b24450f..0000000 --- a/build/lib/Jwalk/GridTools.py +++ /dev/null @@ -1,575 +0,0 @@ -#=============================================================================== -# This file is part of Jwalk. -# -# Jwalk - A tool to calculate the solvent accessible surface distance (SASD) -# between crosslinked residues. -# -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# -# -# Jwalk is available under Public Licence. -# This software is made available under GPL V3 -# -# Please cite your use of Jwalk in published work: -# -# J.Bullock, J. Schwab, K. Thalassinos, M. Topf (2016) -# The importance of non-accessible crosslinks and solvent accessible surface distance -# in modelling proteins with restraints from crosslinking mass spectrometry. -# Molecular and Cellular Proteomics (15) pp.2491-2500 -# -#=============================================================================== - -from numpy import zeros -from collections import OrderedDict - -class Map: - """ - - A class representing all information from a density map file. - NOTE: Currently it can only read the CCP4/MRC format. - - """ - - def __init__(self, fullMap, origin, apix, filename, header=[]): - """ - - Read a map and its parameters in to Map class instance. - - *filename* - name of map file. - *origin* - origin co-ordinates of the map (x_origin, y_origin, z_origin). - *apix* - grid spacing of map. - *filename* - filename of the Map instance - - NOTE: The *filename* 'build++copy' is reserved for copying of other Map class instances.""" - self.header = header - self.origin = origin - self.apix = apix - self.filename = filename - self.fullMap = fullMap - - def copy(self): - """ - - Return: - copy of the Map. - - """ - copy = Map(self.fullMap.copy(), self.origin[:], self.apix, self.filename, self.header[:]) - return copy - - def box_size(self): - """ - - Return: - size of the map array, in ZYX format. - - """ - return self.fullMap.shape - - def x_size(self): - """ - - Return: - x size of the map array in x direction. - - """ - return self.fullMap.shape[2] - - def y_size(self): - """ - - Return: - y size of the map array in y direction. - - """ - return self.fullMap.shape[1] - - def z_size(self): - """ - - Return: - z size of the map array in z direction. - - """ - return self.fullMap.shape[0] - -def makeGrid(struct, apix, resolution = 3, filename = "None"): - """ - - Returns protein grid. - - Arguments: - - *struct* - Tempy structure instance - *apix* - angstroms per voxel - - """ - # Build empty template map based on the size of the protein and the resolution. - extr = struct.get_extreme_values() - edge = int(2*resolution/apix)+2 - x_size = int((extr[1]-extr[0])/apix)+edge - y_size = int((extr[3]-extr[2])/apix)+edge - z_size = int((extr[5]-extr[4])/apix)+edge - - # Origin calculated such that the centre of the map is the centre of mass of the protein. - x_origin = (extr[1]+extr[0])/2-(apix*x_size/2.0) - y_origin = (extr[3]+extr[2])/2-(apix*y_size/2.0) - z_origin = (extr[5]+extr[4])/2-(apix*z_size/2.0) - - newMap = zeros((z_size, y_size, x_size)) - fullMap = Map(newMap, [x_origin, y_origin, z_origin], apix, filename) - return fullMap - -def mapGridPosition(densMap, atom): - - """ - - Returns the index of the nearest pixel to an atom, and atom mass (4 values in list form). - - Arguments: - - *densMap* - Map instance the atom is to be placed on. - *atom* - Atom instance. - - """ - origin = densMap.origin - apix = densMap.apix - box_size = densMap.box_size() - x_pos = int(round((atom.x-origin[0])/apix,0)) - y_pos = int(round((atom.y-origin[1])/apix,0)) - z_pos = int(round((atom.z-origin[2])/apix,0)) - - if((densMap.x_size() > x_pos >= 0) and (densMap.y_size() > y_pos >= 0) and (densMap.z_size() > z_pos >= 0)): - return (x_pos, y_pos, z_pos, atom.mass) - else: - return 0 - -def markCAlphas(densMap, prot, aa1, aa2): - """ - - Returns ordered dictionaries containing {residue_number, chain, residue name : x, y, z} - for both aa1 and aa2. - - Arguments: - - *densMap* - Protein grid - *prot* - Tempy structure instance - *aa1* - Residue type 1 - *aa2* - Residue type 2 - - """ - - aa1_CA = OrderedDict() - aa2_CA = OrderedDict() - - for atom in prot.atomList: - - if atom.res == aa1: - - if atom.atom_name == 'CA': - pos = mapGridPosition(densMap, atom) - aa1_CA[atom.res_no,atom.chain,atom.res]=[pos[0],pos[1],pos[2]] - - if atom.res == aa2: - if atom.atom_name == 'CA': - pos = mapGridPosition(densMap, atom) - aa2_CA[atom.res_no,atom.chain,atom.res]=[pos[0],pos[1],pos[2]] - - - return aa1_CA, aa2_CA - -def process_input_crosslinks(uv_xl): - """Processes crosslink input .txt file and returns list of residues and crosslinked pairs""" - - aa1 = [] - aa2 = [] - crosslink_pairs = [] - #c = 0 - count = 0 - with open(uv_xl) as xl_in: - for line in xl_in: - count +=1 - col = line.split("|") - try: - chain1 = col[1].rstrip() - chain1 = chain1.lstrip() - chain2 = col[3].rstrip() - chain2 = chain2.lstrip() - except: - print("ERROR: formatting error on line {} : {}".format(str(count),line)) - exit(1) - # if no chain is given - if len(chain1) == 0: - chain1 = " " - if len(chain2) == 0: - chain2 = " " - - aa1.append([int(col[0]),chain1]) - aa2.append([int(col[2]),chain2]) - - crosslink_pairs.append([(int(col[0]),chain1),(int(col[2]),chain2)]) - ''' - if (int(col[0]),chain1,c) in xl_pair: - c +=1 - xl_pair[int(col[0]),chain1,c] = [int(col[2]),chain2,c] - ''' - - return aa1, aa2 , crosslink_pairs - -def mark_CAlphas_pairs(densMap, prot, uv_xl): - - """ - Processes input txt file. Checks each atom is in the structure and returns - the pairs of crosslinks as well as the Calpha positions on the grid. - - Arguments: - *densMap* - grid that encompasses protein - *prot* - .pdb file - *uv_xl* - .txt input file - - """ - - # process txt file - aa1, aa2, crosslink_pairs = process_input_crosslinks(uv_xl) - # crosslink_pairs is a list of [crosslinked aa1, aa2] - - aa1_CA = OrderedDict() - aa2_CA = OrderedDict() - - atom_check = [] - - for atom in prot.atomList: - if [atom.res_no,atom.chain] in aa1: - if atom.atom_name == "CA": - pos = mapGridPosition(densMap, atom) - aa1_CA[atom.res_no,atom.chain,atom.res]=[pos[0],pos[1],pos[2]] - atom_check.append([atom.res_no,atom.chain]) - if [atom.res_no,atom.chain] in aa2: - if atom.atom_name == "CA": - pos = mapGridPosition(densMap, atom) - aa2_CA[atom.res_no,atom.chain,atom.res]=[pos[0],pos[1],pos[2]] - atom_check.append([atom.res_no,atom.chain]) - - # check that all the residues listed are in the structure - rem_x = [] - - for x in aa1: - if x not in atom_check: - print("ERROR ! Residue {} - {} not in pdb structure - please check input files".format(x[0], x[1])) - rem_x.append((x[0], x[1])) - for x in aa2: - if x not in atom_check: - print("ERROR ! Residue {} - {} not in pdb structure - please check input files".format(x[0], x[1])) - rem_x.append((x[0], x[1])) - - # remove crosslinks from crosslink_pairs if one or both residues are not in structure - index_to_delete = [] - - for i in range(len(crosslink_pairs)): - [x1, x2] = crosslink_pairs[i] - if x1 in rem_x: - index_to_delete.append(i) - elif x2 in rem_x: - index_to_delete.append(i) - - crosslink_pairs_hold = [] - for i in range(len(crosslink_pairs)): - if i not in index_to_delete: - crosslink_pairs_hold.append(crosslink_pairs[i]) - - # append residue name to crosslink_pairs_final - - aa_d = {} - - for a in aa1_CA: - aa_d[a[0],a[1]]= a - for a in aa2_CA: - aa_d[a[0],a[1]]= a - - crosslink_pairs_final = [] - for x1, x2 in crosslink_pairs_hold: - crosslink_pairs_final.append([aa_d[x1],aa_d[x2]]) - - return crosslink_pairs_final, aa1_CA, aa2_CA - -def generate_solvent_accessible_surface(densMap,prot,aa1_CA, aa2_CA): - - """ - - Returns masked array which functions as solvent accessible surface - - Arguments: - - *densMap* - Protein Grid - *prot* - Tempy structure instance - *aa1_CA* - voxel positions of each C_alpha atom of interest - *aa2_CA* - voxel positions of each C_alpha atom of interest - - """ - # store different radii for each atom and calculate the voxel spheres for each - sphere = {} - radius = {} - - C = 0.8 - - radius['CA'] = 1.73 + C - radius['S'] = 1.67 + C - radius['N'] = 1.43 + C - radius['OH'] = 1.30 + C - - for r in radius: - - sphere[r] = [] - rad = int(round(radius[r]/densMap.apix)) - - for x in range(-rad,rad+1): - for y in range(-rad,rad+1): - for z in range(-rad,rad+1): - if (x**2 + y**2 + z**2) <= (rad**2): - sphere[r].append([x,y,z]) - - backbone = ['N','CA','C','O'] - - # generate solvent accessible surface - - for atom in prot.atomList: - - pos = mapGridPosition(densMap, atom) - - if pos: - # don't place side chain atoms of residues of interest in the surface - if ((atom.res_no,atom.chain,atom.res) in aa1_CA and atom.atom_name not in backbone) or ( - (atom.res_no,atom.chain,atom.res) in aa2_CA and atom.atom_name not in backbone): - pass - # for each atom, expand the corresponding voxel sphere around it to create solvent accessible surface - else: - if atom.atom_name[:1] == 'C': - for (x,y,z) in sphere['CA']: - if((densMap.x_size() > (pos[0]+x) >= 0) and (densMap.y_size() > (pos[1]+y) >= 0) and (densMap.z_size() > (pos[2]+z) >= 0)): - densMap.fullMap[pos[2]+z][pos[1]+y][pos[0]+x] += 1 - elif atom.atom_name[:1] == 'O': - for (x,y,z) in sphere['OH']: - if((densMap.x_size() > (pos[0]+x) >= 0) and (densMap.y_size() > (pos[1]+y) >= 0) and (densMap.z_size() > (pos[2]+z) >= 0)): - densMap.fullMap[pos[2]+z][pos[1]+y][pos[0]+x] += 1 - elif atom.atom_name[:1] == 'N': - for (x,y,z) in sphere['N']: - if((densMap.x_size() > (pos[0]+x) >= 0) and (densMap.y_size() > (pos[1]+y) >= 0) and (densMap.z_size() > (pos[2]+z) >= 0)): - densMap.fullMap[pos[2]+z][pos[1]+y][pos[0]+x] += 1 - elif atom.atom_name[:1] == 'S': - for (x,y,z) in sphere['S']: - if((densMap.x_size() > (pos[0]+x) >= 0) and (densMap.y_size() > (pos[1]+y) >= 0) and (densMap.z_size() > (pos[2]+z) >= 0)): - densMap.fullMap[pos[2]+z][pos[1]+y][pos[0]+x] += 1 - - return densMap - -def find_empty_space(res,sphere,densMap,CA): - - """ - - Returns list of empty voxels in voxel sphere shell - - Arguments: - - *res* - residue where search is happening around - *sphere* - voxel sphere shell to be expanded around CA voxel - *densMap* - Solvent accessible surface (masked array) - *CA* - Calpha voxels - - """ - - starters = [] - (x,y,z) = CA[res] - for (x_s,y_s,z_s) in sphere: - if((densMap.x_size() > (x+x_s) >= 0) and (densMap.y_size() > (y+y_s) >= 0) and (densMap.z_size() > (z+z_s) >= 0)): - if densMap.fullMap[z_s+z][y_s+y][x_s+x] <= 0: - starters.append([x_s+x,y_s+y,z_s+z]) - return starters - -def find_surface_voxels(aa1_CA, densMap, surface, xl_list = []): - - """ - - Returns ordered dictionaries containing all possible staring voxels for each Calpha of - interest. If Calpha is not solvent accessible then no starting voxels are returned. - - If xl_list flag True, then list of entries to be removed is also returned. empty list - otherwise. - - Arguments: - - *aa1_CA* - Calpha voxels for amino acid type 1 - *densMap* - Solvent accessible surface (masked array) - - """ - - # generate voxel spheres shells to progressively extend search for starting voxels - # this is to keep starting voxels as close to CA as possible. - - sphere1 = [] - sphere2 = [] - sphere3 = [] - sphere4 = [] - sphere5 = [] - sphere6 = [] - - C = 1.68 - - radius = 1.73 + C - - radius4 = int(round(radius/densMap.apix))+1 # radius rounded up = 4 with apix = 1 - radius3 = radius4 -1 - radius2 = radius3 -1 - radius1 = radius2 -1 - radius5 = radius4 + 1 - radius6 = radius5 + 1 - - for x in range(-radius1,radius1+1): - for y in range(-radius1,radius1+1): - for z in range(-radius1,radius1+1): - if (x**2 + y**2 + z**2) <= (radius1**2): - sphere1.append([x,y,z]) - - for x in range(-radius2,radius2+1): - for y in range(-radius2,radius2+1): - for z in range(-radius2,radius2+1): - if (x**2 + y**2 + z**2) <= (radius2**2): - if ([x,y,z]) not in sphere1: - sphere2.append([x,y,z]) - - for x in range(-radius3,radius3+1): - for y in range(-radius3,radius3+1): - for z in range(-radius3,radius3+1): - if (x**2 + y**2 + z**2) <= (radius3**2): - if ([x,y,z]) not in sphere1 and ([x,y,z]) not in sphere2: - sphere3.append([x,y,z]) - - for x in range(-radius4,radius4+1): - for y in range(-radius4,radius4+1): - for z in range(-radius4,radius4+1): - if (x**2 + y**2 + z**2) <= (radius4**2): - if ([x,y,z]) not in sphere1 and ([x,y,z]) not in sphere2 and ( - [x,y,z]) not in sphere3: - sphere4.append([x,y,z]) - - for x in range(-radius5,radius5+1): - for y in range(-radius5,radius5+1): - for z in range(-radius5,radius5+1): - if (x**2 + y**2 + z**2) <= (radius5**2): - if ([x,y,z]) not in sphere1 and ([x,y,z]) not in sphere2 and ( - [x,y,z]) not in sphere3 and ([x,y,z]) not in sphere4: - sphere5.append([x,y,z]) - - for x in range(-radius6,radius6+1): - for y in range(-radius6,radius6+1): - for z in range(-radius6,radius6+1): - if (x**2 + y**2 + z**2) <= (radius6**2): - if ([x,y,z]) not in sphere1 and ([x,y,z]) not in sphere2 and ( - [x,y,z]) not in sphere3 and ([x,y,z]) not in sphere4 and ([x,y,z]) not in sphere5: - sphere6.append([x,y,z]) - - # iterate through sphere shells and append starting voxels to dictionary - - aa_1_start_voxels = OrderedDict() - buried = [] - k_count = 0 - k_buried = 0 - - for k in aa1_CA: - k_count +=1 - aa_1_start_voxels[k] = find_empty_space(k,sphere1,densMap,aa1_CA) - if aa_1_start_voxels[k] == []: - aa_1_start_voxels[k] = find_empty_space(k,sphere2,densMap,aa1_CA) - if aa_1_start_voxels[k] == []: - aa_1_start_voxels[k] = find_empty_space(k,sphere3,densMap,aa1_CA) - if aa_1_start_voxels[k] == []: - aa_1_start_voxels[k] = find_empty_space(k,sphere4,densMap,aa1_CA) - - if surface == False: - # if no voxels found after fourth shell then residue is not solvent exposed - if aa_1_start_voxels[k] == []: - buried.append(k) - del aa_1_start_voxels[k] - k_buried +=1 - else: # residues that have been determined solvent accessible by other means. - if aa_1_start_voxels[k] == []: - aa_1_start_voxels[k] = find_empty_space(k,sphere5,densMap,aa1_CA) - if aa_1_start_voxels[k] == []: - aa_1_start_voxels[k] = find_empty_space(k,sphere6,densMap,aa1_CA) - - rem_x = [] - - if len(buried) > 0 and len(xl_list) > 0: - print("ERROR - {} buried residue(s) in xl_list:".format(k_buried)) - for t in buried: - print("{} - {} - {}".format(str(t[0]), str(t[1]), str(t[2]))) - rem_x.append([t[0],t[1]]) - #sys.exit(2) - - return aa_1_start_voxels, rem_x - -def remove_duplicates(sasds,xl_list=False): - - """ - - Returns sasds with duplicates removed. - - Arguments: - - *sasds* - dictionary of sasds - - """ - - if xl_list == True: - return sasds - - keep = {} - keep_keys = [] - keep_sasds = {} - - for (start, end, distance) in sasds: - - # check if there is a duplicate - if (start, end) not in keep: - keep[start, end] = distance - - # if there is a duplicate check which has the shortest distance and keep - elif (start, end) in keep: - if (distance < keep[start, end]): - keep[start, end] = distance - - # reform the dictionary key - for (j,k) in keep: - keep_keys.append((j,k,keep[j,k])) - - # filter out original dictionary - for k in keep_keys: - keep_sasds[k] = sasds[k] - - return keep_sasds \ No newline at end of file diff --git a/build/lib/Jwalk/Jwalk.v2.py b/build/lib/Jwalk/Jwalk.v2.py deleted file mode 100644 index 9c82cdd..0000000 --- a/build/lib/Jwalk/Jwalk.v2.py +++ /dev/null @@ -1,177 +0,0 @@ -# =============================================================================== -# This file is part of Jwalk. -# -# Jwalk - A tool to calculate the solvent accessible surface distance (SASD) -# between crosslinked residues. -# -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# -# -# Jwalk is available under Public Licence. -# This software is made available under GPL V3 -# -# Please cite your use of Jwalk in published work: -# -# J.Bullock, J. Schwab, K. Thalassinos, M. Topf (2016) -# The importance of non-accessible crosslinks and solvent accessible surface distance -# in modelling proteins with restraints from crosslinking mass spectrometry. -# Molecular and Cellular Proteomics (15) pp.2491-2500 -# -# =============================================================================== - -from Jwalk import PDBTools, GridTools, SurfaceTools, SASDTools -from multiprocessing import cpu_count -import os, sys, argparse - -# default parameters - -max_dist = 60 -vox = 1 -surface = False -xl_list = [] -aa1 = "LYS" -aa2 = "LYS" -ncpus = cpu_count() -pdb_list = [i for i in os.listdir('./') if i.endswith('.pdb')] - -amino_acids = {"LYS":"lysines", - "CYS":"cysteines", - "ASP":"acidic residues", - "GLU":"acidic residues", - "VAL":"valines", - "ILE":"isoleucines", - "LEU":"leucines", - "ARG":"arginines", - "PRO":"prolines", - "GLY":"glycines", - "ALA":"alanines", - "TRP":"tryptophans", - "PHE":"phenylalanines", - "SER":"serines", - "GLN":"glutamines", - "HIS":"histidines", - "MET":"methionines", - "THR":"threonines", - "ASN":"asparagines", - "TYR":"tyrosines"} - -parser = argparse.ArgumentParser(description='JWALK: Calculate SASDs on your target PDB files') - -parser.add_argument('-lys', action="store_true", - help='calculate lysine crosslinks (default)') -parser.add_argument('-xl_list', nargs=1, - help='calculate crosslinks from input list') -parser.add_argument('-i', nargs=1, - help='specify input pdb: -i ') -parser.add_argument('-aa1', nargs=1, - help='specify start amino acid (three letter code e.g. LYS)') -parser.add_argument('-aa2', nargs=1, - help='specify end amino acid (three letter code e.g. LYS)') -parser.add_argument('-max_dist', nargs=1, - help='specify maximum crosslink distance in Angstroms') -parser.add_argument('-vox', nargs=1, - help='specify voxel size of grid') -parser.add_argument('-surface', action="store_true", - help='use higher accuracy method to calculate solvent accessibility - requires Freesasa installation') -parser.add_argument('-ncpus', nargs=1, - help='specify number of cpus to use') - -args = parser.parse_args() - -if args.lys: - aa1 = "LYS" - aa2 = "LYS" - -elif args.xl_list: - xl_list = args.xl_list[0] - -elif args.aa1: - if args.aa2: - aa1 = args.aa1[0].upper() - aa2 = args.aa2[0].upper() - # catch any dodgy typing - if aa1 not in amino_acids or aa2 not in amino_acids: - print("ERROR: Please type amino acid in three letter code format") - sys.exit(2) - else: - print("Please specify both aa1 AND aa2 if you want to use this option") - sys.exit(2) - -if args.max_dist: - max_dist = int(args.max_dist[0]) - -if args.i: - pdb_list = [args.i[0]] - -if args.vox: - vox = int(args.vox[0]) - -if args.surface: - ACCESS_BIN = "freesasa" - surface = True - -if args.ncpus: - ncpus = int(args.ncpus[0]) - -####################################### - -def runJwalk(max_dist, vox, surface, xl_list, aa1, aa2, ncpus, pdb_list): - """ - Execute Jwalk with processed command line options - - max_dist: maximum distance Jwalk will search - vox: angstoms per voxel in grid - surface: if True use higher resolution surface method - xl_list: list of specific crosslinks to calculate - aa1: starting residue type - aa2: ending residues type - ncpus: number of cpus to use - pdb_list: default is all pdbs in directory, unless otherwise stated - - """ - for pdb in pdb_list: - - print("calculating crosslinks on {} ".format(pdb)) - # load pdb into Jwalk - structure_instance = PDBTools.read_PDB_file(pdb) - # generate grid of voxel size (vox) that encapsulates pdb - grid = GridTools.makeGrid(structure_instance, vox) - - # mark C-alpha positions on grid - if xl_list: # if specific crosslinks need to be calculated - crosslink_pairs, aa1_CA, aa2_CA = GridTools.mark_CAlphas_pairs(grid, structure_instance, xl_list) - else: - crosslink_pairs = [] # na if searching every combination between residue types - aa1_CA, aa2_CA = GridTools.markCAlphas(grid, structure_instance, aa1, aa2) - - if surface == True: - # check more rigorously if residues are solvent accessible or not - aa1_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa1_CA, ACCESS_BIN, xl_list) - if aa1 != aa2 or xl_list: - aa2_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa2_CA, ACCESS_BIN, xl_list) - else: - aa2_CA = aa1_CA.copy() - - dens_map = GridTools.generate_solvent_accessible_surface(grid, structure_instance, aa1_CA, aa2_CA) - # identify which residues are on the surface - aa1_voxels, remove_aa1 = GridTools.find_surface_voxels(aa1_CA, dens_map, surface, xl_list) - aa2_voxels, remove_aa2 = GridTools.find_surface_voxels(aa2_CA, dens_map, surface, xl_list) - - crosslink_pairs = SurfaceTools.update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_aa2) - - # calculate sasds - sasds = SASDTools.parallel_BFS(aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, crosslink_pairs, - max_dist, vox, ncpus, xl_list) - - # remove duplicates - sasds = GridTools.remove_duplicates(sasds) - sasds = SASDTools.get_euclidean_distances(sasds, pdb, aa1, aa2) - - # output sasds to .pdb file and .txt file - PDBTools.write_sasd_to_txt(sasds, pdb) - PDBTools.write_sasd_to_pdb(dens_map, sasds, pdb) - print("{} SASDs calculated".format(len(sasds))) - -if __name__ == "__main__": - runJwalk(max_dist, vox, surface, xl_list, aa1, aa2, ncpus, pdb_list) diff --git a/build/lib/Jwalk/PDBTools.py b/build/lib/Jwalk/PDBTools.py deleted file mode 100644 index 99fdd90..0000000 --- a/build/lib/Jwalk/PDBTools.py +++ /dev/null @@ -1,607 +0,0 @@ -#=============================================================================== -# This file is part of Jwalk. -# -# Jwalk - A tool to calculate the solvent accessible surface distance (SASD) -# between crosslinked residues. -# -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# -# -# Jwalk is available under Public Licence. -# This software is made available under GPL V3 -# -# Please cite your use of Jwalk in published work: -# -# J.Bullock, J. Schwab, K. Thalassinos, M. Topf (2016) -# The importance of non-accessible crosslinks and solvent accessible surface distance -# in modelling proteins with restraints from crosslinking mass spectrometry. -# Molecular and Cellular Proteomics (15) pp.2491-2500 -# -#=============================================================================== - -from numpy import array, append -from Bio.PDB import PDBParser as PDBParserBiopy -import os - -class Vector: - """A class representing Cartesian 3-dimensonal vectors.""" - - def __init__(self, x,y,z): - """x, y, z = Cartesian co-ordinates of vector.""" - self.x = x - self.y = y - self.z = z - - def copy(self): - """ - Return: - A copy of Vector instance - """ - return Vector(self.x, self.y, self.z) - - def to_atom(self): - """ - Create an Atom instance based on Vector instance. - - Return: - Atom instance - """ - template = 'ATOM 1 C NOR A 1 23.161 39.732 -25.038 1.00 10.00 C' - a = BioPyAtom([]) - a.x = self.x - a.y = self.y - a.z = self.z - return a - -class BioPy_Structure: - - - """ - - A class representing a bjectStructure o, as read from a PDB file using Bio.PDB in Biopython. - - - """ - - def __init__(self, atomList, filename='Unknown', header='', footer =''): - """ - - Initialise using a string of the relevant pdb file name or a numpy array of Atom objects. - - Arguments: - *pdbFileOrList* - String of pdb file name or array of Atom objects - - """ - self.header = header - self.footer = footer - self.filename = filename - self.atomList = array(atomList) - #Centre of mass calculations - self.CoM = self.calculate_centre_of_mass() - self.initCoM = self.CoM.copy() - - - def __getitem__(self, index): - return self.atomList[index] - - def __len__(self): - return len(self.atomList) - - def __repr__(self): - if not self.filename == 'Unknown': - s = 'Filename: ' + self.filename + '\n' - else: - s = '' - s += 'No Of Atoms: ' + str(len(self)) + '\n' - s += 'First Atom: ' + str(self.atomList[0]) + '\n' - s += 'Last Atom: ' + str(self.atomList[-1]) + '\n' - return s - - def write_to_PDB(self, filename): - """ - - Write Structure instance to PDB file. - - Arguments: - - *filename* - output filename. - - """ - if filename[-4:] == '.pdb': - g = open(filename, 'w') - else: - g = open(filename+'.pdb', 'w') - header='''EXPDTA MODEL GENERATE WITH TEMPY -REMARK MODEL GENERATE WITH TEMPY -''' - g.write(header) - for x in self.atomList: - g.write(x.write_to_PDB()) - if x.isTerm: - line = x._writeTerm()+'\n' - g.write(line) - g.write(self.footer) - g.close() - - def write_to_PDB2(self, filename,hetatom=False): - """ - - Write Structure instance to PDB file. - - Arguments: - - *filename* - output filename. - - """ - if filename[-4:] == '.pdb': - g = open(filename, 'w') - else: - g = open(filename+'.pdb', 'w') - header='''EXPDTA MODEL GENERATE WITH TEMPY -REMARK MODEL GENERATE WITH TEMPY -''' - g.write(header) - structList=self.split_into_chains() - hetatmlist=[] - chainlisttot=[] - last_prot_num=0 - for chain in range(len(structList)): - chainlist=[] - for x in structList[chain].atomList: - if x.record_name=="HETATM": - #hetatmlist.append(x.write_to_PDB()) - hetatmlist.append(x.copy()) - else: - chainlist.append(x.copy()) - chainlisttot.append(BioPy_Structure(chainlist)) - for strchain in range(len(chainlisttot)): - if strchain==0: - chainlisttot[strchain].renumber_atoms() - else: - start_num=chainlisttot[strchain-1].atomList[-1].serial - #+2 there is ter - chainlisttot[strchain].renumber_atoms(start_num=start_num+2) - for x in chainlisttot[strchain].atomList: - g.write(x.write_to_PDB()) - last_prot_num+=1 - line = chainlisttot[strchain].atomList[-1]._writeTerm()+'\n' - g.write(line) - #last_prot_num+=1 - - print(last_prot_num) - if hetatom==True: - hetstr=BioPy_Structure(hetatmlist) - hetchain=hetstr.split_into_chains() - for chain in range(len(hetchain)): - if chain==0: - #hetchain[chain].renumber_atoms() - print(last_prot_num) - hetchain[chain].renumber_atoms(start_num=last_prot_num+2) - - else: - start_num=hetchain[chain-1].atomList[-1].serial - #+2 there is ter - hetchain[chain].renumber_atoms(start_num=start_num+2) - - for xhet in hetchain[chain].atomList: - g.write(xhet.write_to_PDB()) - line = hetchain[chain].atomList[-1]._writeTerm()+'\n' - g.write(line) - lineend = '' - lineend += 'ENDMDL'.ljust(6)+'\n' - g.write(lineend) - g.write(self.footer) - g.close() - - def copy(self): - """ - - Return: - Copy of Structure instance. - - """ - newAtomList = [] - for atom in self.atomList: - newAtomList.append(atom.copy()) - return BioPy_Structure(newAtomList) - - def calculate_centre_of_mass(self): - """ - - Return: - Center of mass of structure as a Vector instance. - - """ - x_momentTotal = 0.0 - y_momentTotal = 0.0 - z_momentTotal = 0.0 - massTotal = 0.0 - for atom in self.atomList: - x = atom.get_x() - y = atom.get_y() - z = atom.get_z() - m = atom.get_mass() - x_momentTotal += x*m - y_momentTotal += y*m - z_momentTotal += z*m - massTotal += m - x_CoM = x_momentTotal/massTotal - y_CoM = y_momentTotal/massTotal - z_CoM = z_momentTotal/massTotal - return Vector(x_CoM, y_CoM, z_CoM) - - def get_extreme_values(self): - """ - - Return: - A 6-tuple containing the minimum and maximum of x, y and z co-ordinates of the structure. - Given in order (min_x, max_x, min_y, max_y, min_z, max_z). - - """ - min_x = self.atomList[0].get_x() - max_x = self.atomList[0].get_x() - min_y = self.atomList[0].get_y() - max_y = self.atomList[0].get_y() - min_z = self.atomList[0].get_z() - max_z = self.atomList[0].get_z() - for atom in self.atomList[1:]: - if atom.get_x() < min_x: - min_x = atom.get_x() - if atom.get_x() > max_x: - max_x = atom.get_x() - if atom.get_y() < min_y: - min_y = atom.get_y() - if atom.get_y() > max_y: - max_y = atom.get_y() - if atom.get_z() < min_z: - min_z = atom.get_z() - if atom.get_z() > max_z: - max_z = atom.get_z() - return (min_x, max_x, min_y, max_y, min_z, max_z) - -class BioPyAtom: - """ - - A class representing an atom, as read from a PDB file using Biopython. - - """ - - def __init__(self, atom): - """Atom from BioPython""" - if atom == []: - return - - #http://deposit.rcsb.org/adit/docs/pdb_atom_format.html - #print "bioatom",atom#'bioatom ' - if atom.get_parent().get_id()[0][0] == "W" or atom.get_parent().id[0][0]=="H": - self.record_name = "HETATM" - else: - self.record_name = "ATOM" # was pdbString[:6].strip() as "ATOM" -# res.id[0] == "W" or res.id[0][0]=="H": #skip water and hetero residues - self.serial = atom.get_serial_number() - self.atom_name = atom.get_name() - self.alt_loc = atom.get_altloc() #Return alternative location specifier. - self.fullid=atom.get_full_id() - #('3ukr_test', 0, 'G', (' ', 113, ' '), ('CA', ' ')) - self.res = atom.get_parent().get_resname() - self.chain = atom.get_full_id()[2] - self.res_no = int(self.fullid[3][1]) - self.icode = "" - if atom.is_disordered()==1: - self.icode = "D" - # 1 if the residue has disordered atoms -# self.icode = pdbString[26].strip()#code for insertion residues -# # Starting co-ordinates of atom. - self.init_x = atom.get_coord()[0] - self.init_y = atom.get_coord()[1] - self.init_z = atom.get_coord()[2] -# # Current co-ordinates of atom. - self.x = float(atom.get_coord()[0]) - self.y = float(atom.get_coord()[1]) - self.z = float(atom.get_coord()[2]) -# - self.occ = atom.get_occupancy() - self.temp_fac = atom.get_bfactor() - try: - self.elem = atom.get_element() - except: - self.elem="" - self.charge="" - #Mass of atom as given by atomicMasses global constant. Defaults to 1. - self.mass = 1.0 - -# # True if atom is the terminal of a chain. Automatically false until modified. - self.isTerm = False - - def __repr__(self): - return '('+ self.get_res() +' '+ str(self.res_no) + ' '+self.chain + ': ' + str(self.x) + ', ' + str(self.y) + ', ' + str(self.z) + ')' - - - def copy(self): - """ - - Return: - Copy of the Atom instance. - """ - atom = BioPyAtom([]) - atom.record_name = self.record_name - atom.serial = self.serial - atom.atom_name = self.atom_name - atom.alt_loc = self.alt_loc - atom.res = self.res - atom.chain = self.chain - atom.res_no = self.res_no - atom.icode = self.icode - atom.init_x = self.init_x - atom.init_y = self.init_y - atom.init_z = self.init_z - atom.x = self.x - atom.y = self.y - atom.z = self.z - atom.occ =self.occ - atom.temp_fac = self.temp_fac - atom.elem = self.elem - atom.charge = self.charge - atom.mass = self.mass - atom.isTerm = self.isTerm - return atom - - def get_mass(self): - """ - - Return: - Atom mass. - """ - return self.mass - - def map_grid_position(self, densMap): - """ - - Arguments: - *densMap* - EM map object consisting the 3D grid of density values. - - Return: - The co-ordinates and density value of the grid point in a density map closest to this atom. - Return 0 if atom is outside of map. - """ - x_origin = densMap.x_origin - y_origin = densMap.y_origin - z_origin = densMap.z_origin - apix = densMap.apix - x_size = densMap.x_size - y_size = densMap.y_size - z_size = densMap.z_size - x_pos = int((self.getX()-x_origin)/apix) - y_pos = int((self.getY()-y_origin)/apix) - z_pos = int((self.getZ()-z_origin)/apix) - if((x_size > x_pos >= 0) and (y_size > y_pos >= 0) and (z_size > z_pos >= 0)): - return (x_pos, y_pos, z_pos, self.mass) - else: - return 0 - - def get_x(self): - """ - - Return: - x co-ordinate of atom. - """ - return float(self.x) - - def get_y(self): - """ - - Return: - y co-ordinate of atom. - """ - return float(self.y) - - def get_z(self): - """ - - Return: - z co-ordinate of atom. - """ - return float(self.z) - - - - - def get_name(self): - """ - atom name (ie. 'CA' or 'O') - - Return: - atom name. - """ - return self.atom_name - - def get_res(self): - """ - - Return: - three letter residue code corresponding to the atom (i.e 'ARG'). - """ - return self.res - - def get_res_no(self): - """ - - Return: - residue number corresponding to the atom. - """ - return self.res_no - - def get_id_no(self): - """ - - Return: - string of atom serial number. - """ - return self.serial - - def write_to_PDB(self): - """ - - Writes a PDB ATOM record based in the atom attributes to a file. - """ - line = '' - line += self.record_name.ljust(6) - line += str(self.serial).rjust(5)+' ' - line += self.atom_name.center(4) - line += self.alt_loc.ljust(1) - line += self.res.ljust(3)+' ' - line += self.chain.ljust(1) - line += str(self.res_no).rjust(4) - line += str(self.icode).ljust(1)+' ' - x = '%.3f' % self.x - y = '%.3f' % self.y - z = '%.3f' % self.z - line += x.rjust(8) - line += y.rjust(8) - line += z.rjust(8) - occ = '%.2f'% float(self.occ) - temp_fac = '%.2f'% float(self.temp_fac) - line += occ.rjust(6) - line += temp_fac.rjust(6)+' ' - line += self.elem.strip().rjust(2) - line += self.charge.strip().ljust(2) - return line + '\n' - -def read_PDB_file(filename,hetatm=False,water=False): - - # hydrogens are omitted. - p=PDBParserBiopy(QUIET=True)#permissive default True - structure=p.get_structure("id", filename) - - atomList = [] - hetatomList=[] - wateratomList=[] - footer = '' - header = '' - - residues = structure[0].get_residues() - for res in residues: - hetfield=res.get_id()[0] - if hetfield[0]=="H": - for atom in res: - BioPyAtom(atom) - hetatomList.append(BioPyAtom(atom)) - elif hetfield[0]=="W": - for atom in res: - BioPyAtom(atom) - wateratomList.append(BioPyAtom(atom)) - else: - for atom in res: - if atom.id[0] != "H": - BioPyAtom(atom) - atomList.append(BioPyAtom(atom)) - if hetatm: - atomList = append(atomList, hetatomList) - if water: - atomList = append(atomList, wateratomList) - - return BioPy_Structure(atomList, filename, header, footer) - -def write_sasd_to_txt(sasds,pdb): - - """ - - Outputs sasds to .txt file - - Arguments: - - *sasds* - dictionary of sasds - *pdb* - .pdb file sasds were calculated on - """ - - if not os.path.exists('./Jwalk_results'): - os.makedirs('./Jwalk_results') - - with open('./Jwalk_results/%s_crosslink_list.txt' % pdb[:-4],'w') as outf: - - outf.write(' '.join('{0:<13}'.format(col) for col in ['Index','Model','Atom1','Atom2','SASD','Euclidean Distance'])) - outf.write('\n') - index = 1 - - for xl in sasds: - (aa1,chain1,res1)=xl[0] - (aa2,chain2,res2)=xl[1] - atom1 = ('%s-%d-%s-CA' % (res1,aa1,chain1) ) - atom2 = ('%s-%d-%s-CA' % (res2,aa2,chain2) ) - sasd=xl[2] - ed=xl[3] - outf.write(' '.join('{0:<13}'.format(col) for col in [index,pdb,atom1,atom2,sasd,ed])) - outf.write('\n') - index +=1 - -def write_sasd_to_pdb(dens_map,sasds,pdb): - - """ - - Outputs sasds to .pdb file - - Arguments: - - *dens_map* - Solvent accessible surface on masked array - *sasds* - dictionary of sasds - *pdb* - .pdb file sasds were calculated on - """ - - if not os.path.exists('./Jwalk_results'): - os.makedirs('./Jwalk_results') - - apix = dens_map.apix - origin = dens_map.origin - path_coord = {} - - for xl in sasds: - a = [] - for (x,y,z) in sasds[xl]: - a.append([(x*apix)+origin[0], (y*apix)+origin[1], (z*apix)+origin[2]]) - - path_coord[xl] = a - - with open('./Jwalk_results/%s_crosslinks.pdb' % pdb[:-4],'w') as pdb: - - m_count = 1 - for xl in path_coord: - (aa1,chain1,res1)=xl[0] - (aa2,chain2,res2)=xl[1] - sasd=xl[2] - count = 1 - pdb.write('MODEL %d %s%d%s-%s%d%s\n' % (m_count,res1,aa1,chain1,res2,aa2,chain2)) - m_count = m_count+1 - for (x,y,z) in path_coord[xl]: - p=Vector(x,y,z) - a=p.to_atom() - a.record_name = 'ATOM' - a.serial = count - a.atom_name = 'C' - a.alt_loc = '' - a.res = 'GLY' - a.chain = 'A' - a.res_no = count - a.icode = '' - a.occ = 1 - a.temp_fac = 0 - a.elem = 'C' - a.charge = '' - #print a.__dict__ - #atom = BioPyAtom(a) - pdb.write(a.write_to_PDB()) - count +=1 - pdb.write('END\n') - - - - \ No newline at end of file diff --git a/build/lib/Jwalk/SASDTools.py b/build/lib/Jwalk/SASDTools.py deleted file mode 100644 index cd8b9ba..0000000 --- a/build/lib/Jwalk/SASDTools.py +++ /dev/null @@ -1,451 +0,0 @@ -#=============================================================================== -# This file is part of Jwalk. -# -# Jwalk - A tool to calculate the solvent accessible surface distance (SASD) -# between crosslinked residues. -# -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# -# -# Jwalk is available under Public Licence. -# This software is made available under GPL V3 -# -# Please cite your use of Jwalk in published work: -# -# J.Bullock, J. Schwab, K. Thalassinos, M. Topf (2016) -# The importance of non-accessible crosslinks and solvent accessible surface distance -# in modelling proteins with restraints from crosslinking mass spectrometry. -# Molecular and Cellular Proteomics (15) pp.2491-2500 -# -#=============================================================================== - -from multiprocessing import Pool, Process, freeze_support -import itertools -import sys -import math -import os - -def calculate_specific_SASD(single_crosslink, aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, - max_dist, vox): - - ''' - - Breadth First Search of grid. For general info on algorithm see: - https://en.wikipedia.org/wiki/Breadth-first_search - - Returns dictionary containing solvent accessible surface distances between specific starting res - and ending res. - - {start res, end res, length in angstroms : voxel path of sasd} - - Arguments: - - *single_crosslink* - start and end residue. - start is key of aa1_voxels. aa1_voxels[start_residue] = all the starting voxels for that - residue - *aa1_voxels* - dictionary containing starting voxels {start_residue : starting voxels} - *aa2_voxels* - dictionary containing ending voxels {end_residue : ending voxels} - *dens_map* - grid with solvent accessible surface (masked array) - *aa1_CA* - dictionary containing voxel of C-alpha - *aa2_CA* - dictionary containing voxel of C-alpha - *max_dist* - maximum distance BFS will search until - *vox* - number of angstoms per voxel - - ''' - - start_residue = single_crosslink[0] - end_residue = single_crosslink[1] - - specific_xl = {} - - comb = [[-1, -1, -1],[-1, -1, +0],[-1, -1, +1], - [-1, +0, -1],[-1, +0, +0],[-1, +0, +1], - [-1, +1, -1],[-1, +1, +0],[-1, +1, +1], - [+0, -1, -1],[+0, -1, +0],[+0, -1, +1], - [+0, +0, -1],[+0, +0, +0],[+0, +0, +1], - [+0, +1, -1],[+0, +1, +0],[+0, +1, +1], - [+1, -1, -1],[+1, -1, +0],[+1, -1, +1], - [+1, +0, -1],[+1, +0, +0],[+1, +0, +1], - [+1, +1, -1],[+1, +1, +0],[+1, +1, +1]] - - # distance of diagonal steps - diag1 = (math.sqrt((vox ** 2) * 2)) # 2d diagonal - diag2 = (math.sqrt((vox ** 2) * 3)) # 3d diagonal - - queue = [] # voxels in queue for searching - end_voxels = [] # list of voxels to find path to - visited = {} # list works as all the coordinates that have been visited - dictionary gives the path to said coordinate from startpoint - distance = {} # keeps distance from starting voxel for each other voxel - - # place starting voxels into queue and initialise visited and distance - for j in aa1_voxels[start_residue]: - queue.append([j[0], j[1], j[2]]) - visited[j[0], j[1], j[2]] = [[j[0], j[1], j[2]]] - distance[j[0], j[1], j[2]] = 0 - - while queue: - x_n, y_n, z_n = queue.pop(0) - if distance[x_n, y_n, z_n] <= max_dist: - for c in comb: - x_temp = x_n + c[0] - y_temp = y_n + c[1] - z_temp = z_n + c[2] - if (x_temp, y_temp, z_temp) not in visited: - if ((0 <= x_temp < dens_map.x_size()) and (0 <= y_temp < dens_map.y_size()) and ( - 0 <= z_temp < dens_map.z_size())): - temp_list = visited[x_n, y_n, z_n][:] - temp_list.append([x_temp, y_temp, z_temp]) - visited[x_temp, y_temp, z_temp] = temp_list # updated visited list - - if dens_map.fullMap[z_temp][y_temp][x_temp] <= 0: # if the voxel is in empty space - queue.append(([x_temp, y_temp, z_temp])) - # calculate the distance - diff_x = x_temp - x_n - diff_y = y_temp - y_n - diff_z = z_temp - z_n - if diff_x != 0 and diff_y != 0 and diff_z != 0: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + diag2 - elif diff_x != 0 and diff_y != 0: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + diag1 - elif diff_x != 0 and diff_z != 0: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + diag1 - elif diff_y != 0 and diff_z != 0: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + diag1 - else: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + vox - - # now we have a full set of paths into empty space starting from start_residue - # all stored in visited. Now need to extract paths to specific residue - shortest_distance = 9999 - all_distances = {} - - for j in aa2_voxels[end_residue]: - - (x, y, z) = j - - if (x, y, z) in visited: - - visited[(x, y, z)].insert(0, aa1_CA[start_residue]) # add aa1 CA voxel to path - visited[(x, y, z)].append(aa2_CA[end_residue]) # add aa2 CA voxel to end of path - - # add the distance between starting/ending residue CA voxel and start/end voxel in path - for i in [1, len(visited[(x, y, z)]) - 1]: - (x_1, y_1, z_1) = visited[(x, y, z)][i - 1] - (x_2, y_2, z_2) = visited[(x, y, z)][i] - distance[(x, y, z)] += math.sqrt((x_1 - x_2) ** 2 + (y_1 - y_2) ** 2 + (z_1 - z_2) ** 2) - - all_distances[distance[(x, y, z)]] = visited[(x, y, z)] # linking distance:path - - # keep record of shortest distance - if shortest_distance > distance[(x, y, z)]: - shortest_distance = distance[(x, y, z)] - - # now adding shortest xl to the final list - - if shortest_distance != 9999: - # this is just to order the dict so that chain goes alphabetically - specific_xl[start_residue, end_residue, shortest_distance] = all_distances[ - shortest_distance] # start lys, end lys, length of xl = path of xl - - return specific_xl - - -def calculate_SASDs(start_residue, aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, - max_dist, vox): - - """ - - Breadth First Search of grid. For general info on algorithm see: - https://en.wikipedia.org/wiki/Breadth-first_search - - Returns dictionary containing solvent accessible surface distances between starting res - and all possible ending res. - - {start res, end res, length in angstroms : voxel path of sasd} - - Arguments: - - *start_residue* - key of aa1_voxels. aa1_voxels[start_residue] = all the starting voxels for that - residue - *aa1_voxels* - dictionary containing starting voxels {start_residue : starting voxels} - *aa2_voxels* - dictionary containing ending voxels {end_residue : ending voxels} - *dens_map* - grid with solvent accessible surface (masked array) - *aa1_CA* - dictionary containing voxel of C-alpha - *aa2_CA* - dictionary containing voxel of C-alpha - *max_dist* - maximum distance BFS will search until - *vox* - number of angstoms per voxel - - - """ - - sasds = {} - - # order of voxels to search - by having diagonals last ensures shortest path is returned - comb = [[1, 0, 0], - [-1, 0, 0], - [0, -1, 0], - [0, 1, 0], - [0, 0, -1], - [0, 0, 1], - [1, 0, 1], - [-1, 0, 1], - [0, 1, 1], - [0, -1, 1], - [1, -1, 0], - [-1, -1, 0], - [1, 1, 0], - [-1, 1, 0], - [1, 0, -1], - [-1, 0, -1], - [0, 1, -1], - [0, -1, -1], - [1, 1, 1], - [1, -1, 1], - [-1, 1, 1], - [-1, -1, 1], - [1, 1, -1], - [1, -1, -1], - [-1, 1, -1], - [-1, -1, -1]] - - # distance of diagonal steps - diag1 = (math.sqrt((vox ** 2) * 2)) # 2d diagonal - diag2 = (math.sqrt((vox ** 2) * 3)) # 3d diagonal - - queue = [] # voxels in queue for searching - visited = {} # list works as all the coordinates that have been visited - dictionary gives the path to said coordinate from startpoint - distance = {} # keeps distance from starting voxel for each other voxel - - # place starting voxels into queue and initialise visited and distance - for j in aa1_voxels[start_residue]: - queue.append([j[0], j[1], j[2]]) - visited[j[0], j[1], j[2]] = [[j[0], j[1], j[2]]] - distance[j[0], j[1], j[2]] = 0 - - # grid is searched until queue is empty - while queue: - x_n, y_n, z_n = queue.pop(0) # take first voxel in queue - if distance[x_n, y_n, z_n] <= max_dist: - for c in comb: # expand in all directions from voxel - in order of comb. - x_temp = x_n + c[0] - y_temp = y_n + c[1] - z_temp = z_n + c[2] - # check voxel hasn't already been searched - if (x_temp, y_temp, z_temp) not in visited: - # check that voxel is within bounds of the grid - if ((0 <= x_temp < dens_map.x_size()) and (0 <= y_temp < dens_map.y_size()) and ( - 0 <= z_temp < dens_map.z_size())): - # add path to this voxel to visited - temp_list = visited[x_n, y_n, z_n][:] - temp_list.append([x_temp, y_temp, z_temp]) - visited[x_temp, y_temp, z_temp] = temp_list - - if dens_map.fullMap[z_temp][y_temp][x_temp] <= 0: # if the voxel is in empty space - queue.append(([x_temp, y_temp, z_temp])) # add to queue for later searching - - # calculate the distance to voxel from start voxel - diff_x = x_temp - x_n - diff_y = y_temp - y_n - diff_z = z_temp - z_n - if diff_x != 0 and diff_y != 0 and diff_z != 0: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + diag2 - elif diff_x != 0 and diff_y != 0: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + diag1 - elif diff_x != 0 and diff_z != 0: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + diag1 - elif diff_y != 0 and diff_z != 0: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + diag1 - else: - distance[x_temp, y_temp, z_temp] = distance[x_n, y_n, z_n] + vox - - # now we have a full set of paths into empty space starting from start_residue - # all stored in visited. Now need to extract paths to specific residues - for end_residue in aa2_voxels: - if start_residue != end_residue: - shortest_distance = 9999 - all_distances = {} - - # cycling through possible end coords of end_residue to get shortest sasd - for j in aa2_voxels[end_residue]: - - (x, y, z) = j - - if (x, y, z) in visited: - - visited[(x, y, z)].insert(0, aa1_CA[start_residue]) # add aa1 CA voxel to path - visited[(x, y, z)].append(aa2_CA[end_residue]) # add aa2 CA voxel to end of path - - # add the distance between starting/ending residue CA voxel and start/end voxel in path - for i in [1, len(visited[(x, y, z)]) - 1]: - (x_1, y_1, z_1) = visited[(x, y, z)][i - 1] - (x_2, y_2, z_2) = visited[(x, y, z)][i] - distance[(x, y, z)] += math.sqrt((x_1 - x_2) ** 2 + (y_1 - y_2) ** 2 + (z_1 - z_2) ** 2) - - all_distances[distance[(x, y, z)]] = visited[(x, y, z)] # linking distance:path - - # keep record of shortest distance - if shortest_distance > distance[(x, y, z)]: - shortest_distance = distance[(x, y, z)] - - # add shortest distance sasd to output dictionary - - if shortest_distance != 9999: - if start_residue[1] < end_residue[1]: # this to order the dict so that chain goes alphabetically - sasds[start_residue, end_residue, shortest_distance] = all_distances[shortest_distance] - elif end_residue[1] < start_residue[1]: - sasds[end_residue, start_residue, shortest_distance] = all_distances[shortest_distance] - # if both on the same chain, then ordered to go numerically - elif start_residue[0] < end_residue[0]: - sasds[start_residue, end_residue, shortest_distance] = all_distances[shortest_distance] - else: - sasds[end_residue, start_residue, shortest_distance] = all_distances[shortest_distance] - - return sasds - -def calculate_SASDs_star(a_b): - """Convert `f([1,2])` to `f(1,2)` call.""" - return calculate_SASDs(*a_b) - -def calculate_specific_SASD_star(a_b): - """Convert `f([1,2])` to `f(1,2)` call.""" - return calculate_specific_SASD(*a_b) - -def parallel_BFS(aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, crosslink_pairs, - max_dist, vox, ncpus, xl_list): - - """ - - Parallelised Breadth First Search of grid. - - Returns dictionary containing all solvent accessible surface distances - {start res, end res, length in angstroms : voxel path of sasd} - - Arguments: - - *start_residue* - key of aa1_voxels. aa1_voxels[start_residue] = all the starting voxels for that - residue - *aa1_voxels* - dictionary containing starting voxels {start_residue : starting voxels} - *aa2_voxels* - dictionary containing ending voxels {end_residue : ending voxels} - *dens_map* - grid with solvent accessible surface (masked array) - *aa1_CA* - dictionary containing voxel of C-alpha - *aa2_CA* - dictionary containing voxel of C-alpha - *crosslink_pairs* - list of pairs of crosslinks (empty if not calculating specific crosslinks) - *max_dist* - maximum distance BFS will search until - *vox* - number of angstoms per voxel - *ncpus* - number of allocated cpus - - """ - - freeze_support() - final_XL = {} - - if xl_list: - if ncpus > 1: - pool = Pool(ncpus) - xl_dictionaries = pool.map(calculate_specific_SASD_star, - zip(crosslink_pairs, - itertools.repeat(aa1_voxels), - itertools.repeat(aa2_voxels), - itertools.repeat(dens_map), - itertools.repeat(aa1_CA), - itertools.repeat(aa2_CA), - itertools.repeat(max_dist), - itertools.repeat(vox))) - - for c in xl_dictionaries: - final_XL.update(c) - - else: - # alternative call to allow single cpu running on Windows machines - for single_crosslink in crosslink_pairs: - xl_dictionaries = calculate_specific_SASD(single_crosslink, aa1_voxels, - aa2_voxels, dens_map, aa1_CA, aa2_CA, - max_dist, vox) - final_XL.update(xl_dictionaries) - - else: - if ncpus > 1: - - pool = Pool(ncpus) - xl_dictionaries = pool.map(calculate_SASDs_star, - zip(aa1_voxels, - itertools.repeat(aa1_voxels), - itertools.repeat(aa2_voxels), - itertools.repeat(dens_map), - itertools.repeat(aa1_CA), - itertools.repeat(aa2_CA), - itertools.repeat(max_dist), - itertools.repeat(vox))) - - for c in xl_dictionaries: - final_XL.update(c) - - else: - # alternative call to allow single cpu running on Windows machines - for start_residue in aa1_voxels: - xl_dictionaries = calculate_SASDs(start_residue, aa1_voxels, aa2_voxels, - dens_map, aa1_CA, aa2_CA, max_dist, vox) - final_XL.update(xl_dictionaries) - - return final_XL - -def calculate_distance(cords): - ''' Calculates the distance of points in 3d, input e.g. [[x1,y1,z1],[x2,y2,z3]] ''' - return math.sqrt(((cords[0][0]-cords[1][0])**2)+((cords[0][1]-cords[1][1])**2)+((cords[0][2]-cords[1][2])**2)) - -def get_euclidean_distances(sasds, pdb, aa1, aa2): - - residues = {} - euc_dists = {} - with open (pdb) as inf: - for line in inf: - if line.startswith('ATOM') and (line[12:16].strip() == 'CA'): - if line[21:22].strip() == "": - chain = " " - else: - chain = line[21:22].strip() - residues[line[22:26].strip(),chain] = [float(line[30:38].strip()), - float(line[38:46].strip()), - float(line[46:54].strip())] - - for k,v in residues.items(): - for k1,v1 in residues.items(): - if k1 != k: - - euc_dists[int(k[0]),k[1], int(k1[0]),k1[1]] = calculate_distance([v,v1]) - - sasds_and_eucs = {} - - for s in sasds: - if (s[0][0],s[0][1],s[1][0],s[1][1]) in euc_dists: - sasds_and_eucs[s[0],s[1],s[2],euc_dists[(s[0][0],s[0][1],s[1][0],s[1][1])]] = sasds[s] - - return sasds_and_eucs - diff --git a/build/lib/Jwalk/SurfaceTools.py b/build/lib/Jwalk/SurfaceTools.py deleted file mode 100644 index d764ca2..0000000 --- a/build/lib/Jwalk/SurfaceTools.py +++ /dev/null @@ -1,289 +0,0 @@ -#=============================================================================== -# This file is part of Jwalk. -# -# Jwalk - A tool to calculate the solvent accessible surface distance (SASD) -# between crosslinked residues. -# -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# -# -# Jwalk is available under Public Licence. -# This software is made available under GPL V3 -# -# Please cite your use of Jwalk in published work: -# -# J.Bullock, J. Schwab, K. Thalassinos, M. Topf (2016) -# The importance of non-accessible crosslinks and solvent accessible surface distance -# in modelling proteins with restraints from crosslinking mass spectrometry. -# Molecular and Cellular Proteomics (15) pp.2491-2500 -# -#=============================================================================== - -import sys -from math import cos, sin -import subprocess - -def expand_points(atom,sphere): - """ Exapnd the unit sphere around specific x,y,z point and returns surface points""" - points = {} - atom.point_list = [] - CH2 = 1.68 - radius = {"N":1.43, - "O":1.30, - "C":1.68, - "S":1.67, - } - - r = radius[atom.atom_name[0]] + CH2 - (x,y,z) = (atom.x, atom.y, atom.z) - - for s in sphere: - x1 = x + s[0]*r - y1 = y + s[1]*r - z1 = z + s[2]*r - points[x1,y1,z1] = 0 - - return points - -def create_unit_sphere(): - """ Generates a unit sphere with 30 points on the surface """ - - unit_sphere = [] - - unit_sphere.append( [0.0, 1.0, 0.0] ) - unit_sphere.append( [0.0, -1.0, 0.0] ) - - nstep = 5 - PI = 3.1415926536 - theta = PI/nstep - arc = theta - - for istep in range(nstep): - istep = istep + 1 # to change range from 0--9 to 1--10 - y1 = cos(istep*theta) - r2 = sin(istep*theta) - ndot2= 2*PI*r2/arc # the circumference at that radius / proportion of pi - if ndot2 == 0.0: - continue - theta2 = 2*PI/ndot2 - for idot in range(int(ndot2)): - idot = idot + 1 # to change range from 0-- to 1-- - x2 = r2*cos(idot*theta2) - z2 = r2*sin(idot*theta2) - unit_sphere.append( [x2, y1, z2] ) - - return unit_sphere - -def check_solvent_accessibility(prot,aa1_CA,xl_list = False): - - ''' - - Checks solvent accessibility of residues in aa1_CA - Returns aa1_CA of solvent accessible residues. - - Arguments - *prot* - Tempy structure instance - *aa1_CA* - residues of interest - - ''' - # dictionary for text output - string_dict = {"LYS":"lysines", - "CYS":"cysteines", - "ASP":"acidic residues", - "GLU":"acidic residues", - "VAL":"valines", - "ILE":"isoleucines", - "LEU":"leucines", - "ARG":"arginines", - "PRO":"prolines", - "GLY":"glycines", - "ALA":"alanines", - "TRP":"tryptophans", - "PHE":"phenylalanines", - "SER":"serines", - "GLN":"glutamines", - "HIS":"histidines", - "MET":"methionines", - "THR":"threonines", - "ASN":"asparagines", - "TYR":"tyrosines" - } - - radius = {"N":1.43, - "O":1.30, - "C":1.68, - "S":1.67, - } - sd_res = False - # create sphere of 30 points to expand around atoms - sphere = create_unit_sphere() - - SA_res = {} - CH2 = 1.68 - - # this is not very efficient ... freesasa implementation to come - for atom in prot.atomList: - atom.clash = 1 - if (atom.res_no,atom.chain,atom.res) in aa1_CA: - sd_res = atom.res - # generate 30 points in unit spehere around atom - points = expand_points(atom,sphere) - - for p in points: - (x,y,z) = (p[0],p[1],p[2]) - # for every other atom check if points intersects with it - for atom2 in prot.atomList: - if atom2.res != atom.res or (atom2.res == atom.res and atom2.atom_name != atom.atom_name): - r = radius[atom2.atom_name[0]] + CH2 - # need to transpose x,y,z - (tx,ty,tz) = (x-atom2.x,y-atom2.y,z-atom2.z) - # if the point lies within the sphere of that atom then it clashes - if tx**2 + ty**2 + tz**2 <= r**2: - points[p] = 1 - break - # if any point on the sphere doesn't intersect with another then the atom is solvent accessible - if points[p] == 0: - atom.clash = 0 - break - - # if atom doesn't clash then residue information is kept in SA_res - if atom.clash == 0: - SA_res[atom.res_no,atom.chain,atom.res] = aa1_CA[atom.res_no,atom.chain,atom.res] - - # inform user on buried resiudes - if xl_list: - pass - elif sd_res == "LYS": - print("{} {} and 1 N-terminus of which {} are on the surface".format(len(aa1_CA)-1,string_dict[sd_res], len(SA_res))) - else: - print("{} {} of which {} are on the surface".format(len(aa1_CA),string_dict[sd_res], len(SA_res))) - - return SA_res - -def update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_aa2): - - '''Removes buried residues from crosslink_pairs''' - - buried_residues = [] - index_to_delete = [] - - for i in range(len(crosslink_pairs)): # for each residue pair, check both are solvent accessible - - x1, x2 = crosslink_pairs[i] - - if x1 not in aa1_CA: - index_to_delete.append(i) - if x1 not in buried_residues: - buried_residues.append(x1) - if x2 not in aa2_CA and x2 not in buried_residues: - buried_residues.append(x2) - elif x2 not in aa2_CA: - index_to_delete.append(i) - if x2 not in buried_residues: - buried_residues.append(x2) - - if [x1[0],x1[1]] in remove_aa1: - index_to_delete.append(i) - if x1 not in buried_residues: - buried_residues.append(x1) - if x2 in remove_aa2 and not x2 in buried_residues: - buried_residues.append(x2) - - elif [x2[0],x2[1]] in remove_aa2: - index_to_delete.append(i) - if x2 not in buried_residues: - buried_residues.append(x2) - - no_sasd_possible = [] - crosslink_pairs_final = [] - for i in range(len(crosslink_pairs)): - if i not in index_to_delete: - crosslink_pairs_final.append(crosslink_pairs[i]) - else: - no_sasd_possible.append(crosslink_pairs[i]) - - if len(no_sasd_possible) > 0: - print("the following crosslinks cannot be calculated:") - for s in no_sasd_possible: - print("{}-{}-{} - {}-{}-{}".format(s[0][2],s[0][0],s[0][1],s[1][2],s[1][0],s[1][1])) - - return crosslink_pairs_final - -def check_solvent_accessibility_freesasa(prot,aa1_CA,freesasa_source = "freesasa", xl_list = False): - - # dictionary for text output - string_dict = {"LYS":"lysines", - "CYS":"cysteines", - "ASP":"aspartates", - "GLU":"glutamates", - "VAL":"valines", - "ILE":"isoleucines", - "LEU":"leucines", - "ARG":"arginines", - "PRO":"prolines", - "GLY":"glycines", - "ALA":"alanines", - "TRP":"tryptophans", - "PHE":"phenylalanines", - "SER":"serines", - "GLN":"glutamines", - "HIS":"histidines", - "MET":"methionines", - "THR":"threonines", - "ASN":"asparagines", - "TYR":"tyrosines" - } - - cmd = [freesasa_source,"--format=rsa","--output={}.rsa".format(prot[:-4]),"--radii=naccess",prot] - - ext_freesasa = subprocess.Popen(cmd, stdout = subprocess.PIPE, shell = True) - ext_freesasa.communicate() - - try: - test_open = open(prot[:-4]+".rsa") - test_open.close - except: - print("No .rsa file created. Please check you have Freesasa installed. Go to 'http://freesasa.github.io/' ") - exit(1) - - #try: - SA_res = {} - with open(prot[:-4]+".rsa") as rsa: - for line in rsa: - if line.startswith("RES"): - col = line.split() - RES = line[4:8].strip() - CHAIN = line[8:9].strip() - if len(CHAIN) == 0: - CHAIN = " " - NUM = line[9:13].strip() - REL = line[23:29].strip() - if float(REL) > 7.0: - - res = RES + CHAIN + NUM - SA_res[(int(NUM),CHAIN,RES)] = True - #except: - # print "error" - SA_res_dict = {} - - for s in aa1_CA: - if (s[0],s[1],s[2]) in SA_res: - SA_res_dict[(s[0],s[1],s[2])] = aa1_CA[(s[0],s[1],s[2])] - sd_res = s[2] - else: - print("Residue {}-{}-{} is buried".format(s[0],s[1],s[2])) - sd_res = s[2] - - # inform user on buried resiudes - if xl_list: - pass - elif sd_res == "LYS": - print("{} {} and 1 N-terminus of which {} are on the surface".format(len(aa1_CA)-1,string_dict[sd_res], len(SA_res_dict))) - else: - print("{} {} of which {} are on the surface".format(len(aa1_CA),string_dict[sd_res], len(SA_res_dict))) - - return SA_res_dict - \ No newline at end of file diff --git a/build/lib/Jwalk/__init__.py b/build/lib/Jwalk/__init__.py deleted file mode 100644 index dd5eeb4..0000000 --- a/build/lib/Jwalk/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -#=============================================================================== -# This file is part of Jwalk. -# -# Jwalk - A tool to calculate the solvent accessible surface distance (SASD) -# between crosslinked residues. -# -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# -# -# Jwalk is available under Public Licence. -# This software is made available under GPL V3 -# -# Please cite your use of Jwalk in published work: -# -# J.Bullock, J. Schwab, K. Thalassinos, M. Topf (2016) -# The importance of non-accessible crosslinks and solvent accessible surface distance -# in modelling proteins with restraints from crosslinking mass spectrometry. -# Molecular and Cellular Proteomics (15) pp.2491-2500 -# -#=============================================================================== \ No newline at end of file diff --git a/build/scripts-3.8/jwalk b/build/scripts-3.8/jwalk deleted file mode 100755 index 1a21f79..0000000 --- a/build/scripts-3.8/jwalk +++ /dev/null @@ -1,179 +0,0 @@ -#!/usr/local/opt/python@3.8/bin/python3.8 - -# =============================================================================== -# This file is part of Jwalk. -# -# Jwalk - A tool to calculate the solvent accessible surface distance (SASD) -# between crosslinked residues. -# -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# -# -# Jwalk is available under Public Licence. -# This software is made available under GPL V3 -# -# Please cite your use of Jwalk in published work: -# -# J.Bullock, J. Schwab, K. Thalassinos, M. Topf (2016) -# The importance of non-accessible crosslinks and solvent accessible surface distance -# in modelling proteins with restraints from crosslinking mass spectrometry. -# Molecular and Cellular Proteomics (15) pp.2491-2500 -# -# =============================================================================== - -from Jwalk import PDBTools, GridTools, SurfaceTools, SASDTools -from multiprocessing import cpu_count -import os, sys, argparse - -# default parameters - -max_dist = 60 -vox = 1 -surface = False -xl_list = [] -aa1 = "LYS" -aa2 = "LYS" -ncpus = cpu_count() -pdb_list = [i for i in os.listdir('./') if i.endswith('.pdb')] - -amino_acids = {"LYS":"lysines", - "CYS":"cysteines", - "ASP":"acidic residues", - "GLU":"acidic residues", - "VAL":"valines", - "ILE":"isoleucines", - "LEU":"leucines", - "ARG":"arginines", - "PRO":"prolines", - "GLY":"glycines", - "ALA":"alanines", - "TRP":"tryptophans", - "PHE":"phenylalanines", - "SER":"serines", - "GLN":"glutamines", - "HIS":"histidines", - "MET":"methionines", - "THR":"threonines", - "ASN":"asparagines", - "TYR":"tyrosines"} - -parser = argparse.ArgumentParser(description='JWALK: Calculate SASDs on your target PDB files') - -parser.add_argument('-lys', action="store_true", - help='calculate lysine crosslinks (default)') -parser.add_argument('-xl_list', nargs=1, - help='calculate crosslinks from input list') -parser.add_argument('-i', nargs=1, - help='specify input pdb: -i ') -parser.add_argument('-aa1', nargs=1, - help='specify start amino acid (three letter code e.g. LYS)') -parser.add_argument('-aa2', nargs=1, - help='specify end amino acid (three letter code e.g. LYS)') -parser.add_argument('-max_dist', nargs=1, - help='specify maximum crosslink distance in Angstroms') -parser.add_argument('-vox', nargs=1, - help='specify voxel size of grid') -parser.add_argument('-surface', action="store_true", - help='use higher accuracy method to calculate solvent accessibility - requires Freesasa installation') -parser.add_argument('-ncpus', nargs=1, - help='specify number of cpus to use') - -args = parser.parse_args() - -if args.lys: - aa1 = "LYS" - aa2 = "LYS" - -elif args.xl_list: - xl_list = args.xl_list[0] - -elif args.aa1: - if args.aa2: - aa1 = args.aa1[0].upper() - aa2 = args.aa2[0].upper() - # catch any dodgy typing - if aa1 not in amino_acids or aa2 not in amino_acids: - print("ERROR: Please type amino acid in three letter code format") - sys.exit(2) - else: - print("Please specify both aa1 AND aa2 if you want to use this option") - sys.exit(2) - -if args.max_dist: - max_dist = int(args.max_dist[0]) - -if args.i: - pdb_list = [args.i[0]] - -if args.vox: - vox = int(args.vox[0]) - -if args.surface: - ACCESS_BIN = "freesasa" - surface = True - -if args.ncpus: - ncpus = int(args.ncpus[0]) - -####################################### - -def runJwalk(max_dist, vox, surface, xl_list, aa1, aa2, ncpus, pdb_list): - """ - Execute Jwalk with processed command line options - - max_dist: maximum distance Jwalk will search - vox: angstoms per voxel in grid - surface: if True use higher resolution surface method - xl_list: list of specific crosslinks to calculate - aa1: starting residue type - aa2: ending residues type - ncpus: number of cpus to use - pdb_list: default is all pdbs in directory, unless otherwise stated - - """ - for pdb in pdb_list: - - print("calculating crosslinks on {}".format(pdb)) - # load pdb into Jwalk - structure_instance = PDBTools.read_PDB_file(pdb) - # generate grid of voxel size (vox) that encapsulates pdb - grid = GridTools.makeGrid(structure_instance, vox) - - # mark C-alpha positions on grid - if xl_list: # if specific crosslinks need to be calculated - crosslink_pairs, aa1_CA, aa2_CA = GridTools.mark_CAlphas_pairs(grid, structure_instance, xl_list) - else: - crosslink_pairs = [] # na if searching every combination between residue types - aa1_CA, aa2_CA = GridTools.markCAlphas(grid, structure_instance, aa1, aa2) - - if surface == True: - # check more rigorously if residues are solvent accessible or not - aa1_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa1_CA, ACCESS_BIN, xl_list) - if aa1 != aa2 or xl_list: - aa2_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa2_CA, ACCESS_BIN, xl_list) - else: - aa2_CA = aa1_CA.copy() - - dens_map = GridTools.generate_solvent_accessible_surface(grid, structure_instance, aa1_CA, aa2_CA) - # identify which residues are on the surface - aa1_voxels, remove_aa1 = GridTools.find_surface_voxels(aa1_CA, dens_map, surface, xl_list) - aa2_voxels, remove_aa2 = GridTools.find_surface_voxels(aa2_CA, dens_map, surface, xl_list) - - crosslink_pairs = SurfaceTools.update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_aa2) - - # calculate sasds - sasds = SASDTools.parallel_BFS(aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, crosslink_pairs, - max_dist, vox, ncpus, xl_list) - - # remove duplicates - sasds = GridTools.remove_duplicates(sasds) - sasds = SASDTools.get_euclidean_distances(sasds, pdb, aa1, aa2) - - # output sasds to .pdb file and .txt file - PDBTools.write_sasd_to_txt(sasds, pdb) - PDBTools.write_sasd_to_pdb(dens_map, sasds, pdb) - print("{} SASDs calculated".format(len(sasds))) - -if __name__ == "__main__": - runJwalk(max_dist, vox, surface, xl_list, aa1, aa2, ncpus, pdb_list) diff --git a/setup.py b/setup.py index ab01860..2dae191 100644 --- a/setup.py +++ b/setup.py @@ -33,8 +33,6 @@ print("Please upgrade your version of Python.") sys.exit(-1) - - setup( name = "Jwalk", version = "2.0.0", @@ -42,13 +40,14 @@ author_email = "j.bullock@cryst.bbk.ac.uk", maintainer = "Edgar Manriquez-Sandoval", maintainer_email = "emanriq1@jhu.edu", + url="https://github.com/FriedLabJHU/Jwalk", description = ("A tool to calculate SASDs between crosslinked residues "), packages=['Jwalk'], package_dir = {'':'src'}, requires=['NumPy (>=1.6)', "Biopython (>= 1.5)", ], + package_data={'': ['naccess.config.txt']}, scripts=['src/Jwalk/jwalk'], - ) diff --git a/src/Jwalk/.DS_Store b/src/Jwalk/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/src/Jwalk/.DS_Store differ diff --git a/src/Jwalk/GridTools.py b/src/Jwalk/GridTools.py index b24450f..ce941e8 100644 --- a/src/Jwalk/GridTools.py +++ b/src/Jwalk/GridTools.py @@ -1,12 +1,10 @@ -#=============================================================================== -# This file is part of Jwalk. +# =============================================================================== +# This file is part of Jwalk (Python 3). # # Jwalk - A tool to calculate the solvent accessible surface distance (SASD) # between crosslinked residues. # -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# +# Copyright 2016 Josh Bullock and Birkbeck College University of London. # # Jwalk is available under Public Licence. # This software is made available under GPL V3 @@ -18,7 +16,7 @@ # in modelling proteins with restraints from crosslinking mass spectrometry. # Molecular and Cellular Proteomics (15) pp.2491-2500 # -#=============================================================================== +# =============================================================================== from numpy import zeros from collections import OrderedDict @@ -153,7 +151,7 @@ def mapGridPosition(densMap, atom): else: return 0 -def markCAlphas(densMap, prot, aa1, aa2): +def mark_CAlphas(densMap, prot, aa1, aa2): """ Returns ordered dictionaries containing {residue_number, chain, residue name : x, y, z} @@ -347,7 +345,7 @@ def generate_solvent_accessible_surface(densMap,prot,aa1_CA, aa2_CA): for z in range(-rad,rad+1): if (x**2 + y**2 + z**2) <= (rad**2): sphere[r].append([x,y,z]) - + backbone = ['N','CA','C','O'] # generate solvent accessible surface @@ -409,7 +407,7 @@ def find_empty_space(res,sphere,densMap,CA): starters.append([x_s+x,y_s+y,z_s+z]) return starters -def find_surface_voxels(aa1_CA, densMap, surface, xl_list = []): +def find_surface_voxels(aa1_CA, densMap, xl_list = []): """ @@ -509,18 +507,10 @@ def find_surface_voxels(aa1_CA, densMap, surface, xl_list = []): aa_1_start_voxels[k] = find_empty_space(k,sphere3,densMap,aa1_CA) if aa_1_start_voxels[k] == []: aa_1_start_voxels[k] = find_empty_space(k,sphere4,densMap,aa1_CA) - - if surface == False: - # if no voxels found after fourth shell then residue is not solvent exposed - if aa_1_start_voxels[k] == []: - buried.append(k) - del aa_1_start_voxels[k] - k_buried +=1 - else: # residues that have been determined solvent accessible by other means. - if aa_1_start_voxels[k] == []: - aa_1_start_voxels[k] = find_empty_space(k,sphere5,densMap,aa1_CA) - if aa_1_start_voxels[k] == []: - aa_1_start_voxels[k] = find_empty_space(k,sphere6,densMap,aa1_CA) + if aa_1_start_voxels[k] == []: + aa_1_start_voxels[k] = find_empty_space(k,sphere5,densMap,aa1_CA) + if aa_1_start_voxels[k] == []: + aa_1_start_voxels[k] = find_empty_space(k,sphere6,densMap,aa1_CA) rem_x = [] @@ -533,7 +523,7 @@ def find_surface_voxels(aa1_CA, densMap, surface, xl_list = []): return aa_1_start_voxels, rem_x -def remove_duplicates(sasds,xl_list=False): +def remove_duplicates(sasds): """ @@ -546,9 +536,6 @@ def remove_duplicates(sasds,xl_list=False): """ - if xl_list == True: - return sasds - keep = {} keep_keys = [] keep_sasds = {} diff --git a/src/Jwalk/Jwalk.v2.py b/src/Jwalk/Jwalk.v2.py deleted file mode 100644 index 9c82cdd..0000000 --- a/src/Jwalk/Jwalk.v2.py +++ /dev/null @@ -1,177 +0,0 @@ -# =============================================================================== -# This file is part of Jwalk. -# -# Jwalk - A tool to calculate the solvent accessible surface distance (SASD) -# between crosslinked residues. -# -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# -# -# Jwalk is available under Public Licence. -# This software is made available under GPL V3 -# -# Please cite your use of Jwalk in published work: -# -# J.Bullock, J. Schwab, K. Thalassinos, M. Topf (2016) -# The importance of non-accessible crosslinks and solvent accessible surface distance -# in modelling proteins with restraints from crosslinking mass spectrometry. -# Molecular and Cellular Proteomics (15) pp.2491-2500 -# -# =============================================================================== - -from Jwalk import PDBTools, GridTools, SurfaceTools, SASDTools -from multiprocessing import cpu_count -import os, sys, argparse - -# default parameters - -max_dist = 60 -vox = 1 -surface = False -xl_list = [] -aa1 = "LYS" -aa2 = "LYS" -ncpus = cpu_count() -pdb_list = [i for i in os.listdir('./') if i.endswith('.pdb')] - -amino_acids = {"LYS":"lysines", - "CYS":"cysteines", - "ASP":"acidic residues", - "GLU":"acidic residues", - "VAL":"valines", - "ILE":"isoleucines", - "LEU":"leucines", - "ARG":"arginines", - "PRO":"prolines", - "GLY":"glycines", - "ALA":"alanines", - "TRP":"tryptophans", - "PHE":"phenylalanines", - "SER":"serines", - "GLN":"glutamines", - "HIS":"histidines", - "MET":"methionines", - "THR":"threonines", - "ASN":"asparagines", - "TYR":"tyrosines"} - -parser = argparse.ArgumentParser(description='JWALK: Calculate SASDs on your target PDB files') - -parser.add_argument('-lys', action="store_true", - help='calculate lysine crosslinks (default)') -parser.add_argument('-xl_list', nargs=1, - help='calculate crosslinks from input list') -parser.add_argument('-i', nargs=1, - help='specify input pdb: -i ') -parser.add_argument('-aa1', nargs=1, - help='specify start amino acid (three letter code e.g. LYS)') -parser.add_argument('-aa2', nargs=1, - help='specify end amino acid (three letter code e.g. LYS)') -parser.add_argument('-max_dist', nargs=1, - help='specify maximum crosslink distance in Angstroms') -parser.add_argument('-vox', nargs=1, - help='specify voxel size of grid') -parser.add_argument('-surface', action="store_true", - help='use higher accuracy method to calculate solvent accessibility - requires Freesasa installation') -parser.add_argument('-ncpus', nargs=1, - help='specify number of cpus to use') - -args = parser.parse_args() - -if args.lys: - aa1 = "LYS" - aa2 = "LYS" - -elif args.xl_list: - xl_list = args.xl_list[0] - -elif args.aa1: - if args.aa2: - aa1 = args.aa1[0].upper() - aa2 = args.aa2[0].upper() - # catch any dodgy typing - if aa1 not in amino_acids or aa2 not in amino_acids: - print("ERROR: Please type amino acid in three letter code format") - sys.exit(2) - else: - print("Please specify both aa1 AND aa2 if you want to use this option") - sys.exit(2) - -if args.max_dist: - max_dist = int(args.max_dist[0]) - -if args.i: - pdb_list = [args.i[0]] - -if args.vox: - vox = int(args.vox[0]) - -if args.surface: - ACCESS_BIN = "freesasa" - surface = True - -if args.ncpus: - ncpus = int(args.ncpus[0]) - -####################################### - -def runJwalk(max_dist, vox, surface, xl_list, aa1, aa2, ncpus, pdb_list): - """ - Execute Jwalk with processed command line options - - max_dist: maximum distance Jwalk will search - vox: angstoms per voxel in grid - surface: if True use higher resolution surface method - xl_list: list of specific crosslinks to calculate - aa1: starting residue type - aa2: ending residues type - ncpus: number of cpus to use - pdb_list: default is all pdbs in directory, unless otherwise stated - - """ - for pdb in pdb_list: - - print("calculating crosslinks on {} ".format(pdb)) - # load pdb into Jwalk - structure_instance = PDBTools.read_PDB_file(pdb) - # generate grid of voxel size (vox) that encapsulates pdb - grid = GridTools.makeGrid(structure_instance, vox) - - # mark C-alpha positions on grid - if xl_list: # if specific crosslinks need to be calculated - crosslink_pairs, aa1_CA, aa2_CA = GridTools.mark_CAlphas_pairs(grid, structure_instance, xl_list) - else: - crosslink_pairs = [] # na if searching every combination between residue types - aa1_CA, aa2_CA = GridTools.markCAlphas(grid, structure_instance, aa1, aa2) - - if surface == True: - # check more rigorously if residues are solvent accessible or not - aa1_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa1_CA, ACCESS_BIN, xl_list) - if aa1 != aa2 or xl_list: - aa2_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa2_CA, ACCESS_BIN, xl_list) - else: - aa2_CA = aa1_CA.copy() - - dens_map = GridTools.generate_solvent_accessible_surface(grid, structure_instance, aa1_CA, aa2_CA) - # identify which residues are on the surface - aa1_voxels, remove_aa1 = GridTools.find_surface_voxels(aa1_CA, dens_map, surface, xl_list) - aa2_voxels, remove_aa2 = GridTools.find_surface_voxels(aa2_CA, dens_map, surface, xl_list) - - crosslink_pairs = SurfaceTools.update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_aa2) - - # calculate sasds - sasds = SASDTools.parallel_BFS(aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, crosslink_pairs, - max_dist, vox, ncpus, xl_list) - - # remove duplicates - sasds = GridTools.remove_duplicates(sasds) - sasds = SASDTools.get_euclidean_distances(sasds, pdb, aa1, aa2) - - # output sasds to .pdb file and .txt file - PDBTools.write_sasd_to_txt(sasds, pdb) - PDBTools.write_sasd_to_pdb(dens_map, sasds, pdb) - print("{} SASDs calculated".format(len(sasds))) - -if __name__ == "__main__": - runJwalk(max_dist, vox, surface, xl_list, aa1, aa2, ncpus, pdb_list) diff --git a/src/Jwalk/PDBTools.py b/src/Jwalk/PDBTools.py index 99fdd90..43ccaac 100644 --- a/src/Jwalk/PDBTools.py +++ b/src/Jwalk/PDBTools.py @@ -1,12 +1,10 @@ -#=============================================================================== -# This file is part of Jwalk. +# =============================================================================== +# This file is part of Jwalk (Python 3). # # Jwalk - A tool to calculate the solvent accessible surface distance (SASD) # between crosslinked residues. # -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# +# Copyright 2016 Josh Bullock and Birkbeck College University of London. # # Jwalk is available under Public Licence. # This software is made available under GPL V3 @@ -18,11 +16,12 @@ # in modelling proteins with restraints from crosslinking mass spectrometry. # Molecular and Cellular Proteomics (15) pp.2491-2500 # -#=============================================================================== +# =============================================================================== +import os, pathlib +from string import ascii_uppercase from numpy import array, append from Bio.PDB import PDBParser as PDBParserBiopy -import os class Vector: """A class representing Cartesian 3-dimensonal vectors.""" @@ -47,12 +46,11 @@ def to_atom(self): Return: Atom instance """ - template = 'ATOM 1 C NOR A 1 23.161 39.732 -25.038 1.00 10.00 C' - a = BioPyAtom([]) - a.x = self.x - a.y = self.y - a.z = self.z - return a + atom = BioPyAtom([]) + atom.x = self.x + atom.y = self.y + atom.z = self.z + return atom class BioPy_Structure: @@ -91,111 +89,13 @@ def __len__(self): def __repr__(self): if not self.filename == 'Unknown': - s = 'Filename: ' + self.filename + '\n' + repr_str = 'Filename: ' + self.filename + '\n' else: - s = '' - s += 'No Of Atoms: ' + str(len(self)) + '\n' - s += 'First Atom: ' + str(self.atomList[0]) + '\n' - s += 'Last Atom: ' + str(self.atomList[-1]) + '\n' - return s - - def write_to_PDB(self, filename): - """ - - Write Structure instance to PDB file. - - Arguments: - - *filename* - output filename. - - """ - if filename[-4:] == '.pdb': - g = open(filename, 'w') - else: - g = open(filename+'.pdb', 'w') - header='''EXPDTA MODEL GENERATE WITH TEMPY -REMARK MODEL GENERATE WITH TEMPY -''' - g.write(header) - for x in self.atomList: - g.write(x.write_to_PDB()) - if x.isTerm: - line = x._writeTerm()+'\n' - g.write(line) - g.write(self.footer) - g.close() - - def write_to_PDB2(self, filename,hetatom=False): - """ - - Write Structure instance to PDB file. - - Arguments: - - *filename* - output filename. - - """ - if filename[-4:] == '.pdb': - g = open(filename, 'w') - else: - g = open(filename+'.pdb', 'w') - header='''EXPDTA MODEL GENERATE WITH TEMPY -REMARK MODEL GENERATE WITH TEMPY -''' - g.write(header) - structList=self.split_into_chains() - hetatmlist=[] - chainlisttot=[] - last_prot_num=0 - for chain in range(len(structList)): - chainlist=[] - for x in structList[chain].atomList: - if x.record_name=="HETATM": - #hetatmlist.append(x.write_to_PDB()) - hetatmlist.append(x.copy()) - else: - chainlist.append(x.copy()) - chainlisttot.append(BioPy_Structure(chainlist)) - for strchain in range(len(chainlisttot)): - if strchain==0: - chainlisttot[strchain].renumber_atoms() - else: - start_num=chainlisttot[strchain-1].atomList[-1].serial - #+2 there is ter - chainlisttot[strchain].renumber_atoms(start_num=start_num+2) - for x in chainlisttot[strchain].atomList: - g.write(x.write_to_PDB()) - last_prot_num+=1 - line = chainlisttot[strchain].atomList[-1]._writeTerm()+'\n' - g.write(line) - #last_prot_num+=1 - - print(last_prot_num) - if hetatom==True: - hetstr=BioPy_Structure(hetatmlist) - hetchain=hetstr.split_into_chains() - for chain in range(len(hetchain)): - if chain==0: - #hetchain[chain].renumber_atoms() - print(last_prot_num) - hetchain[chain].renumber_atoms(start_num=last_prot_num+2) - - else: - start_num=hetchain[chain-1].atomList[-1].serial - #+2 there is ter - hetchain[chain].renumber_atoms(start_num=start_num+2) - - for xhet in hetchain[chain].atomList: - g.write(xhet.write_to_PDB()) - line = hetchain[chain].atomList[-1]._writeTerm()+'\n' - g.write(line) - lineend = '' - lineend += 'ENDMDL'.ljust(6)+'\n' - g.write(lineend) - g.write(self.footer) - g.close() + repr_str = '' + repr_str += 'No Of Atoms: ' + str(len(self)) + '\n' + repr_str += 'First Atom: ' + str(self.atomList[0]) + '\n' + repr_str += 'Last Atom: ' + str(self.atomList[-1]) + '\n' + return repr_str def copy(self): """ @@ -473,10 +373,10 @@ def write_to_PDB(self): return line + '\n' def read_PDB_file(filename,hetatm=False,water=False): - + struct_file = open(filename, "r") # hydrogens are omitted. p=PDBParserBiopy(QUIET=True)#permissive default True - structure=p.get_structure("id", filename) + structure=p.get_structure("id", struct_file) atomList = [] hetatomList=[] @@ -507,12 +407,12 @@ def read_PDB_file(filename,hetatm=False,water=False): return BioPy_Structure(atomList, filename, header, footer) -def write_sasd_to_txt(sasds,pdb): - - """ - - Outputs sasds to .txt file - +def write_sasd_to_txt(sasds,pdb,result_dir): + + """ + + Outputs sasds to .txt file + Arguments: *sasds* @@ -520,33 +420,37 @@ def write_sasd_to_txt(sasds,pdb): *pdb* .pdb file sasds were calculated on """ - - if not os.path.exists('./Jwalk_results'): - os.makedirs('./Jwalk_results') - - with open('./Jwalk_results/%s_crosslink_list.txt' % pdb[:-4],'w') as outf: - - outf.write(' '.join('{0:<13}'.format(col) for col in ['Index','Model','Atom1','Atom2','SASD','Euclidean Distance'])) - outf.write('\n') - index = 1 - - for xl in sasds: - (aa1,chain1,res1)=xl[0] - (aa2,chain2,res2)=xl[1] - atom1 = ('%s-%d-%s-CA' % (res1,aa1,chain1) ) - atom2 = ('%s-%d-%s-CA' % (res2,aa2,chain2) ) - sasd=xl[2] - ed=xl[3] - outf.write(' '.join('{0:<13}'.format(col) for col in [index,pdb,atom1,atom2,sasd,ed])) - outf.write('\n') - index +=1 - -def write_sasd_to_pdb(dens_map,sasds,pdb): - - """ - - Outputs sasds to .pdb file - + + jwalk_pure_path = pathlib.PurePath(result_dir, 'Jwalk_results') + jwalk_path = pathlib.Path(jwalk_pure_path) + if not jwalk_path.exists(): + os.mkdir(jwalk_path) + + write_pure_path = pathlib.PurePath(jwalk_pure_path,'{}_crosslink_list.txt'.format(pdb.stem)) + write_path = pathlib.Path(write_pure_path) + with open(write_path,'w') as outf: + + outf.write(' '.join('{0:<13}'.format(col) for col in ['Index','Model','Atom1','Atom2','SASD','Euclidean Distance'])) + outf.write('\n') + index = 1 + + for xl in sasds: + (aa1,chain1,res1)=xl[0] + (aa2,chain2,res2)=xl[1] + atom1 = ('%s-%d-%s-CA' % (res1,aa1,chain1) ) + atom2 = ('%s-%d-%s-CA' % (res2,aa2,chain2) ) + sasd=xl[2] + ed=xl[3] + outf.write(' '.join('{0:<13}'.format(col) for col in [index,pdb.stem,atom1,atom2,sasd,ed])) + outf.write('\n') + index +=1 + +def write_sasd_to_pdb(dens_map,sasds,pdb,result_dir): + + """ + + Outputs sasds to .pdb file + Arguments: *dens_map* @@ -556,52 +460,71 @@ def write_sasd_to_pdb(dens_map,sasds,pdb): *pdb* .pdb file sasds were calculated on """ - - if not os.path.exists('./Jwalk_results'): - os.makedirs('./Jwalk_results') - - apix = dens_map.apix - origin = dens_map.origin - path_coord = {} - - for xl in sasds: - a = [] - for (x,y,z) in sasds[xl]: - a.append([(x*apix)+origin[0], (y*apix)+origin[1], (z*apix)+origin[2]]) - - path_coord[xl] = a - - with open('./Jwalk_results/%s_crosslinks.pdb' % pdb[:-4],'w') as pdb: - - m_count = 1 - for xl in path_coord: - (aa1,chain1,res1)=xl[0] - (aa2,chain2,res2)=xl[1] - sasd=xl[2] - count = 1 - pdb.write('MODEL %d %s%d%s-%s%d%s\n' % (m_count,res1,aa1,chain1,res2,aa2,chain2)) - m_count = m_count+1 - for (x,y,z) in path_coord[xl]: - p=Vector(x,y,z) - a=p.to_atom() - a.record_name = 'ATOM' - a.serial = count - a.atom_name = 'C' - a.alt_loc = '' - a.res = 'GLY' - a.chain = 'A' - a.res_no = count - a.icode = '' - a.occ = 1 - a.temp_fac = 0 - a.elem = 'C' - a.charge = '' - #print a.__dict__ - #atom = BioPyAtom(a) - pdb.write(a.write_to_PDB()) - count +=1 - pdb.write('END\n') + jwalk_pure_path = pathlib.PurePath(result_dir, 'Jwalk_results') + jwalk_path = pathlib.Path(jwalk_pure_path) + if not jwalk_path.exists(): + os.mkdir(jwalk_path) + + apix = dens_map.apix + origin = dens_map.origin + path_coord = {} + + for xl in sasds: + a = [] + for (x,y,z) in sasds[xl]: + a.append([(x*apix)+origin[0], (y*apix)+origin[1], (z*apix)+origin[2]]) + path_coord[xl] = a + + write_pure_path = pathlib.PurePath(jwalk_path,'{}_crosslinks.pdb'.format(pdb.stem)) + write_path = pathlib.Path(write_pure_path) + with open(write_path,'w') as pdb: + # little trick to uniquely id all crosslinks with unique flase ATOM (X[A-Z]) / CHAIN ([A-Z]) name pairs + atom_cnt = 0 + chain_cnt = 0 + model_cnt = 1 + for xl in path_coord: + (aa1,chain1,res1)=xl[0] + (aa2,chain2,res2)=xl[1] + + atom_count_per_model = 1 + pdb.write('# MODEL {:d} {:s}{:d}{:s}-{:s}{:d}{:s}\n'.format(model_cnt,res1,aa1,chain1,res2,aa2,chain2)) + model_cnt += 1 + + for (x,y,z) in path_coord[xl]: + + if atom_cnt > 25: + chain_cnt += 1 + atom_cnt = 0 + + atom_tmp = ascii_uppercase[atom_cnt]+'X' + chain_tmp = ascii_uppercase[chain_cnt] + + p=Vector(x,y,z) + a=p.to_atom() + a.record_name = 'ATOM' + a.serial = atom_count_per_model + a.atom_name = atom_tmp + a.alt_loc = '' + a.res = chain_tmp+atom_tmp + a.chain = chain_tmp + a.res_no = atom_count_per_model + a.icode = '' + a.occ = 1 + a.temp_fac = 0 + a.elem = 'X' + a.charge = '' + #print a.__dict__ + #atom = BioPyAtom(a) + pdb.write(a.write_to_PDB()) + atom_count_per_model += 1 + atom_cnt += 1 - \ No newline at end of file + # accounting for the extra count+=1 in the previous for loop + atom_count_per_model -= 1 + # added for better visualization in pymol + for i in range(1,atom_count_per_model): + pdb.write('CONECT {:4d} {:4d}\n'.format(i,i+1)) + pdb.write('END\n') + \ No newline at end of file diff --git a/src/Jwalk/SASDTools.py b/src/Jwalk/SASDTools.py index cd8b9ba..d35e3ef 100644 --- a/src/Jwalk/SASDTools.py +++ b/src/Jwalk/SASDTools.py @@ -1,12 +1,10 @@ -#=============================================================================== -# This file is part of Jwalk. +# =============================================================================== +# This file is part of Jwalk (Python 3). # # Jwalk - A tool to calculate the solvent accessible surface distance (SASD) # between crosslinked residues. # -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# +# Copyright 2016 Josh Bullock and Birkbeck College University of London. # # Jwalk is available under Public Licence. # This software is made available under GPL V3 @@ -18,13 +16,11 @@ # in modelling proteins with restraints from crosslinking mass spectrometry. # Molecular and Cellular Proteomics (15) pp.2491-2500 # -#=============================================================================== +# =============================================================================== -from multiprocessing import Pool, Process, freeze_support -import itertools -import sys import math -import os +import itertools +from multiprocessing import Pool, freeze_support def calculate_specific_SASD(single_crosslink, aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, max_dist, vox): @@ -67,16 +63,20 @@ def calculate_specific_SASD(single_crosslink, aa1_voxels, aa2_voxels, dens_map, specific_xl = {} - comb = [[-1, -1, -1],[-1, -1, +0],[-1, -1, +1], - [-1, +0, -1],[-1, +0, +0],[-1, +0, +1], - [-1, +1, -1],[-1, +1, +0],[-1, +1, +1], - [+0, -1, -1],[+0, -1, +0],[+0, -1, +1], - [+0, +0, -1],[+0, +0, +0],[+0, +0, +1], - [+0, +1, -1],[+0, +1, +0],[+0, +1, +1], - [+1, -1, -1],[+1, -1, +0],[+1, -1, +1], - [+1, +0, -1],[+1, +0, +0],[+1, +0, +1], - [+1, +1, -1],[+1, +1, +0],[+1, +1, +1]] - + comb = [[+1, +0, +0],[-1, +0, +0], + [+0, +1, +0],[+0, -1, +0], + [+0, +0, +1],[+0, +0, -1], + [+1, +0, +1],[-1, +0, +1], + [+0, +1, +1],[+0, -1, +1], + [+1, -1, +0],[-1, -1, +0], + [+1, +1, +0],[-1, +1, +0], + [+1, +0, -1],[-1, +0, -1], + [+0, +1, -1],[+0, -1, -1], + [+1, +1, +1],[+1, -1, +1], + [-1, +1, +1],[-1, -1, +1], + [+1, +1, -1],[+1, -1, -1], + [-1, +1, -1],[-1, -1, -1]] + # distance of diagonal steps diag1 = (math.sqrt((vox ** 2) * 2)) # 2d diagonal diag2 = (math.sqrt((vox ** 2) * 3)) # 3d diagonal @@ -198,32 +198,19 @@ def calculate_SASDs(start_residue, aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2 sasds = {} # order of voxels to search - by having diagonals last ensures shortest path is returned - comb = [[1, 0, 0], - [-1, 0, 0], - [0, -1, 0], - [0, 1, 0], - [0, 0, -1], - [0, 0, 1], - [1, 0, 1], - [-1, 0, 1], - [0, 1, 1], - [0, -1, 1], - [1, -1, 0], - [-1, -1, 0], - [1, 1, 0], - [-1, 1, 0], - [1, 0, -1], - [-1, 0, -1], - [0, 1, -1], - [0, -1, -1], - [1, 1, 1], - [1, -1, 1], - [-1, 1, 1], - [-1, -1, 1], - [1, 1, -1], - [1, -1, -1], - [-1, 1, -1], - [-1, -1, -1]] + comb = [[+1, +0, +0],[-1, +0, +0], + [+0, +1, +0],[+0, -1, +0], + [+0, +0, +1],[+0, +0, -1], + [+1, +0, +1],[-1, +0, +1], + [+0, +1, +1],[+0, -1, +1], + [+1, -1, +0],[-1, -1, +0], + [+1, +1, +0],[-1, +1, +0], + [+1, +0, -1],[-1, +0, -1], + [+0, +1, -1],[+0, -1, -1], + [+1, +1, +1],[+1, -1, +1], + [-1, +1, +1],[-1, -1, +1], + [+1, +1, -1],[+1, -1, -1], + [-1, +1, -1],[-1, -1, -1]] # distance of diagonal steps diag1 = (math.sqrt((vox ** 2) * 2)) # 2d diagonal @@ -366,7 +353,7 @@ def parallel_BFS(aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, crosslink_pai freeze_support() final_XL = {} - if xl_list: + if xl_list != "NULL": if ncpus > 1: pool = Pool(ncpus) xl_dictionaries = pool.map(calculate_specific_SASD_star, diff --git a/src/Jwalk/SurfaceTools.py b/src/Jwalk/SurfaceTools.py index d764ca2..708c790 100644 --- a/src/Jwalk/SurfaceTools.py +++ b/src/Jwalk/SurfaceTools.py @@ -1,12 +1,10 @@ -#=============================================================================== -# This file is part of Jwalk. +# =============================================================================== +# This file is part of Jwalk (Python 3). # # Jwalk - A tool to calculate the solvent accessible surface distance (SASD) # between crosslinked residues. # -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# +# Copyright 2016 Josh Bullock and Birkbeck College University of London. # # Jwalk is available under Public Licence. # This software is made available under GPL V3 @@ -18,151 +16,11 @@ # in modelling proteins with restraints from crosslinking mass spectrometry. # Molecular and Cellular Proteomics (15) pp.2491-2500 # -#=============================================================================== - -import sys -from math import cos, sin -import subprocess - -def expand_points(atom,sphere): - """ Exapnd the unit sphere around specific x,y,z point and returns surface points""" - points = {} - atom.point_list = [] - CH2 = 1.68 - radius = {"N":1.43, - "O":1.30, - "C":1.68, - "S":1.67, - } - - r = radius[atom.atom_name[0]] + CH2 - (x,y,z) = (atom.x, atom.y, atom.z) - - for s in sphere: - x1 = x + s[0]*r - y1 = y + s[1]*r - z1 = z + s[2]*r - points[x1,y1,z1] = 0 +# =============================================================================== - return points +import os +import freesasa -def create_unit_sphere(): - """ Generates a unit sphere with 30 points on the surface """ - - unit_sphere = [] - - unit_sphere.append( [0.0, 1.0, 0.0] ) - unit_sphere.append( [0.0, -1.0, 0.0] ) - - nstep = 5 - PI = 3.1415926536 - theta = PI/nstep - arc = theta - - for istep in range(nstep): - istep = istep + 1 # to change range from 0--9 to 1--10 - y1 = cos(istep*theta) - r2 = sin(istep*theta) - ndot2= 2*PI*r2/arc # the circumference at that radius / proportion of pi - if ndot2 == 0.0: - continue - theta2 = 2*PI/ndot2 - for idot in range(int(ndot2)): - idot = idot + 1 # to change range from 0-- to 1-- - x2 = r2*cos(idot*theta2) - z2 = r2*sin(idot*theta2) - unit_sphere.append( [x2, y1, z2] ) - - return unit_sphere - -def check_solvent_accessibility(prot,aa1_CA,xl_list = False): - - ''' - - Checks solvent accessibility of residues in aa1_CA - Returns aa1_CA of solvent accessible residues. - - Arguments - *prot* - Tempy structure instance - *aa1_CA* - residues of interest - - ''' - # dictionary for text output - string_dict = {"LYS":"lysines", - "CYS":"cysteines", - "ASP":"acidic residues", - "GLU":"acidic residues", - "VAL":"valines", - "ILE":"isoleucines", - "LEU":"leucines", - "ARG":"arginines", - "PRO":"prolines", - "GLY":"glycines", - "ALA":"alanines", - "TRP":"tryptophans", - "PHE":"phenylalanines", - "SER":"serines", - "GLN":"glutamines", - "HIS":"histidines", - "MET":"methionines", - "THR":"threonines", - "ASN":"asparagines", - "TYR":"tyrosines" - } - - radius = {"N":1.43, - "O":1.30, - "C":1.68, - "S":1.67, - } - sd_res = False - # create sphere of 30 points to expand around atoms - sphere = create_unit_sphere() - - SA_res = {} - CH2 = 1.68 - - # this is not very efficient ... freesasa implementation to come - for atom in prot.atomList: - atom.clash = 1 - if (atom.res_no,atom.chain,atom.res) in aa1_CA: - sd_res = atom.res - # generate 30 points in unit spehere around atom - points = expand_points(atom,sphere) - - for p in points: - (x,y,z) = (p[0],p[1],p[2]) - # for every other atom check if points intersects with it - for atom2 in prot.atomList: - if atom2.res != atom.res or (atom2.res == atom.res and atom2.atom_name != atom.atom_name): - r = radius[atom2.atom_name[0]] + CH2 - # need to transpose x,y,z - (tx,ty,tz) = (x-atom2.x,y-atom2.y,z-atom2.z) - # if the point lies within the sphere of that atom then it clashes - if tx**2 + ty**2 + tz**2 <= r**2: - points[p] = 1 - break - # if any point on the sphere doesn't intersect with another then the atom is solvent accessible - if points[p] == 0: - atom.clash = 0 - break - - # if atom doesn't clash then residue information is kept in SA_res - if atom.clash == 0: - SA_res[atom.res_no,atom.chain,atom.res] = aa1_CA[atom.res_no,atom.chain,atom.res] - - # inform user on buried resiudes - if xl_list: - pass - elif sd_res == "LYS": - print("{} {} and 1 N-terminus of which {} are on the surface".format(len(aa1_CA)-1,string_dict[sd_res], len(SA_res))) - else: - print("{} {} of which {} are on the surface".format(len(aa1_CA),string_dict[sd_res], len(SA_res))) - - return SA_res - def update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_aa2): '''Removes buried residues from crosslink_pairs''' @@ -172,30 +30,30 @@ def update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_a for i in range(len(crosslink_pairs)): # for each residue pair, check both are solvent accessible - x1, x2 = crosslink_pairs[i] + xl_pair_1, xl_pair_2 = crosslink_pairs[i] - if x1 not in aa1_CA: + if xl_pair_1 not in aa1_CA: index_to_delete.append(i) - if x1 not in buried_residues: - buried_residues.append(x1) - if x2 not in aa2_CA and x2 not in buried_residues: - buried_residues.append(x2) - elif x2 not in aa2_CA: + if xl_pair_1 not in buried_residues: + buried_residues.append(xl_pair_1) + if xl_pair_2 not in aa2_CA and xl_pair_2 not in buried_residues: + buried_residues.append(xl_pair_2) + elif xl_pair_2 not in aa2_CA: index_to_delete.append(i) - if x2 not in buried_residues: - buried_residues.append(x2) + if xl_pair_2 not in buried_residues: + buried_residues.append(xl_pair_2) - if [x1[0],x1[1]] in remove_aa1: + if [xl_pair_1[0],xl_pair_1[1]] in remove_aa1: index_to_delete.append(i) - if x1 not in buried_residues: - buried_residues.append(x1) - if x2 in remove_aa2 and not x2 in buried_residues: - buried_residues.append(x2) + if xl_pair_1 not in buried_residues: + buried_residues.append(xl_pair_1) + if xl_pair_2 in remove_aa2 and not xl_pair_2 in buried_residues: + buried_residues.append(xl_pair_2) - elif [x2[0],x2[1]] in remove_aa2: + elif [xl_pair_2[0],xl_pair_2[1]] in remove_aa2: index_to_delete.append(i) - if x2 not in buried_residues: - buried_residues.append(x2) + if xl_pair_2 not in buried_residues: + buried_residues.append(xl_pair_2) no_sasd_possible = [] crosslink_pairs_final = [] @@ -212,78 +70,39 @@ def update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_a return crosslink_pairs_final -def check_solvent_accessibility_freesasa(prot,aa1_CA,freesasa_source = "freesasa", xl_list = False): - - # dictionary for text output - string_dict = {"LYS":"lysines", - "CYS":"cysteines", - "ASP":"aspartates", - "GLU":"glutamates", - "VAL":"valines", - "ILE":"isoleucines", - "LEU":"leucines", - "ARG":"arginines", - "PRO":"prolines", - "GLY":"glycines", - "ALA":"alanines", - "TRP":"tryptophans", - "PHE":"phenylalanines", - "SER":"serines", - "GLN":"glutamines", - "HIS":"histidines", - "MET":"methionines", - "THR":"threonines", - "ASN":"asparagines", - "TYR":"tyrosines" - } - - cmd = [freesasa_source,"--format=rsa","--output={}.rsa".format(prot[:-4]),"--radii=naccess",prot] - - ext_freesasa = subprocess.Popen(cmd, stdout = subprocess.PIPE, shell = True) - ext_freesasa.communicate() - - try: - test_open = open(prot[:-4]+".rsa") - test_open.close - except: - print("No .rsa file created. Please check you have Freesasa installed. Go to 'http://freesasa.github.io/' ") - exit(1) - - #try: - SA_res = {} - with open(prot[:-4]+".rsa") as rsa: - for line in rsa: - if line.startswith("RES"): - col = line.split() - RES = line[4:8].strip() - CHAIN = line[8:9].strip() - if len(CHAIN) == 0: - CHAIN = " " - NUM = line[9:13].strip() - REL = line[23:29].strip() - if float(REL) > 7.0: - - res = RES + CHAIN + NUM - SA_res[(int(NUM),CHAIN,RES)] = True - #except: - # print "error" - SA_res_dict = {} +def check_solvent_accessibility_freesasa(prot, aa_CA, xl_list, aa_dict, ncpus): - for s in aa1_CA: - if (s[0],s[1],s[2]) in SA_res: - SA_res_dict[(s[0],s[1],s[2])] = aa1_CA[(s[0],s[1],s[2])] - sd_res = s[2] + freesasa.Parameters().setNSlices(50) + freesasa.Parameters().setNThreads(ncpus) + + pt = os.path.dirname(os.path.realpath(__file__)) + classifier = freesasa.Classifier(os.path.join(pt,"naccess.config.txt")) + structure = freesasa.Structure(os.path.normpath(prot), classifier) + result = freesasa.calc(structure) + + solv_access_residue = {} + for chain, residue in result.residueAreas().items(): + for res_sasa_info in residue.values(): + if res_sasa_info.total > 7.0: # if total residue SASA is greater than 7.0 ... + solv_access_residue[(int(res_sasa_info.residueNumber), chain, res_sasa_info.residueType)] = True + + surface_solv_access_residue = {} + + for res_num, chain, res_name in aa_CA: + if (res_num, chain, res_name) in solv_access_residue: + surface_solv_access_residue[(res_num, chain, res_name)] = aa_CA[(res_num, chain, res_name)] + sd_res = res_name else: - print("Residue {}-{}-{} is buried".format(s[0],s[1],s[2])) - sd_res = s[2] + print("Residue {}-{}-{} is buried".format(res_num, chain, res_name)) + sd_res = res_name # inform user on buried resiudes - if xl_list: + if xl_list != "NULL": pass elif sd_res == "LYS": - print("{} {} and 1 N-terminus of which {} are on the surface".format(len(aa1_CA)-1,string_dict[sd_res], len(SA_res_dict))) + print("{} {} and 1 N-terminus of which {} are on the surface".format(len(aa_CA)-1, aa_dict[sd_res], len(surface_solv_access_residue))) else: - print("{} {} of which {} are on the surface".format(len(aa1_CA),string_dict[sd_res], len(SA_res_dict))) + print("{} {} of which {} are on the surface".format(len(aa_CA), aa_dict[sd_res], len(surface_solv_access_residue))) - return SA_res_dict + return surface_solv_access_residue \ No newline at end of file diff --git a/src/Jwalk/__init__.py b/src/Jwalk/__init__.py index dd5eeb4..d4ea5e7 100644 --- a/src/Jwalk/__init__.py +++ b/src/Jwalk/__init__.py @@ -1,12 +1,10 @@ -#=============================================================================== -# This file is part of Jwalk. +# =============================================================================== +# This file is part of Jwalk (Python 3). # # Jwalk - A tool to calculate the solvent accessible surface distance (SASD) # between crosslinked residues. # -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# +# Copyright 2016 Josh Bullock and Birkbeck College University of London. # # Jwalk is available under Public Licence. # This software is made available under GPL V3 @@ -18,4 +16,4 @@ # in modelling proteins with restraints from crosslinking mass spectrometry. # Molecular and Cellular Proteomics (15) pp.2491-2500 # -#=============================================================================== \ No newline at end of file +# =============================================================================== \ No newline at end of file diff --git a/src/Jwalk/jwalk b/src/Jwalk/jwalk index 41c45df..8936efe 100644 --- a/src/Jwalk/jwalk +++ b/src/Jwalk/jwalk @@ -1,14 +1,11 @@ #!/usr/bin/env python - # =============================================================================== -# This file is part of Jwalk. +# This file is part of Jwalk (Python 3). # # Jwalk - A tool to calculate the solvent accessible surface distance (SASD) # between crosslinked residues. # -# Copyright 2016 Jwalk Inventor and Birkbeck College University of London. -# The Jwalk Inventor is: Josh Bullock -# +# Copyright 2016 Josh Bullock and Birkbeck College University of London. # # Jwalk is available under Public Licence. # This software is made available under GPL V3 @@ -22,158 +19,172 @@ # # =============================================================================== -from Jwalk import PDBTools, GridTools, SurfaceTools, SASDTools +## IMPORTS +import os, sys, argparse, pathlib from multiprocessing import cpu_count -import os, sys, argparse - -# default parameters - -max_dist = 60 -vox = 1 -surface = False -xl_list = [] -aa1 = "LYS" -aa2 = "LYS" -ncpus = cpu_count() -pdb_list = [i for i in os.listdir('./') if i.endswith('.pdb')] - -amino_acids = {"LYS":"lysines", - "CYS":"cysteines", - "ASP":"acidic residues", - "GLU":"acidic residues", - "VAL":"valines", - "ILE":"isoleucines", - "LEU":"leucines", - "ARG":"arginines", - "PRO":"prolines", - "GLY":"glycines", - "ALA":"alanines", - "TRP":"tryptophans", - "PHE":"phenylalanines", - "SER":"serines", - "GLN":"glutamines", - "HIS":"histidines", - "MET":"methionines", - "THR":"threonines", - "ASN":"asparagines", - "TYR":"tyrosines"} - -parser = argparse.ArgumentParser(description='JWALK: Calculate SASDs on your target PDB files') - -parser.add_argument('-lys', action="store_true", - help='calculate lysine crosslinks (default)') -parser.add_argument('-xl_list', nargs=1, - help='calculate crosslinks from input list') -parser.add_argument('-i', nargs=1, - help='specify input pdb: -i ') -parser.add_argument('-aa1', nargs=1, - help='specify start amino acid (three letter code e.g. LYS)') -parser.add_argument('-aa2', nargs=1, - help='specify end amino acid (three letter code e.g. LYS)') -parser.add_argument('-max_dist', nargs=1, - help='specify maximum crosslink distance in Angstroms') -parser.add_argument('-vox', nargs=1, - help='specify voxel size of grid') -parser.add_argument('-surface', action="store_true", - help='use higher accuracy method to calculate solvent accessibility - requires Freesasa installation') -parser.add_argument('-ncpus', nargs=1, - help='specify number of cpus to use') +from Jwalk import PDBTools, GridTools, SurfaceTools, SASDTools -args = parser.parse_args() +## GLOBAL DEFAULTS +max_cpus = cpu_count() -if args.lys: - aa1 = "LYS" - aa2 = "LYS" +amino_acids = {"LYS":"lysines", "CYS":"cysteines", "ASP":"aspartates", "GLU":"glutamates", + "VAL":"valines", "ILE":"isoleucines", "LEU":"leucines", "ARG":"arginines", + "PRO":"prolines", "GLY":"glycines", "ALA":"alanines", "TRP":"tryptophans", + "PHE":"phenylalanines", "SER":"serines", "GLN":"glutamines", "HIS":"histidines", + "MET":"methionines", "THR":"threonines", "ASN":"asparagines", "TYR":"tyrosines"} -elif args.xl_list: - xl_list = args.xl_list[0] +## ARGPARSE +parser = argparse.ArgumentParser(description="JWALK: Calculate SASDs on your target PDB files") -elif args.aa1: - if args.aa2: - aa1 = args.aa1[0].upper() - aa2 = args.aa2[0].upper() - # catch any dodgy typing - if aa1 not in amino_acids or aa2 not in amino_acids: - print("ERROR: Please type amino acid in three letter code format") - sys.exit(2) - else: - print("Please specify both aa1 AND aa2 if you want to use this option") - sys.exit(2) +parser.add_argument("-f", type=pathlib.Path, default="NULL", + help="Input path to .pdb file") -if args.max_dist: - max_dist = int(args.max_dist[0]) +parser.add_argument("-o", type=pathlib.Path, default=os.getcwd(), + help="Output path for Jwalk results (default: Out to \"./Jwalk_results\" in the current working directory)") -if args.i: - pdb_list = [args.i[0]] - -if args.vox: - vox = int(args.vox[0]) +parser.add_argument("-xl_list", type=pathlib.Path, default="NULL", + help="OPTIONAL: Input path to crosslink list (default: Finds all Lys-to-Lys crosslinks)") + +parser.add_argument("-xl_dist_cutoff", type=float, default=sys.float_info.max, + help="OPTIONAL: Specify maximum crosslink distance cutoff in Angstroms (default: Keeps all distances)") + +parser.add_argument("-aa1", type=str, default="LYS", + help="OPTIONAL: Specify inital crosslink amino acid three letter code (default: LYS)") -if args.surface: - ACCESS_BIN = "freesasa" - surface = True +parser.add_argument("-aa2", type=str, default="LYS", + help="OPTIONAL: Specify ending crosslink amino acid three letter code (default: LYS)") -if args.ncpus: - ncpus = int(args.ncpus[0]) +parser.add_argument("-vox", type=int, default=1, + help="OPTIONAL: Specify voxel resolution to use in Angstrom (default: 1 Angstrom)") -####################################### +parser.add_argument("-ncpus", type=int, default=max_cpus, + help="OPTIONAL: Specify number of cpus to use (default: {})".format(max_cpus)) + +args = parser.parse_args() + +## ARGUMENT HANDLING +if __name__ == "__main__": + + # checking if pdb file supplied exists and is of type .pdb + with args.f as pdb_path: + if pdb_path.exists() and pdb_path.glob("*.pdb"): + pdb = pdb_path + pass + elif not pdb_path.exists(): + print("ERROR: The input file supplied cannot be found. Please enter a .pdb file type") + sys.exit(2) + elif not pdb_path.glob("*.pdb"): + print("ERROR: The input file supplied is not supported. Please enter a .pdb file type") + sys.exit(2) + else: + print("ERROR: The input file supplied is not supported. Please enter a .pdb file type") + sys.exit(2) -def runJwalk(max_dist, vox, surface, xl_list, aa1, aa2, ncpus, pdb_list): + # creating result output directory (defaulting to creating it in the working directory) + with args.o as jwalk_results: + if jwalk_results.exists() and jwalk_results.is_dir(): + jwalk_results_dir = jwalk_results + pass + else: + print("WARNING: {} not found. Creating directory {}".format(jwalk_results,jwalk_results)) + os.mkdir(jwalk_results) + jwalk_results_dir = jwalk_results + pass + + # checking if an xl_list was provided + with args.xl_list as output_path: + # if none is provided use the aa1 and aa2 inputs (default is LYS-LYS crosslinks) + if os.path.normpath(output_path) == "NULL": + aa1 = args.aa1.upper() + aa2 = args.aa2.upper() + xl_list = "NULL" + + if aa1 not in amino_acids or aa2 not in amino_acids: + print("ERROR: Please type amino acid in three letter code format") + print(amino_acids.keys()) + sys.exit(2) + else: + print("Calculating all {}-to-{} crosslinks".format(aa1,aa2)) + pass + # accepting xl_list + elif output_path.exists() and output_path.is_file(): + print("Calculating all crosslinks found in {}".format(output_path.name)) + aa1 = "NULL" + aa2 = "NULL" + xl_list = output_path + pass + + if args.xl_dist_cutoff > 0.0: + max_dist = args.xl_dist_cutoff + pass + else: + print("WARNING: Maximum crosslink distance cutoff was set to infinity") + max_dist = sys.float_info.max + + if args.vox > 0: + vox = args.vox + pass + else: + print("WARNING: Voxel resolution was set to 1 Angstrom") + vox = 1 + pass + + if args.ncpus > 1: + ncpus = args.ncpus + pass + else: + print("WARNING: Number of CPUs was set to 1") + ncpus = 1 + pass + +## FUNCTION DEF +def runJwalk(pdb, xl_list, aa1, aa2, max_dist, jwalk_results_dir, vox, ncpus): """ Execute Jwalk with processed command line options - - max_dist: maximum distance Jwalk will search - vox: angstoms per voxel in grid - surface: if True use higher resolution surface method - xl_list: list of specific crosslinks to calculate - aa1: starting residue type - aa2: ending residues type - ncpus: number of cpus to use - pdb_list: default is all pdbs in directory, unless otherwise stated - + + max_dist: maximum distance Jwalk will search + vox: angstoms per voxel in grid + surface: if True use higher resolution surface method + xl_list: list of specific crosslinks to calculate + aa1: starting residue type + aa2: ending residues type + ncpus: number of cpus to use """ - for pdb in pdb_list: + # load pdb into Jwalk + structure_instance = PDBTools.read_PDB_file(pdb) + # generate grid of voxel size (vox) that encapsulates pdb + grid = GridTools.makeGrid(structure_instance, vox) + + # mark C-alpha positions on grid + if xl_list != "NULL": # if specific crosslinks need to be calculated + crosslink_pairs, aa1_CA, aa2_CA = GridTools.mark_CAlphas_pairs(grid, structure_instance, xl_list) + else: + crosslink_pairs = [] # na if searching every combination between residue types + aa1_CA, aa2_CA = GridTools.mark_CAlphas(grid, structure_instance, aa1, aa2) - print("calculating crosslinks on {}".format(pdb)) - # load pdb into Jwalk - structure_instance = PDBTools.read_PDB_file(pdb) - # generate grid of voxel size (vox) that encapsulates pdb - grid = GridTools.makeGrid(structure_instance, vox) + # check more rigorously if residues are solvent accessible or not + aa1_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa1_CA, xl_list, amino_acids, ncpus) + aa2_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa2_CA, xl_list, amino_acids, ncpus) + + dens_map = GridTools.generate_solvent_accessible_surface(grid, structure_instance, aa1_CA, aa2_CA) + # identify which residues are on the surface + aa1_voxels, remove_aa1 = GridTools.find_surface_voxels(aa1_CA, dens_map, xl_list) + aa2_voxels, remove_aa2 = GridTools.find_surface_voxels(aa2_CA, dens_map, xl_list) - # mark C-alpha positions on grid - if xl_list: # if specific crosslinks need to be calculated - crosslink_pairs, aa1_CA, aa2_CA = GridTools.mark_CAlphas_pairs(grid, structure_instance, xl_list) - else: - crosslink_pairs = [] # na if searching every combination between residue types - aa1_CA, aa2_CA = GridTools.markCAlphas(grid, structure_instance, aa1, aa2) - - if surface == True: - # check more rigorously if residues are solvent accessible or not - aa1_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa1_CA, ACCESS_BIN, xl_list) - if aa1 != aa2 or xl_list: - aa2_CA = SurfaceTools.check_solvent_accessibility_freesasa(pdb, aa2_CA, ACCESS_BIN, xl_list) - else: - aa2_CA = aa1_CA.copy() - - dens_map = GridTools.generate_solvent_accessible_surface(grid, structure_instance, aa1_CA, aa2_CA) - # identify which residues are on the surface - aa1_voxels, remove_aa1 = GridTools.find_surface_voxels(aa1_CA, dens_map, surface, xl_list) - aa2_voxels, remove_aa2 = GridTools.find_surface_voxels(aa2_CA, dens_map, surface, xl_list) - - crosslink_pairs = SurfaceTools.update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_aa2) - - # calculate sasds - sasds = SASDTools.parallel_BFS(aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, crosslink_pairs, - max_dist, vox, ncpus, xl_list) + crosslink_pairs = SurfaceTools.update_crosslink_pairs(crosslink_pairs, aa1_CA, aa2_CA, remove_aa1, remove_aa2) - # remove duplicates - sasds = GridTools.remove_duplicates(sasds) - sasds = SASDTools.get_euclidean_distances(sasds, pdb, aa1, aa2) - - # output sasds to .pdb file and .txt file - PDBTools.write_sasd_to_txt(sasds, pdb) - PDBTools.write_sasd_to_pdb(dens_map, sasds, pdb) - print("{} SASDs calculated".format(len(sasds))) - + # calculate sasds + sasds = SASDTools.parallel_BFS(aa1_voxels, aa2_voxels, dens_map, aa1_CA, aa2_CA, crosslink_pairs, max_dist, vox, ncpus, xl_list) + + # remove duplicates + sasds = GridTools.remove_duplicates(sasds) + sasds = SASDTools.get_euclidean_distances(sasds, pdb, aa1, aa2) + + # output sasds to .pdb file and .txt file + PDBTools.write_sasd_to_txt(sasds, pdb,jwalk_results_dir) + PDBTools.write_sasd_to_pdb(dens_map, sasds, pdb, jwalk_results_dir) + print("{} SASDs calculated".format(len(sasds))) + +## MAIN if __name__ == "__main__": - runJwalk(max_dist, vox, surface, xl_list, aa1, aa2, ncpus, pdb_list) + runJwalk(pdb, xl_list, aa1, aa2, max_dist, jwalk_results_dir, vox, ncpus) diff --git a/src/Jwalk/naccess.config.txt b/src/Jwalk/naccess.config.txt new file mode 100644 index 0000000..a58c4bf --- /dev/null +++ b/src/Jwalk/naccess.config.txt @@ -0,0 +1,255 @@ +# Contributed by João Rodrigues + +name: NACCESS + +types: +C_ALI 1.87 apolar +C_CAR 1.76 apolar +C_NUC 1.80 apolar +N_AMN 1.50 polar +N_AMD 1.65 polar +N_NUC 1.60 polar +O 1.40 polar +S 1.85 apolar +SE 1.80 apolar +P 1.90 apolar + +atoms: +ANY C C_CAR +ANY O O +ANY CA C_ALI +ANY N N_AMD +ANY CB C_ALI +ANY OXT O +# nucleic acid +ANY P P +ANY OP1 O +ANY OP2 O +ANY OP3 O +ANY O5' O +ANY O4' O +ANY O3' O +ANY O2' O +ANY C5' C_NUC +ANY C4' C_NUC +ANY C3' C_NUC +ANY C2' C_NUC +ANY C1' C_NUC + +ALA CB C_ALI # included so that RSA values will be generated + +ARG CG C_ALI +ARG CD C_ALI +ARG NE N_AMD +ARG CZ C_CAR +ARG NH1 N_AMD +ARG NH2 N_AMD + +ASN CG C_CAR +ASN OD1 O +ASN ND2 N_AMD + +ASP CG C_CAR +ASP OD1 O +ASP OD2 O + +CYS SG S + +GLN CG C_ALI +GLN CD C_CAR +GLN OE1 O +GLN NE2 N_AMD + +GLU CG C_ALI +GLU CD C_CAR +GLU OE1 O +GLU OE2 O + +GLY CA C_ALI # included so that RSA values will be generated + +HIS CG C_CAR +HIS ND1 N_AMD +HIS CD2 C_CAR +HIS NE2 N_AMD +HIS CE1 C_CAR + +ILE CG1 C_ALI +ILE CG2 C_ALI +ILE CD1 C_ALI + +LEU CG C_ALI +LEU CD1 C_ALI +LEU CD2 C_ALI + +LYS CG C_ALI +LYS CD C_ALI +LYS CE C_ALI +LYS NZ N_AMN + +MET CG C_ALI +MET SD S +MET CE C_ALI + +PHE CG C_CAR +PHE CD1 C_CAR +PHE CD2 C_CAR +PHE CE1 C_CAR +PHE CE2 C_CAR +PHE CZ C_CAR + +PRO CG C_ALI +PRO CD C_ALI + +SEC SE SE + +MSE SE SE + +SER OG O + +THR OG1 O +THR CG2 C_ALI + +TRP CG C_CAR +TRP CD1 C_CAR +TRP CD2 C_CAR +TRP NE1 N_AMD +TRP CE2 C_CAR +TRP CE3 C_CAR +TRP CZ2 C_CAR +TRP CZ3 C_CAR +TRP CH2 C_CAR + +TYR CG C_CAR +TYR CD1 C_CAR +TYR CD2 C_CAR +TYR CE1 C_CAR +TYR CE2 C_CAR +TYR CZ C_CAR +TYR OH O + +VAL CG1 C_ALI +VAL CG2 C_ALI + +A N9 N_NUC +A C8 C_NUC +A N7 N_NUC +A C5 C_NUC +A C6 C_NUC +A N6 N_NUC +A N1 N_NUC +A C2 C_NUC +A N3 N_NUC +A C4 C_NUC + +C N1 N_NUC +C C2 C_NUC +C O2 O +C N3 N_NUC +C C4 C_NUC +C N4 N_NUC +C C5 C_NUC +C C6 C_NUC + +G N9 N_NUC +G C8 C_NUC +G N7 N_NUC +G C5 C_NUC +G C6 C_NUC +G O6 O +G N1 N_NUC +G C2 C_NUC +G N2 N_NUC +G N3 N_NUC +G C4 C_NUC + +I N9 N_NUC +I C8 C_NUC +I N7 N_NUC +I C5 C_NUC +I C6 C_NUC +I O6 O +I N1 N_NUC +I C2 C_NUC +I N3 N_NUC +I C4 C_NUC + +T N1 N_NUC +T C2 C_NUC +T O2 O +T N3 N_NUC +T C4 C_NUC +T O4 O +T C5 C_NUC +T C7 C_NUC +T C6 C_NUC + +U N1 N_NUC +U C2 C_NUC +U O2 O +U N3 N_NUC +U C4 C_NUC +U O4 O +U C5 C_NUC +U C6 C_NUC + +DA N9 N_NUC +DA C8 C_NUC +DA N7 N_NUC +DA C5 C_NUC +DA C6 C_NUC +DA N6 N_NUC +DA N1 N_NUC +DA C2 C_NUC +DA N3 N_NUC +DA C4 C_NUC + +DC N1 N_NUC +DC C2 C_NUC +DC O2 O +DC N3 N_NUC +DC C4 C_NUC +DC N4 N_NUC +DC C5 C_NUC +DC C6 C_NUC + +DG N9 N_NUC +DG C8 C_NUC +DG N7 N_NUC +DG C5 C_NUC +DG C6 C_NUC +DG O6 O +DG N1 N_NUC +DG C2 C_NUC +DG N2 N_NUC +DG N3 N_NUC +DG C4 C_NUC + +DI N9 N_NUC +DI C8 C_NUC +DI N7 N_NUC +DI C5 C_NUC +DI C6 C_NUC +DI O6 O +DI N1 N_NUC +DI C2 C_NUC +DI N3 N_NUC +DI C4 C_NUC + +DT N1 N_NUC +DT C2 C_NUC +DT O2 O +DT N3 N_NUC +DT C4 C_NUC +DT O4 O +DT C5 C_NUC +DT C7 C_NUC +DT C6 C_NUC + +DU N1 N_NUC +DU C2 C_NUC +DU O2 O +DU N3 N_NUC +DU C4 C_NUC +DU O4 O +DU C5 C_NUC +DU C6 C_NUC diff --git a/Examples/test.pdb b/test/1FGA.pdb similarity index 100% rename from Examples/test.pdb rename to test/1FGA.pdb diff --git a/Examples/xl_list.txt b/test/1FGA_xl_list.txt similarity index 100% rename from Examples/xl_list.txt rename to test/1FGA_xl_list.txt diff --git a/test/Jwalk_results/1FGA_crosslink_list.txt b/test/Jwalk_results/1FGA_crosslink_list.txt new file mode 100644 index 0000000..51cf8e2 --- /dev/null +++ b/test/Jwalk_results/1FGA_crosslink_list.txt @@ -0,0 +1,4 @@ +Index Model Atom1 Atom2 SASD Euclidean Distance +1 1FGA GLN-56-A-CA LEU-98-A-CA 18.18045049659986 15.926182248109557 +2 1FGA ARG-33-A-CA ALA-70-A-CA 24.850862793076264 9.752043785791779 +3 1FGA LYS-21-A-CA ARG-39-A-CA 40.924117938453364 18.883816642829384 diff --git a/test/Jwalk_results/1FGA_crosslinks.pdb b/test/Jwalk_results/1FGA_crosslinks.pdb new file mode 100644 index 0000000..1f45de0 --- /dev/null +++ b/test/Jwalk_results/1FGA_crosslinks.pdb @@ -0,0 +1,101 @@ +# MODEL 1 GLN56A-LEU98A +ATOM 1 AX AAX A 1 28.622 36.755 4.435 1.00 0.00 X +ATOM 2 AX AAX A 2 25.622 34.755 5.435 1.00 0.00 X +ATOM 3 AX AAX A 3 25.622 34.755 6.435 1.00 0.00 X +ATOM 4 AX AAX A 4 24.622 33.755 7.435 1.00 0.00 X +ATOM 5 AX AAX A 5 23.622 32.755 8.435 1.00 0.00 X +ATOM 6 AX AAX A 6 22.622 31.755 9.435 1.00 0.00 X +ATOM 7 AX AAX A 7 21.622 30.755 9.435 1.00 0.00 X +ATOM 8 AX AAX A 8 20.622 29.755 9.435 1.00 0.00 X +ATOM 9 AX AAX A 9 19.622 28.755 9.435 1.00 0.00 X +ATOM 10 AX AAX A 10 19.622 24.755 9.435 1.00 0.00 X +CONECT 1 2 +CONECT 2 3 +CONECT 3 4 +CONECT 4 5 +CONECT 5 6 +CONECT 6 7 +CONECT 7 8 +CONECT 8 9 +CONECT 9 10 +END +# MODEL 2 ARG33A-ALA70A +ATOM 1 BX ABX A 1 37.622 31.755 17.435 1.00 0.00 X +ATOM 2 BX ABX A 2 40.622 31.755 19.435 1.00 0.00 X +ATOM 3 BX ABX A 3 41.622 32.755 20.435 1.00 0.00 X +ATOM 4 BX ABX A 4 42.622 33.755 21.435 1.00 0.00 X +ATOM 5 BX ABX A 5 43.622 34.755 21.435 1.00 0.00 X +ATOM 6 BX ABX A 6 44.622 35.755 21.435 1.00 0.00 X +ATOM 7 BX ABX A 7 45.622 36.755 20.435 1.00 0.00 X +ATOM 8 BX ABX A 8 45.622 37.755 19.435 1.00 0.00 X +ATOM 9 BX ABX A 9 46.622 38.755 18.435 1.00 0.00 X +ATOM 10 BX ABX A 10 46.622 39.755 17.435 1.00 0.00 X +ATOM 11 BX ABX A 11 45.622 40.755 16.435 1.00 0.00 X +ATOM 12 BX ABX A 12 44.622 41.755 15.435 1.00 0.00 X +ATOM 13 BX ABX A 13 43.622 40.755 14.435 1.00 0.00 X +ATOM 14 BX ABX A 14 41.622 38.755 12.435 1.00 0.00 X +CONECT 1 2 +CONECT 2 3 +CONECT 3 4 +CONECT 4 5 +CONECT 5 6 +CONECT 6 7 +CONECT 7 8 +CONECT 8 9 +CONECT 9 10 +CONECT 10 11 +CONECT 11 12 +CONECT 12 13 +CONECT 13 14 +END +# MODEL 3 LYS21A-ARG39A +ATOM 1 CX ACX A 1 27.622 36.755 15.435 1.00 0.00 X +ATOM 2 CX ACX A 2 28.622 37.755 18.435 1.00 0.00 X +ATOM 3 CX ACX A 3 29.622 37.755 19.435 1.00 0.00 X +ATOM 4 CX ACX A 4 30.622 37.755 19.435 1.00 0.00 X +ATOM 5 CX ACX A 5 31.622 37.755 20.435 1.00 0.00 X +ATOM 6 CX ACX A 6 32.622 38.755 21.435 1.00 0.00 X +ATOM 7 CX ACX A 7 33.622 39.755 22.435 1.00 0.00 X +ATOM 8 CX ACX A 8 34.622 40.755 23.435 1.00 0.00 X +ATOM 9 CX ACX A 9 35.622 41.755 24.435 1.00 0.00 X +ATOM 10 CX ACX A 10 36.622 40.755 25.435 1.00 0.00 X +ATOM 11 CX ACX A 11 37.622 39.755 26.435 1.00 0.00 X +ATOM 12 CX ACX A 12 38.622 38.755 26.435 1.00 0.00 X +ATOM 13 CX ACX A 13 39.622 37.755 26.435 1.00 0.00 X +ATOM 14 CX ACX A 14 40.622 36.755 26.435 1.00 0.00 X +ATOM 15 CX ACX A 15 41.622 35.755 25.435 1.00 0.00 X +ATOM 16 CX ACX A 16 42.622 34.755 24.435 1.00 0.00 X +ATOM 17 CX ACX A 17 43.622 33.755 23.435 1.00 0.00 X +ATOM 18 CX ACX A 18 44.622 32.755 22.435 1.00 0.00 X +ATOM 19 CX ACX A 19 45.622 31.755 21.435 1.00 0.00 X +ATOM 20 CX ACX A 20 46.622 30.755 20.435 1.00 0.00 X +ATOM 21 CX ACX A 21 47.622 30.755 19.435 1.00 0.00 X +ATOM 22 CX ACX A 22 47.622 30.755 18.435 1.00 0.00 X +ATOM 23 CX ACX A 23 47.622 30.755 17.435 1.00 0.00 X +ATOM 24 CX ACX A 24 46.622 29.755 16.435 1.00 0.00 X +ATOM 25 CX ACX A 25 44.622 29.755 13.435 1.00 0.00 X +CONECT 1 2 +CONECT 2 3 +CONECT 3 4 +CONECT 4 5 +CONECT 5 6 +CONECT 6 7 +CONECT 7 8 +CONECT 8 9 +CONECT 9 10 +CONECT 10 11 +CONECT 11 12 +CONECT 12 13 +CONECT 13 14 +CONECT 14 15 +CONECT 15 16 +CONECT 16 17 +CONECT 17 18 +CONECT 18 19 +CONECT 19 20 +CONECT 20 21 +CONECT 21 22 +CONECT 22 23 +CONECT 23 24 +CONECT 24 25 +END