From: Jim Procter Date: Thu, 14 Jul 2016 13:58:58 +0000 (+0100) Subject: Merge branch 'develop' into releases/Release_2_9_1_Branch X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=d8b9b83f2739ee2c11670af890d2c63b8c1c2b7c;hp=9f667972fd0c13f2be9c3aff73c6f57ea4be6f49;p=jalview.git Merge branch 'develop' into releases/Release_2_9_1_Branch --- diff --git a/.classpath b/.classpath index cad9e2b..6583992 100644 --- a/.classpath +++ b/.classpath @@ -39,7 +39,6 @@ - @@ -69,5 +68,6 @@ + diff --git a/build.xml b/build.xml index 57cd9d2..a8b8928 100755 --- a/build.xml +++ b/build.xml @@ -27,7 +27,9 @@ - + + + @@ -88,6 +90,9 @@ + + + @@ -374,7 +379,7 @@ - @@ -382,7 +387,7 @@ - + diff --git a/doc/AddingGroovySupport.html b/doc/AddingGroovySupport.html index 63e7170..e3e453f 100644 --- a/doc/AddingGroovySupport.html +++ b/doc/AddingGroovySupport.html @@ -29,7 +29,7 @@ Groovy Support in Jalview

Here are some scripts to get you started:

  • Getting the title, alignment and first sequence from the current alignFrame
    -def alf = Jalview.getAlignframes();
    +def alf = Jalview.getAlignFrames();
     print alf[0].getTitle();
     def alignment = alf[0].viewport.alignment;
     def seq = alignment.getSequenceAt(0);
    diff --git a/doc/building.html b/doc/building.html
    index 3a39691..ecde4d8 100755
    --- a/doc/building.html
    +++ b/doc/building.html
    @@ -26,13 +26,12 @@
     

    You will need the following (hopefully):

      -
    • Java development kit (JDK1.6 is the recommended platform for developing with Jalview, although JDK1.7 seems to work too!).
    • -
    • Ant (we think 1.5.4 is quite sufficient to use the simple build -file supplied, and it seems to work with later versions e.g. 1.7).
    • +
    • Java development kit (JDK1.8 is now the recommended platform for developing with Jalview.
    • +
    • Ant (1.7 or later will be needed for some of the jarsigning tools).
    With any luck, after setting your paths and JAVA_HOME correctly, you just need to change to the Jalview directory and run ant (this works -from JBuilder and eclipse too, but NetBeans is a bit trickier). +from eclipse too, but NetBeans is a bit trickier).
        ant
     
    @@ -46,23 +45,24 @@ build target in ant to make the signed jar files in a directory called dist. But first you need to make your own key:

    Making your own key

    -

    The ant 'makefulldist' target assumes that a keystore exists in a -directory 'keys'. To make a key accessible using the default settings -in the build.xml file then make the keys directory and add the -jarsigner key with the following : -

    -
    -mkdir keys
    -keytool -genkey -keystore keys/.keystore -keypass alignmentisfun
    --storepass alignmentisfun -alias jalview
    - (you will have to answer some personal questions here)
    -ant makedist
    - (should eventually generate a Jalview.jnlp file
    -  in ./dist along with a set of signed jars using the jalview
    -  key)
    -
    - -

    +

    The ant 'makefulldist' target assumes that a keystore exists in + a directory 'keys'. To make a key accessible using the default + settings in the build.xml file then make the keys directory and add + the jarsigner key with the following :

    +
    mkdir keys
    +
    keytool -genkey -keystore keys/.keystore -keypass alignmentisfun
    +  -storepass alignmentisfun -sigalg SHA1withRSA -keyalg RSA -alias jalview
    + (you will have to answer some personal questions here) +
    ant makedist -DWebStartLocation="file://.pathtojalviewsource./dist" -Dapplication.codebase="*"
    +

    This should eventually generate a jalview.jnlp file in ./dist + along with a set of signed jars using the jalview key). In order to + test locally via webstart you'll now need to add 'file:/' to your + java webstart security exception list. Then:

    +
    javaws file://.pathtojalviewsource./dist/jalview.jnlp
    +

    Please remember to remove that entry afterwards, since it will leave + your system vulnerable to malicious code. +

    +

    Building the JalviewLite applet
    The JalviewLite applet is compiled using a subset of the packages in the src directory (specifically: MCView, and jalview.{datamodel, diff --git a/examples/appletDeployment.html b/examples/appletDeployment.html index a7653ed..7fcca00 100644 --- a/examples/appletDeployment.html +++ b/examples/appletDeployment.html @@ -18,30 +18,83 @@ --> -

    + -

    Notes on applet deployment

    - - -

    **NEW FEATURES** in Jalview 2.9

    +

    Notes on applet deployment

    + + + + + + + + + + + + + + + + + + + + + + +
    Required Dependency Downloads
    DependencyDescription
    JalviewApplet.jar Main Jalview Applet Jar
    JmolApplet-14.2.14_2015.06.11.jar Jmol Applet Jar
    java-json.jarRequired for BioJSON Generation
    json_simple-1.1.jarRequired for BioJSON Generation
    + +

    To run Jalview applet in your web page download the Jars listed above. The snippet below shows a minimal code for embedding Jalview applet into a web page. +

    
    +<applet code="jalview.bin.JalviewLite" width="756" height="560" archive="jalviewApplet.jar,JmolApplet-14.2.14_2015.06.11.jar,java-json.jar,json_simple-1.1.jar">
    +	<param name="permissions" value="sandbox" />
    +	<param name="file" value="plantfdx.fa" />
    +	<param name="features" value="plantfdx.features" />
    +	<param name="userDefinedColour" value="C=yellow; R,K,H=FF5555; D,E=5555FF" />
    +	<param name="showFullId" value="false" />
    +	<param name="embedded" value="true" />
    +	<param name="linkLabel_1" value="Uniprot" />
    +	<param name="linkUrl_1"	value="http://www.uniprot.org/uniprot/$SEQUENCE_ID$" />
    +	<param name="linkLabel_2" value="EMBL-EBI Search" />
    +	<param name="linkUrl_2"	value="http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$" />
    +	<param name="APPLICATION_URL" value="http://www.jalview.org/services/launchApp" />
    +</applet>
    +
    + + + + +
      +
    • View full list of supported applet parameters here.
    • +
    • Package all your data files into a single (or multiple) zip / + jar files. This is very useful to reduce download time of large data + files. The applet archive tag can take multiple entries separated by + commas, eg
      <applet code="jalview.bin.JalviewLite" archive="jalviewApplet.jar, mydata.zip">
      +            
      +
    • +
    • Use Jalview for input to a HTML form. For an example of how to + code this using Javascript, click here.
      +
    • +
    • Embed Jalview into the web page, without the "Start + Jalview" button by setting the embed parameter to true;
      + <param name="embedded" value="true"> +
    • +
    • For more examples, see the links to the left.
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Applet Release History
    ReleaseNew Features / required changes
    2.9
    (Latest)
    • Split Views for cDNA and Protein alignments
      Specify second alignment with 'file2' parameter, and set cDNA/Protein column scaling with scaleProteinAsCdna
    • @@ -54,9 +107,11 @@
      archive="jalviewApplet.jar,JmolApplet-14.2.14_2015.06.11.jar,java-json.jar,json_simple-1.1.jar"
    -

    -

    **NEW FEATURES** in Jalview 2.8

    -
      +
    2.8
    • Normalised sequence logo display
    • RNA secondary structure annotation row @@ -71,9 +126,11 @@ original Jalview structure viewer will still be available.
    • -
    -

    **NEW FEATURES** in Jalview 2.7

    -
      +
    2.7
    • Javascript callbacks capabilities
      • oninit parameter and methods for registering javascript handlers for selections, mouseovers and linking to Jmol applets on the page.
      • To use javascript callbacks, ensure the applet tag includes the 'mayscript' attribute - either as a parameter (<param name="mayscript" value="true"/;gt;) or as a bare attribute in the applet html tag).
    • @@ -86,13 +143,17 @@ the Jmol binary distribution available at the Jmol Sourceforge site, or download the Jmol applet from here
    • Minimum recommended version of Java runtime for the applet is now 1.5 (JalviewLite v2.6 without the Jmol viewer may work ok on earlier Java environments but compatibility can no-longer be guaranteed).
    • -
    -
    **NEW FEATURES** in Jalview 2.5

    -
      -
    • New parameters to control display of tree annotation, width of alignment columns, and to disable the jalview button and check for Jmol on startup.
    • -
    -
    **NEW FEATURES** in Jalview 2.4

    -
      +
    2.5
      +
    • New parameters to control display of tree annotation, width of alignment columns, and to disable the jalview button and check for Jmol on startup.
    +
    2.4
    • New applet API methods for feature display control, views, and obtaining current selection via javascript.
    • Group show and hide parameters: "showfeaturegroups" and @@ -104,9 +165,11 @@
    • "debug" parameter to control verbosity of the applet's console output.
    • "showbutton" parameter to disable launch button and open JalviewLite immediatly.
    • "nojmol" parameter to disable check for Jmol classes.
    • -

    - **NEW FEATURES** in Jalview 2.3

    -
      +
    2.3
    • Note that Parameter "PDBFile" now takes the PDB file followed by a space separated list of alignment sequence ids to associate the structure to. It is also possible to associate @@ -126,11 +189,12 @@
    • Note parameter "PDBSeq" is no longer required.
    • Jalview 2.3 was updated to work with Jmol 11. See the versions archive if you want to download the old Jmol applet.
    • -

       

      - -
    - **NEW FEATURES** in Jalview 2.1 -
      + +
    2.1
    • Jalview Applet can read and display JNet secondary structure annotation directly via the jnetfile parameter.
    • @@ -158,5 +222,9 @@ <param name="sequence2" value="FER1_PEA/14-29 TSFLRTQPMPMSVTTT">
      (All the usual Jalview File formats are valid, however each new line in an alignment file must be entered as a parameter) -
    +
    + + diff --git a/examples/appletParameters.html b/examples/appletParameters.html index 433f5a9..cc95ecb 100644 --- a/examples/appletParameters.html +++ b/examples/appletParameters.html @@ -28,7 +28,7 @@ which are described below. Once initialised, the applet can be interacted with via its Javascript API.

    Issues arising from tightening of Java Security default settings
    JalviewLite is provided as a signed applet with 'sandbox' permissions and wildcards that allow it to be run from any website. Unfortunately, earlier versions of Java may not be compatible with these settings.

    -

    For additional deployment notes, see below.

    +

    For additional deployment notes, see Applet Deployment.

    Applet Parameters


    The applet takes the following initialisation parameters.

    diff --git a/examples/applets.html b/examples/applets.html index 34118b8..1f65565 100644 --- a/examples/applets.html +++ b/examples/applets.html @@ -22,19 +22,14 @@
    -
    -
    -

    Quick Links to jars for example:
    jalviewApplet.jar and JmolApplet.jar -

    -
    -

    JalviewLite Button Examples

    -Try out JalviewLite by pressing one of the buttons below.
    - For more information on how to use the applet in your website, see the applet parameters and other documentation in the links to the left.

    +Try out JalviewLite by pressing one of the buttons below. + View the source for the examples below here (If the link doesn't work on your browser try going to this page and viewing the page source manually).
    + For more information on how to use the applet in your website, see the applet deployment,applet parameters, and other documentation in the links to the left.

     

    Ferredoxins, chloroplast precursor related UniRef50 diff --git a/examples/embedded.html b/examples/embedded.html index aa67325..0d5ddf3 100644 --- a/examples/embedded.html +++ b/examples/embedded.html @@ -23,9 +23,6 @@
    -
    -

    Quick Links to jars for example:
    jalviewApplet.jar and JmolApplet.jar -

    @@ -40,6 +37,7 @@
  • plantfdx.annotations - Jalview Alignment Annotations File
  • + View the source code for this example here (If the link doesn't work on your browser try going to this page and viewing the page source manually).

    diff --git a/examples/embeddedWJmol.html b/examples/embeddedWJmol.html index f629312..1ecff58 100644 --- a/examples/embeddedWJmol.html +++ b/examples/embeddedWJmol.html @@ -260,11 +260,7 @@ jmolInitialize("","JmolApplet-14.2.14_2015.06.11.jar"); modeltofiles+="1gaq.txt";
    -
    -
    -

    Quick Links to jars for example:
    jalviewApplet.jar and JmolApplet.jar -

    -
    +
    diff --git a/examples/exampleFeatures.txt b/examples/exampleFeatures.txt index dfadb50..c0098a9 100755 --- a/examples/exampleFeatures.txt +++ b/examples/exampleFeatures.txt @@ -1,5 +1,5 @@ ST-TURN-IIL blue|255,0,255|absolute|20.0|95.0|below|66.0 -GAMMA-TURN-CLASSIC red|0,255,255|20.0|95.0|below|66.0 +GAMMA-TURN-CLASSIC red|0,255,255|20.0|95.0|below|66.0 BETA-TURN-IR 9a6a94 BETA-TURN-IL d6a6ca BETA-BULGE 1dc451 @@ -26,73 +26,74 @@ BETA-TURN-IIL 8b5b50 ST-MOTIF ac25a1 STARTGROUP uniprot +Pfam family FER_CAPAA -1 0 0 Pfam Iron-sulfur (2Fe-2S) FER_CAPAA -1 39 39 METAL Iron-sulfur (2Fe-2S) FER_CAPAA -1 44 44 METAL Iron-sulfur (2Fe-2S) FER_CAPAA -1 47 47 METAL Iron-sulfur (2Fe-2S) FER_CAPAA -1 77 77 METAL -Fer2 Status: True Positive Pfam 8_8 FER_CAPAA -1 8 83 Pfam +Fer2 Status: True Positive Pfam 8_8 FER_CAPAA -1 8 83 Pfam Ferredoxin_fold Status: True Positive FER_CAPAA -1 3 93 Cath Iron-sulfur (2Fe-2S) FER_CAPAN -1 86 86 METAL Iron-sulfur (2Fe-2S) FER_CAPAN -1 91 91 METAL Iron-sulfur (2Fe-2S) FER_CAPAN -1 94 94 METAL Iron-sulfur (2Fe-2S) FER_CAPAN -1 124 124 METAL -Fer2 Status: True Positive Pfam 55_13 FER_CAPAN -1 55 130 Pfam +Fer2 Status: True Positive Pfam 55_13 FER_CAPAN -1 55 130 Pfam Ferredoxin_fold Status: True Positive FER_CAPAN -1 45 140 Cath Iron-sulfur (2Fe-2S) FER1_SOLLC -1 86 86 METAL Iron-sulfur (2Fe-2S) FER1_SOLLC -1 91 91 METAL Iron-sulfur (2Fe-2S) FER1_SOLLC -1 94 94 METAL Iron-sulfur (2Fe-2S) FER1_SOLLC -1 124 124 METAL -Fer2 Status: True Positive Pfam 55_13 FER1_SOLLC -1 55 130 Pfam +Fer2 Status: True Positive Pfam 55_13 FER1_SOLLC -1 55 130 Pfam Ferredoxin_fold Status: True Positive FER1_SOLLC -1 45 140 Cath -Fer2 Status: True Positive Pfam 55_13 Q93XJ9_SOLTU -1 55 130 Pfam +Fer2 Status: True Positive Pfam 55_13 Q93XJ9_SOLTU -1 55 130 Pfam Ferredoxin_fold Status: True Positive Q93XJ9_SOLTU -1 45 140 Cath Iron-sulfur (2Fe-2S) FER1_PEA -1 91 91 METAL Iron-sulfur (2Fe-2S) FER1_PEA -1 96 96 METAL Iron-sulfur (2Fe-2S) FER1_PEA -1 99 99 METAL Iron-sulfur (2Fe-2S) FER1_PEA -1 129 129 METAL -Fer2 Status: True Positive Pfam 60_13 FER1_PEA -1 60 135 Pfam +Fer2 Status: True Positive Pfam 60_13 FER1_PEA -1 60 135 Pfam Ferredoxin_fold Status: True Positive FER1_PEA -1 50 145 Cath -Fer2 Status: True Positive Pfam 63_13 Q7XA98_TRIPR -1 63 138 Pfam +Fer2 Status: True Positive Pfam 63_13 Q7XA98_TRIPR -1 63 138 Pfam Ferredoxin_fold Status: True Positive Q7XA98_TRIPR -1 53 148 Cath Iron-sulfur (2Fe-2S) FER1_MESCR -1 90 90 METAL Iron-sulfur (2Fe-2S) FER1_MESCR -1 95 95 METAL Iron-sulfur (2Fe-2S) FER1_MESCR -1 98 98 METAL Iron-sulfur (2Fe-2S) FER1_MESCR -1 128 128 METAL -Fer2 Status: True Positive Pfam 59_13 FER1_MESCR -1 59 134 Pfam +Fer2 Status: True Positive Pfam 59_13 FER1_MESCR -1 59 134 Pfam Ferredoxin_fold Status: True Positive FER1_MESCR -1 49 144 Cath Iron-sulfur (2Fe-2S) FER1_SPIOL -1 89 89 METAL Iron-sulfur (2Fe-2S) FER1_SPIOL -1 94 94 METAL Iron-sulfur (2Fe-2S) FER1_SPIOL -1 97 97 METAL Iron-sulfur (2Fe-2S) FER1_SPIOL -1 127 127 METAL -Fer2 Status: True Positive Pfam 58_13 FER1_SPIOL -1 58 133 Pfam +Fer2 Status: True Positive Pfam 58_13 FER1_SPIOL -1 58 133 Pfam Ferredoxin_fold Status: True Positive FER1_SPIOL -1 48 143 Cath Iron-sulfur (2Fe-2S) FER3_RAPSA -1 39 39 METAL Iron-sulfur (2Fe-2S) FER3_RAPSA -1 44 44 METAL Iron-sulfur (2Fe-2S) FER3_RAPSA -1 47 47 METAL Iron-sulfur (2Fe-2S) FER3_RAPSA -1 77 77 METAL -Fer2 Status: True Positive Pfam 8_8 FER3_RAPSA -1 8 83 Pfam +Fer2 Status: True Positive Pfam 8_8 FER3_RAPSA -1 8 83 Pfam Ferredoxin_fold Status: True Positive FER3_RAPSA -1 3 93 Cath Iron-sulfur (2Fe-2S) FER_BRANA -1 39 39 METAL Iron-sulfur (2Fe-2S) FER_BRANA -1 44 44 METAL Iron-sulfur (2Fe-2S) FER_BRANA -1 47 47 METAL Iron-sulfur (2Fe-2S) FER_BRANA -1 77 77 METAL -Fer2 Status: True Positive Pfam 8_8 FER_BRANA -1 8 83 Pfam +Fer2 Status: True Positive Pfam 8_8 FER_BRANA -1 8 83 Pfam Ferredoxin_fold Status: True Positive FER_BRANA -1 2 96 Cath Iron-sulfur (2Fe-2S) FER2_ARATH -1 91 91 METAL Iron-sulfur (2Fe-2S) FER2_ARATH -1 96 96 METAL Iron-sulfur (2Fe-2S) FER2_ARATH -1 99 99 METAL Iron-sulfur (2Fe-2S) FER2_ARATH -1 129 129 METAL -Fer2 Status: True Positive Pfam 60_13 FER2_ARATH -1 60 135 Pfam +Fer2 Status: True Positive Pfam 60_13 FER2_ARATH -1 60 135 Pfam Ferredoxin_fold Status: True Positive FER2_ARATH -1 50 145 Cath -Fer2 Status: True Positive Pfam 60_11 Q93Z60_ARATH -1 60 118 Pfam +Fer2 Status: True Positive Pfam 60_11 Q93Z60_ARATH -1 60 118 Pfam Ferredoxin_fold Status: True Positive Q93Z60_ARATH -1 52 118 Cath Iron-sulfur (2Fe-2S) FER1_MAIZE -1 91 91 METAL Iron-sulfur (2Fe-2S) FER1_MAIZE -1 96 96 METAL Iron-sulfur (2Fe-2S) FER1_MAIZE -1 99 99 METAL Iron-sulfur (2Fe-2S) FER1_MAIZE -1 129 129 METAL -Fer2 Status: True Positive Pfam 60_13 FER1_MAIZE -1 60 135 Pfam +Fer2 Status: True Positive Pfam 60_13 FER1_MAIZE -1 60 135 Pfam Ferredoxin_fold Status: True Positive FER1_MAIZE -1 50 145 Cath -Fer2 Status: True Positive Pfam 52_12 O80429_MAIZE -1 52 127 Pfam +Fer2 Status: True Positive Pfam 52_12 O80429_MAIZE -1 52 127 Pfam Ferredoxin_fold Status: True Positive O80429_MAIZE -1 42 137 Cath ENDGROUP uniprot diff --git a/examples/formComplete.html b/examples/formComplete.html index 91d94f8..9e89990 100644 --- a/examples/formComplete.html +++ b/examples/formComplete.html @@ -24,9 +24,7 @@
    -
    -

    Quick Links to jars for example:
    jalviewApplet.jar and JmolApplet.jar -

    +
    @@ -35,7 +33,7 @@

    Using the Javascript API to fill out forms using data from JalviewLite
    Click the Javascript buttons below to interact with the Applet instance on the page.

    -View the source in your browser to see how it has been done.
    + View the source here to see how it has been done (If the link doesn't work on your browser try going to this page and viewing the page source manually).
    View the full JalviewLite API documentation. diff --git a/examples/groovy/featureCounter.groovy b/examples/groovy/featureCounter.groovy index 08d038d..42d3187 100644 --- a/examples/groovy/featureCounter.groovy +++ b/examples/groovy/featureCounter.groovy @@ -5,6 +5,9 @@ import jalview.workers.AlignmentAnnotationFactory; * Example script that registers two alignment annotation calculators * - one that counts residues in a column with Pfam annotation * - one that counts only charged residues with Pfam annotation + * To try this, first load uniref50.fa from the examples folder, then load features + * from examples/exampleFeatures.txt, before running this script from the Groovy console. + * Modify this example as required to count by column any desired value that can be * derived from the residue and sequence features at each position of an alignment. */ @@ -49,7 +52,7 @@ def hasPfam = { features -> * - a closure (groovy function) that tests whether to include a residue * - a closure that tests whether to increment count based on sequence features */ -def getColumnCounter = { name, desc, residueTester, featureCounter -> +def getColumnCounter = { name, desc, acceptResidue, acceptFeatures -> [ getName: { name }, getDescription: { desc }, @@ -58,9 +61,9 @@ def getColumnCounter = { name, desc, residueTester, featureCounter -> count: { res, feats -> def c = 0 - if (residueTester.call(res)) + if (acceptResidue.call(res)) { - if (featureCounter.call(feats)) + if (acceptFeatures.call(feats)) { c++ } @@ -71,12 +74,12 @@ def getColumnCounter = { name, desc, residueTester, featureCounter -> } /* - * Define annotation that counts any residue with Pfam domain annotation + * Define an annotation that counts any residue with Pfam domain annotation */ def pfamAnnotation = getColumnCounter("Pfam", "Count of residues with Pfam domain annotation", {true}, hasPfam) /* - * Define annotation that counts charged residues with Pfam domain annotation + * Define an annotation that counts charged residues with Pfam domain annotation */ def chargedPfamAnnotation = getColumnCounter("Pfam charged", "Count of charged residues with Pfam domain annotation", isCharged, hasPfam) diff --git a/examples/groovy/printtitle.groovy b/examples/groovy/printtitle.groovy index 813df63..b3387ea 100644 --- a/examples/groovy/printtitle.groovy +++ b/examples/groovy/printtitle.groovy @@ -19,14 +19,17 @@ * The Jalview Authors are detailed in the 'AUTHORS' file. */ // do something groovy in jalview -print "Hello World.\n"; -def alf = Jalview.getAlignFrames(); +println "Hello World.\n" +println "First sequence is " + currentAlFrame.viewport.alignment.getSequenceAt(0).getDisplayId(true) + +def alf = Jalview.getAlignFrames() for (ala in alf) { // ala is an jalview.gui.AlignFrame object - print ala.getTitle()+"\n"; + println ala.getTitle() // get the parent jalview.datamodel.Alignment from the alignment viewport - def alignment = ala.viewport.alignment; + def alignment = ala.viewport.alignment // get the first sequence from the jalview.datamodel.Alignment object - def seq = alignment.getSequenceAt(0); + def seq = alignment.getSequenceAt(0) } +Jalview.quit() diff --git a/examples/javascriptLaunch.html b/examples/javascriptLaunch.html index e161ad6..35b1d81 100644 --- a/examples/javascriptLaunch.html +++ b/examples/javascriptLaunch.html @@ -21,12 +21,7 @@
    -
    -
    -

    Quick Links to jars for example:
    jalviewApplet.jar and JmolApplet.jar -

    -
    @@ -120,7 +115,7 @@ archive="jalviewApplet.jar,JmolApplet-14.2.14_2015.06.11.jar,java-json.jar,json_
    -

    Javascript Launch Button

    The button below demonstrates how JalviewLite can be launched via a javascript action.

    +

    Javascript Launch Button

    The button below demonstrates how JalviewLite can be launched via a javascript action. View the source here to see how it has been done (If the link doesn't work on your browser try going to this page and viewing the page source manually).

    diff --git a/examples/linkedapplets_ng.html b/examples/linkedapplets_ng.html index 0449c0b..5890515 100644 --- a/examples/linkedapplets_ng.html +++ b/examples/linkedapplets_ng.html @@ -22,9 +22,7 @@
    -
    -

    Quick Links to jars for example:
    jalviewApplet.jar and JmolApplet.jar -

    +
    @@ -36,7 +34,7 @@

    JalviewLite Linked Applets Demo

    The two applets below use JalviewLite's javascript API to exchange events about the currently selected region and mouse position in the alignment. -

    + View the source here to see how it has been done (If the link doesn't work on your browser try going to this page and viewing the page source manually).

    Description: Fer2 Status: True Positive Pfam 8_83 FER_CAPAA -1 8 83 Pfam +Description: Fer2 Status: True Positive Pfam 8_83 FER_CAPAA -1 8 83 Pfam Chloroplast FER_CAPAN -1 1 47 TRANSIT Iron-sulfur (2Fe-2S) FER_CAPAN -1 86 86 METAL Iron-sulfur (2Fe-2S) FER_CAPAN -1 91 91 METAL Iron-sulfur (2Fe-2S) FER_CAPAN -1 94 94 METAL Iron-sulfur (2Fe-2S) FER_CAPAN -1 124 124 METAL Phosphothreonine FER_CAPAN -1 136 136 MOD_RES -Description: Fer2 Status: True Positive Pfam 55_130 FER_CAPAN -1 55 130 Pfam +Description: Fer2 Status: True Positive Pfam 55_130 FER_CAPAN -1 55 130 Pfam Chloroplast FER1_SOLLC -1 1 47 TRANSIT Iron-sulfur (2Fe-2S) FER1_SOLLC -1 86 86 METAL Iron-sulfur (2Fe-2S) FER1_SOLLC -1 91 91 METAL Iron-sulfur (2Fe-2S) FER1_SOLLC -1 94 94 METAL Iron-sulfur (2Fe-2S) FER1_SOLLC -1 124 124 METAL -Description: Fer2 Status: True Positive Pfam 55_130 FER1_SOLLC -1 55 130 Pfam +Description: Fer2 Status: True Positive Pfam 55_130 FER1_SOLLC -1 55 130 Pfam Evidence: EI4 Q93XJ9_SOLTU -1 1 48 SIGNAL -Description: Fer2 Status: True Positive Pfam 55_130 Q93XJ9_SOLTU -1 55 130 Pfam +Description: Fer2 Status: True Positive Pfam 55_130 Q93XJ9_SOLTU -1 55 130 Pfam Chloroplast FER1_PEA -1 1 52 TRANSIT L -> I (in strain: cv. Onward) FER1_PEA -1 59 59 VARIANT I -> L (in strain: cv. Onward) FER1_PEA -1 85 85 VARIANT @@ -38,14 +38,14 @@ Iron-sulfur (2Fe-2S) FER1_PEA -1 96 96 METAL Iron-sulfur (2Fe-2S) FER1_PEA -1 99 99 METAL Iron-sulfur (2Fe-2S) FER1_PEA -1 129 129 METAL YPTS -> PPPA (in Ref. 2) FER1_PEA -1 132 135 CONFLICT -Description: Fer2 Status: True Positive Pfam 60_135 FER1_PEA -1 60 135 Pfam -Description: Fer2 Status: True Positive Pfam 63_138 Q7XA98_TRIPR -1 63 138 Pfam +Description: Fer2 Status: True Positive Pfam 60_135 FER1_PEA -1 60 135 Pfam +Description: Fer2 Status: True Positive Pfam 63_138 Q7XA98_TRIPR -1 63 138 Pfam Chloroplast FER1_MESCR -1 1 51 TRANSIT Iron-sulfur (2Fe-2S) FER1_MESCR -1 90 90 METAL Iron-sulfur (2Fe-2S) FER1_MESCR -1 95 95 METAL Iron-sulfur (2Fe-2S) FER1_MESCR -1 98 98 METAL Iron-sulfur (2Fe-2S) FER1_MESCR -1 128 128 METAL -Description: Fer2 Status: True Positive Pfam 59_134 FER1_MESCR -1 59 134 Pfam +Description: Fer2 Status: True Positive Pfam 59_134 FER1_MESCR -1 59 134 Pfam Chloroplast FER1_SPIOL -1 1 50 TRANSIT STRAND FER1_SPIOL -1 52 59 STRAND TURN FER1_SPIOL -1 60 61 TURN @@ -68,7 +68,7 @@ Iron-sulfur (2Fe-2S) FER1_SPIOL -1 127 127 METAL STRAND FER1_SPIOL -1 130 133 STRAND STRAND FER1_SPIOL -1 135 138 STRAND HELIX FER1_SPIOL -1 142 144 HELIX -Description: Fer2 Status: True Positive Pfam 58_133 FER1_SPIOL -1 58 133 Pfam +Description: Fer2 Status: True Positive Pfam 58_133 FER1_SPIOL -1 58 133 Pfam I -> V FER3_RAPSA -1 8 8 VARIANT Iron-sulfur (2Fe-2S) FER3_RAPSA -1 39 39 METAL Iron-sulfur (2Fe-2S) FER3_RAPSA -1 44 44 METAL @@ -77,25 +77,25 @@ S -> T FER3_RAPSA -1 55 55 VARIANT Iron-sulfur (2Fe-2S) FER3_RAPSA -1 77 77 METAL R -> K FER3_RAPSA -1 91 91 VARIANT M -> V FER3_RAPSA -1 95 95 VARIANT -Description: Fer2 Status: True Positive Pfam 8_83 FER3_RAPSA -1 8 83 Pfam +Description: Fer2 Status: True Positive Pfam 8_83 FER3_RAPSA -1 8 83 Pfam Chloroplast FER1_ARATH -1 1 52 TRANSIT Iron-sulfur (2Fe-2S) FER1_ARATH -1 91 91 METAL Iron-sulfur (2Fe-2S) FER1_ARATH -1 96 96 METAL Iron-sulfur (2Fe-2S) FER1_ARATH -1 99 99 METAL Iron-sulfur (2Fe-2S) FER1_ARATH -1 129 129 METAL -Description: Fer2 Status: True Positive Pfam 60_135 FER1_ARATH -1 60 135 Pfam +Description: Fer2 Status: True Positive Pfam 60_135 FER1_ARATH -1 60 135 Pfam Iron-sulfur (2Fe-2S) FER_BRANA -1 39 39 METAL Iron-sulfur (2Fe-2S) FER_BRANA -1 44 44 METAL Iron-sulfur (2Fe-2S) FER_BRANA -1 47 47 METAL Iron-sulfur (2Fe-2S) FER_BRANA -1 77 77 METAL -Description: Fer2 Status: True Positive Pfam 8_83 FER_BRANA -1 8 83 Pfam +Description: Fer2 Status: True Positive Pfam 8_83 FER_BRANA -1 8 83 Pfam Chloroplast FER2_ARATH -1 1 52 TRANSIT Iron-sulfur (2Fe-2S) FER2_ARATH -1 91 91 METAL Iron-sulfur (2Fe-2S) FER2_ARATH -1 96 96 METAL Iron-sulfur (2Fe-2S) FER2_ARATH -1 99 99 METAL Iron-sulfur (2Fe-2S) FER2_ARATH -1 129 129 METAL -Description: Fer2 Status: True Positive Pfam 60_135 FER2_ARATH -1 60 135 Pfam -Description: Fer2 Status: True Positive Pfam 60_118 Q93Z60_ARATH -1 60 118 Pfam +Description: Fer2 Status: True Positive Pfam 60_135 FER2_ARATH -1 60 135 Pfam +Description: Fer2 Status: True Positive Pfam 60_118 Q93Z60_ARATH -1 60 118 Pfam Chloroplast FER1_MAIZE -1 1 52 TRANSIT STRAND FER1_MAIZE -1 57 59 STRAND STRAND FER1_MAIZE -1 72 74 STRAND @@ -113,6 +113,6 @@ Iron-sulfur (2Fe-2S) FER1_MAIZE -1 129 129 METAL STRAND FER1_MAIZE -1 132 135 STRAND STRAND FER1_MAIZE -1 137 141 STRAND TURN FER1_MAIZE -1 142 142 TURN -Description: Fer2 Status: True Positive Pfam 60_135 FER1_MAIZE -1 60 135 Pfam -Description: Fer2 Status: True Positive Pfam 52_127 O80429_MAIZE -1 52 127 Pfam +Description: Fer2 Status: True Positive Pfam 60_135 FER1_MAIZE -1 60 135 Pfam +Description: Fer2 Status: True Positive Pfam 52_127 O80429_MAIZE -1 52 127 Pfam ENDGROUP uniprot diff --git a/examples/testdata/simpleGff3.gff b/examples/testdata/simpleGff3.gff index 34b64ee..614b440 100644 --- a/examples/testdata/simpleGff3.gff +++ b/examples/testdata/simpleGff3.gff @@ -24,4 +24,3 @@ seq1 exonerate:protein2genome:local similarity 9 11 3652 - . alignment_id 0 ; Qu ACTACGACACGACGACGACGACG >seq2 CDEQEATGTQDAQEQAQC - diff --git a/examples/testdata/test.html b/examples/testdata/test.html index 229596c..1e41232 100644 --- a/examples/testdata/test.html +++ b/examples/testdata/test.html @@ -26,4 +26,4 @@ subCatContainer.scroll( function() { subCatContainer.scrollTop($(this).scrollTop()); }); - \ No newline at end of file + diff --git a/help/html/calculations/consensus.html b/help/html/calculations/consensus.html index 0a0214e..c870887 100644 --- a/help/html/calculations/consensus.html +++ b/help/html/calculations/consensus.html @@ -55,6 +55,11 @@ Normalise Consensus Logo to scale all columns of the logo to the same height. +

    + Group Consensus
    + If sequence groups have been defined, then selecting option 'Group Consensus' in the Annotations menu will + result in Consensus being calculated for each group, as well as the alignment as a whole. +

    cDNA Consensus

    diff --git a/help/html/calculations/conservation.html b/help/html/calculations/conservation.html index df8b5ff..9cb8ce1 100755 --- a/help/html/calculations/conservation.html +++ b/help/html/calculations/conservation.html @@ -65,11 +65,16 @@ (e.g. !proline).

    - Colouring an alignment by conservation
    + Colouring an alignment by conservation
    Conservation scores can be used to colour an alignment. This is explained further in the help page for conservation colouring.

    +

    + Group conservation
    + If sequence groups have been defined, then selecting option 'Group Conservation' in the Annotations menu will + result in Conservation being calculated for each group, as well as the alignment as a whole. +

    diff --git a/help/html/features/annotation.html b/help/html/features/annotation.html index a645630..7e52c46 100755 --- a/help/html/features/annotation.html +++ b/help/html/features/annotation.html @@ -48,6 +48,25 @@ alignment window or loaded from the alignment's file menu. href="../webServices/proteinDisorder.html">disordered region prediction methods.

    +

    Sequence Group Annotation +

    +

    + If sequence groups are defined, Conservation + and Consensus annotation can be enabled + for each group from the Annotations menu, or can + be imported from a Jalview Annotations file. +

    +

    Sequence Selection from Annotation +

    +

    + Sequences associated with sequence (or sequence group) annotations can be selected by + double-clicking the annotation label with these key combinations: +

      +
    • double-click - Select associated sequences (replaces current selection)
    • +
    • shift double-click - add sequences to selection
    • +
    • Ctrl (Mac CMD) double-click - toggles inclusion of associated sequences in the current selection
    • +
    + Note this also works in combination with manual sequence selection in the alignment.

    Interactive Alignment Annotation

    Annotation rows are added using the Annotation Label diff --git a/help/html/features/annotationsFormat.html b/help/html/features/annotationsFormat.html index 545f0c1..744370b 100755 --- a/help/html/features/annotationsFormat.html +++ b/help/html/features/annotationsFormat.html @@ -110,7 +110,7 @@ followed by a description for the row, which is shown in a tooltip when the user mouses over the annotation row's label. Since Jalview 2.7, the description field may also contain HTML tags (in - the same way as a sequence feature's + the same way as a sequence feature's label), providing the text is enclosed in an <html/> tag.

      Please note: URL links embedded in HTML descriptions are diff --git a/help/html/features/bioJsonFormat.html b/help/html/features/bioJsonFormat.html index f8f87dc..cb7ccc0 100644 --- a/help/html/features/bioJsonFormat.html +++ b/help/html/features/bioJsonFormat.html @@ -20,7 +20,7 @@ * The Jalview Authors are detailed in the 'AUTHORS' file. --> -BioJSON in Jalviwe +BioJSON in Jalview

      diff --git a/help/html/features/featuresettings.html b/help/html/features/featuresettings.html index 9164afd..200fc8f 100755 --- a/help/html/features/featuresettings.html +++ b/help/html/features/featuresettings.html @@ -104,7 +104,7 @@ the bottom of the list is rendered below a feature higher up in the list.
      You can change the order of a feature by dragging it up and down the list with - the mouse. + the mouse (not applet)
      .

      The Optimise order button (currently only diff --git a/help/html/features/groovy.html b/help/html/features/groovy.html index 9aa341b..a2bc627 100644 --- a/help/html/features/groovy.html +++ b/help/html/features/groovy.html @@ -56,6 +56,9 @@

      + Executing a groovy script on a particular alignment
      + +

      Access to Jalview's functions from Groovy Scripts
      There is as yet no properly defined scripting interface to Jalview, but all the public methods of the jalview class hierarchy can be diff --git a/help/html/features/mmcif.html b/help/html/features/mmcif.html new file mode 100644 index 0000000..6df0fd4 --- /dev/null +++ b/help/html/features/mmcif.html @@ -0,0 +1,28 @@ + + + + +mmCIF File Format + + + mmCIF File Format +

      The mmCIF file format (macromolecular Crystallographic + Information) was developed under the auspices of the International Union of Crystallography (IUCr) to extend the Crystallographic Information + File (CIF) data representation used for describing small molecule + structures and associated diffraction experiments.

      + Merits of mmCIF file format +
        +
      • Large structures (containing >62 chains and/or 99999 ATOM + records) that cannot be fully represented in the PDB file format are + available in the PDB archive as single PDBx/mmCIF files.
      • +
      • PDBx/mmCIF file format provides richer data annotation
      • +
      • PDBx/mmCIF became the standard PDB archive format in 2014. + Since 2016 the PDB File Format is no longer being modified or + extended to support new content. +
      • +
      + + mmCIF file format support for importing 3D structure data from + flat file and EMBL-PDBe via mmCIF was added in Jalview 2.9.1 + + \ No newline at end of file diff --git a/help/html/features/seqmappings.html b/help/html/features/seqmappings.html index ac63c9e..60ac6ab 100644 --- a/help/html/features/seqmappings.html +++ b/help/html/features/seqmappings.html @@ -42,5 +42,7 @@ retrieved by the Sequence Fetcher, and allows sequence features to be mapped directly from Uniprot das sources to their coding region on EMBL sequence records. +

      +

      In Jalview 2.9.1 SIFTS Mapping was added as a better means for explicitly identifying the coordinates corresponding to a displayed sequence when viewing a PDB structure associated with a sequence

      diff --git a/help/html/features/sifts_mapping_output.png b/help/html/features/sifts_mapping_output.png new file mode 100644 index 0000000..3c28b81 Binary files /dev/null and b/help/html/features/sifts_mapping_output.png differ diff --git a/help/html/features/siftsmapping.html b/help/html/features/siftsmapping.html new file mode 100644 index 0000000..c344a20 --- /dev/null +++ b/help/html/features/siftsmapping.html @@ -0,0 +1,45 @@ + + + + +SIFTS Mapping + + + +

      SIFTS Mapping

      + +

      + SIFTS (Structure integration with function, taxonomy + and sequences) provides an up-to-date resource for residue-level + mapping between Uniprot and PDB entries. The information is updated and + released weekly simultaneously with the release of new PDB entries. + SIFTS Entries are published as XML files and made publicly available via an FTP + site hosted at the European Bioinformatics Institute. +

      + +

      + At the point of viewing a PDB structure, Jalview downloads a SIFTS file + for the target entry and uses it to accurately map the sequence residues with the + structure residue. Prior to SIFTS integration, Jalview uses Needleman and Wunsch + Alignment algorithm to map sequence residues to structure residues, and that may not + always result to a correct mapping since it is computational determined. +

      + +

      + The default method for 'Sequence ↔ Structure' mapping can be configured + in the Structure tab in the Tools → Preferences dialog box. When 'SIFTS' + is enabled as the default, all mappings between 'Sequence ↔ Structure' is + performed via SIFTS provided that there is a valid SIFTS entry for PDB structure. If no + valid SIFTS resource is available, then the 'Sequence ↔ Structure' mapping falls + back to Needleman and Wunsch Alignment algorithm. +

      + +

      To verify the mapping method used, you can view the mapping output via the structure viewer menu File → View mapping. A sample mapping output can be seen in the screenshot below. The highlighted position shows the method used.

      +

      + SIFTS mapping output +

      + +

      SIFTS Mapping integration was added in Jalview 2.9.1

      + + + \ No newline at end of file diff --git a/help/html/features/splitView.html b/help/html/features/splitView.html index ed5bef3..1c36abd 100644 --- a/help/html/features/splitView.html +++ b/help/html/features/splitView.html @@ -53,7 +53,7 @@
    • On selecting rows, columns or regions in one alignment, the corresponding selection is made in the other
    • Sequence ordering in one alignment (using the cursor, or "Calculate→Sort") is also applied to the other
    • Editing (gap insertion / deletion) in the protein alignment @@ -75,7 +75,7 @@ panels.
    • Panel heights are adjusted dragging the divider between them using the mouse
    • -
    • "View→New +
    • "View→New View / Expand Views / Gather Views" behave as for a normal alignment window, but always create new views as Split Frames
    diff --git a/help/html/features/uniprotqueryfields.html b/help/html/features/uniprotqueryfields.html new file mode 100644 index 0000000..376180a --- /dev/null +++ b/help/html/features/uniprotqueryfields.html @@ -0,0 +1,599 @@ + + + +UniProtKB query fields + + + +

    + UniProtKB query fields +

    +

    Supported query fields for searching specific data in UniProtKB (see also query syntax).

    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldExampleDescription
    accession + accession:P62988 + + Lists all entries with the primary or secondary + accession number P62988. +
    active + active:no + + Lists all obsolete entries. +
    annotation + + annotation:(type:non-positional) +
    + annotation:(type:positional) +
    + annotation:(type:mod_res "Pyrrolidone carboxylic acid" evidence:experimental) +
    +
    + Lists all entries with: +
      +
    • any general annotation (comments [CC])
    • +
    • any sequence annotation (features [FT])
    • +
    • at least one amino acid modified with a Pyrrolidone carboxylic acid group
    • +
    +
    author + + author:ashburner + + + Lists all entries with at least one reference co-authored by Michael Ashburner. +
    cdantigen + + cdantigen:CD233 + + + Lists all entries whose cluster of differentiation number is CD233. +
    citation + + citation:("intracellular structural proteins") +
    + citation:(author:ashburner journal:nature) + citation:9169874 +
    +
    + Lists all entries with a literature citation: +
      +
    • containing the phrase "intracellular structural proteins" in either title or abstract
    • +
    • co-authored by Michael Ashburner and published in Nature
    • +
    • with the PubMed identifier 9169874
    • +
    +
    cluster + + cluster:UniRef90_A5YMT3 + + + Lists all entries in the UniRef 90% identity cluster whose + representative sequence is UniProtKB entry A5YMT3. +
    count + + annotation:(type:transmem count:5)
    + annotation:(type:transmem count:[5 TO *])
    + annotation:(type:cofactor count:[3 TO *]) +
    +
    Lists all entries with: +
      +
    • exactly 5 transmembrane regions
    • +
    • 5 or more transmembrane regions
    • +
    • 3 or more Cofactor comments
    • +
    +
    created + + created:[20121001 TO *]
    + reviewed:yes AND created:[current TO *] +
    +
    + Lists all entries created since October 1st 2012.
    + Lists all new UniProtKB/Swiss-Prot entries in the last release. +
    database + + database:(type:pfam) +
    + database:(type:pdb 1aut) +
    +
    + Lists all entries with: +
      +
    • a cross-reference to the Pfam database
    • +
    • a cross-reference to the PDB database entry 1aut
    • +
    + +
    domain + + domain:VWFA + + + Lists all entries with a Von Willebrand factor type A domain described + in the 'Family and Domains' section. +
    ec + + ec:3.2.1.23 + + + Lists all beta-galactosidases. +
    evidence + + annotation:(type:signal evidence:ECO_0000269)
    + (type:mod_res phosphoserine evidence:ECO_0000269)
    + annotation:(type:function AND evidence:ECO_0000255) +
    +
    Lists all entries with: +
      +
    • a signal sequence whose positions have been experimentally proven
    • +
    • experimentally proven phosphoserine sites
    • +
    • a function manually asserted according to rules
    • +
    +
    family + + family:serpin + + + Lists all entries belonging to the Serpin family of proteins. +
    fragment + + fragment:yes + + + Lists all entries with an incomplete sequence. +
    gene + + gene:HSPC233 + + + Lists all entries for proteins encoded by gene HSPC233. +
    go + + go:cytoskeleton +
    + go:0015629 +
    +
    + Lists all entries associated with: +
      +
    • a GO term containing the word "cytoskeleton"
    • +
    • the GO term Actin cytoskeleton and any subclasses
    • +
    +
    host + + host:mouse +
    + host:10090 +
    + host:40674 +
    +
    + Lists all entries for viruses infecting: +
      +
    • organisms with a name containing the word "mouse"
    • +
    • Mus musculus (Mouse)
    • +
    • all mammals (all taxa classified under the taxonomy node for Mammalia)
    • +
    +
    id + id:P00750 + + Returns the entry with the primary + accession number P00750. +
    inn + + inn:Anakinra + + + Lists all entries whose "International Nonproprietary Name" is Anakinra. +
    interactor + + interactor:P00520 + + + Lists all entries describing interactions with the protein described by + entry P00520. +
    keyword + + keyword:toxin + + + Lists all entries associated with the keyword Toxin. +
    length + + length:[500 TO 700] + + + Lists all entries describing sequences of length between 500 and 700 residues. +
    lineage + + This field is a synonym for the field taxonomy. +
    mass + + mass:[500000 TO *] + + + Lists all entries describing sequences with a mass of at least 500,000 Da. +
    method + + method:maldi +
    + method:xray +
    +
    + Lists all entries for proteins identified by: matrix-assisted laser + desorption/ionization (MALDI), crystallography (X-Ray). The + method field searches names of physico-chemical + identification methods in the 'Biophysicochemical properties' subsection of the 'Function' section, the 'Publications' and + 'Cross-references' sections. +
    mnemonic + + mnemonic:ATP6_HUMAN + + + Lists all entries with entry name (ID) ATP6_HUMAN. Searches also + obsolete entry names. +
    modified + + modified:[20120101 TO 20120301]
    + reviewed:yes AND modified:[current TO *] +
    +
    + Lists all entries that were last modified between January and March 2012.
    + Lists all UniProtKB/Swiss-Prot entries modified in the last release. +
    name + + name:"prion protein" + + + Lists all entries for prion proteins. +
    organelle + + organelle:Mitochondrion + + + Lists all entries for proteins encoded by a gene of the mitochondrial + chromosome. +
    organism + + organism:"Ovis aries" +
    + organism:9940 +
    + organism:sheep +
    +
    +
    + Lists all entries for proteins expressed in sheep (first 2 examples) and + organisms whose name contains the term "sheep". +
    plasmid + + plasmid:ColE1 + + + Lists all entries for proteins encoded by a gene of plasmid ColE1. +
    proteome + + proteome:UP000005640 + + + Lists all entries from the human proteome. +
    proteomecomponent + + proteomecomponent:"chromosome 1" and organism:9606 + + + Lists all entries from the human chromosome 1. +
    replaces + + replaces:P02023 + + + Lists all entries that were created from a merge with entry P02023. +
    reviewed + + reviewed:yes + + + Lists all UniProtKB/Swiss-Prot entries. +
    scope + + scope:mutagenesis + + + Lists all entries containing a reference that was used to gather + information about mutagenesis. +
    sequence + + sequence:P05067-9 + + + Lists all entries containing a link to isoform 9 of the sequence + described in entry P05067. Allows searching by specific sequence + identifier. +
    sequence_modified + + sequence_modified:[20120101 TO 20120301]
    + reviewed:yes AND sequence_modified:[current TO *] +
    +
    + Lists all entries whose sequences were last modified between January and March 2012.
    + Lists all UniProtKB/Swiss-Prot entries whose sequences were modified in the last release. +
    source + + source:intact + + + Lists all entries containing a GO term whose annotation source is the + IntAct database. +
    strain + + strain:wistar + + + Lists all entries containing a reference relevant to strain wistar. +
    taxonomy + + taxonomy:40674 + + + Lists all entries for proteins expressed in Mammals. This field is used to retrieve + entries for all organisms classified below a given taxonomic node taxonomy classification). +
    tissue + + tissue:liver + + + Lists all entries containing a reference describing the protein sequence + obtained from a clone isolated from liver. +
    web + + web:wikipedia + + + Lists all entries for proteins that are described in Wikipedia. +
    + + + \ No newline at end of file diff --git a/help/html/features/uniprotseqfetcher.png b/help/html/features/uniprotseqfetcher.png new file mode 100644 index 0000000..a592e8e Binary files /dev/null and b/help/html/features/uniprotseqfetcher.png differ diff --git a/help/html/features/uniprotsequencefetcher.html b/help/html/features/uniprotsequencefetcher.html new file mode 100644 index 0000000..9b2e3fa --- /dev/null +++ b/help/html/features/uniprotsequencefetcher.html @@ -0,0 +1,161 @@ + + + +The Uniprot Free Text Search Interface + + + + The Uniprot Free Text Search Interface +

    + Jalview provides a specialised interface that allows fast and + efficient discovery and retrieval of data from the Uniprot database. + It allows + interactive querying of Uniprot metadata with free text and structured + queries, so sequences can be located without prior knowledge of + their database accessions, or via manual cross-referencing + from Uniprot or other bioinformatics websites. +

    +

    + To open the UniProt Sequence Fetcher, select UniProt as the database from + any Sequence Fetcher dialog (opened via + "File →Fetch Sequences"). +

    +

    + Uniprot sequence fetcher (introduced in Jalview 2.9.1) +

    + +

    + Searching the Uniprot Database +

    +

    + To search the Uniprot, begin typing in the text box. The results of your + query are shown in the search results tab, which queries Uniprot after 1.5secs every time + you type in the search text box. You can sort results according to + the displayed columns, and select entries with the mouse or + keyboard. Once you have selected one or more entries, hit the OK + button to retrieve and visualise the sequences in Jalview Alignment interface. +

    +
      +
    • Searching a specific Uniprot field If you + want to find sequences based on a specific Uniprot metadata field, + you can select it from the drop-down menu.
    • + + +
    • Bulk Uniprot retrieval
      + Firstly, switch the search target to Uniprot Id, then enter multiple IDs by separating them with a semi-colon. + e.g. fila_human; mnt_human; mnt_mouse.
      Hitting Return or OK will automatically + fetch those IDs, like the default Sequence Fetcher interface.
    • + +
    • Advanced / Custom querying + The table below provides a brief overview of the supported Uniprot query syntax (see query fields for UniProtKB): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      human antigenAll entries containing both terms.
      human AND antigen
      human && antigen
      "human antigen"All entries containing both terms in the exact order.
      human -antigenAll entries containing the term human + but not antigen. +
      human NOT antigen
      human ! antigen
      human OR mouseAll entries containing either term.
      human || mouse
      antigen AND (human OR mouse)Using parentheses to override boolean precedence rules.
      anti*All entries containing terms starting with anti. + Asterisks can also be used at the beginning and within terms. Note: + Terms starting with an asterisk or a single letter followed by an + asterisk can slow down queries considerably. +
      author:Tiger*Citations that have an author whose name starts with Tiger. + To search in a specific field of a dataset, you must prefix your + search term with the field name and a colon. To discover what + fields can be queried explicitly, observe the query hints that are + shown after submitting a query or use the query builder (see + below). +
      length:[100 TO *]All entries with a sequence of at least 100 amino acids.
      citation:(author:Arai author:Chung)All entries with a publication that was coauthored by two + specific authors.
      +
    • +
    +

    + Result pagination +

    + The query results returned from the Uniprot server are paginated for performance optimisation. + The button labelled ' << ' and ' >> ' can be used to navigate to the next or previous result page respectively. + The page range is shown on the title bar of the Free Text Search interface. Jalview's pagination implementation supports multiple selection of entries across multiple pages. + + +

    + Customising The Uniprot Sequence Fetcher +

    +

    + To change the displayed meta-data in the search result, click the + 'Customise Displayed Options' tab, and select the fields you'd like + to displayed or remove. +

    +

    + The Uniprot Free Test Search Interface was introduced in + Jalview 2.9.1 +

    + + \ No newline at end of file diff --git a/help/html/features/viewingpdbs.html b/help/html/features/viewingpdbs.html index 4d35516..d4819f1 100755 --- a/help/html/features/viewingpdbs.html +++ b/help/html/features/viewingpdbs.html @@ -121,6 +121,19 @@

    + Importing PDB Entries or files in mmCIF format
    + mmCIF file format provides an alternative means for + importing 3D structure data from flat file and EMBL-PDBe + web-service. To enable mmCIF as the default format for + importing PBD sequences from the PDB sequence fetcher, add or modify the + property + DEFAULT_STRUCTURE_FORMAT=mmCIF in Jalview properties file. + Once this is done, the steps followed in retrieving PDB format files above can + be followed to obtain the same data with mmCIF. mmCIF format file support was added in Jalview 2.9.1.

    + + + +

    Associating a large number of PDB files to sequences in an alignment
    It is often the case when working with structure alignments that you will have a directory of PDB diff --git a/help/html/keys.html b/help/html/keys.html index a477457..f129551 100755 --- a/help/html/keys.html +++ b/help/html/keys.html @@ -159,7 +159,7 @@ Both Cuts the (fully) selected sequences from the alignment. +columns are selected, you should use the Hide Regions feature instead.--> diff --git a/help/html/menus/desktopMenu.html b/help/html/menus/desktopMenu.html index 15c94ce..edbd1e9 100755 --- a/help/html/menus/desktopMenu.html +++ b/help/html/menus/desktopMenu.html @@ -82,8 +82,7 @@ Jalview News dialog box.

  • -
  • Groovy Console... (only - available if groovy is on the classpath)
    Opens +
  • Groovy Console...
    Opens the Groovy Console for interactive scripting.
  • diff --git a/help/html/menus/popupMenu.html b/help/html/menus/popupMenu.html index 1eb2366..353fb41 100755 --- a/help/html/menus/popupMenu.html +++ b/help/html/menus/popupMenu.html @@ -144,9 +144,8 @@ and sequence description to be entered. Press OK to accept your edit. To save sequence descriptions, you must save in Fasta, PIR or Jalview File format. -
  • Add - Reference Annotations
    -
    When enabled, copies any available alignment +
  • Add Reference Annotations
    + When enabled, copies any available alignment annotation for this sequence to the current view.
  • Set as Reference or Unmark as Reference
    Sets or unsets the reference sequence for diff --git a/help/html/releases.html b/help/html/releases.html index 0bb5fb7..dfb747f 100755 --- a/help/html/releases.html +++ b/help/html/releases.html @@ -47,32 +47,57 @@
    - 2.9.1
    1/6/2016
    + 2.9.1
    21/6/2016
    General
      -
    • +
    • +
    • Alignment ruler shows positions relative to reference sequence
    Application
      -
    • +
    • +
    • Support for reverse-complement coding regions in ENA and EMBL
    • +
    • Upgrade to EMBL XML 1.2 for ENA record retrieval
    • +
    • New 'execute Groovy script' option in an alignment window's Calculate menu
    • +
    • Allow groovy scripts that call Jalview.getAlignFrames() to run in headless mode
    • +
    • Store/restore reference sequence in Jalview projects
    • +
    Applet
      -
    • +
    General
      -
    • +
    • reinstate CTRL-click for opening pop-up menu on OSX
    • +
    • Export features in Jalview format (again) includes graduated colourschemes
    • +
    • More responsive when working with big alignments and lots of hidden columns
    • +
    • hidden column markers not always rendered at right of alignment window
    • +
    • Tidied up links in help file table of contents
    • +
    • Feature based tree calculation not shown for DNA alignments
    • +
    • Hidden columns ignored during feature based tree calculation
    • +
    • Alignment view stops updating when show unconserved enabled for group on alignment
    • +
    • Cannot insert gaps into sequence when set as reference
    • +
    Application
      -
    • +
    • +
    • Corrupt preferences for SVG, EPS & HTML output when running on non-gb/us i18n platforms
    • +
    • URLs and links can imported by drag'n'drop on OSX webstart
    • +
    • InstallAnywhere distribution fails when launching Chimera
    • +
    • Jalview very slow to launch via webstart (also hotfix for 2.9.0b2)
    • +
    • Cannot save project when view has a reference sequence defined
    • +
    • Columns are suddenly selected in other alignments and views when revealing hidden columns
    • +
    • Hide columns not mirrored in complement view in a cDNA/Protein splitframe
    • +
    • Cannot save/restore representative sequence from project when only one sequence is represented
    • +
    Applet
      -
    • +
    @@ -1392,10 +1417,7 @@ between different screens.
  • New preference items for sequence ID tooltip and consensus annotation
  • -
  • Client to submit sequences and IDs to Envision2 - Workflows -
  • +
  • Client to submit sequences and IDs to Envision2 Workflows
  • Vamsas Capabilities
    • Improved VAMSAS synchronization (Jalview archive diff --git a/help/html/webServices/AACon.html b/help/html/webServices/AACon.html index 5dd4472..6d4a461 100644 --- a/help/html/webServices/AACon.html +++ b/help/html/webServices/AACon.html @@ -32,7 +32,7 @@ Function, and Genetics 43(2): 227-241. PubMed or available on the Valdar Group publications page), but the SMERFs score was developed later and described by Manning et al. in 2008 (REST web services exposing sequence alignment, analysis, and secondary structure prediction programs. Originally, Jalview 2's services were maintained by the Barton group at the University of - Dundee, and ran programs on the Life Sciences High-performace + Dundee, and ran programs on the Life Sciences High-performance Computing Cluster. With the advent of JABAWS, however, it is possible for anyone to host Jalview web diff --git a/help/html/webServices/msaclient.html b/help/html/webServices/msaclient.html index b685576..6266036 100644 --- a/help/html/webServices/msaclient.html +++ b/help/html/webServices/msaclient.html @@ -39,13 +39,13 @@ from the input
    • realignment - where any aligned sequences will be used by the service to construct a profile based alignment of the - remaining unaligned sequences.
    • + remaining unaligned sequences
    JABAWS Alignment services
    Most alignment services are provided by the JABAWS framework, which allows you to customise the precise parameters used when running each alignment - prgoram. In addition to the 'Default settings', you may choose from a + program. In addition to the 'Default settings', you may choose from a range of alignment preset settings, or create your own using the 'Edit Settings And Run ..' dialog box. @@ -58,7 +58,7 @@
    • Clustal Omega and Clustal W (version 2.0.12)
    • -
    • Mafft +
    • Mafft (version 6.8.57b)
    • Muscle (version 3.8.31)
    • diff --git a/help/html/webServices/urllinks.html b/help/html/webServices/urllinks.html index de0f8cd..7a23d58 100644 --- a/help/html/webServices/urllinks.html +++ b/help/html/webServices/urllinks.html @@ -83,7 +83,7 @@ Please Note:
      • The regular expressions supported by Jalview are those - provided by the Stevesoft + provided by the Stevesoft javaregex package.
      • Some characters must be escaped when specifying them as diff --git a/help/html/whatsNew.html b/help/html/whatsNew.html index 19be76f..d7a93c6 100755 --- a/help/html/whatsNew.html +++ b/help/html/whatsNew.html @@ -27,61 +27,12 @@ What's new ?

        - Jalview 2.9.0b2 is a bug fix release for Jalview 2.9. - The release of Jalview 2.9 in September 2015 included - a multitude of bug fixes and minor improvements (both small, and - rather big!), it also brings major new capabilities for codon-level - analysis of protein alignments and the retrieval and manipulation of - structural data.

        For the patches since version 2.9 was released, see the - Jalview 2.9.0b2 Release Notes. + Jalview 2.9.1 is the next major release in the Jalview 2.9 series. Full details are in the + Jalview 2.9.1 Release Notes.

        - Highlights in Jalview 2.9 + Highlights in Jalview 2.9.1

          -
        • Visualisation, editing and analysis of - cDNA and Protein alignments
          A new Split View window allows linked - protein and nucleotide sequence alignments to be viewed, edited, - and analysed as one.
          cDNA alignments can also be - reconstructed from protein alignments calculated by Jalview's web - services, and update in response to edits in the amino acid view.
          To - start experimenting with cDNA/Protein analysis, jut drop a file - containing cDNA sequences which code for proteins in an existing - alignment, and Jalview will do the rest.
        • -
        • Enhanced Integration of UCSF Chimera
          Jalview - 2.9 provides full support for the use of Chimera to view 3D - structures linked to alignment views in the Jalview Desktop. We've - also included support for saving Chimera sessions in Jalview - project files.
          Jalview and Chimera communicate using local - web server connections, which may cause firewall alerts on some - systems, but has the advantage of allowing bidirectional - communication. Communication between Jalview and Chimera is now - much more responsive, and selected regions in Chimera are now - shown as highlighted regions in the Jalview desktop.
        • -
        • Interactive querying of the PDBe
          Jalview - users can now browse and retrieve 3D structure data from the PDB - via the PDBe - Search API (Gutmanas - et al 2014). Developed in collaboration with the PDBe group at - EMBL-EBI, the interface allows both structured and free-text - queries to be performed, and allows automatic selection of the - most relevant structures for an alignment acording to a variety of - criteria.
        • -
        • Improved support for RNA visualisation
          Jalview - 2.9 integrates the latest version of the VARNA RNA Viewer, and VARNA views - can also now be stored in Jalview projects. We've also dealt with - a number of lingering bugs in the VARNA/Jalview interface, - including the loss of pseudoknots when RNA secondary structure is - shown VARNA.
        • -
        • Protein Secondary Structure predictions - with JPred4
          Jalview includes a number of new features for - working with secondary structure predictions from the JPred4 - server. These include new popup menu actions to automatically hide insertions and highlight - mutations in an alignment with respect to a Reference - Sequence. Jalview 2.9's new scrollable - SVG HTML export was also developed specifically for the JPred4 - server.
        diff --git a/lib/Jmol-14.2.14_2015.06.11.jar b/lib/Jmol-14.2.14_2015.06.11.jar index f77f5f0..1470745 100644 Binary files a/lib/Jmol-14.2.14_2015.06.11.jar and b/lib/Jmol-14.2.14_2015.06.11.jar differ diff --git a/lib/VARNAv3-93.jar b/lib/VARNAv3-93.jar index b73b58d..9d41f6b 100644 Binary files a/lib/VARNAv3-93.jar and b/lib/VARNAv3-93.jar differ diff --git a/lib/groovy-all-1.8.2.jar b/lib/groovy-all-1.8.2.jar deleted file mode 100755 index 85af249..0000000 Binary files a/lib/groovy-all-1.8.2.jar and /dev/null differ diff --git a/lib/groovy-all-2.4.6-indy.jar b/lib/groovy-all-2.4.6-indy.jar new file mode 100644 index 0000000..5f3d51c Binary files /dev/null and b/lib/groovy-all-2.4.6-indy.jar differ diff --git a/lib/xercesImpl.jar b/lib/xercesImpl.jar old mode 100755 new mode 100644 diff --git a/resources/embl_mapping.xml b/resources/embl_mapping.xml index ccbde5e..01b921a 100644 --- a/resources/embl_mapping.xml +++ b/resources/embl_mapping.xml @@ -22,35 +22,61 @@ - + - - + - - - + + + - - + + + + + + + + + + + + + + + + + + + + - - + + - - + + - + + + + @@ -60,19 +86,13 @@ - + - - - - - - @@ -81,25 +101,25 @@ + + + - + - - - - + - + @@ -113,40 +133,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/fts/pdb_data_columns.txt b/resources/fts/pdb_data_columns.txt index 95f2dd1..5ac50bb 100644 --- a/resources/fts/pdb_data_columns.txt +++ b/resources/fts/pdb_data_columns.txt @@ -1,3 +1,24 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ + pdb_data_columns # _group.id @@ -6,9 +27,9 @@ _group.sort_order g1;Quality Measures;1 g2;Cross References;2 g3;Names & Taxonomy;3 -g4;Procedures & Softwares;4 +g4;Procedures & Software;4 g5;Date Of;5 -g6;Miscellenous;6 +g6;Miscellaneous;6 # _data_column.primary_key;pdb_id _data_column.default_response_page_size;100 @@ -16,7 +37,7 @@ _data_column.default_response_page_size;100 _data_column.name _data_column.code _data_column.group_id -_data_column.data_type +_data_column.data_type | _data_column.isFormated | _data_column.significantDigit _data_column.min_col_width _data_column.max_col_width _data_column.preferred_col_width @@ -35,17 +56,17 @@ UniProt Id;uniprot_id;String;g2;50;400;95;false;true UniProt Accession;uniprot_accession;String;g2;50;400;95;false;false UniProt Coverage;uniprot_coverage;String;g6;50;400;95;false;false Uniprot Features;uniprot_features;String;g6;50;400;95;false;false -R Factor;r_factor;Double;g1;50;150;85;false;false -Resolution;resolution;Double;g1;50;150;85;true;false -Data Quality;data_quality;Double;g1;50;150;85;false;false -Overall Quality;overall_quality;Double;g1;50;150;85;false;false +R Factor;r_factor;Double|T|3;g1;50;150;85;false;false +Experimental Method;experimental_method;String;g4;50;400;105;true;false +Resolution;resolution;Double|T|3;g1;50;150;85;true;false +Data Quality;data_quality;Double|T|2;g1;50;150;85;false;false +Overall Quality;overall_quality;Double|T|1;g1;50;150;85;false;false Number of Polymers;number_of_polymers;int;g6;50;400;95;false;false Number of Protein Chains;number_of_protein_chains;int;g6;50;400;95;false;false Number of Bound Molecule;number_of_bound_molecules;int;g6;50;400;95;false;false Number of Polymer Residue;number_of_polymer_residues;int;g6;50;400;95;false;false GENUS;genus;String;g3;50;400;95;false;true Gene Name;gene_name;String;g3;50;400;95;false;true -Experimental Method;experimental_method;String;g4;50;400;95;false;false GO Id;go_id;String;g2;50;400;95;false;false Assembly Id;assembly_id;String;g2;50;400;95;false;false Assembly Form;assembly_form;String;g6;50;400;95;false;false @@ -58,10 +79,10 @@ Interacting Entity Id;interacting_entity_id;String;g2;50;400;95;false;false Interacting Molecules;interacting_molecules;String;g6;50;400;95;false;false Pubmed Id;pubmed_id;int;g2;50;400;95;false;false Status;status;String;g6;50;400;95;false;false -Model Quality;model_quality;Double;g1;50;150;85;false;false -Pivot Resolution;pivot_resolution;Double;g1;50;150;85;false;false +Model Quality;model_quality;Double|T|2;g1;50;150;85;false;false +Pivot Resolution;pivot_resolution;Double|T|3;g1;50;150;85;false;false Data reduction software;data_reduction_software;String;g4;50;400;95;false;false -Max observed residues;max_observed_residues;String;g6;50;400;95;false;false +Max observed residues;max_observed_residues;Integer|F;g6;50;400;95;false;false Organism scientific name;organism_scientific_name;String;g3;50;400;95;false;false Super kingdom;superkingdom;String;g3;50;400;95;false;false Rank;rank;String;g3;50;400;95;false;false @@ -86,7 +107,7 @@ Entry Authors;entry_authors;String;g6;50;400;95;false;false Citation Title;citation_title;String;g6;50;400;95;false;false Structure Solution Software;structure_solution_software;String;g4;50;400;95;false;false Entry Entity;entry_entity;String;g6;50;400;95;false;false -R Free;r_free;Double;g1;50;150;85;false;false +R Free;r_free;Double|T|3;g1;50;150;85;false;false Number of Polymer Entities;number_of_polymer_entities;int;g6;50;400;95;false;false Number of Bound Entities;number_of_bound_entities;int;g6;50;400;95;false;false Crystallisation Reservoir;crystallisation_reservoir;String;g6;50;400;95;false;false @@ -103,7 +124,7 @@ Synchrotron Beamline;synchrotron_beamline;String;g6;50;400;95;false;false Entity Id; entity_id;String;g2;50;400;95;false;false Beam Source Name;beam_source_name;String;g3;50;400;95;false;false Processing Site;processing_site;String;g6;50;400;95;false;false -Entity Weight;entity_weight;Double;g6;50;400;95;false;false -Version;_version_;String;g6;50;400;95;false;false +Entity Weight;entity_weight;Double|T|0;g6;50;400;95;false;false +Version;_version_;Double|F|0;g6;50;400;95;false;false ALL;text;String;g6;50;400;95;false;true # diff --git a/resources/fts/uniprot_data_columns.txt b/resources/fts/uniprot_data_columns.txt index 6c78c16..f506648 100644 --- a/resources/fts/uniprot_data_columns.txt +++ b/resources/fts/uniprot_data_columns.txt @@ -1,3 +1,24 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ + uniprot_data_columns # _group.id @@ -8,7 +29,7 @@ g2;Cross References;2 g3;Names & Taxonomy;1 g4;Procedures & Softwares;4 g5;Date Of;5 -g6;Miscellenous;6 +g6;Miscellaneous;6 g7;Sequences;7 g8;Function;8 g9;Interaction;9 @@ -35,16 +56,16 @@ _data_column.preferred_col_width _data_column.is_shown_by_default _data_column.is_searchable Uniprot Id;id;String;g3;80;150;85;true;true -Entry Name;entry name|name;String;g3;100;150;105;true;true -Protein names;protein names|protein name;String;g3;300;1500;500;true;true +Entry Name;entry name|mnemonic;String;g3;100;150;105;true;true +Protein names;protein names|name;String;g3;300;1500;500;true;true Gene Names;genes|gene;String;g3;100;1000;145;true;true Organism;organism;String;g3;100;1000;200;true;true -Organism ID;organism-id;int;g3;60;100;80;false;true -Proteomes;proteome;String;g3;50;1000;95;false;true -Taxonomic lineage (ALL);lineage(ALL);String;g3;50;400;95;false;false -Virus hosts;virus hosts;String;g3;50;1000;95;false;true -Fragment;fragment;String;g7;50;1000;95;false;true -Gene encoded by;encodedon;String;g7;50;1000;95;false;true +Organism ID;organism-id;int;g3;60;100;80;false;false +Proteomes;proteome;String;g3;50;1000;95;false;false +Taxonomic lineage (ALL);lineage(ALL)|taxonomy;String;g3;50;400;95;false;false +Virus hosts;virus hosts|host;String;g3;50;1000;95;false;true +Fragment;fragment;String;g7;50;1000;95;false;false +Gene encoded by;encodedon;String;g7;50;1000;95;false;false Alternative products (isoforms);comment(ALTERNATIVE PRODUCTS);String;g7;50;1000;95;false;false Erroneous gene model prediction;comment(ERRONEOUS GENE MODEL PREDICTION);String;g7;50;1000;95;false;false Erroneous initiation;comment(ERRONEOUS INITIATION);String;g7;50;1000;95;false;false @@ -55,9 +76,9 @@ Polymorphism;comment(POLYMORPHISM);String;g7;50;1000;95;false;false RNA editing;comment(RNA EDITING);String;g7;50;1000;95;false;false Sequence caution;comment(SEQUENCE CAUTION);String;g7;50;1000;95;false;false Status;reviewed;String;g6;50;100;95;true;true -Length;length;int;g7;50;100;65;true;true -Mass;mass;String;g7;50;100;80;false;true -Sequence;sequence;String;g7;50;1000;95;false;true +Length;length;int|T|0;g7;50;100;65;true;true +Mass;mass;int|T|0;g7;50;100;80;false;true +Sequence;sequence;String;g7;50;1000;95;false;false Alternative sequence;feature(ALTERNATIVE SEQUENCE);String;g7;50;1000;95;false;false Natural variant;feature(NATURAL VARIANT);String;g7;50;1000;95;false;false Non-adjacent residues;feature(NON ADJACENT RESIDUES);String;g7;50;1000;95;false;false @@ -83,15 +104,15 @@ DNA binding;feature(DNA BINDING);String;g8;50;1000;95;false;false Metal binding;feature(METAL BINDING);String;g8;50;1000;95;false;false Nucleotide binding;feature(NP BIND);String;g8;50;1000;95;false;false Site;feature(SITE);String;g8;50;1000;95;false;false -Annotation;annotation score;String;g6;50;1000;95;false;true -Features;features;String;g6;50;1000;95;false;true +Annotation;annotation score;String;g6;50;1000;95;false;false +Features;features;String;g6;50;1000;95;false;false Caution;comment(CAUTION);String;g6;50;1000;95;false;false Miscellaneous [CC];comment(GENERAL);String;g6;50;1000;95;false;false -Keywords;keywords;String;g6;50;1000;95;false;true +Keywords;keywords|keyword;String;g6;50;1000;95;false;true Protein existence;existence;String;g6;50;1000;95;false;true -ALL;Search All;String;g7;50;1000;95;false;true; +ALL;Search All;String;g7;50;1000;95;false;true Subunit structure [CC];comment(SUBUNIT);String;g9;50;1000;95;false;false -Interacts with;interactor;String;g9;50;1000;95;false;true +Interacts with;interactor;String;g9;50;1000;95;false;false Developmental stage;comment(DEVELOPMENTAL STAGE);String;g10;50;1000;95;false;false Induction;comment(INDUCTION);String;g10;50;1000;95;false;false Tissue specificity;comment(TISSUE SPECIFICITY);String;g10;50;1000;95;false;false @@ -131,7 +152,7 @@ Date of creation;created;String;g17;80;150;100;false;true Date of last modification;last-modified;String;g17;80;150;100;false;true Date of last sequence modification;sequence-modified;String;g17;80;150;100;false;true Version (entry);version(entry);int;g17;80;100;80;false;false -Domain;comment(DOMAIN)|domain;String;g18;80;1000;95;false;true +Domain [cc];comment(DOMAIN)|domain;String;g18;80;1000;95;false;true Sequence similarities;comment(SIMILARITY);String;g18;50;1000;95;false;false Protein families;families|family;String;g18;50;1000;95;false;true Coiled coil;feature(COILED COIL);String;g18;50;1000;95;false;false diff --git a/resources/lang/Messages.properties b/resources/lang/Messages.properties index 62c813a..40c311f 100644 --- a/resources/lang/Messages.properties +++ b/resources/lang/Messages.properties @@ -675,7 +675,7 @@ label.view_all_representative_structures = View all {0} representative structure label.open_new_jmol_view_with_all_representative_structures_associated_current_selection_superimpose_using_alignment = Opens a new structure viewer with all representative structures\nassociated with the current selection\nsuperimposed with the current alignment. label.associate_structure_with_sequence = Associate Structure with Sequence label.from_file = From File -label.enter_pdb_id = Enter PDB Id +label.enter_pdb_id = Enter PDB Id (or pdbid:chaincode) label.discover_pdb_ids = Discover PDB IDs label.text_colour = Text Colour action.set_text_colour = Text Colour... @@ -801,6 +801,8 @@ label.wswublast_client_credits = To display sequence features an exact Uniprot i label.blasting_for_unidentified_sequence = BLASTing for unidentified sequences label.select_columns_containing = Select columns containing label.select_columns_not_containing = Select columns that do not contain +label.hide_columns_containing = Hide columns containing +label.hide_columns_not_containing = Hide columns that do not contain option.trim_retrieved_seqs = Trim retrieved sequences label.trim_retrieved_sequences = When the reference sequence is longer than the sequence that you are working with, only keep the relevant subsequences. label.use_sequence_id_1 = Use $SEQUENCE_ID$ or $SEQUENCE_ID=//=$ @@ -970,7 +972,6 @@ error.eps_generation_not_implemented = EPS Generation not yet implemented error.png_generation_not_implemented = PNG Generation not yet implemented error.try_join_vamsas_session_another = Trying to join a vamsas session when another is already connected error.invalid_vamsas_session_id = Invalid vamsas session id -error.implementation_error_cannot_create_groovyshell = Implementation Error. Cannot create groovyShell without Groovy on the classpath! label.groovy_support_failed = Jalview Groovy Support Failed label.couldnt_create_groovy_shell = Couldn't create the groovy Shell. Check the error log for the details of what went wrong. error.unsupported_version_calcIdparam = Unsupported Version for calcIdparam {0} @@ -1027,7 +1028,7 @@ error.implementation_error_need_to_have_httpresponse = Implementation Error: nee error.dbrefsource_implementation_exception =DBRefSource Implementation Exception error.implementation_error_dbinstance_must_implement_interface = Implmentation Error - getDbInstances must be given a class that implements jalview.ws.seqfetcher.DbSourceProxy (was given{0}) error.implementation_error_must_init_dbsources =Implementation error. Must initialise dbSources -label.view_controller_toggled_marked = {0} {1} columns {2} containing features of type {3} across {4} sequence(s) +label.view_controller_toggled_marked = {0} {1} columns containing features of type {2} across {3} sequence(s) label.toggled = Toggled label.marked = Marked label.not = not @@ -1286,19 +1287,24 @@ exception.fts_server_unreachable = Jalview is unable to reach the {0} server. \n label.nw_mapping = Needleman & Wunsch Alignment label.sifts_mapping = SIFTs Mapping label.mapping_method = Sequence \u27f7 Structure mapping method -label.mapping_method = Sequence \u27f7 Structure mapping method -status.waiting_for_user_to_select_output_file = Waiting for user to select {0} file. -status.cancelled_image_export_operation = Cancelled {0} export operation. -info.error_creating_file = Error creating {0} file. +status.waiting_for_user_to_select_output_file = Waiting for user to select {0} file +status.cancelled_image_export_operation = Cancelled {0} export operation +info.error_creating_file = Error creating {0} file exception.outofmemory_loading_mmcif_file = Out of memory loading mmCIF File -info.error_creating_file = Error creating {0} file. label.run_groovy = Run Groovy console script label.run_groovy_tip = Run the script in the Groovy console over this alignment label.couldnt_run_groovy_script = Failed to run Groovy script label.uniprot_sequence_fetcher = UniProt Sequence Fetcher action.next_page= >> action.prev_page= << -label.next_page_tooltop=Next Page -label.prev_page_tooltop=Previous Page +label.next_page_tooltip=Next Page +label.prev_page_tooltip=Previous Page exception.bad_request=Bad request. There is a problem with your input. exception.service_not_available=Service not available. The server is being updated, try again later. +status.launching_3d_structure_viewer = Launching 3D Structure viewer... +status.fetching_3d_structures_for_selected_entries = Fetching 3D Structures for selected entries... +status.fetching_dbrefs_for_sequences_without_valid_refs = Fetching db refs for {0} sequence(s) without valid db ref required for SIFTS mapping +status.fetching_3d_structures_for = Fetching 3D Structure for {0} +status.obtaining_mapping_with_sifts = Obtaining mapping with SIFTS +status.obtaining_mapping_with_nw_alignment = Obtaining mapping with NW alignment +status.exporting_alignment_as_x_file = Exporting alignment as {0} file diff --git a/resources/lang/Messages_es.properties b/resources/lang/Messages_es.properties index 3535f4b..f814c97 100644 --- a/resources/lang/Messages_es.properties +++ b/resources/lang/Messages_es.properties @@ -277,7 +277,7 @@ label.order_by_params = Ordenar por {0} label.html_content = {0} label.paste_pdb_file= Pegar tu fichero PDB aquí. label.paste_pdb_file_for_sequence = Pegar fichero PDB para la secuencia {0} -label.could_not_parse_newick_file = No se pudo analizar el fichero Newick\\\!\\n {0} +label.could_not_parse_newick_file = No se pudo analizar el fichero Newick\!\n {0} label.successfully_pasted_tcoffee_scores_to_alignment= Pegada exitosamente la puntuación T-Coffee al alineamiento. label.failed_add_tcoffee_scores = Fallo al añadir las puntuaciones T-Coffee: label.successfully_pasted_annotation_to_alignment = Anotación pegada exitosamente al alineamiento. @@ -321,7 +321,7 @@ action.save_vamsas_session = Guardar Sesi label.select_vamsas_session_opened_as_new_vamsas_session= Selecciones una sesión vamsas para abrirla como una nueva sesión. label.open_saved_vamsas_session = Abrir una sesión VAMSAS guardada label.groovy_console = Consola Groovy -label.lineart = lineart +label.lineart = Lineart label.dont_ask_me_again = No volver a preguntar label.select_eps_character_rendering_style = Seleccionar el carácter EPS como estilo de visualización label.invert_selection = Invertir selección @@ -336,26 +336,26 @@ label.example = Ejemplo label.example_param = Ejemplo: {0} label.select_file_format_before_saving = Debe seleccionar un formato de fichero antes de guardar! label.file_format_not_specified = Formato de fichero no especificado -label.alignment_contains_hidden_columns = El alineamiento contiene columnas ocultas.\\nQuieres guardar s\u00F3lo el alineamiento visible? +label.alignment_contains_hidden_columns = El alineamiento contiene columnas ocultas.\nQuieres guardar s\u00F3lo el alineamiento visible? label.couldnt_save_file = No se pudo guardar el fichero: {0} label.error_saving_file = Error guardando el fichero label.remove_from_default_list = eliminar de la lista de defectuosos? label.remove_user_defined_colour = Eliminar el color definido por el usuario label.you_must_select_least_two_sequences = Debes seleccionar al menos 2 secuencias. label.invalid_selection = Selección inválida -label.principal_component_analysis_must_take_least_four_input_sequences = El an\u00E1lisis de la componente principal debe tomar\\nal menos 4 secuencias de entrada. +label.principal_component_analysis_must_take_least_four_input_sequences = El an\u00E1lisis de la componente principal debe tomar\nal menos 4 secuencias de entrada. label.sequence_selection_insufficient = Selección de secuencias insuficiente label.you_need_more_two_sequences_selected_build_tree = necesitas seleccionar más de dos secuencias para construir un árbol! label.not_enough_sequences = No suficientes secuencias -label.selected_region_to_tree_may_only_contain_residues_or_gaps = La regi\u00F3n seleccionada para construir un \u00E1rbol puede\\ncontener s\u00F3lo residuos o espacios.\\nPrueba usando la funci\u00F3n Pad en el men\u00FA de edici\u00F3n,\\n o uno de los m\u00FAltiples servicios web de alineamiento de secuencias. +label.selected_region_to_tree_may_only_contain_residues_or_gaps = La regi\u00F3n seleccionada para construir un \u00E1rbol puede\ncontener s\u00F3lo residuos o espacios.\nPrueba usando la funci\u00F3n Pad en el men\u00FA de edici\u00F3n,\n o uno de los m\u00FAltiples servicios web de alineamiento de secuencias. label.sequences_selection_not_aligned = Las secuencias seleccionadas no están alineadas -label.sequences_must_be_aligned_before_creating_tree = Las secuencias deben estar alineadas antes de crear el \u00E1rbol.\\nPrueba usando la funci\u00F3n Pad en el men\u00FA de editar,\\n o uno de los m\u00FAltiples servicios web de alineamiento de secuencias. +label.sequences_must_be_aligned_before_creating_tree = Las secuencias deben estar alineadas antes de crear el \u00E1rbol.\nPrueba usando la funci\u00F3n Pad en el men\u00FA de editar,\n o uno de los m\u00FAltiples servicios web de alineamiento de secuencias. label.sequences_not_aligned = Secuencias no alineadas label.problem_reading_tree_file = Problema al leer el fichero del árbol label.possible_problem_with_tree_file = Posible problema con el fichero del árbol label.select_at_least_three_bases_in_at_least_one_sequence_to_cDNA_translation = Por favor seleccionar al menos tres bases de al menos una secuencia para poder realizar la traducción de cDNA. label.translation_failed = Translation Failed -label.error_when_translating_sequences_submit_bug_report = Desafortunadamente, algo fue mal a la hora de traducir tus secuencias.\\nPor favor, revisa la consola Jalview java \\ny presenta un informe de error que incluya el seguimiento. +label.error_when_translating_sequences_submit_bug_report = Desafortunadamente, algo fue mal a la hora de traducir tus secuencias.\nPor favor, revisa la consola Jalview java \ny presenta un informe de error que incluya el seguimiento. label.implementation_error = Error de implementación: label.automatically_associate_pdb_files_with_sequences_same_name = Quieres asociar automáticamente los {0} ficheros PDB con las secuencias del alineamiento que tengan el mismo nombre? label.automatically_associate_pdb_files_by_name = Asociar los ficheros PDB por nombre automáticamente @@ -364,11 +364,11 @@ label.ignore_unmatched_dropped_files = Ignorar los ficheros sin coincidencias? label.enter_view_name = Introducir nombre visible (¿?) label.enter_label = Introducir etiqueta label.enter_label_for_the_structure = Introducir una etiqueta para la estructura? -label.pdb_entry_is_already_displayed = {0} Ya est\u00E1 mostrado.\\nQuieres volver a usar este visor? +label.pdb_entry_is_already_displayed = {0} Ya est\u00E1 mostrado.\nQuieres volver a usar este visor? label.map_sequences_to_visible_window = Mapa de secuencias en ventana visible: {0} -label.add_pdbentry_to_view = Quieres a\u00F1adir {0} a la vista llamada\\n{1}\\n +label.add_pdbentry_to_view = Quieres a\u00F1adir {0} a la vista llamada\n{1}\n label.align_to_existing_structure_view = Alinear a una estructura ya existente -label.pdb_entries_couldnt_be_retrieved = Las siguientes entradas pdb no pueden ser extra\u00EDdas del PDB\\\:\\n{0}\\nPor favor, prueba descarg\u00E1ndolas manualmente. +label.pdb_entries_couldnt_be_retrieved = Las siguientes entradas pdb no pueden ser extra\u00EDdas del PDB\:\n{0}\nPor favor, prueba descarg\u00E1ndolas manualmente. label.couldnt_load_file = No se pudo cargar el fichero label.couldnt_find_pdb_id_in_file = No se pudo encontrar un Id PDB en el fichero suministrado. Por favor, introduzca un Id para identificar esta estructura. label.no_pdb_id_in_file = No hay un Id PDB en el fichero @@ -394,11 +394,11 @@ label.invalid_url = URL Invalido! label.error_loading_file = Error al cargar el fichero label.problems_opening_file = Encontrados problemas al abrir el fichero {0}!! label.file_open_error = Error al abrir el fichero -label.no_das_sources_selected_warn = No han sido seleccionadas fuentes DAS.\\nPor favor, seleccione algunas fuentes y\\npruebe de nuevo. +label.no_das_sources_selected_warn = No han sido seleccionadas fuentes DAS.\nPor favor, seleccione algunas fuentes y\npruebe de nuevo. label.no_das_sources_selected_title = No han sido seleccionadas fuentes DAS -label.colour_scheme_exists_overwrite = El esquema de colores {0} ya existe.\\nContinuar guardando el esquema de colores como {1}? +label.colour_scheme_exists_overwrite = El esquema de colores {0} ya existe.\nContinuar guardando el esquema de colores como {1}? label.duplicate_scheme_name = Duplicar nombre de esquema -label.jalview_new_questionnaire = Hay un nuevo cuestionario disponible. Querr\u00EDa completarlo ahora ?\\n +label.jalview_new_questionnaire = Hay un nuevo cuestionario disponible. Querr\u00EDa completarlo ahora ?\n label.jalview_user_survey = Encuesta de usuario Jalview label.alignment_properties = Propiedades del alineamiento: {0} label.alignment_props = Propiedades del alineamiento @@ -905,7 +905,6 @@ error.eps_generation_not_implemented = La generaci error.png_generation_not_implemented = La generación de PNG no se ha implementado todavía error.try_join_vamsas_session_another = Tratando de establecer una sesión VAMSAS cuando ya había otra conectada error.invalid_vamsas_session_id = Identificador de sesión VAMSAS no válido -error.implementation_error_cannot_create_groovyshell = Error de implementación:no se puede crear groovyShell sin Groovy en el classpath label.groovy_support_failed = El soporte Groovy de Jalview ha fallado label.couldnt_create_groovy_shell = No es posible crear el shell de Groovy. Compruebe el fichero de log para conocer los detalles. error.unsupported_version_calcIdparam = Versión no soportada de {0} @@ -962,7 +961,7 @@ error.implementation_error_need_to_have_httpresponse = Error de implementaci error.dbrefsource_implementation_exception = Excepción de implementación DBRefSource error.implementation_error_dbinstance_must_implement_interface = Error de Implementación- getDbInstances debe recibir una clase que implemente jalview.ws.seqfetcher.DbSourceProxy (recibió {0}) error.implementation_error_must_init_dbsources =Error de implementación. Debe inicializar dbSources -label.view_controller_toggled_marked = {0} {1} columnas {2} conteniendo características del tipo {3} en {4} secuencia(s) +label.view_controller_toggled_marked = {0} {1} columnas conteniendo características del tipo {2} en {3} secuencia(s) label.toggled = Invertida label.marked = Marcada label.not = no @@ -1055,7 +1054,7 @@ error.implementation_error_cannot_find_service_url_in_given_set = Error de imple error.implementation_error_cannot_find_service_url_in_given_set_param_store = Error de implementación: la URL del servicio en el conjunto de URL para este almacén de parámetros del servicio({0}) exception.jobsubmission_invalid_params_set = Conjunto de parámetros no válido. Comprueba la implementación de Jalview exception.notvaliddata_group_contains_less_than_min_seqs = El grupo contiene menos de {0} secuencias. -exception.outofmemory_loading_pdb_file = Sin menoria al cargar el fichero PDB +exception.outofmemory_loading_pdb_file = Sin memoria al cargar el fichero PDB exception.eps_coudnt_write_output_file = No es posible escribir el fichero de salida: {0} exception.eps_method_not_supported = Método actualmente no suportado por la versión {0} de EpsGraphics2D exception.eps_unable_to_get_inverse_matrix = Imposible obtener la inversa de la matrix: {0} @@ -1084,7 +1083,7 @@ status.fetching_pdb = Recuperando PDB {0} status.refreshing_news = Refrescando noticias status.importing_vamsas_session_from = Importando sesión VAMSAS de {0} status.opening_params = Abriendo {0} -status.waiting_sequence_database_fetchers_init = Esperando la inicialización de los recuperadores de bases de datos de secuencias +status.waiting_sequence_database_fetchers_init = Esperando inicialización de los recuperadores de bases de datos de secuencias status.init_sequence_database_fetchers = Inicializando recuperadores de bases de datos de secuencias status.fetching_sequence_queries_from = Recuperando {0} consultas de secuencias de {1} status.finshed_querying = Consulta finalizada @@ -1281,3 +1280,36 @@ info.invalid_msa_input_mininfo=Necesita por lo menos dos secuencias con al menos label.chimera_missing=Visualizador de estructura Chimera no encontrado.
        Por favor, introduzca la ruta de Chimera,
        o descargar e instalar la UCSF Chimera. label.save_as_biojs_html=Guardar como HTML BioJs exception.pdb_rest_service_no_longer_available=Servicios Rest PDB ya no están disponibles! +exception.fts_server_unreachable=Jalview no puede conectar con el servidor {0}. \nPor favor asegúrese de que está conectado a Internet y vuelva a intentarlo. +exception.outofmemory_loading_mmcif_file=Sin memoria al cargar el fichero mmCIF +label.hide_columns_not_containing=Ocultar las columnas que no contengan +label.pdb_sequence_fetcher=Recuperador de secuencias PDB +exception.fts_server_error=Parece que hay un error desde el servidor {0} +exception.service_not_available=Servicio no disponible. El servidor se está actualizando, vuelva a intentarlo más tarde. +status.waiting_for_user_to_select_output_file=Esperando que el usuario seleccione el fichero {0} +action.prev_page=<< +status.cancelled_image_export_operation=Operación de exportación {0} cancelada +label.couldnt_run_groovy_script=No se ha podido ejecutar el script Groovy +exception.bad_request=Solicitud incorrecta. Hay un problema con su entrada. +label.run_groovy=Ejecutar script Groovy desde la consola +action.next_page=>> +label.uniprot_sequence_fetcher=Recuperador de secuencias UniProt +label.prev_page_tooltip=Página anterior +label.reverse=Invertir +label.hide_columns_containing=Ocultar las columnas que contengan +label.nucleotides=Nucleótidos +label.run_groovy_tip = Ejecutar script Groovy desde la consola sobre este alineamiento +label.nw_mapping=Alineamiento Needleman y Wunsch +label.proteins=Proteína +label.reverse_complement=Invertir y complementar +label.next_page_tooltip=Página siguiente +label.sifts_mapping=Mapeado SIFTs +label.mapping_method=Método de mapeo de secuencia \u27F7 estructura +info.error_creating_file=Error al crear fichero {0} +exception.fts_rest_service_no_longer_available= Servicios Rest {0} ya no están disponibles! +status.launching_3d_structure_viewer=Lanzando visualizador de estructura 3D... +status.obtaining_mapping_with_sifts=Obteniendo mapeo por SIFTS +status.fetching_3d_structures_for=Buscando la estructura 3D para {0} +status.fetching_3d_structures_for_selected_entries=Buscando las estructuras 3D para entradas seleccionadas... +status.fetching_dbrefs_for_sequences_without_valid_refs=Buscando referencias para {0} secuencia(s) sin referencia válida necesaria para mapeado SIFTS +status.obtaining_mapping_with_nw_alignment=Obteniendo mapeo por alineamiento Needleman y Wunsch \ No newline at end of file diff --git a/schemas/jalview.xsd b/schemas/jalview.xsd index 850b223..f0bd638 100755 --- a/schemas/jalview.xsd +++ b/schemas/jalview.xsd @@ -293,6 +293,7 @@ + diff --git a/src/MCview/PDBChain.java b/src/MCview/PDBChain.java index 3b84ee3..885521b 100755 --- a/src/MCview/PDBChain.java +++ b/src/MCview/PDBChain.java @@ -30,7 +30,7 @@ import jalview.datamodel.SequenceI; import jalview.schemes.ColourSchemeI; import jalview.schemes.ResidueProperties; import jalview.structure.StructureMapping; -import jalview.structure.StructureViewSettings; +import jalview.structure.StructureImportSettings; import java.awt.Color; import java.util.List; @@ -82,7 +82,7 @@ public class PDBChain public PDBChain(String pdbid, String id) { - this.pdbid = pdbid.toLowerCase(); + this.pdbid = pdbid == null ? pdbid : pdbid.toLowerCase(); this.id = id; } @@ -357,18 +357,6 @@ public class PDBChain else { - // boolean baseDetected = false; - // for (Atom resAtom : resAtoms) - // { - // if (resAtom.insCode == ' ') - // { - // baseDetected = true; - // } - // } - // if (!baseDetected) - // { - // continue; - // } // Make a new Residue object with the new atoms vector residues.addElement(new Residue(resAtoms, resNumber - 1, count)); @@ -378,7 +366,6 @@ public class PDBChain SequenceFeature sf = new SequenceFeature("RESNUM", tmpat.resName + ":" + tmpat.resNumIns + " " + pdbid + id, "", offset + count, offset + count, pdbid); - // MCview.PDBChain.PDBFILEFEATURE); resFeatures.addElement(sf); resAnnotation.addElement(new Annotation(tmpat.tfactor)); // Keep totting up the sequence @@ -436,7 +423,7 @@ public class PDBChain // System.out.println("PDB Sequence is :\nSequence = " + seq); // System.out.println("No of residues = " + residues.size()); - if (StructureViewSettings.isShowSeqFeatures()) + if (StructureImportSettings.isShowSeqFeatures()) { for (i = 0, iSize = resFeatures.size(); i < iSize; i++) { diff --git a/src/MCview/PDBViewer.java b/src/MCview/PDBViewer.java index e032c7a..d5f0d0b 100755 --- a/src/MCview/PDBViewer.java +++ b/src/MCview/PDBViewer.java @@ -151,7 +151,7 @@ public class PDBViewer extends JInternalFrame implements Runnable { EBIFetchClient ebi = new EBIFetchClient(); String query = "pdb:" + pdbentry.getId(); - pdbentry.setFile(ebi.fetchDataAsFile(query, "default", "raw", ".xml") + pdbentry.setFile(ebi.fetchDataAsFile(query, "default", ".xml") .getAbsolutePath()); if (pdbentry.getFile() != null) diff --git a/src/MCview/PDBfile.java b/src/MCview/PDBfile.java index 9a9b6f6..9acc2e7 100755 --- a/src/MCview/PDBfile.java +++ b/src/MCview/PDBfile.java @@ -25,6 +25,7 @@ import jalview.datamodel.DBRefSource; import jalview.datamodel.SequenceI; import jalview.io.FileParse; import jalview.io.StructureFile; +import jalview.structure.StructureImportSettings; import jalview.util.MessageManager; import java.io.IOException; @@ -46,10 +47,10 @@ public class PDBfile extends StructureFile } public PDBfile(boolean addAlignmentAnnotations, boolean predictSecStr, - boolean externalSecStr, String file, String protocol) + boolean externalSecStr, String dataObject, String protocol) throws IOException { - super(false, file, protocol); + super(false, dataObject, protocol); addSettings(addAlignmentAnnotations, predictSecStr, externalSecStr); doParse(); } @@ -131,7 +132,8 @@ public class PDBfile extends StructureFile break; } if (line.indexOf("ATOM") == 0 - || (line.indexOf("HETATM") == 0 && !terFlag)) + || (StructureImportSettings.isProcessHETATMs() + && line.indexOf("HETATM") == 0 && !terFlag)) { terFlag = false; diff --git a/src/ext/edu/ucsf/rbvi/strucviz2/ChimeraManager.java b/src/ext/edu/ucsf/rbvi/strucviz2/ChimeraManager.java index 4201f43..c0c7c46 100644 --- a/src/ext/edu/ucsf/rbvi/strucviz2/ChimeraManager.java +++ b/src/ext/edu/ucsf/rbvi/strucviz2/ChimeraManager.java @@ -199,8 +199,9 @@ public class ChimeraManager return null; } - List newModelList = getModelList(); - for (ChimeraModel newModel : newModelList) + // patch for Jalview - set model name in Chimera + // TODO: find a variant that works for sub-models + for (ChimeraModel newModel : getModelList()) { if (!modelList.contains(newModel)) { @@ -209,15 +210,12 @@ public class ChimeraManager "setattr M name " + modelName + " #" + newModel.getModelNumber(), false); modelList.add(newModel); - } } // assign color and residues to open models for (ChimeraModel chimeraModel : modelList) { - // // patch for Jalview - set model name in Chimera - // // TODO: find a variant that works for sub-models // get model color Color modelColor = getModelColor(chimeraModel); if (modelColor != null) @@ -731,7 +729,7 @@ public class ChimeraManager */ public List sendChimeraCommand(String command, boolean reply) { - // System.out.println("chimeradebug>> " + command); + // System.out.println("chimeradebug>> " + command); if (!isChimeraLaunched() || command == null || "".equals(command.trim())) { diff --git a/src/jalview/analysis/AlignmentUtils.java b/src/jalview/analysis/AlignmentUtils.java index 42a1201..9aaaed2 100644 --- a/src/jalview/analysis/AlignmentUtils.java +++ b/src/jalview/analysis/AlignmentUtils.java @@ -22,8 +22,10 @@ package jalview.analysis; import static jalview.io.gff.GffConstants.CLINICAL_SIGNIFICANCE; +import jalview.api.DBRefEntryI; import jalview.datamodel.AlignedCodon; import jalview.datamodel.AlignedCodonFrame; +import jalview.datamodel.AlignedCodonFrame.SequenceToSequenceMapping; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; @@ -38,8 +40,10 @@ import jalview.io.gff.SequenceOntologyFactory; import jalview.io.gff.SequenceOntologyI; import jalview.schemes.ResidueProperties; import jalview.util.Comparison; +import jalview.util.DBRefUtils; import jalview.util.MapList; import jalview.util.MappingUtils; +import jalview.util.StringUtils; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -848,6 +852,11 @@ public class AlignmentUtils */ public static int alignProteinAsDna(AlignmentI protein, AlignmentI dna) { + if (protein.isNucleotide() || !dna.isNucleotide()) + { + System.err.println("Wrong alignment type in alignProteinAsDna"); + return 0; + } List unmappedProtein = new ArrayList(); Map> alignedCodons = buildCodonColumnsMap( protein, dna, unmappedProtein); @@ -855,6 +864,176 @@ public class AlignmentUtils } /** + * Realigns the given dna to match the alignment of the protein, using codon + * mappings to translate aligned peptide positions to codons. + * + * Always produces a padded CDS alignment. + * + * @param dna + * the alignment whose sequences are realigned by this method + * @param protein + * the protein alignment whose alignment we are 'copying' + * @return the number of sequences that were realigned + */ + public static int alignCdsAsProtein(AlignmentI dna, AlignmentI protein) + { + if (protein.isNucleotide() || !dna.isNucleotide()) + { + System.err.println("Wrong alignment type in alignProteinAsDna"); + return 0; + } + // todo: implement this + List mappings = protein.getCodonFrames(); + int alignedCount = 0; + int width = 0; // alignment width for padding CDS + for (SequenceI dnaSeq : dna.getSequences()) + { + if (alignCdsSequenceAsProtein(dnaSeq, protein, mappings, + dna.getGapCharacter())) + { + alignedCount++; + } + width = Math.max(dnaSeq.getLength(), width); + } + int oldwidth, diff; + for (SequenceI dnaSeq : dna.getSequences()) + { + oldwidth = dnaSeq.getLength(); + diff = width - oldwidth; + if (diff > 0) + { + dnaSeq.insertCharAt(oldwidth, diff, dna.getGapCharacter()); + } + } + return alignedCount; + } + + /** + * Helper method to align (if possible) the dna sequence to match the + * alignment of a mapped protein sequence. This is currently limited to + * handling coding sequence only. + * + * @param cdsSeq + * @param protein + * @param mappings + * @param gapChar + * @return + */ + static boolean alignCdsSequenceAsProtein(SequenceI cdsSeq, + AlignmentI protein, List mappings, char gapChar) + { + SequenceI cdsDss = cdsSeq.getDatasetSequence(); + if (cdsDss == null) + { + System.err + .println("alignCdsSequenceAsProtein needs aligned sequence!"); + return false; + } + + List dnaMappings = MappingUtils + .findMappingsForSequence(cdsSeq, mappings); + for (AlignedCodonFrame mapping : dnaMappings) + { + SequenceI peptide = mapping.findAlignedSequence(cdsSeq, protein); + int peptideLength = peptide.getLength(); + if (peptide != null) + { + Mapping map = mapping.getMappingBetween(cdsSeq, peptide); + if (map != null) + { + MapList mapList = map.getMap(); + if (map.getTo() == peptide.getDatasetSequence()) + { + mapList = mapList.getInverse(); + } + int cdsLength = cdsDss.getLength(); + int mappedFromLength = MappingUtils.getLength(mapList + .getFromRanges()); + int mappedToLength = MappingUtils + .getLength(mapList.getToRanges()); + boolean addStopCodon = (cdsLength == mappedFromLength * 3 + 3) + || (peptide.getDatasetSequence().getLength() == mappedFromLength - 1); + if (cdsLength != mappedToLength && !addStopCodon) + { + System.err + .println(String + .format("Can't align cds as protein (length mismatch %d/%d): %s", + cdsLength, mappedToLength, + cdsSeq.getName())); + } + + /* + * pre-fill the aligned cds sequence with gaps + */ + char[] alignedCds = new char[peptideLength * 3 + + (addStopCodon ? 3 : 0)]; + Arrays.fill(alignedCds, gapChar); + + /* + * walk over the aligned peptide sequence and insert mapped + * codons for residues in the aligned cds sequence + */ + char[] alignedPeptide = peptide.getSequence(); + char[] nucleotides = cdsDss.getSequence(); + int copiedBases = 0; + int cdsStart = cdsDss.getStart(); + int proteinPos = peptide.getStart() - 1; + int cdsCol = 0; + for (char residue : alignedPeptide) + { + if (Comparison.isGap(residue)) + { + cdsCol += 3; + } + else + { + proteinPos++; + int[] codon = mapList.locateInTo(proteinPos, proteinPos); + if (codon == null) + { + // e.g. incomplete start codon, X in peptide + cdsCol += 3; + } + else + { + for (int j = codon[0]; j <= codon[1]; j++) + { + char mappedBase = nucleotides[j - cdsStart]; + alignedCds[cdsCol++] = mappedBase; + copiedBases++; + } + } + } + } + + /* + * append stop codon if not mapped from protein, + * closing it up to the end of the mapped sequence + */ + if (copiedBases == nucleotides.length - 3) + { + for (int i = alignedCds.length - 1; i >= 0; i--) + { + if (!Comparison.isGap(alignedCds[i])) + { + cdsCol = i + 1; // gap just after end of sequence + break; + } + } + for (int i = nucleotides.length - 3; i < nucleotides.length; i++) + { + alignedCds[cdsCol++] = nucleotides[i]; + } + } + cdsSeq.setSequence(new String(alignedCds)); + return true; + } + } + } + return false; + } + + /** * Builds a map whose key is an aligned codon position (3 alignment column * numbers base 0), and whose value is a map from protein sequence to each * protein's peptide residue for that codon. The map generates an ordering of @@ -1331,15 +1510,19 @@ public class AlignmentUtils Collection types, List forSequences, boolean anyType, boolean doShow) { - for (AlignmentAnnotation aa : al.getAlignmentAnnotation()) + AlignmentAnnotation[] anns = al.getAlignmentAnnotation(); + if (anns != null) { - if (anyType || types.contains(aa.label)) + for (AlignmentAnnotation aa : anns) { - if ((aa.sequenceRef != null) - && (forSequences == null || forSequences - .contains(aa.sequenceRef))) + if (anyType || types.contains(aa.label)) { - aa.visible = doShow; + if ((aa.sequenceRef != null) + && (forSequences == null || forSequences + .contains(aa.sequenceRef))) + { + aa.visible = doShow; + } } } } @@ -1398,75 +1581,272 @@ public class AlignmentUtils * added to the alignment dataset. * * @param dna - * aligned dna sequences - * @param mappings - * from dna to protein - * @param al + * aligned nucleotide (dna or cds) sequences + * @param dataset + * the alignment dataset the sequences belong to + * @param products + * (optional) to restrict results to CDS that map to specified + * protein products * @return an alignment whose sequences are the cds-only parts of the dna * sequences (or null if no mappings are found) */ public static AlignmentI makeCdsAlignment(SequenceI[] dna, - List mappings, AlignmentI al) + AlignmentI dataset, SequenceI[] products) { + if (dataset == null || dataset.getDataset() != null) + { + throw new IllegalArgumentException( + "IMPLEMENTATION ERROR: dataset.getDataset() must be null!"); + } + List foundSeqs = new ArrayList(); List cdsSeqs = new ArrayList(); - - for (SequenceI seq : dna) + List mappings = dataset.getCodonFrames(); + HashSet productSeqs = null; + if (products != null) + { + productSeqs = new HashSet(); + for (SequenceI seq : products) + { + productSeqs.add(seq.getDatasetSequence() == null ? seq : seq + .getDatasetSequence()); + } + } + + /* + * Construct CDS sequences from mappings on the alignment dataset. + * The logic is: + * - find the protein product(s) mapped to from each dna sequence + * - if the mapping covers the whole dna sequence (give or take start/stop + * codon), take the dna as the CDS sequence + * - else search dataset mappings for a suitable dna sequence, i.e. one + * whose whole sequence is mapped to the protein + * - if no sequence found, construct one from the dna sequence and mapping + * (and add it to dataset so it is found if this is repeated) + */ + for (SequenceI dnaSeq : dna) { - AlignedCodonFrame cdsMappings = new AlignedCodonFrame(); + SequenceI dnaDss = dnaSeq.getDatasetSequence() == null ? dnaSeq + : dnaSeq.getDatasetSequence(); + List seqMappings = MappingUtils - .findMappingsForSequence(seq, mappings); - List alignmentMappings = al.getCodonFrames(); + .findMappingsForSequence(dnaSeq, mappings); for (AlignedCodonFrame mapping : seqMappings) { - for (Mapping aMapping : mapping.getMappingsFromSequence(seq)) + List mappingsFromSequence = mapping + .getMappingsFromSequence(dnaSeq); + + for (Mapping aMapping : mappingsFromSequence) { - SequenceI cdsSeq = makeCdsSequence(seq.getDatasetSequence(), - aMapping); + MapList mapList = aMapping.getMap(); + if (mapList.getFromRatio() == 1) + { + /* + * not a dna-to-protein mapping (likely dna-to-cds) + */ + continue; + } + + /* + * skip if mapping is not to one of the target set of proteins + */ + SequenceI proteinProduct = aMapping.getTo(); + if (productSeqs != null && !productSeqs.contains(proteinProduct)) + { + continue; + } + + /* + * try to locate the CDS from the dataset mappings; + * guard against duplicate results (for the case that protein has + * dbrefs to both dna and cds sequences) + */ + SequenceI cdsSeq = findCdsForProtein(mappings, dnaSeq, + seqMappings, aMapping); + if (cdsSeq != null) + { + if (!foundSeqs.contains(cdsSeq)) + { + foundSeqs.add(cdsSeq); + SequenceI derivedSequence = cdsSeq.deriveSequence(); + cdsSeqs.add(derivedSequence); + if (!dataset.getSequences().contains(cdsSeq)) + { + dataset.addSequence(cdsSeq); + } + } + continue; + } + + /* + * didn't find mapped CDS sequence - construct it and add + * its dataset sequence to the dataset + */ + cdsSeq = makeCdsSequence(dnaSeq.getDatasetSequence(), aMapping); + SequenceI cdsSeqDss = cdsSeq.createDatasetSequence(); cdsSeqs.add(cdsSeq); - + if (!dataset.getSequences().contains(cdsSeqDss)) + { + dataset.addSequence(cdsSeqDss); + } + /* * add a mapping from CDS to the (unchanged) mapped to range */ List cdsRange = Collections.singletonList(new int[] { 1, cdsSeq.getLength() }); - MapList map = new MapList(cdsRange, aMapping.getMap() - .getToRanges(), aMapping.getMap().getFromRatio(), - aMapping.getMap().getToRatio()); - cdsMappings.addMap(cdsSeq, aMapping.getTo(), map); + MapList cdsToProteinMap = new MapList(cdsRange, mapList.getToRanges(), + mapList.getFromRatio(), mapList.getToRatio()); + AlignedCodonFrame cdsToProteinMapping = new AlignedCodonFrame(); + cdsToProteinMapping.addMap(cdsSeq, proteinProduct, cdsToProteinMap); + + /* + * guard against duplicating the mapping if repeating this action + */ + if (!mappings.contains(cdsToProteinMapping)) + { + mappings.add(cdsToProteinMapping); + } + + /* + * copy protein's dbrefs to CDS sequence + * this enables Get Cross-References from CDS alignment + */ + DBRefEntry[] proteinRefs = DBRefUtils.selectDbRefs(false, + proteinProduct.getDBRefs()); + if (proteinRefs != null) + { + for (DBRefEntry ref : proteinRefs) + { + DBRefEntry cdsToProteinRef = new DBRefEntry(ref); + cdsToProteinRef.setMap(new Mapping(proteinProduct, + cdsToProteinMap)); + cdsSeqDss.addDBRef(cdsToProteinRef); + } + } /* * add another mapping from original 'from' range to CDS */ - map = new MapList(aMapping.getMap().getFromRanges(), cdsRange, 1, + AlignedCodonFrame dnaToCdsMapping = new AlignedCodonFrame(); + MapList dnaToCdsMap = new MapList(mapList.getFromRanges(), + cdsRange, 1, 1); - cdsMappings.addMap(seq.getDatasetSequence(), cdsSeq, map); + dnaToCdsMapping.addMap(dnaSeq.getDatasetSequence(), cdsSeq, + dnaToCdsMap); + if (!mappings.contains(dnaToCdsMapping)) + { + mappings.add(dnaToCdsMapping); + } - alignmentMappings.add(cdsMappings); + /* + * add DBRef with mapping from protein to CDS + * (this enables Get Cross-References from protein alignment) + * This is tricky because we can't have two DBRefs with the + * same source and accession, so need a different accession for + * the CDS from the dna sequence + */ + DBRefEntryI dnaRef = dnaDss.getSourceDBRef(); + if (dnaRef != null) + { + // assuming cds version same as dna ?!? + DBRefEntry proteinToCdsRef = new DBRefEntry(dnaRef.getSource(), + dnaRef.getVersion(), cdsSeq.getName()); + proteinToCdsRef.setMap(new Mapping(cdsSeqDss, cdsToProteinMap + .getInverse())); + proteinProduct.addDBRef(proteinToCdsRef); + } /* * transfer any features on dna that overlap the CDS */ - transferFeatures(seq, cdsSeq, map, null, SequenceOntologyI.CDS); + transferFeatures(dnaSeq, cdsSeq, cdsToProteinMap, null, + SequenceOntologyI.CDS); } } } + AlignmentI cds = new Alignment(cdsSeqs.toArray(new SequenceI[cdsSeqs + .size()])); + cds.setDataset(dataset); + + return cds; + } + + /** + * A helper method that finds a CDS sequence in the alignment dataset that is + * mapped to the given protein sequence, and either is, or has a mapping from, + * the given dna sequence. + * + * @param mappings + * set of all mappings on the dataset + * @param dnaSeq + * a dna (or cds) sequence we are searching from + * @param seqMappings + * the set of mappings involving dnaSeq + * @param aMapping + * an initial candidate from seqMappings + * @return + */ + static SequenceI findCdsForProtein(List mappings, + SequenceI dnaSeq, List seqMappings, + Mapping aMapping) + { + /* + * TODO a better dna-cds-protein mapping data representation to allow easy + * navigation; until then this clunky looping around lists of mappings + */ + SequenceI seqDss = dnaSeq.getDatasetSequence() == null ? dnaSeq + : dnaSeq.getDatasetSequence(); + SequenceI proteinProduct = aMapping.getTo(); + /* - * add CDS seqs to shared dataset + * is this mapping from the whole dna sequence (i.e. CDS)? + * allowing for possible stop codon on dna but not peptide */ - Alignment dataset = al.getDataset(); - for (SequenceI seq : cdsSeqs) + int mappedFromLength = MappingUtils.getLength(aMapping.getMap() + .getFromRanges()); + int dnaLength = seqDss.getLength(); + if (mappedFromLength == dnaLength || mappedFromLength == dnaLength - 3) { - if (!dataset.getSequences().contains(seq.getDatasetSequence())) + return seqDss; + } + + /* + * looks like we found the dna-to-protein mapping; search for the + * corresponding cds-to-protein mapping + */ + List mappingsToPeptide = MappingUtils + .findMappingsForSequence(proteinProduct, mappings); + for (AlignedCodonFrame acf : mappingsToPeptide) + { + for (SequenceToSequenceMapping map : acf.getMappings()) { - dataset.addSequence(seq.getDatasetSequence()); + Mapping mapping = map.getMapping(); + if (mapping != aMapping && mapping.getMap().getFromRatio() == 3 + && proteinProduct == mapping.getTo() + && seqDss != map.getFromSeq()) + { + mappedFromLength = MappingUtils.getLength(mapping.getMap() + .getFromRanges()); + if (mappedFromLength == map.getFromSeq().getLength()) + { + /* + * found a 3:1 mapping to the protein product which covers + * the whole dna sequence i.e. is from CDS; finally check it + * is from the dna start sequence + */ + SequenceI cdsSeq = map.getFromSeq(); + List dnaToCdsMaps = MappingUtils + .findMappingsForSequence(cdsSeq, seqMappings); + if (!dnaToCdsMaps.isEmpty()) + { + return cdsSeq; + } + } + } } } - AlignmentI cds = new Alignment(cdsSeqs.toArray(new SequenceI[cdsSeqs - .size()])); - cds.setDataset(dataset); - - return cds; + return null; } /** @@ -1476,7 +1856,7 @@ public class AlignmentUtils * * @param seq * @param mapping - * @return + * @return CDS sequence (as a dataset sequence) */ static SequenceI makeCdsSequence(SequenceI seq, Mapping mapping) { @@ -1506,9 +1886,15 @@ public class AlignmentUtils } } - SequenceI newSeq = new Sequence(seq.getName() + "|" - + mapping.getTo().getName(), newSeqChars, 1, newPos); - newSeq.createDatasetSequence(); + /* + * assign 'from id' held in the mapping if set (e.g. EMBL protein_id), + * else generate a sequence name + */ + String mapFromId = mapping.getMappedFromId(); + String seqId = "CDS|" + (mapFromId != null ? mapFromId : seq.getName()); + SequenceI newSeq = new Sequence(seqId, newSeqChars, 1, newPos); + // newSeq.setDescription(mapFromId); + return newSeq; } @@ -1794,17 +2180,20 @@ public class AlignmentUtils * sort to get sequence features in start position order * - would be better to store in Sequence as a TreeSet or NCList? */ - Arrays.sort(peptide.getSequenceFeatures(), - new Comparator() - { - @Override - public int compare(SequenceFeature o1, SequenceFeature o2) + if (peptide.getSequenceFeatures() != null) + { + Arrays.sort(peptide.getSequenceFeatures(), + new Comparator() { - int c = Integer.compare(o1.getBegin(), o2.getBegin()); - return c == 0 ? Integer.compare(o1.getEnd(), o2.getEnd()) - : c; - } - }); + @Override + public int compare(SequenceFeature o1, SequenceFeature o2) + { + int c = Integer.compare(o1.getBegin(), o2.getBegin()); + return c == 0 ? Integer.compare(o1.getEnd(), o2.getEnd()) + : c; + } + }); + } return count; } @@ -1927,11 +2316,15 @@ public class AlignmentUtils .codonTranslate(codon)); if (trans != null && !trans.equals(residue)) { - String desc = residue + "->" + trans; + String residue3Char = StringUtils + .toSentenceCase(ResidueProperties.aa2Triplet.get(residue)); + String trans3Char = StringUtils + .toSentenceCase(ResidueProperties.aa2Triplet.get(trans)); + String desc = "p." + residue3Char + peptidePos + trans3Char; // set score to 0f so 'graduated colour' option is offered! JAL-2060 SequenceFeature sf = new SequenceFeature( SequenceOntologyI.SEQUENCE_VARIANT, desc, peptidePos, - peptidePos, 0f, null); + peptidePos, 0f, "Jalview"); StringBuilder attributes = new StringBuilder(32); String id = (String) var.variant.getValue(ID); if (id != null) @@ -2102,12 +2495,15 @@ public class AlignmentUtils * * @param seqs * @param xrefs + * @param dataset + * the alignment dataset shared by the new copy * @return */ public static AlignmentI makeCopyAlignment(SequenceI[] seqs, - SequenceI[] xrefs) + SequenceI[] xrefs, AlignmentI dataset) { AlignmentI copy = new Alignment(new Alignment(seqs)); + copy.setDataset(dataset); SequenceIdMatcher matcher = new SequenceIdMatcher(seqs); if (xrefs != null) @@ -2153,19 +2549,32 @@ public class AlignmentUtils */ public static int alignAs(AlignmentI unaligned, AlignmentI aligned) { + /* + * easy case - aligning a copy of aligned sequences + */ + if (alignAsSameSequences(unaligned, aligned)) + { + return unaligned.getHeight(); + } + + /* + * fancy case - aligning via mappings between sequences + */ List unmapped = new ArrayList(); Map> columnMap = buildMappedColumnsMap( unaligned, aligned, unmapped); int width = columnMap.size(); char gap = unaligned.getGapCharacter(); int realignedCount = 0; + // TODO: verify this loop scales sensibly for very wide/high alignments for (SequenceI seq : unaligned.getSequences()) { if (!unmapped.contains(seq)) { char[] newSeq = new char[width]; - Arrays.fill(newSeq, gap); + Arrays.fill(newSeq, gap); // JBPComment - doubt this is faster than the + // Integer iteration below int newCol = 0; int lastCol = 0; @@ -2197,6 +2606,7 @@ public class AlignmentUtils System.arraycopy(newSeq, 0, tmp, 0, lastCol + 1); newSeq = tmp; } + // TODO: optimise SequenceI to avoid char[]->String->char[] seq.setSequence(String.valueOf(newSeq)); realignedCount++; } @@ -2205,6 +2615,64 @@ public class AlignmentUtils } /** + * If unaligned and aligned sequences share the same dataset sequences, then + * simply copies the aligned sequences to the unaligned sequences and returns + * true; else returns false + * + * @param unaligned + * - sequences to be aligned based on aligned + * @param aligned + * - 'guide' alignment containing sequences derived from same dataset + * as unaligned + * @return + */ + static boolean alignAsSameSequences(AlignmentI unaligned, + AlignmentI aligned) + { + if (aligned.getDataset() == null || unaligned.getDataset() == null) + { + return false; // should only pass alignments with datasets here + } + + // map from dataset sequence to alignment sequence + Map alignedDatasets = new HashMap(); + for (SequenceI seq : aligned.getSequences()) + { + // JAL-2110: fail if two or more alignment sequences have a common dataset + // sequence. + alignedDatasets.put(seq.getDatasetSequence(), seq); + } + + /* + * first pass - check whether all sequences to be aligned share a dataset + * sequence with an aligned sequence + */ + for (SequenceI seq : unaligned.getSequences()) + { + if (!alignedDatasets.containsKey(seq.getDatasetSequence())) + { + return false; + } + } + + /* + * second pass - copy aligned sequences + */ + for (SequenceI seq : unaligned.getSequences()) + { + SequenceI alignedSequence = alignedDatasets.get(seq + .getDatasetSequence()); + // JAL-2110: fail if two or more alignment sequences have common dataset + // sequence. + // TODO: getSequenceAsString() will be deprecated in the future + // TODO: need to leave to SequenceI implementor to update gaps + seq.setSequence(alignedSequence.getSequenceAsString()); + } + + return true; + } + + /** * Returns a map whose key is alignment column number (base 1), and whose * values are a map of sequence characters in that column. * @@ -2218,13 +2686,13 @@ public class AlignmentUtils { /* * Map will hold, for each aligned column position, a map of - * {unalignedSequence, sequenceCharacter} at that position. + * {unalignedSequence, characterPerSequence} at that position. * TreeMap keeps the entries in ascending column order. */ Map> map = new TreeMap>(); /* - * r any sequences that have no mapping so can't be realigned + * record any sequences that have no mapping so can't be realigned */ unmapped.addAll(unaligned.getSequences()); @@ -2273,6 +2741,15 @@ public class AlignmentUtils return false; } + /* + * invert mapping if it is from unaligned to aligned sequence + */ + if (seqMap.getTo() == fromSeq.getDatasetSequence()) + { + seqMap = new Mapping(seq.getDatasetSequence(), seqMap.getMap() + .getInverse()); + } + char[] fromChars = fromSeq.getSequence(); int toStart = seq.getStart(); char[] toChars = seq.getSequence(); @@ -2306,7 +2783,8 @@ public class AlignmentUtils * of the next character of the mapped-to sequence; stop when all * the characters of the range have been counted */ - while (mappedCharPos <= range[1]) + while (mappedCharPos <= range[1] && fromCol <= fromChars.length + && fromCol >= 0) { if (!Comparison.isGap(fromChars[fromCol - 1])) { diff --git a/src/jalview/analysis/Conservation.java b/src/jalview/analysis/Conservation.java index d4ae57d..7b3ce25 100755 --- a/src/jalview/analysis/Conservation.java +++ b/src/jalview/analysis/Conservation.java @@ -235,10 +235,7 @@ public class Conservation c = '-'; } - if (!canonicaliseAa && 'a' <= c && c <= 'z') - { - c -= (32); // 32 = 'a' - 'A' - } + c = toUpperCase(c); } values[c]++; } @@ -326,6 +323,7 @@ public class Conservation } else { + c = toUpperCase(c); nres++; if (nres == 1) @@ -347,6 +345,22 @@ public class Conservation } /** + * Returns the upper-cased character if between 'a' and 'z', else the + * unchanged value + * + * @param c + * @return + */ + char toUpperCase(char c) + { + if ('a' <= c && c <= 'z') + { + c -= (32); // 32 = 'a' - 'A' + } + return c; + } + + /** * Calculates the conservation sequence * * @param consflag diff --git a/src/jalview/analysis/CrossRef.java b/src/jalview/analysis/CrossRef.java index 7e77fc1..288d60e 100644 --- a/src/jalview/analysis/CrossRef.java +++ b/src/jalview/analysis/CrossRef.java @@ -24,23 +24,21 @@ import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefEntry; -import jalview.datamodel.DBRefSource; import jalview.datamodel.Mapping; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.util.DBRefUtils; import jalview.util.MapList; -import jalview.ws.SequenceFetcher; +import jalview.ws.SequenceFetcherFactory; import jalview.ws.seqfetcher.ASequenceFetcher; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; -import java.util.Vector; /** - * Functions for cross-referencing sequence databases. user must first specify - * if cross-referencing from protein or dna (set dna==true) + * Functions for cross-referencing sequence databases. * * @author JimP * @@ -48,195 +46,173 @@ import java.util.Vector; public class CrossRef { /* - * A sub-class that ignores Parent attribute when comparing sequence - * features. This avoids 'duplicate' CDS features that only - * differ in their parent Transcript ids. + * the dataset of the alignment for which we are searching for + * cross-references; in some cases we may resolve xrefs by + * searching in the dataset */ - class MySequenceFeature extends SequenceFeature - { - private SequenceFeature feat; + private AlignmentI dataset; - MySequenceFeature(SequenceFeature sf) - { - this.feat = sf; - } + /* + * the sequences for which we are seeking cross-references + */ + private SequenceI[] fromSeqs; - @Override - public boolean equals(Object o) - { - return feat.equals(o, true); - } - } + /** + * matcher built from dataset + */ + SequenceIdMatcher matcher; /** - * Select just the DNA or protein references for a protein or dna sequence - * - * @param fromDna - * if true, select references from DNA (i.e. Protein databases), else - * DNA database references - * @param refs - * a set of references to select from - * @return + * sequences found by cross-ref searches to fromSeqs */ - public static DBRefEntry[] findXDbRefs(boolean fromDna, DBRefEntry[] refs) - { - return DBRefUtils.selectRefs(refs, fromDna ? DBRefSource.PROTEINDBS - : DBRefSource.DNACODINGDBS); - // could attempt to find other cross - // refs here - ie PDB xrefs - // (not dna, not protein seq) - } + List rseqs; /** - * @param dna - * true if seqs are DNA seqs + * Constructor + * * @param seqs - * @return a list of sequence database cross reference source types + * the sequences for which we are seeking cross-references + * @param ds + * the containing alignment dataset (may be searched to resolve + * cross-references) */ - public static String[] findSequenceXrefTypes(boolean dna, SequenceI[] seqs) + public CrossRef(SequenceI[] seqs, AlignmentI ds) { - return findSequenceXrefTypes(dna, seqs, null); + fromSeqs = seqs; + dataset = ds.getDataset() == null ? ds : ds.getDataset(); } /** - * Indirect references are references from other sequences from the dataset to - * any of the direct DBRefEntrys on the given sequences. + * Returns a list of distinct database sources for which sequences have either + *
          + *
        • a (dna-to-protein or protein-to-dna) cross-reference
        • + *
        • an indirect cross-reference - a (dna-to-protein or protein-to-dna) + * reference from another sequence in the dataset which has a cross-reference + * to a direct DBRefEntry on the given sequence
        • + *
        * * @param dna - * true if seqs are DNA seqs - * @param seqs - * @return a list of sequence database cross reference source types + * - when true, cross-references *from* dna returned. When false, + * cross-references *from* protein are returned + * @return */ - public static String[] findSequenceXrefTypes(boolean dna, - SequenceI[] seqs, AlignmentI dataset) + public List findXrefSourcesForSequences(boolean dna) { - String[] dbrefs = null; - List refs = new ArrayList(); - for (SequenceI seq : seqs) + List sources = new ArrayList(); + for (SequenceI seq : fromSeqs) { if (seq != null) { - SequenceI dss = seq; - while (dss.getDatasetSequence() != null) - { - dss = dss.getDatasetSequence(); - } - DBRefEntry[] rfs = findXDbRefs(dna, dss.getDBRefs()); - if (rfs != null) - { - for (DBRefEntry ref : rfs) - { - if (!refs.contains(ref.getSource())) - { - refs.add(ref.getSource()); - } - } - } - if (dataset != null) - { - // search for references to this sequence's direct references. - DBRefEntry[] lrfs = CrossRef.findXDbRefs(!dna, seq.getDBRefs()); - List rseqs = new ArrayList(); - CrossRef.searchDatasetXrefs(seq, !dna, lrfs, dataset, rseqs, - null); // don't need to specify codon frame for mapping here - for (SequenceI rs : rseqs) - { - DBRefEntry[] xrs = findXDbRefs(dna, rs.getDBRefs()); - if (xrs != null) - { - for (DBRefEntry ref : xrs) - { - if (!refs.contains(ref.getSource())) - { - refs.add(ref.getSource()); - } - } - } - // looks like copy and paste - change rfs to xrs? - // for (int r = 0; rfs != null && r < rfs.length; r++) - // { - // if (!refs.contains(rfs[r].getSource())) - // { - // refs.add(rfs[r].getSource()); - // } - // } - } - } + findXrefSourcesForSequence(seq, dna, sources); } } - if (refs.size() > 0) - { - dbrefs = new String[refs.size()]; - refs.toArray(dbrefs); - } - return dbrefs; + return sources; } - public static boolean hasCdnaMap(SequenceI[] seqs) + /** + * Returns a list of distinct database sources for which a sequence has either + *
          + *
        • a (dna-to-protein or protein-to-dna) cross-reference
        • + *
        • an indirect cross-reference - a (dna-to-protein or protein-to-dna) + * reference from another sequence in the dataset which has a cross-reference + * to a direct DBRefEntry on the given sequence
        • + *
        + * + * @param seq + * the sequence whose dbrefs we are searching against + * @param fromDna + * when true, context is DNA - so sources identifying protein + * products will be returned. + * @param sources + * a list of sources to add matches to + */ + void findXrefSourcesForSequence(SequenceI seq, boolean fromDna, + List sources) { - // TODO unused - remove? - String[] reftypes = findSequenceXrefTypes(false, seqs); - for (int s = 0; s < reftypes.length; s++) + /* + * first find seq's xrefs (dna-to-peptide or peptide-to-dna) + */ + DBRefEntry[] rfs = DBRefUtils.selectDbRefs(!fromDna, seq.getDBRefs()); + addXrefsToSources(rfs, sources); + if (dataset != null) { - if (reftypes.equals(DBRefSource.EMBLCDS)) + /* + * find sequence's direct (dna-to-dna, peptide-to-peptide) xrefs + */ + DBRefEntry[] lrfs = DBRefUtils.selectDbRefs(fromDna, seq.getDBRefs()); + List foundSeqs = new ArrayList(); + + /* + * find sequences in the alignment which xref one of these DBRefs + * i.e. is xref-ed to a common sequence identifier + */ + searchDatasetXrefs(fromDna, seq, lrfs, foundSeqs, null); + + /* + * add those sequences' (dna-to-peptide or peptide-to-dna) dbref sources + */ + for (SequenceI rs : foundSeqs) { - return true; - // no map + DBRefEntry[] xrs = DBRefUtils + .selectDbRefs(!fromDna, rs.getDBRefs()); + addXrefsToSources(xrs, sources); } } - return false; } - public static SequenceI[] getCdnaMap(SequenceI[] seqs) + /** + * Helper method that adds the source identifiers of some cross-references to + * a (non-redundant) list of database sources + * + * @param xrefs + * @param sources + */ + void addXrefsToSources(DBRefEntry[] xrefs, List sources) { - // TODO unused - remove? - Vector cseqs = new Vector(); - for (int s = 0; s < seqs.length; s++) + if (xrefs != null) { - DBRefEntry[] cdna = findXDbRefs(true, seqs[s].getDBRefs()); - for (int c = 0; c < cdna.length; c++) + for (DBRefEntry ref : xrefs) { - if (cdna[c].getSource().equals(DBRefSource.EMBLCDS)) + /* + * avoid duplication e.g. ENSEMBL and Ensembl + */ + String source = DBRefUtils.getCanonicalName(ref.getSource()); + if (!sources.contains(source)) { - System.err - .println("TODO: unimplemented sequence retrieval for coding region sequence."); - // TODO: retrieve CDS dataset sequences - // need global dataset sequence retriever/resolver to reuse refs - // and construct Mapping entry. - // insert gaps in CDS according to peptide gaps. - // add gapped sequence to cseqs + sources.add(source); } } } - if (cseqs.size() > 0) - { - SequenceI[] rsqs = new SequenceI[cseqs.size()]; - cseqs.copyInto(rsqs); - return rsqs; - } - return null; - } /** + * Attempts to find cross-references from the sequences provided in the + * constructor to the given source database. Cross-references may be found + *
          + *
        • in dbrefs on the sequence which hold a mapping to a sequence + *
            + *
          • provided with a fetched sequence (e.g. ENA translation), or
          • + *
          • populated previously after getting cross-references
          • + *
          + *
        • as other sequences in the alignment which share a dbref identifier with + * the sequence
        • + *
        • by fetching from the remote database
        • + *
        + * The cross-referenced sequences, and mappings to them, are added to the + * alignment dataset. * - * @param seqs - * sequences whose xrefs are being retrieved - * @param dna - * true if sequences are nucleotide * @param source - * @param al - * alignment to search for cross-referenced sequences (and possibly - * add to) - * @return products (as dataset sequences) + * @return cross-referenced sequences (as dataset sequences) */ - public static Alignment findXrefSequences(SequenceI[] seqs, - final boolean dna, final String source, AlignmentI al) + public Alignment findXrefSequences(String source, boolean fromDna) { - AlignmentI dataset = al.getDataset() == null ? al : al.getDataset(); - List rseqs = new ArrayList(); + + rseqs = new ArrayList(); AlignedCodonFrame cf = new AlignedCodonFrame(); - for (SequenceI seq : seqs) + matcher = new SequenceIdMatcher( + dataset.getSequences()); + + for (SequenceI seq : fromSeqs) { SequenceI dss = seq; while (dss.getDatasetSequence() != null) @@ -244,242 +220,389 @@ public class CrossRef dss = dss.getDatasetSequence(); } boolean found = false; - DBRefEntry[] xrfs = CrossRef.findXDbRefs(dna, dss.getDBRefs()); + DBRefEntry[] xrfs = DBRefUtils + .selectDbRefs(!fromDna, dss.getDBRefs()); if ((xrfs == null || xrfs.length == 0) && dataset != null) { - System.out.println("Attempting to find ds Xrefs refs."); - // FIXME should be dss not seq here? - DBRefEntry[] lrfs = CrossRef.findXDbRefs(!dna, seq.getDBRefs()); - // less ambiguous would be a 'find primary dbRefEntry' method. - // filter for desired source xref here - found = CrossRef.searchDatasetXrefs(dss, !dna, lrfs, dataset, - rseqs, cf); + /* + * found no suitable dbrefs on sequence - look for sequences in the + * alignment which share a dbref with this one + */ + DBRefEntry[] lrfs = DBRefUtils.selectDbRefs(fromDna, + seq.getDBRefs()); + + /* + * find sequences (except this one!), of complementary type, + * which have a dbref to an accession id for this sequence, + * and add them to the results + */ + found = searchDatasetXrefs(fromDna, dss, lrfs, rseqs, cf); } - for (int r = 0; xrfs != null && r < xrfs.length; r++) + if (xrfs == null && !found) { - DBRefEntry xref = xrfs[r]; - if (source != null && !source.equals(xref.getSource())) - { - continue; - } + /* + * no dbref to source on this sequence or matched + * complementary sequence in the dataset + */ + continue; + } + List sourceRefs = DBRefUtils.searchRefsForSource(xrfs, + source); + Iterator refIterator = sourceRefs.iterator(); + while (refIterator.hasNext()) + { + DBRefEntry xref = refIterator.next(); + found = false; if (xref.hasMap()) { - if (xref.getMap().getTo() != null) + SequenceI mappedTo = xref.getMap().getTo(); + if (mappedTo != null) { - SequenceI rsq = new Sequence(xref.getMap().getTo()); + /* + * dbref contains the sequence it maps to; add it to the + * results unless we have done so already (could happen if + * fetching xrefs for sequences which have xrefs in common) + * for example: UNIPROT {P0CE19, P0CE20} -> EMBL {J03321, X06707} + */ + found = true; + /* + * problem: matcher.findIdMatch() is lenient - returns a sequence + * with a dbref to the search arg e.g. ENST for ENSP - wrong + * but findInDataset() matches ENSP when looking for Uniprot... + */ + SequenceI matchInDataset = findInDataset(xref); + /*matcher.findIdMatch(mappedTo);*/ + if (matchInDataset != null) + { + if (!rseqs.contains(matchInDataset)) + { + rseqs.add(matchInDataset); + } + refIterator.remove(); + continue; + } + SequenceI rsq = new Sequence(mappedTo); rseqs.add(rsq); - if (xref.getMap().getMap().getFromRatio() != xref - .getMap().getMap().getToRatio()) + if (xref.getMap().getMap().getFromRatio() != xref.getMap() + .getMap().getToRatio()) { // get sense of map correct for adding to product alignment. - if (dna) + if (fromDna) { // map is from dna seq to a protein product - cf.addMap(dss, rsq, xref.getMap().getMap()); + cf.addMap(dss, rsq, xref.getMap().getMap(), xref.getMap() + .getMappedFromId()); } else { // map should be from protein seq to its coding dna - cf.addMap(rsq, dss, xref.getMap().getMap().getInverse()); + cf.addMap(rsq, dss, xref.getMap().getMap().getInverse(), + xref.getMap().getMappedFromId()); } } - found = true; } } + if (!found) { - // do a bit more work - search for sequences with references matching - // xrefs on this sequence. - if (dataset != null) + SequenceI matchedSeq = matcher.findIdMatch(xref.getSource() + "|" + + xref.getAccessionId()); + if (matchedSeq != null) { - found |= searchDataset(dss, xref, dataset, rseqs, cf, false, - !dna); - if (found) + if (constructMapping(seq, matchedSeq, xref, cf, fromDna)) { - xrfs[r] = null; // we've recovered seqs for this one. + found = true; } } } + + if (!found) + { + // do a bit more work - search for sequences with references matching + // xrefs on this sequence. + found = searchDataset(fromDna, dss, xref, rseqs, cf, false); + } + if (found) + { + refIterator.remove(); + } + } + + /* + * fetch from source database any dbrefs we haven't resolved up to here + */ + if (!sourceRefs.isEmpty()) + { + retrieveCrossRef(sourceRefs, seq, xrfs, fromDna, cf); + } + } + + Alignment ral = null; + if (rseqs.size() > 0) + { + ral = new Alignment(rseqs.toArray(new SequenceI[rseqs.size()])); + if (!cf.isEmpty()) + { + dataset.addCodonFrame(cf); } - if (!found) + } + return ral; + } + + private void retrieveCrossRef(List sourceRefs, SequenceI seq, + DBRefEntry[] xrfs, boolean fromDna, AlignedCodonFrame cf) + { + ASequenceFetcher sftch = SequenceFetcherFactory.getSequenceFetcher(); + SequenceI[] retrieved = null; + SequenceI dss = seq.getDatasetSequence() == null ? seq : seq + .getDatasetSequence(); + try + { + retrieved = sftch.getSequences(sourceRefs, !fromDna); + } catch (Exception e) + { + System.err + .println("Problem whilst retrieving cross references for Sequence : " + + seq.getName()); + e.printStackTrace(); + } + + if (retrieved != null) + { + updateDbrefMappings(seq, xrfs, retrieved, cf, fromDna); + for (SequenceI retrievedSequence : retrieved) { - if (xrfs != null && xrfs.length > 0) + // dataset gets contaminated ccwith non-ds sequences. why ??! + // try: Ensembl -> Nuc->Ensembl, Nuc->Uniprot-->Protein->EMBL-> + SequenceI retrievedDss = retrievedSequence.getDatasetSequence() == null ? retrievedSequence + : retrievedSequence.getDatasetSequence(); + DBRefEntry[] dbr = retrievedSequence.getDBRefs(); + if (dbr != null) { - // Try and get the sequence reference... - /* - * Ideal world - we ask for a sequence fetcher implementation here if - * (jalview.io.RunTimeEnvironment.getSequenceFetcher()) ( - */ - ASequenceFetcher sftch = new SequenceFetcher(); - SequenceI[] retrieved = null; - int l = xrfs.length; - for (int r = 0; r < xrfs.length; r++) - { - // filter out any irrelevant or irretrievable references - if (xrfs[r] == null - || ((source != null && !source.equals(xrfs[r] - .getSource())) || !sftch.isFetchable(xrfs[r] - .getSource()))) - { - l--; - xrfs[r] = null; - } - } - if (l > 0) + for (DBRefEntry dbref : dbr) { - // System.out - // .println("Attempting to retrieve cross referenced sequences."); - DBRefEntry[] t = new DBRefEntry[l]; - l = 0; - for (int r = 0; r < xrfs.length; r++) + // find any entry where we should put in the sequence being + // cross-referenced into the map + Mapping map = dbref.getMap(); + if (map != null) { - if (xrfs[r] != null) + if (map.getTo() != null && map.getMap() != null) { - t[l++] = xrfs[r]; - } - } - xrfs = t; - try - { - retrieved = sftch.getSequences(xrfs, !dna); - // problem here is we don't know which of xrfs resulted in which - // retrieved element - } catch (Exception e) - { - System.err - .println("Problem whilst retrieving cross references for Sequence : " - + seq.getName()); - e.printStackTrace(); - } - - if (retrieved != null) - { - updateDbrefMappings(dna, seq, xrfs, retrieved, cf); - - SequenceIdMatcher matcher = new SequenceIdMatcher( - dataset.getSequences()); - List copiedFeatures = new ArrayList(); - CrossRef me = new CrossRef(); - for (int rs = 0; rs < retrieved.length; rs++) - { - // TODO: examine each sequence for 'redundancy' - DBRefEntry[] dbr = retrieved[rs].getDBRefs(); - if (dbr != null && dbr.length > 0) + // TODO findInDataset requires exact sequence match but + // 'congruent' test is only for the mapped part + // maybe not a problem in practice since only ENA provide a + // mapping and it is to the full protein translation of CDS + SequenceI matched = findInDataset(dbref); + // matcher.findIdMatch(map.getTo()); + if (matched != null) { - for (int di = 0; di < dbr.length; di++) + /* + * already got an xref to this sequence; update this + * map to point to the same sequence, and add + * any new dbrefs to it + */ + DBRefEntry[] toRefs = map.getTo().getDBRefs(); + if (toRefs != null) { - // find any entry where we should put in the sequence being - // cross-referenced into the map - Mapping map = dbr[di].getMap(); - if (map != null) + for (DBRefEntry ref : toRefs) { - if (map.getTo() != null && map.getMap() != null) + matched.addDBRef(ref); // add or update mapping + } + } + map.setTo(matched); + } + else + { + matcher.add(map.getTo()); + } + try + { + // compare ms with dss and replace with dss in mapping + // if map is congruent + SequenceI ms = map.getTo(); + int sf = map.getMap().getToLowest(); + int st = map.getMap().getToHighest(); + SequenceI mappedrg = ms.getSubSequence(sf, st); + // SequenceI loc = dss.getSubSequence(sf, st); + if (mappedrg.getLength() > 0 + && ms.getSequenceAsString().equals( + dss.getSequenceAsString())) + // && mappedrg.getSequenceAsString().equals( + // loc.getSequenceAsString())) + { + String msg = "Mapping updated from " + ms.getName() + + " to retrieved crossreference " + + dss.getName(); + System.out.println(msg); + map.setTo(dss); + + /* + * give the reverse reference the inverse mapping + * (if it doesn't have one already) + */ + setReverseMapping(dss, dbref, cf); + + /* + * copy sequence features as well, avoiding + * duplication (e.g. same variation from two + * transcripts) + */ + SequenceFeature[] sfs = ms.getSequenceFeatures(); + if (sfs != null) + { + for (SequenceFeature feat : sfs) { - SequenceI matched = matcher - .findIdMatch(map.getTo()); - if (matched != null) - { - /* - * already got an xref to this sequence; update this - * map to point to the same sequence, and add - * any new dbrefs to it - */ - for (DBRefEntry ref : map.getTo().getDBRefs()) - { - matched.addDBRef(ref); // add or update mapping - } - map.setTo(matched); - } - else + /* + * make a flyweight feature object which ignores Parent + * attribute in equality test; this avoids creating many + * otherwise duplicate exon features on genomic sequence + */ + SequenceFeature newFeature = new SequenceFeature( + feat) { - matcher.add(map.getTo()); - } - try - { - // compare ms with dss and replace with dss in mapping - // if map is congruent - SequenceI ms = map.getTo(); - int sf = map.getMap().getToLowest(); - int st = map.getMap().getToHighest(); - SequenceI mappedrg = ms.getSubSequence(sf, st); - // SequenceI loc = dss.getSubSequence(sf, st); - if (mappedrg.getLength() > 0 - && ms.getSequenceAsString().equals( - dss.getSequenceAsString())) - // && mappedrg.getSequenceAsString().equals( - // loc.getSequenceAsString())) - { - String msg = "Mapping updated from " - + ms.getName() - + " to retrieved crossreference " - + dss.getName(); - System.out.println(msg); - // method to update all refs of existing To on - // retrieved sequence with dss and merge any props - // on To onto dss. - map.setTo(dss); - /* - * copy sequence features as well, avoiding - * duplication (e.g. same variation from 2 - * transcripts) - */ - SequenceFeature[] sfs = ms - .getSequenceFeatures(); - if (sfs != null) - { - for (SequenceFeature feat : sfs) - { - /* - * we override SequenceFeature.equals here (but - * not elsewhere) to ignore Parent attribute - * TODO not quite working yet! - */ - if (!copiedFeatures - .contains(me.new MySequenceFeature( - feat))) - { - dss.addSequenceFeature(feat); - copiedFeatures.add(feat); - } - } - } - cf.addMap(retrieved[rs].getDatasetSequence(), - dss, map.getMap()); - } - else + @Override + public boolean equals(Object o) { - cf.addMap(retrieved[rs].getDatasetSequence(), - map.getTo(), map.getMap()); + return super.equals(o, true); } - } catch (Exception e) - { - System.err - .println("Exception when consolidating Mapped sequence set..."); - e.printStackTrace(System.err); - } + }; + dss.addSequenceFeature(newFeature); } } } + cf.addMap(retrievedDss, map.getTo(), map.getMap()); + } catch (Exception e) + { + System.err + .println("Exception when consolidating Mapped sequence set..."); + e.printStackTrace(System.err); } - retrieved[rs].updatePDBIds(); - rseqs.add(retrieved[rs]); } } } } + retrievedSequence.updatePDBIds(); + rseqs.add(retrievedDss); + dataset.addSequence(retrievedDss); + matcher.add(retrievedDss); + } + } + } + /** + * Sets the inverse sequence mapping in the corresponding dbref of the mapped + * to sequence (if any). This is used after fetching a cross-referenced + * sequence, if the fetched sequence has a mapping to the original sequence, + * to set the mapping in the original sequence's dbref. + * + * @param mapFrom + * the sequence mapped from + * @param dbref + * @param mappings + */ + void setReverseMapping(SequenceI mapFrom, DBRefEntry dbref, + AlignedCodonFrame mappings) + { + SequenceI mapTo = dbref.getMap().getTo(); + if (mapTo == null) + { + return; + } + DBRefEntry[] dbrefs = mapTo.getDBRefs(); + if (dbrefs == null) + { + return; + } + for (DBRefEntry toRef : dbrefs) + { + if (toRef.hasMap() && mapFrom == toRef.getMap().getTo()) + { + /* + * found the reverse dbref; update its mapping if null + */ + if (toRef.getMap().getMap() == null) + { + MapList inverse = dbref.getMap().getMap().getInverse(); + toRef.getMap().setMap(inverse); + mappings.addMap(mapTo, mapFrom, inverse); + } } } + } - Alignment ral = null; - if (rseqs.size() > 0) + /** + * Returns the first identical sequence in the dataset if any, else null + * + * @param xref + * @return + */ + SequenceI findInDataset(DBRefEntry xref) + { + if (xref == null || !xref.hasMap() || xref.getMap().getTo() == null) { - ral = new Alignment(rseqs.toArray(new SequenceI[rseqs.size()])); - if (cf != null && !cf.isEmpty()) + return null; + } + SequenceI mapsTo = xref.getMap().getTo(); + String name = xref.getAccessionId(); + String name2 = xref.getSource() + "|" + name; + SequenceI dss = mapsTo.getDatasetSequence() == null ? mapsTo : mapsTo + .getDatasetSequence(); + for (SequenceI seq : dataset.getSequences()) + { + /* + * clumsy alternative to using SequenceIdMatcher which currently + * returns sequences with a dbref to the matched accession id + * which we don't want + */ + if (name.equals(seq.getName()) || seq.getName().startsWith(name2)) { - ral.addCodonFrame(cf); + if (sameSequence(seq, dss)) + { + return seq; + } } } - return ral; + return null; + } + + /** + * Answers true if seq1 and seq2 contain exactly the same characters (ignoring + * case), else false. This method compares the lengths, then each character in + * turn, in order to 'fail fast'. For case-sensitive comparison, it would be + * possible to use Arrays.equals(seq1.getSequence(), seq2.getSequence()). + * + * @param seq1 + * @param seq2 + * @return + */ + // TODO move to Sequence / SequenceI + static boolean sameSequence(SequenceI seq1, SequenceI seq2) + { + if (seq1 == seq2) + { + return true; + } + if (seq1 == null || seq2 == null) + { + return false; + } + char[] c1 = seq1.getSequence(); + char[] c2 = seq2.getSequence(); + if (c1.length != c2.length) + { + return false; + } + for (int i = 0; i < c1.length; i++) + { + int diff = c1[i] - c2[i]; + /* + * same char or differ in case only ('a'-'A' == 32) + */ + if (diff != 0 && diff != 32 && diff != -32) + { + return false; + } + } + return true; } /** @@ -487,62 +610,123 @@ public class CrossRef * retrieved sequence if found, and adds any new mappings to the * AlignedCodonFrame * - * @param dna * @param mapFrom * @param xrefs * @param retrieved * @param acf */ - static void updateDbrefMappings(boolean dna, SequenceI mapFrom, - DBRefEntry[] xrefs, SequenceI[] retrieved, AlignedCodonFrame acf) + void updateDbrefMappings(SequenceI mapFrom, DBRefEntry[] xrefs, + SequenceI[] retrieved, AlignedCodonFrame acf, boolean fromDna) { - SequenceIdMatcher matcher = new SequenceIdMatcher(retrieved); + SequenceIdMatcher idMatcher = new SequenceIdMatcher(retrieved); for (DBRefEntry xref : xrefs) { if (!xref.hasMap()) { String targetSeqName = xref.getSource() + "|" + xref.getAccessionId(); - SequenceI[] matches = matcher.findAllIdMatches(targetSeqName); + SequenceI[] matches = idMatcher.findAllIdMatches(targetSeqName); if (matches == null) { return; } for (SequenceI seq : matches) { - MapList mapping = null; - if (dna) - { - mapping = AlignmentUtils.mapCdnaToProtein(seq, mapFrom); - } - else - { - mapping = AlignmentUtils.mapCdnaToProtein(mapFrom, seq); - if (mapping != null) - { - mapping = mapping.getInverse(); - } - } - if (mapping != null) - { - xref.setMap(new Mapping(seq, mapping)); - if (dna) - { - AlignmentUtils.computeProteinFeatures(mapFrom, seq, mapping); - } - if (dna) - { - acf.addMap(mapFrom, seq, mapping); - } - else - { - acf.addMap(seq, mapFrom, mapping.getInverse()); - } - continue; - } + constructMapping(mapFrom, seq, xref, acf, fromDna); + } + } + } + } + + /** + * Tries to make a mapping between sequences. If successful, adds the mapping + * to the dbref and the mappings collection and answers true, otherwise + * answers false. The following methods of making are mapping are tried in + * turn: + *
          + *
        • if 'mapTo' holds a mapping to 'mapFrom', take the inverse; this is, for + * example, the case after fetching EMBL cross-references for a Uniprot + * sequence
        • + *
        • else check if the dna translates exactly to the protein (give or take + * start and stop codons>
        • + *
        • else try to map based on CDS features on the dna sequence
        • + *
        + * + * @param mapFrom + * @param mapTo + * @param xref + * @param mappings + * @return + */ + boolean constructMapping(SequenceI mapFrom, SequenceI mapTo, + DBRefEntry xref, AlignedCodonFrame mappings, boolean fromDna) + { + MapList mapping = null; + + /* + * look for a reverse mapping, if found make its inverse + */ + if (mapTo.getDBRefs() != null) + { + for (DBRefEntry dbref : mapTo.getDBRefs()) + { + String name = dbref.getSource() + "|" + dbref.getAccessionId(); + if (dbref.hasMap() && mapFrom.getName().startsWith(name)) + { + /* + * looks like we've found a map from 'mapTo' to 'mapFrom' + * - invert it to make the mapping the other way + */ + MapList reverse = dbref.getMap().getMap().getInverse(); + xref.setMap(new Mapping(mapTo, reverse)); + mappings.addMap(mapFrom, mapTo, reverse); + return true; } } } + + if (fromDna) + { + mapping = AlignmentUtils.mapCdnaToProtein(mapTo, mapFrom); + } + else + { + mapping = AlignmentUtils.mapCdnaToProtein(mapFrom, mapTo); + if (mapping != null) + { + mapping = mapping.getInverse(); + } + } + if (mapping == null) + { + return false; + } + xref.setMap(new Mapping(mapTo, mapping)); + + /* + * and add a reverse DbRef with the inverse mapping + */ + if (mapFrom.getDatasetSequence() != null + && mapFrom.getDatasetSequence().getSourceDBRef() != null) + { + DBRefEntry dbref = new DBRefEntry(mapFrom.getDatasetSequence() + .getSourceDBRef()); + dbref.setMap(new Mapping(mapFrom.getDatasetSequence(), mapping + .getInverse())); + mapTo.addDBRef(dbref); + } + + if (fromDna) + { + AlignmentUtils.computeProteinFeatures(mapFrom, mapTo, mapping); + mappings.addMap(mapFrom, mapTo, mapping); + } + else + { + mappings.addMap(mapTo, mapFrom, mapping.getInverse()); + } + + return true; } /** @@ -550,15 +734,16 @@ public class CrossRef * dataset (that is not equal to sequenceI) Identifies matching DBRefEntry * based on source and accession string only - Map and Version are nulled. * + * @param fromDna + * - true if context was searching from Dna sequences, false if + * context was searching from Protein sequences * @param sequenceI * @param lrfs - * @param dataset - * @param rseqs + * @param foundSeqs * @return true if matches were found. */ - private static boolean searchDatasetXrefs(SequenceI sequenceI, - boolean dna, DBRefEntry[] lrfs, AlignmentI dataset, - List rseqs, AlignedCodonFrame cf) + private boolean searchDatasetXrefs(boolean fromDna, SequenceI sequenceI, + DBRefEntry[] lrfs, List foundSeqs, AlignedCodonFrame cf) { boolean found = false; if (lrfs == null) @@ -571,50 +756,44 @@ public class CrossRef // add in wildcards xref.setVersion(null); xref.setMap(null); - found = searchDataset(sequenceI, xref, dataset, rseqs, cf, false, dna); + found |= searchDataset(fromDna, sequenceI, xref, foundSeqs, cf, false); } return found; } /** - * search a given sequence dataset for references matching cross-references to - * the given sequence - * - * @param sequenceI - * @param xrf - * @param dataset - * @param rseqs - * set of unique sequences - * @param cf - * @return true if one or more unique sequences were found and added - */ - public static boolean searchDataset(SequenceI sequenceI, DBRefEntry xrf, - AlignmentI dataset, List rseqs, AlignedCodonFrame cf) - { - return searchDataset(sequenceI, xrf, dataset, rseqs, cf, true, false); - } - - /** - * TODO: generalise to different protein classifications Search dataset for - * DBRefEntrys matching the given one (xrf) and add the associated sequence to - * rseq. + * Searches dataset for DBRefEntrys matching the given one (xrf) and adds the + * associated sequence to rseqs * - * @param sequenceI + * @param fromDna + * true if context was searching for refs *from* dna sequence, false + * if context was searching for refs *from* protein sequence + * @param fromSeq + * a sequence to ignore (start point of search) * @param xrf - * @param dataset - * @param rseqs + * a cross-reference to try to match + * @param foundSeqs + * result list to add to + * @param mappings + * a set of sequence mappings to add to * @param direct - * - search all references or only subset - * @param dna - * search dna or protein xrefs (if direct=false) + * - indicates the type of relationship between returned sequences, + * xrf, and sequenceI that is required. + *
          + *
        • direct implies xrf is a primary reference for sequenceI AND + * the sequences to be located (eg a uniprot ID for a protein + * sequence, and a uniprot ref on a transcript sequence).
        • + *
        • indirect means xrf is a cross reference with respect to + * sequenceI or all the returned sequences (eg a genomic reference + * associated with a locus and one or more transcripts)
        • + *
        * @return true if relationship found and sequence added. */ - public static boolean searchDataset(SequenceI sequenceI, DBRefEntry xrf, - AlignmentI dataset, List rseqs, AlignedCodonFrame cf, - boolean direct, boolean dna) + boolean searchDataset(boolean fromDna, SequenceI fromSeq, + DBRefEntry xrf, List foundSeqs, AlignedCodonFrame mappings, + boolean direct) { boolean found = false; - SequenceI[] typer = new SequenceI[1]; if (dataset == null) { return false; @@ -634,107 +813,84 @@ public class CrossRef if (nxt.getDatasetSequence() != null) { System.err - .println("Implementation warning: getProducts passed a dataset alignment without dataset sequences in it!"); + .println("Implementation warning: CrossRef initialised with a dataset alignment with non-dataset sequences in it! (" + + nxt.getDisplayId(true) + + " has ds reference " + + nxt.getDatasetSequence().getDisplayId(true) + + ")"); + } + if (nxt == fromSeq || nxt == fromSeq.getDatasetSequence()) + { + continue; } - if (nxt != sequenceI && nxt != sequenceI.getDatasetSequence()) + /* + * only look at same molecule type if 'direct', or + * complementary type if !direct + */ { - // check if this is the correct sequence type + boolean isDna = !nxt.isProtein(); + if (direct ? (isDna != fromDna) : (isDna == fromDna)) { - typer[0] = nxt; - boolean isDna = jalview.util.Comparison.isNucleotide(typer); - if ((direct && isDna == dna) || (!direct && isDna != dna)) - { - // skip this sequence because it is same molecule type - continue; - } + // skip this sequence because it is wrong molecule type + continue; } + } - // look for direct or indirect references in common - DBRefEntry[] poss = nxt.getDBRefs(), cands = null; - if (direct) - { - cands = jalview.util.DBRefUtils.searchRefs(poss, xrf); - } - else - { - poss = CrossRef.findXDbRefs(dna, poss); // - cands = jalview.util.DBRefUtils.searchRefs(poss, xrf); - } - if (cands != null) + // look for direct or indirect references in common + DBRefEntry[] poss = nxt.getDBRefs(); + List cands = null; + + // todo: indirect specifies we select either direct references to nxt + // that match xrf which is indirect to sequenceI, or indirect + // references to nxt that match xrf which is direct to sequenceI + cands = DBRefUtils.searchRefs(poss, xrf); + // else + // { + // poss = DBRefUtils.selectDbRefs(nxt.isProtein()!fromDna, poss); + // cands = DBRefUtils.searchRefs(poss, xrf); + // } + if (!cands.isEmpty()) + { + if (!foundSeqs.contains(nxt)) { - if (!rseqs.contains(nxt)) + found = true; + foundSeqs.add(nxt); + if (mappings != null && !direct) { - rseqs.add(nxt); - boolean foundmap = cf != null; - // don't search if we aren't given a codon map object - for (int r = 0; foundmap && r < cands.length; r++) + /* + * if the matched sequence has mapped dbrefs to + * protein product / cdna, add equivalent mappings to + * our source sequence + */ + for (DBRefEntry candidate : cands) { - if (cands[r].hasMap()) + Mapping mapping = candidate.getMap(); + if (mapping != null) { - if (cands[r].getMap().getTo() != null - && cands[r].getMap().getMap().getFromRatio() != cands[r] - .getMap().getMap().getToRatio()) + MapList map = mapping.getMap(); + if (mapping.getTo() != null + && map.getFromRatio() != map.getToRatio()) { - foundmap = true; - // get sense of map correct for adding to product - // alignment. - if (dna) + /* + * add a mapping, as from dna to peptide sequence + */ + if (map.getFromRatio() == 3) { - // map is from dna seq to a protein product - cf.addMap(sequenceI, nxt, cands[r].getMap() - .getMap()); + mappings.addMap(nxt, fromSeq, map); } else { - // map should be from protein seq to its coding dna - cf.addMap(nxt, sequenceI, cands[r].getMap() - .getMap().getInverse()); + mappings.addMap(nxt, fromSeq, map.getInverse()); } } } } - // TODO: add mapping between sequences if necessary - found = true; } } - } } } } return found; } - - /** - * precalculate different products that can be found for seqs in dataset and - * return them. - * - * @param dna - * @param seqs - * @param dataset - * @param fake - * - don't actually build lists - just get types - * @return public static Object[] buildXProductsList(boolean dna, SequenceI[] - * seqs, AlignmentI dataset, boolean fake) { String types[] = - * jalview.analysis.CrossRef.findSequenceXrefTypes( dna, seqs, - * dataset); if (types != null) { System.out.println("Xref Types for: - * "+(dna ? "dna" : "prot")); for (int t = 0; t < types.length; t++) { - * System.out.println("Type: " + types[t]); SequenceI[] prod = - * jalview.analysis.CrossRef.findXrefSequences(seqs, dna, types[t]); - * System.out.println("Found " + ((prod == null) ? "no" : "" + - * prod.length) + " products"); if (prod!=null) { for (int p=0; - * p s.length()) { @@ -357,5 +357,15 @@ public class SequenceIdMatcher .indexOf(s.charAt(id.length())) > -1)) : false; } } + + /** + * toString method returns the wrapped sequence id. For debugging purposes + * only, behaviour not guaranteed not to change. + */ + @Override + public String toString() + { + return id; + } } } diff --git a/src/jalview/api/AlignViewControllerI.java b/src/jalview/api/AlignViewControllerI.java index 17a1563..26966ba 100644 --- a/src/jalview/api/AlignViewControllerI.java +++ b/src/jalview/api/AlignViewControllerI.java @@ -64,7 +64,7 @@ public interface AlignViewControllerI * @return true if operation affected state */ boolean markColumnsContainingFeatures(boolean invert, - boolean extendCurrent, boolean clearColumns, String featureType); + boolean extendCurrent, boolean toggle, String featureType); /** * sort the alignment or current selection by average score over the given set diff --git a/src/jalview/api/AlignViewportI.java b/src/jalview/api/AlignViewportI.java index 45e77ba..8343f0b 100644 --- a/src/jalview/api/AlignViewportI.java +++ b/src/jalview/api/AlignViewportI.java @@ -235,11 +235,30 @@ public interface AlignViewportI extends ViewStyleI * This method returns the visible alignment as text, as seen on the GUI, ie * if columns are hidden they will not be returned in the result. Use this for * calculating trees, PCA, redundancy etc on views which contain hidden + * columns. This method doesn't exclude hidden sequences from the output. + * + * @param selectedRegionOnly + * - determines if only the selected region or entire alignment is + * exported + * @return String[] + */ + String[] getViewAsString(boolean selectedRegionOnly); + + /** + * This method returns the visible alignment as text, as seen on the GUI, ie + * if columns are hidden they will not be returned in the result. Use this for + * calculating trees, PCA, redundancy etc on views which contain hidden * columns. * + * @param selectedRegionOnly + * - determines if only the selected region or entire alignment is + * exported + * @param isExportHiddenSeqs + * - determines if hidden sequences would be exported or not. + * * @return String[] */ - String[] getViewAsString(boolean selectedRegionOnly); + String[] getViewAsString(boolean selectedRegionOnly, boolean isExportHiddenSeqs); void setSelectionGroup(SequenceGroup sg); @@ -376,5 +395,6 @@ public interface AlignViewportI extends ViewStyleI */ void setFollowHighlight(boolean b); + public void applyFeaturesStyle(FeatureSettingsModelI featureSettings); } diff --git a/src/jalview/api/DBRefEntryI.java b/src/jalview/api/DBRefEntryI.java index 9415745..2ce7e4a 100644 --- a/src/jalview/api/DBRefEntryI.java +++ b/src/jalview/api/DBRefEntryI.java @@ -2,6 +2,7 @@ package jalview.api; import jalview.datamodel.Mapping; +//JBPComment: this is a datamodel API - so it should be in datamodel (it's a peer of SequenceI) public interface DBRefEntryI { @@ -72,5 +73,27 @@ public interface DBRefEntryI */ public int getEndRes(); + /** + * access a mapping, if present that can be used to map positions from the + * associated dataset sequence to the DBRef's sequence frame. + * + * @return null or a valid mapping. + */ public Mapping getMap(); + + /** + * Answers true if this object is either equivalent to, or can be 'improved' + * by, the given entry. Specifically, answers true if + *
          + *
        • source and accession are identical
        • + *
        • version is identical, or this version is of the format "someSource:0", + * in which case the version for the other entry replaces it
        • + *
        • mappings are not compared but if this entry has no mapping, replace + * with that for the other entry
        • + *
        + * + * @param otherEntry + * @return + */ + public boolean updateFrom(DBRefEntryI otherEntry); } diff --git a/src/jalview/api/FeatureColourI.java b/src/jalview/api/FeatureColourI.java index d8363f4..1fcbfd0 100644 --- a/src/jalview/api/FeatureColourI.java +++ b/src/jalview/api/FeatureColourI.java @@ -1,13 +1,14 @@ package jalview.api; +import jalview.datamodel.SequenceFeature; + import java.awt.Color; public interface FeatureColourI { /** - * Answers true when either isColourByLabel, isAboveThreshold or - * isBelowThreshold answers true + * Answers true when the feature colour varies across the score range * * @return */ @@ -35,13 +36,22 @@ public interface FeatureColourI Color getMaxColour(); /** - * Answers true if the feature is coloured by label (description); only - * applicable when isGraduatedColour answers true + * Answers true if the feature has a single colour, i.e. if isColourByLabel() + * and isGraduatedColour() both answer false + * + * @return + */ + boolean isSimpleColour(); + + /** + * Answers true if the feature is coloured by label (description) * * @return */ boolean isColourByLabel(); + void setColourByLabel(boolean b); + /** * Answers true if the feature is coloured below a threshold value; only * applicable when isGraduatedColour answers true @@ -50,6 +60,8 @@ public interface FeatureColourI */ boolean isBelowThreshold(); + void setBelowThreshold(boolean b); + /** * Answers true if the feature is coloured above a threshold value; only * applicable when isGraduatedColour answers true @@ -58,14 +70,20 @@ public interface FeatureColourI */ boolean isAboveThreshold(); + void setAboveThreshold(boolean b); + /** - * Answers true if the threshold is the min (or max) of the colour range; only - * applicable when isGraduatedColour answers true + * Answers true if the threshold is the minimum value (when + * isAboveThreshold()) or maximum value (when isBelowThreshold()) of the + * colour range; only applicable when isGraduatedColour and either + * isAboveThreshold() or isBelowThreshold() answers true * * @return */ boolean isThresholdMinMax(); + void setThresholdMinMax(boolean b); + /** * Returns the threshold value (if any), else zero * @@ -73,10 +91,71 @@ public interface FeatureColourI */ float getThreshold(); + void setThreshold(float f); + + /** + * Answers true if the colour varies between the actual minimum and maximum + * score values of the feature, or false if between absolute minimum and + * maximum values (or if not a graduated colour). + * + * @return + */ + boolean isAutoScaled(); + + void setAutoScaled(boolean b); + + /** + * Returns the maximum score of the graduated colour range + * + * @return + */ + float getMax(); + + /** + * Returns the minimum score of the graduated colour range + * + * @return + */ + float getMin(); + + /** + * Answers true if either isAboveThreshold or isBelowThreshold answers true + * + * @return + */ + boolean hasThreshold(); + + /** + * Returns the computed colour for the given sequence feature + * + * @param feature + * @return + */ + Color getColor(SequenceFeature feature); + + /** + * Answers true if the feature has a simple colour, or is coloured by label, + * or has a graduated colour and the score of this feature instance is within + * the range to render (if any), i.e. does not lie below or above any + * threshold set. + * + * @param feature + * @return + */ + boolean isColored(SequenceFeature feature); + + /** + * Update the min-max range for a graduated colour scheme + * + * @param min + * @param max + */ + void updateBounds(float min, float max); + /** - * Answers true if ? + * Returns the colour in Jalview features file format * * @return */ - boolean isLowToHigh(); + String toJalviewFormat(String featureType); } diff --git a/src/jalview/api/FeatureRenderer.java b/src/jalview/api/FeatureRenderer.java index 5b15cad..dbc9880 100644 --- a/src/jalview/api/FeatureRenderer.java +++ b/src/jalview/api/FeatureRenderer.java @@ -60,17 +60,15 @@ public interface FeatureRenderer * @param ft * @return display style for a feature */ - Object getFeatureStyle(String ft); + FeatureColourI getFeatureStyle(String ft); /** * update the feature style for a particular feature * * @param ft * @param ggc - * - currently allows java.awt.Color and - * jalview.schemes.GraduatedColor */ - void setColour(String ft, Object ggc); + void setColour(String ft, FeatureColourI ggc); AlignViewportI getViewport(); @@ -85,7 +83,7 @@ public interface FeatureRenderer * * @return */ - Map getFeatureColours(); + Map getFeatureColours(); /** * query the alignment view to find all features @@ -100,7 +98,7 @@ public interface FeatureRenderer * * @return */ - Map getDisplayedFeatureCols(); + Map getDisplayedFeatureCols(); /** * get all registered groups @@ -143,12 +141,6 @@ public interface FeatureRenderer List findFeaturesAtRes(SequenceI sequence, int res); /** - * - * @return true if the rendering platform supports transparency - */ - boolean isTransparencyAvailable(); - - /** * get current displayed types, in ordering of rendering (on top last) * * @return a (possibly empty) list of feature types diff --git a/src/jalview/api/SiftsClientI.java b/src/jalview/api/SiftsClientI.java index e2fac14..dad434a 100644 --- a/src/jalview/api/SiftsClientI.java +++ b/src/jalview/api/SiftsClientI.java @@ -29,6 +29,8 @@ import jalview.xml.binding.sifts.Entry.Entity; import java.util.HashMap; import java.util.HashSet; +// JBPComment: this isn't a top-level Jalview API - should be in its own package api + public interface SiftsClientI { /** @@ -45,12 +47,6 @@ public interface SiftsClientI */ public String getDbCoordSys(); - /** - * Get DB Evidence for the SIFTs Entry - * - * @return - */ - public String getDbEvidence(); /** * Get DB Source for the SIFTs Entry @@ -99,13 +95,6 @@ public interface SiftsClientI public boolean isAccessionMatched(String accessionId); /** - * Get the standard DB referenced by the SIFTs Entry - * - * @return - */ - public String[] getEntryDBs(); - - /** * * @param mop * MappingOutputPojo diff --git a/src/jalview/appletgui/APopupMenu.java b/src/jalview/appletgui/APopupMenu.java index 748954a..948c8e5 100644 --- a/src/jalview/appletgui/APopupMenu.java +++ b/src/jalview/appletgui/APopupMenu.java @@ -537,6 +537,7 @@ public class APopupMenu extends java.awt.PopupMenu implements MenuItem item = new MenuItem(label); item.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(ActionEvent e) { ap.alignFrame.showURL(url, target); @@ -545,6 +546,7 @@ public class APopupMenu extends java.awt.PopupMenu implements linkMenu.add(item); } + @Override public void itemStateChanged(ItemEvent evt) { if (evt.getSource() == abovePIDColour) @@ -569,6 +571,7 @@ public class APopupMenu extends java.awt.PopupMenu implements } } + @Override public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); @@ -1299,35 +1302,7 @@ public class APopupMenu extends java.awt.PopupMenu implements void hideSequences(boolean representGroup) { - SequenceGroup sg = ap.av.getSelectionGroup(); - if (sg == null || sg.getSize() < 1) - { - ap.av.hideSequence(new SequenceI[] { seq }); - return; - } - - ap.av.setSelectionGroup(null); - - if (representGroup) - { - ap.av.hideRepSequences(seq, sg); - - return; - } - - int gsize = sg.getSize(); - SequenceI[] hseqs; - - hseqs = new SequenceI[gsize]; - - int index = 0; - for (int i = 0; i < gsize; i++) - { - hseqs[index++] = sg.getSequenceAt(i); - } - - ap.av.hideSequence(hseqs); - ap.av.sendSelection(); + ap.av.hideSequences(seq, representGroup); } /** diff --git a/src/jalview/appletgui/AlignFrame.java b/src/jalview/appletgui/AlignFrame.java index e5f0053..8f1f2fd 100644 --- a/src/jalview/appletgui/AlignFrame.java +++ b/src/jalview/appletgui/AlignFrame.java @@ -25,6 +25,7 @@ import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder; import jalview.api.AlignViewControllerGuiI; import jalview.api.AlignViewControllerI; import jalview.api.AlignViewportI; +import jalview.api.FeatureColourI; import jalview.api.FeatureRenderer; import jalview.api.FeatureSettingsControllerI; import jalview.api.SequenceStructureBinding; @@ -367,7 +368,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, boolean featuresFile = false; try { - Map colours = alignPanel.seqPanel.seqCanvas + Map colours = alignPanel.seqPanel.seqCanvas .getFeatureRenderer().getFeatureColours(); boolean relaxedIdMatching = viewport.applet.getDefaultParameter( "relaxedidmatch", false); @@ -1399,7 +1400,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener, return annotation; } - private Map getDisplayedFeatureCols() + private Map getDisplayedFeatureCols() { if (alignPanel.getFeatureRenderer() != null && viewport.getFeaturesDisplayed() != null) diff --git a/src/jalview/appletgui/AnnotationLabels.java b/src/jalview/appletgui/AnnotationLabels.java index 5727e9c..b28ccc7 100755 --- a/src/jalview/appletgui/AnnotationLabels.java +++ b/src/jalview/appletgui/AnnotationLabels.java @@ -162,6 +162,7 @@ public class AnnotationLabels extends Panel implements ActionListener, return row; } + @Override public void actionPerformed(ActionEvent evt) { AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation(); @@ -261,6 +262,7 @@ public class AnnotationLabels extends Panel implements ActionListener, boolean resizePanel = false; + @Override public void mouseMoved(MouseEvent evt) { resizePanel = evt.getY() < 10 && evt.getX() < 14; @@ -306,6 +308,7 @@ public class AnnotationLabels extends Panel implements ActionListener, dragCancelled = true; } + @Override public void mouseDragged(MouseEvent evt) { if (dragCancelled) @@ -365,10 +368,12 @@ public class AnnotationLabels extends Panel implements ActionListener, } } + @Override public void mouseClicked(MouseEvent evt) { } + @Override public void mouseReleased(MouseEvent evt) { if (!resizePanel && !dragCancelled) @@ -400,6 +405,7 @@ public class AnnotationLabels extends Panel implements ActionListener, ap.annotationPanel.repaint(); } + @Override public void mouseEntered(MouseEvent evt) { if (evt.getY() < 10 && evt.getX() < 14) @@ -409,6 +415,7 @@ public class AnnotationLabels extends Panel implements ActionListener, } } + @Override public void mouseExited(MouseEvent evt) { dragCancelled = false; @@ -427,6 +434,7 @@ public class AnnotationLabels extends Panel implements ActionListener, repaint(); } + @Override public void mousePressed(MouseEvent evt) { oldY = evt.getY(); @@ -522,6 +530,7 @@ public class AnnotationLabels extends Panel implements ActionListener, final AlignmentAnnotation aaa = aa[selectedRow]; cbmi.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { if (aaa.groupRef != null) @@ -545,6 +554,7 @@ public class AnnotationLabels extends Panel implements ActionListener, aa[selectedRow].groupRef.isShowConsensusHistogram()); chist.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { // TODO: pass on reference @@ -564,6 +574,7 @@ public class AnnotationLabels extends Panel implements ActionListener, aa[selectedRow].groupRef.isShowSequenceLogo()); cprofl.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { // TODO: pass on reference @@ -585,6 +596,7 @@ public class AnnotationLabels extends Panel implements ActionListener, aa[selectedRow].groupRef.isNormaliseSequenceLogo()); cprofn.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { // TODO: pass on reference @@ -608,6 +620,7 @@ public class AnnotationLabels extends Panel implements ActionListener, av.isShowConsensusHistogram()); chist.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { // TODO: pass on reference @@ -631,6 +644,7 @@ public class AnnotationLabels extends Panel implements ActionListener, av.isShowSequenceLogo()); cprof.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { // TODO: pass on reference @@ -655,6 +669,7 @@ public class AnnotationLabels extends Panel implements ActionListener, av.isNormaliseSequenceLogo()); cprofn.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { // TODO: pass on reference @@ -697,11 +712,47 @@ public class AnnotationLabels extends Panel implements ActionListener, // todo: make the ap scroll to the selection - not necessary, first // click highlights/scrolls, second selects ap.seqPanel.ap.idPanel.highlightSearchResults(null); - ap.av.setSelectionGroup(// new SequenceGroup( - aa[selectedRow].groupRef); // ); - ap.av.sendSelection(); + // process modifiers + SequenceGroup sg = ap.av.getSelectionGroup(); + if (sg == null + || sg == aa[selectedRow].groupRef + || !(jalview.util.Platform.isControlDown(evt) || evt + .isShiftDown())) + { + if (jalview.util.Platform.isControlDown(evt) + || evt.isShiftDown()) + { + // clone a new selection group from the associated group + ap.av.setSelectionGroup(new SequenceGroup( + aa[selectedRow].groupRef)); + } + else + { + // set selection to the associated group so it can be edited + ap.av.setSelectionGroup(aa[selectedRow].groupRef); + } + } + else + { + // modify current selection with associated group + int remainToAdd = aa[selectedRow].groupRef.getSize(); + for (SequenceI sgs : aa[selectedRow].groupRef.getSequences()) + { + if (jalview.util.Platform.isControlDown(evt)) + { + sg.addOrRemove(sgs, --remainToAdd == 0); + } + else + { + // notionally, we should also add intermediate sequences from + // last added sequence ? + sg.addSequence(sgs, --remainToAdd == 0); + } + } + } ap.paintAlignment(false); PaintRefresher.Refresh(ap, ap.av.getSequenceSetId()); + ap.av.sendSelection(); } else { @@ -728,7 +779,8 @@ public class AnnotationLabels extends Panel implements ActionListener, // we make a copy rather than edit the current selection if no // modifiers pressed // see Enhancement JAL-1557 - if (!(evt.isControlDown() || evt.isShiftDown())) + if (!(jalview.util.Platform.isControlDown(evt) || evt + .isShiftDown())) { sg = new SequenceGroup(sg); sg.clear(); @@ -736,7 +788,7 @@ public class AnnotationLabels extends Panel implements ActionListener, } else { - if (evt.isControlDown()) + if (jalview.util.Platform.isControlDown(evt)) { sg.addOrRemove(aa[selectedRow].sequenceRef, true); } @@ -794,11 +846,13 @@ public class AnnotationLabels extends Panel implements ActionListener, } } + @Override public void update(Graphics g) { paint(g); } + @Override public void paint(Graphics g) { int w = getSize().width; diff --git a/src/jalview/appletgui/FeatureColourChooser.java b/src/jalview/appletgui/FeatureColourChooser.java index 46a67c4..3c04ccd 100644 --- a/src/jalview/appletgui/FeatureColourChooser.java +++ b/src/jalview/appletgui/FeatureColourChooser.java @@ -20,9 +20,10 @@ */ package jalview.appletgui; +import jalview.api.FeatureColourI; import jalview.datamodel.GraphLine; import jalview.schemes.AnnotationColourGradient; -import jalview.schemes.GraduatedColor; +import jalview.schemes.FeatureColour; import jalview.util.MessageManager; import java.awt.Checkbox; @@ -60,9 +61,9 @@ public class FeatureColourChooser extends Panel implements ActionListener, // AlignmentPanel ap; - GraduatedColor cs; + FeatureColourI cs; - Object oldcs; + FeatureColourI oldcs; Hashtable oldgroupColours; @@ -91,29 +92,29 @@ public class FeatureColourChooser extends Panel implements ActionListener, { this.type = type; fr = frenderer; - float mm[] = ((float[][]) fr.getMinMax().get(type))[0]; + float mm[] = fr.getMinMax().get(type)[0]; min = mm[0]; max = mm[1]; oldcs = fr.getFeatureColours().get(type); - if (oldcs instanceof GraduatedColor) + if (oldcs.isGraduatedColour()) { - cs = new GraduatedColor((GraduatedColor) oldcs, min, max); + cs = new FeatureColour((FeatureColour) oldcs, min, max); } else { // promote original color to a graduated color Color bl = Color.black; - if (oldcs instanceof Color) + if (oldcs.isSimpleColour()) { - bl = (Color) oldcs; + bl = oldcs.getColour(); } // original colour becomes the maximum colour - cs = new GraduatedColor(Color.white, bl, mm[0], mm[1]); + cs = new FeatureColour(Color.white, bl, mm[0], mm[1]); } - minColour.setBackground(cs.getMinColor()); - maxColour.setBackground(cs.getMaxColor()); - minColour.setForeground(cs.getMinColor()); - maxColour.setForeground(cs.getMaxColor()); + minColour.setBackground(cs.getMinColour()); + maxColour.setBackground(cs.getMaxColour()); + minColour.setForeground(cs.getMinColour()); + maxColour.setForeground(cs.getMaxColour()); colourFromLabel.setState(cs.isColourByLabel()); adjusting = true; @@ -123,10 +124,8 @@ public class FeatureColourChooser extends Panel implements ActionListener, } catch (Exception ex) { } - threshold - .select(cs.getThreshType() == AnnotationColourGradient.NO_THRESHOLD ? 0 - : cs.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD ? 1 - : 2); + threshold.select(cs.isAboveThreshold() ? 1 : (cs.isBelowThreshold() ? 2 + : 0)); adjusting = false; changeColour(); @@ -259,6 +258,7 @@ public class FeatureColourChooser extends Panel implements ActionListener, private GraphLine threshline; + @Override public void actionPerformed(ActionEvent evt) { if (evt.getSource() == thresholdValue) @@ -286,6 +286,7 @@ public class FeatureColourChooser extends Panel implements ActionListener, } } + @Override public void itemStateChanged(ItemEvent evt) { maxColour.setEnabled(!colourFromLabel.getState()); @@ -293,19 +294,20 @@ public class FeatureColourChooser extends Panel implements ActionListener, changeColour(); } + @Override public void adjustmentValueChanged(AdjustmentEvent evt) { if (!adjusting) { - thresholdValue.setText(((float) slider.getValue() / 1000f) + ""); + thresholdValue.setText((slider.getValue() / 1000f) + ""); valueChanged(); } } protected void valueChanged() { - threshline.value = (float) slider.getValue() / 1000f; - cs.setThresh(threshline.value); + threshline.value = slider.getValue() / 1000f; + cs.setThreshold(threshline.value); changeColour(); PaintRefresher.Refresh(this, fr.getViewport().getSequenceSetId()); // ap.paintAlignment(false); @@ -369,7 +371,7 @@ public class FeatureColourChooser extends Panel implements ActionListener, slider.setEnabled(true); thresholdValue.setEnabled(true); - GraduatedColor acg = new GraduatedColor(minColour.getBackground(), + FeatureColour acg = new FeatureColour(minColour.getBackground(), maxColour.getBackground(), min, max); acg.setColourByLabel(colourFromLabel.getState()); @@ -393,7 +395,7 @@ public class FeatureColourChooser extends Panel implements ActionListener, if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) { adjusting = true; - acg.setThresh(threshline.value); + acg.setThreshold(threshline.value); float range = max * 1000f - min * 1000f; @@ -406,17 +408,17 @@ public class FeatureColourChooser extends Panel implements ActionListener, adjusting = false; } - acg.setThreshType(aboveThreshold); + acg.setAboveThreshold(true); if (thresholdIsMin.getState() && aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) { if (aboveThreshold == AnnotationColourGradient.ABOVE_THRESHOLD) { - acg = new GraduatedColor(acg, threshline.value, max); + acg = new FeatureColour(acg, threshline.value, max); } else { - acg = new GraduatedColor(acg, min, threshline.value); + acg = new FeatureColour(acg, min, threshline.value); } } @@ -434,14 +436,17 @@ public class FeatureColourChooser extends Panel implements ActionListener, } + @Override public void mouseClicked(MouseEvent evt) { } + @Override public void mousePressed(MouseEvent evt) { } + @Override public void mouseReleased(MouseEvent evt) { if (evt.getSource() == minColour || evt.getSource() == maxColour) @@ -456,10 +461,12 @@ public class FeatureColourChooser extends Panel implements ActionListener, // ap.paintAlignment(true); } + @Override public void mouseEntered(MouseEvent evt) { } + @Override public void mouseExited(MouseEvent evt) { } diff --git a/src/jalview/appletgui/FeatureRenderer.java b/src/jalview/appletgui/FeatureRenderer.java index 4391fa2..3f87549 100644 --- a/src/jalview/appletgui/FeatureRenderer.java +++ b/src/jalview/appletgui/FeatureRenderer.java @@ -20,11 +20,13 @@ */ package jalview.appletgui; +import jalview.api.FeatureColourI; import jalview.datamodel.SearchResults; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; -import jalview.schemes.AnnotationColourGradient; -import jalview.schemes.GraduatedColor; +import jalview.io.FeaturesFile; +import jalview.schemes.FeatureColour; +import jalview.schemes.UserColourScheme; import jalview.util.MessageManager; import jalview.viewmodel.AlignmentViewport; @@ -43,6 +45,9 @@ import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Hashtable; /** * DOCUMENT ME! @@ -53,19 +58,20 @@ import java.awt.event.ActionListener; public class FeatureRenderer extends jalview.renderer.seqfeatures.FeatureRenderer { + + // Holds web links for feature groups and feature types + // in the form label|link + Hashtable featureLinks = null; + /** * Creates a new FeatureRenderer object. * * @param av - * DOCUMENT ME! */ public FeatureRenderer(AlignmentViewport av) { super(); this.av = av; - - setTransparencyAvailable(!System.getProperty("java.version") - .startsWith("1.1")); } static String lastFeatureAdded; @@ -91,51 +97,35 @@ public class FeatureRenderer extends /** * render a feature style in the amend feature dialog box */ - public void updateColor(Object newcol) + public void updateColor(FeatureColourI newcol) { - - Color bg, col = null; - GraduatedColor gcol = null; + Color bg = null; String vlabel = ""; - if (newcol instanceof Color) - { - isGcol = false; - col = (Color) newcol; - gcol = null; - } - else if (newcol instanceof GraduatedColor) - { - isGcol = true; - gcol = (GraduatedColor) newcol; - col = null; - } - else - { - throw new Error( - MessageManager - .getString("error.invalid_colour_for_mycheckbox")); - } - if (col != null) + if (newcol.isSimpleColour()) { - setBackground(bg = col); + bg = newcol.getColour(); + setBackground(bg); } else { - if (gcol.getThreshType() != AnnotationColourGradient.NO_THRESHOLD) + if (newcol.isAboveThreshold()) + { + vlabel += " (>)"; + } + else if (newcol.isBelowThreshold()) { - vlabel += " " - + ((gcol.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD) ? "(>)" - : "(<)"); + vlabel += " (<)"; } - if (isColourByLabel = gcol.isColourByLabel()) + + if (isColourByLabel = newcol.isColourByLabel()) { setBackground(bg = Color.white); vlabel += " (by Label)"; } else { - setBackground(bg = gcol.getMinColor()); - maxCol = gcol.getMaxColor(); + setBackground(bg = newcol.getMinColour()); + maxCol = newcol.getMaxColour(); } } label = vlabel; @@ -242,11 +232,12 @@ public class FeatureRenderer extends ap.seqPanel.seqCanvas.highlightSearchResults(highlight); } - Object col = getFeatureStyle(name.getText()); + FeatureColourI col = getFeatureStyle(name.getText()); if (col == null) { - col = new jalview.schemes.UserColourScheme() + Color generatedColour = UserColourScheme .createColourFromName(name.getText()); + col = new FeatureColour(generatedColour); } colourPanel.updateColor(col); @@ -354,21 +345,16 @@ public class FeatureRenderer extends start.setText(features[0].getBegin() + ""); end.setText(features[0].getEnd() + ""); description.setText(features[0].getDescription()); - Color col = getColour(name.getText()); - if (col == null) - { - col = new jalview.schemes.UserColourScheme() - .createColourFromName(name.getText()); - } - Object fcol = getFeatureStyle(name.getText()); + // lookup (or generate) the feature colour + FeatureColourI fcol = getFeatureStyle(name.getText()); // simply display the feature color in a box colourPanel.updateColor(fcol); dialog.setResizable(true); // TODO: render the graduated color in the box. - colourPanel.addMouseListener(new java.awt.event.MouseAdapter() + colourPanel.addMouseListener(new MouseAdapter() { @Override - public void mousePressed(java.awt.event.MouseEvent evt) + public void mousePressed(MouseEvent evt) { if (!colourPanel.isGcol) { @@ -376,15 +362,14 @@ public class FeatureRenderer extends } else { - FeatureColourChooser fcc = new FeatureColourChooser( - ap.alignFrame, name.getText()); + new FeatureColourChooser(ap.alignFrame, name.getText()); dialog.transferFocus(); } } }); dialog.setVisible(true); - jalview.io.FeaturesFile ffile = new jalview.io.FeaturesFile(); + FeaturesFile ffile = new FeaturesFile(); if (dialog.accept) { @@ -413,7 +398,7 @@ public class FeatureRenderer extends if (!colourPanel.isGcol) { // update colour - otherwise its already done. - setColour(sf.type, colourPanel.getBackground()); + setColour(sf.type, new FeatureColour(colourPanel.getBackground())); } try { @@ -453,7 +438,7 @@ public class FeatureRenderer extends { setGroupVisibility(lastFeatureGroupAdded, true); } - setColour(lastFeatureAdded, newColour); // was fcol + setColour(lastFeatureAdded, new FeatureColour(newColour)); // was fcol setVisible(lastFeatureAdded); findAllFeatures(false); // different to original applet behaviour ? // findAllFeatures(); diff --git a/src/jalview/appletgui/FeatureSettings.java b/src/jalview/appletgui/FeatureSettings.java index 40a2ce5..bfac241 100755 --- a/src/jalview/appletgui/FeatureSettings.java +++ b/src/jalview/appletgui/FeatureSettings.java @@ -20,11 +20,10 @@ */ package jalview.appletgui; +import jalview.api.FeatureColourI; import jalview.api.FeatureSettingsControllerI; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceFeature; -import jalview.schemes.AnnotationColourGradient; -import jalview.schemes.GraduatedColor; import jalview.util.MessageManager; import java.awt.BorderLayout; @@ -95,14 +94,7 @@ public class FeatureSettings extends Panel implements ItemListener, transparency = new Scrollbar(Scrollbar.HORIZONTAL, 100 - (int) (fr.getTransparency() * 100), 1, 1, 100); - if (fr.isTransparencyAvailable()) - { - transparency.addAdjustmentListener(this); - } - else - { - transparency.setEnabled(false); - } + transparency.addAdjustmentListener(this); java.net.URL url = getClass().getResource("/images/link.gif"); if (url != null) @@ -134,17 +126,8 @@ public class FeatureSettings extends Panel implements ItemListener, Panel tPanel = new Panel(new BorderLayout()); - if (fr.isTransparencyAvailable()) - { - tPanel.add(transparency, BorderLayout.CENTER); - tPanel.add(new Label("Transparency"), BorderLayout.EAST); - } - else - { - tPanel.add( - new Label("Transparency not available in this web browser"), - BorderLayout.CENTER); - } + tPanel.add(transparency, BorderLayout.CENTER); + tPanel.add(new Label("Transparency"), BorderLayout.EAST); lowerPanel.add(tPanel, BorderLayout.SOUTH); @@ -206,8 +189,8 @@ public class FeatureSettings extends Panel implements ItemListener, int x, int y) { final String type = check.type; - final Object typeCol = fr.getFeatureStyle(type); - java.awt.PopupMenu men = new PopupMenu(MessageManager.formatMessage( + final FeatureColourI typeCol = fr.getFeatureStyle(type); + PopupMenu men = new PopupMenu(MessageManager.formatMessage( "label.settings_for_type", new String[] { type })); java.awt.MenuItem scr = new MenuItem( MessageManager.getString("label.sort_by_score")); @@ -238,6 +221,7 @@ public class FeatureSettings extends Panel implements ItemListener, }); men.add(dens); + if (minmax != null) { final float[][] typeMinMax = minmax.get(type); @@ -258,7 +242,7 @@ public class FeatureSettings extends Panel implements ItemListener, // graduated colourschemes for those where minmax exists for the // positional features MenuItem mxcol = new MenuItem( - (typeCol instanceof Color) ? "Graduated Colour" + (typeCol.isSimpleColour()) ? "Graduated Colour" : "Single Colour"); men.add(mxcol); mxcol.addActionListener(new ActionListener() @@ -267,7 +251,7 @@ public class FeatureSettings extends Panel implements ItemListener, @Override public void actionPerformed(ActionEvent e) { - if (typeCol instanceof Color) + if (typeCol.isSimpleColour()) { new FeatureColourChooser(me, type); // write back the current colour object to update the table @@ -275,14 +259,64 @@ public class FeatureSettings extends Panel implements ItemListener, } else { - new UserDefinedColours(me, check.type, - ((GraduatedColor) typeCol)); + new UserDefinedColours(me, check.type, typeCol); } } }); } } + + MenuItem selectContaining = new MenuItem( + MessageManager.getString("label.select_columns_containing")); + selectContaining.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + me.ap.alignFrame.avc.markColumnsContainingFeatures(false, false, + false, type); + } + }); + men.add(selectContaining); + + MenuItem selectNotContaining = new MenuItem( + MessageManager.getString("label.select_columns_not_containing")); + selectNotContaining.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + me.ap.alignFrame.avc.markColumnsContainingFeatures(true, false, + false, type); + } + }); + men.add(selectNotContaining); + + MenuItem hideContaining = new MenuItem( + MessageManager.getString("label.hide_columns_containing")); + hideContaining.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + hideFeatureColumns(type, true); + } + }); + men.add(hideContaining); + + MenuItem hideNotContaining = new MenuItem( + MessageManager.getString("label.hide_columns_not_containing")); + hideNotContaining.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + hideFeatureColumns(type, false); + } + }); + men.add(hideNotContaining); + this.featurePanel.add(men); men.show(this.featurePanel, x, y); } @@ -601,19 +635,9 @@ public class FeatureSettings extends Panel implements ItemListener, } } - public void setUserColour(String feature, Object originalColour) + public void setUserColour(String feature, FeatureColourI originalColour) { - if (originalColour instanceof Color - || originalColour instanceof GraduatedColor) - { - fr.setColour(feature, originalColour); - } - else - { - throw new Error( - MessageManager - .getString("error.implementation_error_unsupported_feature_colour_object")); - } + fr.setColour(feature, originalColour); refreshTable(); } @@ -650,10 +674,10 @@ public class FeatureSettings extends Panel implements ItemListener, if (evt.getClickCount() > 1) { - Object fcol = fr.getFeatureStyle(check.type); - if (fcol instanceof Color) + FeatureColourI fcol = fr.getFeatureStyle(check.type); + if (fcol.isSimpleColour()) { - new UserDefinedColours(this, check.type, (Color) fcol); + new UserDefinedColours(this, check.type, fcol.getColour()); } else { @@ -685,49 +709,34 @@ public class FeatureSettings extends Panel implements ItemListener, boolean hasLink; - GraduatedColor gcol; + FeatureColourI col; - Color col; - - public void updateColor(Object newcol) + public void updateColor(FeatureColourI newcol) { - if (newcol instanceof Color) + col = newcol; + if (col.isSimpleColour()) { - col = (Color) newcol; - gcol = null; - } - else if (newcol instanceof GraduatedColor) - { - gcol = (GraduatedColor) newcol; - col = null; - } - else - { - throw new Error( - MessageManager - .getString("error.invalid_colour_for_mycheckbox")); - } - if (col != null) - { - setBackground(col); + setBackground(col.getColour()); } else { String vlabel = type; - if (gcol.getThreshType() != AnnotationColourGradient.NO_THRESHOLD) + if (col.isAboveThreshold()) + { + vlabel += " (>)"; + } + else if (col.isBelowThreshold()) { - vlabel += " " - + ((gcol.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD) ? "(>)" - : "(<)"); + vlabel += " (<)"; } - if (gcol.isColourByLabel()) + if (col.isColourByLabel()) { setBackground(Color.white); vlabel += " (by Label)"; } else { - setBackground(gcol.getMinColor()); + setBackground(col.getMinColour()); } this.setLabel(vlabel); } @@ -744,7 +753,7 @@ public class FeatureSettings extends Panel implements ItemListener, } public MyCheckbox(String type, boolean selected, boolean b, - Object featureStyle) + FeatureColourI featureStyle) { this(type, selected, b); updateColor(featureStyle); @@ -754,31 +763,28 @@ public class FeatureSettings extends Panel implements ItemListener, public void paint(Graphics g) { Dimension d = getSize(); - if (gcol != null) + if (col.isColourByLabel()) { - if (gcol.isColourByLabel()) - { - g.setColor(Color.white); - g.fillRect(d.width / 2, 0, d.width / 2, d.height); - /* - * g.setColor(Color.black); Font f=g.getFont().deriveFont(9); - * g.setFont(f); - * - * // g.setFont(g.getFont().deriveFont( // - * AffineTransform.getScaleInstance( // - * width/g.getFontMetrics().stringWidth("Label"), // - * height/g.getFontMetrics().getHeight()))); g.drawString("Label", - * width/2, 0); - */ + g.setColor(Color.white); + g.fillRect(d.width / 2, 0, d.width / 2, d.height); + /* + * g.setColor(Color.black); Font f=g.getFont().deriveFont(9); + * g.setFont(f); + * + * // g.setFont(g.getFont().deriveFont( // + * AffineTransform.getScaleInstance( // + * width/g.getFontMetrics().stringWidth("Label"), // + * height/g.getFontMetrics().getHeight()))); g.drawString("Label", + * width/2, 0); + */ - } - else - { - Color maxCol = gcol.getMaxColor(); - g.setColor(maxCol); - g.fillRect(d.width / 2, 0, d.width / 2, d.height); + } + else if (col.isGraduatedColour()) + { + Color maxCol = col.getMaxColour(); + g.setColor(maxCol); + g.fillRect(d.width / 2, 0, d.width / 2, d.height); - } } if (hasLink) @@ -789,9 +795,31 @@ public class FeatureSettings extends Panel implements ItemListener, } } + /** + * Hide columns containing (or not containing) a given feature type + * + * @param type + * @param columnsContaining + */ + void hideFeatureColumns(final String type, + boolean columnsContaining) + { + if (ap.alignFrame.avc.markColumnsContainingFeatures( + columnsContaining, false, false, type)) + { + if (ap.alignFrame.avc.markColumnsContainingFeatures( + !columnsContaining, false, false, type)) + { + ap.alignFrame.viewport.hideSelectedColumns(); + } + } + } + @Override public void mousePressed(MouseEvent e) { + // TODO Auto-generated method stub + } } diff --git a/src/jalview/appletgui/IdPanel.java b/src/jalview/appletgui/IdPanel.java index 8f24f11..36c2199 100755 --- a/src/jalview/appletgui/IdPanel.java +++ b/src/jalview/appletgui/IdPanel.java @@ -100,6 +100,7 @@ public class IdPanel extends Panel implements MouseListener, Tooltip tooltip; + @Override public void mouseMoved(MouseEvent e) { int seq = alignPanel.seqPanel.findSeq(e); @@ -188,6 +189,7 @@ public class IdPanel extends Panel implements MouseListener, tooltiptext = null; } + @Override public void mouseDragged(MouseEvent e) { mouseDragging = true; @@ -207,6 +209,7 @@ public class IdPanel extends Panel implements MouseListener, alignPanel.paintAlignment(false); } + @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() < 2) @@ -270,6 +273,7 @@ public class IdPanel extends Panel implements MouseListener, } } + @Override public void mouseEntered(MouseEvent e) { if (scrollThread != null) @@ -278,6 +282,7 @@ public class IdPanel extends Panel implements MouseListener, } } + @Override public void mouseExited(MouseEvent e) { if (av.getWrapAlignment()) @@ -297,6 +302,7 @@ public class IdPanel extends Panel implements MouseListener, } } + @Override public void mousePressed(MouseEvent e) { if (e.getClickCount() > 1) @@ -345,7 +351,8 @@ public class IdPanel extends Panel implements MouseListener, } if ((av.getSelectionGroup() == null) - || ((!e.isControlDown() && !e.isShiftDown()) && av + || ((!jalview.util.Platform.isControlDown(e) && !e + .isShiftDown()) && av .getSelectionGroup() != null)) { av.setSelectionGroup(new SequenceGroup()); @@ -401,6 +408,7 @@ public class IdPanel extends Panel implements MouseListener, } + @Override public void mouseReleased(MouseEvent e) { if (scrollThread != null) @@ -455,6 +463,7 @@ public class IdPanel extends Panel implements MouseListener, running = false; } + @Override public void run() { running = true; diff --git a/src/jalview/appletgui/SeqPanel.java b/src/jalview/appletgui/SeqPanel.java index 479b746..31bf6a4 100644 --- a/src/jalview/appletgui/SeqPanel.java +++ b/src/jalview/appletgui/SeqPanel.java @@ -1813,9 +1813,12 @@ public class SeqPanel extends Panel implements MouseMotionListener, // do we want to thread this ? (contention with seqsel and colsel locks, I // suspect) - // rules are: colsel is copied if there is a real intersection between - // sequence selection - boolean repaint = false, copycolsel = true; + /* + * only copy colsel if there is a real intersection between + * sequence selection and this panel's alignment + */ + boolean repaint = false; + boolean copycolsel = false; if (av.getSelectionGroup() == null || !av.isSelectionGroupChanged(true)) { SequenceGroup sgroup = null; @@ -1832,11 +1835,9 @@ public class SeqPanel extends Panel implements MouseMotionListener, } sgroup = seqsel.intersect(av.getAlignment(), (av.hasHiddenRows()) ? av.getHiddenRepSequences() : null); - if ((sgroup == null || sgroup.getSize() == 0) - && (colsel == null || colsel.isEmpty())) + if ((sgroup != null && sgroup.getSize() > 0)) { - // don't copy columns if the region didn't intersect. - copycolsel = false; + copycolsel = true; } } if (sgroup != null && sgroup.getSize() > 0) @@ -1964,7 +1965,6 @@ public class SeqPanel extends Panel implements MouseMotionListener, ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv, av); av.setColumnSelection(cs); - av.isColSelChanged(true); ap.scalePanelHolder.repaint(); ap.repaint(); diff --git a/src/jalview/appletgui/SequenceRenderer.java b/src/jalview/appletgui/SequenceRenderer.java index 09b50c4..970d20e 100755 --- a/src/jalview/appletgui/SequenceRenderer.java +++ b/src/jalview/appletgui/SequenceRenderer.java @@ -32,6 +32,8 @@ import java.awt.Graphics; public class SequenceRenderer implements jalview.api.SequenceRenderer { + final static int CHAR_TO_UPPER = 'A' - 'a'; + AlignViewport av; FontMetrics fm; @@ -67,6 +69,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer this.renderGaps = renderGaps; } + @Override public Color getResidueBoxColour(SequenceI seq, int i) { allGroups = av.getAlignment().findAllGroups(seq); @@ -256,7 +259,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer } if (currentSequenceGroup.getShowNonconserved()) { - s = getDisplayChar(srep, i, s, '.'); + s = getDisplayChar(srep, i, s, '.', currentSequenceGroup); } } else @@ -280,7 +283,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer } if (av.getShowUnconserved()) { - s = getDisplayChar(srep, i, s, '.'); + s = getDisplayChar(srep, i, s, '.', null); } } @@ -312,20 +315,43 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer } - private char getDisplayChar(final boolean usesrep, int position, char s, - char c) + /** + * Returns 'conservedChar' to represent the given position if the sequence + * character at that position is equal to the consensus (ignoring case), else + * returns the sequence character + * + * @param usesrep + * @param position + * @param sequenceChar + * @param conservedChar + * @return + */ + private char getDisplayChar(final boolean usesrep, int position, + char sequenceChar, char conservedChar, SequenceGroup currentGroup) { // TODO - use currentSequenceGroup rather than alignment // currentSequenceGroup.getConsensus() - char conschar = (usesrep) ? av.getAlignment().getSeqrep() - .getCharAt(position) - : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter - .charAt(0); - if (!jalview.util.Comparison.isGap(conschar) && s == conschar) + char conschar = (usesrep) ? (currentGroup == null + || position < currentGroup.getStartRes() + || position > currentGroup.getEndRes() ? av.getAlignment() + .getSeqrep().getCharAt(position) + : (currentGroup.getSeqrep() != null ? currentGroup.getSeqrep() + .getCharAt(position) : av.getAlignment().getSeqrep() + .getCharAt(position))) + : (currentGroup != null && currentGroup.getConsensus() != null + && position >= currentGroup.getStartRes() + && position <= currentGroup.getEndRes() && currentGroup + .getConsensus().annotations.length > position) ? currentGroup + .getConsensus().annotations[position].displayCharacter + .charAt(0) + : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter + .charAt(0); + if (!jalview.util.Comparison.isGap(conschar) + && (sequenceChar == conschar || sequenceChar + CHAR_TO_UPPER == conschar)) { - s = c; + sequenceChar = conservedChar; } - return s; + return sequenceChar; } boolean inCurrentSequenceGroup(int res) diff --git a/src/jalview/appletgui/UserDefinedColours.java b/src/jalview/appletgui/UserDefinedColours.java index 57cf669..88098a9 100644 --- a/src/jalview/appletgui/UserDefinedColours.java +++ b/src/jalview/appletgui/UserDefinedColours.java @@ -20,9 +20,10 @@ */ package jalview.appletgui; +import jalview.api.FeatureColourI; import jalview.datamodel.SequenceGroup; import jalview.schemes.ColourSchemeI; -import jalview.schemes.GraduatedColor; +import jalview.schemes.FeatureColour; import jalview.schemes.ResidueProperties; import jalview.schemes.UserColourScheme; import jalview.util.MessageManager; @@ -59,7 +60,7 @@ public class UserDefinedColours extends Panel implements ActionListener, Button selectedButton; - Vector oldColours = new Vector(); + Vector oldColours = new Vector(); ColourSchemeI oldColourScheme; @@ -75,7 +76,7 @@ public class UserDefinedColours extends Panel implements ActionListener, String originalLabel; - Object originalColour; + FeatureColourI originalColour; int R = 0, G = 0, B = 0; @@ -117,7 +118,7 @@ public class UserDefinedColours extends Panel implements ActionListener, public UserDefinedColours(FeatureRenderer fr, Frame alignframe) { caller = fr; - originalColour = fr.colourPanel.getBackground(); + originalColour = new FeatureColour(fr.colourPanel.getBackground()); originalLabel = "Feature Colour"; setForDialog("Select Feature Colour", alignframe); setTargetColour(fr.colourPanel.getBackground()); @@ -134,21 +135,21 @@ public class UserDefinedColours extends Panel implements ActionListener, * * @param caller * - handles events - * @param col1 + * @param col * - original colour * @param alignframe * - the parent Frame for the dialog * @param title * - window title */ - public UserDefinedColours(Component caller, Color col1, Frame alignframe, + public UserDefinedColours(Component caller, Color col, Frame alignframe, String title) { this.caller = caller; - originalColour = col1; + originalColour = new FeatureColour(col); originalLabel = title; setForDialog(title, alignframe); - setTargetColour(col1); + setTargetColour(col); dialog.setVisible(true); } @@ -161,7 +162,7 @@ public class UserDefinedColours extends Panel implements ActionListener, */ public UserDefinedColours(Object caller, String label, Color colour) { - this(caller, label, colour, colour); + this(caller, label, new FeatureColour(colour), colour); } /** @@ -172,13 +173,13 @@ public class UserDefinedColours extends Panel implements ActionListener, * @param graduatedColor */ public UserDefinedColours(FeatureSettings me, String type, - GraduatedColor graduatedColor) + FeatureColourI graduatedColor) { - this(me, type, graduatedColor, graduatedColor.getMaxColor()); + this(me, type, graduatedColor, graduatedColor.getMaxColour()); } - private UserDefinedColours(Object caller, String label, Object ocolour, - Color colour) + private UserDefinedColours(Object caller, String label, + FeatureColourI ocolour, Color colour) { this.caller = caller; originalColour = ocolour; @@ -228,6 +229,7 @@ public class UserDefinedColours extends Panel implements ActionListener, } + @Override public void actionPerformed(ActionEvent evt) { final Object source = evt.getSource(); @@ -257,6 +259,7 @@ public class UserDefinedColours extends Panel implements ActionListener, } } + @Override public void adjustmentValueChanged(AdjustmentEvent evt) { if (evt.getSource() == rScroller) @@ -420,6 +423,7 @@ public class UserDefinedColours extends Panel implements ActionListener, button.setFont(new java.awt.Font("Verdana", 1, 10)); button.addMouseListener(new java.awt.event.MouseAdapter() { + @Override public void mousePressed(MouseEvent e) { colourButtonPressed(e); @@ -451,7 +455,8 @@ public class UserDefinedColours extends Panel implements ActionListener, { if (caller instanceof FeatureSettings) { - ((FeatureSettings) caller).setUserColour(originalLabel, getColor()); + ((FeatureSettings) caller).setUserColour(originalLabel, + new FeatureColour(getColor())); } else if (caller instanceof AnnotationColourChooser) { @@ -468,7 +473,8 @@ public class UserDefinedColours extends Panel implements ActionListener, } else if (caller instanceof FeatureRenderer) { - ((FeatureRenderer) caller).colourPanel.updateColor(getColor()); + ((FeatureRenderer) caller).colourPanel + .updateColor(new FeatureColour(getColor())); } else if (caller instanceof FeatureColourChooser) { @@ -537,12 +543,12 @@ public class UserDefinedColours extends Panel implements ActionListener, if (originalLabel.equals("Min Colour")) { ((AnnotationColourChooser) caller) - .minColour_actionPerformed((Color) originalColour); + .minColour_actionPerformed(originalColour.getColour()); } else { ((AnnotationColourChooser) caller) - .maxColour_actionPerformed((Color) originalColour); + .maxColour_actionPerformed(originalColour.getColour()); } } else if (caller instanceof FeatureRenderer) @@ -556,12 +562,12 @@ public class UserDefinedColours extends Panel implements ActionListener, if (originalLabel.indexOf("inimum") > -1) { ((FeatureColourChooser) caller) - .minColour_actionPerformed((Color) originalColour); + .minColour_actionPerformed(originalColour.getColour()); } else { ((FeatureColourChooser) caller) - .maxColour_actionPerformed((Color) originalColour); + .maxColour_actionPerformed(originalColour.getColour()); } } if (dialog != null) @@ -576,7 +582,7 @@ public class UserDefinedColours extends Panel implements ActionListener, Color[] newColours = new Color[24]; for (int i = 0; i < 24; i++) { - newColours[i] = (Color) oldColours.elementAt(i); + newColours[i] = oldColours.elementAt(i); buttonPanel.getComponent(i).setBackground(newColours[i]); } diff --git a/src/jalview/bin/ArgsParser.java b/src/jalview/bin/ArgsParser.java new file mode 100644 index 0000000..9c8d0df --- /dev/null +++ b/src/jalview/bin/ArgsParser.java @@ -0,0 +1,97 @@ +package jalview.bin; + +import java.net.URLDecoder; +import java.util.Vector; + +/** + * Notes: this argParser does not distinguish between parameter switches, + * parameter values and argument text. If an argument happens to be identical to + * a parameter, it will be taken as such (even though it didn't have a '-' + * prefixing it). + * + * @author Andrew Waterhouse and JBP documented. + * + */ +public class ArgsParser +{ + Vector vargs = null; + + public ArgsParser(String[] args) + { + vargs = new Vector(); + for (int i = 0; i < args.length; i++) + { + String arg = args[i].trim(); + if (arg.charAt(0) == '-') + { + arg = arg.substring(1); + } + vargs.addElement(arg); + } + } + + /** + * check for and remove first occurence of arg+parameter in arglist. + * + * @param arg + * @return return the argument following the given arg if arg was in list. + */ + public String getValue(String arg) + { + return getValue(arg, false); + } + + public String getValue(String arg, boolean utf8decode) + { + int index = vargs.indexOf(arg); + String dc = null, ret = null; + if (index != -1) + { + ret = vargs.elementAt(index + 1).toString(); + vargs.removeElementAt(index); + vargs.removeElementAt(index); + if (utf8decode && ret != null) + { + try + { + dc = URLDecoder.decode(ret, "UTF-8"); + ret = dc; + } catch (Exception e) + { + // TODO: log failure to decode + } + } + } + return ret; + } + + /** + * check for and remove first occurence of arg in arglist. + * + * @param arg + * @return true if arg was present in argslist. + */ + public boolean contains(String arg) + { + if (vargs.contains(arg)) + { + vargs.removeElement(arg); + return true; + } + else + { + return false; + } + } + + public String nextValue() + { + return vargs.remove(0); + } + + public int getSize() + { + return vargs.size(); + } + +} \ No newline at end of file diff --git a/src/jalview/bin/Cache.java b/src/jalview/bin/Cache.java index 7911cd5..cf251dc 100755 --- a/src/jalview/bin/Cache.java +++ b/src/jalview/bin/Cache.java @@ -21,7 +21,7 @@ package jalview.bin; import jalview.datamodel.DBRefSource; -import jalview.ws.dbsources.Pdb; +import jalview.structure.StructureImportSettings; import jalview.ws.dbsources.das.api.DasSourceRegistryI; import jalview.ws.dbsources.das.datamodel.DasSourceRegistry; import jalview.ws.sifts.SiftsSettings; @@ -426,8 +426,12 @@ public class Cache System.out .println("Jalview Version: " + codeVersion + codeInstallation); - Pdb.setCurrentDefaultFomart(jalview.bin.Cache.getDefault( + StructureImportSettings.setCurrentDefaultFormat(jalview.bin.Cache + .getDefault( "DEFAULT_STRUCTURE_FORMAT", DEFAULT_STRUCTURE_FORMAT)); + + StructureImportSettings.setProcessHETATMs(jalview.bin.Cache.getDefault( + "PROCESS_HETATM", false)); // jnlpVersion will be null if we're using InstallAnywhere // Dont do this check if running in headless mode if (jnlpVersion == null diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index 6c8750f..76ae3ff 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -20,27 +20,36 @@ */ package jalview.bin; +import groovy.lang.Binding; +import groovy.util.GroovyScriptEngine; + import jalview.gui.AlignFrame; import jalview.gui.Desktop; +import jalview.gui.PromptUserConfig; +import jalview.io.AppletFormatAdapter; import jalview.io.BioJsHTMLOutput; +import jalview.io.FileLoader; +import jalview.io.FormatAdapter; import jalview.io.HtmlSvgOutput; +import jalview.io.IdentifyFile; +import jalview.io.NewickFile; +import jalview.schemes.ColourSchemeI; +import jalview.schemes.ColourSchemeProperty; +import jalview.schemes.UserColourScheme; import jalview.util.MessageManager; import jalview.util.Platform; import jalview.ws.jws2.Jws2Discoverer; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; -import java.lang.reflect.Constructor; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; -import java.net.URLDecoder; import java.security.AllPermission; import java.security.CodeSource; import java.security.PermissionCollection; @@ -62,6 +71,15 @@ import javax.swing.UIManager; */ public class Jalview { + /* + * singleton instance of this class + */ + private static Jalview instance; + + private Desktop desktop; + + public static AlignFrame currentAlignFrame; + static { // grab all the rights we can the JVM @@ -83,6 +101,71 @@ public class Jalview } /** + * keep track of feature fetching tasks. + * + * @author JimP + * + */ + class FeatureFetcher + { + /* + * TODO: generalise to track all jalview events to orchestrate batch + * processing events. + */ + + private int queued = 0; + + private int running = 0; + + public FeatureFetcher() + { + + } + + public void addFetcher(final AlignFrame af, + final Vector dasSources) + { + final long id = System.currentTimeMillis(); + queued++; + final FeatureFetcher us = this; + new Thread(new Runnable() + { + + @Override + public void run() + { + synchronized (us) + { + queued--; + running++; + } + + af.setProgressBar(MessageManager + .getString("status.das_features_being_retrived"), id); + af.featureSettings_actionPerformed(null); + af.featureSettings.fetchDasFeatures(dasSources, true); + af.setProgressBar(null, id); + synchronized (us) + { + running--; + } + } + }).start(); + } + + public synchronized boolean allFinished() + { + return queued == 0 && running == 0; + } + + } + + public static Jalview getInstance() + { + return instance; + } + + /** * main class for Jalview application * * @param args @@ -90,6 +173,16 @@ public class Jalview */ public static void main(String[] args) { + instance = new Jalview(); + instance.doMain(args); + } + + /** + * @param args + */ + void doMain(String[] args) + { + System.setSecurityManager(null); System.out.println("Java version: " + System.getProperty("java.version")); System.out.println(System.getProperty("os.arch") + " " @@ -162,7 +255,7 @@ public class Jalview try { Cache.initLogger(); - } catch (java.lang.NoClassDefFoundError error) + } catch (NoClassDefFoundError error) { error.printStackTrace(); System.out @@ -171,7 +264,7 @@ public class Jalview System.exit(0); } - Desktop desktop = null; + desktop = null; try { @@ -252,8 +345,9 @@ public class Jalview } String file = null, protocol = null, format = null, data = null; - jalview.io.FileLoader fileLoader = new jalview.io.FileLoader(!headless); - Vector getFeatures = null; // vector of das source nicknames to fetch + FileLoader fileLoader = new FileLoader(!headless); + Vector getFeatures = null; // vector of das source nicknames to + // fetch // features from // loading is done. String groovyscript = null; // script to execute after all loading is @@ -267,8 +361,8 @@ public class Jalview System.out.println("No files to open!"); System.exit(1); } - String vamsasImport = aparser.getValue("vdoc"), vamsasSession = aparser - .getValue("vsess"); + String vamsasImport = aparser.getValue("vdoc"); + String vamsasSession = aparser.getValue("vsess"); if (vamsasImport != null || vamsasSession != null) { if (desktop == null || headless) @@ -283,13 +377,13 @@ public class Jalview { try { - String viprotocol = jalview.io.AppletFormatAdapter + String viprotocol = AppletFormatAdapter .checkProtocol(vamsasImport); if (viprotocol == jalview.io.FormatAdapter.FILE) { inSession = desktop.vamsasImport(new File(vamsasImport)); } - else if (viprotocol == jalview.io.FormatAdapter.URL) + else if (viprotocol == FormatAdapter.URL) { inSession = desktop.vamsasImport(new URL(vamsasImport)); } @@ -366,7 +460,7 @@ public class Jalview if (!file.startsWith("http://")) { - if (!(new java.io.File(file)).exists()) + if (!(new File(file)).exists()) { System.out.println("Can't find " + file); if (headless) @@ -376,9 +470,9 @@ public class Jalview } } - protocol = jalview.io.AppletFormatAdapter.checkProtocol(file); + protocol = AppletFormatAdapter.checkProtocol(file); - format = new jalview.io.IdentifyFile().identify(file, protocol); + format = new IdentifyFile().identify(file, protocol); AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol, format); @@ -388,19 +482,18 @@ public class Jalview } else { - Desktop.setCurrentAlignFrame(af); + setCurrentAlignFrame(af); data = aparser.getValue("colour", true); if (data != null) { data.replaceAll("%20", " "); - jalview.schemes.ColourSchemeI cs = jalview.schemes.ColourSchemeProperty - .getColour(af.getViewport().getAlignment(), data); + ColourSchemeI cs = ColourSchemeProperty.getColour(af + .getViewport().getAlignment(), data); if (cs == null) { - jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme( - "white"); + UserColourScheme ucs = new UserColourScheme("white"); ucs.parseAppletParameter(data); cs = ucs; } @@ -417,7 +510,7 @@ public class Jalview if (data != null) { af.parseFeaturesFile(data, - jalview.io.AppletFormatAdapter.checkProtocol(data)); + AppletFormatAdapter.checkProtocol(data)); // System.out.println("Added " + data); System.out.println("CMD groups[-" + data + "] executed successfully!"); @@ -426,7 +519,7 @@ public class Jalview if (data != null) { af.parseFeaturesFile(data, - jalview.io.AppletFormatAdapter.checkProtocol(data)); + AppletFormatAdapter.checkProtocol(data)); // System.out.println("Added " + data); System.out.println("CMD [-features " + data + "] executed successfully!"); @@ -474,8 +567,8 @@ public class Jalview { System.out.println("CMD [-tree " + data + "] executed successfully!"); - fin = new jalview.io.NewickFile(data, - jalview.io.AppletFormatAdapter.checkProtocol(data)); + fin = new NewickFile(data, + AppletFormatAdapter.checkProtocol(data)); if (fin != null) { af.getViewport().setCurrentTree( @@ -516,7 +609,7 @@ public class Jalview // Execute the groovy script after we've done all the rendering stuff // and before any images or figures are generated. System.out.println("Executing script " + groovyscript); - executeGroovyScript(groovyscript, new Object[] { desktop, af }); + executeGroovyScript(groovyscript, af); System.out.println("CMD groovy[" + groovyscript + "] executed successfully!"); groovyscript = null; @@ -529,14 +622,14 @@ public class Jalview if (format.equalsIgnoreCase("png")) { - af.createPNG(new java.io.File(file)); - imageName = (new java.io.File(file)).getName(); + af.createPNG(new File(file)); + imageName = (new File(file)).getName(); System.out.println("Creating PNG image: " + file); continue; } else if (format.equalsIgnoreCase("svg")) { - File imageFile = new java.io.File(file); + File imageFile = new File(file); imageName = imageFile.getName(); af.createSVG(imageFile); System.out.println("Creating SVG image: " + file); @@ -544,21 +637,21 @@ public class Jalview } else if (format.equalsIgnoreCase("html")) { - File imageFile = new java.io.File(file); + File imageFile = new File(file); imageName = imageFile.getName(); - new HtmlSvgOutput(new java.io.File(file), af.alignPanel); + new HtmlSvgOutput(new File(file), af.alignPanel); System.out.println("Creating HTML image: " + file); continue; } else if (format.equalsIgnoreCase("imgMap")) { - af.createImageMap(new java.io.File(file), imageName); + af.createImageMap(new File(file), imageName); System.out.println("Creating image map: " + file); continue; } else if (format.equalsIgnoreCase("eps")) { - File outputFile = new java.io.File(file); + File outputFile = new File(file); System.out.println("Creating EPS file: " + outputFile.getAbsolutePath()); af.createEPS(outputFile); @@ -618,7 +711,7 @@ public class Jalview } else { - format = new jalview.io.IdentifyFile().identify(file, protocol); + format = new IdentifyFile().identify(file, protocol); } startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol, @@ -640,11 +733,10 @@ public class Jalview // Once all other stuff is done, execute any groovy scripts (in order) if (groovyscript != null) { - if (jalview.bin.Cache.groovyJarsPresent()) + if (Cache.groovyJarsPresent()) { System.out.println("Executing script " + groovyscript); - executeGroovyScript(groovyscript, new Object[] { desktop, - startUpAlframe }); + executeGroovyScript(groovyscript, startUpAlframe); } else { @@ -711,8 +803,8 @@ public class Jalview /** * start a User Config prompt asking if we can log usage statistics. */ - jalview.gui.PromptUserConfig prompter = new jalview.gui.PromptUserConfig( - desktop.desktop, + PromptUserConfig prompter = new PromptUserConfig( + Desktop.desktop, "USAGESTATS", "Jalview Usage Statistics", "Do you want to help make Jalview better by enabling " @@ -748,14 +840,8 @@ public class Jalview * the Jalview Desktop object passed in to the groovy binding as the * 'Jalview' object. */ - private static void executeGroovyScript(String groovyscript, - Object[] jalviewContext) + private void executeGroovyScript(String groovyscript, AlignFrame af) { - if (jalviewContext == null) - { - System.err - .println("Sorry. Groovy support is currently only available when running with the Jalview GUI enabled."); - } /** * for scripts contained in files */ @@ -772,8 +858,8 @@ public class Jalview tfile = File.createTempFile("jalview", "groovy"); PrintWriter outfile = new PrintWriter(new OutputStreamWriter( new FileOutputStream(tfile))); - BufferedReader br = new BufferedReader( - new java.io.InputStreamReader(System.in)); + BufferedReader br = new BufferedReader(new InputStreamReader( + System.in)); String line = null; while ((line = br.readLine()) != null) { @@ -837,75 +923,23 @@ public class Jalview } } } - boolean success = false; try { - /* - * The following code performs the GroovyScriptEngine invocation using - * reflection, and is equivalent to this fragment from the embedding - * groovy documentation on the groovy site: import - * groovy.lang.Binding; import groovy.util.GroovyScriptEngine; - * - * String[] roots = new String[] { "/my/groovy/script/path" }; - * GroovyScriptEngine gse = new GroovyScriptEngine(roots); Binding binding - * = new Binding(); binding.setVariable("input", "world"); - * gse.run("hello.groovy", binding); - */ - Class[] bspec; - Object[] binding; - int blen = ((jalviewContext[0] == null) ? 0 : 1) - + ((jalviewContext[1] == null) ? 0 : 1); - String cnames[] = new String[] { "Jalview", "currentAlFrame" }; - bspec = new Class[blen * 2]; - binding = new Object[blen * 2]; - blen = 0; - ClassLoader cl = null; Map vbinding = new HashMap(); - for (int jc = 0; jc < jalviewContext.length; jc++) + vbinding.put("Jalview", this); + if (af != null) { - if (jalviewContext[jc] != null) - { - if (cl == null) - { - cl = jalviewContext[jc].getClass().getClassLoader(); - } - bspec[blen * 2] = String.class; - bspec[blen * 2 + 1] = Object.class; - binding[blen * 2] = cnames[jc]; - binding[blen * 2 + 1] = jalviewContext[jc]; - vbinding.put(cnames[jc], jalviewContext[jc]); - blen++; - } + vbinding.put("currentAlFrame", af); } - Class gbindingc = cl.loadClass("groovy.lang.Binding"); - Constructor gbcons; - Object gbinding; - try - { - gbcons = gbindingc.getConstructor(Map.class); - gbinding = gbcons.newInstance(vbinding); - } catch (NoSuchMethodException x) + Binding gbinding = new Binding(vbinding); + GroovyScriptEngine gse = new GroovyScriptEngine(new URL[] { sfile }); + gse.run(sfile.toString(), gbinding); + if ("STDIN".equals(groovyscript)) { - // old style binding config - using series of string/object values to - // setVariable. - gbcons = gbindingc.getConstructor(); - gbinding = gbcons.newInstance(); - java.lang.reflect.Method setvar = gbindingc.getMethod( - "setVariable", bspec); - setvar.invoke(gbinding, binding); + // delete temp file that we made - + // only if it was successfully executed + tfile.delete(); } - - Class gsec = cl.loadClass("groovy.util.GroovyScriptEngine"); - Constructor gseccons = gsec - .getConstructor(new Class[] { URL[].class }); // String[].class - // }); - Object gse = gseccons - .newInstance(new Object[] { new URL[] { sfile } }); // .toString() - // } }); - java.lang.reflect.Method run = gsec.getMethod("run", new Class[] { - String.class, gbindingc }); - run.invoke(gse, new Object[] { sfile.toString(), gbinding }); - success = true; } catch (Exception e) { System.err.println("Exception Whilst trying to execute file " + sfile @@ -913,12 +947,6 @@ public class Jalview e.printStackTrace(System.err); } - if (success && groovyscript.equals("STDIN")) - { - // delete temp file that we made - but only if it was successfully - // executed - tfile.delete(); - } } /** @@ -926,16 +954,15 @@ public class Jalview * * @return vector of DAS source nicknames to retrieve from */ - private static Vector checkDasArguments(ArgsParser aparser) + private static Vector checkDasArguments(ArgsParser aparser) { - Vector source = null; + Vector source = null; String data; String locsources = Cache.getProperty(Cache.DAS_LOCAL_SOURCE); while ((data = aparser.getValue("dasserver", true)) != null) { String nickname = null; String url = null; - boolean seq = false, feat = true; int pos = data.indexOf('='); // determine capabilities if (pos > 0) @@ -965,7 +992,7 @@ public class Jalview + nickname + "|" + url); if (source == null) { - source = new Vector(); + source = new Vector(); } source.addElement(nickname); } @@ -983,7 +1010,7 @@ public class Jalview System.out.println("adding source '" + data + "'"); if (source == null) { - source = new Vector(); + source = new Vector(); } source.addElement(data); } @@ -995,7 +1022,8 @@ public class Jalview * * @param dasSources */ - private static FeatureFetcher startFeatureFetching(final Vector dasSources) + private FeatureFetcher startFeatureFetching( + final Vector dasSources) { FeatureFetcher ff = new FeatureFetcher(); AlignFrame afs[] = Desktop.getAlignFrames(); @@ -1019,176 +1047,37 @@ public class Jalview } return false; } -} - -/** - * Notes: this argParser does not distinguish between parameter switches, - * parameter values and argument text. If an argument happens to be identical to - * a parameter, it will be taken as such (even though it didn't have a '-' - * prefixing it). - * - * @author Andrew Waterhouse and JBP documented. - * - */ - -class rnabuttonlistener implements ActionListener -{ - @Override - public void actionPerformed(ActionEvent arg0) - { - System.out.println("Good idea ! "); - - } -} - -class pbuttonlistener implements ActionListener -{ - @Override - public void actionPerformed(ActionEvent arg0) - { - - } -} - -class ArgsParser -{ - Vector vargs = null; - public ArgsParser(String[] args) - { - vargs = new Vector(); - for (int i = 0; i < args.length; i++) - { - String arg = args[i].trim(); - if (arg.charAt(0) == '-') - { - arg = arg.substring(1); - } - vargs.addElement(arg); - } - } - - /** - * check for and remove first occurence of arg+parameter in arglist. - * - * @param arg - * @return return the argument following the given arg if arg was in list. - */ - public String getValue(String arg) + public AlignFrame[] getAlignFrames() { - return getValue(arg, false); - } + return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() } + : Desktop.getAlignFrames(); - public String getValue(String arg, boolean utf8decode) - { - int index = vargs.indexOf(arg); - String dc = null, ret = null; - if (index != -1) - { - ret = vargs.elementAt(index + 1).toString(); - vargs.removeElementAt(index); - vargs.removeElementAt(index); - if (utf8decode && ret != null) - { - try - { - dc = URLDecoder.decode(ret, "UTF-8"); - ret = dc; - } catch (Exception e) - { - // TODO: log failure to decode - } - } - } - return ret; } /** - * check for and remove first occurence of arg in arglist. - * - * @param arg - * @return true if arg was present in argslist. + * Quit method delegates to Desktop.quit - unless running in headless mode + * when it just ends the JVM */ - public boolean contains(String arg) + public void quit() { - if (vargs.contains(arg)) + if (desktop != null) { - vargs.removeElement(arg); - return true; + desktop.quit(); } else { - return false; + System.exit(0); } } - public String nextValue() + public static AlignFrame getCurrentAlignFrame() { - return vargs.remove(0).toString(); + return Jalview.currentAlignFrame; } - public int getSize() + public static void setCurrentAlignFrame(AlignFrame currentAlignFrame) { - return vargs.size(); + Jalview.currentAlignFrame = currentAlignFrame; } - -} - -/** - * keep track of feature fetching tasks. - * - * @author JimP - * - */ -class FeatureFetcher -{ - /* - * TODO: generalise to track all jalview events to orchestrate batch - * processing events. - */ - - private int queued = 0; - - private int running = 0; - - public FeatureFetcher() - { - - } - - public void addFetcher(final AlignFrame af, final Vector dasSources) - { - final long id = System.currentTimeMillis(); - queued++; - final FeatureFetcher us = this; - new Thread(new Runnable() - { - - @Override - public void run() - { - synchronized (us) - { - queued--; - running++; - } - - af.setProgressBar(MessageManager - .getString("status.das_features_being_retrived"), id); - af.featureSettings_actionPerformed(null); - af.featureSettings.fetchDasFeatures(dasSources, true); - af.setProgressBar(null, id); - synchronized (us) - { - running--; - } - } - }).start(); - } - - public synchronized boolean allFinished() - { - return queued == 0 && running == 0; - } - } diff --git a/src/jalview/controller/AlignViewController.java b/src/jalview/controller/AlignViewController.java index ca2ae6d..24439ca 100644 --- a/src/jalview/controller/AlignViewController.java +++ b/src/jalview/controller/AlignViewController.java @@ -238,6 +238,7 @@ public class AlignViewController implements AlignViewControllerI ColumnSelection cs = viewport.getColumnSelection(); if (bs.cardinality() > 0 || invert) { + boolean changed = false; if (cs == null) { cs = new ColumnSelection(); @@ -246,6 +247,7 @@ public class AlignViewController implements AlignViewControllerI { if (!extendCurrent) { + changed = !cs.isEmpty(); cs.clear(); } } @@ -257,6 +259,7 @@ public class AlignViewController implements AlignViewControllerI { if (ibs < 0 || i < ibs) { + changed = true; if (toggle && cs.contains(i)) { cs.removeElement(i++); @@ -278,6 +281,7 @@ public class AlignViewController implements AlignViewControllerI for (int i = bs.nextSetBit(alStart); i >= alStart; i = bs .nextSetBit(i + 1)) { + changed = true; if (toggle && cs.contains(i)) { cs.removeElement(i); @@ -288,18 +292,21 @@ public class AlignViewController implements AlignViewControllerI } } } - viewport.setColumnSelection(cs); - alignPanel.paintAlignment(true); - avcg.setStatus(MessageManager.formatMessage( - "label.view_controller_toggled_marked", - new String[] { - (toggle ? MessageManager.getString("label.toggled") - : MessageManager.getString("label.marked")), - (invert ? (Integer.valueOf((alw - alStart) - - bs.cardinality()).toString()) : (Integer - .valueOf(bs.cardinality()).toString())), - featureType, Integer.valueOf(nseq).toString() })); - return true; + if (changed) + { + viewport.setColumnSelection(cs); + alignPanel.paintAlignment(true); + avcg.setStatus(MessageManager.formatMessage( + "label.view_controller_toggled_marked", + new String[] { + (toggle ? MessageManager.getString("label.toggled") + : MessageManager.getString("label.marked")), + (invert ? (Integer.valueOf((alw - alStart) + - bs.cardinality()).toString()) : (Integer + .valueOf(bs.cardinality()).toString())), + featureType, Integer.valueOf(nseq).toString() })); + return true; + } } else { @@ -311,8 +318,8 @@ public class AlignViewController implements AlignViewControllerI cs.clear(); alignPanel.paintAlignment(true); } - return false; } + return false; } @Override diff --git a/src/jalview/datamodel/AlignedCodonFrame.java b/src/jalview/datamodel/AlignedCodonFrame.java index 6d6cdb5..326cc4e 100644 --- a/src/jalview/datamodel/AlignedCodonFrame.java +++ b/src/jalview/datamodel/AlignedCodonFrame.java @@ -23,6 +23,7 @@ package jalview.datamodel; import jalview.util.MapList; import jalview.util.MappingUtils; +import java.util.AbstractList; import java.util.ArrayList; import java.util.List; @@ -36,7 +37,7 @@ public class AlignedCodonFrame /* * Data bean to hold mappings from one sequence to another */ - private class SequenceToSequenceMapping + public class SequenceToSequenceMapping { private SequenceI fromSeq; @@ -57,6 +58,54 @@ public class AlignedCodonFrame return String.format("From %s %s", fromSeq.getName(), mapping.toString()); } + + /** + * Returns a hashCode derived from the hashcodes of the mappings and fromSeq + * + * @see SequenceToSequenceMapping#hashCode() + */ + @Override + public int hashCode() + { + return (fromSeq == null ? 0 : fromSeq.hashCode() * 31) + + mapping.hashCode(); + } + + /** + * Answers true if the objects hold the same mapping between the same two + * sequences + * + * @see Mapping#equals + */ + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof SequenceToSequenceMapping)) + { + return false; + } + SequenceToSequenceMapping that = (SequenceToSequenceMapping) obj; + if (this.mapping == null) + { + return that.mapping == null; + } + // TODO: can simplify by asserting fromSeq is a dataset sequence + return (this.fromSeq == that.fromSeq || (this.fromSeq != null + && that.fromSeq != null + && this.fromSeq.getDatasetSequence() != null && this.fromSeq + .getDatasetSequence() == that.fromSeq + .getDatasetSequence())) && this.mapping.equals(that.mapping); + } + + public SequenceI getFromSeq() + { + return fromSeq; + } + + public Mapping getMapping() + { + return mapping; + } } private List mappings; @@ -79,6 +128,21 @@ public class AlignedCodonFrame */ public void addMap(SequenceI dnaseq, SequenceI aaseq, MapList map) { + addMap(dnaseq, aaseq, map, null); + } + + /** + * Adds a mapping between the dataset sequences for the associated dna and + * protein sequence objects + * + * @param dnaseq + * @param aaseq + * @param map + * @param mapFromId + */ + public void addMap(SequenceI dnaseq, SequenceI aaseq, MapList map, + String mapFromId) + { // JBPNote DEBUG! THIS ! // dnaseq.transferAnnotation(aaseq, mp); // aaseq.transferAnnotation(dnaseq, new Mapping(map.getInverse())); @@ -90,6 +154,8 @@ public class AlignedCodonFrame /* * if we already hold a mapping between these sequences, just add to it + * note that 'adding' a duplicate map does nothing; this protects against + * creating duplicate mappings in AlignedCodonFrame */ for (SequenceToSequenceMapping ssm : mappings) { @@ -104,6 +170,7 @@ public class AlignedCodonFrame * otherwise, add a new sequence mapping */ Mapping mp = new Mapping(toSeq, map); + mp.setMappedFromId(mapFromId); mappings.add(new SequenceToSequenceMapping(fromSeq, mp)); } @@ -421,7 +488,8 @@ public class AlignedCodonFrame for (SequenceToSequenceMapping ssm : mappings) { - if (ssm.mapping.to == protein) + if (ssm.mapping.to == protein + && ssm.mapping.getMap().getFromRatio() == 3) { ml = ssm.mapping.map; dnaSeq = ssm.fromSeq; @@ -651,7 +719,7 @@ public class AlignedCodonFrame } /** - * Returns the first mapping found that is from 'fromSeq' to 'toSeq', or null + * Returns the first mapping found that is between 'fromSeq' and 'toSeq', or null * if none found * * @param fromSeq @@ -662,16 +730,54 @@ public class AlignedCodonFrame */ public Mapping getMappingBetween(SequenceI fromSeq, SequenceI toSeq) { + SequenceI dssFrom = fromSeq.getDatasetSequence() == null ? fromSeq + : fromSeq.getDatasetSequence(); + SequenceI dssTo = toSeq.getDatasetSequence() == null ? toSeq : toSeq + .getDatasetSequence(); + for (SequenceToSequenceMapping mapping : mappings) { SequenceI from = mapping.fromSeq; SequenceI to = mapping.mapping.to; - if ((from == fromSeq || from == fromSeq.getDatasetSequence()) - && (to == toSeq || to == toSeq.getDatasetSequence())) + if ((from == dssFrom && to == dssTo) + || (from == dssTo && to == dssFrom)) { return mapping.mapping; } } return null; } + + /** + * Returns a hashcode derived from the list of sequence mappings + * + * @see SequenceToSequenceMapping#hashCode() + * @see AbstractList#hashCode() + */ + @Override + public int hashCode() + { + return this.mappings.hashCode(); + } + + /** + * Two AlignedCodonFrame objects are equal if they hold the same ordered list + * of mappings + * + * @see SequenceToSequenceMapping# + */ + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof AlignedCodonFrame)) + { + return false; + } + return this.mappings.equals(((AlignedCodonFrame) obj).mappings); + } + + public List getMappings() + { + return mappings; + } } diff --git a/src/jalview/datamodel/Alignment.java b/src/jalview/datamodel/Alignment.java index a9b0d53..d737bd5 100755 --- a/src/jalview/datamodel/Alignment.java +++ b/src/jalview/datamodel/Alignment.java @@ -44,7 +44,7 @@ import java.util.Vector; */ public class Alignment implements AlignmentI { - protected Alignment dataset; + private Alignment dataset; protected List sequences; @@ -109,7 +109,10 @@ public class Alignment implements AlignmentI /* * Share the same dataset sequence mappings (if any). */ - this.setCodonFrames(al.getCodonFrames()); + if (dataset == null && al.getDataset() == null) + { + this.setCodonFrames(al.getCodonFrames()); + } } /** @@ -986,7 +989,7 @@ public class Alignment implements AlignmentI } @Override - public void setDataset(Alignment data) + public void setDataset(AlignmentI data) { if (dataset == null && data == null) { @@ -994,7 +997,12 @@ public class Alignment implements AlignmentI } else if (dataset == null && data != null) { - dataset = data; + if (!(data instanceof Alignment)) + { + throw new Error( + "Implementation Error: jalview.datamodel.Alignment does not yet support other implementations of AlignmentI as its dataset reference"); + } + dataset = (Alignment) data; for (int i = 0; i < getHeight(); i++) { SequenceI currentSeq = getSequenceAt(i); @@ -1340,6 +1348,10 @@ public class Alignment implements AlignmentI @Override public List getCodonFrames() { + // TODO: Fix this method to fix failing AlignedCodonFrame tests + // this behaviour is currently incorrect. method should return codon frames + // for just the alignment, + // selected from dataset return dataset != null ? dataset.getCodonFrames() : codonFrameList; } @@ -1361,11 +1373,7 @@ public class Alignment implements AlignmentI @Override public void append(AlignmentI toappend) { - if (toappend == this) - { - System.err.println("Self append may cause a deadlock."); - } - // TODO test this method for a future 2.5 release + // TODO JAL-1270 needs test coverage // currently tested for use in jalview.gui.SequenceFetcher boolean samegap = toappend.getGapCharacter() == getGapCharacter(); char oldc = toappend.getGapCharacter(); @@ -1376,6 +1384,8 @@ public class Alignment implements AlignmentI .getFullAlignment().getSequences() : toappend.getSequences(); if (sqs != null) { + // avoid self append deadlock by + List toappendsq = new ArrayList(); synchronized (sqs) { for (SequenceI addedsq : sqs) @@ -1391,9 +1401,13 @@ public class Alignment implements AlignmentI } } } - addSequence(addedsq); + toappendsq.add(addedsq); } } + for (SequenceI addedsq : toappendsq) + { + addSequence(addedsq); + } } AlignmentAnnotation[] alan = toappend.getAlignmentAnnotation(); for (int a = 0; alan != null && a < alan.length; a++) @@ -1401,6 +1415,7 @@ public class Alignment implements AlignmentI addAnnotation(alan[a]); } + // use add method getCodonFrames().addAll(toappend.getCodonFrames()); List sg = toappend.getGroups(); @@ -1691,9 +1706,11 @@ public class Alignment implements AlignmentI * Parameters control whether gaps in exon (mapped) and intron (unmapped) * regions are preserved. Gaps that connect introns to exons are treated * conservatively, i.e. only preserved if both intron and exon gaps are - * preserved. + * preserved. TODO: check caveats below where the implementation fails * * @param al + * - must have same dataset, and sequences in al must have equivalent + * dataset sequence and start/end bounds under given mapping * @param preserveMappedGaps * if true, gaps within and between mapped codons are preserved * @param preserveUnmappedGaps @@ -1710,6 +1727,10 @@ public class Alignment implements AlignmentI { return AlignmentUtils.alignProteinAsDna(this, al); } + else if (thatIsProtein && thisIsNucleotide) + { + return AlignmentUtils.alignCdsAsProtein(this, al); + } return AlignmentUtils.alignAs(this, al); } diff --git a/src/jalview/datamodel/AlignmentI.java b/src/jalview/datamodel/AlignmentI.java index 76d1a48..c15bb99 100755 --- a/src/jalview/datamodel/AlignmentI.java +++ b/src/jalview/datamodel/AlignmentI.java @@ -305,7 +305,7 @@ public interface AlignmentI extends AnnotatedCollectionI * @return Alignment containing dataset sequences or null of this is a * dataset. */ - Alignment getDataset(); + AlignmentI getDataset(); /** * Set the associated dataset for the alignment, or create one. @@ -313,7 +313,7 @@ public interface AlignmentI extends AnnotatedCollectionI * @param dataset * The dataset alignment or null to construct one. */ - void setDataset(Alignment dataset); + void setDataset(AlignmentI dataset); /** * pads sequences with gaps (to ensure the set looks like an alignment) diff --git a/src/jalview/datamodel/ColumnSelection.java b/src/jalview/datamodel/ColumnSelection.java index e3a8472..aaf70b8 100644 --- a/src/jalview/datamodel/ColumnSelection.java +++ b/src/jalview/datamodel/ColumnSelection.java @@ -32,10 +32,14 @@ import java.util.List; import java.util.Vector; /** - * NOTE: Columns are zero based. + * Data class holding the selected columns and hidden column ranges for a view. + * Ranges are base 1. */ public class ColumnSelection { + /** + * A class to hold an efficient representation of selected columns + */ private class IntList { /* @@ -205,9 +209,26 @@ public class ColumnSelection } return rlist; } + + @Override + public int hashCode() + { + // TODO Auto-generated method stub + return selected.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof IntList) + { + return ((IntList) obj).selected.equals(selected); + } + return false; + } } - IntList selected = new IntList(); + IntList selection = new IntList(); /* * list of hidden column [start, end] ranges; the list is maintained in @@ -223,7 +244,7 @@ public class ColumnSelection */ public void addElement(int col) { - selected.add(col); + selection.add(col); } /** @@ -231,7 +252,7 @@ public class ColumnSelection */ public void clear() { - selected.clear(); + selection.clear(); } /** @@ -242,7 +263,7 @@ public class ColumnSelection */ public void removeElement(int col) { - selected.remove(col); + selection.remove(col); } /** @@ -259,9 +280,9 @@ public class ColumnSelection for (int i = start; i < end; i++) { colInt = new Integer(i); - if (selected.contains(colInt)) + if (selection.contains(colInt)) { - selected.remove(colInt); + selection.remove(colInt); } } } @@ -273,7 +294,7 @@ public class ColumnSelection */ public List getSelected() { - return selected.getList(); + return selection.getList(); } /** @@ -282,7 +303,7 @@ public class ColumnSelection */ public List getSelectedRanges() { - return selected.getRanges(); + return selection.getRanges(); } /** @@ -294,7 +315,7 @@ public class ColumnSelection */ public boolean contains(int col) { - return (col > -1) ? selected.isSelected(col) : false; + return (col > -1) ? selection.isSelected(col) : false; } /** @@ -302,7 +323,7 @@ public class ColumnSelection */ public boolean isEmpty() { - return selected == null || selected.isEmpty(); + return selection == null || selection.isEmpty(); } /** @@ -312,11 +333,11 @@ public class ColumnSelection */ public int getMax() { - if (selected.isEmpty()) + if (selection.isEmpty()) { return -1; } - return selected.getMaxColumn(); + return selection.getMaxColumn(); } /** @@ -326,11 +347,11 @@ public class ColumnSelection */ public int getMin() { - if (selected.isEmpty()) + if (selection.isEmpty()) { return 1000000000; } - return selected.getMinColumn(); + return selection.getMinColumn(); } /** @@ -344,7 +365,7 @@ public class ColumnSelection public List compensateForEdit(int start, int change) { List deletedHiddenColumns = null; - selected.compensateForEdits(start, change); + selection.compensateForEdits(start, change); if (hiddenColumns != null) { @@ -394,7 +415,7 @@ public class ColumnSelection private void compensateForDelEdits(int start, int change) { - selected.compensateForEdits(start, change); + selection.compensateForEdits(start, change); if (hiddenColumns != null) { @@ -571,12 +592,12 @@ public class ColumnSelection hiddenColumns = null; } } - if (selected != null && selected.size() > 0) + if (selection != null && selection.size() > 0) { - selected.pruneColumnList(shifts); - if (selected != null && selected.size() == 0) + selection.pruneColumnList(shifts); + if (selection != null && selection.size() == 0) { - selected = null; + selection = null; } } // and shift the rest. @@ -600,7 +621,7 @@ public class ColumnSelection * Return absolute column index for a visible column index * * @param column - * int column index in alignment view + * int column index in alignment view (count from zero) * @return alignment column index for column */ public int adjustForHiddenColumns(int column) @@ -743,13 +764,13 @@ public class ColumnSelection public void hideSelectedColumns() { - synchronized (selected) + synchronized (selection) { - for (int[] selregions : selected.getRanges()) + for (int[] selregions : selection.getRanges()) { hideColumns(selregions[0], selregions[1]); } - selected.clear(); + selection.clear(); } } @@ -927,12 +948,12 @@ public class ColumnSelection { if (copy != null) { - if (copy.selected != null) + if (copy.selection != null) { - selected = new IntList(); - for (int i = 0, j = copy.selected.size(); i < j; i++) + selection = new IntList(); + for (int i = 0, j = copy.selection.size(); i < j; i++) { - selected.add(copy.selected.elementAt(i)); + selection.add(copy.selection.elementAt(i)); } } if (copy.hiddenColumns != null) @@ -1307,7 +1328,7 @@ public class ColumnSelection { if (hiddenColumns != null && isVisible(col.intValue())) { - selected.add(col); + selection.add(col); } } } @@ -1321,8 +1342,8 @@ public class ColumnSelection */ public void setElementsFrom(ColumnSelection colsel) { - selected = new IntList(); - if (colsel.selected != null && colsel.selected.size() > 0) + selection = new IntList(); + if (colsel.selection != null && colsel.selection.size() > 0) { if (hiddenColumns != null && hiddenColumns.size() > 0) { @@ -1489,7 +1510,7 @@ public class ColumnSelection */ public boolean hasSelectedColumns() { - return (selected != null && selected.size() > 0); + return (selection != null && selection.size() > 0); } /** @@ -1612,4 +1633,74 @@ public class ColumnSelection return false; } + /** + * Returns a hashCode built from selected columns and hidden column ranges + */ + @Override + public int hashCode() + { + int hashCode = selection.hashCode(); + if (hiddenColumns != null) + { + for (int[] hidden : hiddenColumns) + { + hashCode = 31 * hashCode + hidden[0]; + hashCode = 31 * hashCode + hidden[1]; + } + } + return hashCode; + } + + /** + * Answers true if comparing to a ColumnSelection with the same selected + * columns and hidden columns, else false + */ + @Override + public boolean equals(Object obj) + { + if (!(obj instanceof ColumnSelection)) + { + return false; + } + ColumnSelection that = (ColumnSelection) obj; + + /* + * check columns selected are either both null, or match + */ + if (this.selection == null) + { + if (that.selection != null) + { + return false; + } + } + if (!this.selection.equals(that.selection)) + { + return false; + } + + /* + * check hidden columns are either both null, or match + */ + if (this.hiddenColumns == null) + { + return (that.hiddenColumns == null); + } + if (that.hiddenColumns == null + || that.hiddenColumns.size() != this.hiddenColumns.size()) + { + return false; + } + int i = 0; + for (int[] thisRange : hiddenColumns) + { + int[] thatRange = that.hiddenColumns.get(i++); + if (thisRange[0] != thatRange[0] || thisRange[1] != thatRange[1]) + { + return false; + } + } + return true; + } + } diff --git a/src/jalview/datamodel/DBRefEntry.java b/src/jalview/datamodel/DBRefEntry.java index 53642b5..efdf0ac 100755 --- a/src/jalview/datamodel/DBRefEntry.java +++ b/src/jalview/datamodel/DBRefEntry.java @@ -98,6 +98,85 @@ public class DBRefEntry implements DBRefEntryI } /** + * Answers true if this object is either equivalent to, or can be 'improved' + * by, the given entry. Specifically, answers true if + *
          + *
        • source and accession are identical (ignoring case)
        • + *
        • version is identical (ignoring case), or this version is of the format + * "someSource:0", in which case the version for the other entry replaces it
        • + *
        • mappings are not compared but if this entry has no mapping, replace + * with that for the other entry
        • + *
        + * + * @param other + * @return + */ + @Override + public boolean updateFrom(DBRefEntryI other) + { + if (other == null) + { + return false; + } + if (other == this) + { + return true; + } + + /* + * source must either match or be both null + */ + String otherSource = other.getSource(); + if ((source == null && otherSource != null) + || (source != null && otherSource == null) + || (source != null && !source.equalsIgnoreCase(otherSource))) + { + return false; + } + + /* + * accession id must either match or be both null + */ + String otherAccession = other.getAccessionId(); + if ((accessionId == null && otherAccession != null) + || (accessionId != null && otherAccession == null) + || (accessionId != null && !accessionId.equalsIgnoreCase(otherAccession))) + { + return false; + } + + /* + * if my version is null, "0" or "source:0" then replace with other version, + * otherwise the versions have to match + */ + String otherVersion = other.getVersion(); + + if ((version == null || version.equals("0") || version.endsWith(":0")) + && otherVersion != null) + { + setVersion(otherVersion); + } + else + { + if (version != null + && (otherVersion == null || !version + .equalsIgnoreCase(otherVersion))) + { + return false; + } + } + + /* + * if I have no mapping, take that of the other dbref + */ + if (map == null) + { + setMap(other.getMap()); + } + return true; + } + + /** * test for similar DBRef attributes, except for the map object. * * @param entry @@ -106,6 +185,7 @@ public class DBRefEntry implements DBRefEntryI @Override public boolean equalRef(DBRefEntryI entry) { + // TODO is this method and equals() not needed? if (entry == null) { return false; diff --git a/src/jalview/datamodel/DBRefSource.java b/src/jalview/datamodel/DBRefSource.java index 91b49eb..cf15ff8 100755 --- a/src/jalview/datamodel/DBRefSource.java +++ b/src/jalview/datamodel/DBRefSource.java @@ -23,7 +23,10 @@ package jalview.datamodel; /** * Defines internal constants for unambiguous annotation of DbRefEntry source * strings and describing the data retrieved from external database sources (see - * jalview.ws.DbSourcProxy) + * jalview.ws.DbSourcProxy)
        + * TODO: replace with ontology to allow recognition of particular attributes + * (e.g. protein coding, alignment (ortholog db, paralog db, domain db), + * genomic, transcriptomic, 3D structure providing (PDB, MODBASE, etc) ..). * * @author JimP * @@ -88,6 +91,8 @@ public class DBRefSource */ public static final String ENSEMBL = "ENSEMBL"; + public static final String ENSEMBLGENOMES = "ENSEMBLGENOMES"; + /** * List of databases whose sequences might have coding regions annotated */ diff --git a/src/jalview/datamodel/FeatureProperties.java b/src/jalview/datamodel/FeatureProperties.java index d25eb96..2306bec 100644 --- a/src/jalview/datamodel/FeatureProperties.java +++ b/src/jalview/datamodel/FeatureProperties.java @@ -28,8 +28,7 @@ package jalview.datamodel; */ public class FeatureProperties { - - private static final String EMBL_CODING_FEATURE = "CDS"; + public static final String EMBL_CODING_FEATURE = "CDS"; public static final String EXONPOS = "exon number"; diff --git a/src/jalview/datamodel/HiddenSequences.java b/src/jalview/datamodel/HiddenSequences.java index dcc5f26..8ca3c5a 100755 --- a/src/jalview/datamodel/HiddenSequences.java +++ b/src/jalview/datamodel/HiddenSequences.java @@ -33,11 +33,21 @@ public class HiddenSequences AlignmentI alignment; + /** + * Constructor given a reference to an alignment (with no hidden sequences) + * + * @param al + */ public HiddenSequences(AlignmentI al) { alignment = al; } + /** + * Answers the number of hidden sequences + * + * @return + */ public int getSize() { if (hiddenSequences == null) @@ -45,9 +55,9 @@ public class HiddenSequences return 0; } int count = 0; - for (int i = 0; i < hiddenSequences.length; i++) + for (SequenceI seq : hiddenSequences) { - if (hiddenSequences[i] != null) + if (seq != null) { count++; } @@ -56,15 +66,23 @@ public class HiddenSequences return count; } + /** + * Answers the length of the longest hidden sequence + * + * @return + */ public int getWidth() { + if (hiddenSequences == null) + { + return 0; + } int width = 0; - for (int i = 0; i < hiddenSequences.length; i++) + for (SequenceI seq : hiddenSequences) { - if (hiddenSequences[i] != null - && hiddenSequences[i].getLength() > width) + if (seq != null && seq.getLength() > width) { - width = hiddenSequences[i].getLength(); + width = seq.getLength(); } } @@ -72,7 +90,7 @@ public class HiddenSequences } /** - * Call this method if sequences are removed from the main alignment + * Call this method after a sequence is removed from the main alignment */ public void adjustHeightSequenceDeleted(int seqIndex) { @@ -108,8 +126,7 @@ public class HiddenSequences } /** - * Call this method if sequences are added to or removed from the main - * alignment + * Call this method after a sequence is added to the main alignment */ public void adjustHeightSequenceAdded() { @@ -125,6 +142,11 @@ public class HiddenSequences hiddenSequences = tmp; } + /** + * Mark the specified sequence as hidden + * + * @param sequence + */ public void hideSequence(SequenceI sequence) { if (hiddenSequences == null) @@ -163,6 +185,17 @@ public class HiddenSequences return revealedSeqs; } + /** + * Reveals (unhides) consecutive hidden sequences just above the given + * alignment index. The revealed sequences are selected (including their + * visible representative sequence if there was one and 'reveal' is being + * performed on it). + * + * @param alignmentIndex + * @param hiddenRepSequences + * a map of representative sequences to the sequences they represent + * @return + */ public List showSequence(int alignmentIndex, Map hiddenRepSequences) { @@ -203,20 +236,22 @@ public class HiddenSequences + " has been deleted whilst hidden"); } } - } } - return revealedSeqs; } public SequenceI getHiddenSequence(int alignmentIndex) { - return hiddenSequences[alignmentIndex]; + return hiddenSequences == null ? null : hiddenSequences[alignmentIndex]; } public int findIndexWithoutHiddenSeqs(int alignmentIndex) { + if (hiddenSequences == null) + { + return alignmentIndex; + } int index = 0; int hiddenSeqs = 0; if (hiddenSequences.length <= alignmentIndex) @@ -232,13 +267,16 @@ public class HiddenSequences } index++; } - ; return (alignmentIndex - hiddenSeqs); } public int adjustForHiddenSeqs(int alignmentIndex) { + if (hiddenSequences == null) + { + return alignmentIndex; + } int index = 0; int hSize = hiddenSequences.length; while (index <= alignmentIndex && index < hSize) @@ -254,22 +292,36 @@ public class HiddenSequences return alignmentIndex; } + /** + * makes a copy of the alignment with hidden sequences included. Using the + * copy for anything other than simple output is not recommended. Note - this + * method DOES NOT USE THE AlignmentI COPY CONSTRUCTOR! + * @return + */ public AlignmentI getFullAlignment() { - int isize = hiddenSequences.length; - SequenceI[] seq = new Sequence[isize]; - - int index = 0; - for (int i = 0; i < hiddenSequences.length; i++) + SequenceI[] seq; + if (hiddenSequences == null) { - if (hiddenSequences[i] != null) - { - seq[i] = hiddenSequences[i]; - } - else + seq = alignment.getSequencesArray(); + } + else + { + int isize = hiddenSequences.length; + seq = new Sequence[isize]; + + int index = 0; + for (int i = 0; i < hiddenSequences.length; i++) { - seq[i] = alignment.getSequenceAt(index); - index++; + if (hiddenSequences[i] != null) + { + seq[i] = hiddenSequences[i]; + } + else + { + seq[i] = alignment.getSequenceAt(index); + index++; + } } } Alignment fAlignmt = new Alignment(seq); @@ -277,6 +329,7 @@ public class HiddenSequences fAlignmt.alignmentProperties = alignment.getProperties(); fAlignmt.groups = alignment.getGroups(); fAlignmt.hasRNAStructure = alignment.hasRNAStructure(); + fAlignmt.setSeqrep(alignment.getSeqrep()); return fAlignmt; } diff --git a/src/jalview/datamodel/Mapping.java b/src/jalview/datamodel/Mapping.java index bd83fe9..1c196be 100644 --- a/src/jalview/datamodel/Mapping.java +++ b/src/jalview/datamodel/Mapping.java @@ -20,6 +20,7 @@ */ package jalview.datamodel; +import jalview.util.Comparison; import jalview.util.MapList; import java.util.Iterator; @@ -258,7 +259,8 @@ public class Mapping int truePos = sequencePos - (start - 1); while (alignedBases < truePos && alignedColumn < alignedSeq.length) { - if (alignedSeq[alignedColumn++] != gap) + char c = alignedSeq[alignedColumn++]; + if (c != gap && !Comparison.isGap(c)) { alignedBases++; } @@ -274,18 +276,23 @@ public class Mapping } - /** + /* * Contains the start-end pairs mapping from the associated sequence to the * sequence in the database coordinate system. It also takes care of step * difference between coordinate systems. */ MapList map = null; - /** + /* * The sequence that map maps the associated sequence to (if any). */ SequenceI to = null; + /* + * optional sequence id for the 'from' ranges + */ + private String mappedFromId; + public Mapping(MapList map) { super(); @@ -333,6 +340,7 @@ public class Mapping map = new MapList(map2.map); } to = map2.to; + mappedFromId = map2.mappedFromId; } } @@ -356,14 +364,13 @@ public class Mapping /** * Equals that compares both the to references and MapList mappings. * - * @param other + * @param o * @return + * @see MapList#equals */ @Override public boolean equals(Object o) { - // TODO should override Object.hashCode() to ensure that equal objects have - // equal hashcodes if (o == null || !(o instanceof Mapping)) { return false; @@ -390,6 +397,21 @@ public class Mapping } /** + * Returns a hashCode made from the sequence and maplist + */ + @Override + public int hashCode() + { + int hashCode = (this.to == null ? 1 : this.to.hashCode()); + if (this.map != null) + { + hashCode = hashCode * 31 + this.map.hashCode(); + } + + return hashCode; + } + + /** * get the 'initial' position in the associated sequence for a position in the * mapped reference frame * @@ -728,4 +750,22 @@ public class Mapping : this.to.getName()); } + /** + * Returns the identifier for the 'from' range sequence, or null if not set + * + * @return + */ + public String getMappedFromId() + { + return mappedFromId; + } + + /** + * Sets the identifier for the 'from' range sequence + */ + public void setMappedFromId(String mappedFromId) + { + this.mappedFromId = mappedFromId; + } + } diff --git a/src/jalview/datamodel/Sequence.java b/src/jalview/datamodel/Sequence.java index a61f093..31ffdfd 100755 --- a/src/jalview/datamodel/Sequence.java +++ b/src/jalview/datamodel/Sequence.java @@ -966,26 +966,25 @@ public class Sequence extends ASequence implements SequenceI dbrefs = new DBRefEntry[0]; } - int i, iSize = dbrefs.length; - - for (i = 0; i < iSize; i++) + for (DBRefEntryI dbr : dbrefs) { - if (dbrefs[i].equalRef(entry)) + if (dbr.updateFrom(entry)) { - if (entry.getMap() != null) - { - if (dbrefs[i].getMap() == null) - { - // overwrite with 'superior' entry that contains a mapping. - dbrefs[i] = entry; - } - } + /* + * found a dbref that either matched, or could be + * updated from, the new entry - no need to add it + */ return; } } - DBRefEntry[] temp = new DBRefEntry[iSize + 1]; - System.arraycopy(dbrefs, 0, temp, 0, iSize); + /* + * extend the array to make room for one more + */ + // TODO use an ArrayList instead + int j = dbrefs.length; + DBRefEntry[] temp = new DBRefEntry[j + 1]; + System.arraycopy(dbrefs, 0, temp, 0, j); temp[temp.length - 1] = entry; dbrefs = temp; @@ -1087,6 +1086,25 @@ public class Sequence extends ASequence implements SequenceI return new Sequence(this); } + private boolean _isNa; + + private long _seqhash = 0; + + @Override + public boolean isProtein() + { + if (datasetSequence != null) + { + return datasetSequence.isProtein(); + } + if (_seqhash != sequence.hashCode()) + { + _seqhash = sequence.hashCode(); + _isNa=jalview.util.Comparison.isNucleotide(new SequenceI[] { this }); + } + return !_isNa; + }; + /* * (non-Javadoc) * diff --git a/src/jalview/datamodel/SequenceFeature.java b/src/jalview/datamodel/SequenceFeature.java index f2eb8ac..c75d6f2 100755 --- a/src/jalview/datamodel/SequenceFeature.java +++ b/src/jalview/datamodel/SequenceFeature.java @@ -39,6 +39,9 @@ public class SequenceFeature // private key for Phase designed not to conflict with real GFF data private static final String PHASE = "!Phase"; + // private key for ENA location designed not to conflict with real GFF data + private static final String LOCATION = "!Location"; + /* * ATTRIBUTES is reserved for the GFF 'column 9' data, formatted as * name1=value1;name2=value2,value3;...etc @@ -55,6 +58,10 @@ public class SequenceFeature public String description; + /* + * a map of key-value pairs; may be populated from GFF 'column 9' data, + * other data sources (e.g. GenBank file), or programmatically + */ public Map otherDetails; public Vector links; @@ -480,6 +487,26 @@ public class SequenceFeature } /** + * Sets the 'raw' ENA format location specifier e.g. join(12..45,89..121) + * + * @param loc + */ + public void setEnaLocation(String loc) + { + setValue(LOCATION, loc); + } + + /** + * Gets the 'raw' ENA format location specifier e.g. join(12..45,89..121) + * + * @param loc + */ + public String getEnaLocation() + { + return (String) getValue(LOCATION); + } + + /** * Readable representation, for debug only, not guaranteed not to change * between versions */ diff --git a/src/jalview/datamodel/SequenceGroup.java b/src/jalview/datamodel/SequenceGroup.java index 0e8fa17..d403d6e 100755 --- a/src/jalview/datamodel/SequenceGroup.java +++ b/src/jalview/datamodel/SequenceGroup.java @@ -894,6 +894,7 @@ public class SequenceGroup implements AnnotatedCollectionI /** * @return the representative sequence for this group */ + @Override public SequenceI getSeqrep() { return seqrep; @@ -906,6 +907,7 @@ public class SequenceGroup implements AnnotatedCollectionI * @param seqrep * the seqrep to set (null means no sequence representative) */ + @Override public void setSeqrep(SequenceI seqrep) { this.seqrep = seqrep; @@ -915,6 +917,7 @@ public class SequenceGroup implements AnnotatedCollectionI * * @return true if group has a sequence representative */ + @Override public boolean hasSeqrep() { return seqrep != null; @@ -1036,7 +1039,8 @@ public class SequenceGroup implements AnnotatedCollectionI /** * - * @return automatically calculated consensus row + * @return automatically calculated consensus row note: the row is a stub if a + * consensus calculation has not yet been performed on the group */ public AlignmentAnnotation getConsensus() { diff --git a/src/jalview/datamodel/SequenceI.java b/src/jalview/datamodel/SequenceI.java index 60040d8..45a767c 100755 --- a/src/jalview/datamodel/SequenceI.java +++ b/src/jalview/datamodel/SequenceI.java @@ -219,6 +219,12 @@ public interface SequenceI extends ASequenceI public int[] findPositionMap(); /** + * + * @return true if sequence is composed of amino acid characters + */ + public boolean isProtein(); + + /** * Delete a range of aligned sequence columns, creating a new dataset sequence * if necessary and adjusting start and end positions accordingly. * @@ -233,19 +239,21 @@ public interface SequenceI extends ASequenceI * DOCUMENT ME! * * @param i - * DOCUMENT ME! + * alignment column number * @param c - * DOCUMENT ME! + * character to insert */ public void insertCharAt(int i, char c); /** - * DOCUMENT ME! + * insert given character at alignment column position * * @param position - * DOCUMENT ME! + * alignment column number + * @param count + * length of insert * @param ch - * DOCUMENT ME! + * character to insert */ public void insertCharAt(int position, int count, char ch); @@ -435,7 +443,21 @@ public interface SequenceI extends ASequenceI */ public PDBEntry getPDBEntry(String pdbId); + /** + * Set the distinct source database, and accession number from which a + * sequence and its start-end data were derived from. This is very important + * for SIFTS mappings and must be set prior to performing SIFTS mapping. + * + * @param dbRef + * the source dbRef for the sequence + */ public void setSourceDBRef(DBRefEntryI dbRef); + /** + * Get the distinct source database, and accession number from which a + * sequence and its start-end data were derived from. + * + * @return + */ public DBRefEntryI getSourceDBRef(); } diff --git a/src/jalview/datamodel/xdb/embl/BasePosition.java b/src/jalview/datamodel/xdb/embl/BasePosition.java deleted file mode 100644 index 3737adc..0000000 --- a/src/jalview/datamodel/xdb/embl/BasePosition.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * This file is part of Jalview. - * - * Jalview is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 - * of the License, or (at your option) any later version. - * - * Jalview is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Jalview. If not, see . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.datamodel.xdb.embl; - -/** - * Data model for a feature/location/locationElement/basePosition read from an - * EMBL query reply - * - * @see embl_mapping.xml - */ -public class BasePosition -{ - String type; - - String pos; - - /** - * @return the pos - */ - public String getPos() - { - return pos; - } - - /** - * @param pos - * the pos to set - */ - public void setPos(String pos) - { - this.pos = pos; - } - - /** - * @return the type - */ - public String getType() - { - return type; - } - - /** - * @param type - * the type to set - */ - public void setType(String type) - { - this.type = type; - } -} diff --git a/src/jalview/datamodel/xdb/embl/EmblEntry.java b/src/jalview/datamodel/xdb/embl/EmblEntry.java index 691a4c9..56b1325 100644 --- a/src/jalview/datamodel/xdb/embl/EmblEntry.java +++ b/src/jalview/datamodel/xdb/embl/EmblEntry.java @@ -21,6 +21,7 @@ package jalview.datamodel.xdb.embl; import jalview.analysis.SequenceIdMatcher; +import jalview.bin.Cache; import jalview.datamodel.DBRefEntry; import jalview.datamodel.DBRefSource; import jalview.datamodel.FeatureProperties; @@ -29,10 +30,12 @@ import jalview.datamodel.Sequence; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.util.DBRefUtils; +import jalview.util.DnaUtils; import jalview.util.MapList; import jalview.util.MappingUtils; import jalview.util.StringUtils; +import java.text.ParseException; import java.util.Arrays; import java.util.Hashtable; import java.util.List; @@ -57,17 +60,29 @@ public class EmblEntry String accession; - String version; + String entryVersion; - String taxDivision; + String sequenceVersion; - String desc; + String dataClass; - String rCreated; + String moleculeType; - String rLastUpdated; + String topology; - String lastUpdated; + String sequenceLength; + + String taxonomicDivision; + + String description; + + String firstPublicDate; + + String firstPublicRelease; + + String lastUpdatedDate; + + String lastUpdatedRelease; Vector keywords; @@ -112,23 +127,6 @@ public class EmblEntry } /** - * @return the desc - */ - public String getDesc() - { - return desc; - } - - /** - * @param desc - * the desc to set - */ - public void setDesc(String desc) - { - this.desc = desc; - } - - /** * @return the features */ public Vector getFeatures() @@ -163,57 +161,6 @@ public class EmblEntry } /** - * @return the lastUpdated - */ - public String getLastUpdated() - { - return lastUpdated; - } - - /** - * @param lastUpdated - * the lastUpdated to set - */ - public void setLastUpdated(String lastUpdated) - { - this.lastUpdated = lastUpdated; - } - - /** - * @return the releaseCreated - */ - public String getRCreated() - { - return rCreated; - } - - /** - * @param releaseCreated - * the releaseCreated to set - */ - public void setRCreated(String releaseCreated) - { - this.rCreated = releaseCreated; - } - - /** - * @return the releaseLastUpdated - */ - public String getRLastUpdated() - { - return rLastUpdated; - } - - /** - * @param releaseLastUpdated - * the releaseLastUpdated to set - */ - public void setRLastUpdated(String releaseLastUpdated) - { - this.rLastUpdated = releaseLastUpdated; - } - - /** * @return the sequence */ public EmblSequence getSequence() @@ -231,40 +178,6 @@ public class EmblEntry } /** - * @return the taxDivision - */ - public String getTaxDivision() - { - return taxDivision; - } - - /** - * @param taxDivision - * the taxDivision to set - */ - public void setTaxDivision(String taxDivision) - { - this.taxDivision = taxDivision; - } - - /** - * @return the version - */ - public String getVersion() - { - return version; - } - - /** - * @param version - * the version to set - */ - public void setVersion(String version) - { - this.version = version; - } - - /** * Recover annotated sequences from EMBL file * * @param sourceDb @@ -274,38 +187,38 @@ public class EmblEntry */ public SequenceI getSequence(String sourceDb, List peptides) { - SequenceI dna = new Sequence(sourceDb + "|" + accession, - sequence.getSequence()); - dna.setDescription(desc); - DBRefEntry retrievedref = new DBRefEntry(sourceDb, version, accession); + SequenceI dna = makeSequence(sourceDb); + dna.setDescription(description); + DBRefEntry retrievedref = new DBRefEntry(sourceDb, + getSequenceVersion(), accession); dna.addDBRef(retrievedref); + dna.setSourceDBRef(retrievedref); // add map to indicate the sequence is a valid coordinate frame for the // dbref retrievedref.setMap(new Mapping(null, new int[] { 1, dna.getLength() }, new int[] { 1, dna.getLength() }, 1, 1)); - // TODO: transform EMBL Database refs to canonical form + + + /* + * transform EMBL Database refs to canonical form + */ if (dbRefs != null) { for (DBRefEntry dbref : dbRefs) { + dbref.setSource(DBRefUtils.getCanonicalName(dbref.getSource())); dna.addDBRef(dbref); } } + SequenceIdMatcher matcher = new SequenceIdMatcher(peptides); try { for (EmblFeature feature : features) { - if (feature.dbRefs != null) - { - for (DBRefEntry dbref : feature.dbRefs) - { - dna.addDBRef(dbref); - } - } if (FeatureProperties.isCodingFeature(sourceDb, feature.getName())) { - parseCodingFeature(feature, sourceDb, dna, peptides); + parseCodingFeature(feature, sourceDb, dna, peptides, matcher); } } } catch (Exception e) @@ -322,6 +235,17 @@ public class EmblEntry } /** + * @param sourceDb + * @return + */ + SequenceI makeSequence(String sourceDb) + { + SequenceI dna = new Sequence(sourceDb + "|" + accession, + sequence.getSequence()); + return dna; + } + + /** * Extracts coding region and product from a CDS feature and properly decorate * it with annotations. * @@ -333,19 +257,20 @@ public class EmblEntry * parent dna sequence for this record * @param peptides * list of protein product sequences for Embl entry + * @param matcher + * helper to match xrefs in already retrieved sequences */ void parseCodingFeature(EmblFeature feature, String sourceDb, - SequenceI dna, List peptides) + SequenceI dna, List peptides, SequenceIdMatcher matcher) { boolean isEmblCdna = sourceDb.equals(DBRefSource.EMBLCDS); - int[] exon = getCdsRanges(feature); + int[] exons = getCdsRanges(feature); - String prseq = null; - String prname = ""; - String prid = null; + String translation = null; + String proteinName = ""; + String proteinId = null; Map vals = new Hashtable(); - SequenceIdMatcher matcher = new SequenceIdMatcher(peptides); /* * codon_start 1/2/3 in EMBL corresponds to phase 0/1/2 in CDS @@ -365,17 +290,17 @@ public class EmblEntry if (qname.equals("translation")) { // remove all spaces (precompiled String.replaceAll(" ", "")) - prseq = SPACE_PATTERN.matcher(q.getValues()[0]).replaceAll(""); + translation = SPACE_PATTERN.matcher(q.getValues()[0]).replaceAll(""); } else if (qname.equals("protein_id")) { - prid = q.getValues()[0]; + proteinId = q.getValues()[0].trim(); } else if (qname.equals("codon_start")) { try { - codonStart = Integer.parseInt(q.getValues()[0]); + codonStart = Integer.parseInt(q.getValues()[0].trim()); } catch (NumberFormatException e) { System.err.println("Invalid codon_start in XML for " @@ -385,7 +310,7 @@ public class EmblEntry else if (qname.equals("product")) { // sometimes name is returned e.g. for V00488 - prname = q.getValues()[0]; + proteinName = q.getValues()[0].trim(); } else { @@ -401,54 +326,59 @@ public class EmblEntry } } - DBRefEntry protEMBLCDS = null; - exon = MappingUtils.removeStartPositions(codonStart - 1, exon); - boolean noProteinDbref = true; + DBRefEntry proteinToEmblProteinRef = null; + exons = MappingUtils.removeStartPositions(codonStart - 1, exons); SequenceI product = null; - Mapping map = null; - if (prseq != null && prname != null && prid != null) + Mapping dnaToProteinMapping = null; + if (translation != null && proteinName != null && proteinId != null) { + int translationLength = translation.length(); + /* * look for product in peptides list, if not found, add it */ - product = matcher.findIdMatch(prid); + product = matcher.findIdMatch(proteinId); if (product == null) { - product = new Sequence(prid, prseq, 1, prseq.length()); - product.setDescription(((prname.length() == 0) ? "Protein Product from " + product = new Sequence(proteinId, translation, 1, translationLength); + product.setDescription(((proteinName.length() == 0) ? "Protein Product from " + sourceDb - : prname)); + : proteinName)); peptides.add(product); matcher.add(product); } // we have everything - create the mapping and perhaps the protein // sequence - if (exon == null || exon.length == 0) + if (exons == null || exons.length == 0) { + /* + * workaround until we handle dna location for CDS sequence + * e.g. location="X53828.1:60..1058" correctly + */ System.err .println("Implementation Notice: EMBLCDS records not properly supported yet - Making up the CDNA region of this sequence... may be incorrect (" + sourceDb + ":" + getAccession() + ")"); - if (prseq.length() * 3 == (1 - codonStart + dna.getSequence().length)) + if (translationLength * 3 == (1 - codonStart + dna.getSequence().length)) { System.err .println("Not allowing for additional stop codon at end of cDNA fragment... !"); - // this might occur for CDS sequences where no features are - // marked. - exon = new int[] { dna.getStart() + (codonStart - 1), + // this might occur for CDS sequences where no features are marked + exons = new int[] { dna.getStart() + (codonStart - 1), dna.getEnd() }; - map = new Mapping(product, exon, new int[] { 1, prseq.length() }, - 3, 1); + dnaToProteinMapping = new Mapping(product, exons, new int[] { 1, + translationLength }, 3, 1); } - if ((prseq.length() + 1) * 3 == (1 - codonStart + dna.getSequence().length)) + if ((translationLength + 1) * 3 == (1 - codonStart + dna + .getSequence().length)) { System.err .println("Allowing for additional stop codon at end of cDNA fragment... will probably cause an error in VAMSAs!"); - exon = new int[] { dna.getStart() + (codonStart - 1), + exons = new int[] { dna.getStart() + (codonStart - 1), dna.getEnd() - 3 }; - map = new Mapping(product, exon, new int[] { 1, prseq.length() }, - 3, 1); + dnaToProteinMapping = new Mapping(product, exons, new int[] { 1, + translationLength }, 3, 1); } } else @@ -467,57 +397,77 @@ public class EmblEntry else { // final product length truncation check - // TODO should from range include stop codon even if not in protein - // in order to include stop codon in CDS sequence (as done for - // Ensembl)? - int[] cdsRanges = adjustForProteinLength(prseq.length(), exon); - map = new Mapping(product, cdsRanges, new int[] { 1, - prseq.length() }, 3, 1); - // reconstruct the EMBLCDS entry - // TODO: this is only necessary when there codon annotation is - // complete (I think JBPNote) - DBRefEntry pcdnaref = new DBRefEntry(); - pcdnaref.setAccessionId(prid); - pcdnaref.setSource(DBRefSource.EMBLCDS); - pcdnaref.setVersion(getVersion()); // same as parent EMBL version. - MapList mp = new MapList(new int[] { 1, prseq.length() }, - new int[] { 1 + (codonStart - 1), - (codonStart - 1) + 3 * prseq.length() }, 1, 3); - pcdnaref.setMap(new Mapping(mp)); + int[] cdsRanges = adjustForProteinLength(translationLength, exons); + dnaToProteinMapping = new Mapping(product, cdsRanges, new int[] { + 1, translationLength }, 3, 1); if (product != null) { - product.addDBRef(pcdnaref); - protEMBLCDS = new DBRefEntry(pcdnaref); - protEMBLCDS.setSource(DBRefSource.EMBLCDSProduct); - product.addDBRef(protEMBLCDS); + /* + * make xref with mapping from protein to EMBL dna + */ + DBRefEntry proteinToEmblRef = new DBRefEntry(DBRefSource.EMBL, + getSequenceVersion(), proteinId, new Mapping( + dnaToProteinMapping.getMap().getInverse())); + product.addDBRef(proteinToEmblRef); + + /* + * make xref from protein to EMBLCDS; we assume here that the + * CDS sequence version is same as dna sequence (?!) + */ + MapList proteinToCdsMapList = new MapList(new int[] { 1, + translationLength }, new int[] { 1 + (codonStart - 1), + (codonStart - 1) + 3 * translationLength }, 1, 3); + DBRefEntry proteinToEmblCdsRef = new DBRefEntry( + DBRefSource.EMBLCDS, getSequenceVersion(), proteinId, + new Mapping(proteinToCdsMapList)); + product.addDBRef(proteinToEmblCdsRef); + + /* + * make 'direct' xref from protein to EMBLCDSPROTEIN + */ + proteinToEmblProteinRef = new DBRefEntry(proteinToEmblCdsRef); + proteinToEmblProteinRef.setSource(DBRefSource.EMBLCDSProduct); + proteinToEmblProteinRef.setMap(null); + product.addDBRef(proteinToEmblProteinRef); } } } - // add cds feature to dna seq - this may include the stop codon - for (int xint = 0; exon != null && xint < exon.length; xint += 2) + + /* + * add cds features to dna sequence + */ + for (int xint = 0; exons != null && xint < exons.length; xint += 2) { - SequenceFeature sf = makeCdsFeature(exon, xint, prname, prid, vals, - codonStart); + SequenceFeature sf = makeCdsFeature(exons, xint, proteinName, + proteinId, vals, codonStart); sf.setType(feature.getName()); // "CDS" + sf.setEnaLocation(feature.getLocation()); sf.setFeatureGroup(sourceDb); dna.addSequenceFeature(sf); } } /* - * add dbRefs to sequence, and mappings for Uniprot xrefs + * add feature dbRefs to sequence, and mappings for Uniprot xrefs */ + boolean hasUniprotDbref = false; if (feature.dbRefs != null) { boolean mappingUsed = false; for (DBRefEntry ref : feature.dbRefs) { - ref.setSource(DBRefUtils.getCanonicalName(ref.getSource())); - if (ref.getSource().equals(DBRefSource.UNIPROT)) + /* + * ensure UniProtKB/Swiss-Prot converted to UNIPROT + */ + String source = DBRefUtils.getCanonicalName(ref.getSource()); + ref.setSource(source); + DBRefEntry proteinDbRef = new DBRefEntry(ref.getSource(), ref.getVersion(), ref + .getAccessionId()); + if (source.equals(DBRefSource.UNIPROT)) { String proteinSeqName = DBRefSource.UNIPROT + "|" + ref.getAccessionId(); - if (map != null && map.getTo() != null) + if (dnaToProteinMapping != null && dnaToProteinMapping.getTo() != null) { if (mappingUsed) { @@ -525,13 +475,14 @@ public class EmblEntry * two or more Uniprot xrefs for the same CDS - * each needs a distinct Mapping (as to a different sequence) */ - map = new Mapping(map); + dnaToProteinMapping = new Mapping(dnaToProteinMapping); } mappingUsed = true; /* * try to locate the protein mapped to (possibly by a - * previous CDS feature) + * previous CDS feature); if not found, construct it from + * the EMBL translation */ SequenceI proteinSeq = matcher.findIdMatch(proteinSeqName); if (proteinSeq == null) @@ -541,61 +492,64 @@ public class EmblEntry matcher.add(proteinSeq); peptides.add(proteinSeq); } - map.setTo(proteinSeq); - map.getTo().addDBRef( - new DBRefEntry(ref.getSource(), ref.getVersion(), ref - .getAccessionId())); - ref.setMap(map); + dnaToProteinMapping.setTo(proteinSeq); + dnaToProteinMapping.setMappedFromId(proteinId); + proteinSeq.addDBRef(proteinDbRef); + proteinSeq.setSourceDBRef(proteinDbRef); + ref.setMap(dnaToProteinMapping); } - noProteinDbref = false; + hasUniprotDbref = true; } if (product != null) { - DBRefEntry pref = new DBRefEntry(ref.getSource(), - ref.getVersion(), ref.getAccessionId()); + /* + * copy feature dbref to our protein product + */ + DBRefEntry pref = proteinDbRef; pref.setMap(null); // reference is direct product.addDBRef(pref); // Add converse mapping reference - if (map != null) + if (dnaToProteinMapping != null) { - Mapping pmap = new Mapping(dna, map.getMap().getInverse()); - pref = new DBRefEntry(sourceDb, getVersion(), + Mapping pmap = new Mapping(dna, dnaToProteinMapping.getMap() + .getInverse()); + pref = new DBRefEntry(sourceDb, getSequenceVersion(), this.getAccession()); pref.setMap(pmap); - if (map.getTo() != null) + if (dnaToProteinMapping.getTo() != null) { - map.getTo().addDBRef(pref); + dnaToProteinMapping.getTo().addDBRef(pref); } } } dna.addDBRef(ref); } - if (noProteinDbref && product != null) + } + + /* + * if we have a product (translation) but no explicit Uniprot dbref + * (example: EMBL AAFI02000057 protein_id EAL65544.1) + * then construct mappings to an assumed EMBLCDSPROTEIN accession + */ + if (!hasUniprotDbref && product != null) + { + if (proteinToEmblProteinRef == null) { - // add protein coding reference to dna sequence so xref matches - if (protEMBLCDS == null) - { - protEMBLCDS = new DBRefEntry(); - protEMBLCDS.setAccessionId(prid); - protEMBLCDS.setSource(DBRefSource.EMBLCDSProduct); - protEMBLCDS.setVersion(getVersion()); - protEMBLCDS - .setMap(new Mapping(product, map.getMap().getInverse())); - } - product.addDBRef(protEMBLCDS); + // assuming CDSPROTEIN sequence version = dna version (?!) + proteinToEmblProteinRef = new DBRefEntry( + DBRefSource.EMBLCDSProduct, getSequenceVersion(), proteinId); + } + product.addDBRef(proteinToEmblProteinRef); + product.setSourceDBRef(proteinToEmblProteinRef); - // Add converse mapping reference - if (map != null) - { - Mapping pmap = new Mapping(product, protEMBLCDS.getMap().getMap() - .getInverse()); - DBRefEntry ncMap = new DBRefEntry(protEMBLCDS); - ncMap.setMap(pmap); - if (map.getTo() != null) - { - dna.addDBRef(ncMap); - } - } + if (dnaToProteinMapping != null + && dnaToProteinMapping.getTo() != null) + { + DBRefEntry dnaToEmblProteinRef = new DBRefEntry( + DBRefSource.EMBLCDSProduct, getSequenceVersion(), proteinId); + dnaToEmblProteinRef.setMap(dnaToProteinMapping); + dnaToProteinMapping.setMappedFromId(proteinId); + dna.addDBRef(dnaToEmblProteinRef); } } } @@ -650,7 +604,7 @@ public class EmblEntry } /** - * Returns the CDS positions as a list of [start, end, start, end...] + * Returns the CDS positions as a single array of [start, end, start, end...] * positions. If on the reverse strand, these will be in descending order. * * @param feature @@ -658,51 +612,68 @@ public class EmblEntry */ protected int[] getCdsRanges(EmblFeature feature) { - if (feature.locations == null) + if (feature.location == null) { return new int[] {}; } - int cdsBoundaryCount = 0; // count of all start/stop locations - int[][] cdsLocations = new int[feature.locations.size()][]; - int locationNumber = 0; - for (EmblFeatureLocations loc : feature.locations) + + try { - int[] locationRanges = loc.getElementRanges(accession); - cdsLocations[locationNumber++] = locationRanges; - cdsBoundaryCount += locationRanges.length; - } - int[] cdsRanges = new int[cdsBoundaryCount]; - int copyTo = 0; - for (int[] ranges : cdsLocations) + List ranges = DnaUtils.parseLocation(feature.location); + return listToArray(ranges); + } catch (ParseException e) { - System.arraycopy(ranges, 0, cdsRanges, copyTo, ranges.length); - copyTo += ranges.length; + Cache.log.warn(String.format( + "Not parsing inexact CDS location %s in ENA %s", + feature.location, this.accession)); + return new int[] {}; } - return cdsRanges; + } + /** + * Converts a list of [start, end] ranges to a single array of [start, end, + * start, end ...] + * + * @param ranges + * @return + */ + int[] listToArray(List ranges) + { + int[] result = new int[ranges.size() * 2]; + int i = 0; + for (int[] range : ranges) + { + result[i++] = range[0]; + result[i++] = range[1]; + } + return result; } /** - * truncate the last exon interval to the prlength'th codon + * Truncates (if necessary) the exon intervals to match 3 times the length of + * the protein; also accepts 3 bases longer (for stop codon not included in + * protein) * - * @param prlength + * @param proteinLength * @param exon - * @return new exon + * an array of [start, end, start, end...] intervals + * @return the same array (if unchanged) or a truncated copy */ - static int[] adjustForProteinLength(int prlength, int[] exon) + static int[] adjustForProteinLength(int proteinLength, int[] exon) { - if (prlength <= 0 || exon == null) + if (proteinLength <= 0 || exon == null) { return exon; } - int desiredCdsLength = prlength * 3; + int expectedCdsLength = proteinLength * 3; int exonLength = MappingUtils.getLength(Arrays.asList(exon)); /* - * assuming here exon might include stop codon in addition to protein codons + * if exon length matches protein, or is shorter, or longer by the + * length of a stop codon (3 bases), then leave it unchanged */ - if (desiredCdsLength == exonLength - || desiredCdsLength == exonLength - 3) + if (expectedCdsLength >= exonLength + || expectedCdsLength == exonLength - 3) { return exon; } @@ -716,11 +687,11 @@ public class EmblEntry for (int x = 0; x < exon.length; x += 2) { cdspos += Math.abs(exon[x + 1] - exon[x]) + 1; - if (desiredCdsLength <= cdspos) + if (expectedCdsLength <= cdspos) { // advanced beyond last codon. sxpos = x; - if (desiredCdsLength != cdspos) + if (expectedCdsLength != cdspos) { // System.err // .println("Truncating final exon interval on region by " @@ -733,11 +704,11 @@ public class EmblEntry */ if (exon[x + 1] >= exon[x]) { - endxon = exon[x + 1] - cdspos + desiredCdsLength; + endxon = exon[x + 1] - cdspos + expectedCdsLength; } else { - endxon = exon[x + 1] + cdspos - desiredCdsLength; + endxon = exon[x + 1] + cdspos - expectedCdsLength; } break; } @@ -754,4 +725,124 @@ public class EmblEntry } return exon; } + + public String getSequenceVersion() + { + return sequenceVersion; + } + + public void setSequenceVersion(String sequenceVersion) + { + this.sequenceVersion = sequenceVersion; + } + + public String getSequenceLength() + { + return sequenceLength; + } + + public void setSequenceLength(String sequenceLength) + { + this.sequenceLength = sequenceLength; + } + + public String getEntryVersion() + { + return entryVersion; + } + + public void setEntryVersion(String entryVersion) + { + this.entryVersion = entryVersion; + } + + public String getMoleculeType() + { + return moleculeType; + } + + public void setMoleculeType(String moleculeType) + { + this.moleculeType = moleculeType; + } + + public String getTopology() + { + return topology; + } + + public void setTopology(String topology) + { + this.topology = topology; + } + + public String getTaxonomicDivision() + { + return taxonomicDivision; + } + + public void setTaxonomicDivision(String taxonomicDivision) + { + this.taxonomicDivision = taxonomicDivision; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; + } + + public String getFirstPublicDate() + { + return firstPublicDate; + } + + public void setFirstPublicDate(String firstPublicDate) + { + this.firstPublicDate = firstPublicDate; + } + + public String getFirstPublicRelease() + { + return firstPublicRelease; + } + + public void setFirstPublicRelease(String firstPublicRelease) + { + this.firstPublicRelease = firstPublicRelease; + } + + public String getLastUpdatedDate() + { + return lastUpdatedDate; + } + + public void setLastUpdatedDate(String lastUpdatedDate) + { + this.lastUpdatedDate = lastUpdatedDate; + } + + public String getLastUpdatedRelease() + { + return lastUpdatedRelease; + } + + public void setLastUpdatedRelease(String lastUpdatedRelease) + { + this.lastUpdatedRelease = lastUpdatedRelease; + } + + public String getDataClass() + { + return dataClass; + } + + public void setDataClass(String dataClass) + { + this.dataClass = dataClass; + } } diff --git a/src/jalview/datamodel/xdb/embl/EmblFeature.java b/src/jalview/datamodel/xdb/embl/EmblFeature.java index 7e503c9..51d740b 100644 --- a/src/jalview/datamodel/xdb/embl/EmblFeature.java +++ b/src/jalview/datamodel/xdb/embl/EmblFeature.java @@ -37,7 +37,7 @@ public class EmblFeature Vector qualifiers; - Vector locations; + String location; /** * @return the dbRefs @@ -57,20 +57,19 @@ public class EmblFeature } /** - * @return the locations + * @return the location */ - public Vector getLocations() + public String getLocation() { - return locations; + return location; } /** - * @param locations - * the locations to set + * @param loc */ - public void setLocations(Vector locations) + public void setLocation(String loc) { - this.locations = locations; + this.location = loc; } /** diff --git a/src/jalview/datamodel/xdb/embl/EmblFeatureLocElement.java b/src/jalview/datamodel/xdb/embl/EmblFeatureLocElement.java deleted file mode 100644 index 134ce9e..0000000 --- a/src/jalview/datamodel/xdb/embl/EmblFeatureLocElement.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * This file is part of Jalview. - * - * Jalview is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 - * of the License, or (at your option) any later version. - * - * Jalview is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Jalview. If not, see . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.datamodel.xdb.embl; - -/** - * Data model for a feature/location/locationElement read from an EMBL query - * reply - * - * @see embl_mapping.xml - */ -public class EmblFeatureLocElement -{ - String type; - - String accession; - - String version; - - boolean complement; - - BasePosition basePositions[]; - - /** - * @return the accession - */ - public String getAccession() - { - return accession; - } - - /** - * @param accession - * the accession to set - */ - public void setAccession(String accession) - { - this.accession = accession; - } - - /** - * @return the basePositions - */ - public BasePosition[] getBasePositions() - { - return basePositions; - } - - /** - * @param basePositions - * the basePositions to set - */ - public void setBasePositions(BasePosition[] basePositions) - { - this.basePositions = basePositions; - } - - /** - * @return the complement - */ - public boolean isComplement() - { - return complement; - } - - /** - * @param complement - * the complement to set - */ - public void setComplement(boolean complement) - { - this.complement = complement; - } - - /** - * @return the type - */ - public String getType() - { - return type; - } - - /** - * @param type - * the type to set - */ - public void setType(String type) - { - this.type = type; - } - - /** - * @return the version - */ - public String getVersion() - { - return version; - } - - /** - * @param version - * the version to set - */ - public void setVersion(String version) - { - this.version = version; - } -} diff --git a/src/jalview/datamodel/xdb/embl/EmblFeatureLocations.java b/src/jalview/datamodel/xdb/embl/EmblFeatureLocations.java deleted file mode 100644 index 9774004..0000000 --- a/src/jalview/datamodel/xdb/embl/EmblFeatureLocations.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * This file is part of Jalview. - * - * Jalview is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 - * of the License, or (at your option) any later version. - * - * Jalview is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Jalview. If not, see . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.datamodel.xdb.embl; - -import jalview.bin.Cache; -import jalview.util.ArrayUtils; - -import java.util.Arrays; -import java.util.Vector; - -/** - * Data model for a <location> child element of a <feature> read - * from an EMBL query reply - * - * @see embl_mapping.xml - * @see http://www.insdc.org/files/feature_table.html#3.4.2 - */ -public class EmblFeatureLocations -{ - Vector locElements; - - String locationType; - - boolean locationComplement; - - /** - * @return the locationComplement - */ - public boolean isLocationComplement() - { - return locationComplement; - } - - /** - * @param locationComplement - * the locationComplement to set - */ - public void setLocationComplement(boolean locationComplement) - { - this.locationComplement = locationComplement; - } - - /** - * @return the locationType - */ - public String getLocationType() - { - return locationType; - } - - /** - * @param locationType - * the locationType to set - */ - public void setLocationType(String locationType) - { - this.locationType = locationType; - } - - /** - * @return the locElements - */ - public Vector getLocElements() - { - return locElements; - } - - /** - * @param locElements - * the locElements to set - */ - public void setLocElements(Vector locElements) - { - this.locElements = locElements; - } - - /** - * Return all location elements as start-end pairs (without accessions) TODO: - * pass back complement and 'less than or more than' range information Note: - * do not use this since it throws away any accessionIds associated with each - * location! - * - * @return int[] { start1, end1, ... } - */ - public int[] getElementRanges() - { - return getElementRanges(null); - } - - /** - * Return all location elements concerning given accession as start-end pairs. - * If the CDS feature is on the forward strand, then start <= end, if on the - * reverse strand then start > end. - * - * @param accession - * the accession string for which locations are requested, or null - * for all locations - * @return int[] { start1, end1, ... } - */ - int[] getElementRanges(String accession) - { - int sepos = 0; - int[] se = new int[locElements.size() * 2]; - if ("single".equalsIgnoreCase(locationType) - || "join".equalsIgnoreCase(locationType)) - { - for (EmblFeatureLocElement loce : locElements) - { - if (accession == null || loce.accession != null - && accession.equals(loce.accession)) - { - BasePosition bp[] = loce.getBasePositions(); - if (bp.length == 2) - { - try - { - int start = Integer.parseInt(bp[0].getPos()); - int end = Integer.parseInt(bp[1].getPos()); - se[sepos++] = start; - se[sepos++] = end; - } catch (NumberFormatException e) - { - System.err - .println("format error in EMBL CDS location basePosition: " - + e.getMessage()); - } - } - else - { - System.err - .println("format error in EMBL CDS location, basePosition count = " - + bp.length); - } - } - } - } - else if (locationType != null) - { - if (Cache.log != null) - { - Cache.log - .error("EmblFeatureLocations.getElementRanges cannot deal with locationType=='" - + locationType + "'"); - } - else - { - System.err - .println("EmblFeatureLocations.getElementRanges cannot deal with locationType=='" - + locationType + "'"); - } - } - - if (sepos != se.length) - { - /* - * we failed to parse something - trim off null values - */ - se = Arrays.copyOf(se, sepos); - } - - /* - * If on the complement, reverse the ranges to [end, start, ...end1, start1]. - * For an example of a joined complement, see (tRNA feature) CAGL0B00165r on - * http://www.ebi.ac.uk/ena/data/view/CR380948&display=xml - * http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/embl/CR380948/emblxml - */ - if (locationComplement) - { - ArrayUtils.reverseIntArray(se); - } - return se; - } -} diff --git a/src/jalview/datamodel/xdb/embl/EmblSequence.java b/src/jalview/datamodel/xdb/embl/EmblSequence.java index 2a6fa84..92c424b 100644 --- a/src/jalview/datamodel/xdb/embl/EmblSequence.java +++ b/src/jalview/datamodel/xdb/embl/EmblSequence.java @@ -27,12 +27,8 @@ package jalview.datamodel.xdb.embl; */ public class EmblSequence { - String version; - String sequence; - String type; - /** * @return the sequence */ @@ -47,40 +43,7 @@ public class EmblSequence */ public void setSequence(String sequence) { - this.sequence = sequence; - } - - /** - * @return the type - */ - public String getType() - { - return type; - } - - /** - * @param type - * the type to set - */ - public void setType(String type) - { - this.type = type; - } - - /** - * @return the version - */ - public String getVersion() - { - return version; - } - - /** - * @param version - * the version to set - */ - public void setVersion(String version) - { - this.version = version; + // remove spaces introduced by unmarshalling of newline characters + this.sequence = sequence.replace(" ", ""); } } diff --git a/src/jalview/ext/ensembl/EnsemblGene.java b/src/jalview/ext/ensembl/EnsemblGene.java index 4dd1bba..b4d2783 100644 --- a/src/jalview/ext/ensembl/EnsemblGene.java +++ b/src/jalview/ext/ensembl/EnsemblGene.java @@ -8,7 +8,7 @@ import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.io.gff.SequenceOntologyFactory; import jalview.io.gff.SequenceOntologyI; -import jalview.schemes.FeatureColourAdapter; +import jalview.schemes.FeatureColour; import jalview.schemes.FeatureSettingsAdapter; import jalview.util.MapList; @@ -536,7 +536,7 @@ public class EnsemblGene extends EnsemblSeqProxy { if (so.isA(type, SequenceOntologyI.EXON)) { - return new FeatureColourAdapter() + return new FeatureColour() { @Override public boolean isColourByLabel() @@ -547,7 +547,7 @@ public class EnsemblGene extends EnsemblSeqProxy } if (so.isA(type, SequenceOntologyI.SEQUENCE_VARIANT)) { - return new FeatureColourAdapter() + return new FeatureColour() { @Override diff --git a/src/jalview/ext/ensembl/EnsemblInfo.java b/src/jalview/ext/ensembl/EnsemblInfo.java new file mode 100644 index 0000000..950b658 --- /dev/null +++ b/src/jalview/ext/ensembl/EnsemblInfo.java @@ -0,0 +1,71 @@ +package jalview.ext.ensembl; + +/** + * A data class to model the data and rest version of one Ensembl domain, + * currently for rest.ensembl.org and rest.ensemblgenomes.org + * + * @author gmcarstairs + */ +class EnsemblInfo +{ + /* + * The http domain this object is holding data values for + */ + String domain; + + /* + * The latest version Jalview has tested for, e.g. "4.5"; a minor version change should be + * ok, a major version change may break stuff + */ + String expectedRestVersion; + + /* + * Major / minor / point version e.g. "4.5.1" + * @see http://rest.ensembl.org/info/rest/?content-type=application/json + */ + String restVersion; + + /* + * data version + * @see http://rest.ensembl.org/info/data/?content-type=application/json + */ + String dataVersion; + + /* + * true when http://rest.ensembl.org/info/ping/?content-type=application/json + * returns response code 200 + */ + boolean restAvailable; + + /* + * absolute time when availability was last checked + */ + long lastAvailableCheckTime; + + /* + * absolute time when version numbers were last checked + */ + long lastVersionCheckTime; + + // flag set to true if REST major version is not the one expected + boolean restMajorVersionMismatch; + + /* + * absolute time to wait till if we overloaded the REST service + */ + long retryAfter; + + /** + * Constructor given expected REST version number e.g 4.5 or 3.4.3 + * + * @param restExpected + */ + EnsemblInfo(String theDomain, String restExpected) + { + domain = theDomain; + expectedRestVersion = restExpected; + lastAvailableCheckTime = -1; + lastVersionCheckTime = -1; + } + +} diff --git a/src/jalview/ext/ensembl/EnsemblRestClient.java b/src/jalview/ext/ensembl/EnsemblRestClient.java index 6a564f1..e651ddf 100644 --- a/src/jalview/ext/ensembl/EnsemblRestClient.java +++ b/src/jalview/ext/ensembl/EnsemblRestClient.java @@ -1,6 +1,7 @@ package jalview.ext.ensembl; import jalview.io.FileParse; +import jalview.util.StringUtils; import java.io.BufferedReader; import java.io.DataOutputStream; @@ -10,10 +11,16 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import java.util.HashMap; import java.util.List; +import java.util.Map; import javax.ws.rs.HttpMethod; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; + import com.stevesoft.pat.Regex; /** @@ -23,14 +30,23 @@ import com.stevesoft.pat.Regex; */ abstract class EnsemblRestClient extends EnsemblSequenceFetcher { - private final static String ENSEMBL_REST = "http://rest.ensembl.org"; + /* + * update these constants when Jalview has been checked / updated for + * changes to Ensembl REST API + * @see https://github.com/Ensembl/ensembl-rest/wiki/Change-log + */ + private static final String LATEST_ENSEMBLGENOMES_REST_VERSION = "4.4"; - protected final static String ENSEMBL_GENOMES_REST = "http://rest.ensemblgenomes.org"; + private static final String LATEST_ENSEMBL_REST_VERSION = "4.5"; + + private static Map domainData; // @see https://github.com/Ensembl/ensembl-rest/wiki/Output-formats private static final String PING_URL = "http://rest.ensembl.org/info/ping.json"; - private final static long RETEST_INTERVAL = 10000L; // 10 seconds + private final static long AVAILABILITY_RETEST_INTERVAL = 10000L; // 10 seconds + + private final static long VERSION_RETEST_INTERVAL = 1000L * 3600; // 1 hr private static final Regex TRANSCRIPT_REGEX = new Regex( "(ENS)([A-Z]{3}|)T[0-9]{11}$"); @@ -38,16 +54,14 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher private static final Regex GENE_REGEX = new Regex( "(ENS)([A-Z]{3}|)G[0-9]{11}$"); - private String domain = ENSEMBL_REST; - - private static boolean ensemblRestAvailable = false; - - private static long lastCheck = -1; - - /* - * absolute time to wait till if we overloaded the REST service - */ - private static long retryAfter; + static + { + domainData = new HashMap(); + domainData.put(ENSEMBL_REST, new EnsemblInfo(ENSEMBL_REST, + LATEST_ENSEMBL_REST_VERSION)); + domainData.put(ENSEMBL_GENOMES_REST, new EnsemblInfo( + ENSEMBL_GENOMES_REST, LATEST_ENSEMBLGENOMES_REST_VERSION)); + } protected volatile boolean inProgress = false; @@ -66,23 +80,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher */ public EnsemblRestClient(String d) { - domain = d; - } - - /** - * Returns the domain name to query e.g. http://rest.ensembl.org or - * http://rest.ensemblgenomes.org - * - * @return - */ - String getDomain() - { - return domain; - } - - void setDomain(String d) - { - domain = d; + setDomain(d); } /** @@ -222,7 +220,7 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher * POST method allows multiple queries in one request; it is supported for * sequence queries, but not for overlap */ - boolean multipleIds = ids.size() > 1;// useGetRequest(); + boolean multipleIds = ids != null && ids.size() > 1; connection.setRequestMethod(multipleIds ? HttpMethod.POST : HttpMethod.GET); connection.setRequestProperty("Content-Type", @@ -284,13 +282,14 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher // to test: // retryDelay = "5"; + EnsemblInfo info = domainData.get(getDomain()); if (retryDelay != null) { System.err.println("Ensembl REST service rate limit exceeded, wait " + retryDelay + " seconds before retrying"); try { - retryAfter = System.currentTimeMillis() + info.retryAfter = System.currentTimeMillis() + (1000 * Integer.valueOf(retryDelay)); } catch (NumberFormatException e) { @@ -300,46 +299,64 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher } else { - retryAfter = 0; + info.retryAfter = 0; // debug: // System.out.println(String.format( // "%s Ensembl requests remaining of %s (reset in %ss)", // remaining, limit, reset)); } } + /** * Rechecks if Ensembl is responding, unless the last check was successful and * the retest interval has not yet elapsed. Returns true if Ensembl is up, - * else false. + * else false. Also retrieves and saves the current version of Ensembl data + * and REST services at intervals. * * @return */ protected boolean isEnsemblAvailable() { + EnsemblInfo info = domainData.get(getDomain()); + long now = System.currentTimeMillis(); /* * check if we are waiting for 'Retry-After' to expire */ - if (retryAfter > now) + if (info.retryAfter > now) { - System.err.println("Still " + (1 + (retryAfter - now) / 1000) + System.err.println("Still " + (1 + (info.retryAfter - now) / 1000) + " secs to wait before retrying Ensembl"); return false; } else { - retryAfter = 0; + info.retryAfter = 0; + } + + /* + * recheck if Ensembl is up if it was down, or the recheck period has elapsed + */ + boolean retestAvailability = (now - info.lastAvailableCheckTime) > AVAILABILITY_RETEST_INTERVAL; + if (!info.restAvailable || retestAvailability) + { + info.restAvailable = checkEnsembl(); + info.lastAvailableCheckTime = now; } - boolean retest = now - lastCheck > RETEST_INTERVAL; - if (ensemblRestAvailable && !retest) + /* + * refetch Ensembl versions if the recheck period has elapsed + */ + boolean refetchVersion = (now - info.lastVersionCheckTime) > VERSION_RETEST_INTERVAL; + if (refetchVersion) { - return true; + checkEnsemblRestVersion(); + checkEnsemblDataVersion(); + info.lastVersionCheckTime = now; } - ensemblRestAvailable = checkEnsembl(); - lastCheck = now; - return ensemblRestAvailable; + + return info.restAvailable; } /** @@ -378,4 +395,104 @@ abstract class EnsemblRestClient extends EnsemblSequenceFetcher wr.close(); } + /** + * Fetches and checks Ensembl's REST version number + * + * @return + */ + private void checkEnsemblRestVersion() + { + EnsemblInfo info = domainData.get(getDomain()); + + JSONParser jp = new JSONParser(); + URL url = null; + try + { + url = new URL(getDomain() + + "/info/rest?content-type=application/json"); + BufferedReader br = getHttpResponse(url, null); + JSONObject val = (JSONObject) jp.parse(br); + String version = val.get("release").toString(); + String majorVersion = version.substring(0, version.indexOf(".")); + String expected = info.expectedRestVersion; + String expectedMajorVersion = expected.substring(0, + expected.indexOf(".")); + info.restMajorVersionMismatch = false; + try + { + /* + * if actual REST major version is ahead of what we expect, + * record this in case we want to warn the user + */ + if (Float.valueOf(majorVersion) > Float + .valueOf(expectedMajorVersion)) + { + info.restMajorVersionMismatch = true; + } + } catch (NumberFormatException e) + { + System.err.println("Error in REST version: " + e.toString()); + } + + /* + * check if REST version is later than what Jalview has tested against, + * if so warn; we don't worry if it is earlier (this indicates Jalview has + * been tested in advance against the next pending REST version) + */ + boolean laterVersion = StringUtils.compareVersions(version, expected) == 1; + if (laterVersion) + { + System.err.println(String.format( + "Expected %s REST version %s but found %s", getDbSource(), + expected, + version)); + } + info.restVersion = version; + } catch (Throwable t) + { + System.err.println("Error checking Ensembl REST version: " + + t.getMessage()); + } + } + + public boolean isRestMajorVersionMismatch() + { + return domainData.get(getDomain()).restMajorVersionMismatch; + } + + /** + * Fetches and checks Ensembl's data version number + * + * @return + */ + private void checkEnsemblDataVersion() + { + JSONParser jp = new JSONParser(); + URL url = null; + try + { + url = new URL(getDomain() + + "/info/data?content-type=application/json"); + BufferedReader br = getHttpResponse(url, null); + JSONObject val = (JSONObject) jp.parse(br); + JSONArray versions = (JSONArray) val.get("releases"); + domainData.get(getDomain()).dataVersion = versions.get(0).toString(); + } catch (Throwable t) + { + System.err.println("Error checking Ensembl data version: " + + t.getMessage()); + } + } + + public String getEnsemblDataVersion() + { + return domainData.get(getDomain()).dataVersion; + } + + @Override + public String getDbVersion() + { + return getEnsemblDataVersion(); + } + } diff --git a/src/jalview/ext/ensembl/EnsemblSeqProxy.java b/src/jalview/ext/ensembl/EnsemblSeqProxy.java index fb81e66..31552af 100644 --- a/src/jalview/ext/ensembl/EnsemblSeqProxy.java +++ b/src/jalview/ext/ensembl/EnsemblSeqProxy.java @@ -5,7 +5,6 @@ import jalview.analysis.Dna; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefEntry; -import jalview.datamodel.DBRefSource; import jalview.datamodel.Mapping; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; @@ -280,8 +279,8 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient ds.setSourceDBRef(proteinSeq.getSourceDBRef()); Mapping map = new Mapping(ds, mapList); - DBRefEntry dbr = new DBRefEntry(getDbSource(), getDbVersion(), - proteinSeq.getName(), map); + DBRefEntry dbr = new DBRefEntry(getDbSource(), + getEnsemblDataVersion(), proteinSeq.getName(), map); querySeq.getDatasetSequence().addDBRef(dbr); /* @@ -315,20 +314,15 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient for (DBRefEntry xref : xrefs) { seq.addDBRef(xref); - /* - * Save any Uniprot xref to be the reference for SIFTS mapping - */ - if (DBRefSource.UNIPROT.equals(xref.getSource())) - { - seq.setSourceDBRef(xref); - } } /* * and add a reference to itself */ - DBRefEntry self = new DBRefEntry(getDbSource(), "0", seq.getName()); + DBRefEntry self = new DBRefEntry(getDbSource(), + getEnsemblDataVersion(), seq.getName()); seq.addDBRef(self); + seq.setSourceDBRef(self); } /** @@ -386,7 +380,9 @@ public abstract class EnsemblSeqProxy extends EnsemblRestClient if (ids.contains(name) || ids.contains(name.replace("ENSP", "ENST"))) { - DBRefUtils.parseToDbRef(sq, DBRefSource.ENSEMBL, "0", name); + DBRefEntry dbref = DBRefUtils.parseToDbRef(sq, getDbSource(), + getEnsemblDataVersion(), name); + sq.setSourceDBRef(dbref); } } if (alignment == null) diff --git a/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java b/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java index 9a4952e..dd1739b 100644 --- a/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java +++ b/src/jalview/ext/ensembl/EnsemblSequenceFetcher.java @@ -20,6 +20,10 @@ abstract class EnsemblSequenceFetcher extends DbSourceProxyImpl private static final Regex ACCESSION_REGEX = new Regex( "(ENS([A-Z]{3}|)[GTEP]{1}[0-9]{11}$)" + "|" + "(CCDS[0-9.]{3,}$)"); + protected static final String ENSEMBL_GENOMES_REST = "http://rest.ensemblgenomes.org"; + + protected static final String ENSEMBL_REST = "http://rest.ensembl.org"; + /* * possible values for the 'feature' parameter of the /overlap REST service * @see http://rest.ensembl.org/documentation/info/overlap_id @@ -31,17 +35,17 @@ abstract class EnsemblSequenceFetcher extends DbSourceProxyImpl constrained, regulatory } + private String domain = ENSEMBL_REST; + @Override public String getDbSource() { // NB ensure Uniprot xrefs are canonicalised from "Ensembl" to "ENSEMBL" - return DBRefSource.ENSEMBL; // "ENSEMBL" - } - - @Override - public String getDbVersion() - { - return "0"; + if (ENSEMBL_GENOMES_REST.equals(getDomain())) + { + return DBRefSource.ENSEMBLGENOMES; + } + return DBRefSource.ENSEMBL; } @Override @@ -90,4 +94,20 @@ abstract class EnsemblSequenceFetcher extends DbSourceProxyImpl { return true; } + + /** + * Returns the domain name to query e.g. http://rest.ensembl.org or + * http://rest.ensemblgenomes.org + * + * @return + */ + protected String getDomain() + { + return domain; + } + + protected void setDomain(String d) + { + domain = d; + } } diff --git a/src/jalview/ext/jmol/JalviewJmolBinding.java b/src/jalview/ext/jmol/JalviewJmolBinding.java index 3f0847b..2ccf118 100644 --- a/src/jalview/ext/jmol/JalviewJmolBinding.java +++ b/src/jalview/ext/jmol/JalviewJmolBinding.java @@ -57,7 +57,6 @@ import org.jmol.api.JmolStatusListener; import org.jmol.api.JmolViewer; import org.jmol.c.CBK; import org.jmol.script.T; -import org.jmol.viewer.JC; import org.jmol.viewer.Viewer; public abstract class JalviewJmolBinding extends AAStructureBindingModel @@ -170,12 +169,9 @@ public abstract class JalviewJmolBinding extends AAStructureBindingModel public void closeViewer() { - viewer.acm.setModeMouse(JC.MOUSE_NONE); // remove listeners for all structures in viewer getSsm().removeStructureViewerListener(this, this.getPdbFile()); - // and shut down jmol - viewer.evalStringQuiet("zap"); - viewer.setJmolStatusListener(null); + viewer.dispose(); lastCommand = null; viewer = null; releaseUIResources(); diff --git a/src/jalview/ext/jmol/JmolParser.java b/src/jalview/ext/jmol/JmolParser.java index 0cbd620..a791558 100644 --- a/src/jalview/ext/jmol/JmolParser.java +++ b/src/jalview/ext/jmol/JmolParser.java @@ -27,7 +27,7 @@ import jalview.datamodel.SequenceI; import jalview.io.FileParse; import jalview.io.StructureFile; import jalview.schemes.ResidueProperties; -import jalview.structure.StructureViewSettings; +import jalview.structure.StructureImportSettings; import jalview.util.MessageManager; import java.io.IOException; @@ -172,7 +172,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener if (getId() == null) { - setId(inFile.getName()); + setId(safeName(getDataName())); } for (PDBChain chain : getChains()) { @@ -186,7 +186,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener prot.add(chainseq); } - if (StructureViewSettings.isPredictSecondaryStructure()) + if (StructureImportSettings.isPredictSecondaryStructure()) { createAnnotation(chainseq, chain, ms.at); } @@ -206,6 +206,12 @@ public class JmolParser extends StructureFile implements JmolStatusListener List significantAtoms = new ArrayList(); for (org.jmol.modelset.Atom atom : ms.at) { + // System.out.println("Seq Id : " + atom.getSeqID()); + // System.out.println("To String : " + atom.toString()); + if (!StructureImportSettings.isProcessHETATMs() && atom.isHetero()) + { + continue; + } if (atom.getAtomName().equalsIgnoreCase("CA") || atom.getAtomName().equalsIgnoreCase("P")) { diff --git a/src/jalview/ext/paradise/Annotate3D.java b/src/jalview/ext/paradise/Annotate3D.java index 85c84ab..5b75206 100644 --- a/src/jalview/ext/paradise/Annotate3D.java +++ b/src/jalview/ext/paradise/Annotate3D.java @@ -45,13 +45,20 @@ import org.json.simple.parser.ParseException; * * @author jimp * - * History: v1.0 revised from original due to refactoring of - * paradise-ubmc.u-strasbg.fr/webservices/annotate3d to - * http://arn-ibmc.in2p3.fr/api/compute/2d?tool=rnaview + * @version v1.0 revised from original due to refactoring of + * paradise-ubmc.u-strasbg.fr/webservices/annotate3d to + * http://arn-ibmc.in2p3.fr/api/compute/2d?tool=rnaview
        + * See also testing URL from fjossinet:
        + * http://charn2-ibmc.u-strasbg.fr:8080/api/compute/2d
        + * If in doubt, check against the REST client at: + * https://github.com/fjossinet/RNA-Science + * -Toolbox/blob/master/pyrna/restclient.py */ public class Annotate3D { - private static String twoDtoolsURL = "http://arn-ibmc.in2p3.fr/api/compute/2d"; + // also test with + // "http://charn2-ibmc.u-strasbg.fr:8080/api/compute/2d"; + private static String twoDtoolsURL = "http://arn-ibmc.in2p3.fr/api/compute/2d?tool=rnaview"; private static ContentHandler createContentHandler() { diff --git a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java index 1ce0d2b..944ef52 100644 --- a/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java +++ b/src/jalview/ext/rbvi/chimera/JalviewChimeraBinding.java @@ -101,17 +101,13 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel private String lastCommand; - private boolean loadedInline; - - /** + /* * current set of model filenames loaded */ String[] modelFileNames = null; String lastHighlightCommand; - private List lastReply; - /* * incremented every time a load notification is successfully handled - * lightweight mechanism for other threads to detect when they can start @@ -617,7 +613,8 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel if (lastCommand == null || !lastCommand.equals(command)) { // trim command or it may never find a match in the replyLog!! - lastReply = viewer.sendChimeraCommand(command.trim(), logResponse); + List lastReply = viewer.sendChimeraCommand(command.trim(), + logResponse); if (logResponse && debug) { log("Response from command ('" + command + "') was:\n" + lastReply); @@ -715,17 +712,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel // End StructureListener // ////////////////////////// - public Color getColour(int atomIndex, int pdbResNum, String chain, - String pdbfile) - { - if (getModelNum(pdbfile) < 0) - { - return null; - } - log("get model / residue colour attribute unimplemented"); - return null; - } - /** * returns the current featureRenderer that should be used to colour the * structures @@ -795,15 +781,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel } /** - * map from string to applet - */ - public Map getRegistryInfo() - { - // TODO Auto-generated method stub - return null; - } - - /** * returns the current sequenceRenderer that should be used to colour the * structures * @@ -815,20 +792,18 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel AlignmentViewPanel alignment); /** - * Construct and send a command to highlight zero, one or more atoms. - * - *
        -   * Done by generating a command like (to 'highlight' positions 44 and 46)
        -   *   show #0:44,46.C
        -   * 
        + * Construct and send a command to highlight zero, one or more atoms. We do + * this by sending an "rlabel" command to show the residue label at that + * position. */ @Override public void highlightAtoms(List atoms) { - if (atoms == null) + if (atoms == null || atoms.size() == 0) { return; } + StringBuilder cmd = new StringBuilder(128); boolean first = true; boolean found = false; @@ -843,7 +818,7 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel { if (first) { - cmd.append("show #").append(cms.get(0).getModelNumber()) + cmd.append("rlabel #").append(cms.get(0).getModelNumber()) .append(":"); } else @@ -851,7 +826,6 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel cmd.append(","); } first = false; - cmd.append(cms.get(0).getModelNumber()).append(":"); cmd.append(pdbResNum); if (!chain.equals(" ")) { @@ -863,19 +837,24 @@ public abstract class JalviewChimeraBinding extends AAStructureBindingModel String command = cmd.toString(); /* - * Avoid repeated commands for the same residue + * avoid repeated commands for the same residue */ if (command.equals(lastHighlightCommand)) { return; } - viewerCommandHistory(false); + /* + * unshow the label for the previous residue + */ + if (lastHighlightCommand != null) + { + viewer.sendChimeraCommand("~" + lastHighlightCommand, false); + } if (found) { - viewer.sendChimeraCommand(command.toString(), false); + viewer.sendChimeraCommand(command, false); } - viewerCommandHistory(true); this.lastHighlightCommand = command; } diff --git a/src/jalview/fts/api/FTSDataColumnI.java b/src/jalview/fts/api/FTSDataColumnI.java index 7741d73..80990b4 100644 --- a/src/jalview/fts/api/FTSDataColumnI.java +++ b/src/jalview/fts/api/FTSDataColumnI.java @@ -93,18 +93,18 @@ public interface FTSDataColumnI public boolean isVisibleByDefault(); /** - * Returns the data column's data type class + * Returns the data column's FTS data column group * - * @return the Class for the data column's data type + * @return the FTSDataColumnGroupI for the column */ - public Class getDataColumnClass(); + public FTSDataColumnGroupI getGroup(); /** - * Returns the data colum's FTS data column group + * Returns the data columns data type POJO * - * @return the FTSDataColumnGroupI for the column + * @return the DataTypeI for the column */ - public FTSDataColumnGroupI getGroup(); + public DataTypeI getDataType(); /** * This interface provides a model for the dynamic data column group @@ -133,4 +133,29 @@ public interface FTSDataColumnI */ public int getSortOrder(); } + + public interface DataTypeI + { + /** + * Returns the data column's data type class + * + * @return the Class for the data column's data type + */ + public Class getDataTypeClass(); + + /** + * Checks if the numeric data column's data will be formated + * + * @return true means the numeric data column shall be formatted + */ + public boolean isFormtted(); + + /** + * Returns the number of significant figure to be used for the numeric value + * formatting + * + * @return the number of significant figures + */ + public int getSignificantFigures(); + } } diff --git a/src/jalview/fts/api/FTSRestClientI.java b/src/jalview/fts/api/FTSRestClientI.java index 2266ca0..3701c76 100644 --- a/src/jalview/fts/api/FTSRestClientI.java +++ b/src/jalview/fts/api/FTSRestClientI.java @@ -115,7 +115,7 @@ public interface FTSRestClientI * * @return list of columns to display by default */ - public Collection getAllDefaulDisplayedDataColumns(); + public Collection getAllDefaultDisplayedFTSDataColumns(); /** * Return list of FTSDataColumnI objects that can be used to perform a search diff --git a/src/jalview/fts/api/GFTSPanelI.java b/src/jalview/fts/api/GFTSPanelI.java index ce63576..f86c3bc 100644 --- a/src/jalview/fts/api/GFTSPanelI.java +++ b/src/jalview/fts/api/GFTSPanelI.java @@ -21,6 +21,8 @@ package jalview.fts.api; +import java.util.Map; + import javax.swing.JTable; /** @@ -127,4 +129,12 @@ public interface GFTSPanelI * @param isEnabled */ public void setNextPageButtonEnabled(boolean isEnabled); + + /** + * The HashMap used to store user preferences for summary table columns, + * window size and position + * + * @return + */ + public Map getTempUserPrefs(); } diff --git a/src/jalview/fts/core/DecimalFormatTableCellRenderer.java b/src/jalview/fts/core/DecimalFormatTableCellRenderer.java new file mode 100644 index 0000000..3642721 --- /dev/null +++ b/src/jalview/fts/core/DecimalFormatTableCellRenderer.java @@ -0,0 +1,60 @@ +package jalview.fts.core; + +import java.awt.Component; +import java.text.DecimalFormat; + +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.DefaultTableCellRenderer; + +/** + * The class to handle the formatting of the double values for JTable cells. + */ +public class DecimalFormatTableCellRenderer extends + DefaultTableCellRenderer +{ + private DecimalFormat formatter; + + public DecimalFormatTableCellRenderer(boolean isFormated, + int significantFigures) + { + String integerFormater = isFormated ? "###,##0" : "0"; + String fractionFormater = isFormated ? "###,##0." : "0."; + if (significantFigures > 0) + { + StringBuilder significantFigureBuilder = new StringBuilder(); + for (int x = 1; x <= significantFigures; ++x) + { + significantFigureBuilder.append("0"); + } + formatter = new DecimalFormat(fractionFormater + + significantFigureBuilder.toString()); + } + else + { + formatter = new DecimalFormat(integerFormater); + } + super.setHorizontalAlignment(JLabel.RIGHT); + } + + public DecimalFormatTableCellRenderer() + { + super.setHorizontalAlignment(JLabel.RIGHT); + } + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, int row, + int column) + { + if (value == null) + { + return null; + } + + value = formatter.format(value); + + return super.getTableCellRendererComponent(table, value, isSelected, + hasFocus, row, column); + } +} \ No newline at end of file diff --git a/src/jalview/fts/core/FTSDataColumnPreferences.java b/src/jalview/fts/core/FTSDataColumnPreferences.java index cddcc8e..eb7455e 100644 --- a/src/jalview/fts/core/FTSDataColumnPreferences.java +++ b/src/jalview/fts/core/FTSDataColumnPreferences.java @@ -23,6 +23,7 @@ package jalview.fts.core; import jalview.fts.api.FTSDataColumnI; import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI; import jalview.fts.api.FTSRestClientI; +import jalview.fts.service.pdb.PDBFTSRestClient; import java.util.ArrayList; import java.util.Collection; @@ -67,11 +68,12 @@ public class FTSDataColumnPreferences extends JScrollPane FTSRestClientI ftsRestClient) { this.ftsRestClient = ftsRestClient; - Collection defaultCols = ftsRestClient - .getAllDefaulDisplayedDataColumns(); - - structSummaryColumns.addAll(defaultCols); - + if (source.equals(PreferenceSource.STRUCTURE_CHOOSER) + || source.equals(PreferenceSource.PREFERENCES)) + { + structSummaryColumns = ((PDBFTSRestClient) ftsRestClient) + .getAllDefaultDisplayedStructureDataColumns(); + } allFTSDataColumns.addAll(ftsRestClient.getAllFTSDataColumns()); tbl_FTSDataColumnPrefs.setAutoCreateRowSorter(true); @@ -109,7 +111,7 @@ public class FTSDataColumnPreferences extends JScrollPane { case SEARCH_SUMMARY: data[x++] = new Object[] { - ftsRestClient.getAllDefaulDisplayedDataColumns() + ftsRestClient.getAllDefaultDisplayedFTSDataColumns() .contains(field), field.getName(), field.getGroup() }; break; @@ -119,7 +121,7 @@ public class FTSDataColumnPreferences extends JScrollPane break; case PREFERENCES: data[x++] = new Object[] { field.getName(), - ftsRestClient.getAllDefaulDisplayedDataColumns() + ftsRestClient.getAllDefaultDisplayedFTSDataColumns() .contains(field), structSummaryColumns.contains(field) }; break; @@ -300,7 +302,7 @@ public class FTSDataColumnPreferences extends JScrollPane if (currentSource == PreferenceSource.SEARCH_SUMMARY) { updatePrefs(ftsRestClient - .getAllDefaulDisplayedDataColumns(), ftsDataColumn, + .getAllDefaultDisplayedFTSDataColumns(), ftsDataColumn, selected); } else if (currentSource == PreferenceSource.STRUCTURE_CHOOSER) @@ -312,7 +314,7 @@ public class FTSDataColumnPreferences extends JScrollPane if (col == 1) { updatePrefs(ftsRestClient - .getAllDefaulDisplayedDataColumns(), ftsDataColumn, + .getAllDefaultDisplayedFTSDataColumns(), ftsDataColumn, selected); } else if (col == 2) diff --git a/src/jalview/fts/core/FTSRestClient.java b/src/jalview/fts/core/FTSRestClient.java index 2f24a01..00a081b 100644 --- a/src/jalview/fts/core/FTSRestClient.java +++ b/src/jalview/fts/core/FTSRestClient.java @@ -143,21 +143,62 @@ public abstract class FTSRestClient implements FTSRestClientI } @Override - public Class getDataColumnClass() + public DataTypeI getDataType() { - String classString = lineData[2]; - classString = classString.toUpperCase(); - switch (classString) + final String[] dataTypeString = lineData[2].split("\\|"); + final String classString = dataTypeString[0].toUpperCase(); + + return new DataTypeI() { - case "INT": - case "INTEGER": - return Integer.class; - case "DOUBLE": - return Double.class; - case "STRING": - default: - return String.class; - } + + @Override + public boolean isFormtted() + { + if (dataTypeString.length > 1 + && dataTypeString[1] != null) + { + switch (dataTypeString[1].toUpperCase()) + { + case "T": + case "TRUE": + return true; + case "F": + case "False": + default: + return false; + } + } + return false; + } + + @Override + public int getSignificantFigures() + { + if (dataTypeString.length > 2 + && dataTypeString[2] != null) + { + return Integer.valueOf(dataTypeString[2]); + } + return 0; + } + + @Override + public Class getDataTypeClass() + { + switch (classString) + { + case "INT": + case "INTEGER": + return Integer.class; + case "DOUBLE": + return Double.class; + case "STRING": + default: + return String.class; + } + } + }; + } @Override @@ -228,6 +269,7 @@ public abstract class FTSRestClient implements FTSRestClientI && this.getGroup().equals(that.getGroup()); } + }; dataColumns.add(dataCol); @@ -325,7 +367,7 @@ public abstract class FTSRestClient implements FTSRestClientI } @Override - public Collection getAllDefaulDisplayedDataColumns() + public Collection getAllDefaultDisplayedFTSDataColumns() { if (defaulDisplayedDataColumns == null || defaulDisplayedDataColumns.isEmpty()) diff --git a/src/jalview/fts/core/FTSRestResponse.java b/src/jalview/fts/core/FTSRestResponse.java index 6cce2c4..92ea5f8 100644 --- a/src/jalview/fts/core/FTSRestResponse.java +++ b/src/jalview/fts/core/FTSRestResponse.java @@ -25,6 +25,7 @@ import jalview.fts.api.FTSData; import jalview.fts.api.FTSDataColumnI; import java.util.Collection; +import java.util.Map; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; @@ -107,7 +108,8 @@ public class FTSRestResponse { return String.class; } - return cols[columnIndex - colOffset].getDataColumnClass(); + return cols[columnIndex - colOffset].getDataType() + .getDataTypeClass(); } }; @@ -133,7 +135,8 @@ public class FTSRestResponse } public static void configureTableColumn(JTable tbl_summary, - Collection wantedFields) + Collection wantedFields, + Map columnPrefs) { for (FTSDataColumnI wantedField : wantedFields) { @@ -143,12 +146,29 @@ public class FTSRestResponse wantedField.getMinWidth()); tbl_summary.getColumn(wantedField.getName()).setMaxWidth( wantedField.getMaxWidth()); + int prefedWidth = columnPrefs.get(wantedField.getName()) == null ? wantedField + .getPreferredWidth() : columnPrefs.get(wantedField + .getName()); tbl_summary.getColumn(wantedField.getName()).setPreferredWidth( - wantedField.getPreferredWidth()); + prefedWidth); } catch (Exception e) { e.printStackTrace(); } + if (wantedField.getDataType().getDataTypeClass() == Double.class) + { + DecimalFormatTableCellRenderer dfr = new DecimalFormatTableCellRenderer( + wantedField.getDataType().isFormtted(), wantedField + .getDataType().getSignificantFigures()); + tbl_summary.getColumn(wantedField.getName()).setCellRenderer(dfr); + } + else if (wantedField.getDataType().getDataTypeClass() == Integer.class) + { + DecimalFormatTableCellRenderer dfr = new DecimalFormatTableCellRenderer( + wantedField.getDataType().isFormtted(), wantedField + .getDataType().getSignificantFigures()); + tbl_summary.getColumn(wantedField.getName()).setCellRenderer(dfr); + } } } diff --git a/src/jalview/fts/core/GFTSPanel.java b/src/jalview/fts/core/GFTSPanel.java index bc68667..33fa020 100644 --- a/src/jalview/fts/core/GFTSPanel.java +++ b/src/jalview/fts/core/GFTSPanel.java @@ -41,11 +41,13 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashSet; import java.util.List; import javax.swing.ImageIcon; @@ -64,6 +66,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.event.InternalFrameEvent; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; @@ -140,6 +143,10 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI protected int pageLimit; + protected HashSet paginatorCart = new HashSet(); + + protected static final DecimalFormat totalNumberformatter = new DecimalFormat( + "###,###"); private JTable tbl_summary = new JTable() { private boolean inLayout; @@ -183,6 +190,8 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI && !inLayout) { resizingColumn.setPreferredWidth(resizingColumn.getWidth()); + String colHeader = resizingColumn.getHeaderValue().toString(); + getTempUserPrefs().put(colHeader, resizingColumn.getWidth()); } resizeAndRepaint(); } @@ -237,6 +246,10 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI */ private void jbInit() throws Exception { + Integer width = getTempUserPrefs().get("FTSPanel.width") == null ? 800 + : getTempUserPrefs().get("FTSPanel.width"); + Integer height = getTempUserPrefs().get("FTSPanel.height") == null ? 400 + : getTempUserPrefs().get("FTSPanel.height"); lbl_warning.setVisible(false); lbl_warning.setFont(new java.awt.Font("Verdana", 0, 12)); lbl_loading.setVisible(false); @@ -341,7 +354,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI }); btn_next_page.setEnabled(false); btn_next_page.setToolTipText(MessageManager - .getString("label.next_page_tooltop")); + .getString("label.next_page_tooltip")); btn_next_page.setFont(new java.awt.Font("Verdana", 0, 12)); btn_next_page.setText(MessageManager.getString("action.next_page")); btn_next_page.addActionListener(new java.awt.event.ActionListener() @@ -366,7 +379,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI btn_prev_page.setEnabled(false); btn_prev_page.setToolTipText(MessageManager - .getString("label.prev_page_tooltop")); + .getString("label.prev_page_tooltip")); btn_prev_page.setFont(new java.awt.Font("Verdana", 0, 12)); btn_prev_page.setText(MessageManager.getString("action.prev_page")); btn_prev_page.addActionListener(new java.awt.event.ActionListener() @@ -421,7 +434,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI } } }); - scrl_searchResult.setPreferredSize(new Dimension(800, 400)); + scrl_searchResult.setPreferredSize(new Dimension(width, height)); cmb_searchTarget.setFont(new java.awt.Font("Verdana", 0, 12)); cmb_searchTarget.addActionListener(new ActionListener() @@ -491,6 +504,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI if (!getTypedText().equalsIgnoreCase(lastSearchTerm)) { searchAction(true); + paginatorCart.clear(); lastSearchTerm = getTypedText(); } } @@ -540,7 +554,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI txt_search.setEnabled(false); cmb_searchTarget.setEnabled(false); previousWantedFields = getFTSRestClient() - .getAllDefaulDisplayedDataColumns() + .getAllDefaultDisplayedFTSDataColumns() .toArray(new Object[0]); } if (sourceTabbedPane.getTitleAt(index).equals(searchTabTitle)) @@ -553,6 +567,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI if (wantedFieldsUpdated()) { searchAction(true); + paginatorCart.clear(); } else { @@ -562,7 +577,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI } }; tabbedPane.addChangeListener(changeListener); - tabbedPane.setPreferredSize(new Dimension(800, 400)); + tabbedPane.setPreferredSize(new Dimension(width, height)); tabbedPane.add(searchTabTitle, scrl_searchResult); tabbedPane.add(configureCols, new FTSDataColumnPreferences( PreferenceSource.SEARCH_SUMMARY, getFTSRestClient())); @@ -587,9 +602,40 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI mainFrame.setVisible(true); mainFrame.setContentPane(this); mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), 900, 500); + mainFrame + .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() + { + @Override + public void internalFrameClosing(InternalFrameEvent e) + { + closeAction(); + } + }); + mainFrame.setVisible(true); + mainFrame.setContentPane(this); + mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + Integer x = getTempUserPrefs().get("FTSPanel.x"); + Integer y = getTempUserPrefs().get("FTSPanel.y"); + if (x != null && y != null) + { + mainFrame.setLocation(x, y); + } + Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), width, height); } + protected void closeAction() + { + // System.out.println(">>>>>>>>>> closing internal frame!!!"); + // System.out.println("width : " + this.getWidth()); + // System.out.println("heigh : " + this.getHeight()); + // System.out.println("x : " + mainFrame.getX()); + // System.out.println("y : " + mainFrame.getY()); + getTempUserPrefs().put("FTSPanel.width", this.getWidth()); + getTempUserPrefs().put("FTSPanel.height", pnl_results.getHeight()); + getTempUserPrefs().put("FTSPanel.x", mainFrame.getX()); + getTempUserPrefs().put("FTSPanel.y", mainFrame.getY()); + mainFrame.dispose(); + } public class DeferredTextInputListener implements DocumentListener { private final Timer swingTimer; @@ -639,7 +685,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI } return Arrays.equals(getFTSRestClient() - .getAllDefaulDisplayedDataColumns() + .getAllDefaultDisplayedFTSDataColumns() .toArray(new Object[0]), previousWantedFields) ? false : true; @@ -647,7 +693,8 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI public void validateSelection() { - if (tbl_summary.getSelectedRows().length > 0) + if (tbl_summary.getSelectedRows().length > 0 + || !paginatorCart.isEmpty()) { btn_ok.setEnabled(true); } @@ -709,7 +756,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI protected void btn_back_ActionPerformed() { - mainFrame.dispose(); + closeAction(); new SequenceFetcher(progressIdicator); } @@ -722,7 +769,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI protected void btn_cancel_ActionPerformed() { - mainFrame.dispose(); + closeAction(); } /** @@ -824,6 +871,7 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI @Override public void prevPageAction() { + updatePaginatorCart(); if (offSet >= pageLimit) { offSet = offSet - pageLimit; @@ -838,11 +886,73 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI @Override public void nextPageAction() { + updatePaginatorCart(); offSet = offSet + pageLimit; searchAction(false); + } + public void updatePaginatorCart() + { + int primaryKeyColIndex = 0; + JTable resultTable = getResultTable(); + int totalRows = resultTable.getRowCount(); + try + { + primaryKeyColIndex = getFTSRestClient().getPrimaryKeyColumIndex( + wantedFields, false); + } catch (Exception e) + { + e.printStackTrace(); + } + + for (int row = 0; row < totalRows; row++) + { + String id = (String) resultTable.getValueAt(row, primaryKeyColIndex); + if (paginatorCart.contains(id)) + { + paginatorCart.remove(id); + } + } + int[] selectedRows = resultTable.getSelectedRows(); + for (int summaryRow : selectedRows) + { + String idStr = resultTable.getValueAt(summaryRow, + primaryKeyColIndex).toString(); + paginatorCart.add(idStr); + } + // System.out.println("Paginator shopping cart size : " + // + paginatorCart.size()); } + public void updateSummaryTableSelections() + { + JTable resultTable = getResultTable(); + if (paginatorCart.isEmpty()) + { + return; + } + int primaryKeyColIndex = 0; + try + { + primaryKeyColIndex = getFTSRestClient().getPrimaryKeyColumIndex( + wantedFields, false); + } catch (Exception e) + { + e.printStackTrace(); + } + // System.out.println(">>>>>> got here : 1"); + int totalRows = resultTable.getRowCount(); + // resultTable.clearSelection(); + for (int row = 0; row < totalRows; row++) + { + String id = (String) resultTable.getValueAt(row, primaryKeyColIndex); + if (paginatorCart.contains(id)) + { + resultTable.addRowSelectionInterval(row, row); + } + } + validateSelection(); + } public void refreshPaginatorState() { // System.out.println("resultSet count : " + resultSetCount); diff --git a/src/jalview/fts/service/pdb/PDBFTSPanel.java b/src/jalview/fts/service/pdb/PDBFTSPanel.java index 4f308e3..5f5c716 100644 --- a/src/jalview/fts/service/pdb/PDBFTSPanel.java +++ b/src/jalview/fts/service/pdb/PDBFTSPanel.java @@ -29,7 +29,9 @@ import jalview.fts.core.GFTSPanel; import jalview.gui.SequenceFetcher; import jalview.util.MessageManager; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; @SuppressWarnings("serial") public class PDBFTSPanel extends GFTSPanel @@ -39,6 +41,8 @@ public class PDBFTSPanel extends GFTSPanel private String ftsFrameTitle = defaultFTSFrameTitle; + private static Map tempUserPrefs = new HashMap(); + public PDBFTSPanel(SequenceFetcher seqFetcher) { pageLimit = PDBFTSRestClient.getInstance().getDefaultResponsePageSize(); @@ -71,7 +75,7 @@ public class PDBFTSPanel extends GFTSPanel String searchTarget = ((FTSDataColumnI) cmb_searchTarget .getSelectedItem()).getCode(); wantedFields = PDBFTSRestClient.getInstance() - .getAllDefaulDisplayedDataColumns(); + .getAllDefaultDisplayedFTSDataColumns(); String searchTerm = decodeSearchTerm(txt_search.getText(), searchTarget); @@ -101,13 +105,14 @@ public class PDBFTSPanel extends GFTSPanel FTSRestResponse.getTableModel(request, resultList.getSearchSummary())); FTSRestResponse.configureTableColumn(getResultTable(), - wantedFields); + wantedFields, tempUserPrefs); getResultTable().setVisible(true); } long endTime = System.currentTimeMillis(); totalResultSetCount = resultList.getNumberOfItemsFound(); - resultSetCount = resultList.getSearchSummary().size(); + resultSetCount = resultList.getSearchSummary() == null ? 0 + : resultList.getSearchSummary().size(); String result = (resultSetCount > 0) ? MessageManager .getString("label.results") : MessageManager .getString("label.result"); @@ -115,9 +120,14 @@ public class PDBFTSPanel extends GFTSPanel if (isPaginationEnabled() && resultSetCount > 0) { updateSearchFrameTitle(defaultFTSFrameTitle + " - " + result - + " " + (offSet + 1) + " to " - + (offSet + resultSetCount) + " of " - + totalResultSetCount + + " " + + totalNumberformatter.format((Number) (offSet + 1)) + + " to " + + totalNumberformatter + .format((Number) (offSet + resultSetCount)) + + " of " + + totalNumberformatter + .format((Number) totalResultSetCount) + " " + " (" + (endTime - startTime) + " milli secs)"); } else @@ -129,6 +139,7 @@ public class PDBFTSPanel extends GFTSPanel setSearchInProgress(false); refreshPaginatorState(); + updateSummaryTableSelections(); } } }.start(); @@ -188,12 +199,17 @@ public class PDBFTSPanel extends GFTSPanel e.printStackTrace(); } int[] selectedRows = getResultTable().getSelectedRows(); + String searchTerm = txt_search.getText(); for (int summaryRow : selectedRows) { String idStr = getResultTable().getValueAt(summaryRow, primaryKeyColIndex) .toString(); - String searchTerm = txt_search.getText(); + selectedIdsSet.add(getPDBIdwithSpecifiedChain(idStr, searchTerm)); + } + + for (String idStr : paginatorCart) + { selectedIdsSet.add(getPDBIdwithSpecifiedChain(idStr, searchTerm)); } @@ -255,4 +271,10 @@ public class PDBFTSPanel extends GFTSPanel return true; } + @Override + public Map getTempUserPrefs() + { + return tempUserPrefs; + } + } diff --git a/src/jalview/fts/service/pdb/PDBFTSRestClient.java b/src/jalview/fts/service/pdb/PDBFTSRestClient.java index 29450e8..219d6d6 100644 --- a/src/jalview/fts/service/pdb/PDBFTSRestClient.java +++ b/src/jalview/fts/service/pdb/PDBFTSRestClient.java @@ -326,11 +326,13 @@ public class PDBFTSRestClient extends FTSRestClient { try { - summaryRowData[colCounter++] = (field.getDataColumnClass() == Integer.class) ? Integer + summaryRowData[colCounter++] = (field.getDataType() + .getDataTypeClass() == Integer.class) ? Integer .valueOf(fieldData) - : (field.getDataColumnClass() == Double.class) ? Double + : (field.getDataType() + .getDataTypeClass() == Double.class) ? Double .valueOf(fieldData) - : fieldData; + : sanitiseData(fieldData); } catch (Exception e) { e.printStackTrace(); @@ -389,6 +391,14 @@ public class PDBFTSRestClient extends FTSRestClient }; } + private static String sanitiseData(String data) + { + String cleanData = data.replaceAll("\\[\"", "").replaceAll("\\]\"", "") + .replaceAll("\\[", "").replaceAll("\\]", "") + .replaceAll("\",\"", ", ").replaceAll("\"", ""); + return cleanData; + } + @Override public String getColumnDataConfigFileName() { @@ -404,4 +414,18 @@ public class PDBFTSRestClient extends FTSRestClient } return instance; } + + private Collection allDefaultDisplayedStructureDataColumns; + + public Collection getAllDefaultDisplayedStructureDataColumns() + { + if (allDefaultDisplayedStructureDataColumns == null + || allDefaultDisplayedStructureDataColumns.isEmpty()) + { + allDefaultDisplayedStructureDataColumns = new ArrayList(); + allDefaultDisplayedStructureDataColumns.addAll(super + .getAllDefaultDisplayedFTSDataColumns()); + } + return allDefaultDisplayedStructureDataColumns; + } } diff --git a/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java b/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java index 8a21ffb..5ee518b 100644 --- a/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java +++ b/src/jalview/fts/service/uniprot/UniProtFTSRestClient.java @@ -63,19 +63,20 @@ public class UniProtFTSRestClient extends FTSRestClient : uniportRestRequest.getResponseSize(); int offSet = uniportRestRequest.getOffSet(); + String query; + if (isAdvancedQuery(uniportRestRequest.getSearchTerm())) + { + query = uniportRestRequest.getSearchTerm(); + } + else + { + query = uniportRestRequest.getFieldToSearchBy().equalsIgnoreCase( + "Search All") ? uniportRestRequest.getSearchTerm() + + " or mnemonic:" + uniportRestRequest.getSearchTerm() + : uniportRestRequest.getFieldToSearchBy() + ":" + + uniportRestRequest.getSearchTerm(); + } - String query = uniportRestRequest.getFieldToSearchBy() - .equalsIgnoreCase("Search All") ? uniportRestRequest - .getSearchTerm() : uniportRestRequest.getFieldToSearchBy() - + ":" + uniportRestRequest.getSearchTerm(); - - // + (uniportRestRequest.isAllowUnpublishedEntries() ? "" - // : " AND status:REL"); - // System.out.println(">>>>> Query : " + query); - // System.out.println(">>>>> Columns : " + wantedFields); - // System.out.println(">>>>> Response size: " + responseSize - // + " offset : " - // + offSet); WebResource webResource = null; webResource = client.resource(UNIPROT_SEARCH_ENDPOINT) .queryParam("format", "tab") @@ -99,10 +100,12 @@ public class UniProtFTSRestClient extends FTSRestClient throw new Exception(errorMessage); } + int xTotalResults = Integer.valueOf(clientResponse.getHeaders() + .get("X-Total-Results").get(0)); clientResponse = null; client = null; return parseUniprotResponse(uniProtTabDelimittedResponseString, - uniportRestRequest); + uniportRestRequest, xTotalResults); } catch (Exception e) { String exceptionMsg = e.getMessage(); @@ -126,10 +129,21 @@ public class UniProtFTSRestClient extends FTSRestClient } } + public boolean isAdvancedQuery(String query) + { + if (query.contains(" AND ") || query.contains(" OR ") + || query.contains(" NOT ") || query.contains(" ! ") + || query.contains(" || ") || query.contains(" && ") + || query.contains(":") || query.contains("-")) + { + return true; + } + return false; + } public FTSRestResponse parseUniprotResponse( String uniProtTabDelimittedResponseString, - FTSRestRequest uniprotRestRequest) + FTSRestRequest uniprotRestRequest, int xTotalResults) { FTSRestResponse searchResult = new FTSRestResponse(); List result = null; @@ -156,7 +170,7 @@ public class UniProtFTSRestClient extends FTSRestClient // System.out.println(dataRow); result.add(getFTSData(dataRow, uniprotRestRequest)); } - searchResult.setNumberOfItemsFound(result.size()); + searchResult.setNumberOfItemsFound(xTotalResults); searchResult.setSearchSummary(result); } return searchResult; @@ -224,9 +238,11 @@ public class UniProtFTSRestClient extends FTSRestClient { try { - summaryRowData[colCounter++] = (field.getDataColumnClass() == Integer.class) ? Integer - .valueOf(fieldData) - : (field.getDataColumnClass() == Double.class) ? Double + summaryRowData[colCounter++] = (field.getDataType() + .getDataTypeClass() == Integer.class) ? Integer + .valueOf(fieldData.replace(",", "")) + : (field.getDataType() + .getDataTypeClass() == Double.class) ? Double .valueOf(fieldData) : fieldData; } catch (Exception e) { diff --git a/src/jalview/fts/service/uniprot/UniprotFTSPanel.java b/src/jalview/fts/service/uniprot/UniprotFTSPanel.java index acf2fb0..9c2c5ce 100644 --- a/src/jalview/fts/service/uniprot/UniprotFTSPanel.java +++ b/src/jalview/fts/service/uniprot/UniprotFTSPanel.java @@ -29,7 +29,9 @@ import jalview.fts.core.GFTSPanel; import jalview.gui.SequenceFetcher; import jalview.util.MessageManager; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; @SuppressWarnings("serial") public class UniprotFTSPanel extends GFTSPanel @@ -40,7 +42,7 @@ public class UniprotFTSPanel extends GFTSPanel private String ftsFrameTitle = defaultFTSFrameTitle; - + private static Map tempUserPrefs = new HashMap(); public UniprotFTSPanel(SequenceFetcher seqFetcher) { @@ -74,7 +76,7 @@ public class UniprotFTSPanel extends GFTSPanel .getSelectedItem()).getAltCode(); wantedFields = UniProtFTSRestClient.getInstance() - .getAllDefaulDisplayedDataColumns(); + .getAllDefaultDisplayedFTSDataColumns(); String searchTerm = decodeSearchTerm(txt_search.getText(), searchTarget); @@ -104,20 +106,28 @@ public class UniprotFTSPanel extends GFTSPanel FTSRestResponse.getTableModel(request, resultList.getSearchSummary())); FTSRestResponse.configureTableColumn(getResultTable(), - wantedFields); + wantedFields, tempUserPrefs); getResultTable().setVisible(true); } long endTime = System.currentTimeMillis(); - resultSetCount = resultList.getNumberOfItemsFound(); + totalResultSetCount = resultList.getNumberOfItemsFound(); + resultSetCount = resultList.getSearchSummary() == null ? 0 + : resultList.getSearchSummary().size(); String result = (resultSetCount > 0) ? MessageManager .getString("label.results") : MessageManager .getString("label.result"); if (isPaginationEnabled() && resultSetCount > 0) { updateSearchFrameTitle(defaultFTSFrameTitle + " - " + result - + " " + (offSet + 1) + " to " - + (offSet + resultSetCount) + + " " + + totalNumberformatter.format((Number) (offSet + 1)) + + " to " + + totalNumberformatter + .format((Number) (offSet + resultSetCount)) + + " of " + + totalNumberformatter + .format((Number) totalResultSetCount) + " " + " (" + (endTime - startTime) + " milli secs)"); } else @@ -128,6 +138,7 @@ public class UniprotFTSPanel extends GFTSPanel } setSearchInProgress(false); refreshPaginatorState(); + updateSummaryTableSelections(); } } }.start(); @@ -190,7 +201,7 @@ public class UniprotFTSPanel extends GFTSPanel primaryKeyColIndex).toString(); selectedIdsSet.add(idStr); } - + selectedIdsSet.addAll(paginatorCart); for (String selectedId : selectedIdsSet) { selectedIds.append(selectedId).append(";"); @@ -216,4 +227,10 @@ public class UniprotFTSPanel extends GFTSPanel return ftsFrameTitle; } + @Override + public Map getTempUserPrefs() + { + return tempUserPrefs; + } + } diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 8ec5366..891fdd6 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -74,6 +74,7 @@ import jalview.io.JalviewFileView; import jalview.io.JnetAnnotationMaker; import jalview.io.NewickFile; import jalview.io.TCoffeeScoreFile; +import jalview.io.gff.SequenceOntologyI; import jalview.jbgui.GAlignFrame; import jalview.schemes.Blosum62ColourScheme; import jalview.schemes.BuriedColourScheme; @@ -112,7 +113,6 @@ import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; -import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; @@ -473,7 +473,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void focusGained(FocusEvent e) { - Desktop.setCurrentAlignFrame(AlignFrame.this); + Jalview.setCurrentAlignFrame(AlignFrame.this); } }); @@ -1313,7 +1313,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, if (viewport.hasHiddenColumns() && !settings.isExportHiddenColumns()) { - omitHidden = viewport.getViewAsString(false); + omitHidden = viewport.getViewAsString(false, + settings.isExportHiddenSequences()); } int[] alignmentStartEnd = new int[2]; @@ -1324,17 +1325,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, else { alignmentToExport = viewport.getAlignment(); - alignmentStartEnd = viewport.getAlignment() - .getVisibleStartAndEndIndex( - viewport - .getColumnSelection().getHiddenColumns()); } + alignmentStartEnd = alignmentToExport + .getVisibleStartAndEndIndex(viewport.getColumnSelection() + .getHiddenColumns()); AlignmentExportData ed = new AlignmentExportData(alignmentToExport, omitHidden, alignmentStartEnd, settings); return ed; } - /** * DOCUMENT ME! * @@ -4634,38 +4633,38 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * Searches selected sequences for xRef products and builds the Show - * Cross-References menu (formerly called Show Products) + * Searches the alignment sequences for xRefs and builds the Show + * Cross-References menu (formerly called Show Products), with database + * sources for which cross-references are found (protein sources for a + * nucleotide alignment and vice versa) * - * @return true if Show Cross-references menu should be enabled. + * @return true if Show Cross-references menu should be enabled */ public boolean canShowProducts() { - SequenceI[] selection = viewport.getSequenceSelection(); + SequenceI[] seqs = viewport.getAlignment().getSequencesArray(); AlignmentI dataset = viewport.getAlignment().getDataset(); boolean showp = false; try { showProducts.removeAll(); final boolean dna = viewport.getAlignment().isNucleotide(); - String[] ptypes = (selection == null || selection.length == 0) ? null - : CrossRef.findSequenceXrefTypes(dna, selection, dataset); + List ptypes = (seqs == null || seqs.length == 0) ? null + : new CrossRef(seqs, dataset) + .findXrefSourcesForSequences(dna); - for (int t = 0; ptypes != null && t < ptypes.length; t++) + for (final String source : ptypes) { showp = true; final AlignFrame af = this; - final String source = ptypes[t]; - JMenuItem xtype = new JMenuItem(ptypes[t]); + JMenuItem xtype = new JMenuItem(source); xtype.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { showProductsFor(af.viewport.getSequenceSelection(), dna, source); } - }); showProducts.add(xtype); } @@ -4673,7 +4672,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, showProducts.setEnabled(showp); } catch (Exception e) { - jalview.bin.Cache.log + Cache.log .warn("canShowProducts threw an exception - please report to help@jalview.org", e); return false; @@ -4681,7 +4680,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, return showp; } - protected void showProductsFor(final SequenceI[] sel, final boolean dna, + /** + * Finds and displays cross-references for the selected sequences (protein + * products for nucleotide sequences, dna coding sequences for peptides). + * + * @param sel + * the sequences to show cross-references for + * @param dna + * true if from a nucleotide alignment (so showing proteins) + * @param source + * the database to show cross-references for + */ + protected void showProductsFor(final SequenceI[] sel, final boolean _odna, final String source) { Runnable foo = new Runnable() @@ -4698,157 +4708,171 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, { AlignmentI alignment = AlignFrame.this.getViewport() .getAlignment(); - AlignmentI xrefs = CrossRef.findXrefSequences(sel, dna, source, - alignment); - if (xrefs != null) + AlignmentI dataset = alignment.getDataset() == null ? alignment + : alignment.getDataset(); + boolean dna = alignment.isNucleotide(); + if (_odna!=dna) { - /* - * get display scheme (if any) to apply to features - */ - FeatureSettingsModelI featureColourScheme = new SequenceFetcher() - .getFeatureColourScheme(source); + System.err + .println("Conflict: showProducts for alignment originally " + + "thought to be " + + (_odna ? "DNA" : "Protein") + + " now searching for " + + (dna ? "DNA" : "Protein") + " Context."); + } + AlignmentI xrefs = new CrossRef(sel, dataset) + .findXrefSequences(source, dna); + if (xrefs == null) + { + return; + } + /* + * get display scheme (if any) to apply to features + */ + FeatureSettingsModelI featureColourScheme = new SequenceFetcher() + .getFeatureColourScheme(source); - AlignmentI al = makeCrossReferencesAlignment( - alignment.getDataset(), xrefs); + AlignmentI xrefsAlignment = makeCrossReferencesAlignment(dataset, + xrefs); + if (!dna) + { + xrefsAlignment = AlignmentUtils.makeCdsAlignment( + xrefsAlignment.getSequencesArray(), dataset, sel); + xrefsAlignment.alignAs(alignment); + } + + AlignFrame newFrame = new AlignFrame(xrefsAlignment, DEFAULT_WIDTH, + DEFAULT_HEIGHT); + if (Cache.getDefault("HIDE_INTRONS", true)) + { + newFrame.hideFeatureColumns(SequenceOntologyI.EXON, false); + } + String newtitle = String.format("%s %s %s", MessageManager + .getString(dna ? "label.proteins" : "label.nucleotides"), + MessageManager.getString("label.for"), getTitle()); + newFrame.setTitle(newtitle); - AlignFrame newFrame = new AlignFrame(al, DEFAULT_WIDTH, + if (!Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true)) + { + /* + * split frame display is turned off in preferences file + */ + Desktop.addInternalFrame(newFrame, newtitle, DEFAULT_WIDTH, DEFAULT_HEIGHT); - String newtitle = String.format("%s %s %s", - MessageManager.getString(dna ? "label.proteins" - : "label.nucleotides"), MessageManager - .getString("label.for"), getTitle()); - newFrame.setTitle(newtitle); + return; // via finally clause + } - if (!Cache.getDefault(Preferences.ENABLE_SPLIT_FRAME, true)) + /* + * Make a copy of this alignment (sharing the same dataset + * sequences). If we are DNA, drop introns and update mappings + */ + AlignmentI copyAlignment = null; + boolean copyAlignmentIsAligned = false; + if (dna) + { + copyAlignment = AlignmentUtils.makeCdsAlignment(sel, dataset, + xrefsAlignment.getSequencesArray()); + if (copyAlignment.getHeight() == 0) { - /* - * split frame display is turned off in preferences file - */ - Desktop.addInternalFrame(newFrame, newtitle, DEFAULT_WIDTH, - DEFAULT_HEIGHT); - return; // via finally clause + System.err.println("Failed to make CDS alignment"); } /* - * Make a copy of this alignment (sharing the same dataset - * sequences). If we are DNA, drop introns and update mappings + * pending getting Embl transcripts to 'align', + * we are only doing this for Ensembl */ - AlignmentI copyAlignment = null; - final SequenceI[] sequenceSelection = AlignFrame.this.viewport - .getSequenceSelection(); - List cf = xrefs.getCodonFrames(); - boolean copyAlignmentIsAligned = false; - if (dna) - { - copyAlignment = AlignmentUtils.makeCdsAlignment( - sequenceSelection, cf, alignment); - if (copyAlignment.getHeight() == 0) - { - System.err.println("Failed to make CDS alignment"); - } - al.getCodonFrames().clear(); - al.getCodonFrames().addAll(copyAlignment.getCodonFrames()); - - /* - * pending getting Embl transcripts to 'align', - * we are only doing this for Ensembl - */ - // TODO proper criteria for 'can align as cdna' - if (DBRefSource.ENSEMBL.equalsIgnoreCase(source) - || AlignmentUtils.looksLikeEnsembl(alignment)) - { - copyAlignment.alignAs(alignment); - copyAlignmentIsAligned = true; - } - } - else + // TODO proper criteria for 'can align as cdna' + if (DBRefSource.ENSEMBL.equalsIgnoreCase(source) + || AlignmentUtils.looksLikeEnsembl(alignment)) { - copyAlignment = AlignmentUtils.makeCopyAlignment( - sequenceSelection, xrefs.getSequencesArray()); - copyAlignment.getCodonFrames().addAll(cf); + copyAlignment.alignAs(alignment); + copyAlignmentIsAligned = true; } - copyAlignment.setGapCharacter(AlignFrame.this.viewport - .getGapCharacter()); + } + else + { + copyAlignment = AlignmentUtils.makeCopyAlignment(sel, + xrefs.getSequencesArray(), dataset); + } + copyAlignment.setGapCharacter(AlignFrame.this.viewport + .getGapCharacter()); - StructureSelectionManager ssm = StructureSelectionManager - .getStructureSelectionManager(Desktop.instance); - ssm.registerMappings(cf); + StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(Desktop.instance); - if (copyAlignment.getHeight() <= 0) - { - System.err.println("No Sequences generated for xRef type " - + source); - return; - } + /* + * register any new mappings for sequence mouseover etc + * (will not duplicate any previously registered mappings) + */ + ssm.registerMappings(dataset.getCodonFrames()); + + if (copyAlignment.getHeight() <= 0) + { + System.err.println("No Sequences generated for xRef type " + + source); + return; + } + /* + * align protein to dna + */ + if (dna && copyAlignmentIsAligned) + { + xrefsAlignment.alignAs(copyAlignment); + } + else + { /* - * align protein to dna + * align cdna to protein - currently only if + * fetching and aligning Ensembl transcripts! */ - if (dna && copyAlignmentIsAligned) + // TODO: generalise for other sources of locus/transcript/cds data + if (dna && DBRefSource.ENSEMBL.equalsIgnoreCase(source)) { - al.alignAs(copyAlignment); - } - else - { - /* - * align cdna to protein - currently only if - * fetching and aligning Ensembl transcripts! - */ - if (DBRefSource.ENSEMBL.equalsIgnoreCase(source)) - { - copyAlignment.alignAs(al); - } + copyAlignment.alignAs(xrefsAlignment); } + } - AlignFrame copyThis = new AlignFrame(copyAlignment, - AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); - copyThis.setTitle(AlignFrame.this.getTitle()); + AlignFrame copyThis = new AlignFrame(copyAlignment, + AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); + copyThis.setTitle(AlignFrame.this.getTitle()); - boolean showSequenceFeatures = viewport - .isShowSequenceFeatures(); - newFrame.setShowSeqFeatures(showSequenceFeatures); - copyThis.setShowSeqFeatures(showSequenceFeatures); - FeatureRenderer myFeatureStyling = alignPanel.getSeqPanel().seqCanvas - .getFeatureRenderer(); + boolean showSequenceFeatures = viewport.isShowSequenceFeatures(); + newFrame.setShowSeqFeatures(showSequenceFeatures); + copyThis.setShowSeqFeatures(showSequenceFeatures); + FeatureRenderer myFeatureStyling = alignPanel.getSeqPanel().seqCanvas + .getFeatureRenderer(); - /* - * copy feature rendering settings to split frame - */ - newFrame.alignPanel.getSeqPanel().seqCanvas - .getFeatureRenderer() - .transferSettings(myFeatureStyling); - copyThis.alignPanel.getSeqPanel().seqCanvas - .getFeatureRenderer() - .transferSettings(myFeatureStyling); + /* + * copy feature rendering settings to split frame + */ + newFrame.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() + .transferSettings(myFeatureStyling); + copyThis.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer() + .transferSettings(myFeatureStyling); - /* - * apply 'database source' feature configuration - * if any was found - */ - // TODO is this the feature colouring for the original - // alignment or the fetched xrefs? either could be Ensembl - newFrame.getViewport().applyFeaturesStyle(featureColourScheme); - copyThis.getViewport().applyFeaturesStyle(featureColourScheme); - - SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame, - dna ? newFrame : copyThis); - newFrame.setVisible(true); - copyThis.setVisible(true); - String linkedTitle = MessageManager - .getString("label.linked_view_title"); - Desktop.addInternalFrame(sf, linkedTitle, -1, -1); - sf.adjustDivider(); - } - } catch (Exception e) - { - Cache.log.error( - "Exception when finding crossreferences", e); + /* + * apply 'database source' feature configuration + * if any was found + */ + // TODO is this the feature colouring for the original + // alignment or the fetched xrefs? either could be Ensembl + newFrame.getViewport().applyFeaturesStyle(featureColourScheme); + copyThis.getViewport().applyFeaturesStyle(featureColourScheme); + + SplitFrame sf = new SplitFrame(dna ? copyThis : newFrame, + dna ? newFrame : copyThis); + newFrame.setVisible(true); + copyThis.setVisible(true); + String linkedTitle = MessageManager + .getString("label.linked_view_title"); + Desktop.addInternalFrame(sf, linkedTitle, -1, -1); + sf.adjustDivider(); } catch (OutOfMemoryError e) { new OOMWarning("whilst fetching crossreferences", e); } catch (Throwable e) { - Cache.log.error("Error when finding crossreferences", - e); + Cache.log.error("Error when finding crossreferences", e); } finally { AlignFrame.this.setProgressBar(MessageManager.formatMessage( @@ -4858,11 +4882,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, } /** - * Makes an alignment containing the given sequences. If this is of the - * same type as the given dataset (nucleotide/protein), then the new - * alignment shares the same dataset, and its dataset sequences are added - * to it. Otherwise a new dataset sequence is created for the - * cross-references. + * Makes an alignment containing the given sequences, and adds them to the + * given dataset, which is also set as the dataset for the new alignment + * + * TODO: refactor to DatasetI method * * @param dataset * @param seqs @@ -4871,32 +4894,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected AlignmentI makeCrossReferencesAlignment(AlignmentI dataset, AlignmentI seqs) { - boolean sameType = dataset.isNucleotide() == seqs.isNucleotide(); - SequenceI[] sprods = new SequenceI[seqs.getHeight()]; for (int s = 0; s < sprods.length; s++) { sprods[s] = (seqs.getSequenceAt(s)).deriveSequence(); - if (sameType) + if (dataset.getSequences() == null + || !dataset.getSequences().contains( + sprods[s].getDatasetSequence())) { - if (dataset.getSequences() == null - || !dataset.getSequences().contains( - sprods[s].getDatasetSequence())) - { - dataset.addSequence(sprods[s].getDatasetSequence()); - } + dataset.addSequence(sprods[s].getDatasetSequence()); } sprods[s].updatePDBIds(); } Alignment al = new Alignment(sprods); - if (sameType) - { - al.setDataset((Alignment) dataset); - } - else - { - al.createDatasetAlignment(); - } + al.setDataset(dataset); return al; } @@ -4926,7 +4937,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, .getString("label.error_when_translating_sequences_submit_bug_report"); final String errorTitle = MessageManager .getString("label.implementation_error") - + MessageManager.getString("translation_failed"); + + MessageManager.getString("label.translation_failed"); JOptionPane.showMessageDialog(Desktop.desktop, msg, errorTitle, JOptionPane.ERROR_MESSAGE); return; @@ -5025,49 +5036,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, public void drop(DropTargetDropEvent evt) { Transferable t = evt.getTransferable(); - java.util.List files = null; + java.util.List files = new ArrayList(), protocols = new ArrayList(); try { - DataFlavor uriListFlavor = new DataFlavor( - "text/uri-list;class=java.lang.String"); - if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) - { - // Works on Windows and MacOSX - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - files = (java.util.List) t - .getTransferData(DataFlavor.javaFileListFlavor); - } - else if (t.isDataFlavorSupported(uriListFlavor)) - { - // This is used by Unix drag system - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - String data = (String) t.getTransferData(uriListFlavor); - files = new java.util.ArrayList(1); - for (java.util.StringTokenizer st = new java.util.StringTokenizer( - data, "\r\n"); st.hasMoreTokens();) - { - String s = st.nextToken(); - if (s.startsWith("#")) - { - // the line is a comment (as per the RFC 2483) - continue; - } - - java.net.URI uri = new java.net.URI(s); - // check to see if we can handle this kind of URI - if (uri.getScheme().toLowerCase().startsWith("http")) - { - files.add(uri.toString()); - } - else - { - // otherwise preserve old behaviour: catch all for file objects - java.io.File file = new java.io.File(uri); - files.add(file.toString()); - } - } - } + Desktop.transferFromDropTarget(files, protocols, evt, t); } catch (Exception e) { e.printStackTrace(); @@ -5542,8 +5515,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, AlignFrame.this.setMenusForViewport(); } }); - dbRefFetcher - .fetchDBRefs(false); + dbRefFetcher.fetchDBRefs(false); } }).start(); @@ -5984,8 +5956,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, protected void setAnnotationsVisibility(boolean visible, boolean forSequences, boolean forAlignment) { - for (AlignmentAnnotation aa : alignPanel.getAlignment() - .getAlignmentAnnotation()) + AlignmentAnnotation[] anns = alignPanel.getAlignment() + .getAlignmentAnnotation(); + if (anns == null) + { + return; + } + for (AlignmentAnnotation aa : anns) { /* * don't display non-positional annotations on an alignment @@ -6101,9 +6078,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, try { Dna dna = new Dna(viewport, viewport.getViewAsVisibleContigs(true)); - al = dna.reverseCdna(complement); viewport.addAlignment(al, ""); + addHistoryItem(new EditCommand( + MessageManager.getString("label.add_sequences"), + Action.PASTE, al.getSequencesArray(), 0, al.getWidth(), + viewport.getAlignment())); } catch (Exception ex) { System.err.println(ex.getMessage()); @@ -6119,7 +6099,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override protected void runGroovy_actionPerformed() { - Desktop.setCurrentAlignFrame(this); + Jalview.setCurrentAlignFrame(this); groovy.ui.Console console = Desktop.getGroovyConsole(); if (console != null) { @@ -6142,6 +6122,31 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, System.err.println("Can't run Groovy script as console not found"); } } + + /** + * Hides columns containing (or not containing) a specified feature, provided + * that would not leave all columns hidden + * + * @param featureType + * @param columnsContaining + * @return + */ + public boolean hideFeatureColumns(String featureType, + boolean columnsContaining) + { + boolean notForHiding = avc.markColumnsContainingFeatures( + columnsContaining, false, false, featureType); + if (notForHiding) + { + if (avc.markColumnsContainingFeatures(!columnsContaining, false, + false, featureType)) + { + getViewport().hideSelectedColumns(); + return true; + } + } + return false; + } } class PrintThread extends Thread diff --git a/src/jalview/gui/AlignViewport.java b/src/jalview/gui/AlignViewport.java index 692cd18..b1a4fee 100644 --- a/src/jalview/gui/AlignViewport.java +++ b/src/jalview/gui/AlignViewport.java @@ -683,27 +683,42 @@ public class AlignViewport extends AlignmentViewport implements List seqvectors = new ArrayList(); for (PDBEntry pdb : pdbEntries) { - List seqs = new ArrayList(); + List choosenSeqs = new ArrayList(); for (SequenceI sq : alignment.getSequences()) { - Vector pdbs = sq.getDatasetSequence().getAllPDBEntries(); - if (pdbs == null) + Vector pdbRefEntries = sq.getDatasetSequence().getAllPDBEntries(); + if (pdbRefEntries == null) { continue; } - for (PDBEntry p1 : pdbs) + for (PDBEntry pdbRefEntry : pdbRefEntries) { - if (p1.getId().equals(pdb.getId())) + if (pdbRefEntry.getId().equals(pdb.getId())) { - if (!seqs.contains(sq)) + if (pdbRefEntry.getChainCode() != null + && pdb.getChainCode() != null) { - seqs.add(sq); - continue; + if (pdbRefEntry.getChainCode().equalsIgnoreCase( + pdb.getChainCode()) + && !choosenSeqs.contains(sq)) + { + choosenSeqs.add(sq); + continue; + } } + else + { + if (!choosenSeqs.contains(sq)) + { + choosenSeqs.add(sq); + continue; + } + } + } } } - seqvectors.add(seqs.toArray(new SequenceI[seqs.size()])); + seqvectors.add(choosenSeqs.toArray(new SequenceI[choosenSeqs.size()])); } return seqvectors.toArray(new SequenceI[seqvectors.size()][]); } @@ -1103,6 +1118,7 @@ public class AlignViewport extends AlignmentViewport implements * * @param featureSettings */ + @Override public void applyFeaturesStyle(FeatureSettingsModelI featureSettings) { if (featureSettings == null) diff --git a/src/jalview/gui/AnnotationExporter.java b/src/jalview/gui/AnnotationExporter.java index d688ddd..469e495 100644 --- a/src/jalview/gui/AnnotationExporter.java +++ b/src/jalview/gui/AnnotationExporter.java @@ -20,6 +20,7 @@ */ package jalview.gui; +import jalview.api.FeatureColourI; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.SequenceI; import jalview.io.AnnotationFile; @@ -155,18 +156,25 @@ public class AnnotationExporter extends JPanel .getString("label.no_features_on_alignment"); if (features) { + Map displayedFeatureColours = ap + .getFeatureRenderer().getDisplayedFeatureCols(); FeaturesFile formatter = new FeaturesFile(); SequenceI[] sequences = ap.av.getAlignment().getSequencesArray(); - Map featureColours = ap.getFeatureRenderer() + Map featureColours = ap.getFeatureRenderer() .getDisplayedFeatureCols(); boolean includeNonPositional = ap.av.isShowNPFeats(); if (GFFFormat.isSelected()) { + text = new FeaturesFile().printGffFormat(ap.av.getAlignment() + .getDataset().getSequencesArray(), displayedFeatureColours, + true, ap.av.isShowNPFeats()); text = formatter.printGffFormat(sequences, featureColours, true, includeNonPositional); } else { + text = new FeaturesFile().printJalviewFormat(ap.av.getAlignment() + .getDataset().getSequencesArray(), displayedFeatureColours, true, ap.av.isShowNPFeats()); // ap.av.featuresDisplayed); text = formatter.printJalviewFormat(sequences, featureColours, true, includeNonPositional); } diff --git a/src/jalview/gui/AnnotationLabels.java b/src/jalview/gui/AnnotationLabels.java index 68df498..e27b919 100755 --- a/src/jalview/gui/AnnotationLabels.java +++ b/src/jalview/gui/AnnotationLabels.java @@ -802,8 +802,45 @@ public class AnnotationLabels extends JPanel implements MouseListener, // todo: make the ap scroll to the selection - not necessary, first // click highlights/scrolls, second selects ap.getSeqPanel().ap.getIdPanel().highlightSearchResults(null); - ap.av.setSelectionGroup(// new SequenceGroup( - aa[selectedRow].groupRef); // ); + // process modifiers + SequenceGroup sg = ap.av.getSelectionGroup(); + if (sg == null + || sg == aa[selectedRow].groupRef + || !(jalview.util.Platform.isControlDown(evt) || evt + .isShiftDown())) + { + if (jalview.util.Platform.isControlDown(evt) + || evt.isShiftDown()) + { + // clone a new selection group from the associated group + ap.av.setSelectionGroup(new SequenceGroup( + aa[selectedRow].groupRef)); + } + else + { + // set selection to the associated group so it can be edited + ap.av.setSelectionGroup(aa[selectedRow].groupRef); + } + } + else + { + // modify current selection with associated group + int remainToAdd = aa[selectedRow].groupRef.getSize(); + for (SequenceI sgs : aa[selectedRow].groupRef.getSequences()) + { + if (jalview.util.Platform.isControlDown(evt)) + { + sg.addOrRemove(sgs, --remainToAdd == 0); + } + else + { + // notionally, we should also add intermediate sequences from + // last added sequence ? + sg.addSequence(sgs, --remainToAdd == 0); + } + } + } + ap.paintAlignment(false); PaintRefresher.Refresh(ap, ap.av.getSequenceSetId()); ap.av.sendSelection(); @@ -833,7 +870,8 @@ public class AnnotationLabels extends JPanel implements MouseListener, // we make a copy rather than edit the current selection if no // modifiers pressed // see Enhancement JAL-1557 - if (!(evt.isControlDown() || evt.isShiftDown())) + if (!(jalview.util.Platform.isControlDown(evt) || evt + .isShiftDown())) { sg = new SequenceGroup(sg); sg.clear(); @@ -841,7 +879,7 @@ public class AnnotationLabels extends JPanel implements MouseListener, } else { - if (evt.isControlDown()) + if (jalview.util.Platform.isControlDown(evt)) { sg.addOrRemove(aa[selectedRow].sequenceRef, true); } @@ -861,9 +899,9 @@ public class AnnotationLabels extends JPanel implements MouseListener, sg.addSequence(aa[selectedRow].sequenceRef, false); } ap.av.setSelectionGroup(sg); - ap.av.sendSelection(); ap.paintAlignment(false); PaintRefresher.Refresh(ap, ap.av.getSequenceSetId()); + ap.av.sendSelection(); } } diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index 7f36f7f..d54e553 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -61,6 +61,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -82,6 +83,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; +import javax.swing.AbstractAction; import javax.swing.DefaultDesktopManager; import javax.swing.DesktopManager; import javax.swing.JButton; @@ -96,6 +98,7 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JProgressBar; +import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkEvent.EventType; @@ -169,8 +172,6 @@ public class Desktop extends jalview.jbgui.GDesktop implements static final int yOffset = 30; - private static AlignFrame currentAlignFrame; - public static jalview.ws.jws1.Discoverer discoverer; public static Object[] jalviewClipboard; @@ -952,53 +953,15 @@ public class Desktop extends jalview.jbgui.GDesktop implements { boolean success = true; Transferable t = evt.getTransferable(); - java.util.List files = null; - java.util.List protocols = null; + java.util.List files = new ArrayList(); + java.util.List protocols = new ArrayList(); try { - DataFlavor uriListFlavor = new DataFlavor( - "text/uri-list;class=java.lang.String"); - if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) - { - // Works on Windows and MacOSX - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - files = (java.util.List) t - .getTransferData(DataFlavor.javaFileListFlavor); - } - else if (t.isDataFlavorSupported(uriListFlavor)) - { - // This is used by Unix drag system - evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); - String data = (String) t.getTransferData(uriListFlavor); - files = new java.util.ArrayList(1); - protocols = new java.util.ArrayList(1); - for (java.util.StringTokenizer st = new java.util.StringTokenizer( - data, "\r\n"); st.hasMoreTokens();) - { - String s = st.nextToken(); - if (s.startsWith("#")) - { - // the line is a comment (as per the RFC 2483) - continue; - } - java.net.URI uri = new java.net.URI(s); - if (uri.getScheme().toLowerCase().startsWith("http")) - { - protocols.add(FormatAdapter.URL); - files.add(uri.toString()); - } - else - { - // otherwise preserve old behaviour: catch all for file objects - java.io.File file = new java.io.File(uri); - protocols.add(FormatAdapter.FILE); - files.add(file.toString()); - } - } - } + Desktop.transferFromDropTarget(files, protocols, evt, t); } catch (Exception e) { + e.printStackTrace(); success = false; } @@ -1218,6 +1181,13 @@ public class Desktop extends jalview.jbgui.GDesktop implements dialogExecutor.shutdownNow(); } closeAll_actionPerformed(null); + + if (groovyConsole != null) + { + // suppress a possible repeat prompt to save script + groovyConsole.setDirty(false); + groovyConsole.exit(); + } System.exit(0); } @@ -2409,7 +2379,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements if (Jalview.isHeadlessMode()) { // Desktop.desktop is null in headless mode - return new AlignFrame[] { currentAlignFrame }; + return new AlignFrame[] { Jalview.currentAlignFrame }; } JInternalFrame[] frames = Desktop.desktop.getAllFrames(); @@ -2505,50 +2475,79 @@ public class Desktop extends jalview.jbgui.GDesktop implements */ void openGroovyConsole() { - groovyConsole = new groovy.ui.Console(); + if (groovyConsole == null) + { + groovyConsole = new groovy.ui.Console(); + groovyConsole.setVariable("Jalview", this); + groovyConsole.run(); - /* - * bind groovy variable 'Jalview' to the Desktop object - */ - groovyConsole.setVariable("Jalview", this); + /* + * We allow only one console at a time, so that AlignFrame menu option + * 'Calculate | Run Groovy script' is unambiguous. + * Disable 'Groovy Console', and enable 'Run script', when the console is + * opened, and the reverse when it is closed + */ + Window window = (Window) groovyConsole.getFrame(); + window.addWindowListener(new WindowAdapter() + { + @Override + public void windowClosed(WindowEvent e) + { + /* + * rebind CMD-Q from Groovy Console to Jalview Quit + */ + addQuitHandler(); + enableExecuteGroovy(false); + } + }); + } /* - * start the console + * show Groovy console window (after close and reopen) */ - groovyConsole.run(); + ((Window) groovyConsole.getFrame()).setVisible(true); /* - * Allow only one console at a time, so that the AlignFrame menu option - * 'Calculate | Run Groovy script' is unambiguous. - * Disable 'new console', and enable 'Run script', when the console is - * opened, and the reverse when it is closed + * if we got this far, enable 'Run Groovy' in AlignFrame menus + * and disable opening a second console */ - Window window = (Window) groovyConsole.getFrame(); - window.addWindowListener(new WindowAdapter() + enableExecuteGroovy(true); + } + + /** + * Bind Ctrl/Cmd-Q to Quit - for reset as Groovy Console takes over this + * binding when opened + */ + protected void addQuitHandler() + { + getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put( + KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit + .getDefaultToolkit().getMenuShortcutKeyMask()), + "Quit"); + getRootPane().getActionMap().put("Quit", new AbstractAction() { @Override - public void windowClosed(WindowEvent e) + public void actionPerformed(ActionEvent e) { - groovyShell.setEnabled(true); - enableExecuteGroovy(false); + quit(); } }); - - /* - * if we got this far, enable 'Run Groovy' in AlignFrame menus - * and disable opening a second console - */ - groovyShell.setEnabled(false); - enableExecuteGroovy(true); } /** * Enable or disable 'Run Groovy script' in AlignFrame calculate menus * * @param enabled + * true if Groovy console is open */ public void enableExecuteGroovy(boolean enabled) { + /* + * disable opening a second Groovy console + * (or re-enable when the console is closed) + */ + groovyShell.setEnabled(!enabled); + AlignFrame[] alignFrames = getAlignFrames(); if (alignFrames != null) { @@ -3172,22 +3171,109 @@ public class Desktop extends jalview.jbgui.GDesktop implements * The dust settles...give focus to the tab we did this from. */ myTopFrame.setDisplayedView(myTopFrame.alignPanel); - } - public static AlignFrame getCurrentAlignFrame() + public static groovy.ui.Console getGroovyConsole() { - return currentAlignFrame; + return groovyConsole; } - public static void setCurrentAlignFrame(AlignFrame currentAlignFrame) + public static void transferFromDropTarget(List files, + List protocols, DropTargetDropEvent evt, Transferable t) + throws Exception { - Desktop.currentAlignFrame = currentAlignFrame; - } - public static groovy.ui.Console getGroovyConsole() - { - return groovyConsole; + DataFlavor uriListFlavor = new DataFlavor( + "text/uri-list;class=java.lang.String"); + if (t.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) + { + // Works on Windows and MacOSX + Cache.log.debug("Drop handled as javaFileListFlavor"); + evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); + for (Object file : (List) t + .getTransferData(DataFlavor.javaFileListFlavor)) + { + files.add(((File)file).toString()); + protocols.add(FormatAdapter.FILE); + } + } + else + { + // Unix like behaviour + boolean added = false; + String data = null; + if (t.isDataFlavorSupported(uriListFlavor)) + { + Cache.log.debug("Drop handled as uriListFlavor"); + // This is used by Unix drag system + evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); + data = (String) t.getTransferData(uriListFlavor); + } + if (data == null) + { + // fallback to text: workaround - on OSX where there's a JVM bug + Cache.log.debug("standard URIListFlavor failed. Trying text"); + // try text fallback + data = (String) t.getTransferData(new DataFlavor( + "text/plain;class=java.lang.String")); + if (Cache.log.isDebugEnabled()) + { + Cache.log.debug("fallback returned " + data); + } + } + while (protocols.size() < files.size()) + { + Cache.log.debug("Adding missing FILE protocol for " + + files.get(protocols.size())); + protocols.add(FormatAdapter.FILE); + } + for (java.util.StringTokenizer st = new java.util.StringTokenizer( + data, "\r\n"); st.hasMoreTokens();) + { + added = true; + String s = st.nextToken(); + if (s.startsWith("#")) + { + // the line is a comment (as per the RFC 2483) + continue; + } + java.net.URI uri = new java.net.URI(s); + if (uri.getScheme().toLowerCase().startsWith("http")) + { + protocols.add(FormatAdapter.URL); + files.add(uri.toString()); + } + else + { + // otherwise preserve old behaviour: catch all for file objects + java.io.File file = new java.io.File(uri); + protocols.add(FormatAdapter.FILE); + files.add(file.toString()); + } + } + if (Cache.log.isDebugEnabled()) + { + if (data == null || !added) + { + Cache.log + .debug("Couldn't resolve drop data. Here are the supported flavors:"); + for (DataFlavor fl : t.getTransferDataFlavors()) + { + Cache.log.debug("Supported transfer dataflavor: " + + fl.toString()); + evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); + Object df = t.getTransferData(fl); + if (df != null) + { + Cache.log.debug("Retrieves: " + df); + } + else + { + Cache.log.debug("Retrieved nothing"); + } + } + } + } + } } - } diff --git a/src/jalview/gui/FeatureColourChooser.java b/src/jalview/gui/FeatureColourChooser.java index 064d58b..79217ea 100644 --- a/src/jalview/gui/FeatureColourChooser.java +++ b/src/jalview/gui/FeatureColourChooser.java @@ -20,9 +20,9 @@ */ package jalview.gui; +import jalview.api.FeatureColourI; import jalview.datamodel.GraphLine; -import jalview.schemes.AnnotationColourGradient; -import jalview.schemes.GraduatedColor; +import jalview.schemes.FeatureColour; import jalview.util.MessageManager; import java.awt.BorderLayout; @@ -33,7 +33,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.Hashtable; import javax.swing.BorderFactory; import javax.swing.JCheckBox; @@ -52,16 +51,16 @@ public class FeatureColourChooser extends JalviewDialog // FeatureSettings fs; FeatureRenderer fr; - private GraduatedColor cs; + private FeatureColourI cs; - private Object oldcs; + private FeatureColourI oldcs; /** * * @return the last colour setting selected by user - either oldcs (which may * be a java.awt.Color) or the new GraduatedColor */ - public Object getLastColour() + public FeatureColourI getLastColour() { if (cs == null) { @@ -70,8 +69,6 @@ public class FeatureColourChooser extends JalviewDialog return cs; } - Hashtable oldgroupColours; - AlignmentPanel ap; boolean adjusting = false; @@ -127,7 +124,7 @@ public class FeatureColourChooser extends JalviewDialog } }); - float mm[] = ((float[][]) fr.getMinMax().get(type))[0]; + float mm[] = fr.getMinMax().get(type)[0]; min = mm[0]; max = mm[1]; @@ -139,32 +136,32 @@ public class FeatureColourChooser extends JalviewDialog scaleFactor = (max == min) ? 1f : 100f / (max - min); oldcs = fr.getFeatureColours().get(type); - if (oldcs instanceof GraduatedColor) + if (!oldcs.isSimpleColour()) { - if (((GraduatedColor) oldcs).isAutoScale()) + if (oldcs.isAutoScaled()) { // update the scale - cs = new GraduatedColor((GraduatedColor) oldcs, min, max); + cs = new FeatureColour((FeatureColour) oldcs, min, max); } else { - cs = new GraduatedColor((GraduatedColor) oldcs); + cs = new FeatureColour((FeatureColour) oldcs); } } else { // promote original color to a graduated color - Color bl = Color.black; - if (oldcs instanceof Color) + Color bl = oldcs.getColour(); + if (bl == null) { - bl = (Color) oldcs; + bl = Color.BLACK; } // original colour becomes the maximum colour - cs = new GraduatedColor(Color.white, bl, mm[0], mm[1]); + cs = new FeatureColour(Color.white, bl, mm[0], mm[1]); cs.setColourByLabel(false); } - minColour.setBackground(oldminColour = cs.getMinColor()); - maxColour.setBackground(oldmaxColour = cs.getMaxColor()); + minColour.setBackground(oldminColour = cs.getMinColour()); + maxColour.setBackground(oldmaxColour = cs.getMaxColour()); adjusting = true; try @@ -174,18 +171,15 @@ public class FeatureColourChooser extends JalviewDialog { } // update the gui from threshold state - thresholdIsMin.setSelected(!cs.isAutoScale()); + thresholdIsMin.setSelected(!cs.isAutoScaled()); colourByLabel.setSelected(cs.isColourByLabel()); - if (cs.getThreshType() != AnnotationColourGradient.NO_THRESHOLD) + if (cs.hasThreshold()) { // initialise threshold slider and selector - threshold - .setSelectedIndex(cs.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD ? 1 - : 2); + threshold.setSelectedIndex(cs.isAboveThreshold() ? 1 : 2); slider.setEnabled(true); thresholdValue.setEnabled(true); - threshline = new jalview.datamodel.GraphLine((max - min) / 2f, - "Threshold", Color.black); + threshline = new GraphLine((max - min) / 2f, "Threshold", Color.black); } @@ -395,50 +389,50 @@ public class FeatureColourChooser extends JalviewDialog return; } - int aboveThreshold = AnnotationColourGradient.NO_THRESHOLD; + boolean aboveThreshold = false; + boolean belowThreshold = false; if (threshold.getSelectedIndex() == 1) { - aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD; + aboveThreshold = true; } else if (threshold.getSelectedIndex() == 2) { - aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD; + belowThreshold = true; } + boolean hasThreshold = aboveThreshold || belowThreshold; slider.setEnabled(true); thresholdValue.setEnabled(true); - GraduatedColor acg; + FeatureColourI acg; if (cs.isColourByLabel()) { - acg = new GraduatedColor(oldminColour, oldmaxColour, min, max); + acg = new FeatureColour(oldminColour, oldmaxColour, min, max); } else { - acg = new GraduatedColor(oldminColour = minColour.getBackground(), + acg = new FeatureColour(oldminColour = minColour.getBackground(), oldmaxColour = maxColour.getBackground(), min, max); } - if (aboveThreshold == AnnotationColourGradient.NO_THRESHOLD) + if (!hasThreshold) { slider.setEnabled(false); thresholdValue.setEnabled(false); thresholdValue.setText(""); thresholdIsMin.setEnabled(false); } - else if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD - && threshline == null) + else if (threshline == null) { // todo visual indication of feature threshold - threshline = new jalview.datamodel.GraphLine((max - min) / 2f, - "Threshold", Color.black); + threshline = new GraphLine((max - min) / 2f, "Threshold", Color.black); } - if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) + if (hasThreshold) { adjusting = true; - acg.setThresh(threshline.value); + acg.setThreshold(threshline.value); float range = (max - min) * scaleFactor; @@ -453,18 +447,18 @@ public class FeatureColourChooser extends JalviewDialog adjusting = false; } - acg.setThreshType(aboveThreshold); - if (thresholdIsMin.isSelected() - && aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) + acg.setAboveThreshold(aboveThreshold); + acg.setBelowThreshold(belowThreshold); + if (thresholdIsMin.isSelected() && hasThreshold) { acg.setAutoScaled(false); - if (aboveThreshold == AnnotationColourGradient.ABOVE_THRESHOLD) + if (aboveThreshold) { - acg = new GraduatedColor(acg, threshline.value, max); + acg = new FeatureColour((FeatureColour) acg, threshline.value, max); } else { - acg = new GraduatedColor(acg, min, threshline.value); + acg = new FeatureColour((FeatureColour) acg, min, threshline.value); } } else @@ -554,7 +548,7 @@ public class FeatureColourChooser extends JalviewDialog public void valueChanged() { threshline.value = slider.getValue() / scaleFactor; - cs.setThresh(threshline.value); + cs.setThreshold(threshline.value); changeColour(); ap.paintAlignment(false); } diff --git a/src/jalview/gui/FeatureRenderer.java b/src/jalview/gui/FeatureRenderer.java index 1cf15ac..1bf7453 100644 --- a/src/jalview/gui/FeatureRenderer.java +++ b/src/jalview/gui/FeatureRenderer.java @@ -20,10 +20,12 @@ */ package jalview.gui; +import jalview.api.FeatureColourI; import jalview.datamodel.SearchResults; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; -import jalview.schemes.GraduatedColor; +import jalview.schemes.FeatureColour; +import jalview.schemes.UserColourScheme; import jalview.util.MessageManager; import java.awt.BorderLayout; @@ -94,7 +96,7 @@ public class FeatureRenderer extends static String lastDescriptionAdded; - Object oldcol, fcol; + FeatureColourI oldcol, fcol; int featureIndex = 0; @@ -126,20 +128,19 @@ public class FeatureRenderer extends @Override public void mousePressed(MouseEvent evt) { - if (fcol instanceof Color) + if (fcol.isSimpleColour()) { Color col = JColorChooser.showDialog(Desktop.desktop, MessageManager.getString("label.select_feature_colour"), - ((Color) fcol)); + fcol.getColour()); if (col != null) { - fcol = col; - updateColourButton(bigPanel, colour, col); + fcol = new FeatureColour(col); + updateColourButton(bigPanel, colour, new FeatureColour(col)); } } else { - if (fcc == null) { final String type = features[featureIndex].getType(); @@ -206,11 +207,11 @@ public class FeatureRenderer extends ap.getSeqPanel().seqCanvas.highlightSearchResults(highlight); } - Object col = getFeatureStyle(name.getText()); + FeatureColourI col = getFeatureStyle(name.getText()); if (col == null) { - col = new jalview.schemes.UserColourScheme() - .createColourFromName(name.getText()); + col = new FeatureColour(UserColourScheme + .createColourFromName(name.getText())); } oldcol = fcol = col; updateColourButton(bigPanel, colour, col); @@ -421,26 +422,25 @@ public class FeatureRenderer extends * * @param bigPanel * @param col - * @param col2 + * @param col */ protected void updateColourButton(JPanel bigPanel, JLabel colour, - Object col2) + FeatureColourI col) { colour.removeAll(); colour.setIcon(null); colour.setToolTipText(null); colour.setText(""); - if (col2 instanceof Color) + if (col.isSimpleColour()) { - colour.setBackground((Color) col2); + colour.setBackground(col.getColour()); } else { colour.setBackground(bigPanel.getBackground()); colour.setForeground(Color.black); - FeatureSettings.renderGraduatedColor(colour, (GraduatedColor) col2); - // colour.setForeground(colour.getBackground()); + FeatureSettings.renderGraduatedColor(colour, col); } } diff --git a/src/jalview/gui/FeatureSettings.java b/src/jalview/gui/FeatureSettings.java index 6633156..bfc14b5 100644 --- a/src/jalview/gui/FeatureSettings.java +++ b/src/jalview/gui/FeatureSettings.java @@ -20,15 +20,19 @@ */ package jalview.gui; +import jalview.api.FeatureColourI; import jalview.api.FeatureSettingsControllerI; import jalview.bin.Cache; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.gui.Help.HelpId; import jalview.io.JalviewFileChooser; -import jalview.schemes.AnnotationColourGradient; -import jalview.schemes.GraduatedColor; +import jalview.schemabinding.version2.JalviewUserColours; +import jalview.schemes.FeatureColour; +import jalview.util.Format; import jalview.util.MessageManager; +import jalview.util.Platform; +import jalview.util.QuickSort; import jalview.viewmodel.AlignmentViewport; import jalview.ws.dbsources.das.api.jalviewSourceI; @@ -160,8 +164,8 @@ public class FeatureSettings extends JPanel implements table.setDefaultEditor(Color.class, new ColorEditor(this)); - table.setDefaultEditor(GraduatedColor.class, new ColorEditor(this)); - table.setDefaultRenderer(GraduatedColor.class, new ColorRenderer()); + table.setDefaultEditor(FeatureColour.class, new ColorEditor(this)); + table.setDefaultRenderer(FeatureColour.class, new ColorRenderer()); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.addMouseListener(new MouseAdapter() @@ -170,7 +174,7 @@ public class FeatureSettings extends JPanel implements public void mousePressed(MouseEvent evt) { selectedRow = table.rowAtPoint(evt.getPoint()); - if (evt.isPopupTrigger()) + if (SwingUtilities.isRightMouseButton(evt)) { popupSort(selectedRow, (String) table.getValueAt(selectedRow, 0), table.getValueAt(selectedRow, 1), fr.getMinMax(), @@ -251,7 +255,7 @@ public class FeatureSettings extends JPanel implements frame = new JInternalFrame(); frame.setContentPane(this); - if (new jalview.util.Platform().isAMac()) + if (Platform.isAMac()) { Desktop.addInternalFrame(frame, MessageManager.getString("label.sequence_feature_settings"), @@ -281,6 +285,8 @@ public class FeatureSettings extends JPanel implements final Object typeCol, final Map minmax, int x, int y) { + final FeatureColourI featureColour = (FeatureColourI) typeCol; + JPopupMenu men = new JPopupMenu(MessageManager.formatMessage( "label.settings_for_param", new String[] { type })); JMenuItem scr = new JMenuItem( @@ -336,7 +342,7 @@ public class FeatureSettings extends JPanel implements // positional features final JCheckBoxMenuItem mxcol = new JCheckBoxMenuItem( "Graduated Colour"); - mxcol.setSelected(!(typeCol instanceof Color)); + mxcol.setSelected(!featureColour.isSimpleColour()); men.add(mxcol); mxcol.addActionListener(new ActionListener() { @@ -347,7 +353,7 @@ public class FeatureSettings extends JPanel implements { if (e.getSource() == mxcol) { - if (typeCol instanceof Color) + if (featureColour.isSimpleColour()) { FeatureColourChooser fc = new FeatureColourChooser(me.fr, type); @@ -361,8 +367,7 @@ public class FeatureSettings extends JPanel implements "Select new Colour", true, // modal colorChooser, this, // OK button handler null); // no CANCEL button handler - colorChooser.setColor(((GraduatedColor) typeCol) - .getMaxColor()); + colorChooser.setColor(featureColour.getMaxColour()); dialog.setVisible(true); } } @@ -394,7 +399,6 @@ public class FeatureSettings extends JPanel implements MessageManager.getString("label.select_columns_containing")); selCols.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent arg0) { @@ -406,7 +410,6 @@ public class FeatureSettings extends JPanel implements MessageManager.getString("label.select_columns_not_containing")); clearCols.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent arg0) { @@ -414,8 +417,30 @@ public class FeatureSettings extends JPanel implements false, type); } }); + JMenuItem hideCols = new JMenuItem( + MessageManager.getString("label.hide_columns_containing")); + hideCols.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent arg0) + { + fr.ap.alignFrame.hideFeatureColumns(type, true); + } + }); + JMenuItem hideOtherCols = new JMenuItem( + MessageManager.getString("label.hide_columns_not_containing")); + hideOtherCols.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent arg0) + { + fr.ap.alignFrame.hideFeatureColumns(type, false); + } + }); men.add(selCols); men.add(clearCols); + men.add(hideCols); + men.add(hideOtherCols); men.show(table, x, y); } @@ -427,13 +452,13 @@ public class FeatureSettings extends JPanel implements /** * contains a float[3] for each feature type string. created by setTableData */ - Hashtable typeWidth = null; + Map typeWidth = null; @Override synchronized public void discoverAllFeatureData() { - Vector allFeatures = new Vector(); - Vector allGroups = new Vector(); + Vector allFeatures = new Vector(); + Vector allGroups = new Vector(); SequenceFeature[] tmpfeatures; String group; for (int i = 0; i < af.getViewport().getAlignment().getHeight(); i++) @@ -539,13 +564,13 @@ public class FeatureSettings extends JPanel implements return; } resettingTable = true; - typeWidth = new Hashtable(); + typeWidth = new Hashtable(); // TODO: change avWidth calculation to 'per-sequence' average and use long // rather than float float[] avWidth = null; SequenceFeature[] tmpfeatures; String group = null, type; - Vector visibleChecks = new Vector(); + Vector visibleChecks = new Vector(); // Find out which features should be visible depending on which groups // are selected / deselected @@ -586,7 +611,7 @@ public class FeatureSettings extends JPanel implements } else { - avWidth = (float[]) typeWidth.get(tmpfeatures[index].getType()); + avWidth = typeWidth.get(tmpfeatures[index].getType()); } avWidth[0]++; if (tmpfeatures[index].getBegin() > tmpfeatures[index].getEnd()) @@ -731,8 +756,7 @@ public class FeatureSettings extends JPanel implements InputStreamReader in = new InputStreamReader(new FileInputStream( file), "UTF-8"); - jalview.schemabinding.version2.JalviewUserColours jucs = new jalview.schemabinding.version2.JalviewUserColours(); - jucs = jucs.unmarshal(in); + JalviewUserColours jucs = JalviewUserColours.unmarshal(in); for (int i = jucs.getColourCount() - 1; i >= 0; i--) { @@ -751,7 +775,7 @@ public class FeatureSettings extends JPanel implements Cache.log.warn("Couldn't parse out graduated feature color.", e); } - GraduatedColor gcol = new GraduatedColor(mincol, maxcol, + FeatureColourI gcol = new FeatureColour(mincol, maxcol, newcol.getMin(), newcol.getMax()); if (newcol.hasAutoScale()) { @@ -763,31 +787,28 @@ public class FeatureSettings extends JPanel implements } if (newcol.hasThreshold()) { - gcol.setThresh(newcol.getThreshold()); - gcol.setThreshType(AnnotationColourGradient.NO_THRESHOLD); // default + gcol.setThreshold(newcol.getThreshold()); } if (newcol.getThreshType().length() > 0) { String ttyp = newcol.getThreshType(); - if (ttyp.equalsIgnoreCase("NONE")) - { - gcol.setThreshType(AnnotationColourGradient.NO_THRESHOLD); - } if (ttyp.equalsIgnoreCase("ABOVE")) { - gcol.setThreshType(AnnotationColourGradient.ABOVE_THRESHOLD); + gcol.setAboveThreshold(true); } if (ttyp.equalsIgnoreCase("BELOW")) { - gcol.setThreshType(AnnotationColourGradient.BELOW_THRESHOLD); + gcol.setBelowThreshold(true); } } fr.setColour(name = newcol.getName(), gcol); } else { - fr.setColour(name = jucs.getColour(i).getName(), new Color( - Integer.parseInt(jucs.getColour(i).getRGB(), 16))); + Color color = new Color( + Integer.parseInt(jucs.getColour(i).getRGB(), 16)); + fr.setColour(name = jucs.getColour(i).getName(), + new FeatureColour(color)); } fr.setOrder(name, (i == 0) ? 0 : i / jucs.getColourCount()); } @@ -810,7 +831,7 @@ public class FeatureSettings extends JPanel implements void save() { JalviewFileChooser chooser = new JalviewFileChooser( - jalview.bin.Cache.getProperty("LAST_DIRECTORY"), + Cache.getProperty("LAST_DIRECTORY"), new String[] { "fc" }, new String[] { "Sequence Feature Colours" }, "Sequence Feature Colours"); @@ -831,50 +852,40 @@ public class FeatureSettings extends JPanel implements PrintWriter out = new PrintWriter(new OutputStreamWriter( new FileOutputStream(choice), "UTF-8")); - Set fr_colours = fr.getAllFeatureColours(); - Iterator e = fr_colours.iterator(); + Set fr_colours = fr.getAllFeatureColours(); + Iterator e = fr_colours.iterator(); float[] sortOrder = new float[fr_colours.size()]; String[] sortTypes = new String[fr_colours.size()]; int i = 0; while (e.hasNext()) { - sortTypes[i] = e.next().toString(); + sortTypes[i] = e.next(); sortOrder[i] = fr.getOrder(sortTypes[i]); i++; } - jalview.util.QuickSort.sort(sortOrder, sortTypes); + QuickSort.sort(sortOrder, sortTypes); sortOrder = null; - Object fcol; - GraduatedColor gcol; for (i = 0; i < sortTypes.length; i++) { jalview.schemabinding.version2.Colour col = new jalview.schemabinding.version2.Colour(); col.setName(sortTypes[i]); - col.setRGB(jalview.util.Format.getHexString(fr.getColour(col - .getName()))); - fcol = fr.getFeatureStyle(sortTypes[i]); - if (fcol instanceof GraduatedColor) + FeatureColourI fcol = fr.getFeatureStyle(sortTypes[i]); + if (fcol.isSimpleColour()) { - gcol = (GraduatedColor) fcol; - col.setMin(gcol.getMin()); - col.setMax(gcol.getMax()); - col.setMinRGB(jalview.util.Format.getHexString(gcol - .getMinColor())); - col.setAutoScale(gcol.isAutoScale()); - col.setThreshold(gcol.getThresh()); - col.setColourByLabel(gcol.isColourByLabel()); - switch (gcol.getThreshType()) - { - case AnnotationColourGradient.NO_THRESHOLD: - col.setThreshType("NONE"); - break; - case AnnotationColourGradient.ABOVE_THRESHOLD: - col.setThreshType("ABOVE"); - break; - case AnnotationColourGradient.BELOW_THRESHOLD: - col.setThreshType("BELOW"); - break; - } + col.setRGB(Format.getHexString(fcol.getColour())); + } + else + { + col.setRGB(Format.getHexString(fcol.getMaxColour())); + col.setMin(fcol.getMin()); + col.setMax(fcol.getMax()); + col.setMinRGB(jalview.util.Format.getHexString(fcol + .getMinColour())); + col.setAutoScale(fcol.isAutoScaled()); + col.setThreshold(fcol.getThreshold()); + col.setColourByLabel(fcol.isColourByLabel()); + col.setThreshType(fcol.isAboveThreshold() ? "ABOVE" : (fcol + .isBelowThreshold() ? "BELOW" : "NONE")); } ucs.addColour(col); } @@ -910,7 +921,7 @@ public class FeatureSettings extends JPanel implements int num = 0; for (int i = 0; i < data.length; i++) { - awidth = (float[]) typeWidth.get(data[i][0]); + awidth = typeWidth.get(data[i][0]); if (awidth[0] > 0) { width[i] = awidth[1] / awidth[0];// *awidth[0]*awidth[2]; - better @@ -1233,7 +1244,8 @@ public class FeatureSettings extends JPanel implements fetchDAS.setEnabled(false); cancelDAS.setEnabled(true); dassourceBrowser.setGuiEnabled(false); - Vector selectedSources = dassourceBrowser.getSelectedSources(); + Vector selectedSources = dassourceBrowser + .getSelectedSources(); doDasFeatureFetch(selectedSources, true, true); } @@ -1292,7 +1304,7 @@ public class FeatureSettings extends JPanel implements * Vector of Strings to resolve to DAS source nicknames. * @return sources that are present in source list. */ - public List resolveSourceNicknames(Vector sources) + public List resolveSourceNicknames(Vector sources) { return dassourceBrowser.sourceRegistry.resolveSourceNicknames(sources); } @@ -1303,7 +1315,7 @@ public class FeatureSettings extends JPanel implements * * @return vector of selected das source nicknames */ - public Vector getSelectedSources() + public Vector getSelectedSources() { return dassourceBrowser.getSelectedSources(); } @@ -1317,7 +1329,7 @@ public class FeatureSettings extends JPanel implements * if true then runs in same thread, otherwise passes to the Swing * executor */ - public void fetchDasFeatures(Vector sources, boolean block) + public void fetchDasFeatures(Vector sources, boolean block) { initDasSources(); List resolved = dassourceBrowser.sourceRegistry @@ -1483,10 +1495,11 @@ public class FeatureSettings extends JPanel implements } @Override - public Component getTableCellRendererComponent(JTable table, + public Component getTableCellRendererComponent(JTable tbl, Object color, boolean isSelected, boolean hasFocus, int row, int column) { + FeatureColourI cellColour = (FeatureColourI) color; // JLabel comp = new JLabel(); // comp. setOpaque(true); @@ -1494,11 +1507,11 @@ public class FeatureSettings extends JPanel implements // setBounds(getBounds()); Color newColor; setToolTipText(baseTT); - setBackground(table.getBackground()); - if (color instanceof GraduatedColor) + setBackground(tbl.getBackground()); + if (!cellColour.isSimpleColour()) { - Rectangle cr = table.getCellRect(row, column, false); - FeatureSettings.renderGraduatedColor(this, (GraduatedColor) color, + Rectangle cr = tbl.getCellRect(row, column, false); + FeatureSettings.renderGraduatedColor(this, cellColour, (int) cr.getWidth(), (int) cr.getHeight()); } @@ -1506,20 +1519,16 @@ public class FeatureSettings extends JPanel implements { this.setText(""); this.setIcon(null); - newColor = (Color) color; - // comp. + newColor = cellColour.getColour(); setBackground(newColor); - // comp.setToolTipText("RGB value: " + newColor.getRed() + ", " - // + newColor.getGreen() + ", " + newColor.getBlue()); } if (isSelected) { if (selectedBorder == null) { selectedBorder = BorderFactory.createMatteBorder(2, 5, 2, 5, - table.getSelectionBackground()); + tbl.getSelectionBackground()); } - // comp. setBorder(selectedBorder); } else @@ -1527,9 +1536,8 @@ public class FeatureSettings extends JPanel implements if (unselectedBorder == null) { unselectedBorder = BorderFactory.createMatteBorder(2, 5, 2, 5, - table.getBackground()); + tbl.getBackground()); } - // comp. setBorder(unselectedBorder); } @@ -1543,7 +1551,7 @@ public class FeatureSettings extends JPanel implements * @param comp * @param gcol */ - public static void renderGraduatedColor(JLabel comp, GraduatedColor gcol) + public static void renderGraduatedColor(JLabel comp, FeatureColourI gcol) { int w = comp.getWidth(), h = comp.getHeight(); if (w < 20) @@ -1559,23 +1567,23 @@ public class FeatureSettings extends JPanel implements renderGraduatedColor(comp, gcol, w, h); } - public static void renderGraduatedColor(JLabel comp, GraduatedColor gcol, + public static void renderGraduatedColor(JLabel comp, FeatureColourI gcol, int w, int h) { boolean thr = false; String tt = ""; String tx = ""; - if (gcol.getThreshType() == AnnotationColourGradient.ABOVE_THRESHOLD) + if (gcol.isAboveThreshold()) { thr = true; tx += ">"; - tt += "Thresholded (Above " + gcol.getThresh() + ") "; + tt += "Thresholded (Above " + gcol.getThreshold() + ") "; } - if (gcol.getThreshType() == AnnotationColourGradient.BELOW_THRESHOLD) + if (gcol.isBelowThreshold()) { thr = true; tx += "<"; - tt += "Thresholded (Below " + gcol.getThresh() + ") "; + tt += "Thresholded (Below " + gcol.getThreshold() + ") "; } if (gcol.isColourByLabel()) { @@ -1589,7 +1597,7 @@ public class FeatureSettings extends JPanel implements } else { - Color newColor = gcol.getMaxColor(); + Color newColor = gcol.getMaxColour(); comp.setBackground(newColor); // System.err.println("Width is " + w / 2); Icon ficon = new FeatureIcon(gcol, comp.getBackground(), w, h, thr); @@ -1617,7 +1625,7 @@ public class FeatureSettings extends JPanel implements class FeatureIcon implements Icon { - GraduatedColor gcol; + FeatureColourI gcol; Color backg; @@ -1629,7 +1637,7 @@ class FeatureIcon implements Icon Color mpcolour = Color.white; - FeatureIcon(GraduatedColor gfc, Color bg, int w, int h, boolean mspace) + FeatureIcon(FeatureColourI gfc, Color bg, int w, int h, boolean mspace) { gcol = gfc; backg = bg; @@ -1669,7 +1677,7 @@ class FeatureIcon implements Icon g.setColor(backg); g.fillRect(0, 0, width, height); // need an icon here. - g.setColor(gcol.getMaxColor()); + g.setColor(gcol.getMaxColour()); g.setFont(new Font("Verdana", Font.PLAIN, 9)); @@ -1683,7 +1691,7 @@ class FeatureIcon implements Icon } else { - Color minCol = gcol.getMinColor(); + Color minCol = gcol.getMinColour(); g.setColor(minCol); g.fillRect(0, 0, s1, height); if (midspace) @@ -1691,7 +1699,7 @@ class FeatureIcon implements Icon g.setColor(Color.white); g.fillRect(s1, 0, e1 - s1, height); } - g.setColor(gcol.getMaxColor()); + g.setColor(gcol.getMaxColour()); g.fillRect(0, e1, width - e1, height); } } @@ -1702,14 +1710,12 @@ class ColorEditor extends AbstractCellEditor implements TableCellEditor, { FeatureSettings me; - GraduatedColor currentGColor; + FeatureColourI currentColor; FeatureColourChooser chooser; String type; - Color currentColor; - JButton button; JColorChooser colorChooser; @@ -1749,11 +1755,11 @@ class ColorEditor extends AbstractCellEditor implements TableCellEditor, { // The user has clicked the cell, so // bring up the dialog. - if (currentColor != null) + if (currentColor.isSimpleColour()) { // bring up simple color chooser - button.setBackground(currentColor); - colorChooser.setColor(currentColor); + button.setBackground(currentColor.getColour()); + colorChooser.setColor(currentColor.getColour()); dialog.setVisible(true); } else @@ -1770,15 +1776,13 @@ class ColorEditor extends AbstractCellEditor implements TableCellEditor, } else { // User pressed dialog's "OK" button. - if (currentColor != null) + if (currentColor.isSimpleColour()) { - currentColor = colorChooser.getColor(); + currentColor = new FeatureColour(colorChooser.getColor()); } else { - // class cast exceptions may be raised if the chooser created on a - // non-graduated color - currentGColor = (GraduatedColor) chooser.getLastColour(); + currentColor = chooser.getLastColour(); } me.table.setValueAt(getCellEditorValue(), selectedRow, 1); fireEditingStopped(); @@ -1790,10 +1794,6 @@ class ColorEditor extends AbstractCellEditor implements TableCellEditor, @Override public Object getCellEditorValue() { - if (currentColor == null) - { - return currentGColor; - } return currentColor; } @@ -1802,18 +1802,16 @@ class ColorEditor extends AbstractCellEditor implements TableCellEditor, public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { - currentGColor = null; - currentColor = null; + currentColor = (FeatureColourI) value; this.selectedRow = row; type = me.table.getValueAt(row, 0).toString(); button.setOpaque(true); button.setBackground(me.getBackground()); - if (value instanceof GraduatedColor) + if (!currentColor.isSimpleColour()) { - currentGColor = (GraduatedColor) value; JLabel btn = new JLabel(); btn.setSize(button.getSize()); - FeatureSettings.renderGraduatedColor(btn, currentGColor); + FeatureSettings.renderGraduatedColor(btn, currentColor); button.setBackground(btn.getBackground()); button.setIcon(btn.getIcon()); button.setText(btn.getText()); @@ -1822,8 +1820,7 @@ class ColorEditor extends AbstractCellEditor implements TableCellEditor, { button.setText(""); button.setIcon(null); - currentColor = (Color) value; - button.setBackground(currentColor); + button.setBackground(currentColor.getColour()); } return button; } diff --git a/src/jalview/gui/IdPanel.java b/src/jalview/gui/IdPanel.java index c84505b..61ddafb 100755 --- a/src/jalview/gui/IdPanel.java +++ b/src/jalview/gui/IdPanel.java @@ -349,10 +349,9 @@ public class IdPanel extends JPanel implements MouseListener, return; } - if ((av.getSelectionGroup() == null) - || ((!e.isControlDown() && !e.isShiftDown()) && av - .getSelectionGroup() != null)) + || (!jalview.util.Platform.isControlDown(e) + && !e.isShiftDown() && av.getSelectionGroup() != null)) { av.setSelectionGroup(new SequenceGroup()); av.getSelectionGroup().setStartRes(0); diff --git a/src/jalview/gui/JDatabaseTree.java b/src/jalview/gui/JDatabaseTree.java index 6f602ad..8294d2b 100644 --- a/src/jalview/gui/JDatabaseTree.java +++ b/src/jalview/gui/JDatabaseTree.java @@ -26,7 +26,6 @@ import jalview.ws.seqfetcher.DbSourceProxy; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; @@ -73,7 +72,7 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener @Override public void actionPerformed(ActionEvent arg0) { - showDialog(null); + showDialog(); } }); return viewdbs; @@ -188,6 +187,7 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener jc.validate(); // j.setPreferredSize(new Dimension(300,50)); add(jc, BorderLayout.CENTER); + ok.setEnabled(false); j.add(ok); j.add(cancel); add(j, BorderLayout.SOUTH); @@ -320,7 +320,7 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener closeDialog(); } - private void showDialog(Container parent) + void showDialog() { oldselection = selection; oldtsel = tsel; @@ -349,10 +349,12 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener { return; } + ok.setEnabled(false); if (dbviews.getSelectionCount() == 0) { selection = null; } + tsel = dbviews.getSelectionPaths(); boolean forcedFirstChild = false; List srcs = new ArrayList(); @@ -364,6 +366,10 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener .getLastPathComponent(); if (dmt.getUserObject() != null) { + /* + * enable OK button once a selection has been made + */ + ok.setEnabled(true); if (dmt.getUserObject() instanceof DbSourceProxy) { srcs.add((DbSourceProxy) dmt.getUserObject()); @@ -419,6 +425,7 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener } } + dbstatex.setText(" "); if (allowMultiSelections) { dbstatus.setText(MessageManager.formatMessage( @@ -427,7 +434,6 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener (srcs.size() == 1 ? "" : "s"), (srcs.size() > 0 ? " with " + x + " test quer" + (x == 1 ? "y" : "ies") : ".") })); - dbstatex.setText(" "); } else { @@ -440,10 +446,6 @@ public class JDatabaseTree extends JalviewDialog implements KeyListener dbstatex.setText(MessageManager.formatMessage( "label.example_param", new String[] { qr })); } - else - { - dbstatex.setText(" "); - } } else { diff --git a/src/jalview/gui/Jalview2XML.java b/src/jalview/gui/Jalview2XML.java index 2799a7e..ac85aad 100644 --- a/src/jalview/gui/Jalview2XML.java +++ b/src/jalview/gui/Jalview2XML.java @@ -20,6 +20,7 @@ */ package jalview.gui; +import jalview.api.FeatureColourI; import jalview.api.ViewStyleI; import jalview.api.structures.JalviewStructureDisplayI; import jalview.bin.Cache; @@ -71,7 +72,7 @@ import jalview.schemabinding.version2.Viewport; import jalview.schemes.AnnotationColourGradient; import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemeProperty; -import jalview.schemes.GraduatedColor; +import jalview.schemes.FeatureColour; import jalview.schemes.ResidueColourScheme; import jalview.schemes.ResidueProperties; import jalview.schemes.UserColourScheme; @@ -79,6 +80,7 @@ import jalview.structure.StructureSelectionManager; import jalview.structures.models.AAStructureBindingModel; import jalview.util.MessageManager; import jalview.util.Platform; +import jalview.util.StringUtils; import jalview.util.jarInputStreamProvider; import jalview.viewmodel.AlignmentViewport; import jalview.viewmodel.seqfeatures.FeatureRendererSettings; @@ -90,6 +92,7 @@ import jalview.ws.params.ArgumentI; import jalview.ws.params.AutoCalcSetting; import jalview.ws.params.WsParamSetI; +import java.awt.Color; import java.awt.Rectangle; import java.io.BufferedReader; import java.io.DataInputStream; @@ -116,7 +119,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.StringTokenizer; import java.util.Vector; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; @@ -633,11 +635,15 @@ public class Jalview2XML object.setVersion(jalview.bin.Cache.getDefault("VERSION", "Development Build")); - jalview.datamodel.AlignmentI jal = av.getAlignment(); + /** + * rjal is full height alignment, jal is actual alignment with full metadata + * but excludes hidden sequences. + */ + jalview.datamodel.AlignmentI rjal = av.getAlignment(), jal = rjal; if (av.hasHiddenRows()) { - jal = jal.getHiddenSequences().getFullAlignment(); + rjal = jal.getHiddenSequences().getFullAlignment(); } SequenceSet vamsasSet = new SequenceSet(); @@ -654,6 +660,7 @@ public class Jalview2XML { // switch jal and the dataset jal = jal.getDataset(); + rjal = jal; } } if (jal.getProperties() != null) @@ -673,9 +680,8 @@ public class Jalview2XML Set calcIdSet = new HashSet(); // SAVE SEQUENCES - for (int i = 0; i < jal.getHeight(); i++) + for (final SequenceI jds : rjal.getSequences()) { - final SequenceI jds = jal.getSequenceAt(i); final SequenceI jdatasq = jds.getDatasetSequence() == null ? jds : jds.getDatasetSequence(); String id = seqHash(jds); @@ -714,26 +720,34 @@ public class Jalview2XML // Store any sequences this sequence represents if (av.hasHiddenRows()) { + // use rjal, contains the full height alignment jseq.setHidden(av.getAlignment().getHiddenSequences() .isHidden(jds)); - if (av.isHiddenRepSequence(jal.getSequenceAt(i))) + if (av.isHiddenRepSequence(jds)) { jalview.datamodel.SequenceI[] reps = av - .getRepresentedSequences(jal.getSequenceAt(i)) - .getSequencesInOrder(jal); + .getRepresentedSequences(jds) + .getSequencesInOrder(rjal); for (int h = 0; h < reps.length; h++) { - if (reps[h] != jal.getSequenceAt(i)) + if (reps[h] != jds) { - jseq.addHiddenSequences(jal.findIndex(reps[h])); + jseq.addHiddenSequences(rjal.findIndex(reps[h])); } } } } + // mark sequence as reference - if it is the reference for this view + if (jal.hasSeqrep()) + { + jseq.setViewreference(jds == jal.getSeqrep()); + } } + // TODO: omit sequence features from each alignment view's XML dump if we + // are storing dataset if (jds.getSequenceFeatures() != null) { jalview.datamodel.SequenceFeature[] sf = jds.getSequenceFeatures(); @@ -899,7 +913,7 @@ public class Jalview2XML alc.addAlcodMap(alcmap); } } - + // TODO: delete this ? dead code from 2.8.3->2.9 ? // { // AlcodonFrame alc = new AlcodonFrame(); // vamsasSet.addAlcodonFrame(alc); @@ -1194,82 +1208,55 @@ public class Jalview2XML .getFeatureRenderer().getRenderOrder() .toArray(new String[0]); - Vector settingsAdded = new Vector(); - Object gstyle = null; - GraduatedColor gcol = null; + Vector settingsAdded = new Vector(); if (renderOrder != null) { - for (int ro = 0; ro < renderOrder.length; ro++) + for (String featureType : renderOrder) { - gstyle = ap.getSeqPanel().seqCanvas.getFeatureRenderer() - .getFeatureStyle(renderOrder[ro]); + FeatureColourI fcol = ap.getSeqPanel().seqCanvas + .getFeatureRenderer() + .getFeatureStyle(featureType); Setting setting = new Setting(); - setting.setType(renderOrder[ro]); - if (gstyle instanceof GraduatedColor) + setting.setType(featureType); + if (!fcol.isSimpleColour()) { - gcol = (GraduatedColor) gstyle; - setting.setColour(gcol.getMaxColor().getRGB()); - setting.setMincolour(gcol.getMinColor().getRGB()); - setting.setMin(gcol.getMin()); - setting.setMax(gcol.getMax()); - setting.setColourByLabel(gcol.isColourByLabel()); - setting.setAutoScale(gcol.isAutoScale()); - setting.setThreshold(gcol.getThresh()); - setting.setThreshstate(gcol.getThreshType()); + setting.setColour(fcol.getMaxColour().getRGB()); + setting.setMincolour(fcol.getMinColour().getRGB()); + setting.setMin(fcol.getMin()); + setting.setMax(fcol.getMax()); + setting.setColourByLabel(fcol.isColourByLabel()); + setting.setAutoScale(fcol.isAutoScaled()); + setting.setThreshold(fcol.getThreshold()); + // -1 = No threshold, 0 = Below, 1 = Above + setting.setThreshstate(fcol.isAboveThreshold() ? 1 + : (fcol.isBelowThreshold() ? 0 : -1)); } else { - setting.setColour(ap.getSeqPanel().seqCanvas - .getFeatureRenderer().getColour(renderOrder[ro]) - .getRGB()); + setting.setColour(fcol.getColour().getRGB()); } setting.setDisplay(av.getFeaturesDisplayed().isVisible( - renderOrder[ro])); + featureType)); float rorder = ap.getSeqPanel().seqCanvas.getFeatureRenderer() - .getOrder(renderOrder[ro]); + .getOrder(featureType); if (rorder > -1) { setting.setOrder(rorder); } fs.addSetting(setting); - settingsAdded.addElement(renderOrder[ro]); + settingsAdded.addElement(featureType); } } - // Make sure we save none displayed feature settings - Iterator en = ap.getSeqPanel().seqCanvas.getFeatureRenderer() - .getFeatureColours().keySet().iterator(); - while (en.hasNext()) - { - String key = en.next().toString(); - if (settingsAdded.contains(key)) - { - continue; - } - - Setting setting = new Setting(); - setting.setType(key); - setting.setColour(ap.getSeqPanel().seqCanvas.getFeatureRenderer() - .getColour(key).getRGB()); - - setting.setDisplay(false); - float rorder = ap.getSeqPanel().seqCanvas.getFeatureRenderer() - .getOrder(key); - if (rorder > -1) - { - setting.setOrder(rorder); - } - fs.addSetting(setting); - settingsAdded.addElement(key); - } // is groups actually supposed to be a map here ? - en = ap.getSeqPanel().seqCanvas.getFeatureRenderer() + Iterator en = ap.getSeqPanel().seqCanvas + .getFeatureRenderer() .getFeatureGroups().iterator(); - Vector groupsAdded = new Vector(); + Vector groupsAdded = new Vector(); while (en.hasNext()) { - String grp = en.next().toString(); + String grp = en.next(); if (groupsAdded.contains(grp)) { continue; @@ -1283,7 +1270,6 @@ public class Jalview2XML groupsAdded.addElement(grp); } jms.setFeatureSettings(fs); - } if (av.hasHiddenColumns()) @@ -2680,7 +2666,7 @@ public class Jalview2XML List tmpseqs = new ArrayList(); boolean multipleView = false; - + SequenceI referenceseqForView = null; JSeq[] jseqs = object.getJalviewModelSequence().getJSeq(); int vi = 0; // counter in vamsasSeq array for (int i = 0; i < jseqs.length; i++) @@ -2705,6 +2691,11 @@ public class Jalview2XML vi++; } + if (jseqs[i].hasViewreference() && jseqs[i].getViewreference()) + { + referenceseqForView = tmpseqs.get(tmpseqs.size() - 1); + } + if (jseqs[i].getHidden()) { if (hiddenSeqs == null) @@ -2714,7 +2705,6 @@ public class Jalview2XML hiddenSeqs.add(seqRefIds.get(seqId)); } - } // / @@ -2723,8 +2713,12 @@ public class Jalview2XML SequenceI[] orderedSeqs = tmpseqs .toArray(new SequenceI[tmpseqs.size()]); - Alignment al = new Alignment(orderedSeqs); + AlignmentI al = new Alignment(orderedSeqs); + if (referenceseqForView != null) + { + al.setSeqrep(referenceseqForView); + } // / Add the alignment properties for (int i = 0; i < vamsasSet.getSequenceSetPropertiesCount(); i++) { @@ -4047,18 +4041,22 @@ public class Jalview2XML } /** + * Answers true if 'version' is equal to or later than 'supported', where each + * is formatted as major/minor versions like "2.8.3" or "2.3.4b1" for bugfix + * changes. Development and test values for 'version' are leniently treated + * i.e. answer true. * * @param supported * - minimum version we are comparing against * @param version - * - version of data being processsed. - * @return true if version is development/null or evaluates to the same or - * later X.Y.Z (where X,Y,Z are like [0-9]+b?[0-9]*) + * - version of data being processsed + * @return */ public static boolean isVersionStringLaterThan(String supported, String version) { - if (version == null || version.equalsIgnoreCase("DEVELOPMENT BUILD") + if (supported == null || version == null + || version.equalsIgnoreCase("DEVELOPMENT BUILD") || version.equalsIgnoreCase("Test") || version.equalsIgnoreCase("AUTOMATED BUILD")) { @@ -4069,45 +4067,8 @@ public class Jalview2XML } else { - StringTokenizer currentV = new StringTokenizer(supported, "."), fileV = new StringTokenizer( - version, "."); - while (currentV.hasMoreTokens() && fileV.hasMoreTokens()) - { - // convert b to decimal to catch bugfix releases within a series - String curT = currentV.nextToken().toLowerCase().replace('b', '.'); - String fileT = fileV.nextToken().toLowerCase().replace('b', '.'); - try - { - float supportedVersionToken = Float.parseFloat(curT); - float myVersiontoken = Float.parseFloat(fileT); - if (supportedVersionToken > myVersiontoken) - { - // current version is newer than the version that wrote the file - return false; - } - if (supportedVersionToken < myVersiontoken) - { - // current version is older than the version that wrote the file - return true; - } - } catch (NumberFormatException nfe) - { - System.err - .println("** WARNING: Version comparison failed for tokens (" - + curT - + ") and (" - + fileT - + ")\n** Current: '" - + supported + "' and Version: '" + version + "'"); - } - } - if (currentV.hasMoreElements()) - { - // fileV has no minor version but identical series to current - return false; - } + return StringUtils.compareVersions(version, supported, "b") >= 0; } - return true; } Vector newStructureViewers = null; @@ -4135,7 +4096,7 @@ public class Jalview2XML } AlignFrame loadViewport(String file, JSeq[] JSEQ, - List hiddenSeqs, Alignment al, + List hiddenSeqs, AlignmentI al, JalviewModelSequence jms, Viewport view, String uniqueSeqSetId, String viewId, List autoAlan) { @@ -4151,6 +4112,12 @@ public class Jalview2XML .getSequenceAt(i), new java.awt.Color(JSEQ[i].getColour())); } + if (al.hasSeqrep()) + { + af.getViewport().setColourByReferenceSeq(true); + af.getViewport().setDisplayReferenceSeq(true); + } + af.viewport.setGatherViewsHere(view.getGatheredViews()); if (view.getSequenceSetId() != null) @@ -4177,25 +4144,25 @@ public class Jalview2XML { for (int s = 0; s < JSEQ.length; s++) { - jalview.datamodel.SequenceGroup hidden = new jalview.datamodel.SequenceGroup(); - + SequenceGroup hidden = new SequenceGroup(); + boolean isRepresentative = false; for (int r = 0; r < JSEQ[s].getHiddenSequencesCount(); r++) { - hidden.addSequence( - al.getSequenceAt(JSEQ[s].getHiddenSequences(r)), false); + isRepresentative = true; + SequenceI sequenceToHide = al.getSequenceAt(JSEQ[s] + .getHiddenSequences(r)); + hidden.addSequence(sequenceToHide, false); + // remove from hiddenSeqs list so we don't try to hide it twice + hiddenSeqs.remove(sequenceToHide); + } + if (isRepresentative) + { + SequenceI representativeSequence = al.getSequenceAt(s); + hidden.addSequence(representativeSequence, false); + af.viewport.hideRepSequences(representativeSequence, hidden); } - af.viewport.hideRepSequences(al.getSequenceAt(s), hidden); } - // jalview.datamodel.SequenceI[] hseqs = new - // jalview.datamodel.SequenceI[hiddenSeqs - // .size()]; - // - // for (int s = 0; s < hiddenSeqs.size(); s++) - // { - // hseqs[s] = (jalview.datamodel.SequenceI) hiddenSeqs.elementAt(s); - // } - SequenceI[] hseqs = hiddenSeqs.toArray(new SequenceI[hiddenSeqs .size()]); af.viewport.hideSequence(hseqs); @@ -4354,25 +4321,33 @@ public class Jalview2XML af.viewport.setFeaturesDisplayed(fdi = new FeaturesDisplayed()); String[] renderOrder = new String[jms.getFeatureSettings() .getSettingCount()]; - Hashtable featureGroups = new Hashtable(); - Hashtable featureColours = new Hashtable(); - Hashtable featureOrder = new Hashtable(); + Map featureColours = new Hashtable(); + Map featureOrder = new Hashtable(); for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++) { Setting setting = jms.getFeatureSettings().getSetting(fs); if (setting.hasMincolour()) { - GraduatedColor gc = setting.hasMin() ? new GraduatedColor( - new java.awt.Color(setting.getMincolour()), - new java.awt.Color(setting.getColour()), - setting.getMin(), setting.getMax()) : new GraduatedColor( - new java.awt.Color(setting.getMincolour()), - new java.awt.Color(setting.getColour()), 0, 1); + FeatureColourI gc = setting.hasMin() ? new FeatureColour( + new Color(setting.getMincolour()), new Color( + setting.getColour()), setting.getMin(), + setting.getMax()) : new FeatureColour(new Color( + setting.getMincolour()), new Color(setting.getColour()), + 0, 1); if (setting.hasThreshold()) { - gc.setThresh(setting.getThreshold()); - gc.setThreshType(setting.getThreshstate()); + gc.setThreshold(setting.getThreshold()); + int threshstate = setting.getThreshstate(); + // -1 = None, 0 = Below, 1 = Above threshold + if (threshstate == 0) + { + gc.setBelowThreshold(true); + } + else if (threshstate == 1) + { + gc.setAboveThreshold(true); + } } gc.setAutoScaled(true); // default if (setting.hasAutoScale()) @@ -4388,8 +4363,8 @@ public class Jalview2XML } else { - featureColours.put(setting.getType(), - new java.awt.Color(setting.getColour())); + featureColours.put(setting.getType(), new FeatureColour( + new Color(setting.getColour()))); } renderOrder[fs] = setting.getType(); if (setting.hasOrder()) @@ -4406,7 +4381,7 @@ public class Jalview2XML fdi.setVisible(setting.getType()); } } - Hashtable fgtable = new Hashtable(); + Map fgtable = new Hashtable(); for (int gs = 0; gs < jms.getFeatureSettings().getGroupCount(); gs++) { Group grp = jms.getFeatureSettings().getGroup(gs); @@ -4474,7 +4449,7 @@ public class Jalview2XML } private ColourSchemeI constructAnnotationColour( - AnnotationColours viewAnnColour, AlignFrame af, Alignment al, + AnnotationColours viewAnnColour, AlignFrame af, AlignmentI al, JalviewModelSequence jms, boolean checkGroupAnnColour) { boolean propagateAnnColour = false; @@ -4598,7 +4573,7 @@ public class Jalview2XML return cs; } - private void reorderAutoannotation(AlignFrame af, Alignment al, + private void reorderAutoannotation(AlignFrame af, AlignmentI al, List autoAlan) { // copy over visualization settings for autocalculated annotation in the @@ -4753,10 +4728,11 @@ public class Jalview2XML } } - private void recoverDatasetFor(SequenceSet vamsasSet, Alignment al, + private void recoverDatasetFor(SequenceSet vamsasSet, AlignmentI al, boolean ignoreUnrefed) { - jalview.datamodel.Alignment ds = getDatasetFor(vamsasSet.getDatasetId()); + jalview.datamodel.AlignmentI ds = getDatasetFor(vamsasSet + .getDatasetId()); Vector dseqs = null; if (ds == null) { @@ -4906,15 +4882,15 @@ public class Jalview2XML * TODO use AlignmentI here and in related methods - needs * AlignmentI.getDataset() changed to return AlignmentI instead of Alignment */ - Hashtable datasetIds = null; + Hashtable datasetIds = null; - IdentityHashMap dataset2Ids = null; + IdentityHashMap dataset2Ids = null; - private Alignment getDatasetFor(String datasetId) + private AlignmentI getDatasetFor(String datasetId) { if (datasetIds == null) { - datasetIds = new Hashtable(); + datasetIds = new Hashtable(); return null; } if (datasetIds.containsKey(datasetId)) @@ -4924,11 +4900,11 @@ public class Jalview2XML return null; } - private void addDatasetRef(String datasetId, Alignment dataset) + private void addDatasetRef(String datasetId, AlignmentI dataset) { if (datasetIds == null) { - datasetIds = new Hashtable(); + datasetIds = new Hashtable(); } datasetIds.put(datasetId, dataset); } @@ -4939,7 +4915,7 @@ public class Jalview2XML * @param dataset * @return */ - private String getDatasetIdRef(Alignment dataset) + private String getDatasetIdRef(AlignmentI dataset) { if (dataset.getDataset() != null) { @@ -4951,7 +4927,7 @@ public class Jalview2XML // make a new datasetId and record it if (dataset2Ids == null) { - dataset2Ids = new IdentityHashMap(); + dataset2Ids = new IdentityHashMap(); } else { diff --git a/src/jalview/gui/OptsAndParamsPage.java b/src/jalview/gui/OptsAndParamsPage.java index 801cb1f..7f1b305 100644 --- a/src/jalview/gui/OptsAndParamsPage.java +++ b/src/jalview/gui/OptsAndParamsPage.java @@ -114,7 +114,7 @@ public class OptsAndParamsPage .wrapTooltip( true, ((desc == null || desc.trim().length() == 0) ? MessageManager - .getString("label.opt_and_params_further_details ") + .getString("label.opt_and_params_further_details") : desc) + "
        ")); enabled.addMouseListener(this); @@ -357,7 +357,7 @@ public class OptsAndParamsPage + linkImageURL + "\"/>" + MessageManager - .getString("label.opt_and_params_further_detail") + .getString("label.opt_and_params_further_details") : ""))); } diff --git a/src/jalview/gui/PCAPanel.java b/src/jalview/gui/PCAPanel.java index 47add28..2b09eb6 100644 --- a/src/jalview/gui/PCAPanel.java +++ b/src/jalview/gui/PCAPanel.java @@ -21,6 +21,7 @@ package jalview.gui; import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.datamodel.ColumnSelection; import jalview.datamodel.SeqCigar; @@ -383,8 +384,8 @@ public class PCAPanel extends GPCAPanel implements Runnable, { // AlignmentOrder origorder = new AlignmentOrder(alAndColsel[0]); - Alignment al = new Alignment((SequenceI[]) alAndColsel[0]); - Alignment dataset = (av != null && av.getAlignment() != null) ? av + AlignmentI al = new Alignment((SequenceI[]) alAndColsel[0]); + AlignmentI dataset = (av != null && av.getAlignment() != null) ? av .getAlignment().getDataset() : null; if (dataset != null) { diff --git a/src/jalview/gui/PopupMenu.java b/src/jalview/gui/PopupMenu.java index 1e0772a..497f3ba 100644 --- a/src/jalview/gui/PopupMenu.java +++ b/src/jalview/gui/PopupMenu.java @@ -2270,28 +2270,7 @@ public class PopupMenu extends JPopupMenu void hideSequences(boolean representGroup) { - SequenceGroup sg = ap.av.getSelectionGroup(); - if (sg == null || sg.getSize() < 1) - { - ap.av.hideSequence(new SequenceI[] { sequence }); - return; - } - - ap.av.setSelectionGroup(null); - - if (representGroup) - { - ap.av.hideRepSequences(sequence, sg); - - return; - } - - int gsize = sg.getSize(); - SequenceI[] hseqs = sg.getSequences().toArray(new SequenceI[gsize]); - - ap.av.hideSequence(hseqs); - // refresh(); TODO: ? needed ? - ap.av.sendSelection(); + ap.av.hideSequences(sequence, representGroup); } public void copy_actionPerformed() @@ -2363,45 +2342,6 @@ public class PopupMenu extends JPopupMenu ap, true)); } - public void enterPDB_actionPerformed() - { - String id = JOptionPane.showInternalInputDialog(Desktop.desktop, - MessageManager.getString("label.enter_pdb_id"), - MessageManager.getString("label.enter_pdb_id"), - JOptionPane.QUESTION_MESSAGE); - - if (id != null && id.length() > 0) - { - PDBEntry entry = new PDBEntry(); - entry.setId(id.toUpperCase()); - sequence.getDatasetSequence().addPDBId(entry); - } - } - - public void discoverPDB_actionPerformed() - { - - final SequenceI[] sequences = ((ap.av.getSelectionGroup() == null) ? new SequenceI[] - { sequence } - : ap.av.getSequenceSelection()); - Thread discpdb = new Thread(new Runnable() - { - @Override - public void run() - { - boolean isNuclueotide = ap.alignFrame.getViewport().getAlignment() - .isNucleotide(); - - new jalview.ws.DBRefFetcher(sequences, ap.alignFrame, null, - ap.alignFrame.featureSettings, isNuclueotide) - .fetchDBRefs(false); - - } - - }); - discpdb.start(); - } - public void sequenceFeature_actionPerformed() { SequenceGroup sg = ap.av.getSelectionGroup(); diff --git a/src/jalview/gui/Preferences.java b/src/jalview/gui/Preferences.java index 6b2d3c4..afc93e0 100755 --- a/src/jalview/gui/Preferences.java +++ b/src/jalview/gui/Preferences.java @@ -164,6 +164,16 @@ public class Preferences extends GPreferences private WsPreferences wsPrefs; + private OptionsParam promptEachTimeOpt = new OptionsParam( + MessageManager.getString("label.prompt_each_time"), + "Prompt each time"); + + private OptionsParam lineArtOpt = new OptionsParam( + MessageManager.getString("label.lineart"), "Lineart"); + + private OptionsParam textOpt = new OptionsParam( + MessageManager.getString("action.text"), "Text"); + /** * Creates a new Preferences object. */ @@ -359,12 +369,23 @@ public class Preferences extends GPreferences /* * Set Output tab defaults */ - epsRendering - .addItem(MessageManager.getString("label.prompt_each_time")); - epsRendering.addItem(MessageManager.getString("label.lineart")); - epsRendering.addItem(MessageManager.getString("action.text")); - epsRendering.setSelectedItem(Cache.getDefault("EPS_RENDERING", - "Prompt each time")); + epsRendering.addItem(promptEachTimeOpt); + epsRendering.addItem(lineArtOpt); + epsRendering.addItem(textOpt); + String defaultEPS = Cache.getDefault("EPS_RENDERING", + "Prompt each time"); + if (defaultEPS.equalsIgnoreCase("Text")) + { + epsRendering.setSelectedItem(textOpt); + } + else if (defaultEPS.equalsIgnoreCase("Lineart")) + { + epsRendering.setSelectedItem(lineArtOpt); + } + else + { + epsRendering.setSelectedItem(promptEachTimeOpt); + } autoIdWidth.setSelected(Cache.getDefault("FIGURE_AUTOIDWIDTH", false)); userIdWidth.setEnabled(!autoIdWidth.isSelected()); userIdWidthlabel.setEnabled(!autoIdWidth.isSelected()); @@ -515,15 +536,8 @@ public class Preferences extends GPreferences /* * Save Output settings */ - if (epsRendering.getSelectedItem().equals("Prompt each time")) - { - Cache.applicationProperties.remove("EPS_RENDERING"); - } - else - { - Cache.applicationProperties.setProperty("EPS_RENDERING", epsRendering - .getSelectedItem().toString()); - } + Cache.applicationProperties.setProperty("EPS_RENDERING", + ((OptionsParam) epsRendering.getSelectedItem()).getCode()); /* * Save Connections settings @@ -983,4 +997,57 @@ public class Preferences extends GPreferences } } + public class OptionsParam + { + private String name; + + private String code; + + public OptionsParam(String name, String code) + { + this.name = name; + this.code = code; + } + + public String getName() + { + return name; + } + + public void setName(String name) + { + this.name = name; + } + + public String getCode() + { + return code; + } + + public void setCode(String code) + { + this.code = code; + } + + @Override + public String toString() + { + return name; + } + + @Override + public boolean equals(Object that) + { + if (!(that instanceof OptionsParam)) + { + return false; + } + return this.code.equalsIgnoreCase(((OptionsParam) that).code); + } + + @Override + public int hashCode(){ + return name.hashCode() + code.hashCode(); + } + } } diff --git a/src/jalview/gui/ScalePanel.java b/src/jalview/gui/ScalePanel.java index aedb157..2165b2c 100755 --- a/src/jalview/gui/ScalePanel.java +++ b/src/jalview/gui/ScalePanel.java @@ -35,6 +35,7 @@ import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; +import java.util.List; import javax.swing.JMenuItem; import javax.swing.JPanel; @@ -42,17 +43,14 @@ import javax.swing.JPopupMenu; import javax.swing.ToolTipManager; /** - * DOCUMENT ME! - * - * @author $author$ - * @version $Revision$ + * The panel containing the sequence ruler (when not in wrapped mode), and + * supports a range of mouse operations to select, hide or reveal columns. */ public class ScalePanel extends JPanel implements MouseMotionListener, MouseListener { protected int offy = 4; - /** DOCUMENT ME!! */ public int width; protected AlignViewport av; @@ -61,13 +59,26 @@ public class ScalePanel extends JPanel implements MouseMotionListener, boolean stretchingGroup = false; - int min; // used by mouseDragged to see if user + /* + * min, max hold the extent of a mouse drag action + */ + int min; - int max; // used by mouseDragged to see if user + int max; boolean mouseDragging = false; - // wants to delete columns + /* + * holds a hidden column range when the mouse is over an adjacent column + */ + int[] reveal; + + /** + * Constructor + * + * @param av + * @param ap + */ public ScalePanel(AlignViewport av, AlignmentPanel ap) { this.av = av; @@ -392,6 +403,8 @@ public class ScalePanel extends JPanel implements MouseMotionListener, @Override public void mouseMoved(MouseEvent evt) { + this.setToolTipText(null); + reveal = null; if (!av.hasHiddenColumns()) { return; @@ -401,7 +414,6 @@ public class ScalePanel extends JPanel implements MouseMotionListener, res = av.getColumnSelection().adjustForHiddenColumns(res); - reveal = null; if (av.getColumnSelection().getHiddenColumns() != null) { for (int[] region : av.getColumnSelection().getHiddenColumns()) @@ -414,17 +426,11 @@ public class ScalePanel extends JPanel implements MouseMotionListener, .getString("label.reveal_hidden_columns")); break; } - else - { - this.setToolTipText(null); - } } } repaint(); } - int[] reveal; - /** * DOCUMENT ME! * @@ -459,7 +465,6 @@ public class ScalePanel extends JPanel implements MouseMotionListener, ColumnSelection cs = av.getColumnSelection(); int avCharWidth = av.getCharWidth(), avCharHeight = av.getCharHeight(); - int s; if (cs != null) { gg.setColor(new Color(220, 0, 0)); @@ -488,92 +493,15 @@ public class ScalePanel extends JPanel implements MouseMotionListener, } } } - // Draw the scale numbers - gg.setColor(Color.black); - - int scalestartx = (startx / 10) * 10; - - SequenceI refSeq = av.getAlignment().getSeqrep(); - int refSp = 0, refEp = -1, refStart = 0, refEnd = -1, refStartI = 0, refEndI = -1; - if (refSeq != null) - { - // find bounds and set origin appopriately - // locate first visible position for this sequence - int[] refbounds = av.getColumnSelection() - .locateVisibleBoundsOfSequence(refSeq); - - refSp = refbounds[0]; - refEp = refbounds[1]; - refStart = refbounds[2]; - refEnd = refbounds[3]; - refStartI = refbounds[4]; - refEndI = refbounds[5]; - scalestartx = refSp + ((scalestartx - refSp) / 10) * 10; - } - int widthx = 1 + endx - startx; FontMetrics fm = gg.getFontMetrics(av.getFont()); - int y = avCharHeight - fm.getDescent(); - - if (refSeq == null && scalestartx % 10 == 0) - { - scalestartx += 5; - } - - String string; - int maxX = 0, refN, iadj; - // todo: add a 'reference origin column' to set column number relative to - for (int i = scalestartx; i < endx; i += 5) - { - if (((i - refSp) % 10) == 0) - { - iadj = av.getColumnSelection().adjustForHiddenColumns(i) - 1; - if (refSeq == null) - { - string = String.valueOf(iadj + 1); - } - else - { - refN = refSeq.findPosition(iadj); - // TODO show bounds if position is a gap - // - ie L--R -> "1L|2R" for - // marker - if (iadj < refStartI) - { - string = String.valueOf(iadj - refStartI); - } - else if (iadj > refEndI) - { - string = "+" + String.valueOf(iadj - refEndI); - } - else - { - string = String.valueOf(refN) + refSeq.getCharAt(iadj); - } - } - if ((i - startx - 1) * avCharWidth > maxX) - { - gg.drawString(string, (i - startx - 1) * avCharWidth, y); - maxX = (i - startx + 1) * avCharWidth + fm.stringWidth(string); - } - - gg.drawLine(((i - startx - 1) * avCharWidth) + (avCharWidth / 2), - y + 2, - ((i - startx - 1) * avCharWidth) + (avCharWidth / 2), y - + (fm.getDescent() * 2)); - } - else - { - gg.drawLine(((i - startx - 1) * avCharWidth) + (avCharWidth / 2), y - + fm.getDescent(), ((i - startx - 1) * avCharWidth) - + (avCharWidth / 2), y + (fm.getDescent() * 2)); - } - } - + int y = avCharHeight, yOf = fm.getDescent(); + y -= yOf; if (av.hasHiddenColumns()) { + // draw any hidden column markers gg.setColor(Color.blue); int res; if (av.getShowHiddenMarkers() @@ -590,14 +518,47 @@ public class ScalePanel extends JPanel implements MouseMotionListener, continue; } - gg.fillPolygon(new int[] { res * avCharWidth - avCharHeight / 4, - res * avCharWidth + avCharHeight / 4, res * avCharWidth }, - new int[] { y - avCharHeight / 2, y - avCharHeight / 2, - y + 8 }, 3); + gg.fillPolygon(new int[] { + -1 + res * avCharWidth - avCharHeight / 4, + -1 + res * avCharWidth + avCharHeight / 4, + -1 + res * avCharWidth }, new int[] { y, y, y + 2 * yOf }, 3); } } + } + // Draw the scale numbers + gg.setColor(Color.black); + + int maxX = 0; + List marks = jalview.renderer.ScaleRenderer.calculateMarks( + av, startx, endx); + for (Object[] mark : marks) + { + boolean major = Boolean.valueOf((Boolean) mark[0]); + int mpos = ((Integer) mark[1]).intValue(); // (i - startx - 1) + String mstring = (String) mark[2]; + if (mstring != null) + { + if (mpos * avCharWidth > maxX) + { + gg.drawString(mstring, mpos * avCharWidth, y); + maxX = (mpos + 2) * avCharWidth + fm.stringWidth(mstring); + } + } + if (major) + { + gg.drawLine((mpos * avCharWidth) + (avCharWidth / 2), y + 2, + (mpos * avCharWidth) + (avCharWidth / 2), y + (yOf * 2)); + } + else + { + gg.drawLine((mpos * avCharWidth) + (avCharWidth / 2), y + yOf, + (mpos * avCharWidth) + (avCharWidth / 2), y + (yOf * 2)); + } + } + if (av.hasHiddenColumns()) + { if (reveal != null && reveal[0] > startx && reveal[0] < endx) { gg.drawString(MessageManager.getString("label.reveal_columns"), @@ -606,4 +567,5 @@ public class ScalePanel extends JPanel implements MouseMotionListener, } } + } diff --git a/src/jalview/gui/SeqCanvas.java b/src/jalview/gui/SeqCanvas.java index 0f24b4b..2f7cd76 100755 --- a/src/jalview/gui/SeqCanvas.java +++ b/src/jalview/gui/SeqCanvas.java @@ -122,24 +122,26 @@ public class SeqCanvas extends JComponent private void drawNorthScale(Graphics g, int startx, int endx, int ypos) { updateViewport(); - int scalestartx = startx - (startx % 10) + 10; - - g.setColor(Color.black); - // NORTH SCALE - for (int i = scalestartx; i < endx; i += 10) + for (Object[] mark : jalview.renderer.ScaleRenderer.calculateMarks(av, + startx, endx)) { - int value = i; - if (av.hasHiddenColumns()) + int mpos = ((Integer) mark[1]).intValue(); // (i - startx - 1) + if (mpos < 0) { - value = av.getColumnSelection().adjustForHiddenColumns(value); + continue; } + String mstring = (String) mark[2]; - g.drawString(String.valueOf(value), (i - startx - 1) * charWidth, - ypos - (charHeight / 2)); - - g.drawLine(((i - startx - 1) * charWidth) + (charWidth / 2), - (ypos + 2) - (charHeight / 2), ((i - startx - 1) * charWidth) - + (charWidth / 2), ypos - 2); + if (Boolean.valueOf((Boolean) mark[0])) + { + if (mstring != null) + { + g.drawString(mstring, mpos * charWidth, ypos - (charHeight / 2)); + } + g.drawLine((mpos * charWidth) + (charWidth / 2), (ypos + 2) + - (charHeight / 2), (mpos * charWidth) + (charWidth / 2), + ypos - 2); + } } } diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 3fbb809..2d44a0f 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -1947,10 +1947,12 @@ public class SeqPanel extends JPanel implements MouseListener, // do we want to thread this ? (contention with seqsel and colsel locks, I // suspect) - // rules are: colsel is copied if there is a real intersection between - // sequence selection + /* + * only copy colsel if there is a real intersection between + * sequence selection and this panel's alignment + */ boolean repaint = false; - boolean copycolsel = true; + boolean copycolsel = false; SequenceGroup sgroup = null; if (seqsel != null && seqsel.getSize() > 0) @@ -1964,11 +1966,9 @@ public class SeqPanel extends JPanel implements MouseListener, } sgroup = seqsel.intersect(av.getAlignment(), (av.hasHiddenRows()) ? av.getHiddenRepSequences() : null); - if ((sgroup == null || sgroup.getSize() == 0) - || (colsel == null || colsel.isEmpty())) + if ((sgroup != null && sgroup.getSize() > 0)) { - // don't copy columns if the region didn't intersect. - copycolsel = false; + copycolsel = true; } } if (sgroup != null && sgroup.getSize() > 0) @@ -2061,7 +2061,6 @@ public class SeqPanel extends JPanel implements MouseListener, ColumnSelection cs = MappingUtils.mapColumnSelection(colsel, sourceAv, av); av.setColumnSelection(cs); - av.isColSelChanged(true); PaintRefresher.Refresh(this, av.getSequenceSetId()); diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index d5a04a9..828a2aa 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -31,6 +31,7 @@ import jalview.fts.service.uniprot.UniprotFTSPanel; import jalview.io.gff.SequenceOntologyI; import jalview.util.DBRefUtils; import jalview.util.MessageManager; +import jalview.util.Platform; import jalview.ws.dbsources.das.api.DasSourceRegistryI; import jalview.ws.seqfetcher.DbSourceProxy; @@ -274,13 +275,13 @@ public class SequenceFetcher extends JPanel implements Runnable frame = new JInternalFrame(); frame.setContentPane(this); - if (new jalview.util.Platform().isAMac()) + if (Platform.isAMac()) { - Desktop.addInternalFrame(frame, getFrameTitle(), 400, 240); + Desktop.addInternalFrame(frame, getFrameTitle(), false, 400, 240); } else { - Desktop.addInternalFrame(frame, getFrameTitle(), 400, 180); + Desktop.addInternalFrame(frame, getFrameTitle(), false, 400, 180); } } @@ -365,7 +366,19 @@ public class SequenceFetcher extends JPanel implements Runnable jPanel1.add(close); jPanel3.add(jPanel2, java.awt.BorderLayout.CENTER); jPanel2.setLayout(borderLayout3); - databaseButt = database.getDatabaseSelectorButton(); + databaseButt = /*database.getDatabaseSelectorButton(); + final JButton viewdbs =*/new JButton( + MessageManager.getString("action.select_ddbb")); + databaseButt.addActionListener(new ActionListener() + { + + @Override + public void actionPerformed(ActionEvent arg0) + { + hidePanel(); + database.showDialog(); + } + }); databaseButt.setFont(JvSwingUtils.getLabelFont()); database.addActionListener(new ActionListener() { @@ -374,6 +387,12 @@ public class SequenceFetcher extends JPanel implements Runnable { debounceTrap++; String currentSelection = database.getSelectedItem(); + if (currentSelection == null) + { + close_actionPerformed(null); + } + + showPanel(); if (currentSelection.equalsIgnoreCase("pdb") && (database.action == KeyEvent.VK_ENTER || ((debounceTrap % 2) == 0))) @@ -407,6 +426,10 @@ public class SequenceFetcher extends JPanel implements Runnable this.add(jPanel2, java.awt.BorderLayout.NORTH); jScrollPane1.getViewport().add(textArea); + /* + * open the database tree + */ + database.waitForInput(); } private void pdbSourceAction() @@ -813,10 +836,8 @@ public class SequenceFetcher extends JPanel implements Runnable Cache.log.info( "Error retrieving " + accession + " from " + proxy.getDbName(), e); - } finally - { - return success; } + return success; } /** @@ -836,7 +857,6 @@ public class SequenceFetcher extends JPanel implements Runnable for (String q : queries) { - DBRefEntry[] found = null; DBRefEntry dbr = new DBRefEntry(); dbr.setSource(proxy.getDbSource()); dbr.setVersion(null); @@ -847,8 +867,9 @@ public class SequenceFetcher extends JPanel implements Runnable { if (rs[r] != null) { - found = DBRefUtils.searchRefs(rs[r].getDBRefs(), accId); - if (found != null && found.length > 0) + List found = DBRefUtils.searchRefs(rs[r].getDBRefs(), + accId); + if (!found.isEmpty()) { rfound = true; break; @@ -919,7 +940,7 @@ public class SequenceFetcher extends JPanel implements Runnable } if (Cache.getDefault("HIDE_INTRONS", true)) { - hideIntronsIfPresent(af); + af.hideFeatureColumns(SequenceOntologyI.EXON, false); } Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH, @@ -944,25 +965,6 @@ public class SequenceFetcher extends JPanel implements Runnable return al; } - /** - * Hide columns not containing 'exon' features, provided there are exon - * features on the alignment - * - * @param af - */ - public void hideIntronsIfPresent(AlignFrame af) - { - boolean hasExons = af.avc.markColumnsContainingFeatures(false, false, - false, - SequenceOntologyI.EXON); - if (hasExons) - { - af.avc.markColumnsContainingFeatures(true, false, true, - SequenceOntologyI.EXON); - af.getViewport().hideSelectedColumns(); - } - } - void showErrorMessage(final String error) { resetDialog(); @@ -987,4 +989,22 @@ public class SequenceFetcher extends JPanel implements Runnable { this.progressIndicator = progressIndicator; } + + /** + * Make this panel visible (after a selection has been made in the database + * chooser) + */ + void showPanel() + { + frame.setVisible(true); + } + + /** + * Hide this panel (on clicking the database button to open the database + * chooser) + */ + void hidePanel() + { + frame.setVisible(false); + } } diff --git a/src/jalview/gui/SequenceRenderer.java b/src/jalview/gui/SequenceRenderer.java index 258a229..427eb08 100755 --- a/src/jalview/gui/SequenceRenderer.java +++ b/src/jalview/gui/SequenceRenderer.java @@ -29,12 +29,6 @@ import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics; -/** - * DOCUMENT ME! - * - * @author $author$ - * @version $Revision$ - */ public class SequenceRenderer implements jalview.api.SequenceRenderer { final static int CHAR_TO_UPPER = 'A' - 'a'; @@ -417,7 +411,7 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer } if (!isarep && av.getShowUnconserved()) { - s = getDisplayChar(srep, i, s, '.', currentSequenceGroup); + s = getDisplayChar(srep, i, s, '.', null); } @@ -447,12 +441,17 @@ public class SequenceRenderer implements jalview.api.SequenceRenderer { // TODO - use currentSequenceGroup rather than alignment // currentSequenceGroup.getConsensus() - char conschar = (usesrep) ? (currentGroup == null ? av.getAlignment() + char conschar = (usesrep) ? (currentGroup == null + || position < currentGroup.getStartRes() + || position > currentGroup.getEndRes() ? av.getAlignment() .getSeqrep().getCharAt(position) : (currentGroup.getSeqrep() != null ? currentGroup.getSeqrep() .getCharAt(position) : av.getAlignment().getSeqrep() .getCharAt(position))) - : (currentGroup != null && currentGroup.getConsensus() != null) ? currentGroup + : (currentGroup != null && currentGroup.getConsensus() != null + && position >= currentGroup.getStartRes() + && position <= currentGroup.getEndRes() && currentGroup + .getConsensus().annotations.length > position) ? currentGroup .getConsensus().annotations[position].displayCharacter .charAt(0) : av.getAlignmentConsensusAnnotation().annotations[position].displayCharacter diff --git a/src/jalview/gui/SplitFrame.java b/src/jalview/gui/SplitFrame.java index 617224f..3b96be8 100644 --- a/src/jalview/gui/SplitFrame.java +++ b/src/jalview/gui/SplitFrame.java @@ -206,6 +206,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI final AlignmentI bottomAlignment = bottomViewport.getAlignment(); boolean topAnnotations = topViewport.isShowAnnotation(); boolean bottomAnnotations = bottomViewport.isShowAnnotation(); + // TODO need number of visible sequences here, not #sequences - how? int topCount = topAlignment.getHeight(); int bottomCount = bottomAlignment.getHeight(); int topCharHeight = topViewport.getViewStyle().getCharHeight(); @@ -223,6 +224,11 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI + (bottomAnnotations ? bottomViewport.calcPanelHeight() : 0); double ratio = ((double) topHeight) / (topHeight + bottomHeight); + /* + * limit to 0.2 <= ratio <= 0.8 to avoid concealing all sequences + */ + ratio = Math.min(ratio, 0.8d); + ratio = Math.max(ratio, 0.2d); setRelativeDividerLocation(ratio); } diff --git a/src/jalview/gui/StructureChooser.java b/src/jalview/gui/StructureChooser.java index d924e73..13fa460 100644 --- a/src/jalview/gui/StructureChooser.java +++ b/src/jalview/gui/StructureChooser.java @@ -35,6 +35,7 @@ import jalview.fts.service.pdb.PDBFTSRestClient; import jalview.jbgui.GStructureChooser; import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; +import jalview.ws.DBRefFetcher; import jalview.ws.sifts.SiftsSettings; import java.awt.event.ItemEvent; @@ -44,6 +45,7 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.Vector; import javax.swing.JCheckBox; @@ -147,8 +149,8 @@ public class StructureChooser extends GStructureChooser implements { long startTime = System.currentTimeMillis(); pdbRestCleint = PDBFTSRestClient.getInstance(); - Collection wantedFields = pdbRestCleint - .getAllDefaulDisplayedDataColumns(); + Collection wantedFields = pdbDocFieldPrefs + .getStructureSummaryFields(); discoveredStructuresSet = new LinkedHashSet(); HashSet errors = new HashSet(); @@ -185,7 +187,8 @@ public class StructureChooser extends GStructureChooser implements if (discoveredStructuresSet != null && !discoveredStructuresSet.isEmpty()) { - tbl_summary.setModel(FTSRestResponse.getTableModel(lastPdbRequest, + getResultTable().setModel( + FTSRestResponse.getTableModel(lastPdbRequest, discoveredStructuresSet)); structuresDiscovered = true; noOfStructuresFound = discoveredStructuresSet.size(); @@ -247,7 +250,7 @@ public class StructureChooser extends GStructureChooser implements boolean isPDBRefsFound = false; boolean isUniProtRefsFound = false; StringBuilder queryBuilder = new StringBuilder(); - HashSet seqRefs = new LinkedHashSet(); + Set seqRefs = new LinkedHashSet(); if (seq.getAllPDBEntries() != null) { @@ -255,9 +258,8 @@ public class StructureChooser extends GStructureChooser implements { if (isValidSeqName(entry.getId())) { - queryBuilder.append("pdb_id") - .append(":") -.append(entry.getId().toLowerCase()) + queryBuilder.append("pdb_id:") + .append(entry.getId().toLowerCase()) .append(" OR "); isPDBRefsFound = true; // seqRefs.add(entry.getId()); @@ -273,21 +275,18 @@ public class StructureChooser extends GStructureChooser implements { if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT)) { - queryBuilder -.append("uniprot_accession").append(":") + queryBuilder.append("uniprot_accession:") .append(getDBRefId(dbRef)) .append(" OR "); - queryBuilder -.append("uniprot_id") - .append(":") - .append(getDBRefId(dbRef)).append(" OR "); + queryBuilder.append("uniprot_id:").append(getDBRefId(dbRef)) + .append(" OR "); isUniProtRefsFound = true; } else if (dbRef.getSource().equalsIgnoreCase(DBRefSource.PDB)) { - queryBuilder.append("pdb_id") - .append(":").append(getDBRefId(dbRef).toLowerCase()) + queryBuilder.append("pdb_id:") + .append(getDBRefId(dbRef).toLowerCase()) .append(" OR "); isPDBRefsFound = true; } @@ -330,17 +329,17 @@ public class StructureChooser extends GStructureChooser implements } /** - * Remove the following special characters from input string +, -, &, |, !, (, - * ), {, }, [, ], ^, ", ~, *, ?, :, \ + * Remove the following special characters from input string +, -, &, !, (, ), + * {, }, [, ], ^, ", ~, *, ?, :, \ * * @param seqName * @return */ - private static String sanitizeSeqName(String seqName) + static String sanitizeSeqName(String seqName) { Objects.requireNonNull(seqName); return seqName.replaceAll("\\[\\d*\\]", "") - .replaceAll("[^\\dA-Za-z|]", "").replaceAll("\\s+", "+"); + .replaceAll("[^\\dA-Za-z|_]", "").replaceAll("\\s+", "+"); } @@ -396,8 +395,8 @@ public class StructureChooser extends GStructureChooser implements long startTime = System.currentTimeMillis(); pdbRestCleint = PDBFTSRestClient.getInstance(); lbl_loading.setVisible(true); - Collection wantedFields = pdbRestCleint - .getAllDefaulDisplayedDataColumns(); + Collection wantedFields = pdbDocFieldPrefs + .getStructureSummaryFields(); Collection filteredResponse = new HashSet(); HashSet errors = new HashSet(); @@ -406,7 +405,6 @@ public class StructureChooser extends GStructureChooser implements FTSRestRequest pdbRequest = new FTSRestRequest(); if (fieldToFilterBy.equalsIgnoreCase("uniprot_coverage")) { - System.out.println(">>>>>> Filtering with uniprot coverate"); pdbRequest.setAllowEmptySeq(false); pdbRequest.setResponseSize(1); pdbRequest.setFieldToSearchBy("("); @@ -454,15 +452,18 @@ public class StructureChooser extends GStructureChooser implements Collection reorderedStructuresSet = new LinkedHashSet(); reorderedStructuresSet.addAll(filteredResponse); reorderedStructuresSet.addAll(discoveredStructuresSet); - tbl_summary.setModel(FTSRestResponse.getTableModel( + getResultTable().setModel( + FTSRestResponse.getTableModel( lastPdbRequest, reorderedStructuresSet)); - FTSRestResponse.configureTableColumn(tbl_summary, wantedFields); - tbl_summary.getColumn("Ref Sequence").setPreferredWidth(120); - tbl_summary.getColumn("Ref Sequence").setMinWidth(100); - tbl_summary.getColumn("Ref Sequence").setMaxWidth(200); + FTSRestResponse.configureTableColumn(getResultTable(), + wantedFields, tempUserPrefs); + getResultTable().getColumn("Ref Sequence").setPreferredWidth(120); + getResultTable().getColumn("Ref Sequence").setMinWidth(100); + getResultTable().getColumn("Ref Sequence").setMaxWidth(200); // Update table selection model here - tbl_summary.addRowSelectionInterval(0, filterResponseCount - 1); + getResultTable().addRowSelectionInterval(0, + filterResponseCount - 1); mainFrame.setTitle(MessageManager.formatMessage( "label.structure_chooser_filter_time", totalTime)); } @@ -529,8 +530,6 @@ public class StructureChooser extends GStructureChooser implements { cmb_filterOption.addItem(new FilterOption("Best Quality", "overall_quality", VIEWS_FILTER)); - cmb_filterOption.addItem(new FilterOption("Most UniProt Coverage", - "uniprot_coverage", VIEWS_FILTER)); cmb_filterOption.addItem(new FilterOption("Best Resolution", "resolution", VIEWS_FILTER)); cmb_filterOption.addItem(new FilterOption("Most Protein Chain", @@ -591,7 +590,7 @@ public class StructureChooser extends GStructureChooser implements String currentView = selectedFilterOpt.getView(); if (currentView == VIEWS_FILTER) { - if (tbl_summary.getSelectedRows().length > 0) + if (getResultTable().getSelectedRows().length > 0) { btn_view.setEnabled(true); } @@ -729,19 +728,21 @@ public class StructureChooser extends GStructureChooser implements String currentView = selectedFilterOpt.getView(); if (currentView == VIEWS_FILTER) { - int pdbIdColIndex = tbl_summary.getColumn("PDB Id") + int pdbIdColIndex = getResultTable().getColumn("PDB Id") .getModelIndex(); - int refSeqColIndex = tbl_summary.getColumn("Ref Sequence") + int refSeqColIndex = getResultTable().getColumn("Ref Sequence") .getModelIndex(); - int[] selectedRows = tbl_summary.getSelectedRows(); + int[] selectedRows = getResultTable().getSelectedRows(); PDBEntry[] pdbEntriesToView = new PDBEntry[selectedRows.length]; int count = 0; ArrayList selectedSeqsToView = new ArrayList(); for (int row : selectedRows) { - String pdbIdStr = tbl_summary.getValueAt(row, pdbIdColIndex) + String pdbIdStr = getResultTable().getValueAt(row, + pdbIdColIndex) .toString(); - SequenceI selectedSeq = (SequenceI) tbl_summary.getValueAt(row, + SequenceI selectedSeq = (SequenceI) getResultTable() + .getValueAt(row, refSeqColIndex); selectedSeqsToView.add(selectedSeq); PDBEntry pdbEntry = selectedSeq.getPDBEntry(pdbIdStr); @@ -800,7 +801,15 @@ public class StructureChooser extends GStructureChooser implements if (pdbEntry == null) { pdbEntry = new PDBEntry(); - pdbEntry.setId(pdbIdStr); + if (pdbIdStr.split(":").length > 1) + { + pdbEntry.setId(pdbIdStr.split(":")[0]); + pdbEntry.setChainCode(pdbIdStr.split(":")[1].toUpperCase()); + } + else + { + pdbEntry.setId(pdbIdStr); + } pdbEntry.setType(PDBEntry.Type.PDB); selectedSequence.getDatasetSequence().addPDBId(pdbEntry); } @@ -825,7 +834,7 @@ public class StructureChooser extends GStructureChooser implements launchStructureViewer(ssm, new PDBEntry[] { fileEntry }, ap, new SequenceI[] { selectedSequence }); } - mainFrame.dispose(); + closeAction(); } }).start(); } @@ -849,42 +858,58 @@ public class StructureChooser extends GStructureChooser implements final PDBEntry[] pdbEntriesToView, final AlignmentPanel alignPanel, SequenceI[] sequences) { - ssm.setProgressBar("Launching PDB structure viewer.."); + ssm.setProgressBar(MessageManager + .getString("status.launching_3d_structure_viewer")); final StructureViewer sViewer = new StructureViewer(ssm); if (SiftsSettings.isMapWithSifts()) { + ArrayList seqsWithoutSourceDBRef = new ArrayList(); for (SequenceI seq : sequences) { - if (seq.getSourceDBRef() == null) + if (seq.getSourceDBRef() == null && seq.getDBRefs() == null) { - ssm.setProgressBar(null); - ssm.setProgressBar("Fetching Database refs.."); - new jalview.ws.DBRefFetcher(sequences, null, null, null, false) - .fetchDBRefs(true); - break; + seqsWithoutSourceDBRef.add(seq); + continue; + } + } + if (!seqsWithoutSourceDBRef.isEmpty()) + { + int y = seqsWithoutSourceDBRef.size(); + ssm.setProgressBar(null); + ssm.setProgressBar(MessageManager.formatMessage( + "status.fetching_dbrefs_for_sequences_without_valid_refs", + y)); + SequenceI[] seqWithoutSrcDBRef = new SequenceI[y]; + int x = 0; + for (SequenceI fSeq : seqsWithoutSourceDBRef) + { + seqWithoutSrcDBRef[x++] = fSeq; } + new DBRefFetcher(seqWithoutSrcDBRef).fetchDBRefs(true); } } - if (pdbEntriesToView.length > 1) - { - ArrayList seqsMap = new ArrayList(); - for (SequenceI seq : sequences) - { - seqsMap.add(new SequenceI[] { seq }); - } - SequenceI[][] collatedSeqs = seqsMap.toArray(new SequenceI[0][0]); + if (pdbEntriesToView.length > 1) + { + ArrayList seqsMap = new ArrayList(); + for (SequenceI seq : sequences) + { + seqsMap.add(new SequenceI[] { seq }); + } + SequenceI[][] collatedSeqs = seqsMap.toArray(new SequenceI[0][0]); ssm.setProgressBar(null); - ssm.setProgressBar("Fetching PDB Structures for selected entries.."); - sViewer.viewStructures(pdbEntriesToView, collatedSeqs, alignPanel); - } - else - { + ssm.setProgressBar(MessageManager + .getString("status.fetching_3d_structures_for_selected_entries")); + sViewer.viewStructures(pdbEntriesToView, collatedSeqs, alignPanel); + } + else + { ssm.setProgressBar(null); - ssm.setProgressBar("Fetching PDB Structure for " - + pdbEntriesToView[0].getId()); - sViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel); - } + ssm.setProgressBar(MessageManager.formatMessage( + "status.fetching_3d_structures_for", + pdbEntriesToView[0].getId())); + sViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel); + } } /** @@ -943,6 +968,9 @@ public class StructureChooser extends GStructureChooser implements isValidPBDEntry = false; if (txt_search.getText().length() > 0) { + String searchTerm = txt_search.getText().toLowerCase(); + searchTerm = searchTerm.split(":")[0]; + // System.out.println(">>>>> search term : " + searchTerm); List wantedFields = new ArrayList(); FTSRestRequest pdbRequest = new FTSRestRequest(); pdbRequest.setAllowEmptySeq(false); @@ -950,7 +978,7 @@ public class StructureChooser extends GStructureChooser implements pdbRequest.setFieldToSearchBy("(pdb_id:"); pdbRequest.setWantedFields(wantedFields); pdbRequest - .setSearchTerm(txt_search.getText().toLowerCase() + ")"); +.setSearchTerm(searchTerm + ")"); pdbRequest.setAssociatedSequence(selectedSequence); pdbRestCleint = PDBFTSRestClient.getInstance(); wantedFields.add(pdbRestCleint.getPrimaryKeyColumn()); diff --git a/src/jalview/gui/TextColourChooser.java b/src/jalview/gui/TextColourChooser.java index 6bac6df..f1c6768 100644 --- a/src/jalview/gui/TextColourChooser.java +++ b/src/jalview/gui/TextColourChooser.java @@ -72,7 +72,7 @@ public class TextColourChooser final JPanel col2 = new JPanel(); col2.setPreferredSize(new Dimension(40, 20)); col2.setBorder(BorderFactory.createEtchedBorder()); - col2.setToolTipText(MessageManager.getString("label.ligth_colour")); + col2.setToolTipText(MessageManager.getString("label.light_colour")); col2.setBackground(new Color(original2)); final JPanel bigpanel = new JPanel(new BorderLayout()); JPanel panel = new JPanel(); @@ -89,6 +89,7 @@ public class TextColourChooser col1.addMouseListener(new MouseAdapter() { + @Override public void mousePressed(MouseEvent e) { Color col = JColorChooser.showDialog(bigpanel, @@ -104,6 +105,7 @@ public class TextColourChooser col2.addMouseListener(new MouseAdapter() { + @Override public void mousePressed(MouseEvent e) { Color col = JColorChooser.showDialog(bigpanel, @@ -119,6 +121,7 @@ public class TextColourChooser slider.addChangeListener(new ChangeListener() { + @Override public void stateChanged(ChangeEvent evt) { thresholdChanged(slider.getValue()); diff --git a/src/jalview/gui/TreePanel.java b/src/jalview/gui/TreePanel.java index 9522144..fafa610 100755 --- a/src/jalview/gui/TreePanel.java +++ b/src/jalview/gui/TreePanel.java @@ -161,6 +161,7 @@ public class TreePanel extends GTreePanel av.addPropertyChangeListener(new java.beans.PropertyChangeListener() { + @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals("alignment")) @@ -196,6 +197,7 @@ public class TreePanel extends GTreePanel } + @Override public void viewMenu_menuSelected() { buildAssociatedViewMenu(); @@ -231,6 +233,7 @@ public class TreePanel extends GTreePanel buttonGroup.add(item); item.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent evt) { treeCanvas.applyToAllViews = false; @@ -249,6 +252,7 @@ public class TreePanel extends GTreePanel itemf.setSelected(treeCanvas.applyToAllViews); itemf.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent evt) { treeCanvas.applyToAllViews = itemf.isSelected(); @@ -276,6 +280,7 @@ public class TreePanel extends GTreePanel } } + @Override public void run() { @@ -389,6 +394,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void textbox_actionPerformed(ActionEvent e) { CutAndPasteTransfer cap = new CutAndPasteTransfer(); @@ -434,6 +440,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void saveAsNewick_actionPerformed(ActionEvent e) { JalviewFileChooser chooser = new JalviewFileChooser( @@ -474,12 +481,14 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void printMenu_actionPerformed(ActionEvent e) { // Putting in a thread avoids Swing painting problems treeCanvas.startPrinting(); } + @Override public void originalSeqData_actionPerformed(ActionEvent e) { if (!tree.hasOriginalSequenceData()) @@ -511,8 +520,8 @@ public class TreePanel extends GTreePanel { // AlignmentOrder origorder = new AlignmentOrder(alAndColsel[0]); - Alignment al = new Alignment((SequenceI[]) alAndColsel[0]); - Alignment dataset = (av != null && av.getAlignment() != null) ? av + AlignmentI al = new Alignment((SequenceI[]) alAndColsel[0]); + AlignmentI dataset = (av != null && av.getAlignment() != null) ? av .getAlignment().getDataset() : null; if (dataset != null) { @@ -547,6 +556,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void fitToWindow_actionPerformed(ActionEvent e) { treeCanvas.fitToWindow = fitToWindow.isSelected(); @@ -637,6 +647,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void font_actionPerformed(ActionEvent e) { if (treeCanvas == null) @@ -666,6 +677,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void distanceMenu_actionPerformed(ActionEvent e) { treeCanvas.setShowDistances(distanceMenu.isSelected()); @@ -677,6 +689,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void bootstrapMenu_actionPerformed(ActionEvent e) { treeCanvas.setShowBootstrap(bootstrapMenu.isSelected()); @@ -688,6 +701,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void placeholdersMenu_actionPerformed(ActionEvent e) { treeCanvas.setMarkPlaceholders(placeholdersMenu.isSelected()); @@ -699,6 +713,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void epsTree_actionPerformed(ActionEvent e) { boolean accurateText = true; @@ -772,6 +787,7 @@ public class TreePanel extends GTreePanel * @param e * DOCUMENT ME! */ + @Override public void pngTree_actionPerformed(ActionEvent e) { int width = treeCanvas.getWidth(); @@ -828,6 +844,7 @@ public class TreePanel extends GTreePanel tree.applyToNodes(new NodeTransformI() { + @Override public void transform(BinaryNode node) { if (node instanceof SequenceNode diff --git a/src/jalview/io/AlignFile.java b/src/jalview/io/AlignFile.java index 984eff6..5760fbe 100755 --- a/src/jalview/io/AlignFile.java +++ b/src/jalview/io/AlignFile.java @@ -89,14 +89,14 @@ public abstract class AlignFile extends FileParse /** * Constructor which parses the data from a file of some specified type. * - * @param inFile - * Filename to read from. + * @param dataObject + * Filename, URL or Pasted String to read from. * @param type - * What type of file to read from (File, URL) + * What type of file to read from (File, URL, Pasted String) */ - public AlignFile(String inFile, String type) throws IOException + public AlignFile(String dataObject, String type) throws IOException { - this(true, inFile, type); + this(true, dataObject, type); } /** @@ -105,16 +105,16 @@ public abstract class AlignFile extends FileParse * * @param parseImmediately * if false, need to call 'doParse()' to begin parsing data - * @param inFile - * Filename to read from. + * @param dataObject + * Filename, URL or Pasted String to read from. * @param type * What type of file to read from (File, URL) * @throws IOException */ - public AlignFile(boolean parseImmediately, String inFile, String type) + public AlignFile(boolean parseImmediately, String dataObject, String type) throws IOException { - super(inFile, type); + super(dataObject, type); initData(); if (parseImmediately) { diff --git a/src/jalview/io/AnnotationFile.java b/src/jalview/io/AnnotationFile.java index 8b3aa98..d738882 100755 --- a/src/jalview/io/AnnotationFile.java +++ b/src/jalview/io/AnnotationFile.java @@ -1760,6 +1760,10 @@ public class AnnotationFile */ public String printCSVAnnotations(AlignmentAnnotation[] annotations) { + if (annotations == null) + { + return ""; + } StringBuffer sp = new StringBuffer(); for (int i = 0; i < annotations.length; i++) { diff --git a/src/jalview/io/AppletFormatAdapter.java b/src/jalview/io/AppletFormatAdapter.java index 1a639f1..fb414f4 100755 --- a/src/jalview/io/AppletFormatAdapter.java +++ b/src/jalview/io/AppletFormatAdapter.java @@ -26,7 +26,7 @@ import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; -import jalview.structure.StructureViewSettings; +import jalview.structure.StructureImportSettings; import jalview.util.MessageManager; import java.io.File; @@ -280,10 +280,11 @@ public class AppletFormatAdapter { // TODO obtain config value from preference settings. // Set value to 'true' to test PDB processing with Jmol: JAL-1213 - boolean isParseWithJMOL = false; + boolean isParseWithJMOL = !StructureImportSettings + .getCurrentDefaultFormat().equalsIgnoreCase("PDB"); if (isParseWithJMOL) { - StructureViewSettings.addSettings(annotFromStructure, + StructureImportSettings.addSettings(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct); alignFile = new jalview.ext.jmol.JmolParser(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct, inFile, @@ -291,7 +292,9 @@ public class AppletFormatAdapter } else { - StructureViewSettings.setShowSeqFeatures(true); + StructureImportSettings.addSettings(annotFromStructure, + localSecondaryStruct, serviceSecondaryStruct); + StructureImportSettings.setShowSeqFeatures(true); alignFile = new MCview.PDBfile(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct, inFile, type); @@ -299,7 +302,7 @@ public class AppletFormatAdapter } else if (format.equals("mmCIF")) { - StructureViewSettings.addSettings(annotFromStructure, + StructureImportSettings.addSettings(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct); alignFile = new jalview.ext.jmol.JmolParser(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct, inFile, type); @@ -433,21 +436,21 @@ public class AppletFormatAdapter boolean isParseWithJMOL = false; if (isParseWithJMOL) { - StructureViewSettings.addSettings(annotFromStructure, + StructureImportSettings.addSettings(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct); alignFile = new jalview.ext.jmol.JmolParser(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct, source); } else { - StructureViewSettings.setShowSeqFeatures(true); + StructureImportSettings.setShowSeqFeatures(true); alignFile = new MCview.PDBfile(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct, source); } } else if (format.equals("mmCIF")) { - StructureViewSettings.addSettings(annotFromStructure, + StructureImportSettings.addSettings(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct); alignFile = new jalview.ext.jmol.JmolParser(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct, source); diff --git a/src/jalview/io/FeaturesFile.java b/src/jalview/io/FeaturesFile.java index 2dd5f26..aa38540 100755 --- a/src/jalview/io/FeaturesFile.java +++ b/src/jalview/io/FeaturesFile.java @@ -23,6 +23,7 @@ package jalview.io; import jalview.analysis.AlignmentUtils; import jalview.analysis.SequenceIdMatcher; import jalview.api.AlignViewportI; +import jalview.api.FeatureColourI; import jalview.api.FeaturesSourceI; import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; @@ -33,15 +34,12 @@ import jalview.datamodel.SequenceI; import jalview.io.gff.GffHelperBase; import jalview.io.gff.GffHelperFactory; import jalview.io.gff.GffHelperI; -import jalview.schemes.AnnotationColourGradient; -import jalview.schemes.GraduatedColor; +import jalview.schemes.FeatureColour; import jalview.schemes.UserColourScheme; -import jalview.util.Format; import jalview.util.MapList; import jalview.util.ParseHtmlBodyAndLinks; import jalview.util.StringUtils; -import java.awt.Color; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -50,7 +48,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.StringTokenizer; /** * Parses and writes features files, which may be in Jalview, GFF2 or GFF3 @@ -140,7 +137,8 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI * - process html strings into plain text * @return true if features were added */ - public boolean parse(AlignmentI align, Map colours, + public boolean parse(AlignmentI align, + Map colours, boolean removeHTML) { return parse(align, colours, removeHTML, false); @@ -177,7 +175,8 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI * - when true, ID matches to compound sequence IDs are allowed * @return true if features were added */ - public boolean parse(AlignmentI align, Map colours, + public boolean parse(AlignmentI align, + Map colours, boolean removeHTML, boolean relaxedIdmatching) { Map gffProps = new HashMap(); @@ -232,12 +231,18 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI else if (ft.equalsIgnoreCase("endgroup")) { // We should check whether this is the current group, - // but at present theres no way of showing more than 1 group + // but at present there's no way of showing more than 1 group featureGroup = null; } else { - parseFeatureColour(line, ft, gffColumns, colours); + String colscheme = gffColumns[1]; + FeatureColourI colour = FeatureColour + .parseJalviewFeatureColour(colscheme); + if (colour != null) + { + colours.put(ft, colour); + } } continue; } @@ -297,7 +302,7 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI * @param featureGroup */ protected boolean parseJalviewFeature(String line, String[] gffColumns, - AlignmentI alignment, Map featureColours, + AlignmentI alignment, Map featureColours, boolean removeHTML, boolean relaxedIdMatching, String featureGroup) { /* @@ -350,7 +355,7 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI * synthesize a colour from the feature type */ UserColourScheme ucs = new UserColourScheme(ft); - featureColours.put(ft, ucs.findColour('A')); + featureColours.put(ft, new FeatureColour(ucs.findColour('A'))); } SequenceFeature sf = new SequenceFeature(ft, desc, "", startPos, endPos, featureGroup); @@ -381,225 +386,6 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI } /** - * Process a feature type colour specification - * - * @param line - * the current input line (for error messages only) - * @param featureType - * the first token on the line - * @param gffColumns - * holds tokens on the line - * @param colours - * map to which to add derived colour specification - */ - protected void parseFeatureColour(String line, String featureType, - String[] gffColumns, Map colours) - { - Object colour = null; - String colscheme = gffColumns[1]; - if (colscheme.indexOf("|") > -1 - || colscheme.trim().equalsIgnoreCase("label")) - { - colour = parseGraduatedColourScheme(line, colscheme); - } - else - { - UserColourScheme ucs = new UserColourScheme(colscheme); - colour = ucs.findColour('A'); - } - if (colour != null) - { - colours.put(featureType, colour); - } - } - - /** - * Parse a Jalview graduated colour descriptor - * - * @param line - * @param colourDescriptor - * @return - */ - protected GraduatedColor parseGraduatedColourScheme(String line, - String colourDescriptor) - { - // Parse '|' separated graduated colourscheme fields: - // [label|][mincolour|maxcolour|[absolute|]minvalue|maxvalue|thresholdtype|thresholdvalue] - // can either provide 'label' only, first is optional, next two - // colors are required (but may be - // left blank), next is optional, nxt two min/max are required. - // first is either 'label' - // first/second and third are both hexadecimal or word equivalent - // colour. - // next two are values parsed as floats. - // fifth is either 'above','below', or 'none'. - // sixth is a float value and only required when fifth is either - // 'above' or 'below'. - StringTokenizer gcol = new StringTokenizer(colourDescriptor, "|", true); - // set defaults - float min = Float.MIN_VALUE, max = Float.MAX_VALUE; - boolean labelCol = false; - // Parse spec line - String mincol = gcol.nextToken(); - if (mincol == "|") - { - System.err - .println("Expected either 'label' or a colour specification in the line: " - + line); - return null; - } - String maxcol = null; - if (mincol.toLowerCase().indexOf("label") == 0) - { - labelCol = true; - mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null); // skip '|' - mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null); - } - String abso = null, minval, maxval; - if (mincol != null) - { - // at least four more tokens - if (mincol.equals("|")) - { - mincol = ""; - } - else - { - gcol.nextToken(); // skip next '|' - } - // continue parsing rest of line - maxcol = gcol.nextToken(); - if (maxcol.equals("|")) - { - maxcol = ""; - } - else - { - gcol.nextToken(); // skip next '|' - } - abso = gcol.nextToken(); - gcol.nextToken(); // skip next '|' - if (abso.toLowerCase().indexOf("abso") != 0) - { - minval = abso; - abso = null; - } - else - { - minval = gcol.nextToken(); - gcol.nextToken(); // skip next '|' - } - maxval = gcol.nextToken(); - if (gcol.hasMoreTokens()) - { - gcol.nextToken(); // skip next '|' - } - try - { - if (minval.length() > 0) - { - min = Float.valueOf(minval); - } - } catch (Exception e) - { - System.err - .println("Couldn't parse the minimum value for graduated colour for type (" - + colourDescriptor - + ") - did you misspell 'auto' for the optional automatic colour switch ?"); - e.printStackTrace(); - } - try - { - if (maxval.length() > 0) - { - max = Float.valueOf(maxval); - } - } catch (Exception e) - { - System.err - .println("Couldn't parse the maximum value for graduated colour for type (" - + colourDescriptor + ")"); - e.printStackTrace(); - } - } - else - { - // add in some dummy min/max colours for the label-only - // colourscheme. - mincol = "FFFFFF"; - maxcol = "000000"; - } - - GraduatedColor colour = null; - try - { - colour = new GraduatedColor( - new UserColourScheme(mincol).findColour('A'), - new UserColourScheme(maxcol).findColour('A'), min, max); - } catch (Exception e) - { - System.err.println("Couldn't parse the graduated colour scheme (" - + colourDescriptor + ")"); - e.printStackTrace(); - } - if (colour != null) - { - colour.setColourByLabel(labelCol); - colour.setAutoScaled(abso == null); - // add in any additional parameters - String ttype = null, tval = null; - if (gcol.hasMoreTokens()) - { - // threshold type and possibly a threshold value - ttype = gcol.nextToken(); - if (ttype.toLowerCase().startsWith("below")) - { - colour.setThreshType(AnnotationColourGradient.BELOW_THRESHOLD); - } - else if (ttype.toLowerCase().startsWith("above")) - { - colour.setThreshType(AnnotationColourGradient.ABOVE_THRESHOLD); - } - else - { - colour.setThreshType(AnnotationColourGradient.NO_THRESHOLD); - if (!ttype.toLowerCase().startsWith("no")) - { - System.err.println("Ignoring unrecognised threshold type : " - + ttype); - } - } - } - if (colour.getThreshType() != AnnotationColourGradient.NO_THRESHOLD) - { - try - { - gcol.nextToken(); - tval = gcol.nextToken(); - colour.setThresh(new Float(tval).floatValue()); - } catch (Exception e) - { - System.err.println("Couldn't parse threshold value as a float: (" - + tval + ")"); - e.printStackTrace(); - } - } - // parse the thresh-is-min token ? - if (gcol.hasMoreTokens()) - { - System.err - .println("Ignoring additional tokens in parameters in graduated colour specification\n"); - while (gcol.hasMoreTokens()) - { - System.err.println("|" + gcol.nextToken()); - } - System.err.println("\n"); - } - } - return colour; - } - - /** * clear any temporary handles used to speed up ID matching */ protected void resetMatcher() @@ -703,7 +489,7 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI * @return features file contents */ public String printJalviewFormat(SequenceI[] sequences, - Map visible) + Map visible) { return printJalviewFormat(sequences, visible, true, true); } @@ -723,7 +509,8 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI * @return features file contents */ public String printJalviewFormat(SequenceI[] sequences, - Map visible, boolean visOnly, boolean nonpos) + Map visible, boolean visOnly, + boolean nonpos) { StringBuilder out = new StringBuilder(256); boolean featuresGen = false; @@ -739,58 +526,14 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI // viewed features // TODO: decide if feature links should also be written here ? Iterator en = visible.keySet().iterator(); - String featureType, color; while (en.hasNext()) { - featureType = en.next().toString(); - - if (visible.get(featureType) instanceof GraduatedColor) - { - GraduatedColor gc = (GraduatedColor) visible.get(featureType); - color = (gc.isColourByLabel() ? "label|" : "") - + Format.getHexString(gc.getMinColor()) + "|" - + Format.getHexString(gc.getMaxColor()) - + (gc.isAutoScale() ? "|" : "|abso|") + gc.getMin() + "|" - + gc.getMax() + "|"; - if (gc.getThreshType() != AnnotationColourGradient.NO_THRESHOLD) - { - if (gc.getThreshType() == AnnotationColourGradient.BELOW_THRESHOLD) - { - color += "below"; - } - else - { - if (gc.getThreshType() != AnnotationColourGradient.ABOVE_THRESHOLD) - { - System.err.println("WARNING: Unsupported threshold type (" - + gc.getThreshType() + ") : Assuming 'above'"); - } - color += "above"; - } - // add the value - color += "|" + gc.getThresh(); - } - else - { - color += "none"; - } - } - else if (visible.get(featureType) instanceof Color) - { - color = Format.getHexString((Color) visible.get(featureType)); - } - else - { - // legacy support for integer objects containing colour triplet values - color = Format.getHexString(new Color(Integer.parseInt(visible - .get(featureType).toString()))); - } - out.append(featureType); - out.append(TAB); - out.append(color); - out.append(newline); + String featureType = en.next().toString(); + FeatureColourI colour = visible.get(featureType); + out.append(colour.toJalviewFormat(featureType)).append(newline); } } + // Work out which groups are both present and visible List groups = new ArrayList(); int groupIndex = 0; @@ -842,12 +585,12 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI features = sequences[i].getSequenceFeatures(); if (features != null) { - for (int j = 0; j < features.length; j++) + for (SequenceFeature sequenceFeature : features) { - isnonpos = features[j].begin == 0 && features[j].end == 0; + isnonpos = sequenceFeature.begin == 0 && sequenceFeature.end == 0; if ((!nonpos && isnonpos) || (!isnonpos && visOnly && !visible - .containsKey(features[j].type))) + .containsKey(sequenceFeature.type))) { // skip if feature is nonpos and we ignore them or if we only // output visible and it isn't non-pos and it's not visible @@ -855,47 +598,48 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI } if (group != null - && (features[j].featureGroup == null || !features[j].featureGroup + && (sequenceFeature.featureGroup == null || !sequenceFeature.featureGroup .equals(group))) { continue; } - if (group == null && features[j].featureGroup != null) + if (group == null && sequenceFeature.featureGroup != null) { continue; } // we have features to output featuresGen = true; - if (features[j].description == null - || features[j].description.equals("")) + if (sequenceFeature.description == null + || sequenceFeature.description.equals("")) { - out.append(features[j].type).append(TAB); + out.append(sequenceFeature.type).append(TAB); } else { - if (features[j].links != null - && features[j].getDescription().indexOf("") == -1) + if (sequenceFeature.links != null + && sequenceFeature.getDescription().indexOf("") == -1) { out.append(""); } - out.append(features[j].description + " "); - if (features[j].links != null) + out.append(sequenceFeature.description); + if (sequenceFeature.links != null) { - for (int l = 0; l < features[j].links.size(); l++) + for (int l = 0; l < sequenceFeature.links.size(); l++) { - String label = features[j].links.elementAt(l).toString(); + String label = sequenceFeature.links.elementAt(l); String href = label.substring(label.indexOf("|") + 1); label = label.substring(0, label.indexOf("|")); - if (features[j].description.indexOf(href) == -1) + if (sequenceFeature.description.indexOf(href) == -1) { - out.append("" + label + ""); + out.append(" " + label + + ""); } } - if (features[j].getDescription().indexOf("") == -1) + if (sequenceFeature.getDescription().indexOf("") == -1) { out.append(""); } @@ -905,15 +649,15 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI } out.append(sequences[i].getName()); out.append("\t-1\t"); - out.append(features[j].begin); + out.append(sequenceFeature.begin); out.append(TAB); - out.append(features[j].end); + out.append(sequenceFeature.end); out.append(TAB); - out.append(features[j].type); - if (!Float.isNaN(features[j].score)) + out.append(sequenceFeature.type); + if (!Float.isNaN(sequenceFeature.score)) { out.append(TAB); - out.append(features[j].score); + out.append(sequenceFeature.score); } out.append(newline); } @@ -1003,7 +747,7 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI * @return */ public String printGffFormat(SequenceI[] sequences, - Map visible) + Map visible) { return printGffFormat(sequences, visible, true, true); } @@ -1020,11 +764,12 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI * @return */ public String printGffFormat(SequenceI[] sequences, - Map visible, boolean outputVisibleOnly, + Map visible, boolean outputVisibleOnly, boolean includeNonPositionalFeatures) { StringBuilder out = new StringBuilder(256); - out.append(String.format("%s %d\n", GFF_VERSION, gffVersion)); + int version = gffVersion == 0 ? 2 : gffVersion; + out.append(String.format("%s %d\n", GFF_VERSION, version)); String source; boolean isnonpos; for (SequenceI seq : sequences) diff --git a/src/jalview/io/HtmlSvgOutput.java b/src/jalview/io/HtmlSvgOutput.java index e554b8e..4e1b261 100644 --- a/src/jalview/io/HtmlSvgOutput.java +++ b/src/jalview/io/HtmlSvgOutput.java @@ -51,6 +51,13 @@ public class HtmlSvgOutput AlignmentPanel ap; + private IProgressIndicator pIndicator; + + private long pSessionId; + + private boolean headless; + + public HtmlSvgOutput(File file, AlignmentPanel ap) { this.av = ap.av; @@ -61,20 +68,16 @@ public class HtmlSvgOutput public void generateHtmlSvgOutput(File file) { - IProgressIndicator pIndicator = ap.alignFrame; - long pSessionId = System.currentTimeMillis(); + pIndicator = ap.alignFrame; + pSessionId = System.currentTimeMillis(); try { - boolean headless = (System.getProperty("java.awt.headless") != null && System + headless = (System.getProperty("java.awt.headless") != null && System .getProperty("java.awt.headless").equals("true")); if (file == null) { - if (pIndicator != null && !headless) - { - pIndicator.setProgressBar(MessageManager.formatMessage( - "status.waiting_for_user_to_select_output_file", "HTML"), - pSessionId); - } + setProgressMessage(MessageManager.formatMessage( + "status.waiting_for_user_to_select_output_file", "HTML")); JalviewFileChooser chooser = getHTMLChooser(); chooser.setFileView(new jalview.io.JalviewFileView()); chooser.setDialogTitle(ap.alignFrame.getTitle()); @@ -86,135 +89,164 @@ public class HtmlSvgOutput jalview.bin.Cache.setProperty("LAST_DIRECTORY", chooser .getSelectedFile().getParent()); file = chooser.getSelectedFile(); + ap.alignFrame.repaint(); } else { - - if (pIndicator != null && !headless) - { - pIndicator.setProgressBar(MessageManager.formatMessage( - "status.cancelled_image_export_operation", "HTML"), - pSessionId); - } + setProgressMessage(MessageManager.formatMessage( + "status.cancelled_image_export_operation", "HTML")); return; } } - - AlignmentDimension aDimension = ap.getAlignmentDimension(); - SVGGraphics2D g1 = new SVGGraphics2D(aDimension.getWidth(), - aDimension.getHeight()); - SVGGraphics2D g2 = new SVGGraphics2D(aDimension.getWidth(), - aDimension.getHeight()); - - String renderStyle = jalview.bin.Cache.getDefault("HTML_RENDERING", - "Prompt each time"); - - // If we need to prompt, and if the GUI is visible then - // Prompt for rendering style - if (renderStyle.equalsIgnoreCase("Prompt each time") - && !(System.getProperty("java.awt.headless") != null && System - .getProperty("java.awt.headless").equals("true"))) - { - HTMLOptions svgOption = new HTMLOptions(); - renderStyle = svgOption.getValue(); - - if (renderStyle == null || svgOption.cancelled) - { - return; - } - } - - if (renderStyle.equalsIgnoreCase("lineart")) - { - g1.setRenderingHint(SVGHints.KEY_DRAW_STRING_TYPE, - SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR); - g2.setRenderingHint(SVGHints.KEY_DRAW_STRING_TYPE, - SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR); - } - printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0, g1, - g2); - - String titleSvgData = g1.getSVGDocument(); - String alignSvgData = g2.getSVGDocument(); - String jsonData = null; - boolean isEmbbedBioJSON = Boolean.valueOf(jalview.bin.Cache - .getDefault("EXPORT_EMBBED_BIOJSON", "true")); - if (isEmbbedBioJSON) + } catch (Exception e) + { + pIndicator.setProgressBar(MessageManager.formatMessage( + "info.error_creating_file", "HTML"), pSessionId); + e.printStackTrace(); + return; + } + final File fileX = file; + new Thread() + { + @Override + public void run() { - AlignExportSettingI exportSettings = new AlignExportSettingI() + try { - @Override - public boolean isExportHiddenSequences() + setProgressMessage(null); + setProgressMessage(MessageManager +.formatMessage( + "status.exporting_alignment_as_x_file", "HTML")); + AlignmentDimension aDimension = ap.getAlignmentDimension(); + SVGGraphics2D g1 = new SVGGraphics2D(aDimension.getWidth(), + aDimension.getHeight()); + SVGGraphics2D g2 = new SVGGraphics2D(aDimension.getWidth(), + aDimension.getHeight()); + + String renderStyle = jalview.bin.Cache.getDefault( + "HTML_RENDERING", "Prompt each time"); + + // If we need to prompt, and if the GUI is visible then + // Prompt for rendering style + if (renderStyle.equalsIgnoreCase("Prompt each time") + && !(System.getProperty("java.awt.headless") != null && System + .getProperty("java.awt.headless").equals("true"))) { - return true; + HTMLOptions svgOption = new HTMLOptions(); + renderStyle = svgOption.getValue(); + + if (renderStyle == null || svgOption.cancelled) + { + setProgressMessage(MessageManager.formatMessage( + "status.cancelled_image_export_operation", "HTML")); + return; + } } - @Override - public boolean isExportHiddenColumns() + if (renderStyle.equalsIgnoreCase("Lineart")) { - return true; + g1.setRenderingHint(SVGHints.KEY_DRAW_STRING_TYPE, + SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR); + g2.setRenderingHint(SVGHints.KEY_DRAW_STRING_TYPE, + SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR); } - - @Override - public boolean isExportAnnotations() + printUnwrapped(aDimension.getWidth(), aDimension.getHeight(), 0, + g1, g2); + + String titleSvgData = g1.getSVGDocument(); + String alignSvgData = g2.getSVGDocument(); + String jsonData = null; + boolean isEmbbedBioJSON = Boolean.valueOf(jalview.bin.Cache + .getDefault("EXPORT_EMBBED_BIOJSON", "true")); + if (isEmbbedBioJSON) { - return true; + AlignExportSettingI exportSettings = new AlignExportSettingI() + { + @Override + public boolean isExportHiddenSequences() + { + return true; + } + + @Override + public boolean isExportHiddenColumns() + { + return true; + } + + @Override + public boolean isExportAnnotations() + { + return true; + } + + @Override + public boolean isExportFeatures() + { + return true; + } + + @Override + public boolean isExportGroups() + { + return true; + } + + @Override + public boolean isCancelled() + { + return false; + } + + }; + AlignmentExportData exportData = jalview.gui.AlignFrame + .getAlignmentForExport(JSONFile.FILE_DESC, av, + exportSettings); + jsonData = new FormatAdapter(ap, exportData.getSettings()) + .formatSequences(JSONFile.FILE_DESC, + exportData.getAlignment(), + exportData.getOmitHidden(), + exportData.getStartEndPostions(), + av.getColumnSelection()); } - - @Override - public boolean isExportFeatures() - { - return true; - } - - @Override - public boolean isExportGroups() + String htmlData = getHtml(titleSvgData, alignSvgData, jsonData); + FileOutputStream out = new FileOutputStream(fileX); + out.write(htmlData.getBytes()); + out.flush(); + out.close(); + if (!(System.getProperty("java.awt.headless") != null && System + .getProperty("java.awt.headless").equals("true"))) { - return true; + jalview.util.BrowserLauncher.openURL("file:///" + fileX); } + } catch (OutOfMemoryError err) + { + System.out.println("########################\n" + + "OUT OF MEMORY " + fileX + "\n" + + "########################"); + new OOMWarning("Creating Image for " + fileX, err); + } catch (Exception e) + { + e.printStackTrace(); + pIndicator.setProgressBar(MessageManager.formatMessage( + "info.error_creating_file", "HTML"), pSessionId); + } + setProgressMessage(MessageManager.formatMessage( + "status.export_complete", "HTML")); + } + }.start(); - @Override - public boolean isCancelled() - { - return false; - } + } - }; - AlignmentExportData exportData = jalview.gui.AlignFrame - .getAlignmentForExport(JSONFile.FILE_DESC, av, - exportSettings); - jsonData = new FormatAdapter(ap, exportData.getSettings()) - .formatSequences(JSONFile.FILE_DESC, - exportData.getAlignment(), - exportData.getOmitHidden(), - exportData.getStartEndPostions(), - av.getColumnSelection()); - } - String htmlData = getHtml(titleSvgData, alignSvgData, jsonData); - FileOutputStream out = new FileOutputStream(file); - out.write(htmlData.getBytes()); - out.flush(); - out.close(); - if (!(System.getProperty("java.awt.headless") != null && System - .getProperty("java.awt.headless").equals("true"))) - { - jalview.util.BrowserLauncher.openURL("file:///" + file); - } - if (pIndicator != null && !headless) - { - pIndicator.setProgressBar(MessageManager.formatMessage( - "status.export_complete", "HTML"), pSessionId); - } - } catch (OutOfMemoryError err) + private void setProgressMessage(String message) + { + if (pIndicator != null && !headless) { - System.out.println("########################\n" + "OUT OF MEMORY " - + file + "\n" + "########################"); - new OOMWarning("Creating Image for " + file, err); - } catch (Exception e) + pIndicator.setProgressBar(message, pSessionId); + } + else { - e.printStackTrace(); - pIndicator.setProgressBar(MessageManager.formatMessage( - "info.error_creating_file", "HTML"), pSessionId); + System.out.println(message); } } diff --git a/src/jalview/io/IdentifyFile.java b/src/jalview/io/IdentifyFile.java index 71f4237..889359f 100755 --- a/src/jalview/io/IdentifyFile.java +++ b/src/jalview/io/IdentifyFile.java @@ -230,7 +230,6 @@ public class IdentifyFile } catch (IOException ex) { } - ; if (dta != null && dta.indexOf("*") > -1) { starterm = true; @@ -250,34 +249,19 @@ public class IdentifyFile // read as a FASTA (probably) break; } - if ((data.indexOf("<") > -1)) // possible Markup Language data i.e HTML, + int lessThan = data.indexOf("<"); + if ((lessThan > -1)) // possible Markup Language data i.e HTML, // RNAML, XML { - // FIXME this is nuts - it consumes the rest of the file if no match - boolean identified = false; - do - { - if (data.matches("<(?i)html(\"[^\"]*\"|'[^']*'|[^'\">])*>")) - { - reply = HtmlFile.FILE_DESC; - identified = true; - break; - } - - if (data.matches("<(?i)rnaml (\"[^\"]*\"|'[^']*'|[^'\">])*>")) - { - reply = "RNAML"; - identified = true; - break; - } - } while ((data = source.nextLine()) != null); - - if (identified) + String upper = data.toUpperCase(); + if (upper.substring(lessThan).startsWith(" prot, - AlignmentI al, - String pep, boolean b) + AlignmentI al, String pep, boolean b) { List> replaced = AlignSeq .replaceMatchingSeqsWith(seqs, annotations, prot, al, pep, @@ -259,8 +256,7 @@ public abstract class StructureFile extends AlignFile } @SuppressWarnings({ "unchecked", "rawtypes" }) - private void processWithJmolParser(List prot) - throws Exception + private void processWithJmolParser(List prot) throws Exception { try { @@ -268,19 +264,17 @@ public abstract class StructureFile extends AlignFile Class cl = Class.forName("jalview.ext.jmol.JmolParser"); if (cl != null) { - final Constructor constructor = cl -.getConstructor(new Class[] { + final Constructor constructor = cl.getConstructor(new Class[] { boolean.class, boolean.class, boolean.class, FileParse.class }); final Object[] args = new Object[] { visibleChainAnnotation, predictSecondaryStructure, externalSecondaryStructure, - new FileParse(getDataName(), - type) }; + new FileParse(getDataName(), type) }; - StructureViewSettings.setShowSeqFeatures(false); - StructureViewSettings.setVisibleChainAnnotation(false); - StructureViewSettings + StructureImportSettings.setShowSeqFeatures(false); + StructureImportSettings.setVisibleChainAnnotation(false); + StructureImportSettings .setPredictSecondaryStructure(predictSecondaryStructure); - StructureViewSettings + StructureImportSettings .setExternalSecondaryStructure(externalSecondaryStructure); Object jmf = constructor.newInstance(args); AlignmentI al = new Alignment((SequenceI[]) cl.getMethod( @@ -303,6 +297,7 @@ public abstract class StructureFile extends AlignFile } catch (ClassNotFoundException q) { } + StructureImportSettings.setShowSeqFeatures(true); } public PDBChain findChain(String id) throws Exception diff --git a/src/jalview/io/packed/JalviewDataset.java b/src/jalview/io/packed/JalviewDataset.java index 817ba9c..63263d2 100644 --- a/src/jalview/io/packed/JalviewDataset.java +++ b/src/jalview/io/packed/JalviewDataset.java @@ -20,6 +20,7 @@ */ package jalview.io.packed; +import jalview.api.FeatureColourI; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; import jalview.io.NewickFile; @@ -57,7 +58,7 @@ public class JalviewDataset /** * @return the featureColours */ - public Map getFeatureColours() + public Map getFeatureColours() { return featureColours; } @@ -66,7 +67,7 @@ public class JalviewDataset * @param featureColours * the featureColours to set */ - public void setFeatureColours(Map featureColours) + public void setFeatureColours(Map featureColours) { this.featureColours = featureColours; } @@ -187,7 +188,7 @@ public class JalviewDataset /** * current set of feature colours */ - Map featureColours; + Map featureColours; /** * original identity of each sequence in results @@ -201,7 +202,7 @@ public class JalviewDataset seqDetails = new Hashtable(); al = new ArrayList(); parentDataset = null; - featureColours = new HashMap(); + featureColours = new HashMap(); } /** @@ -209,7 +210,8 @@ public class JalviewDataset * * @param parentAlignment */ - public JalviewDataset(AlignmentI aldataset, Map fc, + public JalviewDataset(AlignmentI aldataset, + Map fc, Hashtable seqDets) { // TODO not used - remove? @@ -231,7 +233,8 @@ public class JalviewDataset * (may be null) alignment to associate new annotation and trees * with. */ - public JalviewDataset(AlignmentI aldataset, Map fc, + public JalviewDataset(AlignmentI aldataset, + Map fc, Hashtable seqDets, AlignmentI parentAlignment) { this(); diff --git a/src/jalview/io/packed/ParsePackedSet.java b/src/jalview/io/packed/ParsePackedSet.java index 01369b9..71999f0 100644 --- a/src/jalview/io/packed/ParsePackedSet.java +++ b/src/jalview/io/packed/ParsePackedSet.java @@ -20,6 +20,7 @@ */ package jalview.io.packed; +import jalview.api.FeatureColourI; import jalview.datamodel.AlignmentI; import jalview.io.AppletFormatAdapter; import jalview.io.FileParse; @@ -157,7 +158,7 @@ public class ParsePackedSet // if not, create one. if (context.featureColours == null) { - context.featureColours = new HashMap(); + context.featureColours = new HashMap(); } try { diff --git a/src/jalview/jbgui/GPreferences.java b/src/jalview/jbgui/GPreferences.java index c4c737c..90053f5 100755 --- a/src/jalview/jbgui/GPreferences.java +++ b/src/jalview/jbgui/GPreferences.java @@ -201,7 +201,7 @@ public class GPreferences extends JPanel /* * Output tab components */ - protected JComboBox epsRendering = new JComboBox(); + protected JComboBox epsRendering = new JComboBox(); protected JLabel userIdWidthlabel = new JLabel(); @@ -1236,7 +1236,7 @@ public class GPreferences extends JPanel .getString("label.open_overview")); openoverv.setHorizontalAlignment(SwingConstants.RIGHT); openoverv.setHorizontalTextPosition(SwingConstants.LEFT); - openoverv.setText(MessageManager.getString(("label.open_overview"))); + openoverv.setText(MessageManager.getString("label.open_overview")); JPanel jPanel2 = new JPanel(); jPanel2.setBounds(new Rectangle(7, 17, 158, 310)); jPanel2.setLayout(new GridLayout(14, 1)); diff --git a/src/jalview/jbgui/GStructureChooser.java b/src/jalview/jbgui/GStructureChooser.java index a5b03d8..e571064 100644 --- a/src/jalview/jbgui/GStructureChooser.java +++ b/src/jalview/jbgui/GStructureChooser.java @@ -44,6 +44,8 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -61,6 +63,8 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.event.InternalFrameEvent; +import javax.swing.table.TableColumn; @SuppressWarnings("serial") /** @@ -158,8 +162,69 @@ public abstract class GStructureChooser extends JPanel implements protected static final String VIEWS_LOCAL_PDB = "VIEWS_LOCAL_PDB"; - protected JTable tbl_summary = new JTable() + protected JTable tbl_local_pdb = new JTable(); + + protected JScrollPane scrl_localPDB = new JScrollPane(tbl_local_pdb); + + private JTabbedPane pnl_filter = new JTabbedPane(); + + protected FTSDataColumnPreferences pdbDocFieldPrefs = new FTSDataColumnPreferences( + PreferenceSource.STRUCTURE_CHOOSER, + PDBFTSRestClient.getInstance()); + + protected FTSDataColumnI[] previousWantedFields; + + protected static Map tempUserPrefs = new HashMap(); + + private JTable tbl_summary = new JTable() { + private boolean inLayout; + + @Override + public boolean getScrollableTracksViewportWidth() + { + return hasExcessWidth(); + + } + + @Override + public void doLayout() + { + if (hasExcessWidth()) + { + autoResizeMode = AUTO_RESIZE_SUBSEQUENT_COLUMNS; + } + inLayout = true; + super.doLayout(); + inLayout = false; + autoResizeMode = AUTO_RESIZE_OFF; + } + + protected boolean hasExcessWidth() + { + return getPreferredSize().width < getParent().getWidth(); + } + + @Override + public void columnMarginChanged(ChangeEvent e) + { + if (isEditing()) + { + removeEditor(); + } + TableColumn resizingColumn = getTableHeader().getResizingColumn(); + // Need to do this here, before the parent's + // layout manager calls getPreferredSize(). + if (resizingColumn != null && autoResizeMode == AUTO_RESIZE_OFF + && !inLayout) + { + resizingColumn.setPreferredWidth(resizingColumn.getWidth()); + String colHeader = resizingColumn.getHeaderValue().toString(); + tempUserPrefs.put(colHeader, resizingColumn.getWidth()); + } + resizeAndRepaint(); + } + @Override public String getToolTipText(MouseEvent evt) { @@ -190,17 +255,6 @@ public abstract class GStructureChooser extends JPanel implements protected JScrollPane scrl_foundStructures = new JScrollPane(tbl_summary); - protected JTable tbl_local_pdb = new JTable(); - - protected JScrollPane scrl_localPDB = new JScrollPane(tbl_local_pdb); - - private JTabbedPane pnl_filter = new JTabbedPane(); - - private FTSDataColumnPreferences pdbDocFieldPrefs = new FTSDataColumnPreferences( - PreferenceSource.STRUCTURE_CHOOSER, PDBFTSRestClient.getInstance()); - - protected FTSDataColumnI[] previousWantedFields; - public GStructureChooser() { try @@ -222,6 +276,10 @@ public abstract class GStructureChooser extends JPanel implements */ private void jbInit() throws Exception { + Integer width = tempUserPrefs.get("structureChooser.width") == null ? 800 + : tempUserPrefs.get("structureChooser.width"); + Integer height = tempUserPrefs.get("structureChooser.height") == null ? 400 + : tempUserPrefs.get("structureChooser.height"); tbl_summary.setAutoCreateRowSorter(true); tbl_summary.getTableHeader().setReorderingAllowed(false); tbl_summary.addMouseListener(new MouseAdapter() @@ -355,7 +413,7 @@ public abstract class GStructureChooser extends JPanel implements @Override public void actionPerformed(ActionEvent e) { - mainFrame.dispose(); + closeAction(); } }); btn_cancel.addKeyListener(new KeyAdapter() @@ -365,7 +423,7 @@ public abstract class GStructureChooser extends JPanel implements { if (evt.getKeyCode() == KeyEvent.VK_ENTER) { - mainFrame.dispose(); + closeAction(); } } }); @@ -393,11 +451,9 @@ public abstract class GStructureChooser extends JPanel implements } }); - scrl_foundStructures.setPreferredSize(new Dimension(500, 300)); - scrl_foundStructures - .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrl_foundStructures.setPreferredSize(new Dimension(width, height)); - scrl_localPDB.setPreferredSize(new Dimension(500, 300)); + scrl_localPDB.setPreferredSize(new Dimension(width, height)); scrl_localPDB .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); @@ -405,9 +461,8 @@ public abstract class GStructureChooser extends JPanel implements chk_invertFilter.setFont(new java.awt.Font("Verdana", 0, 12)); chk_rememberSettings.setFont(new java.awt.Font("Verdana", 0, 12)); chk_rememberSettings.setVisible(false); - - txt_search.setToolTipText(MessageManager - .getString("label.enter_pdb_id")); + txt_search.setToolTipText(JvSwingUtils.wrapTooltip(true, + MessageManager.getString("label.enter_pdb_id"))); cmb_filterOption.setToolTipText(MessageManager .getString("info.select_filter_option")); txt_search.getDocument().addDocumentListener(new DocumentListener() @@ -474,9 +529,9 @@ public abstract class GStructureChooser extends JPanel implements btn_cancel.setEnabled(false); btn_view.setVisible(false); btn_cancel.setVisible(false); - previousWantedFields = PDBFTSRestClient.getInstance() - .getAllDefaulDisplayedDataColumns() - .toArray(new FTSDataColumnI[0]); + previousWantedFields = pdbDocFieldPrefs + .getStructureSummaryFields().toArray( + new FTSDataColumnI[0]); } if (sourceTabbedPane.getTitleAt(index) .equals(foundStructureSummary)) @@ -494,7 +549,7 @@ public abstract class GStructureChooser extends JPanel implements } }; pnl_filter.addChangeListener(changeListener); - pnl_filter.setPreferredSize(new Dimension(500, 300)); + pnl_filter.setPreferredSize(new Dimension(width, height)); pnl_filter.add(foundStructureSummary, scrl_foundStructures); pnl_filter.add(configureCols, pdbDocFieldPrefs); @@ -515,24 +570,52 @@ public abstract class GStructureChooser extends JPanel implements statusPanel.add(statusBar, null); this.add(pnl_actionsAndStatus, java.awt.BorderLayout.SOUTH); + mainFrame + .addInternalFrameListener(new javax.swing.event.InternalFrameAdapter() + { + @Override + public void internalFrameClosing(InternalFrameEvent e) + { + closeAction(); + } + }); mainFrame.setVisible(true); mainFrame.setContentPane(this); mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - Desktop.addInternalFrame(mainFrame, frameTitle, 800, 400); + Integer x = tempUserPrefs.get("structureChooser.x"); + Integer y = tempUserPrefs.get("structureChooser.y"); + if (x != null && y != null) + { + mainFrame.setLocation(x, y); + } + Desktop.addInternalFrame(mainFrame, frameTitle, width, height); } + protected void closeAction() + { + // System.out.println(">>>>>>>>>> closing internal frame!!!"); + // System.out.println("width : " + mainFrame.getWidth()); + // System.out.println("heigh : " + mainFrame.getHeight()); + // System.out.println("x : " + mainFrame.getX()); + // System.out.println("y : " + mainFrame.getY()); + tempUserPrefs.put("structureChooser.width", pnl_filter.getWidth()); + tempUserPrefs.put("structureChooser.height", pnl_filter.getHeight()); + tempUserPrefs.put("structureChooser.x", mainFrame.getX()); + tempUserPrefs.put("structureChooser.y", mainFrame.getY()); + mainFrame.dispose(); + } public boolean wantedFieldsUpdated() { if (previousWantedFields == null) { return true; } - - return Arrays.equals( - PDBFTSRestClient.getInstance() - .getAllDefaulDisplayedDataColumns() - .toArray(new FTSDataColumnI[0]), - previousWantedFields) ? false : true; + + FTSDataColumnI[] currentWantedFields = pdbDocFieldPrefs + .getStructureSummaryFields() + .toArray(new FTSDataColumnI[0]); + return Arrays.equals(currentWantedFields, previousWantedFields) ? false + : true; } @@ -706,6 +789,10 @@ public abstract class GStructureChooser extends JPanel implements } } + public JTable getResultTable() + { + return tbl_summary; + } public JComboBox getCmbFilterOption() { return cmb_filterOption; diff --git a/src/jalview/renderer/ScaleRenderer.java b/src/jalview/renderer/ScaleRenderer.java new file mode 100644 index 0000000..7f1e074 --- /dev/null +++ b/src/jalview/renderer/ScaleRenderer.java @@ -0,0 +1,125 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ +package jalview.renderer; + +import jalview.api.AlignViewportI; +import jalview.datamodel.SequenceI; + +import java.util.ArrayList; +import java.util.List; + +/** + * Calculate and display alignment rulers + * + * @author jprocter + * + */ +public class ScaleRenderer +{ + /** + * calculate positions markers on the alignment ruler + * + * @param av + * @param startx + * left-most column in visible view + * @param endx + * - right-most column in visible view + * @return List { Object { .. } } Boolean: true/false for major/minor mark, + * Integer: marker position in alignment column coords, String: null + * or a String to be rendered at the position. + */ + public static List calculateMarks(AlignViewportI av, + int startx, int endx) + { + new ArrayList(); + + int scalestartx = (startx / 10) * 10; + + SequenceI refSeq = av.getAlignment().getSeqrep(); + int refSp = 0, refStartI = 0, refEndI = -1; + if (refSeq != null) + { + // find bounds and set origin appopriately + // locate first visible position for this sequence + int[] refbounds = av.getColumnSelection() + .locateVisibleBoundsOfSequence(refSeq); + + refSp = refbounds[0]; + refStartI = refbounds[4]; + refEndI = refbounds[5]; + scalestartx = refSp + ((scalestartx - refSp) / 10) * 10; + } + + if (refSeq == null && scalestartx % 10 == 0) + { + scalestartx += 5; + } + List marks = new ArrayList(); + String string; + int refN, iadj; + // todo: add a 'reference origin column' to set column number relative to + for (int i = scalestartx; i < endx; i += 5) + { + Object[] amark = new Object[3]; + if (((i - refSp) % 10) == 0) + { + if (refSeq == null) + { + iadj = av.getColumnSelection().adjustForHiddenColumns(i - 1) + 1; + string = String.valueOf(iadj); + } + else + { + iadj = av.getColumnSelection().adjustForHiddenColumns(i - 1); + refN = refSeq.findPosition(iadj); + // TODO show bounds if position is a gap + // - ie L--R -> "1L|2R" for + // marker + if (iadj < refStartI) + { + string = String.valueOf(iadj - refStartI); + } + else if (iadj > refEndI) + { + string = "+" + String.valueOf(iadj - refEndI); + } + else + { + string = String.valueOf(refN) + refSeq.getCharAt(iadj); + } + } + amark[0] = Boolean.TRUE; + amark[1] = Integer.valueOf(i - startx - 1); + amark[2] = string; + + } + else + { + amark[0] = Boolean.FALSE; + amark[1] = Integer.valueOf(i - startx - 1); + amark[2] = null; + } + marks.add(amark); + } + return marks; + } + +} diff --git a/src/jalview/renderer/seqfeatures/FeatureRenderer.java b/src/jalview/renderer/seqfeatures/FeatureRenderer.java index 2276913..5d3aa2d 100644 --- a/src/jalview/renderer/seqfeatures/FeatureRenderer.java +++ b/src/jalview/renderer/seqfeatures/FeatureRenderer.java @@ -50,6 +50,8 @@ public class FeatureRenderer extends FeatureRendererModel boolean av_validCharWidth, av_isShowSeqFeatureHeight; + private Integer currentColour; + protected void updateAvConfig() { av_charHeight = av.getCharHeight(); @@ -175,8 +177,8 @@ public class FeatureRenderer extends FeatureRendererModel } /** - * This is used by the Molecule Viewer and Overview to get the accurate - * colourof the rendered sequence + * This is used by the Molecule Viewer and Overview to get the accurate colour + * of the rendered sequence */ public synchronized int findFeatureColour(int initialCol, final SequenceI seq, int column) @@ -246,7 +248,7 @@ public class FeatureRenderer extends FeatureRendererModel } else { - return ((Integer) currentColour).intValue(); + return currentColour.intValue(); } } @@ -390,7 +392,7 @@ public class FeatureRenderer extends FeatureRendererModel } - if (transparency != 1.0f && g != null && transparencyAvailable) + if (transparency != 1.0f && g != null) { Graphics2D g2 = (Graphics2D) g; g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, @@ -398,19 +400,6 @@ public class FeatureRenderer extends FeatureRendererModel } } - boolean transparencyAvailable = true; - - protected void setTransparencyAvailable(boolean isTransparencyAvailable) - { - transparencyAvailable = isTransparencyAvailable; - } - - @Override - public boolean isTransparencyAvailable() - { - return transparencyAvailable; - } - /** * Called when alignment in associated view has new/modified features to * discover and display. diff --git a/src/jalview/schemabinding/version2/.castor.cdr b/src/jalview/schemabinding/version2/.castor.cdr index 361fb7c..0a01103 100644 --- a/src/jalview/schemabinding/version2/.castor.cdr +++ b/src/jalview/schemabinding/version2/.castor.cdr @@ -1,4 +1,4 @@ -#Thu Sep 03 10:55:37 BST 2015 +#Mon Jun 20 15:44:52 BST 2016 jalview.schemabinding.version2.ThresholdLine=jalview.schemabinding.version2.descriptors.ThresholdLineDescriptor jalview.schemabinding.version2.SequenceSetProperties=jalview.schemabinding.version2.descriptors.SequenceSetPropertiesDescriptor jalview.schemabinding.version2.StructureState=jalview.schemabinding.version2.descriptors.StructureStateDescriptor diff --git a/src/jalview/schemabinding/version2/JSeq.java b/src/jalview/schemabinding/version2/JSeq.java index 9ca6708..7c6308e 100644 --- a/src/jalview/schemabinding/version2/JSeq.java +++ b/src/jalview/schemabinding/version2/JSeq.java @@ -72,6 +72,16 @@ public class JSeq implements java.io.Serializable private boolean _has_hidden; /** + * Field _viewreference. + */ + private boolean _viewreference; + + /** + * keeps track of state for field: _viewreference + */ + private boolean _has_viewreference; + + /** * Field _featuresList. */ private java.util.Vector _featuresList; @@ -256,6 +266,13 @@ public class JSeq implements java.io.Serializable } /** + */ + public void deleteViewreference() + { + this._has_viewreference = false; + } + + /** * Method enumerateFeatures. * * @return an Enumeration over all jalview.schemabinding.version2.Features @@ -549,6 +566,16 @@ public class JSeq implements java.io.Serializable } /** + * Returns the value of field 'viewreference'. + * + * @return the value of field 'Viewreference'. + */ + public boolean getViewreference() + { + return this._viewreference; + } + + /** * Method hasColour. * * @return true if at least one Colour has been added @@ -589,6 +616,16 @@ public class JSeq implements java.io.Serializable } /** + * Method hasViewreference. + * + * @return true if at least one Viewreference has been added + */ + public boolean hasViewreference() + { + return this._has_viewreference; + } + + /** * Returns the value of field 'hidden'. * * @return the value of field 'Hidden'. @@ -616,6 +653,16 @@ public class JSeq implements java.io.Serializable } /** + * Returns the value of field 'viewreference'. + * + * @return the value of field 'Viewreference'. + */ + public boolean isViewreference() + { + return this._viewreference; + } + + /** * * * @param out @@ -1004,6 +1051,18 @@ public class JSeq implements java.io.Serializable } /** + * Sets the value of field 'viewreference'. + * + * @param viewreference + * the value of field 'viewreference'. + */ + public void setViewreference(final boolean viewreference) + { + this._viewreference = viewreference; + this._has_viewreference = true; + } + + /** * Method unmarshal. * * @param reader diff --git a/src/jalview/schemabinding/version2/descriptors/AnnotationColoursDescriptor.java b/src/jalview/schemabinding/version2/descriptors/AnnotationColoursDescriptor.java index 1d2aad3..5739d90 100644 --- a/src/jalview/schemabinding/version2/descriptors/AnnotationColoursDescriptor.java +++ b/src/jalview/schemabinding/version2/descriptors/AnnotationColoursDescriptor.java @@ -11,6 +11,8 @@ package jalview.schemabinding.version2.descriptors; //- Imported classes and packages -/ //---------------------------------/ +import jalview.schemabinding.version2.AnnotationColours; + /** * Class AnnotationColoursDescriptor. * diff --git a/src/jalview/schemabinding/version2/descriptors/FeaturesDescriptor.java b/src/jalview/schemabinding/version2/descriptors/FeaturesDescriptor.java index a7ffaba..107c06d 100644 --- a/src/jalview/schemabinding/version2/descriptors/FeaturesDescriptor.java +++ b/src/jalview/schemabinding/version2/descriptors/FeaturesDescriptor.java @@ -11,6 +11,8 @@ package jalview.schemabinding.version2.descriptors; //- Imported classes and packages -/ //---------------------------------/ +import jalview.schemabinding.version2.Features; + /** * Class FeaturesDescriptor. * diff --git a/src/jalview/schemabinding/version2/descriptors/JSeqDescriptor.java b/src/jalview/schemabinding/version2/descriptors/JSeqDescriptor.java index 0f000bb..28f23b26 100644 --- a/src/jalview/schemabinding/version2/descriptors/JSeqDescriptor.java +++ b/src/jalview/schemabinding/version2/descriptors/JSeqDescriptor.java @@ -334,6 +334,61 @@ public class JSeqDescriptor extends fieldValidator.setValidator(typeValidator); } desc.setValidator(fieldValidator); + // -- _viewreference + desc = new org.exolab.castor.xml.util.XMLFieldDescriptorImpl( + java.lang.Boolean.TYPE, "_viewreference", "viewreference", + org.exolab.castor.xml.NodeType.Attribute); + handler = new org.exolab.castor.xml.XMLFieldHandler() + { + public java.lang.Object getValue(java.lang.Object object) + throws IllegalStateException + { + JSeq target = (JSeq) object; + if (!target.hasViewreference()) + { + return null; + } + return (target.getViewreference() ? java.lang.Boolean.TRUE + : java.lang.Boolean.FALSE); + } + + public void setValue(java.lang.Object object, java.lang.Object value) + throws IllegalStateException, IllegalArgumentException + { + try + { + JSeq target = (JSeq) object; + // if null, use delete method for optional primitives + if (value == null) + { + target.deleteViewreference(); + return; + } + target.setViewreference(((java.lang.Boolean) value) + .booleanValue()); + } catch (java.lang.Exception ex) + { + throw new IllegalStateException(ex.toString()); + } + } + + public java.lang.Object newInstance(java.lang.Object parent) + { + return null; + } + }; + desc.setHandler(handler); + desc.setMultivalued(false); + addFieldDescriptor(desc); + + // -- validation code for: _viewreference + fieldValidator = new org.exolab.castor.xml.FieldValidator(); + { // -- local scope + org.exolab.castor.xml.validators.BooleanValidator typeValidator; + typeValidator = new org.exolab.castor.xml.validators.BooleanValidator(); + fieldValidator.setValidator(typeValidator); + } + desc.setValidator(fieldValidator); // -- initialize element descriptors // -- _featuresList diff --git a/src/jalview/schemabinding/version2/descriptors/JalviewUserColoursDescriptor.java b/src/jalview/schemabinding/version2/descriptors/JalviewUserColoursDescriptor.java index 77efa7e..d65de13 100644 --- a/src/jalview/schemabinding/version2/descriptors/JalviewUserColoursDescriptor.java +++ b/src/jalview/schemabinding/version2/descriptors/JalviewUserColoursDescriptor.java @@ -72,6 +72,7 @@ public class JalviewUserColoursDescriptor extends desc.setImmutable(true); handler = new org.exolab.castor.xml.XMLFieldHandler() { + @Override public java.lang.Object getValue(java.lang.Object object) throws IllegalStateException { @@ -79,6 +80,7 @@ public class JalviewUserColoursDescriptor extends return target.getSchemeName(); } + @Override public void setValue(java.lang.Object object, java.lang.Object value) throws IllegalStateException, IllegalArgumentException { @@ -92,6 +94,7 @@ public class JalviewUserColoursDescriptor extends } } + @Override public java.lang.Object newInstance(java.lang.Object parent) { return null; @@ -119,6 +122,7 @@ public class JalviewUserColoursDescriptor extends desc.setImmutable(true); handler = new org.exolab.castor.xml.XMLFieldHandler() { + @Override public java.lang.Object getValue(java.lang.Object object) throws IllegalStateException { @@ -126,6 +130,7 @@ public class JalviewUserColoursDescriptor extends return target.getVersion(); } + @Override public void setValue(java.lang.Object object, java.lang.Object value) throws IllegalStateException, IllegalArgumentException { @@ -139,6 +144,7 @@ public class JalviewUserColoursDescriptor extends } } + @Override public java.lang.Object newInstance(java.lang.Object parent) { return null; @@ -163,6 +169,7 @@ public class JalviewUserColoursDescriptor extends org.exolab.castor.xml.NodeType.Element); handler = new org.exolab.castor.xml.XMLFieldHandler() { + @Override public java.lang.Object getValue(java.lang.Object object) throws IllegalStateException { @@ -170,6 +177,7 @@ public class JalviewUserColoursDescriptor extends return target.getColour(); } + @Override public void setValue(java.lang.Object object, java.lang.Object value) throws IllegalStateException, IllegalArgumentException { @@ -183,6 +191,7 @@ public class JalviewUserColoursDescriptor extends } } + @Override public void resetValue(Object object) throws IllegalStateException, IllegalArgumentException { @@ -196,6 +205,7 @@ public class JalviewUserColoursDescriptor extends } } + @Override public java.lang.Object newInstance(java.lang.Object parent) { return new Colour(); @@ -222,6 +232,7 @@ public class JalviewUserColoursDescriptor extends * * @return the access mode specified for this class. */ + @Override public org.exolab.castor.mapping.AccessMode getAccessMode() { return null; @@ -232,6 +243,7 @@ public class JalviewUserColoursDescriptor extends * * @return the identity field, null if this class has no identity. */ + @Override public org.exolab.castor.mapping.FieldDescriptor getIdentity() { return super.getIdentity(); @@ -242,6 +254,7 @@ public class JalviewUserColoursDescriptor extends * * @return the Java class represented by this descriptor. */ + @Override public java.lang.Class getJavaClass() { return jalview.schemabinding.version2.JalviewUserColours.class; @@ -252,6 +265,7 @@ public class JalviewUserColoursDescriptor extends * * @return the namespace prefix to use when marshaling as XML. */ + @Override public java.lang.String getNameSpacePrefix() { return _nsPrefix; @@ -262,6 +276,7 @@ public class JalviewUserColoursDescriptor extends * * @return the namespace URI used when marshaling and unmarshaling as XML. */ + @Override public java.lang.String getNameSpaceURI() { return _nsURI; @@ -273,6 +288,7 @@ public class JalviewUserColoursDescriptor extends * @return a specific validator for the class described by this * ClassDescriptor. */ + @Override public org.exolab.castor.xml.TypeValidator getValidator() { return this; @@ -283,6 +299,7 @@ public class JalviewUserColoursDescriptor extends * * @return the XML Name for the Class being described. */ + @Override public java.lang.String getXMLName() { return _xmlName; @@ -294,6 +311,7 @@ public class JalviewUserColoursDescriptor extends * @return true if XML schema definition of this Class is that of a global * element or element with anonymous type definition. */ + @Override public boolean isElementDefinition() { return _elementDefinition; diff --git a/src/jalview/schemabinding/version2/descriptors/UserColourSchemeDescriptor.java b/src/jalview/schemabinding/version2/descriptors/UserColourSchemeDescriptor.java index ece728a..df9ab07 100644 --- a/src/jalview/schemabinding/version2/descriptors/UserColourSchemeDescriptor.java +++ b/src/jalview/schemabinding/version2/descriptors/UserColourSchemeDescriptor.java @@ -11,6 +11,8 @@ package jalview.schemabinding.version2.descriptors; //- Imported classes and packages -/ //---------------------------------/ +import jalview.schemabinding.version2.UserColourScheme; + /** * Class UserColourSchemeDescriptor. * diff --git a/src/jalview/schemabinding/version2/descriptors/VamsasModelDescriptor.java b/src/jalview/schemabinding/version2/descriptors/VamsasModelDescriptor.java index 86e6992..3e26611 100644 --- a/src/jalview/schemabinding/version2/descriptors/VamsasModelDescriptor.java +++ b/src/jalview/schemabinding/version2/descriptors/VamsasModelDescriptor.java @@ -11,6 +11,8 @@ package jalview.schemabinding.version2.descriptors; //- Imported classes and packages -/ //---------------------------------/ +import jalview.schemabinding.version2.VamsasModel; + /** * Class VamsasModelDescriptor. * diff --git a/src/jalview/schemes/FeatureColour.java b/src/jalview/schemes/FeatureColour.java new file mode 100644 index 0000000..bdc70c9 --- /dev/null +++ b/src/jalview/schemes/FeatureColour.java @@ -0,0 +1,673 @@ +package jalview.schemes; + +import jalview.api.FeatureColourI; +import jalview.datamodel.SequenceFeature; +import jalview.util.Format; + +import java.awt.Color; +import java.util.StringTokenizer; + +/** + * A class that wraps either a simple colour or a graduated colour + */ +public class FeatureColour implements FeatureColourI +{ + private static final String BAR = "|"; + + final private Color colour; + + final private Color minColour; + + final private Color maxColour; + + private boolean graduatedColour; + + private boolean colourByLabel; + + private float threshold; + + private float base; + + private float range; + + private boolean belowThreshold; + + private boolean aboveThreshold; + + private boolean thresholdIsMinOrMax; + + private boolean isHighToLow; + + private boolean autoScaled; + + final private float minRed; + + final private float minGreen; + + final private float minBlue; + + final private float deltaRed; + + final private float deltaGreen; + + final private float deltaBlue; + + /** + * Parses a Jalview features file format colour descriptor + * [label|][mincolour|maxcolour + * |[absolute|]minvalue|maxvalue|thresholdtype|thresholdvalue] Examples: + *
          + *
        • red
        • + *
        • a28bbb
        • + *
        • 25,125,213
        • + *
        • label
        • + *
        • label|||0.0|0.0|above|12.5
        • + *
        • label|||0.0|0.0|below|12.5
        • + *
        • red|green|12.0|26.0|none
        • + *
        • a28bbb|3eb555|12.0|26.0|above|12.5
        • + *
        • a28bbb|3eb555|abso|12.0|26.0|below|12.5
        • + *
        + * + * @param descriptor + * @return + * @throws IllegalArgumentException + * if not parseable + */ + public static FeatureColour parseJalviewFeatureColour(String descriptor) + { + StringTokenizer gcol = new StringTokenizer(descriptor, "|", true); + float min = Float.MIN_VALUE; + float max = Float.MAX_VALUE; + boolean labelColour = false; + + String mincol = gcol.nextToken(); + if (mincol == "|") + { + throw new IllegalArgumentException( + "Expected either 'label' or a colour specification in the line: " + + descriptor); + } + String maxcol = null; + if (mincol.toLowerCase().indexOf("label") == 0) + { + labelColour = true; + mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null); + // skip '|' + mincol = (gcol.hasMoreTokens() ? gcol.nextToken() : null); + } + + if (!labelColour && !gcol.hasMoreTokens()) + { + /* + * only a simple colour specification - parse it + */ + Color colour = UserColourScheme.getColourFromString(descriptor); + if (colour == null) + { + throw new IllegalArgumentException("Invalid colour descriptor: " + + descriptor); + } + return new FeatureColour(colour); + } + + /* + * autoScaled == true: colours range over actual score range + * autoScaled == false ('abso'): colours range over min/max range + */ + boolean autoScaled = true; + String tok = null, minval, maxval; + if (mincol != null) + { + // at least four more tokens + if (mincol.equals("|")) + { + mincol = ""; + } + else + { + gcol.nextToken(); // skip next '|' + } + maxcol = gcol.nextToken(); + if (maxcol.equals("|")) + { + maxcol = ""; + } + else + { + gcol.nextToken(); // skip next '|' + } + tok = gcol.nextToken(); + gcol.nextToken(); // skip next '|' + if (tok.toLowerCase().startsWith("abso")) + { + minval = gcol.nextToken(); + gcol.nextToken(); // skip next '|' + autoScaled = false; + } + else + { + minval = tok; + } + maxval = gcol.nextToken(); + if (gcol.hasMoreTokens()) + { + gcol.nextToken(); // skip next '|' + } + try + { + if (minval.length() > 0) + { + min = new Float(minval).floatValue(); + } + } catch (Exception e) + { + throw new IllegalArgumentException( + "Couldn't parse the minimum value for graduated colour (" + + descriptor + ")"); + } + try + { + if (maxval.length() > 0) + { + max = new Float(maxval).floatValue(); + } + } catch (Exception e) + { + throw new IllegalArgumentException( + "Couldn't parse the maximum value for graduated colour (" + + descriptor + ")"); + } + } + else + { + // add in some dummy min/max colours for the label-only + // colourscheme. + mincol = "FFFFFF"; + maxcol = "000000"; + } + + /* + * construct the FeatureColour + */ + FeatureColour featureColour; + try + { + featureColour = new FeatureColour( + new UserColourScheme(mincol).findColour('A'), + new UserColourScheme(maxcol).findColour('A'), min, max); + featureColour.setColourByLabel(labelColour); + featureColour.setAutoScaled(autoScaled); + // add in any additional parameters + String ttype = null, tval = null; + if (gcol.hasMoreTokens()) + { + // threshold type and possibly a threshold value + ttype = gcol.nextToken(); + if (ttype.toLowerCase().startsWith("below")) + { + featureColour.setBelowThreshold(true); + } + else if (ttype.toLowerCase().startsWith("above")) + { + featureColour.setAboveThreshold(true); + } + else + { + if (!ttype.toLowerCase().startsWith("no")) + { + System.err.println("Ignoring unrecognised threshold type : " + + ttype); + } + } + } + if (featureColour.hasThreshold()) + { + try + { + gcol.nextToken(); + tval = gcol.nextToken(); + featureColour.setThreshold(new Float(tval).floatValue()); + } catch (Exception e) + { + System.err.println("Couldn't parse threshold value as a float: (" + + tval + ")"); + } + } + if (gcol.hasMoreTokens()) + { + System.err + .println("Ignoring additional tokens in parameters in graduated colour specification\n"); + while (gcol.hasMoreTokens()) + { + System.err.println("|" + gcol.nextToken()); + } + System.err.println("\n"); + } + return featureColour; + } catch (Exception e) + { + throw new IllegalArgumentException(e.getMessage()); + } + } + + /** + * Default constructor + */ + public FeatureColour() + { + this((Color) null); + } + + /** + * Constructor given a simple colour + * + * @param c + */ + public FeatureColour(Color c) + { + minColour = Color.WHITE; + maxColour = Color.BLACK; + minRed = 0f; + minGreen = 0f; + minBlue = 0f; + deltaRed = 0f; + deltaGreen = 0f; + deltaBlue = 0f; + colour = c; + } + + /** + * Constructor given a colour range and a score range + * + * @param low + * @param high + * @param min + * @param max + */ + public FeatureColour(Color low, Color high, float min, float max) + { + graduatedColour = true; + colour = null; + minColour = low; + maxColour = high; + threshold = Float.NaN; + isHighToLow = min >= max; + minRed = low.getRed() / 255f; + minGreen = low.getGreen() / 255f; + minBlue = low.getBlue() / 255f; + deltaRed = (high.getRed() / 255f) - minRed; + deltaGreen = (high.getGreen() / 255f) - minGreen; + deltaBlue = (high.getBlue() / 255f) - minBlue; + if (isHighToLow) + { + base = max; + range = min - max; + } + else + { + base = min; + range = max - min; + } + } + + /** + * Copy constructor + * + * @param fc + */ + public FeatureColour(FeatureColour fc) + { + graduatedColour = fc.graduatedColour; + colour = fc.colour; + minColour = fc.minColour; + maxColour = fc.maxColour; + minRed = fc.minRed; + minGreen = fc.minGreen; + minBlue = fc.minBlue; + deltaRed = fc.deltaRed; + deltaGreen = fc.deltaGreen; + deltaBlue = fc.deltaBlue; + base = fc.base; + range = fc.range; + isHighToLow = fc.isHighToLow; + setAboveThreshold(fc.isAboveThreshold()); + setBelowThreshold(fc.isBelowThreshold()); + setThreshold(fc.getThreshold()); + setAutoScaled(fc.isAutoScaled()); + setColourByLabel(fc.isColourByLabel()); + } + + /** + * Copy constructor with new min/max ranges + * @param fc + * @param min + * @param max + */ + public FeatureColour(FeatureColour fc, float min, float max) + { + this(fc); + graduatedColour = true; + updateBounds(min, max); + } + + @Override + public boolean isGraduatedColour() + { + return graduatedColour; + } + + /** + * Sets the 'graduated colour' flag. If true, also sets 'colour by label' to + * false. + */ + void setGraduatedColour(boolean b) + { + graduatedColour = b; + if (b) + { + setColourByLabel(false); + } + } + + @Override + public Color getColour() + { + return colour; + } + + @Override + public Color getMinColour() + { + return minColour; + } + + @Override + public Color getMaxColour() + { + return maxColour; + } + + @Override + public boolean isColourByLabel() + { + return colourByLabel; + } + + /** + * Sets the 'colour by label' flag. If true, also sets 'graduated colour' to + * false. + */ + @Override + public void setColourByLabel(boolean b) + { + colourByLabel = b; + if (b) + { + setGraduatedColour(false); + } + } + @Override + public boolean isBelowThreshold() + { + return belowThreshold; + } + + @Override + public void setBelowThreshold(boolean b) + { + belowThreshold = b; + if (b) + { + setAboveThreshold(false); + } + } + + @Override + public boolean isAboveThreshold() + { + return aboveThreshold; + } + + @Override + public void setAboveThreshold(boolean b) + { + aboveThreshold = b; + if (b) + { + setBelowThreshold(false); + } + } + + @Override + public boolean isThresholdMinMax() + { + return thresholdIsMinOrMax; + } + + @Override + public void setThresholdMinMax(boolean b) + { + thresholdIsMinOrMax = b; + } + + @Override + public float getThreshold() + { + return threshold; + } + + @Override + public void setThreshold(float f) + { + threshold = f; + } + + @Override + public boolean isAutoScaled() + { + return autoScaled; + } + + @Override + public void setAutoScaled(boolean b) + { + this.autoScaled = b; + } + + /** + * Updates the base and range appropriately for the given minmax range + * + * @param min + * @param max + */ + @Override + public void updateBounds(float min, float max) + { + if (max < min) + { + base = max; + range = min - max; + isHighToLow = true; + } + else + { + base = min; + range = max - min; + isHighToLow = false; + } + } + + /** + * Returns the colour for the given instance of the feature. This may be a + * simple colour, a colour generated from the feature description (if + * isColourByLabel()), or a colour derived from the feature score (if + * isGraduatedColour()). + * + * @param feature + * @return + */ + @Override + public Color getColor(SequenceFeature feature) + { + if (isColourByLabel()) + { + return UserColourScheme + .createColourFromName(feature.getDescription()); + } + + if (!isGraduatedColour()) + { + return getColour(); + } + + // todo should we check for above/below threshold here? + if (range == 0.0) + { + return getMaxColour(); + } + float scr = feature.getScore(); + if (Float.isNaN(scr)) + { + return getMinColour(); + } + float scl = (scr - base) / range; + if (isHighToLow) + { + scl = -scl; + } + if (scl < 0f) + { + scl = 0f; + } + if (scl > 1f) + { + scl = 1f; + } + return new Color(minRed + scl * deltaRed, minGreen + scl * deltaGreen, minBlue + scl * deltaBlue); + } + + /** + * Returns the maximum score of the graduated colour range + * + * @return + */ + @Override + public float getMax() + { + // regenerate the original values passed in to the constructor + return (isHighToLow) ? base : (base + range); + } + + /** + * Returns the minimum score of the graduated colour range + * + * @return + */ + @Override + public float getMin() + { + // regenerate the original value passed in to the constructor + return (isHighToLow) ? (base + range) : base; + } + + /** + * Answers true if the feature has a simple colour, or is coloured by label, + * or has a graduated colour and the score of this feature instance is within + * the range to render (if any), i.e. does not lie below or above any + * threshold set. + * + * @param feature + * @return + */ + @Override + public boolean isColored(SequenceFeature feature) + { + if (isColourByLabel() || !isGraduatedColour()) + { + return true; + } + + float val = feature.getScore(); + if (Float.isNaN(val)) + { + return true; + } + if (Float.isNaN(this.threshold)) + { + return true; + } + + if (isAboveThreshold() && val <= threshold) + { + return false; + } + if (isBelowThreshold() && val >= threshold) + { + return false; + } + return true; + } + + @Override + public boolean isSimpleColour() + { + return (!isColourByLabel() && !isGraduatedColour()); + } + + @Override + public boolean hasThreshold() + { + return isAboveThreshold() || isBelowThreshold(); + } + + @Override + public String toJalviewFormat(String featureType) + { + String colourString = null; + if (isSimpleColour()) + { + colourString = Format.getHexString(getColour()); + } + else + { + StringBuilder sb = new StringBuilder(32); + if (isColourByLabel()) + { + sb.append("label"); + if (hasThreshold()) + { + sb.append(BAR).append(BAR).append(BAR); + } + } + if (isGraduatedColour()) + { + sb.append(Format.getHexString(getMinColour())).append(BAR); + sb.append(Format.getHexString(getMaxColour())).append(BAR); + if (!isAutoScaled()) + { + sb.append("abso").append(BAR); + } + } + if (hasThreshold() || isGraduatedColour()) + { + sb.append(getMin()).append(BAR); + sb.append(getMax()).append(BAR); + if (isBelowThreshold()) + { + sb.append("below").append(BAR).append(getThreshold()); + } + else if (isAboveThreshold()) + { + sb.append("above").append(BAR).append(getThreshold()); + } + else + { + sb.append("none"); + } + } + colourString = sb.toString(); + } + return String.format("%s\t%s", featureType, colourString); + } + +} diff --git a/src/jalview/schemes/FeatureColourAdapter.java b/src/jalview/schemes/FeatureColourAdapter.java deleted file mode 100644 index a86bee4..0000000 --- a/src/jalview/schemes/FeatureColourAdapter.java +++ /dev/null @@ -1,73 +0,0 @@ -package jalview.schemes; - -import jalview.api.FeatureColourI; - -import java.awt.Color; - -/** - * A convenience class with implementations of FeatureColourI methods. Override - * methods as required in subclasses. - */ -public class FeatureColourAdapter implements FeatureColourI -{ - @Override - public boolean isGraduatedColour() - { - return isColourByLabel() || isAboveThreshold() || isBelowThreshold(); - } - - @Override - public Color getColour() - { - return Color.BLACK; - } - - @Override - public Color getMinColour() - { - return Color.WHITE; - } - - @Override - public Color getMaxColour() - { - return Color.BLACK; - } - - @Override - public boolean isColourByLabel() - { - return false; - } - - @Override - public boolean isBelowThreshold() - { - return false; - } - - @Override - public boolean isAboveThreshold() - { - return false; - } - - @Override - public boolean isThresholdMinMax() - { - return false; - } - - @Override - public float getThreshold() - { - return 0f; - } - - @Override - public boolean isLowToHigh() - { - return true; - } - -} diff --git a/src/jalview/schemes/GraduatedColor.java b/src/jalview/schemes/GraduatedColor.java deleted file mode 100644 index 2d1c572..0000000 --- a/src/jalview/schemes/GraduatedColor.java +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * This file is part of Jalview. - * - * Jalview is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 - * of the License, or (at your option) any later version. - * - * Jalview is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Jalview. If not, see . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.schemes; - -import jalview.api.FeatureColourI; -import jalview.datamodel.SequenceFeature; - -import java.awt.Color; - -/** - * Value and/or thresholded colour scale used for colouring by annotation and - * feature score - * - * @author JimP - * - */ -public class GraduatedColor -{ - int thresholdState = AnnotationColourGradient.NO_THRESHOLD; // or - // ABOVE_THRESHOLD - // or - // BELOW_THRESHOLD - - float lr, lg, lb, dr, dg, db; - - /** - * linear scaling parameters, base, minimum colour threshold, range of linear - * scale from lower to upper - */ - float base, range, thrsh; - - /** - * when true, colour from u to u-d rather than u to u+d - */ - boolean tolow = false; - - /** - * when false, min/max range has been manually set so should not be - * dynamically adjusted. - */ - boolean autoScale = true; - - /** - * construct a graduatedColor object from simple parameters - * - * @param low - * @param high - * @param min - * @param max - * color low->high from min->max - */ - public GraduatedColor(Color low, Color high, float min, float max) - { - thrsh = Float.NaN; - tolow = min >= max; - lr = low.getRed() / 255f; - lg = low.getGreen() / 255f; - lb = low.getBlue() / 255f; - dr = (high.getRed() / 255f) - lr; - dg = (high.getGreen() / 255f) - lg; - db = (high.getBlue() / 255f) - lb; - if (tolow) - { - base = max; - range = min - max; - } - else - { - base = min; - range = max - min; - } - } - - public GraduatedColor(GraduatedColor oldcs) - { - lr = oldcs.lr; - lg = oldcs.lg; - lb = oldcs.lb; - dr = oldcs.dr; - dg = oldcs.dg; - db = oldcs.db; - base = oldcs.base; - range = oldcs.range; - tolow = oldcs.tolow; - thresholdState = oldcs.thresholdState; - thrsh = oldcs.thrsh; - autoScale = oldcs.autoScale; - colourByLabel = oldcs.colourByLabel; - } - - /** - * make a new gradient from an old one with a different scale range - * - * @param oldcs - * @param min - * @param max - */ - public GraduatedColor(GraduatedColor oldcs, float min, float max) - { - this(oldcs); - updateBounds(min, max); - } - - public GraduatedColor(FeatureColourI col) - { - setColourByLabel(col.isColourByLabel()); - } - - public Color getMinColor() - { - return new Color(lr, lg, lb); - } - - public Color getMaxColor() - { - return new Color(lr + dr, lg + dg, lb + db); - } - - /** - * - * @return true if original min/max scale was from high to low - */ - public boolean getTolow() - { - return tolow; - } - - public void setTolow(boolean tolower) - { - tolow = tolower; - } - - public boolean isColored(SequenceFeature feature) - { - float val = feature.getScore(); - if (Float.isNaN(val)) - { - return true; - } - if (this.thresholdState == AnnotationColourGradient.NO_THRESHOLD) - { - return true; - } - if (Float.isNaN(this.thrsh)) - { - return true; - } - boolean rtn = thresholdState == AnnotationColourGradient.ABOVE_THRESHOLD; - if (val <= thrsh) - { - return !rtn; // ? !tolow : tolow; - } - else - { - return rtn; // ? tolow : !tolow; - } - } - - /** - * default implementor of a getColourFromString method. TODO: abstract an - * interface enabling pluggable colour from string - */ - private UserColourScheme ucs = null; - - private boolean colourByLabel = false; - - /** - * - * @return true if colourByLabel style is set - */ - public boolean isColourByLabel() - { - return colourByLabel; - } - - /** - * @param colourByLabel - * the colourByLabel to set - */ - public void setColourByLabel(boolean colourByLabel) - { - this.colourByLabel = colourByLabel; - } - - public Color findColor(SequenceFeature feature) - { - if (colourByLabel) - { - // TODO: allow user defined feature label colourschemes. Colour space is - // {type,regex,%anytype%}x{description string, regex, keyword} - if (ucs == null) - { - ucs = new UserColourScheme(); - } - return ucs.createColourFromName(feature.getDescription()); - } - if (range == 0.0) - { - return getMaxColor(); - } - float scr = feature.getScore(); - if (Float.isNaN(scr)) - { - return getMinColor(); - } - float scl = (scr - base) / range; - if (tolow) - { - scl = -scl; - } - if (scl < 0f) - { - scl = 0f; - } - if (scl > 1f) - { - scl = 1f; - } - return new Color(lr + scl * dr, lg + scl * dg, lb + scl * db); - } - - public void setThresh(float value) - { - thrsh = value; - } - - public float getThresh() - { - return thrsh; - } - - public void setThreshType(int aboveThreshold) - { - thresholdState = aboveThreshold; - } - - public int getThreshType() - { - return thresholdState; - } - - public float getMax() - { - // regenerate the original values passed in to the constructor - return (tolow) ? base : (base + range); - } - - public float getMin() - { - // regenerate the original value passed in to the constructor - return (tolow) ? (base + range) : base; - } - - public boolean isAutoScale() - { - return autoScale; - } - - public void setAutoScaled(boolean autoscale) - { - autoScale = autoscale; - } - - /** - * update the base and range appropriatly for the given minmax range - * - * @param a - * float[] {min,max} array containing minmax range for the associated - * score values - */ - public void updateBounds(float min, float max) - { - if (max < min) - { - base = max; - range = min - max; - tolow = true; - } - else - { - base = min; - range = max - min; - tolow = false; - } - } -} diff --git a/src/jalview/schemes/RNAHelicesColour.java b/src/jalview/schemes/RNAHelicesColour.java index d17f510..9729a83 100644 --- a/src/jalview/schemes/RNAHelicesColour.java +++ b/src/jalview/schemes/RNAHelicesColour.java @@ -91,6 +91,10 @@ public class RNAHelicesColour extends ResidueColourScheme // This loop will find the first rna structure annotation by which to colour // the sequences. AlignmentAnnotation[] annotations = alignment.getAlignmentAnnotation(); + if (annotations == null) + { + return; + } for (int i = 0; i < annotations.length; i++) { diff --git a/src/jalview/schemes/RNAHelicesColourChooser.java b/src/jalview/schemes/RNAHelicesColourChooser.java index 1a13bbe..b1b3c5a 100644 --- a/src/jalview/schemes/RNAHelicesColourChooser.java +++ b/src/jalview/schemes/RNAHelicesColourChooser.java @@ -22,6 +22,7 @@ package jalview.schemes; import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; +import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.SequenceGroup; import java.awt.event.ActionEvent; @@ -77,16 +78,20 @@ public class RNAHelicesColourChooser adjusting = true; Vector list = new Vector(); int index = 1; - for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++) + AlignmentAnnotation[] anns = av.getAlignment().getAlignmentAnnotation(); + if (anns != null) { - String label = av.getAlignment().getAlignmentAnnotation()[i].label; - if (!list.contains(label)) + for (int i = 0; i < anns.length; i++) { - list.addElement(label); - } - else - { - list.addElement(label + "_" + (index++)); + String label = anns[i].label; + if (!list.contains(label)) + { + list.addElement(label); + } + else + { + list.addElement(label + "_" + (index++)); + } } } diff --git a/src/jalview/schemes/UserColourScheme.java b/src/jalview/schemes/UserColourScheme.java index b1e4d58..9ae14ca 100755 --- a/src/jalview/schemes/UserColourScheme.java +++ b/src/jalview/schemes/UserColourScheme.java @@ -101,6 +101,10 @@ public class UserColourScheme extends ResidueColourScheme public static Color getColourFromString(String colour) { + if (colour == null) + { + return null; + } colour = colour.trim(); Color col = null; @@ -136,7 +140,7 @@ public class UserColourScheme extends ResidueColourScheme } - public Color createColourFromName(String name) + public static Color createColourFromName(String name) { int r, g, b; diff --git a/src/jalview/structure/StructureViewSettings.java b/src/jalview/structure/StructureImportSettings.java similarity index 56% rename from src/jalview/structure/StructureViewSettings.java rename to src/jalview/structure/StructureImportSettings.java index 2fcb3e5..b23fd53 100644 --- a/src/jalview/structure/StructureViewSettings.java +++ b/src/jalview/structure/StructureImportSettings.java @@ -1,9 +1,9 @@ package jalview.structure; -public class StructureViewSettings -{ - private String dbRefType; +import jalview.datamodel.DBRefSource; +public class StructureImportSettings +{ /** * set to true to add derived sequence annotations (temp factor read from * file, or computed secondary structure) to the alignment @@ -24,13 +24,17 @@ public class StructureViewSettings private static boolean showSeqFeatures = true; + private static boolean processHETATMs = false; + + private static String currentDefaultFormat = DBRefSource.PDB; + public static void addSettings(boolean addAlignmentAnnotations, boolean predictSecStr, boolean externalSecStr) { - StructureViewSettings.visibleChainAnnotation = addAlignmentAnnotations; - StructureViewSettings.predictSecStr = predictSecStr; - StructureViewSettings.externalSecondaryStructure = externalSecStr; - StructureViewSettings.showSeqFeatures = true; + StructureImportSettings.visibleChainAnnotation = addAlignmentAnnotations; + StructureImportSettings.predictSecStr = predictSecStr; + StructureImportSettings.externalSecondaryStructure = externalSecStr; + StructureImportSettings.showSeqFeatures = true; } public static boolean isVisibleChainAnnotation() @@ -41,7 +45,7 @@ public class StructureViewSettings public static void setVisibleChainAnnotation( boolean visibleChainAnnotation) { - StructureViewSettings.visibleChainAnnotation = visibleChainAnnotation; + StructureImportSettings.visibleChainAnnotation = visibleChainAnnotation; } public static boolean isPredictSecondaryStructure() @@ -52,7 +56,7 @@ public class StructureViewSettings public static void setPredictSecondaryStructure( boolean predictSecondaryStructure) { - StructureViewSettings.predictSecStr = predictSecondaryStructure; + StructureImportSettings.predictSecStr = predictSecondaryStructure; } public static boolean isExternalSecondaryStructure() @@ -63,7 +67,7 @@ public class StructureViewSettings public static void setExternalSecondaryStructure( boolean externalSecondaryStructure) { - StructureViewSettings.externalSecondaryStructure = externalSecondaryStructure; + StructureImportSettings.externalSecondaryStructure = externalSecondaryStructure; } public static boolean isShowSeqFeatures() @@ -73,7 +77,27 @@ public class StructureViewSettings public static void setShowSeqFeatures(boolean showSeqFeatures) { - StructureViewSettings.showSeqFeatures = showSeqFeatures; + StructureImportSettings.showSeqFeatures = showSeqFeatures; + } + + public static String getCurrentDefaultFormat() + { + return currentDefaultFormat; + } + + public static void setCurrentDefaultFormat(String currentDefaultFormat) + { + StructureImportSettings.currentDefaultFormat = currentDefaultFormat; + } + + public static boolean isProcessHETATMs() + { + return processHETATMs; + } + + public static void setProcessHETATMs(boolean processHETATMs) + { + StructureImportSettings.processHETATMs = processHETATMs; } } diff --git a/src/jalview/structure/StructureMapping.java b/src/jalview/structure/StructureMapping.java index 3fcb5e9..78634e0 100644 --- a/src/jalview/structure/StructureMapping.java +++ b/src/jalview/structure/StructureMapping.java @@ -159,4 +159,14 @@ public class StructureMapping } return ala_copy; } + + public String getMappingDetailsOutput() + { + return mappingDetails; + } + + public HashMap getMapping() + { + return mapping; + } } diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java index a5d9736..fb96b22 100644 --- a/src/jalview/structure/StructureSelectionManager.java +++ b/src/jalview/structure/StructureSelectionManager.java @@ -501,29 +501,67 @@ public class StructureSelectionManager if (isMapUsingSIFTs) { setProgressBar(null); - setProgressBar("Obtaining mapping with SIFTS"); + setProgressBar(MessageManager + .getString("status.obtaining_mapping_with_sifts")); jalview.datamodel.Mapping sqmpping = maxAlignseq .getMappingFromS1(false); if (targetChainId != null && !targetChainId.trim().isEmpty()) { - StructureMapping mapping = getStructureMapping(seq, pdbFile, - targetChainId, pdb, maxChain, sqmpping, maxAlignseq); - seqToStrucMapping.add(mapping); + StructureMapping siftsMapping; + try + { + siftsMapping = getStructureMapping(seq, pdbFile, targetChainId, + pdb, maxChain, sqmpping, maxAlignseq); + seqToStrucMapping.add(siftsMapping); + maxChain.makeExactMapping(maxAlignseq, seq); + maxChain.transferRESNUMFeatures(seq, null); + maxChain.transferResidueAnnotation(siftsMapping, sqmpping); + } catch (SiftsException e) + { + // fall back to NW alignment + System.err.println(e.getMessage()); + StructureMapping nwMapping = getNWMappings(seq, pdbFile, + targetChainId, maxChain, pdb, maxAlignseq); + seqToStrucMapping.add(nwMapping); + } } else { + ArrayList foundSiftsMappings = new ArrayList(); for (PDBChain chain : pdb.getChains()) { - StructureMapping mapping = getStructureMapping(seq, pdbFile, - chain.id, pdb, chain, sqmpping, maxAlignseq); - seqToStrucMapping.add(mapping); + try + { + StructureMapping siftsMapping = getStructureMapping(seq, + pdbFile, + chain.id, pdb, chain, sqmpping, maxAlignseq); + foundSiftsMappings.add(siftsMapping); + } catch (SiftsException e) + { + System.err.println(e.getMessage()); + } + } + if (!foundSiftsMappings.isEmpty()) + { + seqToStrucMapping.addAll(foundSiftsMappings); + maxChain.makeExactMapping(maxAlignseq, seq); + maxChain.transferRESNUMFeatures(seq, null); + maxChain.transferResidueAnnotation(foundSiftsMappings.get(0), + sqmpping); + } + else + { + StructureMapping nwMapping = getNWMappings(seq, pdbFile, + maxChainId, maxChain, pdb, maxAlignseq); + seqToStrucMapping.add(nwMapping); } } } else { setProgressBar(null); - setProgressBar("Obtaining mapping with NW alignment"); + setProgressBar(MessageManager + .getString("status.obtaining_mapping_with_nw_alignment")); seqToStrucMapping.add(getNWMappings(seq, pdbFile, maxChainId, maxChain, pdb, maxAlignseq)); } @@ -546,11 +584,8 @@ public class StructureSelectionManager private StructureMapping getStructureMapping(SequenceI seq, String pdbFile, String targetChainId, StructureFile pdb, PDBChain maxChain, jalview.datamodel.Mapping sqmpping, - AlignSeq maxAlignseq) + AlignSeq maxAlignseq) throws SiftsException { - String maxChainId = targetChainId; - try - { StructureMapping curChainMapping = siftsClient .getSiftsStructureMapping(seq, pdbFile, targetChainId); try @@ -565,15 +600,6 @@ public class StructureSelectionManager e.printStackTrace(); } return curChainMapping; - } catch (SiftsException e) - { - System.err.println(e.getMessage()); - System.err.println(">>> Now switching mapping with NW alignment..."); - setProgressBar(null); - setProgressBar(">>> Now switching mapping with NW alignment..."); - return getNWMappings(seq, pdbFile, maxChainId, maxChain, pdb, - maxAlignseq); - } } private StructureMapping getNWMappings(SequenceI seq, diff --git a/src/jalview/structures/models/AAStructureBindingModel.java b/src/jalview/structures/models/AAStructureBindingModel.java index 42fbfa9..dc42315 100644 --- a/src/jalview/structures/models/AAStructureBindingModel.java +++ b/src/jalview/structures/models/AAStructureBindingModel.java @@ -598,6 +598,10 @@ public abstract class AAStructureBindingModel extends for (String file : files) { notLoaded = file; + if (file == null) + { + continue; + } try { StructureMapping[] sm = getSsm().getMapping(file); diff --git a/src/jalview/util/Comparison.java b/src/jalview/util/Comparison.java index 5605a53..0beb45b 100644 --- a/src/jalview/util/Comparison.java +++ b/src/jalview/util/Comparison.java @@ -249,6 +249,18 @@ public class Comparison } /** + * Overloaded method signature to test whether a single sequence is nucleotide + * (that is, more than 85% CGTA) + * + * @param seq + * @return + */ + public static final boolean isNucleotide(SequenceI seq) + { + return isNucleotide(new SequenceI[] { seq }); + } + + /** * Answers true if more than 85% of the sequence residues (ignoring gaps) are * A, G, C, T or U, else false. This is just a heuristic guess and may give a * wrong answer (as AGCT are also amino acid codes). diff --git a/src/jalview/util/DBRefUtils.java b/src/jalview/util/DBRefUtils.java index 424d40b..d5d0cf5 100755 --- a/src/jalview/util/DBRefUtils.java +++ b/src/jalview/util/DBRefUtils.java @@ -67,11 +67,14 @@ public class DBRefUtils } /** + * Returns those DBRefEntry objects whose source identifier (once converted to + * Jalview's canonical form) is in the list of sources to search for. Returns + * null if no matches found. * * @param dbrefs - * array of DBRef objects to search + * DBRefEntry objects to search * @param sources - * String[] array of source DBRef IDs to retrieve + * array of sources to select * @return */ public static DBRefEntry[] selectRefs(DBRefEntry[] dbrefs, @@ -148,8 +151,8 @@ public class DBRefUtils } /** - * Returns an array of those references that match the given entry, or null if - * no matches. Currently uses a comparator which matches if + * Returns a (possibly empty) list of those references that match the given + * entry. Currently uses a comparator which matches if *
          *
        • database sources are the same
        • *
        • accession ids are the same
        • @@ -162,34 +165,35 @@ public class DBRefUtils * pattern to match * @return */ - public static DBRefEntry[] searchRefs(DBRefEntry[] ref, DBRefEntry entry) + public static List searchRefs(DBRefEntry[] ref, + DBRefEntry entry) { return searchRefs(ref, entry, matchDbAndIdAndEitherMapOrEquivalentMapList); } /** - * Returns an array of those references that match the given accession id + * Returns a list of those references that match the given accession id *
            *
          • database sources are the same
          • *
          • accession ids are the same
          • *
          • both have no mapping, or the mappings are the same
          • *
          * - * @param ref + * @param refs * Set of references to search - * @param entry - * pattern to match + * @param accId + * accession id to match * @return */ - public static DBRefEntry[] searchRefs(DBRefEntry[] ref, String accId) + public static List searchRefs(DBRefEntry[] refs, String accId) { - return searchRefs(ref, new DBRefEntry("", "", accId), matchId); + return searchRefs(refs, new DBRefEntry("", "", accId), matchId); } /** - * Returns an array of those references that match the given entry, according - * to the given comparator. Returns null if no matches. + * Returns a (possibly empty) list of those references that match the given + * entry, according to the given comparator. * * @param refs * an array of database references to search @@ -198,14 +202,14 @@ public class DBRefUtils * @param comparator * @return */ - static DBRefEntry[] searchRefs(DBRefEntry[] refs, DBRefEntry entry, + static List searchRefs(DBRefEntry[] refs, DBRefEntry entry, DbRefComp comparator) { + List rfs = new ArrayList(); if (refs == null || entry == null) { - return null; + return rfs; } - List rfs = new ArrayList(); for (int i = 0; i < refs.length; i++) { if (comparator.matches(entry, refs[i])) @@ -213,7 +217,7 @@ public class DBRefUtils rfs.add(refs[i]); } } - return rfs.size() == 0 ? null : rfs.toArray(new DBRefEntry[rfs.size()]); + return rfs; } interface DbRefComp @@ -380,9 +384,9 @@ public class DBRefUtils }; /** - * accession ID and DB must be identical. Version is ignored. No map on either - * or map but no maplist on either or maplist of map on a is equivalent to the - * maplist of map on b. + * accession ID and DB must be identical, or null on a. Version is ignored. No + * map on either or map but no maplist on either or maplist of map on a is + * equivalent to the maplist of map on b. */ public static DbRefComp matchDbAndIdAndEitherMapOrEquivalentMapList = new DbRefComp() { @@ -393,8 +397,9 @@ public class DBRefUtils && refb.getSource().equals(refa.getSource())) { // We dont care about version - if (refa.getAccessionId() != null && refb.getAccessionId() != null - && refb.getAccessionId().equals(refa.getAccessionId())) + + if (refa.getAccessionId() == null + || refa.getAccessionId().equals(refb.getAccessionId())) { if (refa.getMap() == null || refb.getMap() == null) { @@ -406,7 +411,7 @@ public class DBRefUtils || (refb.getMap().getMap() != null && refa.getMap().getMap() != null && (refb .getMap().getMap().equals(refa.getMap().getMap())))) - { // getMap().getMap().containsEither(false,refa.getMap().getMap()) + { return true; } } @@ -519,4 +524,49 @@ public class DBRefUtils return (o1 == null ? o2.equals(o1) : o1.equals(o2)); } + /** + * Selects just the DNA or protein references from a set of references + * + * @param selectDna + * if true, select references to 'standard' DNA databases, else to + * 'standard' peptide databases + * @param refs + * a set of references to select from + * @return + */ + public static DBRefEntry[] selectDbRefs(boolean selectDna, + DBRefEntry[] refs) + { + return selectRefs(refs, selectDna ? DBRefSource.DNACODINGDBS + : DBRefSource.PROTEINDBS); + // could attempt to find other cross + // refs here - ie PDB xrefs + // (not dna, not protein seq) + } + + /** + * Returns the (possibly empty) list of those supplied dbrefs which have the + * specified source database, with a case-insensitive match of source name + * + * @param dbRefs + * @param source + * @return + */ + public static List searchRefsForSource(DBRefEntry[] dbRefs, + String source) + { + List matches = new ArrayList(); + if (dbRefs != null && source != null) + { + for (DBRefEntry dbref : dbRefs) + { + if (source.equalsIgnoreCase(dbref.getSource())) + { + matches.add(dbref); + } + } + } + return matches; + } + } diff --git a/src/jalview/util/DnaUtils.java b/src/jalview/util/DnaUtils.java new file mode 100644 index 0000000..9582e2e --- /dev/null +++ b/src/jalview/util/DnaUtils.java @@ -0,0 +1,133 @@ +package jalview.util; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class DnaUtils +{ + + /** + * Parses an ENA/GenBank format location specifier and returns a list of + * [start, end] ranges. Throws an exception if not able to parse. + *

          + * Currently we do not parse "order()" specifiers, or indeterminate ranges of + * the format "<start..end" or "start..>end" or "start.end" or + * "start^end" + * + * @param location + * @return + * @throws ParseException + * if unable to parse the location (the exception message is the + * location specifier being parsed); we use ParseException in + * preference to the unchecked IllegalArgumentException + * @see http://www.insdc.org/files/feature_table.html#3.4 + */ + public static List parseLocation(String location) + throws ParseException + { + if (location.startsWith("join(")) + { + return parseJoin(location); + } + else if (location.startsWith("complement(")) + { + return parseComplement(location); + } + if (location.startsWith("order(")) + { + throw new ParseException(location, 0); + } + + /* + * try to parse m..n (or simply m) + */ + String[] range = location.split("\\.\\."); + if (range.length == 1 || range.length == 2) + { + try + { + int start = Integer.valueOf(range[0]); + int end = range.length == 1 ? start : Integer.valueOf(range[1]); + return Collections.singletonList(new int[] { start, end }); + } catch (NumberFormatException e) + { + /* + * could be a location like <1..888 or 1..>888 + */ + throw new ParseException(location, 0); + } + } + else + { + /* + * could be a location like 102.110 or 123^124 + */ + throw new ParseException(location, 0); + } + } + + /** + * Parses a complement(locationSpec) into a list of start-end ranges + * + * @param location + * @return + * @throws ParseException + */ + static List parseComplement(String location) throws ParseException + { + /* + * take what is inside complement() + */ + if (!location.endsWith(")")) + { + throw new ParseException(location, 0); + } + String toComplement = location.substring("complement(".length(), + location.length() - 1); + List ranges = parseLocation(toComplement); + + /* + * reverse the order and direction of ranges + */ + Collections.reverse(ranges); + for (int[] range : ranges) + { + int temp = range[0]; + range[0] = range[1]; + range[1] = temp; + } + return ranges; + } + + /** + * Parses a join(loc1,loc2,...,locn) into a list of start-end ranges + * + * @param location + * @return + * @throws ParseException + */ + static List parseJoin(String location) throws ParseException + { + List ranges = new ArrayList(); + + /* + * take what is inside join() + */ + if (!location.endsWith(")")) + { + throw new ParseException(location, 0); + } + String joinedLocs = location.substring("join(".length(), + location.length() - 1); + String[] locations = joinedLocs.split(","); + for (String loc : locations) + { + List range = parseLocation(loc); + ranges.addAll(range); + } + return ranges; + } + +} diff --git a/src/jalview/util/ImageMaker.java b/src/jalview/util/ImageMaker.java index b7aa4ca..fcea21d 100755 --- a/src/jalview/util/ImageMaker.java +++ b/src/jalview/util/ImageMaker.java @@ -54,6 +54,12 @@ public class ImageMaker TYPE type; + private IProgressIndicator pIndicator; + + private long pSessionId; + + private boolean headless; + public enum TYPE { EPS("EPS", MessageManager.getString("label.eps_file"), getEPSChooser()), PNG( @@ -94,17 +100,14 @@ public class ImageMaker int height, File file, String fileTitle, IProgressIndicator pIndicator, long pSessionId, boolean headless) { + this.pIndicator = pIndicator; this.type = type; - + this.pSessionId = pSessionId; + this.headless = headless; if (file == null) { - if (pIndicator != null && !headless) - { - pIndicator.setProgressBar( - MessageManager.formatMessage( - "status.waiting_for_user_to_select_output_file", - type.name), pSessionId); - } + setProgressMessage(MessageManager.formatMessage( + "status.waiting_for_user_to_select_output_file", type.name)); JalviewFileChooser chooser; chooser = type.getChooser(); chooser.setFileView(new jalview.io.JalviewFileView()); @@ -120,12 +123,8 @@ public class ImageMaker } else { - if (pIndicator != null && !headless) - { - pIndicator.setProgressBar(MessageManager.formatMessage( - "status.cancelled_image_export_operation", type.name), - pSessionId); - } + setProgressMessage(MessageManager.formatMessage( + "status.cancelled_image_export_operation", type.name)); } } @@ -134,6 +133,9 @@ public class ImageMaker try { out = new FileOutputStream(file); + setProgressMessage(null); + setProgressMessage(MessageManager.formatMessage( + "status.exporting_alignment_as_x_file", type.getName())); if (type == TYPE.SVG) { setupSVG(width, height, fileTitle); @@ -146,19 +148,13 @@ public class ImageMaker { setupPNG(width, height); } - if (pIndicator != null && !headless) - { - pIndicator.setProgressBar( -MessageManager.formatMessage( - "status.export_complete", type.getName()), - pSessionId); - } + } catch (Exception ex) { System.out.println("Error creating " + type.getName() + " file."); - pIndicator.setProgressBar(MessageManager.formatMessage( - "info.error_creating_file", type.getName()), pSessionId); + setProgressMessage(MessageManager.formatMessage( + "info.error_creating_file", type.getName())); } } } @@ -214,6 +210,8 @@ MessageManager.formatMessage( if (renderStyle == null || eps.cancelled) { + setProgressMessage(MessageManager.formatMessage( + "status.cancelled_image_export_operation", "EPS")); return; } } @@ -233,6 +231,8 @@ MessageManager.formatMessage( pg.setAccurateTextMode(accurateText); graphics = pg; + setProgressMessage(MessageManager.formatMessage( + "status.export_complete", type.getName())); } catch (Exception ex) { } @@ -245,6 +245,8 @@ MessageManager.formatMessage( Graphics2D ig2 = (Graphics2D) graphics; ig2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + setProgressMessage(MessageManager.formatMessage( + "status.export_complete", type.getName())); } @@ -268,16 +270,20 @@ MessageManager.formatMessage( if (renderStyle == null || svgOption.cancelled) { + setProgressMessage(MessageManager.formatMessage( + "status.cancelled_image_export_operation", "SVG")); return; } } - if (renderStyle.equalsIgnoreCase("lineart")) + if (renderStyle.equalsIgnoreCase("Lineart")) { ig2.setRenderingHint(SVGHints.KEY_DRAW_STRING_TYPE, SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR); } + setProgressMessage(MessageManager.formatMessage( + "status.export_complete", type.getName())); graphics = g2; } @@ -307,6 +313,14 @@ MessageManager.formatMessage( "Encapsulated Postscript"); } + private void setProgressMessage(String message) + { + if (pIndicator != null && !headless) + { + pIndicator.setProgressBar(message, pSessionId); + } + } + static JalviewFileChooser getSVGChooser() { if (Jalview.isHeadlessMode()) diff --git a/src/jalview/util/MapList.java b/src/jalview/util/MapList.java index e51442c..cae968e 100644 --- a/src/jalview/util/MapList.java +++ b/src/jalview/util/MapList.java @@ -88,8 +88,6 @@ public class MapList @Override public boolean equals(Object o) { - // TODO should also override hashCode to ensure equal objects have equal - // hashcodes if (o == null || !(o instanceof MapList)) { return false; @@ -112,6 +110,19 @@ public class MapList } /** + * Returns a hashcode made from the fromRatio, toRatio, and from/to ranges + */ + @Override + public int hashCode() + { + int hashCode = 31 * fromRatio; + hashCode = 31 * hashCode + toRatio; + hashCode = 31 * hashCode + fromShifts.toArray().hashCode(); + hashCode = 31 * hashCode + toShifts.toArray().hashCode(); + return hashCode; + } + + /** * Returns the 'from' ranges as {[start1, end1], [start2, end2], ...} * * @return @@ -215,7 +226,7 @@ public class MapList { /* * note lowest and highest values - bearing in mind the - * direction may be revesed + * direction may be reversed */ fromLowest = Math.min(fromLowest, Math.min(from[i], from[i + 1])); fromHighest = Math.max(fromHighest, Math.max(from[i], from[i + 1])); @@ -992,6 +1003,10 @@ public class MapList */ public void addMapList(MapList map) { + if (this.equals(map)) + { + return; + } this.fromLowest = Math.min(fromLowest, map.fromLowest); this.toLowest = Math.min(toLowest, map.toLowest); this.fromHighest = Math.max(fromHighest, map.fromHighest); @@ -1087,4 +1102,5 @@ public class MapList } return forwardStrand; } + } diff --git a/src/jalview/util/MappingUtils.java b/src/jalview/util/MappingUtils.java index ae4e55d..515ff51 100644 --- a/src/jalview/util/MappingUtils.java +++ b/src/jalview/util/MappingUtils.java @@ -754,6 +754,13 @@ public final class MappingUtils public static List findMappingsForSequence( SequenceI sequence, List mappings) { + return findMappingsForSequenceAndOthers(sequence, mappings, null); + } + + public static List findMappingsForSequenceAndOthers( + SequenceI sequence, List mappings, + AlignmentI alignment) + { List result = new ArrayList(); if (sequence == null || mappings == null) { @@ -763,7 +770,31 @@ public final class MappingUtils { if (mapping.involvesSequence(sequence)) { - result.add(mapping); + if (alignment != null) + { + for (SequenceI otherseq : alignment.getSequences()) + { + if (otherseq == sequence + || (otherseq.getDatasetSequence() != null && (otherseq + .getDatasetSequence() == sequence || otherseq + .getDatasetSequence() == sequence + .getDatasetSequence()))) + { + // skip sequences in subset which directly relate to sequence + continue; + } + if (mapping.involvesSequence(otherseq)) + { + // selected a mapping contained in subselect alignment + result.add(mapping); + break; + } + } + } + else + { + result.add(mapping); + } } } return result; diff --git a/src/jalview/util/Platform.java b/src/jalview/util/Platform.java index b812feb..786f5bf 100644 --- a/src/jalview/util/Platform.java +++ b/src/jalview/util/Platform.java @@ -20,6 +20,9 @@ */ package jalview.util; +import java.awt.Toolkit; +import java.awt.event.MouseEvent; + /** * System platform information used by Applet and Application * @@ -74,4 +77,11 @@ public class Platform f.append(file.substring(lastp)); return f.toString(); } + + public static boolean isControlDown(MouseEvent e) + { + return (jalview.util.Platform.isAMac() ? (Toolkit.getDefaultToolkit() + .getMenuShortcutKeyMask() & e.getModifiers()) != 0 : e + .isControlDown()); + } } diff --git a/src/jalview/util/StringUtils.java b/src/jalview/util/StringUtils.java index 6044655..ccc2012 100644 --- a/src/jalview/util/StringUtils.java +++ b/src/jalview/util/StringUtils.java @@ -299,4 +299,108 @@ public class StringUtils } return result; } + + /** + * Compares two versions formatted as e.g. "3.4.5" and returns -1, 0 or 1 as + * the first version precedes, is equal to, or follows the second + * + * @param v1 + * @param v2 + * @return + */ + public static int compareVersions(String v1, String v2) + { + return compareVersions(v1, v2, null); + } + + /** + * Compares two versions formatted as e.g. "3.4.5b1" and returns -1, 0 or 1 as + * the first version precedes, is equal to, or follows the second + * + * @param v1 + * @param v2 + * @param pointSeparator + * a string used to delimit point increments in sub-tokens of the + * version + * @return + */ + public static int compareVersions(String v1, String v2, + String pointSeparator) + { + if (v1 == null || v2 == null) + { + return 0; + } + String[] toks1 = v1.split("\\."); + String[] toks2 = v2.split("\\."); + int i = 0; + for (; i < toks1.length; i++) + { + if (i >= toks2.length) + { + /* + * extra tokens in v1 + */ + return 1; + } + String tok1 = toks1[i]; + String tok2 = toks2[i]; + if (pointSeparator != null) + { + /* + * convert e.g. 5b2 into decimal 5.2 for comparison purposes + */ + tok1 = tok1.replace(pointSeparator, "."); + tok2 = tok2.replace(pointSeparator, "."); + } + try + { + float f1 = Float.valueOf(tok1); + float f2 = Float.valueOf(tok2); + int comp = Float.compare(f1, f2); + if (comp != 0) + { + return comp; + } + } catch (NumberFormatException e) + { + System.err.println("Invalid version format found: " + + e.getMessage()); + return 0; + } + } + + if (i < toks2.length) + { + /* + * extra tokens in v2 + */ + return -1; + } + + /* + * same length, all tokens match + */ + return 0; + } + + /** + * Converts the string to all lower-case except the first character which is + * upper-cased + * + * @param s + * @return + */ + public static String toSentenceCase(String s) + { + if (s == null) + { + return s; + } + if (s.length() <= 1) + { + return s.toUpperCase(); + } + return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase(); + } } diff --git a/src/jalview/viewmodel/AlignmentViewport.java b/src/jalview/viewmodel/AlignmentViewport.java index fbd1622..d3df56c 100644 --- a/src/jalview/viewmodel/AlignmentViewport.java +++ b/src/jalview/viewmodel/AlignmentViewport.java @@ -1078,6 +1078,7 @@ public abstract class AlignmentViewport implements AlignViewportI, { updateHiddenColumns(); } + isColSelChanged(true); } /** @@ -1206,8 +1207,7 @@ public abstract class AlignmentViewport implements AlignViewportI, */ public boolean isColSelChanged(boolean b) { - int hc = (colSel == null || colSel.isEmpty()) ? -1 : colSel - .hashCode(); + int hc = (colSel == null || colSel.isEmpty()) ? -1 : colSel.hashCode(); if (hc != -1 && hc != colselhash) { if (b) @@ -1308,7 +1308,7 @@ public abstract class AlignmentViewport implements AlignViewportI, colSel.hideSelectedColumns(); setSelectionGroup(null); - + isColSelChanged(true); } public void hideColumns(int start, int end) @@ -1321,17 +1321,19 @@ public abstract class AlignmentViewport implements AlignViewportI, { colSel.hideColumns(start, end); } + isColSelChanged(true); } public void showColumn(int col) { colSel.revealHiddenColumns(col); - + isColSelChanged(true); } public void showAllHiddenColumns() { colSel.revealAllHiddenColumns(); + isColSelChanged(true); } // common hide/show seq stuff @@ -1411,6 +1413,39 @@ public abstract class AlignmentViewport implements AlignViewportI, } /** + * Hides the specified sequence, or the sequences it represents + * + * @param sequence + * the sequence to hide, or keep as representative + * @param representGroup + * if true, hide the current selection group except for the + * representative sequence + */ + public void hideSequences(SequenceI sequence, boolean representGroup) + { + if (selectionGroup == null || selectionGroup.getSize() < 1) + { + hideSequence(new SequenceI[] { sequence }); + return; + } + + if (representGroup) + { + hideRepSequences(sequence, selectionGroup); + setSelectionGroup(null); + return; + } + + int gsize = selectionGroup.getSize(); + SequenceI[] hseqs = selectionGroup.getSequences().toArray( + new SequenceI[gsize]); + + hideSequence(hseqs); + setSelectionGroup(null); + sendSelection(); + } + + /** * Set visibility for any annotations for the given sequence. * * @param sequenceI @@ -1418,11 +1453,15 @@ public abstract class AlignmentViewport implements AlignViewportI, protected void setSequenceAnnotationsVisible(SequenceI sequenceI, boolean visible) { - for (AlignmentAnnotation ann : alignment.getAlignmentAnnotation()) + AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation(); + if (anns != null) { - if (ann.sequenceRef == sequenceI) + for (AlignmentAnnotation ann : anns) { - ann.visible = visible; + if (ann.sequenceRef == sequenceI) + { + ann.visible = visible; + } } } } @@ -1586,6 +1625,13 @@ public abstract class AlignmentViewport implements AlignViewportI, @Override public String[] getViewAsString(boolean selectedRegionOnly) { + return getViewAsString(selectedRegionOnly, true); + } + + @Override + public String[] getViewAsString(boolean selectedRegionOnly, + boolean exportHiddenSeqs) + { String[] selection = null; SequenceI[] seqs = null; int i, iSize; @@ -1599,13 +1645,13 @@ public abstract class AlignmentViewport implements AlignViewportI, } else { - if (hasHiddenRows()) + if (hasHiddenRows() && exportHiddenSeqs) { - iSize = alignment.getHiddenSequences().getFullAlignment() - .getHeight(); - seqs = alignment.getHiddenSequences().getFullAlignment() - .getSequencesArray(); - end = alignment.getHiddenSequences().getFullAlignment().getWidth(); + AlignmentI fullAlignment = alignment.getHiddenSequences() + .getFullAlignment(); + iSize = fullAlignment.getHeight(); + seqs = fullAlignment.getSequencesArray(); + end = fullAlignment.getWidth(); } else { @@ -2654,6 +2700,7 @@ public abstract class AlignmentViewport implements AlignViewportI, * all gapped visible regions */ int lastSeq = alignment.getHeight() - 1; + List seqMappings = null; for (int seqNo = getStartSeq(); seqNo < lastSeq; seqNo++, seqOffset++) { sequence = getAlignment().getSequenceAt(seqNo); @@ -2665,15 +2712,16 @@ public abstract class AlignmentViewport implements AlignViewportI, { continue; } - List seqMappings = MappingUtils - .findMappingsForSequence(sequence, mappings); + seqMappings = MappingUtils + .findMappingsForSequenceAndOthers(sequence, mappings, + getCodingComplement().getAlignment()); if (!seqMappings.isEmpty()) { break; } } - if (sequence == null) + if (sequence == null || seqMappings == null || seqMappings.isEmpty()) { /* * No ungapped mapped sequence in middle column - do nothing @@ -2681,7 +2729,7 @@ public abstract class AlignmentViewport implements AlignViewportI, return 0; } MappingUtils.addSearchResults(sr, sequence, - sequence.findPosition(middleColumn), mappings); + sequence.findPosition(middleColumn), seqMappings); return seqOffset; } @@ -2717,4 +2765,6 @@ public abstract class AlignmentViewport implements AlignViewportI, } } } + + } diff --git a/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java b/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java index 848f565..a4e4348 100644 --- a/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java +++ b/src/jalview/viewmodel/seqfeatures/FeatureRendererModel.java @@ -27,7 +27,8 @@ import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.renderer.seqfeatures.FeatureRenderer; -import jalview.schemes.GraduatedColor; +import jalview.schemes.FeatureColour; +import jalview.schemes.UserColourScheme; import jalview.viewmodel.AlignmentViewport; import java.awt.Color; @@ -52,28 +53,19 @@ public abstract class FeatureRendererModel implements */ protected float transparency = 1.0f; - protected Map featureColours = new ConcurrentHashMap(); + protected Map featureColours = new ConcurrentHashMap(); protected Map featureGroups = new ConcurrentHashMap(); - protected Object currentColour; - - /* - * feature types in ordering of rendering, where last means on top - */ protected String[] renderOrder; + Map featureOrder = null; + protected PropertyChangeSupport changeSupport = new PropertyChangeSupport( this); protected AlignmentViewport av; - /* - * map holds per feature type, {{min, max}, {min, max}} feature score - * values for positional and non-positional features respectively - */ - private Map minmax = new Hashtable(); - @Override public AlignViewportI getViewport() { @@ -200,6 +192,8 @@ public abstract class FeatureRendererModel implements renderOrder = neworder; } + protected Map minmax = new Hashtable(); + public Map getMinMax() { return minmax; @@ -449,7 +443,6 @@ public abstract class FeatureRendererModel implements List allfeatures = new ArrayList(allFeatures); String[] oldRender = renderOrder; renderOrder = new String[allfeatures.size()]; - Object mmrange, fc = null; boolean initOrders = (featureOrder == null); int opos = 0; if (oldRender != null && oldRender.length > 0) @@ -469,16 +462,13 @@ public abstract class FeatureRendererModel implements allfeatures.remove(oldRender[j]); if (minmax != null) { - mmrange = minmax.get(oldRender[j]); + float[][] mmrange = minmax.get(oldRender[j]); if (mmrange != null) { - fc = featureColours.get(oldRender[j]); - if (fc != null && fc instanceof GraduatedColor - && ((GraduatedColor) fc).isAutoScale()) + FeatureColourI fc = featureColours.get(oldRender[j]); + if (fc != null && !fc.isSimpleColour() && fc.isAutoScaled()) { - ((GraduatedColor) fc).updateBounds( - ((float[][]) mmrange)[0][0], - ((float[][]) mmrange)[0][1]); + fc.updateBounds(mmrange[0][0], mmrange[0][1]); } } } @@ -502,15 +492,13 @@ public abstract class FeatureRendererModel implements if (minmax != null) { // update from new features minmax if necessary - mmrange = minmax.get(newf[i]); + float[][] mmrange = minmax.get(newf[i]); if (mmrange != null) { - fc = featureColours.get(newf[i]); - if (fc != null && fc instanceof GraduatedColor - && ((GraduatedColor) fc).isAutoScale()) + FeatureColourI fc = featureColours.get(newf[i]); + if (fc != null && !fc.isSimpleColour() && fc.isAutoScaled()) { - ((GraduatedColor) fc).updateBounds(((float[][]) mmrange)[0][0], - ((float[][]) mmrange)[0][1]); + fc.updateBounds(mmrange[0][0], mmrange[0][1]); } } } @@ -522,7 +510,7 @@ public abstract class FeatureRendererModel implements setOrder(newf[i], i / (float) denom); } // set order from newly found feature from persisted ordering. - sortOrder[i] = 2 - ((Float) featureOrder.get(newf[i])).floatValue(); + sortOrder[i] = 2 - featureOrder.get(newf[i]).floatValue(); if (i < iSize) { // only sort if we need to @@ -540,52 +528,25 @@ public abstract class FeatureRendererModel implements /** * get a feature style object for the given type string. Creates a - * java.awt.Color for a featureType with no existing colourscheme. TODO: - * replace return type with object implementing standard abstract colour/style - * interface + * java.awt.Color for a featureType with no existing colourscheme. * * @param featureType - * @return java.awt.Color or GraduatedColor + * @return */ @Override - public Object getFeatureStyle(String featureType) + public FeatureColourI getFeatureStyle(String featureType) { - Object fc = featureColours.get(featureType); + FeatureColourI fc = featureColours.get(featureType); if (fc == null) { - jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme(); - Color col = ucs.createColourFromName(featureType); - featureColours.put(featureType, fc = col); + Color col = UserColourScheme.createColourFromName(featureType); + fc = new FeatureColour(col); + featureColours.put(featureType, fc); } return fc; } /** - * return a nominal colour for this feature - * - * @param featureType - * @return standard color, or maximum colour for graduated colourscheme - */ - public Color getColour(String featureType) - { - Object fc = getFeatureStyle(featureType); - - if (fc instanceof Color) - { - return (Color) fc; - } - else - { - if (fc instanceof GraduatedColor) - { - return ((GraduatedColor) fc).getMaxColor(); - } - } - throw new Error("Implementation Error: Unrecognised render object " - + fc.getClass() + " for features of type " + featureType); - } - - /** * calculate the render colour for a specific feature using current feature * settings. * @@ -594,33 +555,14 @@ public abstract class FeatureRendererModel implements */ public Color getColour(SequenceFeature feature) { - Object fc = getFeatureStyle(feature.getType()); - if (fc instanceof Color) - { - return (Color) fc; - } - else - { - if (fc instanceof GraduatedColor) - { - return ((GraduatedColor) fc).findColor(feature); - } - } - throw new Error("Implementation Error: Unrecognised render object " - + fc.getClass() + " for features of type " + feature.getType()); + FeatureColourI fc = getFeatureStyle(feature.getType()); + return fc.getColor(feature); } protected boolean showFeature(SequenceFeature sequenceFeature) { - Object fc = getFeatureStyle(sequenceFeature.type); - if (fc instanceof GraduatedColor) - { - return ((GraduatedColor) fc).isColored(sequenceFeature); - } - else - { - return true; - } + FeatureColourI fc = getFeatureStyle(sequenceFeature.type); + return fc.isColored(sequenceFeature); } protected boolean showFeatureOfType(String type) @@ -629,26 +571,9 @@ public abstract class FeatureRendererModel implements } @Override - public void setColour(String featureType, Object col) + public void setColour(String featureType, FeatureColourI col) { - // overwrite - // Color _col = (col instanceof Color) ? ((Color) col) : (col instanceof - // GraduatedColor) ? ((GraduatedColor) col).getMaxColor() : null; - // Object c = featureColours.get(featureType); - // if (c == null || c instanceof Color || (c instanceof GraduatedColor && - // !((GraduatedColor)c).getMaxColor().equals(_col))) - if (col instanceof FeatureColourI) - { - if (((FeatureColourI) col).isGraduatedColour()) - { - col = new GraduatedColor((FeatureColourI) col); - } - else - { - col = ((FeatureColourI) col).getColour(); - } - } - featureColours.put(featureType, col); + featureColours.put(featureType, col); } public void setTransparency(float value) @@ -661,8 +586,6 @@ public abstract class FeatureRendererModel implements return transparency; } - Map featureOrder = null; - /** * analogous to colour - store a normalized ordering for all feature types in * this rendering context. @@ -677,7 +600,7 @@ public abstract class FeatureRendererModel implements { if (featureOrder == null) { - featureOrder = new Hashtable(); + featureOrder = new Hashtable(); } featureOrder.put(type, new Float(position)); return position; @@ -695,14 +618,14 @@ public abstract class FeatureRendererModel implements { if (featureOrder.containsKey(type)) { - return ((Float) featureOrder.get(type)).floatValue(); + return featureOrder.get(type).floatValue(); } } return -1; } @Override - public Map getFeatureColours() + public Map getFeatureColours() { return featureColours; } @@ -735,7 +658,7 @@ public abstract class FeatureRendererModel implements * note visible feature ordering and colours before update */ List visibleFeatures = getDisplayedFeatureTypes(); - Map visibleColours = new HashMap( + Map visibleColours = new HashMap( getFeatureColours()); FeaturesDisplayedI av_featuresdisplayed = null; @@ -768,8 +691,7 @@ public abstract class FeatureRendererModel implements for (int i = 0; i < data.length; i++) { String type = data[i][0].toString(); - setColour(type, data[i][1]); // todo : typesafety - feature color - // interface object + setColour(type, (FeatureColourI) data[i][1]); if (((Boolean) data[i][2]).booleanValue()) { av_featuresdisplayed.setVisible(type); @@ -838,6 +760,9 @@ public abstract class FeatureRendererModel implements return renderOrder != null; } + /** + * Returns feature types in ordering of rendering, where last means on top + */ public List getRenderOrder() { if (renderOrder == null) @@ -891,9 +816,9 @@ public abstract class FeatureRendererModel implements { if (featureGroups != null) { - ArrayList gp = new ArrayList(); + List gp = new ArrayList(); - for (Object grp : featureGroups.keySet()) + for (String grp : featureGroups.keySet()) { Boolean state = featureGroups.get(grp); if (state.booleanValue() == visible) @@ -935,19 +860,19 @@ public abstract class FeatureRendererModel implements } @Override - public Hashtable getDisplayedFeatureCols() + public Map getDisplayedFeatureCols() { - Hashtable fcols = new Hashtable(); + Map fcols = new Hashtable(); if (getViewport().getFeaturesDisplayed() == null) { return fcols; } - Iterator en = getViewport().getFeaturesDisplayed() + Iterator features = getViewport().getFeaturesDisplayed() .getVisibleFeatures(); - while (en.hasNext()) + while (features.hasNext()) { - String col = en.next(); - fcols.put(col, getColour(col)); + String feature = features.next(); + fcols.put(feature, getFeatureStyle(feature)); } return fcols; } diff --git a/src/jalview/viewmodel/seqfeatures/FeatureRendererSettings.java b/src/jalview/viewmodel/seqfeatures/FeatureRendererSettings.java index 1985b6d..dc2ae11 100644 --- a/src/jalview/viewmodel/seqfeatures/FeatureRendererSettings.java +++ b/src/jalview/viewmodel/seqfeatures/FeatureRendererSettings.java @@ -20,10 +20,10 @@ */ package jalview.viewmodel.seqfeatures; -import jalview.schemes.GraduatedColor; +import jalview.api.FeatureColourI; +import jalview.schemes.FeatureColour; import java.util.Arrays; -import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -32,24 +32,33 @@ public class FeatureRendererSettings implements Cloneable { String[] renderOrder; - Map featureGroups; + /* + * map of {groupName, isDisplayed} + */ + Map featureGroups; - Map featureColours; + /* + * map of {featureType, colourScheme} + */ + Map featureColours; float transparency; - Map featureOrder; + Map featureOrder; public FeatureRendererSettings(String[] renderOrder, - Hashtable featureGroups, Hashtable featureColours, - float transparency, Hashtable featureOrder) + Map featureGroups, + Map featureColours, float transparency, + Map featureOrder) { super(); this.renderOrder = Arrays.copyOf(renderOrder, renderOrder.length); - this.featureGroups = new ConcurrentHashMap(featureGroups); - this.featureColours = new ConcurrentHashMap(featureColours); + this.featureGroups = new ConcurrentHashMap( + featureGroups); + this.featureColours = new ConcurrentHashMap( + featureColours); this.transparency = transparency; - this.featureOrder = new ConcurrentHashMap(featureOrder); + this.featureOrder = new ConcurrentHashMap(featureOrder); } /** @@ -61,9 +70,9 @@ public class FeatureRendererSettings implements Cloneable jalview.viewmodel.seqfeatures.FeatureRendererModel fr) { renderOrder = null; - featureGroups = new ConcurrentHashMap(); - featureColours = new ConcurrentHashMap(); - featureOrder = new ConcurrentHashMap(); + featureGroups = new ConcurrentHashMap(); + featureColours = new ConcurrentHashMap(); + featureOrder = new ConcurrentHashMap(); if (fr.renderOrder != null) { this.renderOrder = new String[fr.renderOrder.length]; @@ -72,26 +81,30 @@ public class FeatureRendererSettings implements Cloneable } if (fr.featureGroups != null) { - this.featureGroups = new ConcurrentHashMap(fr.featureGroups); + this.featureGroups = new ConcurrentHashMap( + fr.featureGroups); } if (fr.featureColours != null) { - this.featureColours = new ConcurrentHashMap(fr.featureColours); + this.featureColours = new ConcurrentHashMap( + fr.featureColours); } - Iterator en = fr.featureColours.keySet().iterator(); + Iterator en = fr.featureColours.keySet().iterator(); while (en.hasNext()) { - Object next = en.next(); - Object val = featureColours.get(next); - if (val instanceof GraduatedColor) + String next = en.next(); + FeatureColourI val = featureColours.get(next); + // if (val instanceof GraduatedColor) + if (val.isGraduatedColour() || val.isColourByLabel()) // why this test? { - featureColours.put(next, new GraduatedColor((GraduatedColor) val)); + featureColours.put(next, new FeatureColour((FeatureColour) val)); } } this.transparency = fr.transparency; if (fr.featureOrder != null) { - this.featureOrder = new ConcurrentHashMap(fr.featureOrder); + this.featureOrder = new ConcurrentHashMap( + fr.featureOrder); } } } diff --git a/src/jalview/workers/AlignmentAnnotationFactory.java b/src/jalview/workers/AlignmentAnnotationFactory.java index 37f3ca5..520b232 100644 --- a/src/jalview/workers/AlignmentAnnotationFactory.java +++ b/src/jalview/workers/AlignmentAnnotationFactory.java @@ -1,9 +1,9 @@ package jalview.workers; +import jalview.bin.Jalview; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.Annotation; import jalview.gui.AlignFrame; -import jalview.gui.Desktop; import java.awt.Color; @@ -28,9 +28,9 @@ public class AlignmentAnnotationFactory */ public static void newCalculator(FeatureCounterI counter) { - if (Desktop.getCurrentAlignFrame() != null) + if (Jalview.getCurrentAlignFrame() != null) { - newCalculator(Desktop.getCurrentAlignFrame(), counter); + newCalculator(Jalview.getCurrentAlignFrame(), counter); } else { @@ -60,9 +60,9 @@ public class AlignmentAnnotationFactory */ public static void newCalculator(AnnotationProviderI calculator) { - if (Desktop.getCurrentAlignFrame() != null) + if (Jalview.getCurrentAlignFrame() != null) { - newCalculator(Desktop.getCurrentAlignFrame(), calculator); + newCalculator(Jalview.getCurrentAlignFrame(), calculator); } else { diff --git a/src/jalview/workers/StrucConsensusThread.java b/src/jalview/workers/StrucConsensusThread.java index 3483dac..4249112 100644 --- a/src/jalview/workers/StrucConsensusThread.java +++ b/src/jalview/workers/StrucConsensusThread.java @@ -94,12 +94,15 @@ public class StrucConsensusThread extends AlignCalcWorker .getAlignmentAnnotation(); AlignmentAnnotation rnaStruc = null; // select rna struct to use for calculation - for (int i = 0; i < aa.length; i++) + if (aa != null) { - if (aa[i].visible && aa[i].isRNA() && aa[i].isValidStruc()) + for (int i = 0; i < aa.length; i++) { - rnaStruc = aa[i]; - break; + if (aa[i].visible && aa[i].isRNA() && aa[i].isValidStruc()) + { + rnaStruc = aa[i]; + break; + } } } // check to see if its valid diff --git a/src/jalview/ws/AWSThread.java b/src/jalview/ws/AWSThread.java index b158448..2ef5256 100644 --- a/src/jalview/ws/AWSThread.java +++ b/src/jalview/ws/AWSThread.java @@ -31,9 +31,8 @@ import jalview.gui.WebserviceInfo; import jalview.util.MessageManager; import jalview.viewmodel.seqfeatures.FeatureRendererSettings; -import java.util.LinkedHashSet; +import java.util.ArrayList; import java.util.List; -import java.util.Set; public abstract class AWSThread extends Thread { @@ -61,7 +60,7 @@ public abstract class AWSThread extends Thread /** * dataset sequence relationships to be propagated onto new results */ - protected Set codonframe = null; + protected List codonframe = null; /** * are there jobs still running in this thread. @@ -384,7 +383,7 @@ public abstract class AWSThread extends Thread .getCodonFrames(); if (cf != null) { - codonframe = new LinkedHashSet(); + codonframe = new ArrayList(); codonframe.addAll(cf); } } diff --git a/src/jalview/ws/DBRefFetcher.java b/src/jalview/ws/DBRefFetcher.java index 40c88c1..3ba0e34 100644 --- a/src/jalview/ws/DBRefFetcher.java +++ b/src/jalview/ws/DBRefFetcher.java @@ -141,7 +141,7 @@ public class DBRefFetcher implements Runnable String[] defdb = null, otherdb = sfetcher .getDbInstances(jalview.ws.dbsources.das.datamodel.DasSequenceSource.class); List selsources = new ArrayList(); - Vector dasselsrc = (featureSettings != null) ? featureSettings + Vector dasselsrc = (featureSettings != null) ? featureSettings .getSelectedSources() : new jalview.gui.DasSourceBrowser() .getSelectedSources(); Enumeration en = dasselsrc.elements(); @@ -190,6 +190,16 @@ public class DBRefFetcher implements Runnable } /** + * Constructor with only sequences provided + * + * @param sequences + */ + public DBRefFetcher(SequenceI[] sequences) + { + this(sequences, null, null, null, false); + } + + /** * Add a listener to be notified when sequence fetching is complete * * @param l diff --git a/src/jalview/ws/DasSequenceFeatureFetcher.java b/src/jalview/ws/DasSequenceFeatureFetcher.java index d7ba24d..5f9b2d9 100644 --- a/src/jalview/ws/DasSequenceFeatureFetcher.java +++ b/src/jalview/ws/DasSequenceFeatureFetcher.java @@ -22,11 +22,13 @@ package jalview.ws; import jalview.bin.Cache; import jalview.datamodel.DBRefEntry; +import jalview.datamodel.DBRefSource; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.gui.Desktop; import jalview.gui.FeatureSettings; +import jalview.util.DBRefUtils; import jalview.util.MessageManager; import jalview.util.UrlLink; import jalview.ws.dbsources.das.api.DasSourceRegistryI; @@ -186,8 +188,7 @@ public class DasSequenceFeatureFetcher { for (int j = 0; j < dbref.length; j++) { - if (dbref[j].getSource().equals( - jalview.datamodel.DBRefSource.UNIPROT)) + if (dbref[j].getSource().equals(DBRefSource.UNIPROT)) { refCount++; break; @@ -252,10 +253,10 @@ public class DasSequenceFeatureFetcher public void run() { running = true; - boolean isNuclueotide = af.getViewport().getAlignment() + boolean isNucleotide = af.getViewport().getAlignment() .isNucleotide(); - new jalview.ws.DBRefFetcher(sequences, af, null, af.featureSettings, - isNuclueotide).fetchDBRefs(true); + new DBRefFetcher(sequences, af, null, af.featureSettings, + isNucleotide).fetchDBRefs(true); startFetching(); setGuiFetchComplete(); @@ -286,7 +287,7 @@ public class DasSequenceFeatureFetcher { jalviewSourceI[] sources = sourceRegistry.getSources().toArray( new jalviewSourceI[0]); - String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE", + String active = Cache.getDefault("DAS_ACTIVE_SOURCE", "uniprot"); StringTokenizer st = new StringTokenizer(active, "\t"); selectedSources = new Vector(); @@ -643,10 +644,10 @@ public class DasSequenceFeatureFetcher { return null; } - DBRefEntry[] uprefs = jalview.util.DBRefUtils.selectRefs( + DBRefEntry[] uprefs = DBRefUtils.selectRefs( seq.getDBRefs(), new String[] { // jalview.datamodel.DBRefSource.PDB, - jalview.datamodel.DBRefSource.UNIPROT, + DBRefSource.UNIPROT, // jalview.datamodel.DBRefSource.EMBL - not tested on any EMBL coord // sys sources }); @@ -665,7 +666,7 @@ public class DasSequenceFeatureFetcher for (COORDINATES csys : dasSource.getVersion().getCOORDINATES()) { - if (jalview.util.DBRefUtils.isDasCoordinateSystem( + if (DBRefUtils.isDasCoordinateSystem( csys.getAuthority(), uprefs[j])) { debug("Launched fetcher for coordinate system " diff --git a/src/jalview/ws/SequenceFetcherFactory.java b/src/jalview/ws/SequenceFetcherFactory.java new file mode 100644 index 0000000..2b8f364 --- /dev/null +++ b/src/jalview/ws/SequenceFetcherFactory.java @@ -0,0 +1,32 @@ +package jalview.ws; + +import jalview.ws.seqfetcher.ASequenceFetcher; + +public class SequenceFetcherFactory +{ + + private static SequenceFetcher instance; + + /** + * Returns a new SequenceFetcher object, or a mock object if one has been set + * + * @return + */ + public static ASequenceFetcher getSequenceFetcher() + { + return instance == null ? new SequenceFetcher() : instance; + } + + /** + * Set the instance object to use (intended for unit testing with mock + * objects). + * + * Be sure to reset to null in the tearDown method of any tests! + * + * @param sf + */ + public static void setSequenceFetcher(SequenceFetcher sf) + { + instance = sf; + } +} diff --git a/src/jalview/ws/dbsources/EmblXmlSource.java b/src/jalview/ws/dbsources/EmblXmlSource.java index 0085221..2049766 100644 --- a/src/jalview/ws/dbsources/EmblXmlSource.java +++ b/src/jalview/ws/dbsources/EmblXmlSource.java @@ -63,7 +63,7 @@ public abstract class EmblXmlSource extends EbiFileRetrievedProxy try { reply = dbFetch.fetchDataAsFile( - emprefx.toLowerCase() + ":" + query.trim(), "emblxml", null, + emprefx.toLowerCase() + ":" + query.trim(), "display=xml", ".xml"); } catch (Exception e) { diff --git a/src/jalview/ws/dbsources/Pdb.java b/src/jalview/ws/dbsources/Pdb.java index 4a089f7..d945699 100644 --- a/src/jalview/ws/dbsources/Pdb.java +++ b/src/jalview/ws/dbsources/Pdb.java @@ -1,3 +1,4 @@ + /* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors @@ -29,6 +30,7 @@ import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceI; import jalview.io.FormatAdapter; import jalview.io.PDBFeatureSettings; +import jalview.structure.StructureImportSettings; import jalview.util.MessageManager; import jalview.ws.ebi.EBIFetchClient; @@ -53,8 +55,6 @@ public class Pdb extends EbiFileRetrievedProxy public static final String FEATURE_RES_NUM = "RESNUM"; - private static String currentDefaultFomart = DBRefSource.PDB; - /* * (non-Javadoc) * @@ -132,11 +132,13 @@ public class Pdb extends EbiFileRetrievedProxy stopQuery(); return null; } - String ext = getCurrentDefaultFomart().equalsIgnoreCase("mmcif") ? ".cif" + String ext = StructureImportSettings.getCurrentDefaultFormat() + .equalsIgnoreCase("mmcif") ? ".cif" : ".xml"; EBIFetchClient ebi = new EBIFetchClient(); file = ebi.fetchDataAsFile("pdb:" + id, - getCurrentDefaultFomart().toLowerCase(), "raw", ext) + StructureImportSettings.getCurrentDefaultFormat().toLowerCase(), + ext) .getAbsolutePath(); stopQuery(); if (file == null) @@ -148,7 +150,7 @@ public class Pdb extends EbiFileRetrievedProxy pdbAlignment = new FormatAdapter().readFile(file, jalview.io.AppletFormatAdapter.FILE, - getCurrentDefaultFomart()); + StructureImportSettings.getCurrentDefaultFormat()); if (pdbAlignment != null) { List toremove = new ArrayList(); @@ -243,12 +245,12 @@ public class Pdb extends EbiFileRetrievedProxy } /** - * obtain human glyoxalase chain A sequence + * human glyoxalase */ @Override public String getTestQuery() { - return "1QIPA"; + return "1QIP"; } @Override @@ -263,15 +265,6 @@ public class Pdb extends EbiFileRetrievedProxy return 0; } - public static String getCurrentDefaultFomart() - { - return currentDefaultFomart; - } - - public static void setCurrentDefaultFomart(String currentDefaultFomart) - { - Pdb.currentDefaultFomart = currentDefaultFomart; - } /** * Returns a descriptor for suitable feature display settings with diff --git a/src/jalview/ws/dbsources/Uniprot.java b/src/jalview/ws/dbsources/Uniprot.java index 17f1842..8cc0ce4 100644 --- a/src/jalview/ws/dbsources/Uniprot.java +++ b/src/jalview/ws/dbsources/Uniprot.java @@ -165,7 +165,7 @@ public class Uniprot extends DbSourceProxyImpl // uniprotxml parameter required since december 2007 // uniprotkb dbname changed introduced december 2008 File file = ebi.fetchDataAsFile("uniprotkb:" + queries, "uniprotxml", - null, ".xml"); + ".xml"); Vector entries = getUniprotEntries(new FileReader(file)); if (entries != null) diff --git a/src/jalview/ws/ebi/EBIFetchClient.java b/src/jalview/ws/ebi/EBIFetchClient.java index 9f6bc65..1dff32f 100644 --- a/src/jalview/ws/ebi/EBIFetchClient.java +++ b/src/jalview/ws/ebi/EBIFetchClient.java @@ -42,9 +42,6 @@ import java.util.StringTokenizer; */ public class EBIFetchClient { - String format = "default"; - - String style = "raw"; /** * Creates a new EBIFetchClient object. @@ -93,14 +90,13 @@ public class EBIFetchClient * the query formatted as db:query1;query2;query3 * @param format * the format wanted - * @param s - * - unused parameter + * @param extension + * for the temporary file to hold response * @return the file holding the response * @throws OutOfMemoryError */ - public File fetchDataAsFile(String ids, String format, String s, - String ext) + public File fetchDataAsFile(String ids, String format, String ext) throws OutOfMemoryError { File outFile = null; @@ -108,7 +104,7 @@ public class EBIFetchClient { outFile = File.createTempFile("jalview", ext); outFile.deleteOnExit(); - fetchData(ids, format, s, outFile); + fetchData(ids, format, outFile); if (outFile.length() == 0) { outFile.delete(); @@ -121,92 +117,92 @@ public class EBIFetchClient } /** - * Single DB multiple record retrieval + * Fetches queries and either saves the response to a file or returns as + * string data * * @param ids - * db:query1;query2;query3 * @param format - * raw/xml - * @param s - * not used - remove? - * - * @return Raw string array result of query set + * @param outFile + * @return + * @throws OutOfMemoryError */ - public String[] fetchData(String ids, String format, String s) + String[] fetchData(String ids, String format, File outFile) throws OutOfMemoryError { - return fetchData(ids, format, s, null); + StringBuilder querystring = new StringBuilder(ids.length()); + String database = parseIds(ids, querystring); + if (database == null) + { + System.err.println("Invalid Query string : '" + ids + "'"); + System.err.println("Should be of form 'dbname:q1;q2;q3;q4'"); + return null; + } + + // note: outFile is currently always specified, so return value is null + String[] rslt = fetchBatch(querystring.toString(), database, format, outFile); + + return (rslt != null && rslt.length > 0 ? rslt : null); } - String[] fetchData(String ids, String f, String s, File outFile) - throws OutOfMemoryError + /** + * Parses ids formatted as dbname:q1;q2;q3, returns the dbname and adds + * queries as comma-separated items to the querystring. dbname must be + * specified for at least one queryId. Returns null if a mixture of different + * dbnames is found (ignoring case). + * + * @param ids + * @param queryString + * @return + */ + static String parseIds(String ids, StringBuilder queryString) { - // Need to split - // ids of the form uniprot:25KD_SARPE;ADHR_DROPS; - String[] rslts = new String[0]; + String database = null; StringTokenizer queries = new StringTokenizer(ids, ";"); - String db = null; - StringBuffer querystring = null; - int nq = 0; + boolean appending = queryString.length() > 0; while (queries.hasMoreTokens()) { String query = queries.nextToken(); - int p; - if ((p = query.indexOf(':')) > -1) + int p = query.indexOf(':'); + if (p > -1) { - db = query.substring(0, p); + String db = query.substring(0, p); + if (database != null && !db.equalsIgnoreCase(database)) + { + /* + * different databases mixed in together - invalid + */ + return null; + } + database = db; query = query.substring(p + 1); } - if (querystring == null) - { - querystring = new StringBuffer(query); - nq++; - } - else - { - querystring.append("," + query); - nq++; - } - } - if (db == null) - { - System.err.println("Invalid Query string : '" + ids - + "'\nShould be of form 'dbname:q1;q2;q3;q4'"); - return null; - } - String[] rslt = fetchBatch(querystring.toString(), db, f, s, outFile); - if (rslt != null) - { - String[] nrslts = new String[rslt.length + rslts.length]; - System.arraycopy(rslts, 0, nrslts, 0, rslts.length); - System.arraycopy(rslt, 0, nrslts, rslts.length, rslt.length); - rslts = nrslts; + queryString.append(appending ? "," : ""); + queryString.append(query); + appending = true; } - - return (rslts.length == 0 ? null : rslts); + return database; } - public String[] fetchBatch(String ids, String dbPath, String format, String s, + /** + * Fetches queries and either saves the response to a file or (if no file + * specified) returns as string data + * + * @param ids + * @param database + * @param format + * @param outFile + * @return + * @throws OutOfMemoryError + */ + String[] fetchBatch(String ids, String database, String format, File outFile) throws OutOfMemoryError { // long time = System.currentTimeMillis(); - /* - * JAL-1855 dbfetch from ena_sequence, ena_coding - */ - if (dbPath.equalsIgnoreCase(DBRefSource.EMBL)) - { - dbPath = "ena_sequence"; - } - else if (dbPath.equalsIgnoreCase(DBRefSource.EMBLCDS)) - { - dbPath = "ena_coding"; - } + String url = buildUrl(ids, database, format); try { - URL rcall = new URL("http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/" - + dbPath.toLowerCase() + "/" + ids.toLowerCase() - + (format != null ? "/" + format : "")); + URL rcall = new URL(url); InputStream is = new BufferedInputStream(rcall.openStream()); if (outFile != null) @@ -234,8 +230,7 @@ public class EBIFetchClient } } catch (OutOfMemoryError er) { - - System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + dbPath + System.out.println("OUT OF MEMORY DOWNLOADING QUERY FROM " + database + ":\n" + ids); throw er; } catch (Exception ex) @@ -246,7 +241,7 @@ public class EBIFetchClient return null; } System.err.println("Unexpected exception when retrieving from " - + dbPath + + database + "\nQuery was : '" + ids + "'"); ex.printStackTrace(System.err); return null; @@ -257,4 +252,30 @@ public class EBIFetchClient } return null; } + + /** + * Constructs the URL to fetch from + * + * @param ids + * @param database + * @param format + * @return + */ + static String buildUrl(String ids, String database, String format) + { + String url; + if (database.equalsIgnoreCase(DBRefSource.EMBL) + || database.equalsIgnoreCase(DBRefSource.EMBLCDS)) + { + url = "http://www.ebi.ac.uk/ena/data/view/" + ids.toLowerCase() + + (format != null ? "&" + format : ""); + } + else + { + url = "http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/" + + database.toLowerCase() + "/" + ids.toLowerCase() + + (format != null ? "/" + format : ""); + } + return url; + } } diff --git a/src/jalview/ws/jws1/MsaWSClient.java b/src/jalview/ws/jws1/MsaWSClient.java index 95f5527..aad72b1 100644 --- a/src/jalview/ws/jws1/MsaWSClient.java +++ b/src/jalview/ws/jws1/MsaWSClient.java @@ -20,7 +20,7 @@ */ package jalview.ws.jws1; -import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.gui.AlignFrame; import jalview.gui.Desktop; @@ -34,7 +34,6 @@ import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; -import ext.vamsas.MuscleWS; import ext.vamsas.MuscleWSServiceLocator; import ext.vamsas.MuscleWSSoapBindingStub; import ext.vamsas.ServiceHandle; @@ -72,7 +71,7 @@ public class MsaWSClient extends WS1Client public MsaWSClient(ext.vamsas.ServiceHandle sh, String altitle, jalview.datamodel.AlignmentView msa, boolean submitGaps, - boolean preserveOrder, Alignment seqdataset, + boolean preserveOrder, AlignmentI seqdataset, AlignFrame _alignFrame) { super(); @@ -109,7 +108,7 @@ public class MsaWSClient extends WS1Client } private void startMsaWSClient(String altitle, AlignmentView msa, - boolean submitGaps, boolean preserveOrder, Alignment seqdataset) + boolean submitGaps, boolean preserveOrder, AlignmentI seqdataset) { if (!locateWebService()) { @@ -159,7 +158,7 @@ public class MsaWSClient extends WS1Client try { - this.server = (MuscleWS) loc.getMuscleWS(new java.net.URL(WsURL)); + this.server = loc.getMuscleWS(new java.net.URL(WsURL)); ((MuscleWSSoapBindingStub) this.server).setTimeout(60000); // One minute // timeout } catch (Exception ex) @@ -201,6 +200,7 @@ public class MsaWSClient extends WS1Client return (WebServiceName.indexOf("lustal") > -1); // cheat! } + @Override public void attachWSMenuEntry(JMenu msawsmenu, final ServiceHandle serviceHandle, final AlignFrame alignFrame) { @@ -209,6 +209,7 @@ public class MsaWSClient extends WS1Client method.setToolTipText(WsURL); method.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { AlignmentView msa = alignFrame.gatherSequencesForAlignment(); @@ -228,6 +229,7 @@ public class MsaWSClient extends WS1Client methodR.setToolTipText(WsURL); methodR.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { AlignmentView msa = alignFrame.gatherSequencesForAlignment(); diff --git a/src/jalview/ws/jws1/MsaWSThread.java b/src/jalview/ws/jws1/MsaWSThread.java index be21de7..3fd7c5a 100644 --- a/src/jalview/ws/jws1/MsaWSThread.java +++ b/src/jalview/ws/jws1/MsaWSThread.java @@ -23,6 +23,7 @@ package jalview.ws.jws1; import jalview.analysis.AlignSeq; import jalview.bin.Cache; import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentOrder; import jalview.datamodel.AlignmentView; import jalview.datamodel.ColumnSelection; @@ -147,6 +148,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI * * @return true if getAlignment will return a valid alignment result. */ + @Override public boolean hasResults() { if (subjobComplete && result != null && result.isFinished() @@ -273,6 +275,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI * * @return boolean true if job can be submitted. */ + @Override public boolean hasValidInput() { if (seqs.getSeqs() != null) @@ -285,7 +288,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI String alTitle; // name which will be used to form new alignment window. - Alignment dataset; // dataset to which the new alignment will be + AlignmentI dataset; // dataset to which the new alignment will be // associated. @@ -327,7 +330,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI MsaWSThread(ext.vamsas.MuscleWS server, String wsUrl, WebserviceInfo wsinfo, jalview.gui.AlignFrame alFrame, String wsname, String title, AlignmentView _msa, boolean subgaps, - boolean presorder, Alignment seqset) + boolean presorder, AlignmentI seqset) { this(server, wsUrl, wsinfo, alFrame, _msa, wsname, subgaps, presorder); OutputHeader = wsInfo.getProgressText(); @@ -359,11 +362,13 @@ class MsaWSThread extends JWS1Thread implements WSClientI } } + @Override public boolean isCancellable() { return true; } + @Override public void cancelJob() { if (!jobComplete && jobs != null) @@ -430,11 +435,13 @@ class MsaWSThread extends JWS1Thread implements WSClientI } } + @Override public void pollJob(AWsJob job) throws Exception { ((MsaWSJob) job).result = server.getResult(((MsaWSJob) job).getJobId()); } + @Override public void StartJob(AWsJob job) { if (!(job instanceof MsaWSJob)) @@ -521,6 +528,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI return msa; } + @Override public void parseResult() { int results = 0; // number of result sets received @@ -571,6 +579,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI wsInfo.showResultsNewFrame .addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(java.awt.event.ActionEvent evt) { displayResults(true); @@ -579,6 +588,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI wsInfo.mergeResults .addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(java.awt.event.ActionEvent evt) { displayResults(false); @@ -661,7 +671,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI while (j < l) { if (((AlignmentOrder) alorders.get(i)) - .equals(((AlignmentOrder) alorders.get(j)))) + .equals((alorders.get(j)))) { alorders.remove(j); l--; @@ -704,6 +714,7 @@ class MsaWSThread extends JWS1Thread implements WSClientI } } + @Override public boolean canMergeResults() { return false; diff --git a/src/jalview/ws/jws1/SeqSearchWSClient.java b/src/jalview/ws/jws1/SeqSearchWSClient.java index d731ced..2d83bf9 100644 --- a/src/jalview/ws/jws1/SeqSearchWSClient.java +++ b/src/jalview/ws/jws1/SeqSearchWSClient.java @@ -20,7 +20,7 @@ */ package jalview.ws.jws1; -import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.gui.AlignFrame; import jalview.gui.Desktop; @@ -39,7 +39,6 @@ import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; -import ext.vamsas.SeqSearchI; import ext.vamsas.SeqSearchServiceLocator; import ext.vamsas.SeqSearchServiceSoapBindingStub; import ext.vamsas.ServiceHandle; @@ -77,7 +76,7 @@ public class SeqSearchWSClient extends WS1Client public SeqSearchWSClient(ext.vamsas.ServiceHandle sh, String altitle, jalview.datamodel.AlignmentView msa, String db, - Alignment seqdataset, AlignFrame _alignFrame) + AlignmentI seqdataset, AlignFrame _alignFrame) { super(); alignFrame = _alignFrame; @@ -128,7 +127,7 @@ public class SeqSearchWSClient extends WS1Client } private void startSeqSearchClient(String altitle, AlignmentView msa, - String db, Alignment seqdataset) + String db, AlignmentI seqdataset) { if (!locateWebService()) { @@ -173,7 +172,7 @@ public class SeqSearchWSClient extends WS1Client try { - this.server = (SeqSearchI) loc.getSeqSearchService(new java.net.URL( + this.server = loc.getSeqSearchService(new java.net.URL( WsURL)); ((SeqSearchServiceSoapBindingStub) this.server).setTimeout(60000); // One // minute @@ -241,6 +240,7 @@ public class SeqSearchWSClient extends WS1Client return dbs; } + @Override public void attachWSMenuEntry(JMenu wsmenu, final ServiceHandle sh, final AlignFrame af) { @@ -281,6 +281,7 @@ public class SeqSearchWSClient extends WS1Client method.setToolTipText(sh.getEndpointURL()); method.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { // use same input gatherer as for secondary structure prediction @@ -305,6 +306,7 @@ public class SeqSearchWSClient extends WS1Client final String searchdb = dbs[db]; method.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { AlignmentView msa = af.gatherSeqOrMsaForSecStrPrediction(); diff --git a/src/jalview/ws/jws1/SeqSearchWSThread.java b/src/jalview/ws/jws1/SeqSearchWSThread.java index b2e9b35..70056a6 100644 --- a/src/jalview/ws/jws1/SeqSearchWSThread.java +++ b/src/jalview/ws/jws1/SeqSearchWSThread.java @@ -21,8 +21,10 @@ package jalview.ws.jws1; import jalview.analysis.AlignSeq; +import jalview.api.FeatureColourI; import jalview.bin.Cache; import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; @@ -171,8 +173,8 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI * * @return null or { Alignment(+features and annotation), NewickFile)} */ - public Object[] getAlignment(Alignment dataset, - Map featureColours) + public Object[] getAlignment(AlignmentI dataset, + Map featureColours) { if (result != null && result.isFinished()) @@ -302,7 +304,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI String alTitle; // name which will be used to form new alignment window. - Alignment dataset; // dataset to which the new alignment will be + AlignmentI dataset; // dataset to which the new alignment will be // associated. @@ -344,7 +346,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI SeqSearchWSThread(ext.vamsas.SeqSearchI server, String wsUrl, WebserviceInfo wsinfo, jalview.gui.AlignFrame alFrame, String wsname, String title, AlignmentView _msa, String db, - Alignment seqset) + AlignmentI seqset) { this(server, wsUrl, wsinfo, alFrame, _msa, wsname, db); OutputHeader = wsInfo.getProgressText(); @@ -622,7 +624,7 @@ class SeqSearchWSThread extends JWS1Thread implements WSClientI // NewickFile nf[] = new NewickFile[jobs.length]; for (int j = 0; j < jobs.length; j++) { - Map featureColours = new HashMap(); + Map featureColours = new HashMap(); Alignment al = null; NewickFile nf = null; if (jobs[j].hasResults()) diff --git a/src/jalview/ws/jws2/AADisorderClient.java b/src/jalview/ws/jws2/AADisorderClient.java index f4b1c31..0cf76e0 100644 --- a/src/jalview/ws/jws2/AADisorderClient.java +++ b/src/jalview/ws/jws2/AADisorderClient.java @@ -20,13 +20,15 @@ */ package jalview.ws.jws2; +import jalview.api.AlignCalcWorkerI; +import jalview.api.FeatureColourI; import jalview.bin.Cache; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.GraphLine; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; -import jalview.schemes.GraduatedColor; +import jalview.schemes.FeatureColour; import jalview.schemes.UserColourScheme; import jalview.ws.jws2.jabaws2.Jws2Instance; import jalview.ws.params.WsParamSetI; @@ -306,8 +308,8 @@ public class AADisorderClient extends JabawsCalcWorker annot.description += "
          " + threshNote; } annot.description += ""; - Color col = new UserColourScheme(typeName) - .createColourFromName(typeName + scr.getMethod()); + Color col = UserColourScheme.createColourFromName(typeName + + scr.getMethod()); for (int p = 0, ps = annot.annotations.length; p < ps; p++) { if (annot.annotations[p] != null) @@ -335,13 +337,13 @@ public class AADisorderClient extends JabawsCalcWorker .cloneFeatureRenderer(); for (String ft : fc.keySet()) { - Object gc = fr.getFeatureStyle(ft); - if (gc instanceof Color) + FeatureColourI gc = fr.getFeatureStyle(ft); + if (gc.isSimpleColour()) { // set graduated color as fading to white for minimum, and // autoscaling to values on alignment - GraduatedColor ggc = new GraduatedColor(Color.white, - (Color) gc, Float.MIN_VALUE, Float.MAX_VALUE); + FeatureColourI ggc = new FeatureColour(Color.white, + gc.getColour(), Float.MIN_VALUE, Float.MAX_VALUE); ggc.setAutoScaled(true); fr.setColour(ft, ggc); } diff --git a/src/jalview/ws/jws2/Jws2Client.java b/src/jalview/ws/jws2/Jws2Client.java index c0b701b..8855d96 100644 --- a/src/jalview/ws/jws2/Jws2Client.java +++ b/src/jalview/ws/jws2/Jws2Client.java @@ -256,11 +256,8 @@ public abstract class Jws2Client extends jalview.ws.WSClient }); wsmenu.add(aaConEnabled); final JMenuItem modifyParams = new JMenuItem(aaui.getAAeditSettings()); - modifyParams - .setToolTipText("

          " - + JvSwingUtils.wrapTooltip(false, - aaui.getAAeditSettingsTooltip() + "

          ") - + ""); + modifyParams.setToolTipText(JvSwingUtils.wrapTooltip(true, + aaui.getAAeditSettingsTooltip())); modifyParams.addActionListener(new ActionListener() { diff --git a/src/jalview/ws/jws2/MsaWSClient.java b/src/jalview/ws/jws2/MsaWSClient.java index 47130a3..758d941 100644 --- a/src/jalview/ws/jws2/MsaWSClient.java +++ b/src/jalview/ws/jws2/MsaWSClient.java @@ -20,7 +20,7 @@ */ package jalview.ws.jws2; -import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; import jalview.datamodel.AlignmentView; import jalview.gui.AlignFrame; import jalview.gui.Desktop; @@ -58,7 +58,7 @@ public class MsaWSClient extends Jws2Client public MsaWSClient(Jws2Instance sh, String altitle, jalview.datamodel.AlignmentView msa, boolean submitGaps, - boolean preserveOrder, Alignment seqdataset, + boolean preserveOrder, AlignmentI seqdataset, AlignFrame _alignFrame) { this(sh, null, null, false, altitle, msa, submitGaps, preserveOrder, @@ -68,7 +68,7 @@ public class MsaWSClient extends Jws2Client public MsaWSClient(Jws2Instance sh, WsParamSetI preset, String altitle, jalview.datamodel.AlignmentView msa, boolean submitGaps, - boolean preserveOrder, Alignment seqdataset, + boolean preserveOrder, AlignmentI seqdataset, AlignFrame _alignFrame) { this(sh, preset, null, false, altitle, msa, submitGaps, preserveOrder, @@ -95,7 +95,7 @@ public class MsaWSClient extends Jws2Client public MsaWSClient(Jws2Instance sh, WsParamSetI preset, List arguments, boolean editParams, String altitle, jalview.datamodel.AlignmentView msa, boolean submitGaps, - boolean preserveOrder, Alignment seqdataset, + boolean preserveOrder, AlignmentI seqdataset, AlignFrame _alignFrame) { super(_alignFrame, preset, arguments); @@ -138,7 +138,7 @@ public class MsaWSClient extends Jws2Client } private void startMsaWSClient(String altitle, AlignmentView msa, - boolean submitGaps, boolean preserveOrder, Alignment seqdataset) + boolean submitGaps, boolean preserveOrder, AlignmentI seqdataset) { // if (!locateWebService()) // { @@ -216,6 +216,7 @@ public class MsaWSClient extends Jws2Client return (WebServiceName.indexOf("lustal") > -1); // cheat! } + @Override public void attachWSMenuEntry(JMenu rmsawsmenu, final Jws2Instance service, final AlignFrame alignFrame) { @@ -263,6 +264,7 @@ public class MsaWSClient extends Jws2Client method.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { AlignmentView msa = alignFrame.gatherSequencesForAlignment(); @@ -288,6 +290,7 @@ public class MsaWSClient extends Jws2Client method.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { AlignmentView msa = alignFrame.gatherSequencesForAlignment(); @@ -335,17 +338,19 @@ public class MsaWSClient extends Jws2Client } }); - methodR.setToolTipText(JvSwingUtils.wrapTooltip( + String tooltip = JvSwingUtils.wrapTooltip( true, - "

          " + "" + (preset.isModifiable() ? MessageManager .getString("label.user_preset") : MessageManager .getString("label.service_preset")) - + "
          " + preset.getDescription() - + "

          ")); + + "
          " + + preset.getDescription()); + methodR.setToolTipText(tooltip); methodR.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { AlignmentView msa = alignFrame diff --git a/src/jalview/ws/jws2/MsaWSThread.java b/src/jalview/ws/jws2/MsaWSThread.java index e2f3a7c..e425624 100644 --- a/src/jalview/ws/jws2/MsaWSThread.java +++ b/src/jalview/ws/jws2/MsaWSThread.java @@ -176,6 +176,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI * * @return true if getAlignment will return a valid alignment result. */ + @Override public boolean hasResults() { if (subjobComplete @@ -316,6 +317,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI * * @return boolean true if job can be submitted. */ + @Override public boolean hasValidInput() { // TODO: get attributes for this MsaWS instance to check if it can do two @@ -436,7 +438,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI String alTitle; // name which will be used to form new alignment window. - Alignment dataset; // dataset to which the new alignment will be + AlignmentI dataset; // dataset to which the new alignment will be // associated. @@ -479,7 +481,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI String wsUrl, WebserviceInfo wsinfo, jalview.gui.AlignFrame alFrame, String wsname, String title, AlignmentView _msa, boolean subgaps, boolean presorder, - Alignment seqset) + AlignmentI seqset) { this(server2, wsUrl, wsinfo, alFrame, _msa, wsname, subgaps, presorder); OutputHeader = wsInfo.getProgressText(); @@ -530,11 +532,13 @@ class MsaWSThread extends AWS2Thread implements WSClientI return validInput; } + @Override public boolean isCancellable() { return true; } + @Override public void cancelJob() { if (!jobComplete && jobs != null) @@ -605,6 +609,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI } } + @Override public void pollJob(AWsJob job) throws Exception { // TODO: investigate if we still need to cast here in J1.6 @@ -650,6 +655,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI return changed; } + @Override public void StartJob(AWsJob job) { Exception lex = null; @@ -775,6 +781,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI } } + @Override public void parseResult() { long progbar = System.currentTimeMillis(); @@ -889,6 +896,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI wsInfo.showResultsNewFrame .addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(java.awt.event.ActionEvent evt) { displayResults(true); @@ -897,6 +905,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI wsInfo.mergeResults .addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed(java.awt.event.ActionEvent evt) { displayResults(false); @@ -1023,6 +1032,10 @@ class MsaWSThread extends AWS2Thread implements WSClientI // becomes null if the alignment window was closed before the alignment // job finished. AlignmentI copyComplement = new Alignment(complement); + // todo should this be done by copy constructor? + copyComplement.setGapCharacter(complement.getGapCharacter()); + // share the same dataset (and the mappings it holds) + copyComplement.setDataset(complement.getDataset()); copyComplement.alignAs(al); if (copyComplement.getHeight() > 0) { @@ -1101,6 +1114,7 @@ class MsaWSThread extends AWS2Thread implements WSClientI } } + @Override public boolean canMergeResults() { return false; diff --git a/src/jalview/ws/seqfetcher/ASequenceFetcher.java b/src/jalview/ws/seqfetcher/ASequenceFetcher.java index 2392476..33a917e 100644 --- a/src/jalview/ws/seqfetcher/ASequenceFetcher.java +++ b/src/jalview/ws/seqfetcher/ASequenceFetcher.java @@ -55,7 +55,7 @@ public class ASequenceFetcher /** * Constructor */ - public ASequenceFetcher() + protected ASequenceFetcher() { super(); @@ -125,20 +125,20 @@ public class ASequenceFetcher * if true, only fetch from nucleotide data sources, else peptide * @return */ - public SequenceI[] getSequences(DBRefEntry[] refs, boolean dna) + public SequenceI[] getSequences(List refs, boolean dna) { Vector rseqs = new Vector(); Hashtable> queries = new Hashtable>(); - for (int r = 0; r < refs.length; r++) + for (DBRefEntry ref : refs) { - if (!queries.containsKey(refs[r].getSource())) + if (!queries.containsKey(ref.getSource())) { - queries.put(refs[r].getSource(), new ArrayList()); + queries.put(ref.getSource(), new ArrayList()); } - List qset = queries.get(refs[r].getSource()); - if (!qset.contains(refs[r].getAccessionId())) + List qset = queries.get(ref.getSource()); + if (!qset.contains(ref.getAccessionId())) { - qset.add(refs[r].getAccessionId()); + qset.add(ref.getAccessionId()); } } Enumeration e = queries.keys(); @@ -205,15 +205,12 @@ public class ASequenceFetcher for (int is = 0; is < seqs.length; is++) { rseqs.addElement(seqs[is]); - DBRefEntry[] frefs = DBRefUtils.searchRefs(seqs[is] + List frefs = DBRefUtils.searchRefs(seqs[is] .getDBRefs(), new DBRefEntry(db, null, null)); - if (frefs != null) + for (DBRefEntry dbr : frefs) { - for (DBRefEntry dbr : frefs) - { - queriesFound.add(dbr.getAccessionId()); - queriesMade.remove(dbr.getAccessionId()); - } + queriesFound.add(dbr.getAccessionId()); + queriesMade.remove(dbr.getAccessionId()); } seqs[is] = null; } diff --git a/src/jalview/ws/sifts/MappingOutputPojo.java b/src/jalview/ws/sifts/MappingOutputPojo.java index c06e51f..aa65f49 100644 --- a/src/jalview/ws/sifts/MappingOutputPojo.java +++ b/src/jalview/ws/sifts/MappingOutputPojo.java @@ -20,8 +20,6 @@ public class MappingOutputPojo private String type; - private int wrapHeight; - private static final int MAX_ID_LENGTH = 30; public String getSeqName() @@ -116,14 +114,5 @@ public class MappingOutputPojo this.type = type; } - public int getWrapHeight() - { - return wrapHeight; - } - - public void setWrapHeight(int wrapHeight) - { - this.wrapHeight = wrapHeight; - } } diff --git a/src/jalview/ws/sifts/SiftsClient.java b/src/jalview/ws/sifts/SiftsClient.java index e04bbb7..6c94723 100644 --- a/src/jalview/ws/sifts/SiftsClient.java +++ b/src/jalview/ws/sifts/SiftsClient.java @@ -37,11 +37,9 @@ import jalview.xml.binding.sifts.Entry.Entity.Segment.ListMapRegion.MapRegion; import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue; import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue.CrossRefDb; import jalview.xml.binding.sifts.Entry.Entity.Segment.ListResidue.Residue.ResidueDetail; -import jalview.xml.binding.sifts.Entry.ListDB.Db; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -59,20 +57,18 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.TreeMap; import java.util.zip.GZIPInputStream; import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; -import javax.xml.stream.FactoryConfigurationError; import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import MCview.Atom; import MCview.PDBChain; -import MCview.PDBfile; public class SiftsClient implements SiftsClientI { @@ -84,8 +80,6 @@ public class SiftsClient implements SiftsClientI private String structId; - private String segStartEnd; - private CoordinateSys seqCoordSys = CoordinateSys.UNIPROT; private static final int BUFFER_SIZE = 4096; @@ -96,11 +90,9 @@ public class SiftsClient implements SiftsClientI private static final int PDB_ATOM_POS = 1; - private static final String NOT_FOUND = "Not_Found"; - private static final String NOT_OBSERVED = "Not_Observed"; - private static final String SIFTS_FTP_BASE_URL = "ftp://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/"; + private static final String SIFTS_FTP_BASE_URL = "http://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/"; private final static String NEWLINE = System.lineSeparator(); @@ -108,7 +100,7 @@ public class SiftsClient implements SiftsClientI private HashSet curDBRefAccessionIdsString; - public enum CoordinateSys + private enum CoordinateSys { UNIPROT("UniProt"), PDB("PDBresnum"), PDBe("PDBe"); private String name; @@ -124,7 +116,7 @@ public class SiftsClient implements SiftsClientI } }; - public enum ResidueDetailType + private enum ResidueDetailType { NAME_SEC_STRUCTURE("nameSecondaryStructure"), CODE_SEC_STRUCTURE( "codeSecondaryStructure"), ANNOTATION("Annotation"); @@ -156,21 +148,6 @@ public class SiftsClient implements SiftsClientI siftsEntry = parseSIFTs(siftsFile); } - /** - * Construct an instance of SiftsClient using the supplied SIFTs file. Note: - * The SIFTs file should correspond to the PDB Id in PDBfile instance - * - * @param pdbId - * @param siftsFile - * @throws SiftsException - * @throws Exception - */ - public SiftsClient(PDBfile pdb, File siftsFile) throws SiftsException - { - this.pdb = pdb; - this.pdbId = pdb.getId(); - siftsEntry = parseSIFTs(siftsFile); - } /** * Parse the given SIFTs File and return a JAXB POJO of parsed data @@ -192,23 +169,7 @@ public class SiftsClient implements SiftsClientI .createXMLStreamReader(gzis); Unmarshaller um = jc.createUnmarshaller(); return (Entry) um.unmarshal(streamReader); - } catch (JAXBException e) - { - e.printStackTrace(); - throw new SiftsException(e.getMessage()); - } catch (FileNotFoundException e) - { - e.printStackTrace(); - throw new SiftsException(e.getMessage()); - } catch (XMLStreamException e) - { - e.printStackTrace(); - throw new SiftsException(e.getMessage()); - } catch (FactoryConfigurationError e) - { - e.printStackTrace(); - throw new SiftsException(e.getMessage()); - } catch (IOException e) + } catch (Exception e) { e.printStackTrace(); throw new SiftsException(e.getMessage()); @@ -225,8 +186,9 @@ public class SiftsClient implements SiftsClientI */ public static File getSiftsFile(String pdbId) throws SiftsException { - File siftsFile = new File(SiftsSettings.getSiftDownloadDirectory() - + pdbId.toLowerCase() + ".xml.gz"); + String siftsFileName = SiftsSettings.getSiftDownloadDirectory() + + pdbId.toLowerCase() + ".xml.gz"; + File siftsFile = new File(siftsFileName); if (siftsFile.exists()) { // The line below is required for unit testing... don't comment it out!!! @@ -235,12 +197,28 @@ public class SiftsClient implements SiftsClientI if (isFileOlderThanThreshold(siftsFile, SiftsSettings.getCacheThresholdInDays())) { - // System.out.println("Downloaded file is out of date, hence re-downloading..."); - siftsFile = downloadSiftsFile(pdbId.toLowerCase()); + File oldSiftsFile = new File(siftsFileName + "_old"); + siftsFile.renameTo(oldSiftsFile); + try + { + siftsFile = downloadSiftsFile(pdbId.toLowerCase()); + oldSiftsFile.delete(); + return siftsFile; + } catch (IOException e) + { + e.printStackTrace(); + oldSiftsFile.renameTo(siftsFile); + return new File(siftsFileName); + } } - return siftsFile; } - siftsFile = downloadSiftsFile(pdbId.toLowerCase()); + try + { + siftsFile = downloadSiftsFile(pdbId.toLowerCase()); + } catch (IOException e) + { + throw new SiftsException(e.getMessage()); + } return siftsFile; } @@ -278,8 +256,10 @@ public class SiftsClient implements SiftsClientI * @param pdbId * @return downloaded SIFTs XML file * @throws SiftsException + * @throws IOException */ - public static File downloadSiftsFile(String pdbId) throws SiftsException + public static File downloadSiftsFile(String pdbId) throws SiftsException, + IOException { if (pdbId.contains(".cif")) { @@ -295,8 +275,6 @@ public class SiftsClient implements SiftsClientI { siftsDownloadDir.mkdirs(); } - try - { // System.out.println(">> Download ftp url : " + siftsFileFTPURL); URL url = new URL(siftsFileFTPURL); URLConnection conn = url.openConnection(); @@ -312,10 +290,6 @@ public class SiftsClient implements SiftsClientI outputStream.close(); inputStream.close(); // System.out.println(">>> File downloaded : " + downloadedSiftsFile); - } catch (IOException ex) - { - throw new SiftsException(ex.getMessage()); - } return new File(downloadedSiftsFile); } @@ -360,7 +334,8 @@ public class SiftsClient implements SiftsClientI DBRefEntry[] dbRefs = seq.getDBRefs(); if (dbRefs == null || dbRefs.length < 1) { - throw new SiftsException("Could not get source DB Ref"); + throw new SiftsException( + "Source DBRef could not be determined. DBRefs might not have been retrieved."); } for (DBRefEntryI dbRef : dbRefs) @@ -374,6 +349,7 @@ public class SiftsClient implements SiftsClientI && (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT) || dbRef .getSource().equalsIgnoreCase(DBRefSource.PDB))) { + seq.setSourceDBRef(dbRef); return dbRef; } } @@ -393,7 +369,7 @@ public class SiftsClient implements SiftsClientI * - DBRefEntry to validate * @return true validation is successful otherwise false is returned. */ - private boolean isValidDBRefEntry(DBRefEntryI entry) + boolean isValidDBRefEntry(DBRefEntryI entry) { return entry != null && entry.getAccessionId() != null && isFoundInSiftsEntry(entry.getAccessionId()); @@ -413,7 +389,8 @@ public class SiftsClient implements SiftsClientI .getMapRegion(); for (MapRegion mapRegion : mapRegions) { - accessions.add(mapRegion.getDb().getDbAccessionId()); + accessions + .add(mapRegion.getDb().getDbAccessionId().toLowerCase()); } } } @@ -455,7 +432,7 @@ public class SiftsClient implements SiftsClientI public HashMap getGreedyMapping(String entityId, SequenceI seq, java.io.PrintStream os) throws SiftsException { - ArrayList omitNonObserved = new ArrayList(); + List omitNonObserved = new ArrayList(); int nonObservedShiftIndex = 0; // System.out.println("Generating mappings for : " + entityId); Entity entity = null; @@ -464,12 +441,9 @@ public class SiftsClient implements SiftsClientI jalview.util.Comparison.GapChars, seq.getSequenceAsString()); HashMap mapping = new HashMap(); DBRefEntryI sourceDBRef = seq.getSourceDBRef(); - if (sourceDBRef == null) - { - sourceDBRef = getValidSourceDBRef(seq); - // TODO ensure sequence start/end is in the same coordinate system and - // consistent with the choosen sourceDBRef - } + sourceDBRef = getValidSourceDBRef(seq); + // TODO ensure sequence start/end is in the same coordinate system and + // consistent with the choosen sourceDBRef // set sequence coordinate system - default value is UniProt if (sourceDBRef.getSource().equalsIgnoreCase(DBRefSource.PDB)) @@ -489,10 +463,91 @@ public class SiftsClient implements SiftsClientI TreeMap resNumMap = new TreeMap(); List segments = entity.getSegment(); + SegmentHelperPojo shp = new SegmentHelperPojo(seq, mapping, resNumMap, + omitNonObserved, nonObservedShiftIndex); + processSegments(segments, shp); + try + { + populateAtomPositions(entityId, mapping); + } catch (Exception e) + { + e.printStackTrace(); + } + if (seqCoordSys == CoordinateSys.UNIPROT) + { + padWithGaps(resNumMap, omitNonObserved); + } + int seqStart = UNASSIGNED; + int seqEnd = UNASSIGNED; + int pdbStart = UNASSIGNED; + int pdbEnd = UNASSIGNED; + + Integer[] keys = mapping.keySet().toArray(new Integer[0]); + Arrays.sort(keys); + if (keys.length < 1) + { + throw new SiftsException(">>> Empty SIFTS mapping generated!!"); + } + seqStart = keys[0]; + seqEnd = keys[keys.length - 1]; + + String matchedSeq = originalSeq; + if (seqStart != UNASSIGNED) + { + pdbStart = mapping.get(seqStart)[PDB_RES_POS]; + pdbEnd = mapping.get(seqEnd)[PDB_RES_POS]; + int orignalSeqStart = seq.getStart(); + if (orignalSeqStart >= 1) + { + int subSeqStart = (seqStart >= orignalSeqStart) ? seqStart + - orignalSeqStart : 0; + int subSeqEnd = seqEnd - (orignalSeqStart - 1); + subSeqEnd = originalSeq.length() < subSeqEnd ? originalSeq.length() + : subSeqEnd; + matchedSeq = originalSeq.substring(subSeqStart, subSeqEnd); + } + else + { + matchedSeq = originalSeq.substring(1, originalSeq.length()); + } + } + + StringBuilder targetStrucSeqs = new StringBuilder(); + for (String res : resNumMap.values()) + { + targetStrucSeqs.append(res); + } + + if (os != null) + { + MappingOutputPojo mop = new MappingOutputPojo(); + mop.setSeqStart(pdbStart); + mop.setSeqEnd(pdbEnd); + mop.setSeqName(seq.getName()); + mop.setSeqResidue(matchedSeq); + + mop.setStrStart(seqStart); + mop.setStrEnd(seqEnd); + mop.setStrName(structId); + mop.setStrResidue(targetStrucSeqs.toString()); + + mop.setType("pep"); + os.print(getMappingOutput(mop).toString()); + os.println(); + } + return mapping; + } + + void processSegments(List segments, SegmentHelperPojo shp) + { + SequenceI seq = shp.getSeq(); + HashMap mapping = shp.getMapping(); + TreeMap resNumMap = shp.getResNumMap(); + List omitNonObserved = shp.getOmitNonObserved(); + int nonObservedShiftIndex = shp.getNonObservedShiftIndex(); for (Segment segment : segments) { - segStartEnd = segment.getStart() + " - " + segment.getEnd(); - // System.out.println("Mapping segments : " + segment.getSegId() + "\\" + // System.out.println("Mapping segments : " + segment.getSegId() + "\\"s // + segStartEnd); List residues = segment.getListResidue().getResidue(); for (Residue residue : residues) @@ -566,77 +621,7 @@ public class SiftsClient implements SiftsClientI } } } - try - { - populateAtomPositions(entityId, mapping); - } catch (Exception e) - { - e.printStackTrace(); - } - if (seqCoordSys == CoordinateSys.UNIPROT) - { - padWithGaps(resNumMap, omitNonObserved); - } - int seqStart = UNASSIGNED; - int seqEnd = UNASSIGNED; - int pdbStart = UNASSIGNED; - int pdbEnd = UNASSIGNED; - - Integer[] keys = mapping.keySet().toArray(new Integer[0]); - Arrays.sort(keys); - if (keys.length < 1) - { - throw new SiftsException(">>> Empty SIFTS mapping generated!!"); - } - seqStart = keys[0]; - seqEnd = keys[keys.length - 1]; - - String matchedSeq = originalSeq; - if (seqStart != UNASSIGNED) - { - pdbStart = mapping.get(seqStart)[PDB_RES_POS]; - pdbEnd = mapping.get(seqEnd)[PDB_RES_POS]; - int orignalSeqStart = seq.getStart(); - if (orignalSeqStart >= 1) - { - int subSeqStart = (seqStart >= orignalSeqStart) ? seqStart - - orignalSeqStart : 0; - int subSeqEnd = seqEnd - (orignalSeqStart - 1); - subSeqEnd = originalSeq.length() < subSeqEnd ? originalSeq.length() - : subSeqEnd; - matchedSeq = originalSeq.substring(subSeqStart, subSeqEnd); - } - else - { - matchedSeq = originalSeq.substring(1, originalSeq.length()); - } - } - - StringBuilder targetStrucSeqs = new StringBuilder(); - for (String res : resNumMap.values()) - { - targetStrucSeqs.append(res); - } - - if (os != null) - { - MappingOutputPojo mop = new MappingOutputPojo(); - mop.setSeqStart(pdbStart); - mop.setSeqEnd(pdbEnd); - mop.setSeqName(seq.getName()); - mop.setSeqResidue(matchedSeq); - - mop.setStrStart(seqStart); - mop.setStrEnd(seqEnd); - mop.setStrName(structId); - mop.setStrResidue(targetStrucSeqs.toString()); - - mop.setType("pep"); - os.print(getMappingOutput(mop).toString()); - } - return mapping; } - /** * * @param chainId @@ -645,9 +630,10 @@ public class SiftsClient implements SiftsClientI * Two dimension array of residue index versus atom position * @throws IllegalArgumentException * Thrown if chainId or mapping is null + * @throws SiftsException */ - void populateAtomPositions(String chainId, - HashMap mapping) throws IllegalArgumentException + void populateAtomPositions(String chainId, Map mapping) + throws IllegalArgumentException, SiftsException { try { @@ -665,9 +651,12 @@ public class SiftsClient implements SiftsClientI map[PDB_ATOM_POS] = getAtomIndex(map[PDB_RES_POS], chain.atoms); } } + } catch (NullPointerException e) + { + throw new SiftsException(e.getMessage()); } catch (Exception e) { - e.printStackTrace(); + throw new SiftsException(e.getMessage()); } } @@ -704,7 +693,7 @@ public class SiftsClient implements SiftsClientI */ private boolean isResidueObserved(Residue residue) { - HashSet annotations = getResidueAnnotaitons(residue, + Set annotations = getResidueAnnotaitons(residue, ResidueDetailType.ANNOTATION); if (annotations == null || annotations.isEmpty()) { @@ -727,7 +716,7 @@ public class SiftsClient implements SiftsClientI * @param type * @return */ - private HashSet getResidueAnnotaitons(Residue residue, + private Set getResidueAnnotaitons(Residue residue, ResidueDetailType type) { HashSet foundAnnotations = new HashSet(); @@ -752,8 +741,9 @@ public class SiftsClient implements SiftsClientI private boolean isFoundInSiftsEntry(String accessionId) { + Set siftsDBRefs = getAllMappingAccession(); return accessionId != null - && getAllMappingAccession().contains(accessionId); + && siftsDBRefs.contains(accessionId.toLowerCase()); } /** @@ -761,15 +751,15 @@ public class SiftsClient implements SiftsClientI * * @param resNumMap */ - void padWithGaps(TreeMap resNumMap, - ArrayList omitNonObserved) + void padWithGaps(Map resNumMap, + List omitNonObserved) { if (resNumMap == null || resNumMap.isEmpty()) { return; } Integer[] keys = resNumMap.keySet().toArray(new Integer[0]); - Arrays.sort(keys); + // Arrays.sort(keys); int firstIndex = keys[0]; int lastIndex = keys[keys.length - 1]; // System.out.println("Min value " + firstIndex); @@ -788,28 +778,8 @@ public class SiftsClient implements SiftsClientI @Override public Entity getEntityById(String id) throws SiftsException { - // Sometimes SIFTS mappings are wrongly swapped between different chains of - // a PDB entry. This results to wrong mappings being generated. The boolean - // flag 'isGetEntityIdDirectly, determines whether an entity to process is - // determined by a greedy heuristic search or by just matching the Chain Id - // directly against the entity Id tag. Setting the default value to 'false' - // utilise the heuristic search which always produces correct mappings but - // less optimised processing, where as changing the value to 'true' - // optimises performance but might result to incorrect mapping in some cases - // where SIFTS mappings are wrongly swapped between different chains. - boolean isGetEntityIdDirectly = false; - if (isGetEntityIdDirectly) - { - List entities = siftsEntry.getEntity(); - for (Entity entity : entities) - { - if (!entity.getEntityId().equalsIgnoreCase(id)) - { - continue; - } - return entity; - } - } + // Determines an entity to process by performing a heuristic matching of all + // Entities with the given chainId and choosing the best matching Entity Entity entity = getEntityByMostOptimalMatchedId(id); if (entity != null) { @@ -858,7 +828,8 @@ public class SiftsClient implements SiftsClientI } } } - sPojo[count].pid = 100 * (sPojo[count].chainIdFreq / sPojo[count].resCount); + sPojo[count].pid = (100 * sPojo[count].chainIdFreq) + / sPojo[count].resCount; ++count; } Arrays.sort(sPojo, Collections.reverseOrder()); @@ -879,7 +850,7 @@ public class SiftsClient implements SiftsClientI return null; } - public class SiftsEntitySortPojo implements + private class SiftsEntitySortPojo implements Comparable { public String entityId; @@ -897,18 +868,79 @@ public class SiftsClient implements SiftsClientI } } - @Override - public String[] getEntryDBs() + private class SegmentHelperPojo { - System.out.println("\nListing DB entries..."); - List availDbs = new ArrayList(); - List dbs = siftsEntry.getListDB().getDb(); - for (Db db : dbs) + private SequenceI seq; + + private HashMap mapping; + + private TreeMap resNumMap; + + private List omitNonObserved; + + private int nonObservedShiftIndex; + + public SegmentHelperPojo(SequenceI seq, + HashMap mapping, + TreeMap resNumMap, + List omitNonObserved, int nonObservedShiftIndex) + { + setSeq(seq); + setMapping(mapping); + setResNumMap(resNumMap); + setOmitNonObserved(omitNonObserved); + setNonObservedShiftIndex(nonObservedShiftIndex); + } + + public SequenceI getSeq() + { + return seq; + } + + public void setSeq(SequenceI seq) + { + this.seq = seq; + } + + public HashMap getMapping() + { + return mapping; + } + + public void setMapping(HashMap mapping) + { + this.mapping = mapping; + } + + public TreeMap getResNumMap() + { + return resNumMap; + } + + public void setResNumMap(TreeMap resNumMap) + { + this.resNumMap = resNumMap; + } + + public List getOmitNonObserved() + { + return omitNonObserved; + } + + public void setOmitNonObserved(List omitNonObserved) { - availDbs.add(db.getDbSource()); - System.out.println(db.getDbSource() + " | " + db.getDbCoordSys()); + this.omitNonObserved = omitNonObserved; + } + + public int getNonObservedShiftIndex() + { + return nonObservedShiftIndex; + } + + public void setNonObservedShiftIndex(int nonObservedShiftIndex) + { + this.nonObservedShiftIndex = nonObservedShiftIndex; } - return availDbs.toArray(new String[0]); } @Override @@ -1031,7 +1063,6 @@ public class SiftsClient implements SiftsClientI output.append("Length of alignment = " + seqRes.length()).append( NEWLINE); output.append(new Format("Percentage ID = %2.2f").form(pid)); - output.append(NEWLINE); return output; } @@ -1054,12 +1085,6 @@ public class SiftsClient implements SiftsClientI } @Override - public String getDbEvidence() - { - return siftsEntry.getDbEvidence(); - } - - @Override public String getDbSource() { return siftsEntry.getDbSource(); diff --git a/test/MCview/PDBChainTest.java b/test/MCview/PDBChainTest.java index ff745ac..0406128 100644 --- a/test/MCview/PDBChainTest.java +++ b/test/MCview/PDBChainTest.java @@ -32,7 +32,7 @@ import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.schemes.ColourSchemeI; import jalview.schemes.TaylorColourScheme; -import jalview.structure.StructureViewSettings; +import jalview.structure.StructureImportSettings; import java.awt.Color; import java.util.Vector; @@ -56,7 +56,7 @@ public class PDBChainTest public void setUp() { System.out.println("setup"); - StructureViewSettings.setShowSeqFeatures(true); + StructureImportSettings.setShowSeqFeatures(true); c = new PDBChain("1GAQ", "A"); } diff --git a/test/jalview/analysis/AlignmentUtilsTests.java b/test/jalview/analysis/AlignmentUtilsTests.java index 860d979..7661c5d 100644 --- a/test/jalview/analysis/AlignmentUtilsTests.java +++ b/test/jalview/analysis/AlignmentUtilsTests.java @@ -22,6 +22,7 @@ package jalview.analysis; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertSame; import static org.testng.AssertJUnit.assertTrue; @@ -47,7 +48,6 @@ import jalview.util.MappingUtils; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -974,117 +974,167 @@ public class AlignmentUtilsTests @Test(groups = { "Functional" }) public void testMakeCdsAlignment() { + /* + * scenario: + * dna1 --> [4, 6] [10,12] --> pep1 + * dna2 --> [1, 3] [7, 9] [13,15] --> pep1 + */ SequenceI dna1 = new Sequence("dna1", "aaaGGGcccTTTaaa"); SequenceI dna2 = new Sequence("dna2", "GGGcccTTTaaaCCC"); SequenceI pep1 = new Sequence("pep1", "GF"); SequenceI pep2 = new Sequence("pep2", "GFP"); + pep1.addDBRef(new DBRefEntry("UNIPROT", "0", "pep1")); + pep2.addDBRef(new DBRefEntry("UNIPROT", "0", "pep2")); dna1.createDatasetSequence(); dna2.createDatasetSequence(); pep1.createDatasetSequence(); pep2.createDatasetSequence(); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds1", 4, 6, 0f, - null)); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds2", 10, 12, 0f, - null)); - dna2.addSequenceFeature(new SequenceFeature("CDS", "cds3", 1, 3, 0f, - null)); - dna2.addSequenceFeature(new SequenceFeature("CDS", "cds4", 7, 9, 0f, - null)); - dna2.addSequenceFeature(new SequenceFeature("CDS", "cds5", 13, 15, 0f, - null)); AlignmentI dna = new Alignment(new SequenceI[] { dna1, dna2 }); dna.setDataset(null); - List mappings = new ArrayList(); + /* + * need a sourceDbRef if we are to construct dbrefs to the CDS + * sequence + */ + DBRefEntry dbref = new DBRefEntry("ENSEMBL", "0", "dna1"); + dna1.getDatasetSequence().setSourceDBRef(dbref); + dbref = new DBRefEntry("ENSEMBL", "0", "dna2"); + dna2.getDatasetSequence().setSourceDBRef(dbref); + + /* + * CDS sequences are 'discovered' from dna-to-protein mappings on the alignment + * dataset (e.g. added from dbrefs by CrossRef.findXrefSequences) + */ MapList map = new MapList(new int[] { 4, 6, 10, 12 }, new int[] { 1, 2 }, 3, 1); AlignedCodonFrame acf = new AlignedCodonFrame(); acf.addMap(dna1.getDatasetSequence(), pep1.getDatasetSequence(), map); - mappings.add(acf); + dna.addCodonFrame(acf); map = new MapList(new int[] { 1, 3, 7, 9, 13, 15 }, new int[] { 1, 3 }, 3, 1); acf = new AlignedCodonFrame(); acf.addMap(dna2.getDatasetSequence(), pep2.getDatasetSequence(), map); - mappings.add(acf); + dna.addCodonFrame(acf); /* * execute method under test: */ AlignmentI cds = AlignmentUtils.makeCdsAlignment(new SequenceI[] { - dna1, dna2 }, mappings, dna); + dna1, dna2 }, dna.getDataset(), null); + /* + * verify cds sequences + */ assertEquals(2, cds.getSequences().size()); - assertEquals("GGGTTT", cds.getSequenceAt(0) - .getSequenceAsString()); - assertEquals("GGGTTTCCC", cds.getSequenceAt(1) - .getSequenceAsString()); + assertEquals("GGGTTT", cds.getSequenceAt(0).getSequenceAsString()); + assertEquals("GGGTTTCCC", cds.getSequenceAt(1).getSequenceAsString()); /* * verify shared, extended alignment dataset */ assertSame(dna.getDataset(), cds.getDataset()); - assertTrue(dna.getDataset().getSequences() - .contains(cds.getSequenceAt(0).getDatasetSequence())); - assertTrue(dna.getDataset().getSequences() - .contains(cds.getSequenceAt(1).getDatasetSequence())); + SequenceI cds1Dss = cds.getSequenceAt(0).getDatasetSequence(); + SequenceI cds2Dss = cds.getSequenceAt(1).getDatasetSequence(); + assertTrue(dna.getDataset().getSequences().contains(cds1Dss)); + assertTrue(dna.getDataset().getSequences().contains(cds2Dss)); + + /* + * verify CDS has a dbref with mapping to peptide + */ + assertNotNull(cds1Dss.getDBRefs()); + assertEquals(1, cds1Dss.getDBRefs().length); + dbref = cds1Dss.getDBRefs()[0]; + assertEquals("UNIPROT", dbref.getSource()); + assertEquals("0", dbref.getVersion()); + assertEquals("pep1", dbref.getAccessionId()); + assertNotNull(dbref.getMap()); + assertSame(pep1.getDatasetSequence(), dbref.getMap().getTo()); + MapList cdsMapping = new MapList(new int[] { 1, 6 }, + new int[] { 1, 2 }, 3, 1); + assertEquals(cdsMapping, dbref.getMap().getMap()); + + /* + * verify peptide has added a dbref with reverse mapping to CDS + */ + assertNotNull(pep1.getDBRefs()); + assertEquals(2, pep1.getDBRefs().length); + dbref = pep1.getDBRefs()[1]; + assertEquals("ENSEMBL", dbref.getSource()); + assertEquals("0", dbref.getVersion()); + assertEquals("CDS|dna1", dbref.getAccessionId()); + assertNotNull(dbref.getMap()); + assertSame(cds1Dss, dbref.getMap().getTo()); + assertEquals(cdsMapping.getInverse(), dbref.getMap().getMap()); /* - * Verify mappings from CDS to peptide and cDNA to CDS + * Verify mappings from CDS to peptide, cDNA to CDS, and cDNA to peptide * the mappings are on the shared alignment dataset + * 6 mappings, 2*(DNA->CDS), 2*(DNA->Pep), 2*(CDS->Pep) */ - assertSame(dna.getCodonFrames(), cds.getCodonFrames()); - List cdsMappings = cds.getCodonFrames(); - assertEquals(2, cdsMappings.size()); - + List cdsMappings = cds.getDataset().getCodonFrames(); + assertEquals(6, cdsMappings.size()); + /* + * verify that mapping sets for dna and cds alignments are different + * [not current behaviour - all mappings are on the alignment dataset] + */ + // select -> subselect type to test. + // Assert.assertNotSame(dna.getCodonFrames(), cds.getCodonFrames()); + // assertEquals(4, dna.getCodonFrames().size()); + // assertEquals(4, cds.getCodonFrames().size()); + + /* + * Two mappings involve pep1 (dna to pep1, cds to pep1) * Mapping from pep1 to GGGTTT in first new exon sequence */ - List pep1Mapping = MappingUtils + List pep1Mappings = MappingUtils .findMappingsForSequence(pep1, cdsMappings); - assertEquals(1, pep1Mapping.size()); + assertEquals(2, pep1Mappings.size()); + List mappings = MappingUtils + .findMappingsForSequence(cds.getSequenceAt(0), pep1Mappings); + assertEquals(1, mappings.size()); + // map G to GGG - SearchResults sr = MappingUtils - .buildSearchResults(pep1, 1, cdsMappings); + SearchResults sr = MappingUtils.buildSearchResults(pep1, 1, mappings); assertEquals(1, sr.getResults().size()); Match m = sr.getResults().get(0); - assertSame(cds.getSequenceAt(0).getDatasetSequence(), - m.getSequence()); + assertSame(cds1Dss, m.getSequence()); assertEquals(1, m.getStart()); assertEquals(3, m.getEnd()); // map F to TTT - sr = MappingUtils.buildSearchResults(pep1, 2, cdsMappings); + sr = MappingUtils.buildSearchResults(pep1, 2, mappings); m = sr.getResults().get(0); - assertSame(cds.getSequenceAt(0).getDatasetSequence(), - m.getSequence()); + assertSame(cds1Dss, m.getSequence()); assertEquals(4, m.getStart()); assertEquals(6, m.getEnd()); /* - * Mapping from pep2 to GGGTTTCCC in second new exon sequence + * Two mappings involve pep2 (dna to pep2, cds to pep2) + * Verify mapping from pep2 to GGGTTTCCC in second new exon sequence */ - List pep2Mapping = MappingUtils + List pep2Mappings = MappingUtils .findMappingsForSequence(pep2, cdsMappings); - assertEquals(1, pep2Mapping.size()); + assertEquals(2, pep2Mappings.size()); + mappings = MappingUtils.findMappingsForSequence(cds.getSequenceAt(1), + pep2Mappings); + assertEquals(1, mappings.size()); // map G to GGG - sr = MappingUtils.buildSearchResults(pep2, 1, cdsMappings); + sr = MappingUtils.buildSearchResults(pep2, 1, mappings); assertEquals(1, sr.getResults().size()); m = sr.getResults().get(0); - assertSame(cds.getSequenceAt(1).getDatasetSequence(), - m.getSequence()); + assertSame(cds2Dss, m.getSequence()); assertEquals(1, m.getStart()); assertEquals(3, m.getEnd()); // map F to TTT - sr = MappingUtils.buildSearchResults(pep2, 2, cdsMappings); + sr = MappingUtils.buildSearchResults(pep2, 2, mappings); m = sr.getResults().get(0); - assertSame(cds.getSequenceAt(1).getDatasetSequence(), - m.getSequence()); + assertSame(cds2Dss, m.getSequence()); assertEquals(4, m.getStart()); assertEquals(6, m.getEnd()); // map P to CCC - sr = MappingUtils.buildSearchResults(pep2, 3, cdsMappings); + sr = MappingUtils.buildSearchResults(pep2, 3, mappings); m = sr.getResults().get(0); - assertSame(cds.getSequenceAt(1).getDatasetSequence(), - m.getSequence()); + assertSame(cds2Dss, m.getSequence()); assertEquals(7, m.getStart()); assertEquals(9, m.getEnd()); } @@ -1105,18 +1155,6 @@ public class AlignmentUtilsTests pep1.createDatasetSequence(); pep2.createDatasetSequence(); pep3.createDatasetSequence(); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds1", 4, 6, 0f, - null)); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds2", 10, 12, 0f, - null)); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds3", 1, 3, 0f, - null)); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds4", 7, 9, 0f, - null)); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds5", 1, 3, 0f, - null)); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds6", 10, 12, 0f, - null)); pep1.getDatasetSequence().addDBRef( new DBRefEntry("EMBLCDS", "2", "A12345")); pep2.getDatasetSequence().addDBRef( @@ -1125,40 +1163,38 @@ public class AlignmentUtilsTests new DBRefEntry("EMBLCDS", "4", "A12347")); /* + * Create the CDS alignment + */ + AlignmentI dna = new Alignment(new SequenceI[] { dna1 }); + dna.setDataset(null); + + /* * Make the mappings from dna to protein */ - List mappings = new ArrayList(); // map ...GGG...TTT to GF MapList map = new MapList(new int[] { 4, 6, 10, 12 }, new int[] { 1, 2 }, 3, 1); AlignedCodonFrame acf = new AlignedCodonFrame(); acf.addMap(dna1.getDatasetSequence(), pep1.getDatasetSequence(), map); - mappings.add(acf); + dna.addCodonFrame(acf); // map aaa...ccc to KP map = new MapList(new int[] { 1, 3, 7, 9 }, new int[] { 1, 2 }, 3, 1); acf = new AlignedCodonFrame(); acf.addMap(dna1.getDatasetSequence(), pep2.getDatasetSequence(), map); - mappings.add(acf); + dna.addCodonFrame(acf); // map aaa......TTT to KF map = new MapList(new int[] { 1, 3, 10, 12 }, new int[] { 1, 2 }, 3, 1); acf = new AlignedCodonFrame(); acf.addMap(dna1.getDatasetSequence(), pep3.getDatasetSequence(), map); - mappings.add(acf); - - /* - * Create the CDS alignment; also augments the dna-to-protein mappings with - * exon-to-protein and exon-to-dna mappings - */ - AlignmentI dna = new Alignment(new SequenceI[] { dna1 }); - dna.setDataset(null); + dna.addCodonFrame(acf); /* * execute method under test */ AlignmentI cdsal = AlignmentUtils.makeCdsAlignment( - new SequenceI[] { dna1 }, mappings, dna); + new SequenceI[] { dna1 }, dna.getDataset(), null); /* * Verify we have 3 cds sequences, mapped to pep1/2/3 respectively @@ -1183,7 +1219,7 @@ public class AlignmentUtilsTests SequenceI cdsSeq = cds.get(0); assertEquals("GGGTTT", cdsSeq.getSequenceAsString()); // assertEquals("dna1|A12345", cdsSeq.getName()); - assertEquals("dna1|pep1", cdsSeq.getName()); + assertEquals("CDS|dna1", cdsSeq.getName()); // assertEquals(1, cdsSeq.getDBRefs().length); // DBRefEntry cdsRef = cdsSeq.getDBRefs()[0]; // assertEquals("EMBLCDS", cdsRef.getSource()); @@ -1193,7 +1229,7 @@ public class AlignmentUtilsTests cdsSeq = cds.get(1); assertEquals("aaaccc", cdsSeq.getSequenceAsString()); // assertEquals("dna1|A12346", cdsSeq.getName()); - assertEquals("dna1|pep2", cdsSeq.getName()); + assertEquals("CDS|dna1", cdsSeq.getName()); // assertEquals(1, cdsSeq.getDBRefs().length); // cdsRef = cdsSeq.getDBRefs()[0]; // assertEquals("EMBLCDS", cdsRef.getSource()); @@ -1203,7 +1239,7 @@ public class AlignmentUtilsTests cdsSeq = cds.get(2); assertEquals("aaaTTT", cdsSeq.getSequenceAsString()); // assertEquals("dna1|A12347", cdsSeq.getName()); - assertEquals("dna1|pep3", cdsSeq.getName()); + assertEquals("CDS|dna1", cdsSeq.getName()); // assertEquals(1, cdsSeq.getDBRefs().length); // cdsRef = cdsSeq.getDBRefs()[0]; // assertEquals("EMBLCDS", cdsRef.getSource()); @@ -1214,41 +1250,74 @@ public class AlignmentUtilsTests * Verify there are mappings from each cds sequence to its protein product * and also to its dna source */ - Iterator newMappingsIterator = cdsal - .getCodonFrames().iterator(); + List newMappings = cdsal.getCodonFrames(); - // mappings for dna1 - exon1 - pep1 - AlignedCodonFrame cdsMapping = newMappingsIterator.next(); - List dnaMappings = cdsMapping.getMappingsFromSequence(dna1); - assertEquals(3, dnaMappings.size()); - assertSame(cds.get(0).getDatasetSequence(), dnaMappings.get(0) - .getTo()); - assertEquals("G(1) in CDS should map to G(4) in DNA", 4, dnaMappings - .get(0).getMap().getToPosition(1)); - List peptideMappings = cdsMapping.getMappingsFromSequence(cds - .get(0).getDatasetSequence()); - assertEquals(1, peptideMappings.size()); - assertSame(pep1.getDatasetSequence(), peptideMappings.get(0).getTo()); - - // mappings for dna1 - cds2 - pep2 - assertSame(cds.get(1).getDatasetSequence(), dnaMappings.get(1) - .getTo()); - assertEquals("c(4) in CDS should map to c(7) in DNA", 7, dnaMappings - .get(1).getMap().getToPosition(4)); - peptideMappings = cdsMapping.getMappingsFromSequence(cds.get(1) - .getDatasetSequence()); - assertEquals(1, peptideMappings.size()); - assertSame(pep2.getDatasetSequence(), peptideMappings.get(0).getTo()); - - // mappings for dna1 - cds3 - pep3 - assertSame(cds.get(2).getDatasetSequence(), dnaMappings.get(2) + /* + * 6 mappings involve dna1 (to pep1/2/3, cds1/2/3) + */ + List dnaMappings = MappingUtils + .findMappingsForSequence(dna1, newMappings); + assertEquals(6, dnaMappings.size()); + + /* + * dna1 to pep1 + */ + List mappings = MappingUtils + .findMappingsForSequence(pep1, dnaMappings); + assertEquals(1, mappings.size()); + assertEquals(1, mappings.get(0).getMappings().size()); + assertSame(pep1.getDatasetSequence(), mappings.get(0).getMappings() + .get(0).getMapping().getTo()); + + /* + * dna1 to cds1 + */ + List dnaToCds1Mappings = MappingUtils + .findMappingsForSequence(cds.get(0), dnaMappings); + Mapping mapping = dnaToCds1Mappings.get(0).getMappings().get(0) + .getMapping(); + assertSame(cds.get(0).getDatasetSequence(), mapping .getTo()); - assertEquals("T(4) in CDS should map to T(10) in DNA", 10, dnaMappings - .get(2).getMap().getToPosition(4)); - peptideMappings = cdsMapping.getMappingsFromSequence(cds.get(2) - .getDatasetSequence()); - assertEquals(1, peptideMappings.size()); - assertSame(pep3.getDatasetSequence(), peptideMappings.get(0).getTo()); + assertEquals("G(1) in CDS should map to G(4) in DNA", 4, mapping + .getMap().getToPosition(1)); + + /* + * dna1 to pep2 + */ + mappings = MappingUtils.findMappingsForSequence(pep2, dnaMappings); + assertEquals(1, mappings.size()); + assertEquals(1, mappings.get(0).getMappings().size()); + assertSame(pep2.getDatasetSequence(), mappings.get(0).getMappings() + .get(0).getMapping().getTo()); + + /* + * dna1 to cds2 + */ + List dnaToCds2Mappings = MappingUtils + .findMappingsForSequence(cds.get(1), dnaMappings); + mapping = dnaToCds2Mappings.get(0).getMappings().get(0).getMapping(); + assertSame(cds.get(1).getDatasetSequence(), mapping.getTo()); + assertEquals("c(4) in CDS should map to c(7) in DNA", 7, mapping + .getMap().getToPosition(4)); + + /* + * dna1 to pep3 + */ + mappings = MappingUtils.findMappingsForSequence(pep3, dnaMappings); + assertEquals(1, mappings.size()); + assertEquals(1, mappings.get(0).getMappings().size()); + assertSame(pep3.getDatasetSequence(), mappings.get(0).getMappings() + .get(0).getMapping().getTo()); + + /* + * dna1 to cds3 + */ + List dnaToCds3Mappings = MappingUtils + .findMappingsForSequence(cds.get(2), dnaMappings); + mapping = dnaToCds3Mappings.get(0).getMappings().get(0).getMapping(); + assertSame(cds.get(2).getDatasetSequence(), mapping.getTo()); + assertEquals("T(4) in CDS should map to T(10) in DNA", 10, mapping + .getMap().getToPosition(4)); } @Test(groups = { "Functional" }) @@ -1497,36 +1566,24 @@ public class AlignmentUtilsTests dna3.createDatasetSequence(); pep1.createDatasetSequence(); pep2.createDatasetSequence(); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds1", 4, 8, 0f, - null)); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds2", 9, 12, 0f, - null)); - dna1.addSequenceFeature(new SequenceFeature("CDS", "cds3", 16, 18, 0f, - null)); - dna2.addSequenceFeature(new SequenceFeature("CDS", "cds", 4, 8, 0f, - null)); - dna2.addSequenceFeature(new SequenceFeature("CDS", "cds", 12, 12, 0f, - null)); - dna2.addSequenceFeature(new SequenceFeature("CDS", "cds", 16, 18, 0f, - null)); + + AlignmentI dna = new Alignment(new SequenceI[] { dna1, dna2, dna3 }); + dna.setDataset(null); - List mappings = new ArrayList(); MapList map = new MapList(new int[] { 4, 12, 16, 18 }, new int[] { 1, 4 }, 3, 1); AlignedCodonFrame acf = new AlignedCodonFrame(); acf.addMap(dna1.getDatasetSequence(), pep1.getDatasetSequence(), map); - mappings.add(acf); + dna.addCodonFrame(acf); map = new MapList(new int[] { 4, 8, 12, 12, 16, 18 }, new int[] { 1, 3 }, 3, 1); acf = new AlignedCodonFrame(); acf.addMap(dna2.getDatasetSequence(), pep2.getDatasetSequence(), map); - mappings.add(acf); + dna.addCodonFrame(acf); - AlignmentI dna = new Alignment(new SequenceI[] { dna1, dna2, dna3 }); - dna.setDataset(null); AlignmentI cds = AlignmentUtils.makeCdsAlignment(new SequenceI[] { - dna1, dna2, dna3 }, mappings, dna); + dna1, dna2, dna3 }, dna.getDataset(), null); List cdsSeqs = cds.getSequences(); assertEquals(2, cdsSeqs.size()); assertEquals("GGGCCCTTTGGG", cdsSeqs.get(0).getSequenceAsString()); @@ -1542,59 +1599,69 @@ public class AlignmentUtilsTests .contains(cdsSeqs.get(1).getDatasetSequence())); /* - * Verify updated mappings + * Verify 6 mappings: dna1 to cds1, cds1 to pep1, dna1 to pep1 + * and the same for dna2/cds2/pep2 */ - List cdsMappings = cds.getCodonFrames(); - assertEquals(2, cdsMappings.size()); + List mappings = cds.getCodonFrames(); + assertEquals(6, mappings.size()); /* - * Mapping from pep1 to GGGTTT in first new CDS sequence + * 2 mappings involve pep1 */ - List pep1Mapping = MappingUtils - .findMappingsForSequence(pep1, cdsMappings); - assertEquals(1, pep1Mapping.size()); + List pep1Mappings = MappingUtils + .findMappingsForSequence(pep1, mappings); + assertEquals(2, pep1Mappings.size()); + /* + * Get mapping of pep1 to cds1 and verify it * maps GPFG to 1-3,4-6,7-9,10-12 */ - SearchResults sr = MappingUtils - .buildSearchResults(pep1, 1, cdsMappings); + List pep1CdsMappings = MappingUtils + .findMappingsForSequence(cds.getSequenceAt(0), pep1Mappings); + assertEquals(1, pep1CdsMappings.size()); + SearchResults sr = MappingUtils.buildSearchResults(pep1, 1, + pep1CdsMappings); assertEquals(1, sr.getResults().size()); Match m = sr.getResults().get(0); assertEquals(cds.getSequenceAt(0).getDatasetSequence(), m.getSequence()); assertEquals(1, m.getStart()); assertEquals(3, m.getEnd()); - sr = MappingUtils.buildSearchResults(pep1, 2, cdsMappings); + sr = MappingUtils.buildSearchResults(pep1, 2, pep1CdsMappings); m = sr.getResults().get(0); assertEquals(4, m.getStart()); assertEquals(6, m.getEnd()); - sr = MappingUtils.buildSearchResults(pep1, 3, cdsMappings); + sr = MappingUtils.buildSearchResults(pep1, 3, pep1CdsMappings); m = sr.getResults().get(0); assertEquals(7, m.getStart()); assertEquals(9, m.getEnd()); - sr = MappingUtils.buildSearchResults(pep1, 4, cdsMappings); + sr = MappingUtils.buildSearchResults(pep1, 4, pep1CdsMappings); m = sr.getResults().get(0); assertEquals(10, m.getStart()); assertEquals(12, m.getEnd()); /* - * GPG in pep2 map to 1-3,4-6,7-9 in second CDS sequence + * Get mapping of pep2 to cds2 and verify it + * maps GPG in pep2 to 1-3,4-6,7-9 in second CDS sequence */ - List pep2Mapping = MappingUtils - .findMappingsForSequence(pep2, cdsMappings); - assertEquals(1, pep2Mapping.size()); - sr = MappingUtils.buildSearchResults(pep2, 1, cdsMappings); + List pep2Mappings = MappingUtils + .findMappingsForSequence(pep2, mappings); + assertEquals(2, pep2Mappings.size()); + List pep2CdsMappings = MappingUtils + .findMappingsForSequence(cds.getSequenceAt(1), pep2Mappings); + assertEquals(1, pep2CdsMappings.size()); + sr = MappingUtils.buildSearchResults(pep2, 1, pep2CdsMappings); assertEquals(1, sr.getResults().size()); m = sr.getResults().get(0); assertEquals(cds.getSequenceAt(1).getDatasetSequence(), m.getSequence()); assertEquals(1, m.getStart()); assertEquals(3, m.getEnd()); - sr = MappingUtils.buildSearchResults(pep2, 2, cdsMappings); + sr = MappingUtils.buildSearchResults(pep2, 2, pep2CdsMappings); m = sr.getResults().get(0); assertEquals(4, m.getStart()); assertEquals(6, m.getEnd()); - sr = MappingUtils.buildSearchResults(pep2, 3, cdsMappings); + sr = MappingUtils.buildSearchResults(pep2, 3, pep2CdsMappings); m = sr.getResults().get(0); assertEquals(7, m.getStart()); assertEquals(9, m.getEnd()); @@ -1968,60 +2035,65 @@ public class AlignmentUtilsTests SequenceFeature sf = sfs[0]; assertEquals(1, sf.getBegin()); assertEquals(1, sf.getEnd()); - assertEquals("K->E", sf.getDescription()); + assertEquals("p.Lys1Glu", sf.getDescription()); assertEquals("var1.125A>G", sf.getValue("ID")); assertNull(sf.getValue("clinical_significance")); assertEquals("ID=var1.125A>G", sf.getAttributes()); assertEquals(1, sf.links.size()); // link to variation is urlencoded assertEquals( - "K->E var1.125A>G|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var1.125A%3EG", + "p.Lys1Glu var1.125A>G|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var1.125A%3EG", sf.links.get(0)); + assertEquals("Jalview", sf.getFeatureGroup()); sf = sfs[1]; assertEquals(1, sf.getBegin()); assertEquals(1, sf.getEnd()); - assertEquals("K->Q", sf.getDescription()); + assertEquals("p.Lys1Gln", sf.getDescription()); assertEquals("var2", sf.getValue("ID")); assertEquals("Dodgy", sf.getValue("clinical_significance")); assertEquals("ID=var2;clinical_significance=Dodgy", sf.getAttributes()); assertEquals(1, sf.links.size()); assertEquals( - "K->Q var2|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var2", + "p.Lys1Gln var2|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var2", sf.links.get(0)); + assertEquals("Jalview", sf.getFeatureGroup()); sf = sfs[2]; assertEquals(1, sf.getBegin()); assertEquals(1, sf.getEnd()); - assertEquals("K->N", sf.getDescription()); + assertEquals("p.Lys1Asn", sf.getDescription()); assertEquals("var4", sf.getValue("ID")); assertEquals("Benign", sf.getValue("clinical_significance")); assertEquals("ID=var4;clinical_significance=Benign", sf.getAttributes()); assertEquals(1, sf.links.size()); assertEquals( - "K->N var4|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var4", + "p.Lys1Asn var4|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var4", sf.links.get(0)); + assertEquals("Jalview", sf.getFeatureGroup()); sf = sfs[3]; assertEquals(3, sf.getBegin()); assertEquals(3, sf.getEnd()); - assertEquals("P->H", sf.getDescription()); + assertEquals("p.Pro3His", sf.getDescription()); assertEquals("var6", sf.getValue("ID")); assertEquals("Good", sf.getValue("clinical_significance")); assertEquals("ID=var6;clinical_significance=Good", sf.getAttributes()); assertEquals(1, sf.links.size()); assertEquals( - "P->H var6|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var6", + "p.Pro3His var6|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var6", sf.links.get(0)); // var5 generates two distinct protein variant features + assertEquals("Jalview", sf.getFeatureGroup()); sf = sfs[4]; assertEquals(3, sf.getBegin()); assertEquals(3, sf.getEnd()); - assertEquals("P->R", sf.getDescription()); + assertEquals("p.Pro3Arg", sf.getDescription()); assertEquals("var6", sf.getValue("ID")); assertEquals("Good", sf.getValue("clinical_significance")); assertEquals("ID=var6;clinical_significance=Good", sf.getAttributes()); assertEquals(1, sf.links.size()); assertEquals( - "P->R var6|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var6", + "p.Pro3Arg var6|http://www.ensembl.org/Homo_sapiens/Variation/Summary?v=var6", sf.links.get(0)); + assertEquals("Jalview", sf.getFeatureGroup()); } /** @@ -2188,4 +2260,217 @@ public class AlignmentUtilsTests assertEquals('T', map.get(11).get(seq1).charValue()); assertEquals('T', map.get(12).get(seq1).charValue()); } + + /** + * Test for the case where the products for which we want CDS are specified. + * This is to represent the case where EMBL has CDS mappings to both Uniprot + * and EMBLCDSPROTEIN. makeCdsAlignment() should only return the mappings for + * the protein sequences specified. + */ + @Test(groups = { "Functional" }) + public void testMakeCdsAlignment_filterProducts() + { + SequenceI dna1 = new Sequence("dna1", "aaaGGGcccTTTaaa"); + SequenceI dna2 = new Sequence("dna2", "GGGcccTTTaaaCCC"); + SequenceI pep1 = new Sequence("Uniprot|pep1", "GF"); + SequenceI pep2 = new Sequence("Uniprot|pep2", "GFP"); + SequenceI pep3 = new Sequence("EMBL|pep3", "GF"); + SequenceI pep4 = new Sequence("EMBL|pep4", "GFP"); + dna1.createDatasetSequence(); + dna2.createDatasetSequence(); + pep1.createDatasetSequence(); + pep2.createDatasetSequence(); + pep3.createDatasetSequence(); + pep4.createDatasetSequence(); + AlignmentI dna = new Alignment(new SequenceI[] { dna1, dna2 }); + dna.setDataset(null); + AlignmentI emblPeptides = new Alignment(new SequenceI[] { pep3, pep4 }); + emblPeptides.setDataset(null); + + AlignedCodonFrame acf = new AlignedCodonFrame(); + MapList map = new MapList(new int[] { 4, 6, 10, 12 }, + new int[] { 1, 2 }, 3, 1); + acf.addMap(dna1.getDatasetSequence(), pep1.getDatasetSequence(), map); + acf.addMap(dna1.getDatasetSequence(), pep3.getDatasetSequence(), map); + dna.addCodonFrame(acf); + + acf = new AlignedCodonFrame(); + map = new MapList(new int[] { 1, 3, 7, 9, 13, 15 }, new int[] { 1, 3 }, + 3, 1); + acf.addMap(dna2.getDatasetSequence(), pep2.getDatasetSequence(), map); + acf.addMap(dna2.getDatasetSequence(), pep4.getDatasetSequence(), map); + dna.addCodonFrame(acf); + + /* + * execute method under test to find CDS for EMBL peptides only + */ + AlignmentI cds = AlignmentUtils.makeCdsAlignment(new SequenceI[] { + dna1, dna2 }, dna.getDataset(), emblPeptides.getSequencesArray()); + + assertEquals(2, cds.getSequences().size()); + assertEquals("GGGTTT", cds.getSequenceAt(0).getSequenceAsString()); + assertEquals("GGGTTTCCC", cds.getSequenceAt(1).getSequenceAsString()); + + /* + * verify shared, extended alignment dataset + */ + assertSame(dna.getDataset(), cds.getDataset()); + assertTrue(dna.getDataset().getSequences() + .contains(cds.getSequenceAt(0).getDatasetSequence())); + assertTrue(dna.getDataset().getSequences() + .contains(cds.getSequenceAt(1).getDatasetSequence())); + + /* + * Verify mappings from CDS to peptide, cDNA to CDS, and cDNA to peptide + * the mappings are on the shared alignment dataset + */ + List cdsMappings = cds.getDataset().getCodonFrames(); + /* + * 6 mappings, 2*(DNA->CDS), 2*(DNA->Pep), 2*(CDS->Pep) + */ + assertEquals(6, cdsMappings.size()); + + /* + * verify that mapping sets for dna and cds alignments are different + * [not current behaviour - all mappings are on the alignment dataset] + */ + // select -> subselect type to test. + // Assert.assertNotSame(dna.getCodonFrames(), cds.getCodonFrames()); + // assertEquals(4, dna.getCodonFrames().size()); + // assertEquals(4, cds.getCodonFrames().size()); + + /* + * Two mappings involve pep3 (dna to pep3, cds to pep3) + * Mapping from pep3 to GGGTTT in first new exon sequence + */ + List pep3Mappings = MappingUtils + .findMappingsForSequence(pep3, cdsMappings); + assertEquals(2, pep3Mappings.size()); + List mappings = MappingUtils + .findMappingsForSequence(cds.getSequenceAt(0), pep3Mappings); + assertEquals(1, mappings.size()); + + // map G to GGG + SearchResults sr = MappingUtils.buildSearchResults(pep3, 1, mappings); + assertEquals(1, sr.getResults().size()); + Match m = sr.getResults().get(0); + assertSame(cds.getSequenceAt(0).getDatasetSequence(), m.getSequence()); + assertEquals(1, m.getStart()); + assertEquals(3, m.getEnd()); + // map F to TTT + sr = MappingUtils.buildSearchResults(pep3, 2, mappings); + m = sr.getResults().get(0); + assertSame(cds.getSequenceAt(0).getDatasetSequence(), m.getSequence()); + assertEquals(4, m.getStart()); + assertEquals(6, m.getEnd()); + + /* + * Two mappings involve pep4 (dna to pep4, cds to pep4) + * Verify mapping from pep4 to GGGTTTCCC in second new exon sequence + */ + List pep4Mappings = MappingUtils + .findMappingsForSequence(pep4, cdsMappings); + assertEquals(2, pep4Mappings.size()); + mappings = MappingUtils.findMappingsForSequence(cds.getSequenceAt(1), + pep4Mappings); + assertEquals(1, mappings.size()); + // map G to GGG + sr = MappingUtils.buildSearchResults(pep4, 1, mappings); + assertEquals(1, sr.getResults().size()); + m = sr.getResults().get(0); + assertSame(cds.getSequenceAt(1).getDatasetSequence(), m.getSequence()); + assertEquals(1, m.getStart()); + assertEquals(3, m.getEnd()); + // map F to TTT + sr = MappingUtils.buildSearchResults(pep4, 2, mappings); + m = sr.getResults().get(0); + assertSame(cds.getSequenceAt(1).getDatasetSequence(), m.getSequence()); + assertEquals(4, m.getStart()); + assertEquals(6, m.getEnd()); + // map P to CCC + sr = MappingUtils.buildSearchResults(pep4, 3, mappings); + m = sr.getResults().get(0); + assertSame(cds.getSequenceAt(1).getDatasetSequence(), m.getSequence()); + assertEquals(7, m.getStart()); + assertEquals(9, m.getEnd()); + } + + /** + * Test the method that just copies aligned sequences, provided all sequences + * to be aligned share the aligned sequence's dataset + */ + @Test(groups = "Functional") + public void testAlignAsSameSequences() + { + SequenceI dna1 = new Sequence("dna1", "cccGGGTTTaaa"); + SequenceI dna2 = new Sequence("dna2", "CCCgggtttAAA"); + AlignmentI al1 = new Alignment(new SequenceI[] { dna1, dna2 }); + ((Alignment) al1).createDatasetAlignment(); + + SequenceI dna3 = new Sequence(dna1); + SequenceI dna4 = new Sequence(dna2); + assertSame(dna3.getDatasetSequence(), dna1.getDatasetSequence()); + assertSame(dna4.getDatasetSequence(), dna2.getDatasetSequence()); + String seq1 = "-cc-GG-GT-TT--aaa"; + dna3.setSequence(seq1); + String seq2 = "C--C-Cgg--gtt-tAA-A-"; + dna4.setSequence(seq2); + AlignmentI al2 = new Alignment(new SequenceI[] { dna3, dna4 }); + ((Alignment) al2).createDatasetAlignment(); + + assertTrue(AlignmentUtils.alignAsSameSequences(al1, al2)); + assertEquals(seq1, al1.getSequenceAt(0).getSequenceAsString()); + assertEquals(seq2, al1.getSequenceAt(1).getSequenceAsString()); + + /* + * add another sequence to 'aligned' - should still succeed, since + * unaligned sequences still share a dataset with aligned sequences + */ + SequenceI dna5 = new Sequence("dna5", "CCCgggtttAAA"); + dna5.createDatasetSequence(); + al2.addSequence(dna5); + assertTrue(AlignmentUtils.alignAsSameSequences(al1, al2)); + assertEquals(seq1, al1.getSequenceAt(0).getSequenceAsString()); + assertEquals(seq2, al1.getSequenceAt(1).getSequenceAsString()); + + /* + * add another sequence to 'unaligned' - should fail, since now not + * all unaligned sequences share a dataset with aligned sequences + */ + SequenceI dna6 = new Sequence("dna6", "CCCgggtttAAA"); + dna6.createDatasetSequence(); + al1.addSequence(dna6); + // JAL-2110 JBP Comment: what's the use case for this behaviour ? + assertFalse(AlignmentUtils.alignAsSameSequences(al1, al2)); + } + + @Test(groups = "Functional") + public void testAlignAsSameSequencesMultipleSubSeq() + { + SequenceI dna1 = new Sequence("dna1", "cccGGGTTTaaa"); + SequenceI dna2 = new Sequence("dna2", "CCCgggtttAAA"); + SequenceI as1 = dna1.deriveSequence(), as2 = dna1.deriveSequence() + .getSubSequence(3, 7), as3 = dna2.deriveSequence(); + as1.insertCharAt(6, 5, '-'); + String s_as1 = as1.getSequenceAsString(); + as2.insertCharAt(6, 5, '-'); + String s_as2 = as2.getSequenceAsString(); + as3.insertCharAt(6, 5, '-'); + String s_as3 = as3.getSequenceAsString(); + AlignmentI aligned = new Alignment(new SequenceI[] { as1, as2, as3 }); + + // why do we need to cast this still ? + ((Alignment) aligned).createDatasetAlignment(); + SequenceI uas1 = dna1.deriveSequence(), uas2 = dna1.deriveSequence() + .getSubSequence(3, 7), uas3 = dna2.deriveSequence(); + AlignmentI tobealigned = new Alignment(new SequenceI[] { uas1, uas2, + uas3 }); + ((Alignment) tobealigned).createDatasetAlignment(); + + assertTrue(AlignmentUtils.alignAsSameSequences(tobealigned, aligned)); + assertEquals(s_as1, uas1.getSequenceAsString()); + assertEquals(s_as2, uas2.getSequenceAsString()); + assertEquals(s_as3, uas3.getSequenceAsString()); + } + } diff --git a/test/jalview/analysis/CrossRefTest.java b/test/jalview/analysis/CrossRefTest.java index bbc23e5..62bcae8 100644 --- a/test/jalview/analysis/CrossRefTest.java +++ b/test/jalview/analysis/CrossRefTest.java @@ -21,10 +21,31 @@ package jalview.analysis; import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertNotSame; +import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertSame; +import static org.testng.AssertJUnit.assertTrue; +import jalview.datamodel.AlignedCodonFrame; +import jalview.datamodel.AlignedCodonFrame.SequenceToSequenceMapping; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefEntry; +import jalview.datamodel.Mapping; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceFeature; +import jalview.datamodel.SequenceI; +import jalview.util.DBRefUtils; +import jalview.util.MapList; +import jalview.ws.SequenceFetcher; +import jalview.ws.SequenceFetcherFactory; +import java.util.ArrayList; +import java.util.List; + +import org.testng.annotations.AfterClass; import org.testng.annotations.Test; public class CrossRefTest @@ -40,27 +61,674 @@ public class CrossRefTest DBRefEntry ref6 = new DBRefEntry("emblCDS", "1", "A123"); DBRefEntry ref7 = new DBRefEntry("GeneDB", "1", "A123"); DBRefEntry ref8 = new DBRefEntry("PFAM", "1", "A123"); + // ENSEMBL is a source of either dna or protein sequence data + DBRefEntry ref9 = new DBRefEntry("ENSEMBL", "1", "A123"); DBRefEntry[] refs = new DBRefEntry[] { ref1, ref2, ref3, ref4, ref5, - ref6, ref7, ref8 }; + ref6, ref7, ref8, ref9 }; /* * Just the DNA refs: */ - DBRefEntry[] found = CrossRef.findXDbRefs(false, refs); - assertEquals(3, found.length); + DBRefEntry[] found = DBRefUtils.selectDbRefs(true, refs); + assertEquals(4, found.length); assertSame(ref5, found[0]); assertSame(ref6, found[1]); assertSame(ref7, found[2]); + assertSame(ref9, found[3]); /* * Just the protein refs: */ - found = CrossRef.findXDbRefs(true, refs); - assertEquals(4, found.length); + found = DBRefUtils.selectDbRefs(false, refs); + assertEquals(5, found.length); assertSame(ref1, found[0]); assertSame(ref2, found[1]); assertSame(ref3, found[2]); assertSame(ref4, found[3]); + assertSame(ref9, found[4]); + } + + /** + * Test the method that finds a sequence's "product" xref source databases, + * which may be direct (dbrefs on the sequence), or indirect (dbrefs on + * sequences which share a dbref with the sequence + */ + @Test(groups = { "Functional" }, enabled = true) + public void testFindXrefSourcesForSequence_proteinToDna() + { + SequenceI seq = new Sequence("Seq1", "MGKYQARLSS"); + List sources = new ArrayList(); + AlignmentI al = new Alignment(new SequenceI[] {}); + + /* + * first with no dbrefs to search + */ + sources = new CrossRef(new SequenceI[] { seq }, al) + .findXrefSourcesForSequences(false); + assertTrue(sources.isEmpty()); + + /* + * add some dbrefs to sequence + */ + // protein db is not a candidate for findXrefSources + seq.addDBRef(new DBRefEntry("UNIPROT", "0", "A1234")); + // dna coding databatases are + seq.addDBRef(new DBRefEntry("EMBL", "0", "E2345")); + // a second EMBL xref should not result in a duplicate + seq.addDBRef(new DBRefEntry("EMBL", "0", "E2346")); + seq.addDBRef(new DBRefEntry("EMBLCDS", "0", "E2347")); + seq.addDBRef(new DBRefEntry("GENEDB", "0", "E2348")); + seq.addDBRef(new DBRefEntry("ENSEMBL", "0", "E2349")); + seq.addDBRef(new DBRefEntry("ENSEMBLGENOMES", "0", "E2350")); + sources = new CrossRef(new SequenceI[] { seq }, al) + .findXrefSourcesForSequences(false); + assertEquals(4, sources.size()); + assertEquals("[EMBL, EMBLCDS, GENEDB, ENSEMBL]", sources.toString()); + + /* + * add a sequence to the alignment which has a dbref to UNIPROT|A1234 + * and others to dna coding databases + */ + sources.clear(); + seq.setDBRefs(null); + seq.addDBRef(new DBRefEntry("UNIPROT", "0", "A1234")); + seq.addDBRef(new DBRefEntry("EMBLCDS", "0", "E2347")); + SequenceI seq2 = new Sequence("Seq2", "MGKYQARLSS"); + seq2.addDBRef(new DBRefEntry("UNIPROT", "0", "A1234")); + seq2.addDBRef(new DBRefEntry("EMBL", "0", "E2345")); + seq2.addDBRef(new DBRefEntry("GENEDB", "0", "E2348")); + // TODO include ENSEMBLGENOMES in DBRefSource.DNACODINGDBS ? + al.addSequence(seq2); + sources = new CrossRef(new SequenceI[] { seq, seq2 }, al) + .findXrefSourcesForSequences(false); + assertEquals(3, sources.size()); + assertEquals("[EMBLCDS, EMBL, GENEDB]", sources.toString()); } + /** + * Test for finding 'product' sequences for the case where only an indirect + * xref is found - not on the nucleotide sequence but on a peptide sequence in + * the alignment which which it shares a nucleotide dbref + */ + @Test(groups = { "Functional" }, enabled = true) + public void testFindXrefSequences_indirectDbrefToProtein() + { + /* + * Alignment setup: + * - nucleotide dbref EMBL|AF039662 + * - peptide dbrefs EMBL|AF039662, UNIPROT|Q9ZTS2 + */ + SequenceI emblSeq = new Sequence("AF039662", "GGGGCAGCACAAGAAC"); + emblSeq.addDBRef(new DBRefEntry("EMBL", "0", "AF039662")); + SequenceI uniprotSeq = new Sequence("Q9ZTS2", "MASVSATMISTS"); + uniprotSeq.addDBRef(new DBRefEntry("EMBL", "0", "AF039662")); + uniprotSeq.addDBRef(new DBRefEntry("UNIPROT", "0", "Q9ZTS2")); + + /* + * Find UNIPROT xrefs for nucleotide + * - it has no UNIPROT dbref of its own + * - but peptide with matching nucleotide dbref does, so is returned + */ + AlignmentI al = new Alignment(new SequenceI[] { emblSeq, uniprotSeq }); + Alignment xrefs = new CrossRef(new SequenceI[] { emblSeq }, al) + .findXrefSequences("UNIPROT", true); + assertEquals(1, xrefs.getHeight()); + assertSame(uniprotSeq, xrefs.getSequenceAt(0)); + } + + /** + * Test for finding 'product' sequences for the case where only an indirect + * xref is found - not on the peptide sequence but on a nucleotide sequence in + * the alignment which which it shares a protein dbref + */ + @Test(groups = { "Functional" }, enabled = true) + public void testFindXrefSequences_indirectDbrefToNucleotide() + { + /* + * Alignment setup: + * - peptide dbref UNIPROT|Q9ZTS2 + * - nucleotide dbref EMBL|AF039662, UNIPROT|Q9ZTS2 + */ + SequenceI uniprotSeq = new Sequence("Q9ZTS2", "MASVSATMISTS"); + uniprotSeq.addDBRef(new DBRefEntry("UNIPROT", "0", "Q9ZTS2")); + SequenceI emblSeq = new Sequence("AF039662", "GGGGCAGCACAAGAAC"); + emblSeq.addDBRef(new DBRefEntry("EMBL", "0", "AF039662")); + emblSeq.addDBRef(new DBRefEntry("UNIPROT", "0", "Q9ZTS2")); + + /* + * find EMBL xrefs for peptide sequence - it has no direct + * dbrefs, but the 'corresponding' nucleotide sequence does, so is returned + */ + /* + * Find EMBL xrefs for peptide + * - it has no EMBL dbref of its own + * - but nucleotide with matching peptide dbref does, so is returned + */ + AlignmentI al = new Alignment(new SequenceI[] { emblSeq, uniprotSeq }); + Alignment xrefs = new CrossRef(new SequenceI[] { uniprotSeq }, al) + .findXrefSequences("EMBL", false); + assertEquals(1, xrefs.getHeight()); + assertSame(emblSeq, xrefs.getSequenceAt(0)); + } + + /** + * Test for finding 'product' sequences for the case where the selected + * sequence has no dbref to the desired source, and there are no indirect + * references via another sequence in the alignment + */ + @Test(groups = { "Functional" }) + public void testFindXrefSequences_noDbrefs() + { + /* + * two nucleotide sequences, one with UNIPROT dbref + */ + SequenceI dna1 = new Sequence("AF039662", "GGGGCAGCACAAGAAC"); + dna1.addDBRef(new DBRefEntry("UNIPROT", "0", "Q9ZTS2")); + SequenceI dna2 = new Sequence("AJ307031", "AAACCCTTT"); + + /* + * find UNIPROT xrefs for peptide sequence - it has no direct + * dbrefs, and the other sequence (which has a UNIPROT dbref) is not + * equatable to it, so no results found + */ + AlignmentI al = new Alignment(new SequenceI[] { dna1, dna2 }); + Alignment xrefs = new CrossRef(new SequenceI[] { dna2 }, al) + .findXrefSequences("UNIPROT", true); + assertNull(xrefs); + } + + /** + * Tests for the method that searches an alignment (with one sequence + * excluded) for protein/nucleotide sequences with a given cross-reference + */ + @Test(groups = { "Functional" }, enabled = true) + public void testSearchDataset() + { + /* + * nucleotide sequence with UNIPROT AND EMBL dbref + * peptide sequence with UNIPROT dbref + */ + SequenceI dna1 = new Sequence("AF039662", "GGGGCAGCACAAGAAC"); + Mapping map = new Mapping(new Sequence("pep2", "MLAVSRG"), new MapList( + new int[] { 1, 21 }, new int[] { + 1, 7 }, 3, 1)); + DBRefEntry dbref = new DBRefEntry("UNIPROT", "0", "Q9ZTS2", map); + dna1.addDBRef(dbref); + dna1.addDBRef(new DBRefEntry("EMBL", "0", "AF039662")); + SequenceI pep1 = new Sequence("Q9ZTS2", "MLAVSRGQ"); + dbref = new DBRefEntry("UNIPROT", "0", "Q9ZTS2"); + pep1.addDBRef(new DBRefEntry("UNIPROT", "0", "Q9ZTS2")); + AlignmentI al = new Alignment(new SequenceI[] { dna1, pep1 }); + + List result = new ArrayList(); + + /* + * first search for a dbref nowhere on the alignment: + */ + dbref = new DBRefEntry("UNIPROT", "0", "P30419"); + CrossRef testee = new CrossRef(al.getSequencesArray(), al); + AlignedCodonFrame acf = new AlignedCodonFrame(); + boolean found = testee.searchDataset(true, dna1, dbref, result, acf, + true); + assertFalse(found); + assertTrue(result.isEmpty()); + assertTrue(acf.isEmpty()); + + /* + * search for a protein sequence with dbref UNIPROT:Q9ZTS2 + */ + acf = new AlignedCodonFrame(); + dbref = new DBRefEntry("UNIPROT", "0", "Q9ZTS2"); + found = testee.searchDataset(!dna1.isProtein(), dna1, dbref, result, + acf, false); // search dataset with a protein xref from a dna + // sequence to locate the protein product + assertTrue(found); + assertEquals(1, result.size()); + assertSame(pep1, result.get(0)); + assertTrue(acf.isEmpty()); + + /* + * search for a nucleotide sequence with dbref UNIPROT:Q9ZTS2 + */ + result.clear(); + acf = new AlignedCodonFrame(); + dbref = new DBRefEntry("UNIPROT", "0", "Q9ZTS2"); + found = testee.searchDataset(!pep1.isProtein(), pep1, dbref, result, + acf, false); // search dataset with a protein's direct dbref to + // locate dna sequences with matching xref + assertTrue(found); + assertEquals(1, result.size()); + assertSame(dna1, result.get(0)); + // should now have a mapping from dna to pep1 + List mappings = acf.getMappings(); + assertEquals(1, mappings.size()); + SequenceToSequenceMapping mapping = mappings.get(0); + assertSame(dna1, mapping.getFromSeq()); + assertSame(pep1, mapping.getMapping().getTo()); + MapList mapList = mapping.getMapping().getMap(); + assertEquals(1, mapList.getToRatio()); + assertEquals(3, mapList.getFromRatio()); + assertEquals(1, mapList.getFromRanges().size()); + assertEquals(1, mapList.getFromRanges().get(0)[0]); + assertEquals(21, mapList.getFromRanges().get(0)[1]); + assertEquals(1, mapList.getToRanges().size()); + assertEquals(1, mapList.getToRanges().get(0)[0]); + assertEquals(7, mapList.getToRanges().get(0)[1]); + } + + /** + * Test for finding 'product' sequences for the case where the selected + * sequence has a dbref with a mapping to a sequence. This represents the case + * where either + *
            + *
          • a fetched sequence is already decorated with its cross-reference (e.g. + * EMBL + translation), or
          • + *
          • Get Cross-References has been done once resulting in instantiated + * cross-reference mappings
          • + *
          + */ + @Test(groups = { "Functional" }) + public void testFindXrefSequences_fromDbRefMap() + { + /* + * scenario: nucleotide sequence AF039662 + * with dbref + mapping to Q9ZTS2 and P30419 + * which themselves each have a dbref and feature + */ + SequenceI dna1 = new Sequence("AF039662", "GGGGCAGCACAAGAAC"); + SequenceI pep1 = new Sequence("Q9ZTS2", "MALFQRSV"); + SequenceI pep2 = new Sequence("P30419", "MTRRSQIF"); + dna1.createDatasetSequence(); + pep1.createDatasetSequence(); + pep2.createDatasetSequence(); + + pep1.getDatasetSequence().addDBRef( + new DBRefEntry("Pfam", "0", "PF00111")); + pep1.addSequenceFeature(new SequenceFeature("type", "desc", 12, 14, 1f, + "group")); + pep2.getDatasetSequence().addDBRef(new DBRefEntry("PDB", "0", "3JTK")); + pep2.addSequenceFeature(new SequenceFeature("type2", "desc2", 13, 15, + 12f, "group2")); + + MapList mapList = new MapList(new int[] { 1, 24 }, new int[] { 1, 3 }, + 3, 1); + Mapping map = new Mapping(pep1, mapList); + DBRefEntry dbRef1 = new DBRefEntry("UNIPROT", "0", "Q9ZTS2", map); + dna1.getDatasetSequence().addDBRef(dbRef1); + mapList = new MapList(new int[] { 1, 24 }, new int[] { 1, 3 }, 3, 1); + map = new Mapping(pep2, mapList); + DBRefEntry dbRef2 = new DBRefEntry("UNIPROT", "0", "P30419", map); + dna1.getDatasetSequence().addDBRef(dbRef2); + + /* + * find UNIPROT xrefs for nucleotide sequence - it should pick up + * mapped sequences + */ + AlignmentI al = new Alignment(new SequenceI[] { dna1 }); + Alignment xrefs = new CrossRef(new SequenceI[] { dna1 }, al) + .findXrefSequences("UNIPROT", true); + assertEquals(2, xrefs.getHeight()); + + /* + * cross-refs alignment holds copies of the mapped sequences + * including copies of their dbrefs and features + */ + checkCopySequence(pep1, xrefs.getSequenceAt(0)); + checkCopySequence(pep2, xrefs.getSequenceAt(1)); + } + + /** + * Helper method that verifies that 'copy' has the same name, start, end, + * sequence and dataset sequence object as 'original' (but is not the same + * object) + * + * @param copy + * @param original + */ + private void checkCopySequence(SequenceI copy, SequenceI original) + { + assertNotSame(copy, original); + assertSame(copy.getDatasetSequence(), original.getDatasetSequence()); + assertEquals(copy.getName(), original.getName()); + assertEquals(copy.getStart(), original.getStart()); + assertEquals(copy.getEnd(), original.getEnd()); + assertEquals(copy.getSequenceAsString(), original.getSequenceAsString()); + } + + /** + * Test for finding 'product' sequences for the case where the selected + * sequence has a dbref with no mapping, triggering a fetch from database + */ + @Test(groups = { "Functional" }) + public void testFindXrefSequences_withFetch() + { + SequenceI dna1 = new Sequence("AF039662", "GGGGCAGCACAAGAAC"); + dna1.addDBRef(new DBRefEntry("UNIPROT", "0", "Q9ZTS2")); + dna1.addDBRef(new DBRefEntry("UNIPROT", "0", "P30419")); + dna1.addDBRef(new DBRefEntry("UNIPROT", "0", "P00314")); + final SequenceI pep1 = new Sequence("Q9ZTS2", "MYQLIRSSW"); + final SequenceI pep2 = new Sequence("P00314", "MRKLLAASG"); + + /* + * argument false suppresses adding DAS sources + * todo: define an interface type SequenceFetcherI and mock that + */ + SequenceFetcher mockFetcher = new SequenceFetcher(false) + { + @Override + public boolean isFetchable(String source) + { + return true; + } + + @Override + public SequenceI[] getSequences(List refs, boolean dna) + { + return new SequenceI[] { pep1, pep2 }; + } + }; + SequenceFetcherFactory.setSequenceFetcher(mockFetcher); + + /* + * find UNIPROT xrefs for nucleotide sequence + */ + AlignmentI al = new Alignment(new SequenceI[] { dna1 }); + Alignment xrefs = new CrossRef(new SequenceI[] { dna1 }, al) + .findXrefSequences("UNIPROT", true); + assertEquals(2, xrefs.getHeight()); + assertSame(pep1, xrefs.getSequenceAt(0)); + assertSame(pep2, xrefs.getSequenceAt(1)); + } + + @AfterClass + public void tearDown() + { + SequenceFetcherFactory.setSequenceFetcher(null); + } + + /** + * Test for finding 'product' sequences for the case where both gene and + * transcript sequences have dbrefs to Uniprot. + */ + @Test(groups = { "Functional" }) + public void testFindXrefSequences_forGeneAndTranscripts() + { + /* + * 'gene' sequence + */ + SequenceI gene = new Sequence("ENSG00000157764", "CGCCTCCCTTCCCC"); + gene.addDBRef(new DBRefEntry("UNIPROT", "0", "P15056")); + gene.addDBRef(new DBRefEntry("UNIPROT", "0", "H7C5K3")); + + /* + * 'transcript' with CDS feature (supports mapping to protein) + */ + SequenceI braf001 = new Sequence("ENST00000288602", "taagATGGCGGCGCTGa"); + braf001.addDBRef(new DBRefEntry("UNIPROT", "0", "P15056")); + braf001.addSequenceFeature(new SequenceFeature("CDS", "", 5, 16, 0f, + null)); + + /* + * 'spliced transcript' with CDS ranges + */ + SequenceI braf002 = new Sequence("ENST00000497784", "gCAGGCtaTCTGTTCaa"); + braf002.addDBRef(new DBRefEntry("UNIPROT", "0", "H7C5K3")); + braf002.addSequenceFeature(new SequenceFeature("CDS", "", 2, 6, 0f, + null)); + braf002.addSequenceFeature(new SequenceFeature("CDS", "", 9, 15, 0f, + null)); + + /* + * TODO code is fragile - use of SequenceIdMatcher depends on fetched + * sequences having a name starting Source|Accession + * which happens to be true for Uniprot,PDB,EMBL but not Pfam,Rfam,Ensembl + */ + final SequenceI pep1 = new Sequence("UNIPROT|P15056", "MAAL"); + final SequenceI pep2 = new Sequence("UNIPROT|H7C5K3", "QALF"); + + /* + * argument false suppresses adding DAS sources + * todo: define an interface type SequenceFetcherI and mock that + */ + SequenceFetcher mockFetcher = new SequenceFetcher(false) + { + @Override + public boolean isFetchable(String source) + { + return true; + } + + @Override + public SequenceI[] getSequences(List refs, boolean dna) + { + return new SequenceI[] { pep1, pep2 }; + } + }; + SequenceFetcherFactory.setSequenceFetcher(mockFetcher); + + /* + * find UNIPROT xrefs for gene and transcripts + * verify that + * - the two proteins are retrieved but not duplicated + * - mappings are built from transcript (CDS) to proteins + * - no mappings from gene to proteins + */ + SequenceI[] seqs = new SequenceI[] { gene, braf001, braf002 }; + AlignmentI al = new Alignment(seqs); + Alignment xrefs = new CrossRef(seqs, al).findXrefSequences("UNIPROT", + true); + assertEquals(2, xrefs.getHeight()); + assertSame(pep1, xrefs.getSequenceAt(0)); + assertSame(pep2, xrefs.getSequenceAt(1)); + } + + /** + *
          +   * Test that emulates this (real but simplified) case:
          +   * Alignment:          DBrefs
          +   *     UNIPROT|P0CE19  EMBL|J03321, EMBL|X06707, EMBL|M19487
          +   *     UNIPROT|P0CE20  EMBL|J03321, EMBL|X06707, EMBL|X07547
          +   * Find cross-references for EMBL. These are mocked here as
          +   *     EMBL|J03321     with mappings to P0CE18, P0CE19, P0CE20
          +   *     EMBL|X06707     with mappings to P0CE17, P0CE19, P0CE20
          +   *     EMBL|M19487     with mappings to P0CE19, Q46432
          +   *     EMBL|X07547     with mappings to P0CE20, B0BCM4
          +   * EMBL sequences are first 'fetched' (mocked here) for P0CE19.
          +   * The 3 EMBL sequences are added to the alignment dataset.
          +   * Their dbrefs to Uniprot products P0CE19 and P0CE20 should be matched in the
          +   * alignment dataset and updated to reference the original Uniprot sequences.
          +   * For the second Uniprot sequence, the J03321 and X06707 xrefs should be 
          +   * resolved from the dataset, and only the X07547 dbref fetched.
          +   * So the end state to verify is:
          +   * - 4 cross-ref sequences returned: J03321, X06707,  M19487, X07547
          +   * - P0CE19/20 dbrefs to EMBL sequences now have mappings
          +   * - J03321 dbrefs to P0CE19/20 mapped to original Uniprot sequences
          +   * - X06707 dbrefs to P0CE19/20 mapped to original Uniprot sequences
          +   * 
          + */ + @Test(groups = { "Functional" }) + public void testFindXrefSequences_uniprotEmblManyToMany() + { + /* + * Uniprot sequences, both with xrefs to EMBL|J03321 + * and EMBL|X07547 + */ + SequenceI p0ce19 = new Sequence("UNIPROT|P0CE19", "KPFG"); + p0ce19.addDBRef(new DBRefEntry("EMBL", "0", "J03321")); + p0ce19.addDBRef(new DBRefEntry("EMBL", "0", "X06707")); + p0ce19.addDBRef(new DBRefEntry("EMBL", "0", "M19487")); + SequenceI p0ce20 = new Sequence("UNIPROT|P0CE20", "PFGK"); + p0ce20.addDBRef(new DBRefEntry("EMBL", "0", "J03321")); + p0ce20.addDBRef(new DBRefEntry("EMBL", "0", "X06707")); + p0ce20.addDBRef(new DBRefEntry("EMBL", "0", "X07547")); + + /* + * EMBL sequences to be 'fetched', complete with dbrefs and mappings + * to their protein products (CDS location and translations are provided + * in EMBL XML); these should be matched to, and replaced with, + * the corresponding uniprot sequences after fetching + */ + + /* + * J03321 with mappings to P0CE19 and P0CE20 + */ + final SequenceI j03321 = new Sequence("EMBL|J03321", "AAACCCTTTGGGAAAA"); + DBRefEntry dbref1 = new DBRefEntry("UNIPROT", "0", "P0CE19"); + MapList mapList = new MapList(new int[] { 1, 12 }, new int[] { 1, 4 }, + 3, 1); + Mapping map = new Mapping(new Sequence("UNIPROT|P0CE19", "KPFG"), + mapList); + // add a dbref to the mapped to sequence - should get copied to p0ce19 + map.getTo().addDBRef(new DBRefEntry("PIR", "0", "S01875")); + dbref1.setMap(map); + j03321.addDBRef(dbref1); + DBRefEntry dbref2 = new DBRefEntry("UNIPROT", "0", "P0CE20"); + mapList = new MapList(new int[] { 4, 15 }, new int[] { 2, 5 }, 3, 1); + dbref2.setMap(new Mapping(new Sequence("UNIPROT|P0CE20", "PFGK"), + new MapList(mapList))); + j03321.addDBRef(dbref2); + + /* + * X06707 with mappings to P0CE19 and P0CE20 + */ + final SequenceI x06707 = new Sequence("EMBL|X06707", "atgAAACCCTTTGGG"); + DBRefEntry dbref3 = new DBRefEntry("UNIPROT", "0", "P0CE19"); + MapList map2 = new MapList(new int[] { 4, 15 }, new int[] { 1, 4 }, 3, + 1); + dbref3.setMap(new Mapping(new Sequence("UNIPROT|P0CE19", "KPFG"), map2)); + x06707.addDBRef(dbref3); + DBRefEntry dbref4 = new DBRefEntry("UNIPROT", "0", "P0CE20"); + MapList map3 = new MapList(new int[] { 4, 15 }, new int[] { 1, 4 }, 3, + 1); + dbref4.setMap(new Mapping(new Sequence("UNIPROT|P0CE20", "PFGK"), map3)); + x06707.addDBRef(dbref4); + + /* + * M19487 with mapping to P0CE19 and Q46432 + */ + final SequenceI m19487 = new Sequence("EMBL|M19487", "AAACCCTTTGGG"); + DBRefEntry dbref5 = new DBRefEntry("UNIPROT", "0", "P0CE19"); + dbref5.setMap(new Mapping(new Sequence("UNIPROT|P0CE19", "KPFG"), + new MapList(mapList))); + m19487.addDBRef(dbref5); + DBRefEntry dbref6 = new DBRefEntry("UNIPROT", "0", "Q46432"); + dbref6.setMap(new Mapping(new Sequence("UNIPROT|Q46432", "KPFG"), + new MapList(mapList))); + m19487.addDBRef(dbref6); + + /* + * X07547 with mapping to P0CE20 and B0BCM4 + */ + final SequenceI x07547 = new Sequence("EMBL|X07547", "cccAAACCCTTTGGG"); + DBRefEntry dbref7 = new DBRefEntry("UNIPROT", "0", "P0CE20"); + dbref7.setMap(new Mapping(new Sequence("UNIPROT|P0CE19", "KPFG"), + new MapList(map2))); + x07547.addDBRef(dbref7); + DBRefEntry dbref8 = new DBRefEntry("UNIPROT", "0", "B0BCM4"); + dbref8.setMap(new Mapping(new Sequence("UNIPROT|B0BCM4", "KPFG"), + new MapList(map2))); + x07547.addDBRef(dbref8); + + /* + * mock sequence fetcher to 'return' the EMBL sequences + * TODO: Mockito would allow .thenReturn().thenReturn() here, + * and also capture and verification of the parameters + * passed in calls to getSequences() - important to verify that + * duplicate sequence fetches are not requested + */ + SequenceFetcher mockFetcher = new SequenceFetcher(false) + { + int call = 0; + + @Override + public boolean isFetchable(String source) + { + return true; + } + + @Override + public SequenceI[] getSequences(List refs, boolean dna) + { + call++; + if (call == 1) + { + assertEquals("Expected 3 embl seqs in first fetch", 3, + refs.size()); + return new SequenceI[] { j03321, x06707, m19487 }; + } + else + { + assertEquals("Expected 1 embl seq in second fetch", 1, + refs.size()); + return new SequenceI[] { x07547 }; + } + } + }; + SequenceFetcherFactory.setSequenceFetcher(mockFetcher); + + /* + * find EMBL xrefs for Uniprot seqs and verify that + * - the EMBL xref'd sequences are retrieved without duplicates + * - mappings are added to the Uniprot dbrefs + * - mappings in the EMBL-to-Uniprot dbrefs are updated to the + * alignment sequences + * - dbrefs on the EMBL sequences are added to the original dbrefs + */ + SequenceI[] seqs = new SequenceI[] { p0ce19, p0ce20 }; + AlignmentI al = new Alignment(seqs); + Alignment xrefs = new CrossRef(seqs, al).findXrefSequences("EMBL", + false); + + /* + * verify retrieved sequences + */ + assertNotNull(xrefs); + assertEquals(4, xrefs.getHeight()); + assertSame(j03321, xrefs.getSequenceAt(0)); + assertSame(x06707, xrefs.getSequenceAt(1)); + assertSame(m19487, xrefs.getSequenceAt(2)); + assertSame(x07547, xrefs.getSequenceAt(3)); + + /* + * verify mappings added to Uniprot-to-EMBL dbrefs + */ + Mapping mapping = p0ce19.getDBRefs()[0].getMap(); + assertSame(j03321, mapping.getTo()); + mapping = p0ce19.getDBRefs()[1].getMap(); + assertSame(x06707, mapping.getTo()); + mapping = p0ce20.getDBRefs()[0].getMap(); + assertSame(j03321, mapping.getTo()); + mapping = p0ce20.getDBRefs()[1].getMap(); + assertSame(x06707, mapping.getTo()); + + /* + * verify dbrefs on EMBL are mapped to alignment seqs + */ + assertSame(p0ce19, j03321.getDBRefs()[0].getMap().getTo()); + assertSame(p0ce20, j03321.getDBRefs()[1].getMap().getTo()); + assertSame(p0ce19, x06707.getDBRefs()[0].getMap().getTo()); + assertSame(p0ce20, x06707.getDBRefs()[1].getMap().getTo()); + + /* + * verify new dbref on EMBL dbref mapping is copied to the + * original Uniprot sequence + */ + assertEquals(4, p0ce19.getDBRefs().length); + assertEquals("PIR", p0ce19.getDBRefs()[3].getSource()); + assertEquals("S01875", p0ce19.getDBRefs()[3].getAccessionId()); + } + + @Test(groups = "Functional") + public void testSameSequence() + { + assertTrue(CrossRef.sameSequence(null, null)); + SequenceI seq1 = new Sequence("seq1", "ABCDEF"); + assertFalse(CrossRef.sameSequence(seq1, null)); + assertFalse(CrossRef.sameSequence(null, seq1)); + assertTrue(CrossRef.sameSequence(seq1, new Sequence("seq2", "ABCDEF"))); + assertTrue(CrossRef.sameSequence(seq1, new Sequence("seq2", "abcdef"))); + assertFalse(CrossRef + .sameSequence(seq1, new Sequence("seq2", "ABCDE-F"))); + assertFalse(CrossRef.sameSequence(seq1, new Sequence("seq2", "BCDEF"))); + } } diff --git a/test/jalview/analysis/SequenceIdMatcherTest.java b/test/jalview/analysis/SequenceIdMatcherTest.java index eb0fc47..a17270d 100644 --- a/test/jalview/analysis/SequenceIdMatcherTest.java +++ b/test/jalview/analysis/SequenceIdMatcherTest.java @@ -50,6 +50,10 @@ public class SequenceIdMatcherTest assertTrue(testee.equals("A12345,")); assertTrue(testee.equals("A12345?")); assertTrue(testee.equals("A12345_")); + /* + * case insensitive matching + */ + assertTrue(testee.equals("a12345")); /* * matcher name = target name + word separator... @@ -58,13 +62,21 @@ public class SequenceIdMatcherTest assertTrue(testee.equals("A12345")); /* + * case insensitive matching + */ + assertTrue(testee.equals("a12345")); + + /* * miscellaneous failing cases */ testee = sequenceIdMatcher.new SeqIdName("A12345"); assertFalse(testee.equals((Object) null)); assertFalse(testee.equals("")); - assertFalse(testee.equals("a12345")); assertFalse(testee.equals("A12346|A12345")); + /* + * case insensitive matching + */ + assertTrue(testee.equals("a12345")); testee = sequenceIdMatcher.new SeqIdName("A12345?B23456"); assertFalse(testee.equals("B23456")); @@ -74,5 +86,15 @@ public class SequenceIdMatcherTest testee = sequenceIdMatcher.new SeqIdName("A12345<"); assertFalse(testee.equals("A12345?")); assertTrue(testee.equals("A12345<")); // bug? inconsistent + /* + * case insensitive matching + */ + assertTrue(testee.equals("a12345")); + + testee = sequenceIdMatcher.new SeqIdName("UNIPROT|A12345"); + assertFalse(testee.equals("A12345")); + assertFalse(testee.equals("UNIPROT|B98765")); + assertFalse(testee.equals("UNIPROT|")); + assertTrue(testee.equals("UNIPROT")); } } diff --git a/test/jalview/bin/ArgsParserTest.java b/test/jalview/bin/ArgsParserTest.java new file mode 100644 index 0000000..06e79de --- /dev/null +++ b/test/jalview/bin/ArgsParserTest.java @@ -0,0 +1,65 @@ +package jalview.bin; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.assertTrue; + +import org.testng.annotations.Test; + +public class ArgsParserTest +{ + @Test(groups = "Functional") + public void testGetValue() + { + ArgsParser ap = new ArgsParser(new String[] { "-name", "Henry", "-job", + "Tester" }); + assertEquals(4, ap.getSize()); + assertNull(ap.getValue("rubbish")); + assertEquals("Tester", ap.getValue("job")); + // call to getValue removes the argument and its value + assertEquals(2, ap.getSize()); + assertNull(ap.getValue("job")); + assertFalse(ap.contains("job")); + assertFalse(ap.contains("Tester")); + + assertEquals("Henry", ap.getValue("name")); + assertEquals(0, ap.getSize()); + assertNull(ap.getValue("name")); + } + + @Test(groups = "Functional") + public void testGetValue_decoded() + { + ArgsParser ap = new ArgsParser(new String[] { "-name%241", "Henry", + "-job", "Test%203%2a" }); + // parameter value is decoded + assertEquals("Test 3*", ap.getValue("job", true)); + // parameter name is not decoded + assertNull(ap.getValue("name$1", true)); + assertEquals("Henry", ap.getValue("name%241", true)); + } + + @Test(groups = "Functional") + public void testNextValue() + { + ArgsParser ap = new ArgsParser(new String[] { "-name", "Henry", "-job", + "Tester" }); + assertEquals("name", ap.nextValue()); + assertEquals("Henry", ap.nextValue()); + assertEquals("job", ap.nextValue()); + assertEquals("Tester", ap.nextValue()); + } + + @Test(groups = "Functional") + public void testContains() + { + ArgsParser ap = new ArgsParser(new String[] { "-name", "Henry", "-job", + "Tester" }); + assertFalse(ap.contains("Susan")); + assertFalse(ap.contains("-name")); + assertTrue(ap.contains("name")); + // testing for contains removes the argument + assertFalse(ap.contains("name")); + } +} diff --git a/test/jalview/datamodel/AlignedCodonFrameTest.java b/test/jalview/datamodel/AlignedCodonFrameTest.java index cd8a1e3..f2dd968 100644 --- a/test/jalview/datamodel/AlignedCodonFrameTest.java +++ b/test/jalview/datamodel/AlignedCodonFrameTest.java @@ -451,4 +451,30 @@ public class AlignedCodonFrameTest assertArrayEquals(new int[] { 2, 2 }, acf.getMappedRegion(seq2, seq1, 6)); } + + /** + * Tests for addMap. See also tests for MapList.addMapList + */ + @Test(groups = { "Functional" }) + public void testAddMap() + { + final Sequence seq1 = new Sequence("Seq1", "c-G-TA-gC-gT-T"); + seq1.createDatasetSequence(); + final Sequence aseq1 = new Sequence("Seq1", "-V-L"); + aseq1.createDatasetSequence(); + + AlignedCodonFrame acf = new AlignedCodonFrame(); + MapList map = new MapList(new int[] { 2, 4, 6, 6, 8, 9 }, new int[] { + 1, 2 }, 3, 1); + acf.addMap(seq1.getDatasetSequence(), aseq1.getDatasetSequence(), map); + assertEquals(1, acf.getMappingsFromSequence(seq1).size()); + Mapping before = acf.getMappingsFromSequence(seq1).get(0); + + /* + * add the same map again, verify it doesn't get duplicated + */ + acf.addMap(seq1.getDatasetSequence(), aseq1.getDatasetSequence(), map); + assertEquals(1, acf.getMappingsFromSequence(seq1).size()); + assertSame(before, acf.getMappingsFromSequence(seq1).get(0)); + } } diff --git a/test/jalview/datamodel/AlignmentTest.java b/test/jalview/datamodel/AlignmentTest.java index 5a45176..07b8abf 100644 --- a/test/jalview/datamodel/AlignmentTest.java +++ b/test/jalview/datamodel/AlignmentTest.java @@ -217,7 +217,7 @@ public class AlignmentTest * * @throws IOException */ - @Test(groups = { "Functional" }, enabled = false) + @Test(groups = { "Functional" }, enabled = true) // TODO review / update this test after redesign of alignAs method public void testAlignAs_cdnaAsProtein() throws IOException { @@ -243,7 +243,7 @@ public class AlignmentTest * * @throws IOException */ - @Test(groups = { "Functional" }, enabled = false) + @Test(groups = { "Functional" }, enabled = true) // TODO review / update this test after redesign of alignAs method public void testAlignAs_cdnaAsProtein_singleSequence() throws IOException { @@ -315,7 +315,12 @@ public class AlignmentTest acf.addMap(seqFrom, seqTo, ml); } + /* + * not sure whether mappings 'belong' or protein or nucleotide + * alignment, so adding to both ;~) + */ alFrom.addCodonFrame(acf); + alTo.addCodonFrame(acf); } /** @@ -398,6 +403,8 @@ public class AlignmentTest // TODO should the copy constructor copy the dataset? // or make a new one referring to the same dataset sequences?? assertNull(copy.getDataset()); + // TODO test metadata is copied when AlignmentI is a dataset + // assertArrayEquals(copy.getDataset().getSequencesArray(), protein // .getDataset().getSequencesArray()); } @@ -436,8 +443,7 @@ public class AlignmentTest // TODO promote this method to AlignmentI ((Alignment) protein).createDatasetAlignment(); - // TODO this method should return AlignmentI not Alignment !! - Alignment ds = protein.getDataset(); + AlignmentI ds = protein.getDataset(); // side-effect: dataset created on second sequence assertNotNull(protein.getSequenceAt(1).getDatasetSequence()); diff --git a/test/jalview/datamodel/ColumnSelectionTest.java b/test/jalview/datamodel/ColumnSelectionTest.java index 63f80b2..1a7ae32 100644 --- a/test/jalview/datamodel/ColumnSelectionTest.java +++ b/test/jalview/datamodel/ColumnSelectionTest.java @@ -155,6 +155,21 @@ public class ColumnSelectionTest } + @Test(groups={"Functional"}) + public void testLocateVisibleBoundsPathologicals() + { + // test some pathological cases we missed + AlignmentI al = new Alignment(new SequenceI[] { new Sequence("refseqGaptest","KTDVTI----------NFI-----G----L")}); + ColumnSelection cs = new ColumnSelection(); + cs.hideInsertionsFor(al.getSequenceAt(0)); + assertEquals( + "G", + "" + + al.getSequenceAt(0).getCharAt( + cs.adjustForHiddenColumns(9))); + + + } @Test(groups = { "Functional" }) public void testHideColumns() { @@ -463,4 +478,53 @@ public class ColumnSelectionTest cs.addElement(0); assertEquals(0, cs.getMin()); } + + @Test(groups = { "Functional" }) + public void testEquals() + { + ColumnSelection cs = new ColumnSelection(); + cs.addElement(0); + cs.addElement(513); + cs.addElement(1); + cs.hideColumns(3); + cs.hideColumns(7); + cs.hideColumns(5,9); + + // same selections added in a different order + ColumnSelection cs2 = new ColumnSelection(); + cs2.addElement(1); + cs2.addElement(513); + cs2.addElement(0); + + // with no hidden columns + assertFalse(cs.equals(cs2)); + assertFalse(cs2.equals(cs)); + + // with hidden columns added in a different order + cs2.hideColumns(6, 9); + cs2.hideColumns(5, 8); + cs2.hideColumns(3); + + assertTrue(cs.equals(cs2)); + assertTrue(cs.equals(cs)); + assertTrue(cs2.equals(cs)); + assertTrue(cs2.equals(cs2)); + + cs2.addElement(12); + assertFalse(cs.equals(cs2)); + assertFalse(cs2.equals(cs)); + + cs2.removeElement(12); + assertTrue(cs.equals(cs2)); + + cs2.hideColumns(88); + assertFalse(cs.equals(cs2)); + /* + * unhiding a column adds it to selection! + */ + cs2.revealHiddenColumns(88); + assertFalse(cs.equals(cs2)); + cs.addElement(88); + assertTrue(cs.equals(cs2)); + } } diff --git a/test/jalview/datamodel/DBRefEntryTest.java b/test/jalview/datamodel/DBRefEntryTest.java index b3376a6..ae6dcda 100644 --- a/test/jalview/datamodel/DBRefEntryTest.java +++ b/test/jalview/datamodel/DBRefEntryTest.java @@ -20,7 +20,9 @@ */ package jalview.datamodel; +import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertSame; import static org.testng.AssertJUnit.assertTrue; import jalview.util.MapList; @@ -60,4 +62,80 @@ public class DBRefEntryTest assertTrue(ref1.equalRef(ref2)); assertTrue(ref2.equalRef(ref1)); } + + /** + * Tests for the method that may update a DBRefEntry from another with a + * mapping or 'real' version + */ + @Test(groups = { "Functional" }) + public void testUpdateFrom() + { + DBRefEntry ref1 = new DBRefEntry("UNIPROT", "1", "V71633"); + + assertFalse(ref1.updateFrom(null)); + + /* + * equivalent other dbref + */ + DBRefEntry ref2 = new DBRefEntry("uniprot", "1", "v71633"); + assertTrue(ref1.updateFrom(ref2)); + assertEquals("UNIPROT", ref1.getSource()); // unchanged + assertEquals("V71633", ref1.getAccessionId()); // unchanged + + /* + * ref1 has no mapping, acquires mapping from ref2 + */ + Mapping map = new Mapping(new MapList(new int[] { 1, 3 }, new int[] { + 1, 1 }, 3, 1)); + ref2.setMap(map); + assertTrue(ref1.updateFrom(ref2)); + assertSame(map, ref1.getMap()); // null mapping updated + + /* + * ref1 has a mapping, does not acquire mapping from ref2 + */ + ref2.setMap(new Mapping(map)); + assertTrue(ref1.updateFrom(ref2)); + assertSame(map, ref1.getMap()); // non-null mapping not updated + + /* + * ref2 has a different source, accession or version + */ + ref2.setSource("pdb"); + assertFalse(ref1.updateFrom(ref2)); + ref2.setSource(ref1.getSource()); + ref2.setAccessionId("P12345"); + assertFalse(ref1.updateFrom(ref2)); + ref2.setAccessionId(ref1.getAccessionId()); + ref1.setVersion("2"); + assertFalse(ref1.updateFrom(ref2)); + + /* + * a non-null version supersedes "0" or "source:0" + */ + ref2.setVersion(null); + assertFalse(ref1.updateFrom(ref2)); + assertEquals("2", ref1.getVersion()); + ref2.setVersion("3"); + ref1.setVersion("0"); + assertTrue(ref1.updateFrom(ref2)); + assertEquals("3", ref1.getVersion()); + ref1.setVersion("UNIPROT:0"); + assertTrue(ref1.updateFrom(ref2)); + assertEquals("3", ref1.getVersion()); + + /* + * version "source:n" with n>0 is not superseded + */ + ref1.setVersion("UNIPROT:1"); + assertFalse(ref1.updateFrom(ref2)); + assertEquals("UNIPROT:1", ref1.getVersion()); + + /* + * version "10" is not superseded + */ + ref1.setVersion("10"); + assertFalse(ref1.updateFrom(ref2)); + assertEquals("10", ref1.getVersion()); + } } diff --git a/test/jalview/datamodel/HiddenSequencesTest.java b/test/jalview/datamodel/HiddenSequencesTest.java new file mode 100644 index 0000000..8b50a8b --- /dev/null +++ b/test/jalview/datamodel/HiddenSequencesTest.java @@ -0,0 +1,378 @@ +package jalview.datamodel; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertNotSame; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.assertSame; +import static org.testng.AssertJUnit.assertTrue; +import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; + +import jalview.gui.AlignViewport; + +import java.util.List; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +@Test(singleThreaded = true) +public class HiddenSequencesTest +{ + static int SEQ_COUNT = 10; + + SequenceI[] seqs; + + /** + * Set up an alignment of 10 sequences + */ + @BeforeTest(alwaysRun = true) + public void setUp() + { + seqs = new SequenceI[SEQ_COUNT]; + for (int i = 0; i < SEQ_COUNT; i++) + { + // sequence lengths are 1, 2, ... 10 + seqs[i] = new Sequence("Seq" + i, "abcdefghijk".substring(0, i + 1)); + } + } + + /** + * Test the method that converts sequence alignment index to what it would be + * if all sequences were unhidden + */ + @Test(groups = "Functional") + public void testAdjustForHiddenSeqs() + { + AlignmentI al = new Alignment(seqs); + HiddenSequences hs = al.getHiddenSequences(); + for (int i = 0; i < SEQ_COUNT; i++) + { + assertEquals(i, hs.adjustForHiddenSeqs(i)); + } + + // hide seq1 and seq5 and seq6 + hs.hideSequence(seqs[1]); + hs.hideSequence(seqs[5]); + hs.hideSequence(seqs[6]); + + /* + * alignment is now seq0/2/3/4/7/8/9 + */ + assertEquals(7, al.getHeight()); + assertEquals(0, hs.adjustForHiddenSeqs(0)); + assertEquals(2, hs.adjustForHiddenSeqs(1)); + assertEquals(3, hs.adjustForHiddenSeqs(2)); + assertEquals(4, hs.adjustForHiddenSeqs(3)); + assertEquals(7, hs.adjustForHiddenSeqs(4)); + assertEquals(8, hs.adjustForHiddenSeqs(5)); + assertEquals(9, hs.adjustForHiddenSeqs(6)); + } + + /** + * Test the method that increments the internal array size if a sequence is + * added to the alignment (ugh this should not be exposed to the light of day) + */ + @Test(groups = "Functional") + public void testAdjustHeightSequenceAdded() + { + AlignmentI al = new Alignment(seqs); + assertEquals(SEQ_COUNT, al.getHeight()); + + HiddenSequences hs = al.getHiddenSequences(); + // initially does nothing + hs.adjustHeightSequenceAdded(); + assertNull(hs.hiddenSequences); + + // hide one sequence + hs.hideSequence(seqs[3]); + assertEquals(1, hs.getSize()); + assertEquals(SEQ_COUNT - 1, al.getHeight()); + assertEquals(SEQ_COUNT, hs.hiddenSequences.length); + + /* + * add a sequence to the alignment + * - the safe way to call hs.adjustHeightSequenceAdded! + * (implementation depends on alignment height having + * been already updated for the added sequence) + */ + al.addSequence(new Sequence("a", "b")); + assertEquals(1, hs.getSize()); + assertEquals(SEQ_COUNT, al.getHeight()); + assertEquals(SEQ_COUNT + 1, hs.hiddenSequences.length); + } + + /** + * Test the method that decrements the internal array size if a sequence is + * deleted from the alignment (ugh this should not be exposed to the light of + * day) + */ + @Test(groups = "Functional") + public void testAdjustHeightSequenceDeleted() + { + AlignmentI al = new Alignment(seqs); + assertEquals(SEQ_COUNT, al.getHeight()); + + HiddenSequences hs = al.getHiddenSequences(); + // initially does nothing + hs.adjustHeightSequenceAdded(); + assertNull(hs.hiddenSequences); + + // hide two sequences + hs.hideSequence(seqs[3]); + hs.hideSequence(seqs[5]); + assertEquals(2, hs.getSize()); + assertTrue(hs.isHidden(seqs[3])); + assertTrue(hs.isHidden(seqs[5])); + assertEquals(SEQ_COUNT - 2, al.getHeight()); + assertEquals(SEQ_COUNT, hs.hiddenSequences.length); + + /* + * delete a visible sequence from the alignment + * - the safe way to call hs.adjustHeightSequenceDeleted! + * (implementation depends on alignment height having + * been already updated for the removed sequence) + */ + al.deleteSequence(seqs[2]); + assertEquals(2, hs.getSize()); + // the visible alignment is unchanged: + assertEquals(SEQ_COUNT - 3, al.getHeight()); + // sequences array size has decremented: + assertEquals(SEQ_COUNT - 1, hs.hiddenSequences.length); + } + + /** + * Test the method that converts a 'full alignment' sequence index into the + * equivalent in the alignment with sequences hidden + */ + @Test(groups = "Functional") + public void testFindIndexWithoutHiddenSeqs() + { + AlignmentI al = new Alignment(seqs); + HiddenSequences hs = al.getHiddenSequences(); + for (int i = 0; i < SEQ_COUNT; i++) + { + assertEquals(i, hs.findIndexWithoutHiddenSeqs(i)); + } + + // hide seq1 and seq5 and seq6 + hs.hideSequence(seqs[1]); + hs.hideSequence(seqs[5]); + hs.hideSequence(seqs[6]); + + /* + * alignment is now seq0/2/3/4/7/8/9 + */ + assertEquals(7, al.getHeight()); + assertEquals(0, hs.findIndexWithoutHiddenSeqs(0)); + assertEquals(0, hs.findIndexWithoutHiddenSeqs(1)); + assertEquals(1, hs.findIndexWithoutHiddenSeqs(2)); + assertEquals(2, hs.findIndexWithoutHiddenSeqs(3)); + assertEquals(3, hs.findIndexWithoutHiddenSeqs(4)); + assertEquals(3, hs.findIndexWithoutHiddenSeqs(5)); + assertEquals(3, hs.findIndexWithoutHiddenSeqs(6)); + assertEquals(4, hs.findIndexWithoutHiddenSeqs(7)); + assertEquals(5, hs.findIndexWithoutHiddenSeqs(8)); + assertEquals(6, hs.findIndexWithoutHiddenSeqs(9)); + } + + /** + * Test the method that reconstructs (sort of) the full alignment including + * hidden sequences + */ + @Test(groups = "Functional") + public void testGetFullAlignment() + { + AlignmentI al = new Alignment(seqs); + assertArrayEquals(seqs, al.getSequencesArray()); + al.setProperty("a", "b"); + al.addAnnotation(new AlignmentAnnotation("ann", "label", 12f)); + al.setSeqrep(seqs[4]); + SequenceGroup sg = new SequenceGroup(); + sg.addSequence(seqs[8], false); + al.addGroup(sg); + ((Alignment) al).hasRNAStructure = true; + + HiddenSequences hs = al.getHiddenSequences(); + AlignmentI al2 = hs.getFullAlignment(); + // new alignment but with original sequences + assertNotSame(al, al2); + assertArrayEquals(al.getSequencesArray(), al2.getSequencesArray()); + + hs.hideSequence(seqs[4]); + hs.hideSequence(seqs[9]); + al2 = hs.getFullAlignment(); + assertNotSame(al, al2); + assertArrayEquals(seqs, al2.getSequencesArray()); + assertNotNull(al2.getProperties()); + assertSame(al.getProperties(), al2.getProperties()); + assertNotNull(al2.getAlignmentAnnotation()); + assertSame(al.getAlignmentAnnotation(), al2.getAlignmentAnnotation()); + assertSame(seqs[4], al2.getSeqrep()); + assertNotNull(al2.getGroups()); + assertSame(al.getGroups(), al2.getGroups()); + assertTrue(al2.hasRNAStructure()); + } + + /** + * Test the method that returns the hidden sequence at a given index in the + * full alignment + * + * @return either the sequence (if hidden) or null (if not hidden) + */ + @Test(groups = "Functional") + public void testGetHiddenSequence() + { + AlignmentI al = new Alignment(seqs); + HiddenSequences hs = al.getHiddenSequences(); + assertNull(hs.getHiddenSequence(0)); + hs.hideSequence(seqs[3]); + assertSame(seqs[3], hs.getHiddenSequence(3)); + assertNull(hs.getHiddenSequence(2)); + assertNull(hs.getHiddenSequence(4)); + } + + @Test(groups = "Functional") + public void testGetSize() + { + } + + @Test(groups = "Functional") + public void testGetWidth() + { + AlignmentI al = new Alignment(seqs); + HiddenSequences hs = al.getHiddenSequences(); + assertEquals(0, hs.getWidth()); + hs.hideSequence(seqs[6]); + hs.hideSequence(seqs[8]); + assertEquals(9, hs.getWidth()); + } + + /** + * Test the method that adds a sequence to the hidden sequences and deletes it + * from the alignment, and its converse + */ + @Test(groups = "Functional") + public void testHideShowSequence() + { + AlignmentI al = new Alignment(seqs); + assertTrue(al.getSequences().contains(seqs[1])); + HiddenSequences hs = al.getHiddenSequences(); + assertEquals(0, hs.getSize()); + assertEquals(10, al.getHeight()); + + /* + * hide the second sequence in the alignment + */ + hs.hideSequence(seqs[1]); + assertFalse(hs.isHidden(seqs[0])); + assertTrue(hs.isHidden(seqs[1])); + assertFalse(al.getSequences().contains(seqs[1])); + assertEquals(1, hs.getSize()); + assertEquals(9, al.getHeight()); + assertSame(seqs[2], al.getSequenceAt(1)); + + /* + * hide what is now the second sequence in the alignment + */ + hs.hideSequence(seqs[2]); + assertFalse(hs.isHidden(seqs[0])); + assertTrue(hs.isHidden(seqs[1])); + assertTrue(hs.isHidden(seqs[2])); + assertFalse(al.getSequences().contains(seqs[1])); + assertFalse(al.getSequences().contains(seqs[2])); + assertEquals(2, hs.getSize()); + assertEquals(8, al.getHeight()); + + /* + * perform 'reveal' on what is now the second sequence in the alignment + * this should unhide the two sequences that precede it + */ + List revealed = hs.showSequence(1, null); + assertEquals(2, revealed.size()); + assertTrue(revealed.contains(seqs[1])); + assertTrue(revealed.contains(seqs[2])); + assertEquals(0, hs.getSize()); + assertEquals(10, al.getHeight()); + } + + @Test(groups = "Functional") + public void testIsHidden() + { + AlignmentI al = new Alignment(seqs); + HiddenSequences hs = al.getHiddenSequences(); + hs.hideSequence(seqs[7]); + hs.hideSequence(seqs[4]); + assertTrue(hs.isHidden(seqs[4])); + assertFalse(hs.isHidden(seqs[5])); + assertFalse(hs.isHidden(seqs[6])); + assertTrue(hs.isHidden(seqs[7])); + assertFalse(hs.isHidden(null)); + assertFalse(hs.isHidden(new Sequence("", ""))); + } + + /** + * Test hiding and unhiding a group with a representative sequence. The + * representative should be left visible when the group is hidden, and + * included in the selected group when it is unhidden. + */ + @Test(groups = "Functional") + public void testHideShowSequence_withHiddenRepSequence() + { + AlignmentI al = new Alignment(seqs); + + /* + * represent seqs 2-4 with seq3 + * this hides seq2 and seq4 but not seq3 + */ + AlignViewport av = new AlignViewport(al); + SequenceGroup sg = new SequenceGroup(); + sg.addSequence(seqs[1], false); + sg.addSequence(seqs[2], false); + sg.addSequence(seqs[3], false); + av.setSelectionGroup(sg); + + /* + * hiding group with reference sequence is done via AlignViewport + */ + av.hideSequences(seqs[2], true); + HiddenSequences hs = al.getHiddenSequences(); + assertEquals(2, hs.getSize()); + assertTrue(hs.isHidden(seqs[1])); + assertFalse(hs.isHidden(seqs[2])); + assertTrue(hs.isHidden(seqs[3])); + + /* + * should now be no sequences selected in the alignment + */ + assertNull(av.getSelectionGroup()); + + /* + * visible alignment is now seq0/2/4/5/6/7/8/9 + * 'reveal sequences' at the representative sequence (index = 1) + * this should unhide the one above i.e. seq1 + * and return a selection list including seq2 + * + * note have to call via AlignViewport to get the expected + * resulting sequence selection + */ + av.showSequence(1); + + /* + * only seq3 is now hidden + */ + assertEquals(1, hs.getSize()); + assertTrue(hs.isHidden(seqs[3])); + assertEquals(SEQ_COUNT - 1, al.getHeight()); + sg = av.getSelectionGroup(); + + /* + * unhidden and representative sequence selected + * (this behaviour may change! JAL-2133) + */ + assertEquals(2, sg.getSize()); + assertTrue(sg.getSequences().contains(seqs[1])); + assertTrue(sg.getSequences().contains(seqs[2])); + assertFalse(sg.getSequences().contains(seqs[3])); + } +} diff --git a/test/jalview/datamodel/MappingTest.java b/test/jalview/datamodel/MappingTest.java index 3131ad7..b326d90 100644 --- a/test/jalview/datamodel/MappingTest.java +++ b/test/jalview/datamodel/MappingTest.java @@ -21,6 +21,7 @@ package jalview.datamodel; import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertSame; import jalview.util.MapList; @@ -75,4 +76,18 @@ public class MappingTest m = new Mapping(seq, fk); assertEquals("[ [1, 6] [8, 13] ] 3:1 to [ [4, 7] ] Seq1", m.toString()); } + + @Test(groups = { "Functional" }) + public void testCopyConstructor() + { + MapList ml = new MapList(new int[] { 1, 6, 8, 13 }, new int[] { 4, 7 }, + 3, 1); + SequenceI seq = new Sequence("seq1", "agtacg"); + Mapping m = new Mapping(seq, ml); + m.setMappedFromId("abc"); + Mapping copy = new Mapping(m); + assertEquals("abc", copy.getMappedFromId()); + assertEquals(ml, copy.getMap()); + assertSame(seq, copy.getTo()); + } } diff --git a/test/jalview/datamodel/PDBEntryTest.java b/test/jalview/datamodel/PDBEntryTest.java index 8a3b925..42bb091 100644 --- a/test/jalview/datamodel/PDBEntryTest.java +++ b/test/jalview/datamodel/PDBEntryTest.java @@ -34,7 +34,7 @@ public class PDBEntryTest { } - @AfterMethod + @AfterMethod(alwaysRun = true) public void tearDown() throws Exception { } diff --git a/test/jalview/datamodel/SequenceTest.java b/test/jalview/datamodel/SequenceTest.java index ab11c09..71719dd 100644 --- a/test/jalview/datamodel/SequenceTest.java +++ b/test/jalview/datamodel/SequenceTest.java @@ -29,11 +29,14 @@ import static org.testng.AssertJUnit.assertTrue; import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; import jalview.datamodel.PDBEntry.Type; +import jalview.util.MapList; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Vector; +import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -62,6 +65,30 @@ public class SequenceTest assertEquals("Gap interval 2 end wrong", 8, gapInt.get(1)[1]); } + @Test(groups = ("Functional")) + public void testIsProtein() + { + // test Protein + assertTrue(new Sequence("prot","ASDFASDFASDF").isProtein()); + // test DNA + assertFalse(new Sequence("prot","ACGTACGTACGT").isProtein()); + // test RNA + SequenceI sq = new Sequence("prot","ACGUACGUACGU"); + assertFalse(sq.isProtein()); + // change sequence, should trigger an update of cached result + sq.setSequence("ASDFASDFADSF"); + assertTrue(sq.isProtein()); + /* + * in situ change of sequence doesn't change hashcode :-O + * (sequence should not expose internal implementation) + */ + for (int i = 0; i < sq.getSequence().length; i++) + { + sq.getSequence()[i] = "acgtu".charAt(i % 5); + } + assertTrue(sq.isProtein()); // but it isn't + } + @Test(groups = { "Functional" }) public void testGetAnnotation() { @@ -385,6 +412,20 @@ public class SequenceTest } /** + * test createDatasetSequence behaves to doc + */ + @Test(groups = { "Functional" }) + public void testCreateDatasetSequence() + { + SequenceI sq = new Sequence("my","ASDASD"); + assertNull(sq.getDatasetSequence()); + SequenceI rds = sq.createDatasetSequence(); + assertNotNull(rds); + assertNull(rds.getDatasetSequence()); + assertEquals(sq.getDatasetSequence(), rds); + } + + /** * Test for deriveSequence applied to a sequence with a dataset */ @Test(groups = { "Functional" }) @@ -397,7 +438,71 @@ public class SequenceTest sq.setStart(3); sq.setEnd(4); + sq.setDescription("Test sequence description.."); + sq.setVamsasId("TestVamsasId"); + sq.setSourceDBRef(new DBRefEntry("PDB", "version0", "1TST")); + + sq.addDBRef(new DBRefEntry("PDB", "version1", "1Tst")); + sq.addDBRef(new DBRefEntry("PDB", "version2", "2Tst")); + sq.addDBRef(new DBRefEntry("PDB", "version3", "3Tst")); + sq.addDBRef(new DBRefEntry("PDB", "version4", "4Tst")); + + sq.addPDBId(new PDBEntry("1PDB", "A", Type.PDB, "filePath/test1")); + sq.addPDBId(new PDBEntry("1PDB", "B", Type.PDB, "filePath/test1")); + sq.addPDBId(new PDBEntry("2PDB", "A", Type.MMCIF, "filePath/test2")); + sq.addPDBId(new PDBEntry("2PDB", "B", Type.MMCIF, "filePath/test2")); + + sq.getDatasetSequence().addDBRef( + new DBRefEntry("PDB", "version1", "1Tst")); + sq.getDatasetSequence().addDBRef( + new DBRefEntry("PDB", "version2", "2Tst")); + sq.getDatasetSequence().addDBRef( + new DBRefEntry("PDB", "version3", "3Tst")); + sq.getDatasetSequence().addDBRef( + new DBRefEntry("PDB", "version4", "4Tst")); + + sq.getDatasetSequence().addPDBId( + new PDBEntry("1PDB", "A", Type.PDB, "filePath/test1")); + sq.getDatasetSequence().addPDBId( + new PDBEntry("1PDB", "B", Type.PDB, "filePath/test1")); + sq.getDatasetSequence().addPDBId( + new PDBEntry("2PDB", "A", Type.MMCIF, "filePath/test2")); + sq.getDatasetSequence().addPDBId( + new PDBEntry("2PDB", "B", Type.MMCIF, "filePath/test2")); + + ArrayList annotsList = new ArrayList(); + System.out.println(">>>>>> " + sq.getSequenceAsString().length()); + annotsList.add(new Annotation("A", "A", 'X', 0.1f)); + annotsList.add(new Annotation("A", "A", 'X', 0.1f)); + Annotation[] annots = annotsList.toArray(new Annotation[0]); + sq.addAlignmentAnnotation(new AlignmentAnnotation("Test annot", + "Test annot description", annots)); + sq.getDatasetSequence().addAlignmentAnnotation( + new AlignmentAnnotation("Test annot", "Test annot description", + annots)); + Assert.assertEquals(sq.getDescription(), "Test sequence description.."); + Assert.assertEquals(sq.getDBRefs().length, 4); + Assert.assertEquals(sq.getAllPDBEntries().size(), 4); + Assert.assertNotNull(sq.getAnnotation()); + Assert.assertEquals(sq.getAnnotation()[0].annotations.length, 2); + Assert.assertEquals(sq.getDatasetSequence().getDBRefs().length, 4); + Assert.assertEquals(sq.getDatasetSequence().getAllPDBEntries().size(), + 4); + Assert.assertNotNull(sq.getDatasetSequence().getAnnotation()); + Sequence derived = (Sequence) sq.deriveSequence(); + + Assert.assertEquals(derived.getDescription(), + "Test sequence description.."); + Assert.assertEquals(derived.getDBRefs().length, 4); + Assert.assertEquals(derived.getAllPDBEntries().size(), 4); + Assert.assertNotNull(derived.getAnnotation()); + Assert.assertEquals(derived.getAnnotation()[0].annotations.length, 2); + Assert.assertEquals(derived.getDatasetSequence().getDBRefs().length, 4); + Assert.assertEquals(derived.getDatasetSequence().getAllPDBEntries() + .size(), 4); + Assert.assertNotNull(derived.getDatasetSequence().getAnnotation()); + assertEquals("CD", derived.getSequenceAsString()); assertSame(sq.getDatasetSequence(), derived.getDatasetSequence()); @@ -550,4 +655,85 @@ public class SequenceTest assertEquals(' ', sq.getCharAt(5)); assertEquals(' ', sq.getCharAt(-1)); } + + /** + * Tests for adding (or updating) dbrefs + * + * @see DBRefEntry#updateFrom(DBRefEntry) + */ + @Test(groups = { "Functional" }) + public void testAddDBRef() + { + SequenceI sq = new Sequence("", "abcde"); + assertNull(sq.getDBRefs()); + DBRefEntry dbref = new DBRefEntry("Uniprot", "1", "P00340"); + sq.addDBRef(dbref); + assertEquals(1, sq.getDBRefs().length); + assertSame(dbref, sq.getDBRefs()[0]); + + /* + * change of version - new entry + */ + DBRefEntry dbref2 = new DBRefEntry("Uniprot", "2", "P00340"); + sq.addDBRef(dbref2); + assertEquals(2, sq.getDBRefs().length); + assertSame(dbref, sq.getDBRefs()[0]); + assertSame(dbref2, sq.getDBRefs()[1]); + + /* + * matches existing entry - not added + */ + sq.addDBRef(new DBRefEntry("UNIPROT", "1", "p00340")); + assertEquals(2, sq.getDBRefs().length); + + /* + * different source = new entry + */ + DBRefEntry dbref3 = new DBRefEntry("UniRef", "1", "p00340"); + sq.addDBRef(dbref3); + assertEquals(3, sq.getDBRefs().length); + assertSame(dbref3, sq.getDBRefs()[2]); + + /* + * different ref = new entry + */ + DBRefEntry dbref4 = new DBRefEntry("UniRef", "1", "p00341"); + sq.addDBRef(dbref4); + assertEquals(4, sq.getDBRefs().length); + assertSame(dbref4, sq.getDBRefs()[3]); + + /* + * matching ref with a mapping - map updated + */ + DBRefEntry dbref5 = new DBRefEntry("UniRef", "1", "p00341"); + Mapping map = new Mapping(new MapList(new int[] { 1, 3 }, new int[] { + 1, 1 }, 3, 1)); + dbref5.setMap(map); + sq.addDBRef(dbref5); + assertEquals(4, sq.getDBRefs().length); + assertSame(dbref4, sq.getDBRefs()[3]); + assertSame(map, dbref4.getMap()); + + /* + * 'real' version replaces "0" version + */ + dbref2.setVersion("0"); + DBRefEntry dbref6 = new DBRefEntry(dbref2.getSource(), "3", + dbref2.getAccessionId()); + sq.addDBRef(dbref6); + assertEquals(4, sq.getDBRefs().length); + assertSame(dbref2, sq.getDBRefs()[1]); + assertEquals("3", dbref2.getVersion()); + + /* + * 'real' version replaces "source:0" version + */ + dbref3.setVersion("Uniprot:0"); + DBRefEntry dbref7 = new DBRefEntry(dbref3.getSource(), "3", + dbref3.getAccessionId()); + sq.addDBRef(dbref7); + assertEquals(4, sq.getDBRefs().length); + assertSame(dbref3, sq.getDBRefs()[2]); + assertEquals("3", dbref2.getVersion()); + } } diff --git a/test/jalview/datamodel/xdb/embl/EmblEntryTest.java b/test/jalview/datamodel/xdb/embl/EmblEntryTest.java index 9fffc45..4b71417 100644 --- a/test/jalview/datamodel/xdb/embl/EmblEntryTest.java +++ b/test/jalview/datamodel/xdb/embl/EmblEntryTest.java @@ -1,12 +1,18 @@ package jalview.datamodel.xdb.embl; import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertSame; -import jalview.util.MappingUtils; +import jalview.analysis.SequenceIdMatcher; +import jalview.datamodel.DBRefEntry; +import jalview.datamodel.DBRefSource; +import jalview.datamodel.SequenceI; +import jalview.util.MapList; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Vector; +import java.util.List; import org.testng.annotations.Test; @@ -18,291 +24,211 @@ public class EmblEntryTest EmblEntry testee = new EmblEntry(); /* - * Make a (CDS) Feature with 4 locations + * Make a (CDS) Feature with 5 locations */ EmblFeature cds = new EmblFeature(); - Vector locs = new Vector(); - cds.setLocations(locs); - - /* - * single range [10-20] - */ - EmblFeatureLocations loc = new EmblFeatureLocations(); - loc.setLocationType("single"); - loc.setLocationComplement(false); - Vector elements = new Vector(); - EmblFeatureLocElement locElement = new EmblFeatureLocElement(); - BasePosition b1 = new BasePosition(); - b1.setPos("10"); - BasePosition b2 = new BasePosition(); - b2.setPos("20"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); - - /* - * complement range [30-40] - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("single"); - loc.setLocationComplement(true); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("30"); - b2 = new BasePosition(); - b2.setPos("40"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); - - /* - * join range [50-60], [70-80] - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("join"); - loc.setLocationComplement(false); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("50"); - b2 = new BasePosition(); - b2.setPos("60"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("70"); - b2 = new BasePosition(); - b2.setPos("80"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); - - /* - * complement range [90-100], [110-120] - * this should be the same as complement(join(90..100,110.120)) - * which is "join 90-100 and 110-120, then complement" - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("join"); - loc.setLocationComplement(true); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("90"); - b2 = new BasePosition(); - b2.setPos("100"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("110"); - b2 = new BasePosition(); - b2.setPos("120"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); + cds.setLocation("join(10..20,complement(30..40),50..60,70..80,complement(110..120))"); int[] exons = testee.getCdsRanges(cds); - assertEquals("[10, 20, 40, 30, 50, 60, 70, 80, 120, 110, 100, 90]", + assertEquals("[10, 20, 40, 30, 50, 60, 70, 80, 120, 110]", Arrays.toString(exons)); } @Test(groups = "Functional") - public void testGetCdsRanges_badData() + public void testParseCodingFeature() { - EmblEntry testee = new EmblEntry(); + // not the whole sequence but enough for this test... + List peptides = new ArrayList(); + SequenceIdMatcher matcher = new SequenceIdMatcher(peptides); + EmblFile ef = EmblTestHelper.getEmblFile(); + assertEquals(1, ef.getEntries().size()); + EmblEntry testee = ef.getEntries().get(0); + String sourceDb = "EMBL"; + SequenceI dna = testee.makeSequence(sourceDb); + + /* + * parse three CDS features, with two/one/no Uniprot cross-refs + */ + for (EmblFeature feature : ef.getEntries().get(0).getFeatures()) + { + if ("CDS".equals(feature.getName())) + { + testee.parseCodingFeature(feature, sourceDb, dna, peptides, matcher); + } + } + + /* + * peptides should now have five entries: + * EMBL product and two Uniprot accessions for the first CDS / translation + * EMBL product and one Uniprot accession for the second CDS / " + * EMBL product only for the third + */ + assertEquals(6, peptides.size()); + assertEquals("CAA30420.1", peptides.get(0).getName()); + assertEquals("MLCF", peptides.get(0).getSequenceAsString()); + assertEquals("UNIPROT|B0BCM4", peptides.get(1).getName()); + assertEquals("MLCF", peptides.get(1).getSequenceAsString()); + assertEquals("UNIPROT|P0CE20", peptides.get(2).getName()); + assertEquals("MLCF", peptides.get(2).getSequenceAsString()); + assertEquals("CAA30421.1", peptides.get(3).getName()); + assertEquals("MSSS", peptides.get(3).getSequenceAsString()); + assertEquals("UNIPROT|B0BCM3", peptides.get(4).getName()); + assertEquals("MSSS", peptides.get(4).getSequenceAsString()); + assertEquals("CAA12345.6", peptides.get(5).getName()); + assertEquals("MSS", peptides.get(5).getSequenceAsString()); + + /* + * verify dna sequence has dbrefs with CDS mappings to the peptide 'products' + */ + MapList cds1Map = new MapList(new int[] { 57, 46 }, new int[] { 1, 4 }, + 3, 1); + MapList cds2Map = new MapList(new int[] { 4, 15 }, new int[] { 1, 4 }, + 3, 1); + MapList cds3Map = new MapList(new int[] { 4, 6, 10, 15 }, new int[] { + 1, 3 }, 3, 1); + DBRefEntry[] dbrefs = dna.getDBRefs(); + assertEquals(4, dbrefs.length); + DBRefEntry dbRefEntry = dbrefs[0]; + assertEquals("UNIPROT", dbRefEntry.getSource()); + assertEquals("B0BCM4", dbRefEntry.getAccessionId()); + assertSame(peptides.get(1), dbRefEntry.getMap().getTo()); + assertEquals(cds1Map, dbRefEntry.getMap().getMap()); + + dbRefEntry = dbrefs[1]; + assertEquals("UNIPROT", dbRefEntry.getSource()); + assertEquals("P0CE20", dbRefEntry.getAccessionId()); + assertSame(peptides.get(2), dbRefEntry.getMap().getTo()); + assertEquals(cds1Map, dbRefEntry.getMap().getMap()); + + dbRefEntry = dbrefs[2]; + assertEquals("UNIPROT", dbRefEntry.getSource()); + assertEquals("B0BCM3", dbRefEntry.getAccessionId()); + assertSame(peptides.get(4), dbRefEntry.getMap().getTo()); + assertEquals(cds2Map, dbRefEntry.getMap().getMap()); + + dbRefEntry = dbrefs[3]; + assertEquals("EMBLCDSPROTEIN", dbRefEntry.getSource()); + assertEquals("CAA12345.6", dbRefEntry.getAccessionId()); + assertSame(peptides.get(5), dbRefEntry.getMap().getTo()); + assertEquals(cds3Map, dbRefEntry.getMap().getMap()); + + /* + * verify peptides have dbrefs + * - to EMBL sequence (with inverse 1:3 cds mapping) + * - to EMBLCDS (with 1:3 mapping) + * - direct (no mapping) to other protein accessions + */ + MapList proteinToCdsMap1 = new MapList(new int[] { 1, 4 }, new int[] { + 1, 12 }, 1, 3); + MapList proteinToCdsMap2 = new MapList(new int[] { 1, 3 }, new int[] { + 1, 9 }, 1, 3); + + // dbrefs for first CDS EMBL product CAA30420.1 + dbrefs = peptides.get(0).getDBRefs(); + assertEquals(5, dbrefs.length); + assertEquals(DBRefSource.EMBL, dbrefs[0].getSource()); + assertEquals("CAA30420.1", dbrefs[0].getAccessionId()); + assertEquals(cds1Map.getInverse(), dbrefs[0].getMap().getMap()); + assertEquals(DBRefSource.EMBLCDS, dbrefs[1].getSource()); + assertEquals("CAA30420.1", dbrefs[1].getAccessionId()); + assertEquals(proteinToCdsMap1, dbrefs[1].getMap().getMap()); + assertEquals(DBRefSource.EMBLCDSProduct, dbrefs[2].getSource()); + assertEquals("CAA30420.1", dbrefs[2].getAccessionId()); + assertNull(dbrefs[2].getMap()); + assertEquals(new DBRefEntry(DBRefSource.UNIPROT, "2.1", "B0BCM4"), + dbrefs[3]); + assertNull(dbrefs[3].getMap()); + assertEquals(new DBRefEntry(DBRefSource.UNIPROT, "0", "P0CE20"), + dbrefs[4]); + assertNull(dbrefs[4].getMap()); + + // dbrefs for first CDS first Uniprot xref + dbrefs = peptides.get(1).getDBRefs(); + assertEquals(2, dbrefs.length); + assertEquals(new DBRefEntry(DBRefSource.UNIPROT, "2.1", "B0BCM4"), + dbrefs[0]); + assertNull(dbrefs[0].getMap()); + assertEquals(DBRefSource.EMBL, dbrefs[1].getSource()); + assertEquals("X07547", dbrefs[1].getAccessionId()); + assertEquals(cds1Map.getInverse(), dbrefs[1].getMap().getMap()); + + // dbrefs for first CDS second Uniprot xref + dbrefs = peptides.get(2).getDBRefs(); + assertEquals(2, dbrefs.length); + assertEquals(new DBRefEntry(DBRefSource.UNIPROT, "0", "P0CE20"), + dbrefs[0]); + assertNull(dbrefs[0].getMap()); + assertEquals(DBRefSource.EMBL, dbrefs[1].getSource()); + assertEquals("X07547", dbrefs[1].getAccessionId()); + assertEquals(cds1Map.getInverse(), dbrefs[1].getMap().getMap()); + + // dbrefs for second CDS EMBL product CAA30421.1 + dbrefs = peptides.get(3).getDBRefs(); + assertEquals(4, dbrefs.length); + assertEquals(DBRefSource.EMBL, dbrefs[0].getSource()); + assertEquals("CAA30421.1", dbrefs[0].getAccessionId()); + assertEquals(cds2Map.getInverse(), dbrefs[0].getMap().getMap()); + assertEquals(DBRefSource.EMBLCDS, dbrefs[1].getSource()); + assertEquals("CAA30421.1", dbrefs[1].getAccessionId()); + assertEquals(proteinToCdsMap1, dbrefs[1].getMap().getMap()); + assertEquals(DBRefSource.EMBLCDSProduct, dbrefs[2].getSource()); + assertEquals("CAA30421.1", dbrefs[2].getAccessionId()); + assertNull(dbrefs[2].getMap()); + assertEquals(new DBRefEntry(DBRefSource.UNIPROT, "0", "B0BCM3"), + dbrefs[3]); + assertNull(dbrefs[3].getMap()); + + // dbrefs for second CDS second Uniprot xref + dbrefs = peptides.get(4).getDBRefs(); + assertEquals(2, dbrefs.length); + assertEquals(new DBRefEntry(DBRefSource.UNIPROT, "0", "B0BCM3"), + dbrefs[0]); + assertNull(dbrefs[0].getMap()); + assertEquals(DBRefSource.EMBL, dbrefs[1].getSource()); + assertEquals("X07547", dbrefs[1].getAccessionId()); + assertEquals(cds2Map.getInverse(), dbrefs[1].getMap().getMap()); + + // dbrefs for third CDS inferred EMBL product CAA12345.6 + dbrefs = peptides.get(5).getDBRefs(); + assertEquals(3, dbrefs.length); + assertEquals(DBRefSource.EMBL, dbrefs[0].getSource()); + assertEquals("CAA12345.6", dbrefs[0].getAccessionId()); + assertEquals(cds3Map.getInverse(), dbrefs[0].getMap().getMap()); + assertEquals(DBRefSource.EMBLCDS, dbrefs[1].getSource()); + assertEquals("CAA12345.6", dbrefs[1].getAccessionId()); + assertEquals(proteinToCdsMap2, dbrefs[1].getMap().getMap()); + assertEquals(DBRefSource.EMBLCDSProduct, dbrefs[2].getSource()); + assertEquals("CAA12345.6", dbrefs[2].getAccessionId()); + assertNull(dbrefs[2].getMap()); + } - /* - * Make a (CDS) Feature with 4 locations - */ - EmblFeature cds = new EmblFeature(); - Vector locs = new Vector(); - cds.setLocations(locs); + @Test(groups = "Functional") + public void testAdjustForProteinLength() + { + int[] exons = new int[] { 11, 15, 21, 25, 31, 38 }; // 18 bp - /* - * single range [10-20] - */ - EmblFeatureLocations loc = new EmblFeatureLocations(); - loc.setLocationType("single"); - loc.setLocationComplement(false); - Vector elements = new Vector(); - EmblFeatureLocElement locElement = new EmblFeatureLocElement(); - BasePosition b1 = new BasePosition(); - b1.setPos("10"); - BasePosition b2 = new BasePosition(); - b2.setPos("20"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); + // exact length match: + assertSame(exons, EmblEntry.adjustForProteinLength(6, exons)); - /* - * single range with missing end position - should be skipped - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("single"); - loc.setLocationComplement(false); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("30"); - locElement.setBasePositions(new BasePosition[] { b1 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); + // match if we assume exons include stop codon not in protein: + assertSame(exons, EmblEntry.adjustForProteinLength(5, exons)); - /* - * single range with extra base position - should be skipped - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("single"); - loc.setLocationComplement(false); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("30"); - locElement.setBasePositions(new BasePosition[] { b1, b1, b1 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); + // truncate last exon by 6bp + int[] truncated = EmblEntry.adjustForProteinLength(4, exons); + assertEquals("[11, 15, 21, 25, 31, 32]", + Arrays.toString(truncated)); - /* - * single valid range [50-60] to finish - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("single"); - loc.setLocationComplement(false); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("50"); - b2 = new BasePosition(); - b2.setPos("60"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); + // remove last exon and truncate preceding by 1bp + truncated = EmblEntry.adjustForProteinLength(3, exons); + assertEquals("[11, 15, 21, 24]", Arrays.toString(truncated)); - int[] exons = testee.getCdsRanges(cds); - assertEquals("[10, 20, 50, 60]", Arrays.toString(exons)); - } + // exact removal of exon case: + exons = new int[] { 11, 15, 21, 27, 33, 38 }; // 18 bp + truncated = EmblEntry.adjustForProteinLength(4, exons); + assertEquals("[11, 15, 21, 27]", Arrays.toString(truncated)); - /** - * Test retrieval of exon locations matching an accession id - */ - @Test(groups = "Functional") - public void testGetCdsRanges_forAccession() - { - EmblEntry testee = new EmblEntry(); - String accession = "A1234"; - testee.setAccession(accession); - /* - * Make a (CDS) Feature with 4 locations - */ - EmblFeature cds = new EmblFeature(); - Vector locs = new Vector(); - cds.setLocations(locs); - - /* - * single range [10-20] for 'this' accession - */ - EmblFeatureLocations loc = new EmblFeatureLocations(); - loc.setLocationType("single"); - loc.setLocationComplement(false); - Vector elements = new Vector(); - EmblFeatureLocElement locElement = new EmblFeatureLocElement(); - locElement.setAccession(accession); - BasePosition b1 = new BasePosition(); - b1.setPos("10"); - BasePosition b2 = new BasePosition(); - b2.setPos("20"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); - - /* - * complement range [30-40] - no accession - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("single"); - loc.setLocationComplement(true); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - b1 = new BasePosition(); - b1.setPos("30"); - b2 = new BasePosition(); - b2.setPos("40"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); - - /* - * join range [50-60] this accession, [70-80] another - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("join"); - loc.setLocationComplement(false); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - locElement.setAccession(accession); - b1 = new BasePosition(); - b1.setPos("50"); - b2 = new BasePosition(); - b2.setPos("60"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - locElement = new EmblFeatureLocElement(); - locElement.setAccession("notme"); - b1 = new BasePosition(); - b1.setPos("70"); - b2 = new BasePosition(); - b2.setPos("80"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); - - /* - * complement range [90-100] wrong accession, [110-120] good - * this should be the same as complement(join(90..100,110.120)) - * which is "join 90-100 and 110-120, then complement" - */ - loc = new EmblFeatureLocations(); - loc.setLocationType("join"); - loc.setLocationComplement(true); - elements = new Vector(); - locElement = new EmblFeatureLocElement(); - locElement.setAccession("wrong"); - b1 = new BasePosition(); - b1.setPos("90"); - b2 = new BasePosition(); - b2.setPos("100"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - locElement = new EmblFeatureLocElement(); - locElement.setAccession(accession); - b1 = new BasePosition(); - b1.setPos("110"); - b2 = new BasePosition(); - b2.setPos("120"); - locElement.setBasePositions(new BasePosition[] { b1, b2 }); - elements.add(locElement); - loc.setLocElements(elements); - locs.add(loc); - - /* - * verify we pick out only ranges for A1234 - */ - int[] exons = testee.getCdsRanges(cds); - assertEquals("[10, 20, 50, 60, 120, 110]", - Arrays.toString(exons)); + // what if exons are too short for protein? + truncated = EmblEntry.adjustForProteinLength(7, exons); + assertSame(exons, truncated); } } diff --git a/test/jalview/datamodel/xdb/embl/EmblFileTest.java b/test/jalview/datamodel/xdb/embl/EmblFileTest.java index c6a94d7..906436f 100644 --- a/test/jalview/datamodel/xdb/embl/EmblFileTest.java +++ b/test/jalview/datamodel/xdb/embl/EmblFileTest.java @@ -21,61 +21,49 @@ package jalview.datamodel.xdb.embl; import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNull; -import static org.testng.AssertJUnit.assertTrue; import jalview.datamodel.DBRefEntry; -import java.io.StringReader; import java.util.Vector; import org.testng.annotations.Test; public class EmblFileTest { - // adapted from http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/embl/x53828/emblxml - private static final String TESTDATA = "" - + "" - + "" - + "Chicken LDH-A mRNA for lactate dehydrogenase A chain (EC 1.1.1.27)" - + "L-lactate dehydrogenasechutney" - + "" - + "" - + "" - + "L-lactate dehydrogenase A-chainpickle" - + "MSLKDHLIHNKeith" - + "" - + "" - + "601058" - + "" - + "GTGACG"; @Test(groups = { "Functional" }) public void testGetEmblFile() { - Vector entries = EmblFile.getEmblFile( - new StringReader(TESTDATA)).getEntries(); + Vector entries = EmblTestHelper.getEmblFile().getEntries(); assertEquals(1, entries.size()); EmblEntry entry = entries.get(0); - assertEquals("X53828", entry.getAccession()); - assertEquals( - "Chicken LDH-A mRNA for lactate dehydrogenase A chain (EC 1.1.1.27)", - entry.getDesc()); - assertEquals("2005-04-18", entry.getLastUpdated()); + assertEquals("X07547", entry.getAccession()); + assertEquals("C. trachomatis plasmid", entry.getDescription()); + assertEquals("STD", entry.getDataClass()); + assertEquals("PRO", entry.getTaxonomicDivision()); + assertEquals("1999-02-10", entry.getLastUpdatedDate()); + assertEquals("58", entry.getLastUpdatedRelease()); + assertEquals("1988-11-10", entry.getFirstPublicDate()); + assertEquals("18", entry.getFirstPublicRelease()); + assertEquals("genomic DNA", entry.getMoleculeType()); + assertEquals("1", entry.getSequenceVersion()); + assertEquals("8", entry.getEntryVersion()); + assertEquals("linear", entry.getTopology()); + assertEquals("7499", entry.getSequenceLength()); /* * FIXME these assertions fail - values are null - why?? Adding or removing * attributes in the test XML modifies behaviour. eg. inserting an attribute * _before_ lastUpdated results in a null value in this field. */ - // assertEquals("25", entry.getRCreated()); - // assertEquals("83", entry.getRLastUpdated()); + assertEquals("1988-11-10", entry.getFirstPublicDate()); + assertEquals("18", entry.getFirstPublicRelease()); assertEquals(2, entry.getKeywords().size()); - assertEquals("L-lactate dehydrogenase", entry.getKeywords().get(0)); - assertEquals("chutney", entry.getKeywords().get(1)); + assertEquals("plasmid", entry.getKeywords().get(0)); + assertEquals("unidentified reading frame", entry.getKeywords().get(1)); /* * dbrefs @@ -83,72 +71,98 @@ public class EmblFileTest assertEquals(2, entry.getDbRefs().size()); DBRefEntry dbref = entry.getDbRefs().get(0); assertEquals("EuropePMC", dbref.getSource()); - assertEquals("PMC1460223", dbref.getAccessionId()); - assertEquals("9649548", dbref.getVersion()); + assertEquals("PMC107176", dbref.getAccessionId()); + assertEquals("9573186", dbref.getVersion()); dbref = entry.getDbRefs().get(1); assertEquals("MD5", dbref.getSource()); - assertEquals("d3b68", dbref.getAccessionId()); + assertEquals("ac73317", dbref.getAccessionId()); // blank version has been converted to "0" assertEquals("0", dbref.getVersion()); /* - * sequence features + * three sequence features for CDS + */ + assertEquals(3, entry.getFeatures().size()); + /* + * first CDS */ - assertEquals(1, entry.getFeatures().size()); EmblFeature ef = entry.getFeatures().get(0); assertEquals("CDS", ef.getName()); + assertEquals("complement(46..57)", ef.getLocation()); assertEquals(2, ef.getDbRefs().size()); dbref = ef.getDbRefs().get(0); - assertEquals("GOA", dbref.getSource()); - assertEquals("P00340", dbref.getAccessionId()); + assertEquals("UniProtKB/Swiss-Prot", dbref.getSource()); + assertEquals("B0BCM4", dbref.getAccessionId()); assertEquals("2.1", dbref.getVersion()); dbref = ef.getDbRefs().get(1); - assertEquals("InterPro", dbref.getSource()); - assertEquals("IPR001236", dbref.getAccessionId()); - // blank version converted to "0": + assertEquals("UniProtKB/Swiss-Prot", dbref.getSource()); + assertEquals("P0CE20", dbref.getAccessionId()); + // blank version gets converted to "0": assertEquals("0", dbref.getVersion()); - assertEquals(2, ef.getQualifiers().size()); - - // feature qualifiers + // CDS feature qualifiers + assertEquals(3, ef.getQualifiers().size()); Qualifier q = ef.getQualifiers().get(0); assertEquals("note", q.getName()); assertEquals(2, q.getValues().length); - assertEquals("L-lactate dehydrogenase A-chain", q.getValues()[0]); + assertEquals("ORF 8 (AA 1-330)", q.getValues()[0]); assertEquals("pickle", q.getValues()[1]); assertNull(q.getEvidence()); q = ef.getQualifiers().get(1); + assertEquals("protein_id", q.getName()); + assertEquals(1, q.getValues().length); + assertEquals("CAA30420.1", q.getValues()[0]); + q = ef.getQualifiers().get(2); assertEquals("translation", q.getName()); assertEquals(1, q.getValues().length); - assertEquals("MSLKDHLIHN", q.getValues()[0]); + assertEquals("MLCF", q.getValues()[0]); assertEquals(1, q.getEvidence().length); assertEquals("Keith", q.getEvidence()[0]); - // feature locations - assertEquals(1, ef.getLocations().size()); - EmblFeatureLocations fl = ef.getLocations().get(0); - assertEquals("single", fl.getLocationType()); - assertTrue(fl.isLocationComplement()); - assertEquals(1, fl.getLocElements().size()); - EmblFeatureLocElement le = fl.getLocElements().get(0); - assertEquals("range", le.getType()); - assertEquals("X53828", le.getAccession()); - assertEquals("1", le.getVersion()); - assertFalse(le.isComplement()); - assertEquals(2, le.getBasePositions().length); - BasePosition bp = le.getBasePositions()[0]; - assertEquals("simple", bp.getType()); - assertEquals("60", bp.getPos()); - bp = le.getBasePositions()[1]; - assertEquals("join", bp.getType()); - assertEquals("1058", bp.getPos()); + /* + * second CDS + */ + ef = entry.getFeatures().get(1); + assertEquals("CDS", ef.getName()); + assertEquals("4..15", ef.getLocation()); + assertEquals(1, ef.getDbRefs().size()); + dbref = ef.getDbRefs().get(0); + assertEquals("UniProtKB/Swiss-Prot", dbref.getSource()); + assertEquals("B0BCM3", dbref.getAccessionId()); + assertEquals("0", dbref.getVersion()); + assertEquals(2, ef.getQualifiers().size()); + q = ef.getQualifiers().get(0); + assertEquals("protein_id", q.getName()); + assertEquals(1, q.getValues().length); + assertEquals("CAA30421.1", q.getValues()[0]); + q = ef.getQualifiers().get(1); + assertEquals("translation", q.getName()); + assertEquals(1, q.getValues().length); + assertEquals("MSSS", q.getValues()[0]); + + /* + * third CDS + */ + ef = entry.getFeatures().get(2); + assertEquals("CDS", ef.getName()); + assertEquals("join(4..6,10..15)", ef.getLocation()); + assertNull(ef.getDbRefs()); + assertEquals(2, ef.getQualifiers().size()); + q = ef.getQualifiers().get(0); + assertEquals("protein_id", q.getName()); + assertEquals(1, q.getValues().length); + assertEquals("CAA12345.6", q.getValues()[0]); + q = ef.getQualifiers().get(1); + assertEquals("translation", q.getName()); + assertEquals(1, q.getValues().length); + assertEquals("MSS", q.getValues()[0]); /* - * Sequence + * Sequence - verify newline not converted to space (JAL-2029) */ EmblSequence seq = entry.getSequence(); - assertEquals("mRNA", seq.getType()); - assertEquals("2", seq.getVersion()); - assertEquals("GTGACG", seq.getSequence()); + assertEquals( + "GGTATGTCCTCTAGTACAAACACCCCCAATATTGTGATATAATTAAAAACATAGCAT", + seq.getSequence()); /* * getSequence() converts empty DBRefEntry.version to "0" diff --git a/test/jalview/datamodel/xdb/embl/EmblTestHelper.java b/test/jalview/datamodel/xdb/embl/EmblTestHelper.java new file mode 100644 index 0000000..6349164 --- /dev/null +++ b/test/jalview/datamodel/xdb/embl/EmblTestHelper.java @@ -0,0 +1,61 @@ +package jalview.datamodel.xdb.embl; + +import java.io.StringReader; + +public class EmblTestHelper +{ + // adapted from http://www.ebi.ac.uk/ena/data/view/X07547&display=xml + // dna and translations truncated for convenience + private static final String TESTDATA = "" + + "" + + "" + + "X07574" + + "C. trachomatis plasmid" + + "plasmidunidentified reading frame" + + "" + + "" + /* + * first CDS (range and translation changed to keep test data manageable) + */ + + "" + // test the case of >1 cross-ref to the same database (JAL-2029) + + "" + + "" + + "ORF 8 (AA 1-330)pickle" + + "CAA30420.1" + + "MLCFKeith" + + "" + /* + * second CDS (range and translation changed to keep test data manageable) + */ + + "" + + "" + + "CAA30421.1" + + "MSSS" + + "" + /* + * third CDS is made up - has no xref - code should synthesize + * one to an assumed EMBLCDSPROTEIN accession + */ + + "" + + "CAA12345.6" + + "MSS" + + "" + /* + * sequence (modified for test purposes) + * emulates EMBL XML 1.2 which splits sequence data every 60 characters + * see EmblSequence.setSequence + */ + + "GGTATGTCCTCTAGTACAAAC\n" + + "ACCCCCAATATTGTGATATAATTAAAAACATAGCAT" + + ""; + + static EmblFile getEmblFile() + { + return EmblFile.getEmblFile(new StringReader(TESTDATA)); + } +} diff --git a/test/jalview/ext/ensembl/EnsemblCdnaTest.java b/test/jalview/ext/ensembl/EnsemblCdnaTest.java index 90c38d4..fb7e143 100644 --- a/test/jalview/ext/ensembl/EnsemblCdnaTest.java +++ b/test/jalview/ext/ensembl/EnsemblCdnaTest.java @@ -21,13 +21,13 @@ import org.testng.annotations.Test; public class EnsemblCdnaTest { - @BeforeClass + @BeforeClass(alwaysRun = true) public void setUp() { SequenceOntologyFactory.setInstance(new SequenceOntologyLite()); } - @AfterClass + @AfterClass(alwaysRun = true) public void tearDown() { SequenceOntologyFactory.setInstance(null); diff --git a/test/jalview/ext/ensembl/EnsemblCdsTest.java b/test/jalview/ext/ensembl/EnsemblCdsTest.java index 183f933..5344575 100644 --- a/test/jalview/ext/ensembl/EnsemblCdsTest.java +++ b/test/jalview/ext/ensembl/EnsemblCdsTest.java @@ -20,13 +20,13 @@ import org.testng.annotations.Test; public class EnsemblCdsTest { - @BeforeClass + @BeforeClass(alwaysRun = true) public void setUp() { SequenceOntologyFactory.setInstance(new SequenceOntologyLite()); } - @AfterClass + @AfterClass(alwaysRun = true) public void tearDown() { SequenceOntologyFactory.setInstance(null); diff --git a/test/jalview/ext/ensembl/EnsemblGeneTest.java b/test/jalview/ext/ensembl/EnsemblGeneTest.java index 5cf296c..4e815d1 100644 --- a/test/jalview/ext/ensembl/EnsemblGeneTest.java +++ b/test/jalview/ext/ensembl/EnsemblGeneTest.java @@ -22,13 +22,13 @@ import org.testng.annotations.Test; public class EnsemblGeneTest { - @BeforeClass + @BeforeClass(alwaysRun = true) public void setUp() { SequenceOntologyFactory.setInstance(new SequenceOntologyLite()); } - @AfterClass + @AfterClass(alwaysRun = true) public void tearDown() { SequenceOntologyFactory.setInstance(null); diff --git a/test/jalview/ext/ensembl/EnsemblGenomeTest.java b/test/jalview/ext/ensembl/EnsemblGenomeTest.java index daad8b1..c711279 100644 --- a/test/jalview/ext/ensembl/EnsemblGenomeTest.java +++ b/test/jalview/ext/ensembl/EnsemblGenomeTest.java @@ -19,13 +19,13 @@ import org.testng.annotations.Test; public class EnsemblGenomeTest { - @BeforeClass + @BeforeClass(alwaysRun = true) public void setUp() { SequenceOntologyFactory.setInstance(new SequenceOntologyLite()); } - @AfterClass + @AfterClass(alwaysRun = true) public void tearDown() { SequenceOntologyFactory.setInstance(null); diff --git a/test/jalview/ext/ensembl/EnsemblRestClientTest.java b/test/jalview/ext/ensembl/EnsemblRestClientTest.java index 6f7c1ad..56e1339 100644 --- a/test/jalview/ext/ensembl/EnsemblRestClientTest.java +++ b/test/jalview/ext/ensembl/EnsemblRestClientTest.java @@ -12,7 +12,7 @@ public class EnsemblRestClientTest { @Test(suiteName = "live") - public void testLiveCheckEnsembl() + public void testIsEnsemblAvailable() { EnsemblRestClient sf = new EnsemblRestClient() { diff --git a/test/jalview/ext/ensembl/EnsemblSeqProxyTest.java b/test/jalview/ext/ensembl/EnsemblSeqProxyTest.java index 71f0212..2d3948f 100644 --- a/test/jalview/ext/ensembl/EnsemblSeqProxyTest.java +++ b/test/jalview/ext/ensembl/EnsemblSeqProxyTest.java @@ -6,7 +6,6 @@ import static org.testng.AssertJUnit.assertTrue; import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals; import jalview.datamodel.Alignment; -import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.io.AppletFormatAdapter; @@ -16,10 +15,7 @@ import jalview.io.gff.SequenceOntologyFactory; import jalview.io.gff.SequenceOntologyLite; import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URL; import java.util.Arrays; -import java.util.List; import org.testng.Assert; import org.testng.annotations.AfterClass; @@ -109,13 +105,13 @@ public class EnsemblSeqProxyTest + "NRDQIIFMVGRGYLSPDLSKVRSNCPKAMKRLMAECLKKKRDERPLFPQILASIELLARS\n" + "LPKIHRSASEPSLNRAGFQTEDFSLYACASPKTPIQAGGYGAFPVH" } }; - @BeforeClass + @BeforeClass(alwaysRun = true) public void setUp() { SequenceOntologyFactory.setInstance(new SequenceOntologyLite()); } - @AfterClass + @AfterClass(alwaysRun = true) public void tearDown() { SequenceOntologyFactory.setInstance(null); @@ -160,61 +156,6 @@ public class EnsemblSeqProxyTest } } - @Test(suiteName = "live") - public void testLiveCheckEnsembl() - { - EnsemblRestClient sf = new EnsemblRestClient() - { - - @Override - public String getDbName() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public AlignmentI getSequenceRecords(String queries) throws Exception - { - // TODO Auto-generated method stub - return null; - } - - @Override - protected URL getUrl(List ids) throws MalformedURLException - { - // TODO Auto-generated method stub - return null; - } - - @Override - protected boolean useGetRequest() - { - // TODO Auto-generated method stub - return false; - } - - @Override - protected String getRequestMimeType(boolean b) - { - // TODO Auto-generated method stub - return null; - } - - @Override - protected String getResponseMimeType() - { - // TODO Auto-generated method stub - return null; - } - - }; - boolean isAvailable = sf.isEnsemblAvailable(); - System.out.println("Ensembl is " - + (isAvailable ? "UP!" - : "DOWN or unreachable ******************* BAD!")); - } - @Test(groups = "Functional") public void getGenomicRangesFromFeatures() { diff --git a/test/jalview/ext/jmol/JmolParserTest.java b/test/jalview/ext/jmol/JmolParserTest.java index 7ac1579..0627a4a 100644 --- a/test/jalview/ext/jmol/JmolParserTest.java +++ b/test/jalview/ext/jmol/JmolParserTest.java @@ -30,6 +30,7 @@ import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.io.AppletFormatAdapter; import jalview.io.FileLoader; +import jalview.structure.StructureImportSettings; import java.util.Vector; @@ -55,7 +56,7 @@ public class JmolParserTest //@formatter:off // a modified and very cut-down extract of 4UJ4 - String pdbWithChainBreak = + String pastePDBDataWithChainBreak = "HEADER TRANSPORT PROTEIN 08-APR-15 4UJ4\n" + // chain B has missing residues; these should all go in the same sequence: "ATOM 1909 CA VAL B 358 21.329 -19.739 -67.740 1.00201.05 C\n" + @@ -105,6 +106,31 @@ public class JmolParserTest @Test(groups = { "Functional" }) public void testFileParser() throws Exception { + StructureImportSettings.setProcessHETATMs(false); + for (String pdbStr : testFile) + { + PDBfile mctest = new PDBfile(false, false, false, pdbStr, + AppletFormatAdapter.FILE); + JmolParser jtest = new JmolParser(false, false, false, pdbStr, + jalview.io.AppletFormatAdapter.FILE); + Vector seqs = jtest.getSeqs(), mcseqs = mctest.getSeqs(); + + assertTrue( + "No sequences extracted from testfile\n" + + (jtest.hasWarningMessage() ? jtest.getWarningMessage() + : "(No warnings raised)"), seqs != null + && seqs.size() > 0); + for (SequenceI sq : seqs) + { + assertEquals("JMol didn't process " + pdbStr + + " to the same sequence as MCView", + sq.getSequenceAsString(), mcseqs.remove(0) + .getSequenceAsString()); + AlignmentI al = new Alignment(new SequenceI[] { sq }); + validateSecStrRows(al); + } + } + StructureImportSettings.setProcessHETATMs(true); for (String pdbStr : testFile) { PDBfile mctest = new PDBfile(false, false, false, pdbStr, @@ -173,14 +199,15 @@ public class JmolParserTest @Test(groups = { "Functional" }) public void testParse_missingResidues() throws Exception { - PDBfile mctest = new PDBfile(false, false, false, pdbWithChainBreak, + PDBfile mctest = new PDBfile(false, false, false, + pastePDBDataWithChainBreak, AppletFormatAdapter.PASTE); boolean annotFromStructure = false; boolean localSecondaryStruct = false; boolean serviceSecondaryStruct = false; JmolParser jtest = new JmolParser(annotFromStructure, localSecondaryStruct, serviceSecondaryStruct, - pdbWithChainBreak, + pastePDBDataWithChainBreak, jalview.io.AppletFormatAdapter.PASTE); Vector seqs = jtest.getSeqs(); Vector mcseqs = mctest.getSeqs(); diff --git a/test/jalview/ext/jmol/JmolViewerTest.java b/test/jalview/ext/jmol/JmolViewerTest.java index c9b2980..10224fa 100644 --- a/test/jalview/ext/jmol/JmolViewerTest.java +++ b/test/jalview/ext/jmol/JmolViewerTest.java @@ -53,7 +53,7 @@ public class JmolViewerTest /** * @throws java.lang.Exception */ - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { jalview.gui.Desktop.instance.closeAll_actionPerformed(null); diff --git a/test/jalview/ext/paradise/TestAnnotate3D.java b/test/jalview/ext/paradise/TestAnnotate3D.java index 679385a..4110863 100644 --- a/test/jalview/ext/paradise/TestAnnotate3D.java +++ b/test/jalview/ext/paradise/TestAnnotate3D.java @@ -43,7 +43,7 @@ import compbio.util.FileUtil; public class TestAnnotate3D { - @Test(groups = { "Functional" }, enabled = false) + @Test(groups = { "Network" }, enabled = true) public void test1GIDbyId() throws Exception { // use same ID as standard tests given at @@ -53,7 +53,7 @@ public class TestAnnotate3D testRNAMLcontent(ids, null); } - @Test(groups = { "Functional" }, enabled = false) + @Test(groups = { "Network" }, enabled = true) public void testIdVsContent2GIS() throws Exception { Iterator ids = Annotate3D.getRNAMLForPDBId("2GIS"); @@ -97,7 +97,7 @@ public class TestAnnotate3D * * @throws Exception */ - @Test(groups = { "Functional" }, enabled = false) + @Test(groups = { "Network" }, enabled = true) public void testPDBfileVsRNAML() throws Exception { PDBfile pdbf = new PDBfile(true, false, true, "examples/2GIS.pdb", @@ -111,7 +111,6 @@ public class TestAnnotate3D testRNAMLcontent(readers, pdbf); } - @Test(groups = { "Functional" }, enabled = false) private void testRNAMLcontent(Iterator readers, PDBfile pdbf) throws Exception { diff --git a/test/jalview/ext/rbvi/chimera/JalviewChimeraView.java b/test/jalview/ext/rbvi/chimera/JalviewChimeraView.java index cd28a2b..93a98b8 100644 --- a/test/jalview/ext/rbvi/chimera/JalviewChimeraView.java +++ b/test/jalview/ext/rbvi/chimera/JalviewChimeraView.java @@ -54,7 +54,7 @@ public class JalviewChimeraView /** * @throws java.lang.Exception */ - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { jalview.gui.Desktop.instance.closeAll_actionPerformed(null); diff --git a/test/jalview/ext/so/SequenceOntologyTest.java b/test/jalview/ext/so/SequenceOntologyTest.java index be07485..ea92e3c 100644 --- a/test/jalview/ext/so/SequenceOntologyTest.java +++ b/test/jalview/ext/so/SequenceOntologyTest.java @@ -3,11 +3,8 @@ package jalview.ext.so; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; -import jalview.ext.so.SequenceOntology; -import jalview.io.gff.SequenceOntologyFactory; import jalview.io.gff.SequenceOntologyI; -import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -15,20 +12,20 @@ public class SequenceOntologyTest { private SequenceOntologyI so; - @BeforeClass + @BeforeClass(alwaysRun = true) public void setUp() { long now = System.currentTimeMillis(); - SequenceOntologyFactory.setInstance(new SequenceOntology()); + try + { + so = new SequenceOntology(); + } catch (Throwable t) + { + System.out.println("SOTest error "); + t.printStackTrace(System.err); + } long elapsed = System.currentTimeMillis() - now; System.out.println("Load and cache of Sequence Ontology took " + elapsed + "ms"); - so = SequenceOntologyFactory.getInstance(); - } - - @AfterClass - public void tearDown() - { - SequenceOntologyFactory.setInstance(null); } @Test(groups = "Functional") diff --git a/test/jalview/fts/core/FTSRestClientTest.java b/test/jalview/fts/core/FTSRestClientTest.java index 0dac04b..eae5575 100644 --- a/test/jalview/fts/core/FTSRestClientTest.java +++ b/test/jalview/fts/core/FTSRestClientTest.java @@ -40,7 +40,7 @@ public class FTSRestClientTest public void getPrimaryKeyColumIndexTest() { Collection wantedFields = ftsRestClient - .getAllDefaulDisplayedDataColumns(); + .getAllDefaultDisplayedFTSDataColumns(); int foundIndex = -1; try { @@ -61,10 +61,10 @@ public class FTSRestClientTest @Test(groups = { "Functional" }) public void getAllDefaulDisplayedDataColumns() { - Assert.assertNotNull(ftsRestClient.getAllDefaulDisplayedDataColumns()); - Assert.assertTrue(!ftsRestClient.getAllDefaulDisplayedDataColumns() + Assert.assertNotNull(ftsRestClient.getAllDefaultDisplayedFTSDataColumns()); + Assert.assertTrue(!ftsRestClient.getAllDefaultDisplayedFTSDataColumns() .isEmpty()); - Assert.assertEquals(ftsRestClient.getAllDefaulDisplayedDataColumns() + Assert.assertEquals(ftsRestClient.getAllDefaultDisplayedFTSDataColumns() .size(), 7); } @@ -72,11 +72,11 @@ public class FTSRestClientTest public void getDataColumnsFieldsAsCommaDelimitedString() { Collection wantedFields = ftsRestClient - .getAllDefaulDisplayedDataColumns(); + .getAllDefaultDisplayedFTSDataColumns(); String actual = ftsRestClient .getDataColumnsFieldsAsCommaDelimitedString(wantedFields); Assert.assertEquals(actual, - "id,entry name,protein names,genes,organism,length,reviewed"); + "id,entry name,protein names,genes,organism,reviewed,length"); } @@ -95,7 +95,7 @@ public class FTSRestClientTest Collection searchalbeFields = ftsRestClient .getSearchableDataColumns(); Assert.assertNotNull(searchalbeFields); - Assert.assertEquals(searchalbeFields.size(), 30); + Assert.assertEquals(searchalbeFields.size(), 22); } @Test(groups = { "Functional" }) @@ -151,7 +151,7 @@ public class FTSRestClientTest public void getDefaultResponsePageSize() { int defaultResSize = ftsRestClient.getDefaultResponsePageSize(); - Assert.assertEquals(defaultResSize, 100); + Assert.assertEquals(defaultResSize, 500); } @Test(groups = { "Functional" }) @@ -213,10 +213,12 @@ public class FTSRestClientTest FTSDataColumnI foundDataCol = ftsRestClient .getDataColumnByNameOrCode("Protein names"); Assert.assertNotNull(foundDataCol); - Assert.assertEquals(foundDataCol.getDataColumnClass(), String.class); + Assert.assertEquals(foundDataCol.getDataType().getDataTypeClass(), + String.class); foundDataCol = ftsRestClient.getDataColumnByNameOrCode("length"); Assert.assertNotNull(foundDataCol); - Assert.assertEquals(foundDataCol.getDataColumnClass(), Integer.class); + Assert.assertEquals(foundDataCol.getDataType().getDataTypeClass(), + Integer.class); // foundDataCol = ftsRestClient.getDataColumnByNameOrCode("length"); // Assert.assertNotNull(foundDataCol); // Assert.assertEquals(foundDataCol.getDataColumnClass(), Double.class); @@ -235,11 +237,12 @@ public class FTSRestClientTest .getSearchableDataColumns(); for (FTSDataColumnI foundCol : searchableCols) { + System.out.println(foundCol.toString()); uniqueSet.add(foundCol); uniqueSet.add(foundCol); } Assert.assertTrue(!uniqueSet.isEmpty()); - Assert.assertEquals(uniqueSet.size(), 30); + Assert.assertEquals(uniqueSet.size(), 22); } @Test(groups = { "Functional" }) diff --git a/test/jalview/fts/service/pdb/PDBFTSPanelTest.java b/test/jalview/fts/service/pdb/PDBFTSPanelTest.java index ac1d304..69792bb 100644 --- a/test/jalview/fts/service/pdb/PDBFTSPanelTest.java +++ b/test/jalview/fts/service/pdb/PDBFTSPanelTest.java @@ -23,8 +23,6 @@ package jalview.fts.service.pdb; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; -import jalview.fts.service.pdb.PDBFTSPanel; - import javax.swing.JInternalFrame; import javax.swing.JTextField; @@ -40,7 +38,7 @@ public class PDBFTSPanelTest { } - @AfterMethod + @AfterMethod(alwaysRun = true) public void tearDown() throws Exception { } diff --git a/test/jalview/fts/service/pdb/PDBFTSRestClientTest.java b/test/jalview/fts/service/pdb/PDBFTSRestClientTest.java index ebc0405..ed248bb 100644 --- a/test/jalview/fts/service/pdb/PDBFTSRestClientTest.java +++ b/test/jalview/fts/service/pdb/PDBFTSRestClientTest.java @@ -59,7 +59,7 @@ public class PDBFTSRestClientTest { } - @AfterMethod + @AfterMethod(alwaysRun = true) public void tearDown() throws Exception { } diff --git a/test/jalview/gui/AlignFrameTest.java b/test/jalview/gui/AlignFrameTest.java new file mode 100644 index 0000000..80e3d5a --- /dev/null +++ b/test/jalview/gui/AlignFrameTest.java @@ -0,0 +1,71 @@ +package jalview.gui; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertTrue; + +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.Sequence; +import jalview.datamodel.SequenceFeature; +import jalview.datamodel.SequenceI; + +import java.util.List; + +import org.testng.annotations.Test; + +public class AlignFrameTest +{ + + @Test + public void testHideFeatureColumns() + { + SequenceI seq1 = new Sequence("Seq1", "ABCDEFGHIJ"); + SequenceI seq2 = new Sequence("Seq2", "ABCDEFGHIJ"); + seq1.addSequenceFeature(new SequenceFeature("Metal", "", 1, 5, + Float.NaN, null)); + seq2.addSequenceFeature(new SequenceFeature("Metal", "", 6, 10, + Float.NaN, null)); + seq1.addSequenceFeature(new SequenceFeature("Turn", "", 2, 4, + Float.NaN, null)); + seq2.addSequenceFeature(new SequenceFeature("Turn", "", 7, 9, + Float.NaN, null)); + AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 }); + AlignFrame af = new AlignFrame(al, al.getWidth(), al.getHeight()); + + /* + * hiding a feature not present does nothing + */ + assertFalse(af.hideFeatureColumns("exon", true)); + assertTrue(af.getViewport().getColumnSelection().isEmpty()); + assertTrue(af.getViewport().getColumnSelection().getHiddenColumns() + .isEmpty()); + assertFalse(af.hideFeatureColumns("exon", false)); + assertTrue(af.getViewport().getColumnSelection().isEmpty()); + assertTrue(af.getViewport().getColumnSelection().getHiddenColumns() + .isEmpty()); + + /* + * hiding a feature in all columns does nothing + */ + assertFalse(af.hideFeatureColumns("Metal", true)); + assertTrue(af.getViewport().getColumnSelection().isEmpty()); + List hidden = af.getViewport().getColumnSelection() + .getHiddenColumns(); + assertTrue(hidden.isEmpty()); + + /* + * hide a feature present in some columns + * sequence positions [2-4], [7-9] are column positions + * [1-3], [6-8] base zero + */ + assertTrue(af.hideFeatureColumns("Turn", true)); + hidden = af.getViewport().getColumnSelection() + .getHiddenColumns(); + assertEquals(2, hidden.size()); + assertEquals(1, hidden.get(0)[0]); + assertEquals(3, hidden.get(0)[1]); + assertEquals(6, hidden.get(1)[0]); + assertEquals(8, hidden.get(1)[1]); + } +} diff --git a/test/jalview/gui/AlignViewportTest.java b/test/jalview/gui/AlignViewportTest.java index b39b2bd..2b72914 100644 --- a/test/jalview/gui/AlignViewportTest.java +++ b/test/jalview/gui/AlignViewportTest.java @@ -36,6 +36,7 @@ import jalview.datamodel.SequenceI; import jalview.io.FileLoader; import jalview.io.FormatAdapter; import jalview.structure.StructureSelectionManager; +import jalview.util.MapList; import java.util.ArrayList; import java.util.List; @@ -76,12 +77,12 @@ public class AlignViewportTest /* * Set up sequence pdb ids */ - PDBEntry pdb1 = new PDBEntry("1ABC", "A", Type.PDB, "1ABC.pdb"); - PDBEntry pdb2 = new PDBEntry("2ABC", "A", Type.PDB, "2ABC.pdb"); - PDBEntry pdb3 = new PDBEntry("3ABC", "A", Type.PDB, "3ABC.pdb"); + PDBEntry pdb1 = new PDBEntry("1ABC", "B", Type.PDB, "1ABC.pdb"); + PDBEntry pdb2 = new PDBEntry("2ABC", "C", Type.PDB, "2ABC.pdb"); + PDBEntry pdb3 = new PDBEntry("3ABC", "D", Type.PDB, "3ABC.pdb"); /* - * seq1 and seq3 refer to 1ABC, seq2 to 2ABC, none to 3ABC + * seq1 and seq3 refer to 1abcB, seq2 to 2abcC, none to 3abcD */ al.getSequenceAt(0).getDatasetSequence() .addPDBId(new PDBEntry("1ABC", "B", Type.PDB, "1ABC.pdb")); @@ -133,8 +134,13 @@ public class AlignViewportTest AlignFrame af1 = new FileLoader().LoadFileWaitTillLoaded( ">Seq1\nCAGT\n", FormatAdapter.PASTE); + SequenceI s1 = af1.getViewport().getAlignment().getSequenceAt(0); AlignedCodonFrame acf1 = new AlignedCodonFrame(); + acf1.addMap(s1, s1, new MapList(new int[] { 1, 4 }, new int[] { 1, 4 }, + 1, 1)); AlignedCodonFrame acf2 = new AlignedCodonFrame(); + acf2.addMap(s1, s1, new MapList(new int[] { 1, 4 }, new int[] { 4, 1 }, + 1, 1)); List mappings = new ArrayList(); mappings.add(acf1); @@ -178,10 +184,20 @@ public class AlignViewportTest ">Seq1\nRSVQ\n", FormatAdapter.PASTE); AlignFrame af2 = new FileLoader().LoadFileWaitTillLoaded( ">Seq2\nDGEL\n", FormatAdapter.PASTE); - + SequenceI cs1 = new Sequence("cseq1", "CCCGGGTTTAAA"); + SequenceI cs2 = new Sequence("cseq2", "CTTGAGTCTAGA"); + SequenceI s1 = af1.getViewport().getAlignment().getSequenceAt(0); + SequenceI s2 = af2.getViewport().getAlignment().getSequenceAt(0); + // need to be distinct AlignedCodonFrame acf1 = new AlignedCodonFrame(); + acf1.addMap(cs1, s1, new MapList(new int[] { 1, 4 }, + new int[] { 1, 12 }, 1, 3)); AlignedCodonFrame acf2 = new AlignedCodonFrame(); + acf2.addMap(cs2, s2, new MapList(new int[] { 1, 4 }, + new int[] { 1, 12 }, 1, 3)); AlignedCodonFrame acf3 = new AlignedCodonFrame(); + acf3.addMap(cs2, cs2, new MapList(new int[] { 1, 12 }, new int[] { 1, + 12 }, 1, 1)); List mappings1 = new ArrayList(); mappings1.add(acf1); @@ -231,10 +247,20 @@ public class AlignViewportTest ">Seq1\nRSVQ\n", FormatAdapter.PASTE); AlignFrame af2 = new FileLoader().LoadFileWaitTillLoaded( ">Seq2\nDGEL\n", FormatAdapter.PASTE); - + SequenceI cs1 = new Sequence("cseq1", "CCCGGGTTTAAA"); + SequenceI cs2 = new Sequence("cseq2", "CTTGAGTCTAGA"); + SequenceI s1 = af1.getViewport().getAlignment().getSequenceAt(0); + SequenceI s2 = af2.getViewport().getAlignment().getSequenceAt(0); + // need to be distinct AlignedCodonFrame acf1 = new AlignedCodonFrame(); + acf1.addMap(cs1, s1, new MapList(new int[] { 1, 4 }, + new int[] { 1, 12 }, 1, 3)); AlignedCodonFrame acf2 = new AlignedCodonFrame(); + acf2.addMap(cs2, s2, new MapList(new int[] { 1, 4 }, + new int[] { 1, 12 }, 1, 3)); AlignedCodonFrame acf3 = new AlignedCodonFrame(); + acf3.addMap(cs2, cs2, new MapList(new int[] { 1, 12 }, new int[] { 1, + 12 }, 1, 1)); List mappings1 = new ArrayList(); mappings1.add(acf1); diff --git a/test/jalview/gui/JAL1353bugdemo.java b/test/jalview/gui/JAL1353bugdemo.java index ff8c179..9d0cedb 100644 --- a/test/jalview/gui/JAL1353bugdemo.java +++ b/test/jalview/gui/JAL1353bugdemo.java @@ -47,7 +47,7 @@ public class JAL1353bugdemo { } - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { } diff --git a/test/jalview/gui/PaintRefresherTest.java b/test/jalview/gui/PaintRefresherTest.java index 52eadcb..212bcce 100644 --- a/test/jalview/gui/PaintRefresherTest.java +++ b/test/jalview/gui/PaintRefresherTest.java @@ -48,7 +48,7 @@ public class PaintRefresherTest PaintRefresher.components.clear(); } - @AfterMethod + @AfterMethod(alwaysRun = true) public void tearDown() { PaintRefresher.components.clear(); diff --git a/test/jalview/gui/StructureChooserTest.java b/test/jalview/gui/StructureChooserTest.java index c2209d6..bad536b 100644 --- a/test/jalview/gui/StructureChooserTest.java +++ b/test/jalview/gui/StructureChooserTest.java @@ -24,6 +24,7 @@ import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import jalview.datamodel.DBRefEntry; +import jalview.datamodel.DBRefSource; import jalview.datamodel.PDBEntry; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; @@ -60,7 +61,7 @@ public class StructureChooserTest seq.setPDBId(pdbIds); } - @AfterMethod + @AfterMethod(alwaysRun = true) public void tearDown() throws Exception { seq = null; @@ -80,6 +81,27 @@ public class StructureChooserTest seq.setDBRefs(null); query = StructureChooser.buildQuery(seq); assertEquals("text:4kqy", query); + + DBRefEntry uniprotDBRef = new DBRefEntry(); + uniprotDBRef.setAccessionId("P12345"); + uniprotDBRef.setSource(DBRefSource.UNIPROT); + seq.addDBRef(uniprotDBRef); + + DBRefEntry pdbDBRef = new DBRefEntry(); + pdbDBRef.setAccessionId("1XYZ"); + pdbDBRef.setSource(DBRefSource.PDB); + seq.addDBRef(pdbDBRef); + + for (int x = 1; x < 5; x++) + { + DBRefEntry dbRef = new DBRefEntry(); + dbRef.setAccessionId("XYZ_" + x); + seq.addDBRef(dbRef); + } + query = StructureChooser.buildQuery(seq); + assertEquals( + "uniprot_accession:P12345 OR uniprot_id:P12345 OR pdb_id:1xyz", + query); } @Test(groups = { "Functional" }) @@ -116,4 +138,22 @@ public class StructureChooserTest assertTrue(sc.getDiscoveredStructuresSet().size() > 0); } + + @Test(groups = { "Functional" }) + public void sanitizeSeqNameTest() + { + String name = "ab_cdEF|fwxyz012349"; + assertEquals(name, StructureChooser.sanitizeSeqName(name)); + + // remove a [nn] substring + name = "abcde12[345]fg"; + assertEquals("abcde12fg", StructureChooser.sanitizeSeqName(name)); + + // remove characters other than a-zA-Z0-9 | or _ + name = "ab[cd],.\t£$*!- \\\"@:e"; + assertEquals("abcde", StructureChooser.sanitizeSeqName(name)); + + name = "abcde12[345a]fg"; + assertEquals("abcde12345afg", StructureChooser.sanitizeSeqName(name)); + } } diff --git a/test/jalview/io/1a70.pdb b/test/jalview/io/1a70.pdb new file mode 100644 index 0000000..1c69a73 --- /dev/null +++ b/test/jalview/io/1a70.pdb @@ -0,0 +1,1146 @@ +HEADER IRON-SULFUR PROTEIN 19-MAR-98 1A70 +TITLE SPINACH FERREDOXIN +COMPND MOL_ID: 1; +COMPND 2 MOLECULE: FERREDOXIN; +COMPND 3 CHAIN: A; +COMPND 4 ENGINEERED: YES; +COMPND 5 MUTATION: YES +SOURCE MOL_ID: 1; +SOURCE 2 ORGANISM_SCIENTIFIC: SPINACIA OLERACEA; +SOURCE 3 ORGANISM_COMMON: SPINACH; +SOURCE 4 ORGANISM_TAXID: 3562; +SOURCE 5 EXPRESSION_SYSTEM: ESCHERICHIA COLI; +SOURCE 6 EXPRESSION_SYSTEM_TAXID: 562 +KEYWDS IRON-SULFUR PROTEIN, PHOTOSYNTHESIS, ELECTRON TRANSPORT +EXPDTA X-RAY DIFFRACTION +AUTHOR C.BINDA,A.CODA,A.MATTEVI,A.ALIVERTI,G.ZANETTI +REVDAT 3 24-FEB-09 1A70 1 VERSN +REVDAT 2 13-JAN-99 1A70 3 ATOM SOURCE COMPND REMARK +REVDAT 2 2 3 HETATM JRNL KEYWDS TER +REVDAT 2 3 3 CONECT +REVDAT 1 25-NOV-98 1A70 0 +JRNL AUTH C.BINDA,A.CODA,A.ALIVERTI,G.ZANETTI,A.MATTEVI +JRNL TITL STRUCTURE OF THE MUTANT E92K OF [2FE-2S] +JRNL TITL 2 FERREDOXIN I FROM SPINACIA OLERACEA AT 1.7 A +JRNL TITL 3 RESOLUTION. +JRNL REF ACTA CRYSTALLOGR.,SECT.D V. 54 1353 1998 +JRNL REFN ISSN 0907-4449 +JRNL PMID 10089511 +JRNL DOI 10.1107/S0907444998005137 +REMARK 1 +REMARK 2 +REMARK 2 RESOLUTION. 1.70 ANGSTROMS. +REMARK 3 +REMARK 3 REFINEMENT. +REMARK 3 PROGRAM : TNT V. 5-D +REMARK 3 AUTHORS : TRONRUD,TEN EYCK,MATTHEWS +REMARK 3 +REMARK 3 DATA USED IN REFINEMENT. +REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 1.70 +REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : 100.00 +REMARK 3 DATA CUTOFF (SIGMA(F)) : 0.000 +REMARK 3 COMPLETENESS FOR RANGE (%) : 97.6 +REMARK 3 NUMBER OF REFLECTIONS : 11755 +REMARK 3 +REMARK 3 USING DATA ABOVE SIGMA CUTOFF. +REMARK 3 CROSS-VALIDATION METHOD : A POSTERIORI +REMARK 3 FREE R VALUE TEST SET SELECTION : EVERY 10TH REFLECTION +REMARK 3 R VALUE (WORKING + TEST SET) : 0.190 +REMARK 3 R VALUE (WORKING SET) : 0.182 +REMARK 3 FREE R VALUE : 0.200 +REMARK 3 FREE R VALUE TEST SET SIZE (%) : 10.000 +REMARK 3 FREE R VALUE TEST SET COUNT : 1090 +REMARK 3 +REMARK 3 USING ALL DATA, NO SIGMA CUTOFF. +REMARK 3 R VALUE (WORKING + TEST SET, NO CUTOFF) : 0.2010 +REMARK 3 R VALUE (WORKING SET, NO CUTOFF) : 0.1960 +REMARK 3 FREE R VALUE (NO CUTOFF) : 0.259 +REMARK 3 FREE R VALUE TEST SET SIZE (%, NO CUTOFF) : 10.00 +REMARK 3 FREE R VALUE TEST SET COUNT (NO CUTOFF) : 1176 +REMARK 3 TOTAL NUMBER OF REFLECTIONS (NO CUTOFF) : 11755 +REMARK 3 +REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT. +REMARK 3 PROTEIN ATOMS : 732 +REMARK 3 NUCLEIC ACID ATOMS : 0 +REMARK 3 HETEROGEN ATOMS : 4 +REMARK 3 SOLVENT ATOMS : 81 +REMARK 3 +REMARK 3 WILSON B VALUE (FROM FCALC, A**2) : 5.100 +REMARK 3 +REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES. RMS WEIGHT COUNT +REMARK 3 BOND LENGTHS (A) : 0.019 ; 70.000; 620 +REMARK 3 BOND ANGLES (DEGREES) : 2.994 ; 90.000; 855 +REMARK 3 TORSION ANGLES (DEGREES) : 18.500; 0.000 ; 300 +REMARK 3 PSEUDOROTATION ANGLES (DEGREES) : NULL ; NULL ; NULL +REMARK 3 TRIGONAL CARBON PLANES (A) : 0.021 ; 70.000; 13 +REMARK 3 GENERAL PLANES (A) : 0.021 ; 240.000; 94 +REMARK 3 ISOTROPIC THERMAL FACTORS (A**2) : 4.300 ; 2.100 ; 620 +REMARK 3 NON-BONDED CONTACTS (A) : 0.039 ; 125.000; 9 +REMARK 3 +REMARK 3 INCORRECT CHIRAL-CENTERS (COUNT) : NULL +REMARK 3 +REMARK 3 BULK SOLVENT MODELING. +REMARK 3 METHOD USED : BABINET SCALING +REMARK 3 KSOL : 0.80 +REMARK 3 BSOL : 150.00 +REMARK 3 +REMARK 3 RESTRAINT LIBRARIES. +REMARK 3 STEREOCHEMISTRY : TNT PROTGEO +REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS : TNT BCORREL V1.0 +REMARK 3 +REMARK 3 OTHER REFINEMENT REMARKS: NULL +REMARK 4 +REMARK 4 1A70 COMPLIES WITH FORMAT V. 3.15, 01-DEC-08 +REMARK 100 +REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY BNL. +REMARK 200 +REMARK 200 EXPERIMENTAL DETAILS +REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION +REMARK 200 DATE OF DATA COLLECTION : JUN-96 +REMARK 200 TEMPERATURE (KELVIN) : 293 +REMARK 200 PH : 7.5 +REMARK 200 NUMBER OF CRYSTALS USED : 1 +REMARK 200 +REMARK 200 SYNCHROTRON (Y/N) : N +REMARK 200 RADIATION SOURCE : ROTATING ANODE +REMARK 200 BEAMLINE : NULL +REMARK 200 X-RAY GENERATOR MODEL : RIGAKU RUH2R +REMARK 200 MONOCHROMATIC OR LAUE (M/L) : M +REMARK 200 WAVELENGTH OR RANGE (A) : 1.5418 +REMARK 200 MONOCHROMATOR : GRAPHITE(002) +REMARK 200 OPTICS : MIRRORS +REMARK 200 +REMARK 200 DETECTOR TYPE : IMAGE PLATE +REMARK 200 DETECTOR MANUFACTURER : MARRESEARCH +REMARK 200 INTENSITY-INTEGRATION SOFTWARE : MOSFLM +REMARK 200 DATA SCALING SOFTWARE : AGROVATA +REMARK 200 +REMARK 200 NUMBER OF UNIQUE REFLECTIONS : 11755 +REMARK 200 RESOLUTION RANGE HIGH (A) : 1.700 +REMARK 200 RESOLUTION RANGE LOW (A) : NULL +REMARK 200 REJECTION CRITERIA (SIGMA(I)) : 2.000 +REMARK 200 +REMARK 200 OVERALL. +REMARK 200 COMPLETENESS FOR RANGE (%) : 97.6 +REMARK 200 DATA REDUNDANCY : 2.500 +REMARK 200 R MERGE (I) : 0.07800 +REMARK 200 R SYM (I) : 0.11200 +REMARK 200 FOR THE DATA SET : 10.0000 +REMARK 200 +REMARK 200 IN THE HIGHEST RESOLUTION SHELL. +REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : 1.70 +REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : 1.80 +REMARK 200 COMPLETENESS FOR SHELL (%) : 68.0 +REMARK 200 DATA REDUNDANCY IN SHELL : 2.50 +REMARK 200 R MERGE FOR SHELL (I) : 0.20200 +REMARK 200 R SYM FOR SHELL (I) : 0.30500 +REMARK 200 FOR SHELL : 2.000 +REMARK 200 +REMARK 200 DIFFRACTION PROTOCOL: NULL +REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MOLECULAR REPLACEMENT +REMARK 200 SOFTWARE USED: AMORE +REMARK 200 STARTING MODEL: PDB ENTRY 1FRR +REMARK 200 +REMARK 200 REMARK: NULL +REMARK 280 +REMARK 280 CRYSTAL +REMARK 280 SOLVENT CONTENT, VS (%): 50.00 +REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 1.50 +REMARK 280 +REMARK 280 CRYSTALLIZATION CONDITIONS: PROTEIN WAS CRYSTALLIZED FROM 2.6M +REMARK 280 AMMONIUM SULPHATE IN 50MM PHOSPHATE BUFFER, PH 7.5 +REMARK 290 +REMARK 290 CRYSTALLOGRAPHIC SYMMETRY +REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 21 21 21 +REMARK 290 +REMARK 290 SYMOP SYMMETRY +REMARK 290 NNNMMM OPERATOR +REMARK 290 1555 X,Y,Z +REMARK 290 2555 -X+1/2,-Y,Z+1/2 +REMARK 290 3555 -X,Y+1/2,-Z+1/2 +REMARK 290 4555 X+1/2,-Y+1/2,-Z +REMARK 290 +REMARK 290 WHERE NNN -> OPERATOR NUMBER +REMARK 290 MMM -> TRANSLATION VECTOR +REMARK 290 +REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS +REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM +REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY +REMARK 290 RELATED MOLECULES. +REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 15.50000 +REMARK 290 SMTRY2 2 0.000000 -1.000000 0.000000 0.00000 +REMARK 290 SMTRY3 2 0.000000 0.000000 1.000000 41.76000 +REMARK 290 SMTRY1 3 -1.000000 0.000000 0.000000 0.00000 +REMARK 290 SMTRY2 3 0.000000 1.000000 0.000000 19.59000 +REMARK 290 SMTRY3 3 0.000000 0.000000 -1.000000 41.76000 +REMARK 290 SMTRY1 4 1.000000 0.000000 0.000000 15.50000 +REMARK 290 SMTRY2 4 0.000000 -1.000000 0.000000 19.59000 +REMARK 290 SMTRY3 4 0.000000 0.000000 -1.000000 0.00000 +REMARK 290 +REMARK 290 REMARK: NULL +REMARK 300 +REMARK 300 BIOMOLECULE: 1 +REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM +REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN +REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON +REMARK 300 BURIED SURFACE AREA. +REMARK 350 +REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN +REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE +REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS +REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND +REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN. +REMARK 350 +REMARK 350 BIOMOLECULE: 1 +REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: MONOMERIC +REMARK 350 APPLY THE FOLLOWING TO CHAINS: A +REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: COVALENT BOND ANGLES +REMARK 500 +REMARK 500 THE STEREOCHEMICAL PARAMETERS OF THE FOLLOWING RESIDUES +REMARK 500 HAVE VALUES WHICH DEVIATE FROM EXPECTED VALUES BY MORE +REMARK 500 THAN 6*RMSD (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN +REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). +REMARK 500 +REMARK 500 STANDARD TABLE: +REMARK 500 FORMAT: (10X,I3,1X,A3,1X,A1,I4,A1,3(1X,A4,2X),12X,F5.1) +REMARK 500 +REMARK 500 EXPECTED VALUES PROTEIN: ENGH AND HUBER, 1999 +REMARK 500 EXPECTED VALUES NUCLEIC ACID: CLOWNEY ET AL 1996 +REMARK 500 +REMARK 500 M RES CSSEQI ATM1 ATM2 ATM3 +REMARK 500 ASP A 20 CB - CG - OD2 ANGL. DEV. = -6.8 DEGREES +REMARK 500 ASP A 34 CB - CG - OD1 ANGL. DEV. = 6.1 DEGREES +REMARK 500 ASP A 34 CB - CG - OD2 ANGL. DEV. = -5.9 DEGREES +REMARK 500 ARG A 40 NE - CZ - NH2 ANGL. DEV. = -4.7 DEGREES +REMARK 500 ASP A 59 CB - CG - OD2 ANGL. DEV. = -5.6 DEGREES +REMARK 500 ASP A 65 CB - CG - OD1 ANGL. DEV. = 5.7 DEGREES +REMARK 500 ASP A 84 CB - CG - OD1 ANGL. DEV. = 12.2 DEGREES +REMARK 500 ASP A 84 CB - CG - OD2 ANGL. DEV. = -14.6 DEGREES +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: TORSION ANGLES +REMARK 500 +REMARK 500 TORSION ANGLES OUTSIDE THE EXPECTED RAMACHANDRAN REGIONS: +REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER; +REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). +REMARK 500 +REMARK 500 STANDARD TABLE: +REMARK 500 FORMAT:(10X,I3,1X,A3,1X,A1,I4,A1,4X,F7.2,3X,F7.2) +REMARK 500 +REMARK 500 EXPECTED VALUES: GJ KLEYWEGT AND TA JONES (1996). PHI/PSI- +REMARK 500 CHOLOGY: RAMACHANDRAN REVISITED. STRUCTURE 4, 1395 - 1400 +REMARK 500 +REMARK 500 M RES CSSEQI PSI PHI +REMARK 500 SER A 38 -77.42 -141.70 +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: CHIRAL CENTERS +REMARK 500 +REMARK 500 UNEXPECTED CONFIGURATION OF THE FOLLOWING CHIRAL +REMARK 500 CENTER(S) USING IMPROPER CA--C--CB--N CHIRALITY +REMARK 500 M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN +REMARK 500 IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE +REMARK 500 +REMARK 500 STANDARD TABLE: +REMARK 500 FORMAT: (11X,I3,1X,A3,1X,A1,I4,A1,6X,F5.1,6X,A1,10X,A1,3X,A16) +REMARK 500 +REMARK 500 M RES CSSEQI IMPROPER EXPECTED FOUND DETAILS +REMARK 500 ALA A 1 115.2 ALPHA-CARBON +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 525 +REMARK 525 SOLVENT +REMARK 525 +REMARK 525 THE SOLVENT MOLECULES HAVE CHAIN IDENTIFIERS THAT +REMARK 525 INDICATE THE POLYMER CHAIN WITH WHICH THEY ARE MOST +REMARK 525 CLOSELY ASSOCIATED. THE REMARK LISTS ALL THE SOLVENT +REMARK 525 MOLECULES WHICH ARE MORE THAN 5A AWAY FROM THE +REMARK 525 NEAREST POLYMER CHAIN (M = MODEL NUMBER; +REMARK 525 RES=RESIDUE NAME; C=CHAIN IDENTIFIER; SSEQ=SEQUENCE +REMARK 525 NUMBER; I=INSERTION CODE): +REMARK 525 +REMARK 525 M RES CSSEQI +REMARK 525 HOH A1653 DISTANCE = 5.18 ANGSTROMS +REMARK 525 HOH A1666 DISTANCE = 5.57 ANGSTROMS +REMARK 525 HOH A1680 DISTANCE = 8.72 ANGSTROMS +REMARK 800 +REMARK 800 SITE +REMARK 800 SITE_IDENTIFIER: AC1 +REMARK 800 EVIDENCE_CODE: SOFTWARE +REMARK 800 SITE_DESCRIPTION: BINDING SITE FOR RESIDUE FES A 1602 +DBREF 1A70 A 1 97 UNP P00221 FER1_SPIOL 51 147 +SEQADV 1A70 LYS A 92 UNP P00221 GLU 142 ENGINEERED +SEQRES 1 A 97 ALA ALA TYR LYS VAL THR LEU VAL THR PRO THR GLY ASN +SEQRES 2 A 97 VAL GLU PHE GLN CYS PRO ASP ASP VAL TYR ILE LEU ASP +SEQRES 3 A 97 ALA ALA GLU GLU GLU GLY ILE ASP LEU PRO TYR SER CYS +SEQRES 4 A 97 ARG ALA GLY SER CYS SER SER CYS ALA GLY LYS LEU LYS +SEQRES 5 A 97 THR GLY SER LEU ASN GLN ASP ASP GLN SER PHE LEU ASP +SEQRES 6 A 97 ASP ASP GLN ILE ASP GLU GLY TRP VAL LEU THR CYS ALA +SEQRES 7 A 97 ALA TYR PRO VAL SER ASP VAL THR ILE GLU THR HIS LYS +SEQRES 8 A 97 LYS GLU GLU LEU THR ALA +HET FES A1602 4 +HETNAM FES FE2/S2 (INORGANIC) CLUSTER +FORMUL 2 FES FE2 S2 +FORMUL 3 HOH *81(H2 O) +HELIX 1 1 ILE A 24 GLU A 30 1 7 +HELIX 2 2 ASP A 66 GLU A 71 1 6 +HELIX 3 3 THR A 76 ALA A 78 5 3 +HELIX 4 4 LYS A 92 GLU A 94 5 3 +SHEET 1 A 5 GLY A 12 PRO A 19 0 +SHEET 2 A 5 ALA A 2 THR A 9 -1 N THR A 9 O GLY A 12 +SHEET 3 A 5 VAL A 85 GLU A 88 1 N VAL A 85 O THR A 6 +SHEET 4 A 5 ALA A 48 THR A 53 -1 N THR A 53 O THR A 86 +SHEET 5 A 5 TRP A 73 LEU A 75 -1 N VAL A 74 O GLY A 49 +LINK FE1 FES A1602 SG CYS A 39 1555 1555 2.32 +LINK FE1 FES A1602 SG CYS A 44 1555 1555 2.28 +LINK FE2 FES A1602 SG CYS A 47 1555 1555 2.36 +LINK FE2 FES A1602 SG CYS A 77 1555 1555 2.27 +SITE 1 AC1 8 SER A 38 CYS A 39 ARG A 40 GLY A 42 +SITE 2 AC1 8 SER A 43 CYS A 44 CYS A 47 CYS A 77 +CRYST1 31.000 39.180 83.520 90.00 90.00 90.00 P 21 21 21 4 +ORIGX1 1.000000 0.000000 0.000000 0.00000 +ORIGX2 0.000000 1.000000 0.000000 0.00000 +ORIGX3 0.000000 0.000000 1.000000 0.00000 +SCALE1 0.032258 0.000000 0.000000 0.00000 +SCALE2 0.000000 0.025523 0.000000 0.00000 +SCALE3 0.000000 0.000000 0.011973 0.00000 +ATOM 1 N ALA A 1 1.578 -4.284 5.235 1.00 64.26 N +ATOM 2 CA ALA A 1 2.384 -5.448 5.549 1.00 56.75 C +ATOM 3 C ALA A 1 3.756 -4.955 5.925 1.00 52.65 C +ATOM 4 O ALA A 1 3.885 -4.610 7.073 1.00 48.15 O +ATOM 5 CB ALA A 1 1.801 -6.118 6.780 1.00 57.60 C +ATOM 6 N ALA A 2 4.702 -4.829 4.989 1.00 44.72 N +ATOM 7 CA ALA A 2 6.033 -4.319 5.297 1.00 39.74 C +ATOM 8 C ALA A 2 6.471 -3.432 4.151 1.00 38.97 C +ATOM 9 O ALA A 2 6.000 -3.558 3.005 1.00 35.65 O +ATOM 10 CB ALA A 2 6.977 -5.471 5.509 1.00 39.07 C +ATOM 11 N TYR A 3 7.381 -2.517 4.408 1.00 35.77 N +ATOM 12 CA TYR A 3 7.706 -1.626 3.320 1.00 34.41 C +ATOM 13 C TYR A 3 9.186 -1.384 3.280 1.00 33.59 C +ATOM 14 O TYR A 3 9.923 -1.779 4.188 1.00 31.95 O +ATOM 15 CB TYR A 3 6.953 -0.249 3.319 1.00 39.83 C +ATOM 16 CG TYR A 3 5.433 -0.309 3.472 1.00 45.38 C +ATOM 17 CD1 TYR A 3 4.627 -0.464 2.343 1.00 44.25 C +ATOM 18 CD2 TYR A 3 4.849 -0.181 4.741 1.00 42.82 C +ATOM 19 CE1 TYR A 3 3.235 -0.498 2.478 1.00 44.87 C +ATOM 20 CE2 TYR A 3 3.455 -0.215 4.877 1.00 31.11 C +ATOM 21 CZ TYR A 3 2.650 -0.374 3.744 1.00 36.82 C +ATOM 22 OH TYR A 3 1.297 -0.407 3.867 1.00 45.94 O +ATOM 23 N LYS A 4 9.588 -0.749 2.216 1.00 25.97 N +ATOM 24 CA LYS A 4 10.996 -0.492 1.999 1.00 26.02 C +ATOM 25 C LYS A 4 11.389 0.887 2.512 1.00 27.15 C +ATOM 26 O LYS A 4 10.856 1.920 2.077 1.00 29.78 O +ATOM 27 CB LYS A 4 11.330 -0.599 0.521 1.00 28.74 C +ATOM 28 CG LYS A 4 12.767 -0.182 0.231 1.00 41.18 C +ATOM 29 CD LYS A 4 13.579 -1.258 -0.483 1.00 65.99 C +ATOM 30 CE LYS A 4 13.898 -2.462 0.403 1.00 71.21 C +ATOM 31 NZ LYS A 4 15.116 -3.169 -0.011 1.00100.00 N +ATOM 32 N VAL A 5 12.331 0.863 3.439 1.00 25.81 N +ATOM 33 CA VAL A 5 12.856 2.091 4.022 1.00 21.97 C +ATOM 34 C VAL A 5 14.205 2.397 3.480 1.00 24.32 C +ATOM 35 O VAL A 5 15.049 1.515 3.638 1.00 28.20 O +ATOM 36 CB VAL A 5 12.952 2.019 5.546 1.00 26.13 C +ATOM 37 CG1 VAL A 5 13.589 3.279 6.154 1.00 24.03 C +ATOM 38 CG2 VAL A 5 11.587 1.886 6.220 1.00 28.00 C +ATOM 39 N THR A 6 14.446 3.585 2.881 1.00 23.42 N +ATOM 40 CA THR A 6 15.819 3.958 2.510 1.00 22.77 C +ATOM 41 C THR A 6 16.295 5.055 3.506 1.00 27.61 C +ATOM 42 O THR A 6 15.661 6.102 3.654 1.00 28.00 O +ATOM 43 CB THR A 6 15.821 4.529 1.094 1.00 26.23 C +ATOM 44 OG1 THR A 6 15.370 3.515 0.217 1.00 27.15 O +ATOM 45 CG2 THR A 6 17.230 4.964 0.813 1.00 27.17 C +ATOM 46 N LEU A 7 17.379 4.897 4.238 1.00 20.82 N +ATOM 47 CA LEU A 7 17.815 5.979 5.096 1.00 18.17 C +ATOM 48 C LEU A 7 19.102 6.537 4.478 1.00 26.80 C +ATOM 49 O LEU A 7 20.054 5.815 4.166 1.00 31.28 O +ATOM 50 CB LEU A 7 18.204 5.474 6.533 1.00 24.27 C +ATOM 51 CG LEU A 7 17.064 4.808 7.373 1.00 25.99 C +ATOM 52 CD1 LEU A 7 17.597 4.132 8.670 1.00 28.24 C +ATOM 53 CD2 LEU A 7 15.847 5.760 7.582 1.00 23.18 C +ATOM 54 N VAL A 8 19.178 7.825 4.390 1.00 24.64 N +ATOM 55 CA VAL A 8 20.351 8.582 3.937 1.00 24.53 C +ATOM 56 C VAL A 8 21.067 9.037 5.189 1.00 25.60 C +ATOM 57 O VAL A 8 20.609 10.034 5.788 1.00 24.85 O +ATOM 58 CB VAL A 8 19.949 9.817 3.074 1.00 26.13 C +ATOM 59 CG1 VAL A 8 21.154 10.667 2.669 1.00 26.51 C +ATOM 60 CG2 VAL A 8 19.153 9.301 1.862 1.00 23.87 C +ATOM 61 N THR A 9 22.132 8.282 5.580 1.00 23.15 N +ATOM 62 CA THR A 9 22.863 8.664 6.790 1.00 23.40 C +ATOM 63 C THR A 9 24.173 9.314 6.438 1.00 33.13 C +ATOM 64 O THR A 9 24.654 9.241 5.303 1.00 31.04 O +ATOM 65 CB THR A 9 23.218 7.469 7.641 1.00 29.07 C +ATOM 66 OG1 THR A 9 24.437 6.916 7.123 1.00 34.25 O +ATOM 67 CG2 THR A 9 22.097 6.424 7.576 1.00 23.85 C +ATOM 68 N PRO A 10 24.773 9.907 7.443 1.00 32.74 N +ATOM 69 CA PRO A 10 26.012 10.626 7.192 1.00 40.21 C +ATOM 70 C PRO A 10 27.145 9.843 6.552 1.00 39.02 C +ATOM 71 O PRO A 10 27.994 10.367 5.811 1.00 40.41 O +ATOM 72 CB PRO A 10 26.365 11.354 8.512 1.00 40.85 C +ATOM 73 CG PRO A 10 25.100 11.360 9.383 1.00 38.81 C +ATOM 74 CD PRO A 10 24.169 10.310 8.772 1.00 29.25 C +ATOM 75 N THR A 11 27.149 8.583 6.860 1.00 29.69 N +ATOM 76 CA THR A 11 28.191 7.741 6.370 1.00 31.68 C +ATOM 77 C THR A 11 27.680 6.836 5.253 1.00 40.26 C +ATOM 78 O THR A 11 28.315 5.815 4.937 1.00 32.78 O +ATOM 79 CB THR A 11 28.745 6.892 7.546 1.00 35.16 C +ATOM 80 OG1 THR A 11 27.737 6.011 8.077 1.00 41.86 O +ATOM 81 CG2 THR A 11 29.280 7.785 8.637 1.00 34.63 C +ATOM 82 N GLY A 12 26.479 7.095 4.715 1.00 29.29 N +ATOM 83 CA GLY A 12 26.019 6.151 3.680 1.00 27.67 C +ATOM 84 C GLY A 12 24.548 5.765 3.657 1.00 31.61 C +ATOM 85 O GLY A 12 23.861 5.746 4.657 1.00 27.16 O +ATOM 86 N ASN A 13 24.028 5.411 2.492 1.00 27.49 N +ATOM 87 CA ASN A 13 22.641 4.967 2.352 1.00 28.15 C +ATOM 88 C ASN A 13 22.472 3.508 2.820 1.00 34.35 C +ATOM 89 O ASN A 13 23.261 2.592 2.523 1.00 34.29 O +ATOM 90 CB ASN A 13 22.229 5.041 0.859 1.00 22.27 C +ATOM 91 CG ASN A 13 22.215 6.448 0.279 1.00 28.56 C +ATOM 92 OD1 ASN A 13 22.151 7.484 0.966 1.00 29.38 O +ATOM 93 ND2 ASN A 13 22.260 6.532 -1.054 1.00 29.02 N +ATOM 94 N VAL A 14 21.376 3.154 3.448 1.00 24.93 N +ATOM 95 CA VAL A 14 21.199 1.768 3.845 1.00 24.17 C +ATOM 96 C VAL A 14 19.689 1.494 3.624 1.00 35.26 C +ATOM 97 O VAL A 14 18.847 2.366 3.880 1.00 34.14 O +ATOM 98 CB VAL A 14 21.457 1.553 5.350 1.00 35.72 C +ATOM 99 CG1 VAL A 14 22.781 2.158 5.819 1.00 45.19 C +ATOM 100 CG2 VAL A 14 20.379 2.191 6.228 1.00 37.45 C +ATOM 101 N GLU A 15 19.318 0.319 3.133 1.00 25.56 N +ATOM 102 CA GLU A 15 17.873 -0.022 2.949 1.00 24.81 C +ATOM 103 C GLU A 15 17.513 -1.257 3.780 1.00 28.51 C +ATOM 104 O GLU A 15 18.367 -2.054 4.152 1.00 39.92 O +ATOM 105 CB GLU A 15 17.528 -0.396 1.499 1.00 26.55 C +ATOM 106 CG GLU A 15 18.058 0.554 0.428 1.00 76.87 C +ATOM 107 CD GLU A 15 17.768 0.033 -0.987 1.00100.00 C +ATOM 108 OE1 GLU A 15 17.197 -1.116 -1.149 1.00 68.35 O +ATOM 109 OE2 GLU A 15 18.097 0.737 -2.014 1.00100.00 O +ATOM 110 N PHE A 16 16.247 -1.431 4.065 1.00 26.52 N +ATOM 111 CA PHE A 16 15.777 -2.608 4.823 1.00 28.30 C +ATOM 112 C PHE A 16 14.244 -2.584 4.803 1.00 33.00 C +ATOM 113 O PHE A 16 13.635 -1.520 4.649 1.00 30.39 O +ATOM 114 CB PHE A 16 16.306 -2.569 6.266 1.00 32.53 C +ATOM 115 CG PHE A 16 15.886 -1.332 7.078 1.00 25.02 C +ATOM 116 CD1 PHE A 16 14.640 -1.297 7.723 1.00 32.70 C +ATOM 117 CD2 PHE A 16 16.753 -0.235 7.192 1.00 28.27 C +ATOM 118 CE1 PHE A 16 14.269 -0.176 8.481 1.00 33.73 C +ATOM 119 CE2 PHE A 16 16.383 0.883 7.952 1.00 30.83 C +ATOM 120 CZ PHE A 16 15.142 0.913 8.597 1.00 28.38 C +ATOM 121 N GLN A 17 13.645 -3.759 4.941 1.00 35.55 N +ATOM 122 CA GLN A 17 12.164 -3.892 4.941 1.00 33.09 C +ATOM 123 C GLN A 17 11.622 -3.664 6.368 1.00 36.52 C +ATOM 124 O GLN A 17 12.161 -4.187 7.348 1.00 34.16 O +ATOM 125 CB GLN A 17 11.745 -5.297 4.473 1.00 40.84 C +ATOM 126 CG GLN A 17 12.118 -5.610 3.015 1.00 75.19 C +ATOM 127 CD GLN A 17 11.176 -5.056 1.937 1.00100.00 C +ATOM 128 OE1 GLN A 17 10.033 -5.500 1.819 1.00 91.53 O +ATOM 129 NE2 GLN A 17 11.600 -4.099 1.131 1.00 56.40 N +ATOM 130 N CYS A 18 10.541 -2.882 6.483 1.00 32.45 N +ATOM 131 CA CYS A 18 9.949 -2.554 7.813 1.00 34.72 C +ATOM 132 C CYS A 18 8.464 -2.778 7.839 1.00 34.29 C +ATOM 133 O CYS A 18 7.700 -2.208 7.075 1.00 31.05 O +ATOM 134 CB CYS A 18 10.249 -1.090 8.161 1.00 29.02 C +ATOM 135 SG CYS A 18 9.658 -0.587 9.853 1.00 28.94 S +ATOM 136 N PRO A 19 8.085 -3.629 8.787 1.00 33.32 N +ATOM 137 CA PRO A 19 6.690 -3.963 9.026 1.00 32.10 C +ATOM 138 C PRO A 19 6.006 -2.702 9.499 1.00 40.78 C +ATOM 139 O PRO A 19 6.592 -1.893 10.222 1.00 36.47 O +ATOM 140 CB PRO A 19 6.661 -5.023 10.134 1.00 34.58 C +ATOM 141 CG PRO A 19 8.108 -5.439 10.360 1.00 38.47 C +ATOM 142 CD PRO A 19 9.005 -4.461 9.587 1.00 36.38 C +ATOM 143 N ASP A 20 4.761 -2.545 9.044 1.00 34.47 N +ATOM 144 CA ASP A 20 3.939 -1.390 9.316 1.00 33.10 C +ATOM 145 C ASP A 20 3.594 -1.249 10.782 1.00 37.33 C +ATOM 146 O ASP A 20 3.007 -0.234 11.167 1.00 33.51 O +ATOM 147 CB ASP A 20 2.776 -1.182 8.329 1.00 44.18 C +ATOM 148 CG ASP A 20 1.663 -2.172 8.473 1.00 58.88 C +ATOM 149 OD1 ASP A 20 1.737 -3.155 9.206 1.00 56.81 O +ATOM 150 OD2 ASP A 20 0.598 -1.806 7.784 1.00 79.64 O +ATOM 151 N ASP A 21 3.977 -2.293 11.543 1.00 35.64 N +ATOM 152 CA ASP A 21 3.728 -2.237 12.962 1.00 40.82 C +ATOM 153 C ASP A 21 4.983 -2.105 13.764 1.00 45.13 C +ATOM 154 O ASP A 21 4.965 -2.495 14.923 1.00 45.86 O +ATOM 155 CB ASP A 21 2.706 -3.233 13.568 1.00 39.20 C +ATOM 156 CG ASP A 21 3.075 -4.710 13.573 1.00 64.17 C +ATOM 157 OD1 ASP A 21 4.036 -5.157 12.965 1.00 61.46 O +ATOM 158 OD2 ASP A 21 2.230 -5.476 14.256 1.00 79.00 O +ATOM 159 N VAL A 22 6.067 -1.601 13.191 1.00 30.02 N +ATOM 160 CA VAL A 22 7.303 -1.467 13.989 1.00 23.17 C +ATOM 161 C VAL A 22 7.875 -0.083 13.703 1.00 37.42 C +ATOM 162 O VAL A 22 7.841 0.425 12.545 1.00 29.14 O +ATOM 163 CB VAL A 22 8.279 -2.554 13.524 1.00 35.95 C +ATOM 164 CG1 VAL A 22 9.671 -2.333 14.072 1.00 33.42 C +ATOM 165 CG2 VAL A 22 7.790 -3.977 13.845 1.00 40.60 C +ATOM 166 N TYR A 23 8.319 0.603 14.747 1.00 31.07 N +ATOM 167 CA TYR A 23 8.868 1.922 14.526 1.00 23.20 C +ATOM 168 C TYR A 23 10.146 1.813 13.697 1.00 20.53 C +ATOM 169 O TYR A 23 10.967 0.886 13.815 1.00 22.64 O +ATOM 170 CB TYR A 23 9.207 2.601 15.864 1.00 24.89 C +ATOM 171 CG TYR A 23 8.048 2.917 16.813 1.00 29.11 C +ATOM 172 CD1 TYR A 23 6.967 3.710 16.422 1.00 25.37 C +ATOM 173 CD2 TYR A 23 8.087 2.419 18.126 1.00 29.47 C +ATOM 174 CE1 TYR A 23 5.959 3.981 17.342 1.00 33.05 C +ATOM 175 CE2 TYR A 23 7.167 2.794 19.097 1.00 27.42 C +ATOM 176 CZ TYR A 23 6.100 3.579 18.677 1.00 29.98 C +ATOM 177 OH TYR A 23 5.135 3.895 19.566 1.00 32.49 O +ATOM 178 N ILE A 24 10.358 2.857 12.891 1.00 26.63 N +ATOM 179 CA ILE A 24 11.544 3.002 12.045 1.00 23.62 C +ATOM 180 C ILE A 24 12.848 2.723 12.839 1.00 27.47 C +ATOM 181 O ILE A 24 13.721 1.942 12.446 1.00 25.11 O +ATOM 182 CB ILE A 24 11.530 4.355 11.265 1.00 27.34 C +ATOM 183 CG1 ILE A 24 10.308 4.326 10.338 1.00 27.39 C +ATOM 184 CG2 ILE A 24 12.839 4.618 10.484 1.00 25.71 C +ATOM 185 CD1 ILE A 24 10.409 5.326 9.248 1.00 35.33 C +ATOM 186 N LEU A 25 13.016 3.398 13.982 1.00 21.68 N +ATOM 187 CA LEU A 25 14.226 3.232 14.751 1.00 23.19 C +ATOM 188 C LEU A 25 14.494 1.805 15.152 1.00 19.67 C +ATOM 189 O LEU A 25 15.622 1.287 15.036 1.00 21.97 O +ATOM 190 CB LEU A 25 14.214 4.251 15.971 1.00 25.03 C +ATOM 191 CG LEU A 25 15.399 4.134 16.985 1.00 33.85 C +ATOM 192 CD1 LEU A 25 16.767 4.626 16.432 1.00 28.22 C +ATOM 193 CD2 LEU A 25 15.003 4.794 18.321 1.00 23.35 C +ATOM 194 N ASP A 26 13.445 1.170 15.740 1.00 21.80 N +ATOM 195 CA ASP A 26 13.567 -0.238 16.197 1.00 24.22 C +ATOM 196 C ASP A 26 13.968 -1.184 15.076 1.00 28.12 C +ATOM 197 O ASP A 26 14.887 -2.035 15.191 1.00 26.29 O +ATOM 198 CB ASP A 26 12.229 -0.815 16.715 1.00 26.64 C +ATOM 199 CG ASP A 26 11.713 -0.170 18.009 1.00 37.98 C +ATOM 200 OD1 ASP A 26 12.168 0.845 18.458 1.00 46.55 O +ATOM 201 OD2 ASP A 26 10.581 -0.638 18.464 1.00 44.33 O +ATOM 202 N ALA A 27 13.266 -0.995 13.938 1.00 28.45 N +ATOM 203 CA ALA A 27 13.559 -1.804 12.709 1.00 30.31 C +ATOM 204 C ALA A 27 15.013 -1.637 12.266 1.00 24.55 C +ATOM 205 O ALA A 27 15.704 -2.620 11.990 1.00 26.78 O +ATOM 206 CB ALA A 27 12.584 -1.510 11.550 1.00 27.80 C +ATOM 207 N ALA A 28 15.467 -0.370 12.227 1.00 21.71 N +ATOM 208 CA ALA A 28 16.844 -0.113 11.872 1.00 22.96 C +ATOM 209 C ALA A 28 17.837 -0.801 12.830 1.00 31.14 C +ATOM 210 O ALA A 28 18.866 -1.394 12.440 1.00 29.37 O +ATOM 211 CB ALA A 28 17.190 1.365 11.769 1.00 30.64 C +ATOM 212 N GLU A 29 17.519 -0.733 14.138 1.00 32.57 N +ATOM 213 CA GLU A 29 18.383 -1.339 15.157 1.00 33.34 C +ATOM 214 C GLU A 29 18.598 -2.824 14.926 1.00 23.91 C +ATOM 215 O GLU A 29 19.748 -3.285 14.959 1.00 29.83 O +ATOM 216 CB GLU A 29 17.921 -0.963 16.602 1.00 25.60 C +ATOM 217 CG GLU A 29 18.305 0.502 16.913 1.00 24.44 C +ATOM 218 CD GLU A 29 17.457 1.018 18.046 1.00 25.19 C +ATOM 219 OE1 GLU A 29 16.460 0.426 18.438 1.00 24.78 O +ATOM 220 OE2 GLU A 29 17.923 2.098 18.586 1.00 23.81 O +ATOM 221 N GLU A 30 17.448 -3.455 14.709 1.00 27.47 N +ATOM 222 CA GLU A 30 17.286 -4.882 14.380 1.00 37.83 C +ATOM 223 C GLU A 30 18.140 -5.359 13.188 1.00 40.11 C +ATOM 224 O GLU A 30 18.573 -6.495 13.120 1.00 39.63 O +ATOM 225 CB GLU A 30 15.794 -5.252 14.170 1.00 40.07 C +ATOM 226 CG GLU A 30 14.957 -5.155 15.458 1.00 42.44 C +ATOM 227 CD GLU A 30 13.539 -5.612 15.275 1.00 56.36 C +ATOM 228 OE1 GLU A 30 13.164 -6.260 14.314 1.00 50.54 O +ATOM 229 OE2 GLU A 30 12.725 -5.114 16.174 1.00 36.99 O +ATOM 230 N GLU A 31 18.344 -4.473 12.222 1.00 38.32 N +ATOM 231 CA GLU A 31 19.177 -4.703 11.071 1.00 35.60 C +ATOM 232 C GLU A 31 20.646 -4.398 11.378 1.00 52.16 C +ATOM 233 O GLU A 31 21.518 -4.562 10.510 1.00 49.05 O +ATOM 234 CB GLU A 31 18.620 -3.894 9.866 1.00 32.36 C +ATOM 235 CG GLU A 31 17.343 -4.552 9.270 1.00 42.97 C +ATOM 236 CD GLU A 31 17.511 -6.010 8.860 1.00 67.41 C +ATOM 237 OE1 GLU A 31 18.482 -6.441 8.262 1.00 80.04 O +ATOM 238 OE2 GLU A 31 16.571 -6.805 9.318 1.00 80.93 O +ATOM 239 N GLY A 32 20.934 -3.911 12.608 1.00 36.45 N +ATOM 240 CA GLY A 32 22.297 -3.587 13.006 1.00 31.78 C +ATOM 241 C GLY A 32 22.778 -2.203 12.703 1.00 31.69 C +ATOM 242 O GLY A 32 23.972 -1.976 12.642 1.00 34.57 O +ATOM 243 N ILE A 33 21.850 -1.251 12.501 1.00 35.35 N +ATOM 244 CA ILE A 33 22.177 0.144 12.177 1.00 28.42 C +ATOM 245 C ILE A 33 22.256 1.009 13.444 1.00 33.98 C +ATOM 246 O ILE A 33 21.378 0.942 14.287 1.00 32.45 O +ATOM 247 CB ILE A 33 21.135 0.765 11.251 1.00 31.00 C +ATOM 248 CG1 ILE A 33 20.902 -0.025 9.950 1.00 47.25 C +ATOM 249 CG2 ILE A 33 21.426 2.216 10.846 1.00 27.16 C +ATOM 250 CD1 ILE A 33 19.920 0.766 9.061 1.00 51.98 C +ATOM 251 N ASP A 34 23.258 1.860 13.579 1.00 31.29 N +ATOM 252 CA ASP A 34 23.303 2.712 14.757 1.00 34.35 C +ATOM 253 C ASP A 34 22.744 4.100 14.464 1.00 43.06 C +ATOM 254 O ASP A 34 23.349 4.874 13.724 1.00 33.14 O +ATOM 255 CB ASP A 34 24.761 2.854 15.196 1.00 38.16 C +ATOM 256 CG ASP A 34 24.920 3.628 16.465 1.00 60.77 C +ATOM 257 OD1 ASP A 34 24.013 4.180 17.048 1.00 67.71 O +ATOM 258 OD2 ASP A 34 26.160 3.670 16.870 1.00100.00 O +ATOM 259 N LEU A 35 21.606 4.432 15.063 1.00 25.84 N +ATOM 260 CA LEU A 35 20.982 5.725 14.886 1.00 25.49 C +ATOM 261 C LEU A 35 20.972 6.503 16.230 1.00 30.02 C +ATOM 262 O LEU A 35 20.894 5.970 17.324 1.00 30.20 O +ATOM 263 CB LEU A 35 19.524 5.626 14.330 1.00 29.86 C +ATOM 264 CG LEU A 35 19.326 4.995 12.913 1.00 34.99 C +ATOM 265 CD1 LEU A 35 17.826 5.101 12.508 1.00 25.92 C +ATOM 266 CD2 LEU A 35 20.204 5.766 11.885 1.00 28.46 C +ATOM 267 N PRO A 36 20.991 7.774 16.189 1.00 24.98 N +ATOM 268 CA PRO A 36 20.915 8.450 17.496 1.00 27.92 C +ATOM 269 C PRO A 36 19.519 8.369 18.150 1.00 34.05 C +ATOM 270 O PRO A 36 18.406 8.438 17.518 1.00 24.43 O +ATOM 271 CB PRO A 36 21.187 9.939 17.172 1.00 25.14 C +ATOM 272 CG PRO A 36 21.223 10.101 15.644 1.00 33.38 C +ATOM 273 CD PRO A 36 21.123 8.723 15.027 1.00 27.27 C +ATOM 274 N TYR A 37 19.578 8.381 19.481 1.00 24.54 N +ATOM 275 CA TYR A 37 18.347 8.494 20.237 1.00 24.90 C +ATOM 276 C TYR A 37 18.650 8.899 21.687 1.00 44.09 C +ATOM 277 O TYR A 37 19.790 8.838 22.140 1.00 28.24 O +ATOM 278 CB TYR A 37 17.491 7.256 20.362 1.00 18.81 C +ATOM 279 CG TYR A 37 18.233 6.159 21.122 1.00 24.63 C +ATOM 280 CD1 TYR A 37 19.137 5.311 20.464 1.00 26.04 C +ATOM 281 CD2 TYR A 37 18.018 5.944 22.486 1.00 29.97 C +ATOM 282 CE1 TYR A 37 19.817 4.294 21.132 1.00 30.23 C +ATOM 283 CE2 TYR A 37 18.673 4.912 23.167 1.00 24.88 C +ATOM 284 CZ TYR A 37 19.581 4.091 22.501 1.00 30.95 C +ATOM 285 OH TYR A 37 20.213 3.062 23.175 1.00 38.22 O +ATOM 286 N SER A 38 17.595 9.277 22.418 1.00 29.18 N +ATOM 287 CA SER A 38 17.725 9.558 23.845 1.00 32.26 C +ATOM 288 C SER A 38 16.490 9.055 24.659 1.00 25.30 C +ATOM 289 O SER A 38 16.606 7.975 25.282 1.00 25.32 O +ATOM 290 CB SER A 38 18.302 10.927 24.200 1.00 22.00 C +ATOM 291 OG SER A 38 17.293 11.869 24.016 1.00 33.52 O +ATOM 292 N CYS A 39 15.380 9.816 24.591 1.00 23.71 N +ATOM 293 CA CYS A 39 14.183 9.490 25.362 1.00 26.55 C +ATOM 294 C CYS A 39 13.438 8.285 24.842 1.00 34.48 C +ATOM 295 O CYS A 39 12.786 7.587 25.618 1.00 26.18 O +ATOM 296 CB CYS A 39 13.199 10.697 25.491 1.00 29.83 C +ATOM 297 SG CYS A 39 12.242 11.025 23.939 1.00 29.79 S +ATOM 298 N ARG A 40 13.487 8.054 23.495 1.00 24.58 N +ATOM 299 CA ARG A 40 12.723 6.913 22.913 1.00 28.18 C +ATOM 300 C ARG A 40 11.205 7.064 23.170 1.00 30.09 C +ATOM 301 O ARG A 40 10.487 6.085 23.025 1.00 31.35 O +ATOM 302 CB ARG A 40 13.215 5.463 23.156 1.00 26.06 C +ATOM 303 CG ARG A 40 14.725 5.291 22.954 1.00 26.48 C +ATOM 304 CD ARG A 40 15.197 3.855 23.177 1.00 29.25 C +ATOM 305 NE ARG A 40 14.665 2.882 22.173 1.00 29.50 N +ATOM 306 CZ ARG A 40 15.384 2.358 21.164 1.00 24.32 C +ATOM 307 NH1 ARG A 40 16.675 2.663 20.962 1.00 22.08 N +ATOM 308 NH2 ARG A 40 14.730 1.522 20.369 1.00 24.44 N +ATOM 309 N ALA A 41 10.703 8.251 23.551 1.00 30.98 N +ATOM 310 CA ALA A 41 9.258 8.340 23.833 1.00 35.10 C +ATOM 311 C ALA A 41 8.586 9.429 23.005 1.00 32.60 C +ATOM 312 O ALA A 41 7.617 9.978 23.480 1.00 33.61 O +ATOM 313 CB ALA A 41 9.061 8.685 25.305 1.00 32.00 C +ATOM 314 N GLY A 42 9.184 9.924 21.887 1.00 37.71 N +ATOM 315 CA GLY A 42 8.569 11.038 21.100 1.00 32.94 C +ATOM 316 C GLY A 42 8.463 12.452 21.726 1.00 33.79 C +ATOM 317 O GLY A 42 7.614 13.321 21.347 1.00 27.19 O +ATOM 318 N SER A 43 9.383 12.734 22.670 1.00 29.21 N +ATOM 319 CA SER A 43 9.217 14.009 23.222 1.00 27.72 C +ATOM 320 C SER A 43 10.468 14.838 23.104 1.00 36.35 C +ATOM 321 O SER A 43 10.575 15.886 23.772 1.00 37.69 O +ATOM 322 CB SER A 43 8.702 13.848 24.657 1.00 41.18 C +ATOM 323 OG SER A 43 9.762 13.391 25.438 1.00 37.35 O +ATOM 324 N CYS A 44 11.424 14.383 22.281 1.00 24.01 N +ATOM 325 CA CYS A 44 12.645 15.163 22.186 1.00 26.72 C +ATOM 326 C CYS A 44 13.177 15.352 20.744 1.00 34.67 C +ATOM 327 O CYS A 44 12.489 14.868 19.850 1.00 30.25 O +ATOM 328 CB CYS A 44 13.745 14.604 23.122 1.00 22.69 C +ATOM 329 SG CYS A 44 14.770 13.299 22.485 1.00 24.81 S +ATOM 330 N SER A 45 14.308 16.078 20.499 1.00 24.73 N +ATOM 331 CA SER A 45 14.777 16.268 19.112 1.00 26.39 C +ATOM 332 C SER A 45 15.868 15.266 18.722 1.00 30.37 C +ATOM 333 O SER A 45 16.412 15.218 17.615 1.00 28.25 O +ATOM 334 CB SER A 45 15.275 17.674 18.949 1.00 27.38 C +ATOM 335 OG SER A 45 16.431 17.813 19.806 1.00 29.38 O +ATOM 336 N SER A 46 16.301 14.457 19.674 1.00 21.91 N +ATOM 337 CA SER A 46 17.426 13.616 19.381 1.00 21.12 C +ATOM 338 C SER A 46 17.353 12.724 18.144 1.00 25.42 C +ATOM 339 O SER A 46 18.410 12.471 17.586 1.00 26.31 O +ATOM 340 CB SER A 46 17.834 12.702 20.561 1.00 28.46 C +ATOM 341 OG SER A 46 18.253 13.537 21.616 1.00 36.10 O +ATOM 342 N CYS A 47 16.247 12.026 17.904 1.00 21.93 N +ATOM 343 CA CYS A 47 16.202 11.056 16.827 1.00 21.80 C +ATOM 344 C CYS A 47 15.649 11.698 15.536 1.00 21.02 C +ATOM 345 O CYS A 47 15.149 10.997 14.648 1.00 23.37 O +ATOM 346 CB CYS A 47 15.227 9.940 17.245 1.00 20.46 C +ATOM 347 SG CYS A 47 13.560 10.572 17.479 1.00 24.27 S +ATOM 348 N ALA A 48 15.664 12.998 15.481 1.00 23.57 N +ATOM 349 CA ALA A 48 15.062 13.721 14.300 1.00 27.12 C +ATOM 350 C ALA A 48 15.728 13.356 12.956 1.00 23.33 C +ATOM 351 O ALA A 48 16.985 13.288 12.810 1.00 22.29 O +ATOM 352 CB ALA A 48 15.001 15.246 14.459 1.00 23.21 C +ATOM 353 N GLY A 49 14.841 13.313 11.994 1.00 26.74 N +ATOM 354 CA GLY A 49 15.186 13.132 10.580 1.00 29.02 C +ATOM 355 C GLY A 49 14.265 14.081 9.719 1.00 28.23 C +ATOM 356 O GLY A 49 13.303 14.752 10.210 1.00 20.19 O +ATOM 357 N LYS A 50 14.518 14.061 8.367 1.00 22.94 N +ATOM 358 CA LYS A 50 13.710 14.863 7.373 1.00 21.93 C +ATOM 359 C LYS A 50 13.181 13.817 6.316 1.00 27.46 C +ATOM 360 O LYS A 50 13.986 13.010 5.743 1.00 22.40 O +ATOM 361 CB LYS A 50 14.564 15.966 6.685 1.00 22.08 C +ATOM 362 CG LYS A 50 14.605 17.254 7.500 1.00 70.03 C +ATOM 363 CD LYS A 50 13.535 18.294 7.153 1.00 70.65 C +ATOM 364 CE LYS A 50 14.198 19.537 6.556 1.00 95.81 C +ATOM 365 NZ LYS A 50 13.315 20.498 5.873 1.00100.00 N +ATOM 366 N LEU A 51 11.843 13.756 6.190 1.00 23.93 N +ATOM 367 CA LEU A 51 11.182 12.820 5.242 1.00 22.04 C +ATOM 368 C LEU A 51 11.343 13.464 3.811 1.00 26.89 C +ATOM 369 O LEU A 51 11.019 14.617 3.489 1.00 26.02 O +ATOM 370 CB LEU A 51 9.711 12.786 5.619 1.00 23.42 C +ATOM 371 CG LEU A 51 8.853 12.151 4.557 1.00 26.07 C +ATOM 372 CD1 LEU A 51 9.040 10.663 4.609 1.00 32.32 C +ATOM 373 CD2 LEU A 51 7.389 12.360 4.843 1.00 35.33 C +ATOM 374 N LYS A 52 11.980 12.719 2.963 1.00 24.44 N +ATOM 375 CA LYS A 52 12.215 13.149 1.602 1.00 23.16 C +ATOM 376 C LYS A 52 11.098 12.677 0.642 1.00 30.50 C +ATOM 377 O LYS A 52 10.510 13.473 -0.152 1.00 32.15 O +ATOM 378 CB LYS A 52 13.547 12.573 1.200 1.00 24.68 C +ATOM 379 CG LYS A 52 14.590 13.069 2.203 1.00 61.41 C +ATOM 380 CD LYS A 52 14.704 14.575 2.120 1.00 88.91 C +ATOM 381 CE LYS A 52 15.163 15.276 3.378 1.00 99.36 C +ATOM 382 NZ LYS A 52 15.668 16.630 3.069 1.00100.00 N +ATOM 383 N THR A 53 10.723 11.429 0.796 1.00 22.25 N +ATOM 384 CA THR A 53 9.693 10.822 -0.062 1.00 24.34 C +ATOM 385 C THR A 53 8.818 9.802 0.661 1.00 27.89 C +ATOM 386 O THR A 53 9.369 8.972 1.390 1.00 28.95 O +ATOM 387 CB THR A 53 10.434 9.920 -1.104 1.00 31.58 C +ATOM 388 OG1 THR A 53 11.485 10.615 -1.745 1.00 36.65 O +ATOM 389 CG2 THR A 53 9.392 9.465 -2.097 1.00 28.92 C +ATOM 390 N GLY A 54 7.520 9.785 0.437 1.00 23.82 N +ATOM 391 CA GLY A 54 6.697 8.779 1.103 1.00 22.96 C +ATOM 392 C GLY A 54 5.747 9.381 2.211 1.00 21.97 C +ATOM 393 O GLY A 54 5.664 10.588 2.423 1.00 25.52 O +ATOM 394 N SER A 55 5.072 8.494 2.960 1.00 25.22 N +ATOM 395 CA SER A 55 4.154 8.875 4.011 1.00 28.49 C +ATOM 396 C SER A 55 4.486 8.103 5.302 1.00 24.34 C +ATOM 397 O SER A 55 4.973 6.965 5.258 1.00 27.68 O +ATOM 398 CB SER A 55 2.761 8.352 3.609 1.00 29.79 C +ATOM 399 OG SER A 55 2.398 8.865 2.336 1.00 41.45 O +ATOM 400 N LEU A 56 4.183 8.723 6.426 1.00 26.66 N +ATOM 401 CA LEU A 56 4.424 8.134 7.760 1.00 25.62 C +ATOM 402 C LEU A 56 3.240 8.370 8.687 1.00 30.33 C +ATOM 403 O LEU A 56 2.434 9.273 8.469 1.00 29.36 O +ATOM 404 CB LEU A 56 5.559 8.867 8.490 1.00 26.75 C +ATOM 405 CG LEU A 56 6.906 8.861 7.782 1.00 34.83 C +ATOM 406 CD1 LEU A 56 7.858 9.937 8.326 1.00 29.42 C +ATOM 407 CD2 LEU A 56 7.639 7.531 7.941 1.00 28.43 C +ATOM 408 N ASN A 57 3.150 7.556 9.719 1.00 28.09 N +ATOM 409 CA ASN A 57 2.162 7.782 10.791 1.00 24.87 C +ATOM 410 C ASN A 57 2.970 8.183 12.032 1.00 23.91 C +ATOM 411 O ASN A 57 3.748 7.365 12.556 1.00 25.64 O +ATOM 412 CB ASN A 57 1.327 6.524 11.056 1.00 26.11 C +ATOM 413 CG ASN A 57 0.408 6.647 12.288 1.00 35.12 C +ATOM 414 OD1 ASN A 57 0.559 7.569 13.092 1.00 40.95 O +ATOM 415 ND2 ASN A 57 -0.544 5.753 12.492 1.00 41.01 N +ATOM 416 N GLN A 58 2.776 9.444 12.447 1.00 27.37 N +ATOM 417 CA GLN A 58 3.511 10.052 13.595 1.00 31.76 C +ATOM 418 C GLN A 58 2.582 10.362 14.800 1.00 34.04 C +ATOM 419 O GLN A 58 2.879 11.183 15.671 1.00 29.19 O +ATOM 420 CB GLN A 58 4.233 11.333 13.150 1.00 25.80 C +ATOM 421 CG GLN A 58 5.444 11.050 12.242 1.00 28.40 C +ATOM 422 CD GLN A 58 6.459 12.201 12.190 1.00 47.72 C +ATOM 423 OE1 GLN A 58 6.420 13.019 11.268 1.00 34.30 O +ATOM 424 NE2 GLN A 58 7.377 12.316 13.133 1.00 26.13 N +ATOM 425 N ASP A 59 1.433 9.693 14.869 1.00 36.72 N +ATOM 426 CA ASP A 59 0.490 9.937 15.971 1.00 38.66 C +ATOM 427 C ASP A 59 1.091 9.815 17.356 1.00 35.94 C +ATOM 428 O ASP A 59 0.654 10.514 18.266 1.00 39.04 O +ATOM 429 CB ASP A 59 -0.584 8.841 15.935 1.00 42.70 C +ATOM 430 CG ASP A 59 -1.530 8.991 14.788 1.00 46.32 C +ATOM 431 OD1 ASP A 59 -1.658 10.028 14.186 1.00 38.83 O +ATOM 432 OD2 ASP A 59 -2.364 7.994 14.691 1.00 59.49 O +ATOM 433 N ASP A 60 1.995 8.847 17.545 1.00 24.98 N +ATOM 434 CA ASP A 60 2.571 8.658 18.857 1.00 24.28 C +ATOM 435 C ASP A 60 3.580 9.740 19.204 1.00 40.65 C +ATOM 436 O ASP A 60 4.138 9.656 20.278 1.00 43.03 O +ATOM 437 CB ASP A 60 3.322 7.326 18.890 1.00 27.18 C +ATOM 438 CG ASP A 60 2.315 6.216 18.808 1.00 57.16 C +ATOM 439 OD1 ASP A 60 1.117 6.432 18.881 1.00 51.58 O +ATOM 440 OD2 ASP A 60 2.833 5.017 18.626 1.00 41.88 O +ATOM 441 N GLN A 61 3.968 10.668 18.334 1.00 27.55 N +ATOM 442 CA GLN A 61 4.973 11.625 18.768 1.00 30.08 C +ATOM 443 C GLN A 61 4.316 12.872 19.438 1.00 40.72 C +ATOM 444 O GLN A 61 3.179 13.216 19.124 1.00 34.19 O +ATOM 445 CB GLN A 61 5.776 12.028 17.544 1.00 33.63 C +ATOM 446 CG GLN A 61 5.117 13.131 16.681 1.00 25.93 C +ATOM 447 CD GLN A 61 5.331 14.519 17.217 1.00 28.73 C +ATOM 448 OE1 GLN A 61 6.402 14.827 17.721 1.00 30.35 O +ATOM 449 NE2 GLN A 61 4.427 15.450 16.881 1.00 35.06 N +ATOM 450 N SER A 62 4.967 13.636 20.333 1.00 27.75 N +ATOM 451 CA SER A 62 4.283 14.824 20.910 1.00 30.90 C +ATOM 452 C SER A 62 5.077 16.100 20.909 1.00 36.75 C +ATOM 453 O SER A 62 4.690 17.110 21.441 1.00 52.66 O +ATOM 454 CB SER A 62 3.864 14.633 22.379 1.00 35.95 C +ATOM 455 OG SER A 62 4.952 14.105 23.125 1.00 46.21 O +ATOM 456 N PHE A 63 6.252 16.067 20.384 1.00 29.60 N +ATOM 457 CA PHE A 63 7.102 17.228 20.417 1.00 27.99 C +ATOM 458 C PHE A 63 6.946 18.183 19.229 1.00 31.11 C +ATOM 459 O PHE A 63 7.002 19.359 19.419 1.00 27.26 O +ATOM 460 CB PHE A 63 8.530 16.630 20.559 1.00 25.49 C +ATOM 461 CG PHE A 63 9.618 17.648 20.427 1.00 30.88 C +ATOM 462 CD1 PHE A 63 9.947 18.463 21.509 1.00 26.86 C +ATOM 463 CD2 PHE A 63 10.321 17.816 19.230 1.00 29.02 C +ATOM 464 CE1 PHE A 63 11.013 19.366 21.435 1.00 29.07 C +ATOM 465 CE2 PHE A 63 11.373 18.727 19.142 1.00 29.76 C +ATOM 466 CZ PHE A 63 11.726 19.519 20.243 1.00 33.72 C +ATOM 467 N LEU A 64 6.865 17.724 17.971 1.00 25.68 N +ATOM 468 CA LEU A 64 6.831 18.662 16.842 1.00 24.82 C +ATOM 469 C LEU A 64 5.450 19.287 16.739 1.00 26.70 C +ATOM 470 O LEU A 64 4.460 18.591 16.986 1.00 31.40 O +ATOM 471 CB LEU A 64 7.034 17.871 15.491 1.00 22.47 C +ATOM 472 CG LEU A 64 8.369 17.086 15.396 1.00 29.46 C +ATOM 473 CD1 LEU A 64 8.417 16.185 14.142 1.00 30.53 C +ATOM 474 CD2 LEU A 64 9.647 17.977 15.456 1.00 24.48 C +ATOM 475 N ASP A 65 5.405 20.538 16.305 1.00 28.62 N +ATOM 476 CA ASP A 65 4.152 21.243 16.006 1.00 34.60 C +ATOM 477 C ASP A 65 3.666 20.894 14.548 1.00 41.36 C +ATOM 478 O ASP A 65 4.444 20.342 13.747 1.00 26.86 O +ATOM 479 CB ASP A 65 4.279 22.755 16.344 1.00 31.77 C +ATOM 480 CG ASP A 65 5.013 23.596 15.359 1.00 47.04 C +ATOM 481 OD1 ASP A 65 5.134 23.317 14.193 1.00 48.63 O +ATOM 482 OD2 ASP A 65 5.539 24.667 15.877 1.00 71.08 O +ATOM 483 N ASP A 66 2.394 21.176 14.206 1.00 31.65 N +ATOM 484 CA ASP A 66 1.862 20.859 12.888 1.00 33.85 C +ATOM 485 C ASP A 66 2.718 21.427 11.772 1.00 38.51 C +ATOM 486 O ASP A 66 2.894 20.807 10.719 1.00 38.50 O +ATOM 487 CB ASP A 66 0.336 21.139 12.705 1.00 35.51 C +ATOM 488 CG ASP A 66 -0.498 20.102 13.425 1.00 95.83 C +ATOM 489 OD1 ASP A 66 -0.319 18.893 13.287 1.00100.00 O +ATOM 490 OD2 ASP A 66 -1.318 20.615 14.323 1.00 84.76 O +ATOM 491 N ASP A 67 3.271 22.611 12.040 1.00 33.26 N +ATOM 492 CA ASP A 67 4.128 23.303 11.083 1.00 33.10 C +ATOM 493 C ASP A 67 5.410 22.560 10.803 1.00 45.29 C +ATOM 494 O ASP A 67 5.837 22.433 9.647 1.00 34.92 O +ATOM 495 CB ASP A 67 4.521 24.678 11.546 1.00 31.04 C +ATOM 496 CG ASP A 67 3.513 25.724 11.117 1.00 90.55 C +ATOM 497 OD1 ASP A 67 2.330 25.355 10.766 1.00 92.64 O +ATOM 498 OD2 ASP A 67 3.854 26.959 11.106 1.00100.00 O +ATOM 499 N GLN A 68 6.015 22.094 11.853 1.00 38.59 N +ATOM 500 CA GLN A 68 7.260 21.369 11.718 1.00 32.76 C +ATOM 501 C GLN A 68 7.016 20.090 10.901 1.00 26.08 C +ATOM 502 O GLN A 68 7.814 19.732 10.023 1.00 30.32 O +ATOM 503 CB GLN A 68 7.820 21.057 13.091 1.00 22.57 C +ATOM 504 CG GLN A 68 8.535 22.262 13.705 1.00 26.78 C +ATOM 505 CD GLN A 68 8.904 22.067 15.173 1.00 35.57 C +ATOM 506 OE1 GLN A 68 8.118 21.511 15.936 1.00 29.91 O +ATOM 507 NE2 GLN A 68 10.069 22.499 15.619 1.00 29.90 N +ATOM 508 N ILE A 69 5.903 19.435 11.205 1.00 25.11 N +ATOM 509 CA ILE A 69 5.499 18.196 10.509 1.00 27.87 C +ATOM 510 C ILE A 69 5.327 18.483 9.019 1.00 34.66 C +ATOM 511 O ILE A 69 5.811 17.729 8.162 1.00 29.47 O +ATOM 512 CB ILE A 69 4.171 17.674 11.063 1.00 32.70 C +ATOM 513 CG1 ILE A 69 4.302 17.089 12.470 1.00 40.33 C +ATOM 514 CG2 ILE A 69 3.565 16.559 10.207 1.00 29.13 C +ATOM 515 CD1 ILE A 69 5.045 15.752 12.495 1.00 32.83 C +ATOM 516 N ASP A 70 4.637 19.573 8.776 1.00 31.86 N +ATOM 517 CA ASP A 70 4.370 20.072 7.426 1.00 38.31 C +ATOM 518 C ASP A 70 5.714 20.306 6.684 1.00 40.55 C +ATOM 519 O ASP A 70 5.839 20.039 5.474 1.00 48.39 O +ATOM 520 CB ASP A 70 3.604 21.400 7.532 1.00 52.17 C +ATOM 521 CG ASP A 70 2.078 21.257 7.683 1.00 55.19 C +ATOM 522 OD1 ASP A 70 1.545 20.107 7.915 1.00 80.92 O +ATOM 523 OD2 ASP A 70 1.323 22.303 7.572 1.00 63.35 O +ATOM 524 N GLU A 71 6.703 20.810 7.446 1.00 34.13 N +ATOM 525 CA GLU A 71 8.074 21.120 6.933 1.00 34.15 C +ATOM 526 C GLU A 71 8.794 19.823 6.526 1.00 30.41 C +ATOM 527 O GLU A 71 9.763 19.846 5.748 1.00 35.23 O +ATOM 528 CB GLU A 71 8.924 21.851 8.000 1.00 41.29 C +ATOM 529 CG GLU A 71 8.882 23.387 7.868 1.00 64.85 C +ATOM 530 CD GLU A 71 10.268 24.068 7.864 1.00100.00 C +ATOM 531 OE1 GLU A 71 11.290 23.479 8.387 1.00 55.31 O +ATOM 532 OE2 GLU A 71 10.413 25.243 7.337 1.00100.00 O +ATOM 533 N GLY A 72 8.295 18.726 7.081 1.00 27.79 N +ATOM 534 CA GLY A 72 8.784 17.369 6.766 1.00 32.80 C +ATOM 535 C GLY A 72 9.646 16.761 7.895 1.00 32.09 C +ATOM 536 O GLY A 72 10.348 15.757 7.699 1.00 25.25 O +ATOM 537 N TRP A 73 9.595 17.356 9.076 1.00 22.23 N +ATOM 538 CA TRP A 73 10.383 16.849 10.220 1.00 21.49 C +ATOM 539 C TRP A 73 9.765 15.543 10.734 1.00 26.19 C +ATOM 540 O TRP A 73 8.548 15.414 10.743 1.00 26.06 O +ATOM 541 CB TRP A 73 10.454 17.886 11.341 1.00 23.52 C +ATOM 542 CG TRP A 73 11.396 19.048 11.007 1.00 26.22 C +ATOM 543 CD1 TRP A 73 11.039 20.269 10.605 1.00 28.20 C +ATOM 544 CD2 TRP A 73 12.823 19.008 11.067 1.00 24.95 C +ATOM 545 NE1 TRP A 73 12.238 21.017 10.401 1.00 28.21 N +ATOM 546 CE2 TRP A 73 13.272 20.262 10.674 1.00 34.89 C +ATOM 547 CE3 TRP A 73 13.768 18.030 11.414 1.00 24.84 C +ATOM 548 CZ2 TRP A 73 14.626 20.610 10.598 1.00 32.01 C +ATOM 549 CZ3 TRP A 73 15.133 18.390 11.338 1.00 28.18 C +ATOM 550 CH2 TRP A 73 15.540 19.620 10.948 1.00 32.61 C +ATOM 551 N VAL A 74 10.593 14.559 11.200 1.00 23.35 N +ATOM 552 CA VAL A 74 10.113 13.267 11.705 1.00 26.91 C +ATOM 553 C VAL A 74 10.908 12.880 12.956 1.00 21.84 C +ATOM 554 O VAL A 74 12.136 13.080 12.973 1.00 22.56 O +ATOM 555 CB VAL A 74 10.512 12.092 10.734 1.00 34.43 C +ATOM 556 CG1 VAL A 74 9.845 10.767 11.131 1.00 31.94 C +ATOM 557 CG2 VAL A 74 10.272 12.404 9.276 1.00 34.41 C +ATOM 558 N LEU A 75 10.212 12.238 13.882 1.00 23.50 N +ATOM 559 CA LEU A 75 10.892 11.635 15.066 1.00 25.89 C +ATOM 560 C LEU A 75 10.923 10.134 14.847 1.00 21.88 C +ATOM 561 O LEU A 75 9.878 9.418 14.894 1.00 24.28 O +ATOM 562 CB LEU A 75 10.252 12.047 16.425 1.00 24.52 C +ATOM 563 CG LEU A 75 10.262 13.564 16.716 1.00 29.19 C +ATOM 564 CD1 LEU A 75 9.589 13.895 18.095 1.00 27.15 C +ATOM 565 CD2 LEU A 75 11.679 14.128 16.642 1.00 24.99 C +ATOM 566 N THR A 76 12.124 9.633 14.510 1.00 20.95 N +ATOM 567 CA THR A 76 12.251 8.258 14.122 1.00 22.14 C +ATOM 568 C THR A 76 11.899 7.212 15.221 1.00 25.69 C +ATOM 569 O THR A 76 11.533 6.102 14.878 1.00 20.55 O +ATOM 570 CB THR A 76 13.595 7.943 13.417 1.00 29.14 C +ATOM 571 OG1 THR A 76 14.619 8.070 14.358 1.00 22.12 O +ATOM 572 CG2 THR A 76 13.851 8.815 12.151 1.00 21.65 C +ATOM 573 N CYS A 77 11.936 7.604 16.523 1.00 19.42 N +ATOM 574 CA CYS A 77 11.573 6.588 17.500 1.00 23.31 C +ATOM 575 C CYS A 77 10.080 6.382 17.585 1.00 23.91 C +ATOM 576 O CYS A 77 9.604 5.521 18.330 1.00 27.19 O +ATOM 577 CB CYS A 77 12.096 7.056 18.896 1.00 26.08 C +ATOM 578 SG CYS A 77 11.280 8.530 19.603 1.00 24.96 S +ATOM 579 N ALA A 78 9.316 7.248 16.935 1.00 20.23 N +ATOM 580 CA ALA A 78 7.844 7.176 17.084 1.00 26.31 C +ATOM 581 C ALA A 78 7.033 7.191 15.789 1.00 36.64 C +ATOM 582 O ALA A 78 5.853 7.565 15.774 1.00 30.28 O +ATOM 583 CB ALA A 78 7.355 8.353 17.931 1.00 24.52 C +ATOM 584 N ALA A 79 7.710 6.814 14.700 1.00 29.72 N +ATOM 585 CA ALA A 79 7.111 6.869 13.368 1.00 32.19 C +ATOM 586 C ALA A 79 6.958 5.506 12.733 1.00 25.32 C +ATOM 587 O ALA A 79 7.919 4.711 12.753 1.00 24.70 O +ATOM 588 CB ALA A 79 7.896 7.902 12.468 1.00 25.97 C +ATOM 589 N TYR A 80 5.749 5.231 12.211 1.00 25.90 N +ATOM 590 CA TYR A 80 5.484 4.014 11.425 1.00 24.76 C +ATOM 591 C TYR A 80 5.417 4.400 9.929 1.00 24.61 C +ATOM 592 O TYR A 80 4.854 5.446 9.553 1.00 25.82 O +ATOM 593 CB TYR A 80 4.219 3.175 11.706 1.00 26.45 C +ATOM 594 CG TYR A 80 4.106 2.676 13.134 1.00 31.84 C +ATOM 595 CD1 TYR A 80 4.830 1.580 13.624 1.00 34.25 C +ATOM 596 CD2 TYR A 80 3.242 3.365 13.990 1.00 34.72 C +ATOM 597 CE1 TYR A 80 4.714 1.193 14.964 1.00 30.56 C +ATOM 598 CE2 TYR A 80 3.065 2.963 15.314 1.00 30.24 C +ATOM 599 CZ TYR A 80 3.790 1.866 15.770 1.00 35.29 C +ATOM 600 OH TYR A 80 3.624 1.546 17.078 1.00 51.62 O +ATOM 601 N PRO A 81 6.018 3.558 9.080 1.00 27.26 N +ATOM 602 CA PRO A 81 5.949 3.836 7.625 1.00 29.66 C +ATOM 603 C PRO A 81 4.575 3.430 7.093 1.00 31.14 C +ATOM 604 O PRO A 81 4.053 2.403 7.575 1.00 29.26 O +ATOM 605 CB PRO A 81 6.936 2.848 6.980 1.00 28.79 C +ATOM 606 CG PRO A 81 7.194 1.736 8.003 1.00 31.75 C +ATOM 607 CD PRO A 81 6.736 2.280 9.352 1.00 26.94 C +ATOM 608 N VAL A 82 3.960 4.235 6.214 1.00 27.18 N +ATOM 609 CA VAL A 82 2.685 3.782 5.638 1.00 35.74 C +ATOM 610 C VAL A 82 2.831 3.398 4.139 1.00 42.39 C +ATOM 611 O VAL A 82 1.907 3.001 3.426 1.00 34.16 O +ATOM 612 CB VAL A 82 1.424 4.610 5.984 1.00 36.83 C +ATOM 613 CG1 VAL A 82 1.091 4.669 7.474 1.00 37.46 C +ATOM 614 CG2 VAL A 82 1.473 6.001 5.423 1.00 34.29 C +ATOM 615 N SER A 83 4.039 3.560 3.645 1.00 36.29 N +ATOM 616 CA SER A 83 4.438 3.307 2.273 1.00 34.79 C +ATOM 617 C SER A 83 5.941 3.232 2.282 1.00 35.38 C +ATOM 618 O SER A 83 6.586 3.383 3.330 1.00 27.25 O +ATOM 619 CB SER A 83 4.139 4.497 1.347 1.00 30.61 C +ATOM 620 OG SER A 83 5.019 5.647 1.485 1.00 28.06 O +ATOM 621 N ASP A 84 6.494 3.021 1.094 1.00 26.06 N +ATOM 622 CA ASP A 84 7.922 3.058 1.040 1.00 30.29 C +ATOM 623 C ASP A 84 8.379 4.468 1.376 1.00 30.65 C +ATOM 624 O ASP A 84 7.718 5.431 0.999 1.00 31.40 O +ATOM 625 CB ASP A 84 8.418 2.707 -0.338 1.00 29.55 C +ATOM 626 CG ASP A 84 8.195 1.254 -0.617 1.00 40.79 C +ATOM 627 OD1 ASP A 84 7.890 0.313 0.155 1.00 34.20 O +ATOM 628 OD2 ASP A 84 8.405 1.151 -1.879 1.00 47.36 O +ATOM 629 N VAL A 85 9.526 4.644 2.031 1.00 22.99 N +ATOM 630 CA VAL A 85 9.939 6.010 2.333 1.00 20.82 C +ATOM 631 C VAL A 85 11.478 6.190 2.308 1.00 24.03 C +ATOM 632 O VAL A 85 12.262 5.206 2.513 1.00 27.17 O +ATOM 633 CB VAL A 85 9.478 6.435 3.755 1.00 28.89 C +ATOM 634 CG1 VAL A 85 7.965 6.527 3.938 1.00 26.65 C +ATOM 635 CG2 VAL A 85 10.152 5.504 4.814 1.00 29.90 C +ATOM 636 N THR A 86 11.848 7.460 1.993 1.00 20.22 N +ATOM 637 CA THR A 86 13.198 7.883 2.071 1.00 21.23 C +ATOM 638 C THR A 86 13.330 8.952 3.174 1.00 25.70 C +ATOM 639 O THR A 86 12.605 9.949 3.191 1.00 22.59 O +ATOM 640 CB THR A 86 13.718 8.431 0.769 1.00 23.30 C +ATOM 641 OG1 THR A 86 13.519 7.475 -0.260 1.00 26.36 O +ATOM 642 CG2 THR A 86 15.210 8.768 0.824 1.00 22.87 C +ATOM 643 N ILE A 87 14.262 8.733 4.102 1.00 22.97 N +ATOM 644 CA ILE A 87 14.463 9.665 5.240 1.00 23.87 C +ATOM 645 C ILE A 87 15.949 10.014 5.452 1.00 19.36 C +ATOM 646 O ILE A 87 16.814 9.140 5.475 1.00 24.47 O +ATOM 647 CB ILE A 87 13.972 9.014 6.543 1.00 21.55 C +ATOM 648 CG1 ILE A 87 12.454 8.826 6.572 1.00 27.50 C +ATOM 649 CG2 ILE A 87 14.331 9.833 7.785 1.00 20.65 C +ATOM 650 CD1 ILE A 87 11.969 7.924 7.710 1.00 31.38 C +ATOM 651 N GLU A 88 16.242 11.311 5.598 1.00 21.01 N +ATOM 652 CA GLU A 88 17.622 11.757 5.934 1.00 22.22 C +ATOM 653 C GLU A 88 17.735 11.750 7.465 1.00 27.78 C +ATOM 654 O GLU A 88 16.941 12.400 8.152 1.00 24.12 O +ATOM 655 CB GLU A 88 17.905 13.188 5.441 1.00 28.56 C +ATOM 656 CG GLU A 88 17.653 13.397 3.950 1.00 41.70 C +ATOM 657 CD GLU A 88 18.260 14.697 3.405 1.00 48.78 C +ATOM 658 OE1 GLU A 88 18.764 15.569 4.210 1.00 55.59 O +ATOM 659 OE2 GLU A 88 18.265 14.913 2.133 1.00 95.14 O +ATOM 660 N THR A 89 18.708 11.014 7.991 1.00 21.38 N +ATOM 661 CA THR A 89 18.881 10.871 9.468 1.00 25.41 C +ATOM 662 C THR A 89 19.936 11.870 10.028 1.00 30.23 C +ATOM 663 O THR A 89 20.541 12.649 9.288 1.00 22.22 O +ATOM 664 CB THR A 89 19.313 9.435 9.803 1.00 24.95 C +ATOM 665 OG1 THR A 89 20.566 9.146 9.196 1.00 26.36 O +ATOM 666 CG2 THR A 89 18.316 8.369 9.323 1.00 23.11 C +ATOM 667 N HIS A 90 20.129 11.829 11.361 1.00 29.25 N +ATOM 668 CA HIS A 90 21.114 12.699 12.096 1.00 30.89 C +ATOM 669 C HIS A 90 20.896 14.194 11.746 1.00 19.65 C +ATOM 670 O HIS A 90 21.807 14.876 11.254 1.00 24.29 O +ATOM 671 CB HIS A 90 22.552 12.359 11.680 1.00 23.67 C +ATOM 672 CG HIS A 90 22.966 10.925 12.015 1.00 28.74 C +ATOM 673 ND1 HIS A 90 22.367 9.824 11.412 1.00 25.05 N +ATOM 674 CD2 HIS A 90 23.901 10.429 12.868 1.00 25.95 C +ATOM 675 CE1 HIS A 90 22.932 8.732 11.896 1.00 26.62 C +ATOM 676 NE2 HIS A 90 23.848 9.075 12.766 1.00 27.96 N +ATOM 677 N LYS A 91 19.692 14.702 12.017 1.00 21.85 N +ATOM 678 CA LYS A 91 19.328 16.104 11.671 1.00 24.48 C +ATOM 679 C LYS A 91 18.969 16.961 12.899 1.00 22.53 C +ATOM 680 O LYS A 91 18.507 18.105 12.767 1.00 24.20 O +ATOM 681 CB LYS A 91 18.092 16.125 10.769 1.00 24.74 C +ATOM 682 CG LYS A 91 18.394 15.720 9.329 1.00 33.72 C +ATOM 683 CD LYS A 91 19.267 16.737 8.594 1.00 33.40 C +ATOM 684 CE LYS A 91 19.650 16.284 7.184 1.00 56.58 C +ATOM 685 NZ LYS A 91 20.051 17.398 6.313 1.00 70.22 N +ATOM 686 N LYS A 92 19.193 16.402 14.066 1.00 29.41 N +ATOM 687 CA LYS A 92 18.862 17.064 15.343 1.00 29.57 C +ATOM 688 C LYS A 92 19.404 18.499 15.416 1.00 31.36 C +ATOM 689 O LYS A 92 18.727 19.418 15.897 1.00 30.72 O +ATOM 690 CB LYS A 92 19.478 16.299 16.516 1.00 28.26 C +ATOM 691 CG LYS A 92 19.717 17.184 17.743 1.00 42.15 C +ATOM 692 CD LYS A 92 19.736 16.395 19.054 1.00 58.10 C +ATOM 693 CE LYS A 92 21.130 16.311 19.680 1.00 74.57 C +ATOM 694 NZ LYS A 92 21.096 16.204 21.146 1.00 73.77 N +ATOM 695 N GLU A 93 20.609 18.655 14.934 1.00 25.37 N +ATOM 696 CA GLU A 93 21.334 19.926 15.008 1.00 33.41 C +ATOM 697 C GLU A 93 20.816 20.964 13.971 1.00 34.04 C +ATOM 698 O GLU A 93 21.217 22.136 13.972 1.00 37.10 O +ATOM 699 CB GLU A 93 22.827 19.630 14.806 1.00 36.08 C +ATOM 700 CG GLU A 93 23.635 19.664 16.121 1.00100.00 C +ATOM 701 CD GLU A 93 23.858 18.339 16.907 1.00100.00 C +ATOM 702 OE1 GLU A 93 22.862 17.695 17.423 1.00100.00 O +ATOM 703 OE2 GLU A 93 25.060 17.880 17.081 1.00100.00 O +ATOM 704 N GLU A 94 19.911 20.554 13.095 1.00 33.03 N +ATOM 705 CA GLU A 94 19.390 21.462 12.044 1.00 33.87 C +ATOM 706 C GLU A 94 17.957 21.905 12.326 1.00 30.08 C +ATOM 707 O GLU A 94 17.403 22.771 11.634 1.00 29.33 O +ATOM 708 CB GLU A 94 19.373 20.759 10.693 1.00 36.71 C +ATOM 709 CG GLU A 94 20.771 20.470 10.160 1.00 52.81 C +ATOM 710 CD GLU A 94 20.788 20.210 8.656 1.00100.00 C +ATOM 711 OE1 GLU A 94 19.722 20.405 7.957 1.00 57.89 O +ATOM 712 OE2 GLU A 94 21.868 19.796 8.088 1.00 85.85 O +ATOM 713 N LEU A 95 17.393 21.306 13.332 1.00 26.01 N +ATOM 714 CA LEU A 95 16.011 21.563 13.709 1.00 26.71 C +ATOM 715 C LEU A 95 15.801 23.027 14.206 1.00 33.16 C +ATOM 716 O LEU A 95 16.584 23.603 15.002 1.00 28.74 O +ATOM 717 CB LEU A 95 15.601 20.616 14.840 1.00 24.05 C +ATOM 718 CG LEU A 95 14.137 20.768 15.253 1.00 37.37 C +ATOM 719 CD1 LEU A 95 13.161 20.208 14.216 1.00 39.22 C +ATOM 720 CD2 LEU A 95 13.808 20.048 16.563 1.00 48.43 C +ATOM 721 N THR A 96 14.690 23.657 13.803 1.00 24.29 N +ATOM 722 CA THR A 96 14.357 24.971 14.259 1.00 20.50 C +ATOM 723 C THR A 96 12.842 25.027 14.364 1.00 29.60 C +ATOM 724 O THR A 96 12.150 24.097 13.856 1.00 27.87 O +ATOM 725 CB THR A 96 14.675 26.113 13.293 1.00 29.55 C +ATOM 726 OG1 THR A 96 13.917 25.851 12.128 1.00 30.05 O +ATOM 727 CG2 THR A 96 16.120 26.211 13.007 1.00 23.85 C +ATOM 728 N ALA A 97 12.313 26.090 15.052 1.00 27.16 N +ATOM 729 CA ALA A 97 10.851 26.183 15.191 1.00 37.74 C +ATOM 730 C ALA A 97 10.166 26.814 14.004 1.00 64.29 C +ATOM 731 O ALA A 97 9.815 27.983 14.121 1.00100.00 O +ATOM 732 CB ALA A 97 10.299 26.681 16.508 1.00 35.84 C +TER 733 ALA A 97 +HETATM 734 FE1 FES A1602 13.398 11.548 21.999 1.00 26.97 FE +HETATM 735 FE2 FES A1602 12.925 10.090 19.701 1.00 26.54 FE +HETATM 736 S1 FES A1602 14.657 9.885 21.071 1.00 26.27 S +HETATM 737 S2 FES A1602 11.681 11.837 20.546 1.00 27.47 S +HETATM 738 O HOH A1603 20.314 3.189 17.662 1.00 28.40 O +HETATM 739 O HOH A1604 19.136 13.499 14.797 1.00 27.63 O +HETATM 740 O HOH A1605 15.839 17.655 22.569 1.00 31.32 O +HETATM 741 O HOH A1606 13.340 -3.911 18.366 1.00 31.87 O +HETATM 742 O HOH A1607 17.589 8.577 14.886 1.00 25.57 O +HETATM 743 O HOH A1608 3.158 6.964 15.663 1.00 32.70 O +HETATM 744 O HOH A1609 12.607 3.196 0.028 1.00 35.81 O +HETATM 745 O HOH A1610 17.941 10.294 12.971 1.00 28.21 O +HETATM 746 O HOH A1611 1.926 1.370 9.724 1.00 37.77 O +HETATM 747 O HOH A1612 11.412 3.410 19.732 1.00 37.42 O +HETATM 748 O HOH A1613 8.807 17.793 25.373 1.00 41.85 O +HETATM 749 O HOH A1614 3.590 11.528 5.863 1.00 39.49 O +HETATM 750 O HOH A1615 25.052 1.593 11.348 1.00 43.97 O +HETATM 751 O HOH A1616 -6.196 7.375 14.972 1.00 75.86 O +HETATM 752 O HOH A1617 8.534 -0.956 17.306 1.00 37.45 O +HETATM 753 O HOH A1618 6.639 15.107 8.525 1.00 36.12 O +HETATM 754 O HOH A1619 22.246 2.005 21.737 1.00 36.05 O +HETATM 755 O HOH A1620 14.535 -4.507 10.197 1.00 55.68 O +HETATM 756 O HOH A1621 4.876 2.526 -1.355 1.00 41.58 O +HETATM 757 O HOH A1622 11.330 5.913 -0.990 1.00 42.42 O +HETATM 758 O HOH A1623 8.224 5.865 20.826 1.00 41.41 O +HETATM 759 O HOH A1624 22.831 5.923 19.420 1.00 45.06 O +HETATM 760 O HOH A1625 14.917 23.836 10.267 1.00 40.43 O +HETATM 761 O HOH A1626 11.139 24.357 10.914 1.00 63.90 O +HETATM 762 O HOH A1627 11.625 17.756 3.797 1.00 64.36 O +HETATM 763 O HOH A1628 0.872 11.720 21.228 1.00 66.38 O +HETATM 764 O HOH A1629 -0.211 4.813 15.867 1.00 63.96 O +HETATM 765 O HOH A1630 20.658 -7.095 8.049 1.00 67.10 O +HETATM 766 O HOH A1631 24.043 4.181 -2.687 1.00 53.06 O +HETATM 767 O HOH A1632 21.936 6.378 21.945 1.00 55.43 O +HETATM 768 O HOH A1633 19.025 24.652 14.863 1.00 51.35 O +HETATM 769 O HOH A1634 11.308 8.680 28.143 1.00 44.39 O +HETATM 770 O HOH A1635 -0.428 0.927 5.386 1.00 85.08 O +HETATM 771 O HOH A1636 21.798 10.879 23.320 1.00 52.42 O +HETATM 772 O HOH A1637 3.239 6.955 -0.065 1.00 55.66 O +HETATM 773 O HOH A1638 22.779 2.365 18.908 1.00 43.93 O +HETATM 774 O HOH A1639 24.188 5.146 11.189 1.00 45.31 O +HETATM 775 O HOH A1640 -1.683 -0.913 1.878 1.00 69.36 O +HETATM 776 O HOH A1641 8.696 6.563 -1.677 1.00 58.88 O +HETATM 777 O HOH A1642 7.367 26.197 14.480 1.00 49.47 O +HETATM 778 O HOH A1643 6.591 -1.657 -1.410 1.00 85.37 O +HETATM 779 O HOH A1644 7.606 18.977 3.435 1.00 63.19 O +HETATM 780 O HOH A1645 -3.822 10.414 11.859 1.00 57.70 O +HETATM 781 O HOH A1646 21.749 12.594 6.625 1.00 51.80 O +HETATM 782 O HOH A1647 23.131 4.812 23.785 1.00 50.20 O +HETATM 783 O HOH A1648 16.610 3.001 -2.612 1.00 56.90 O +HETATM 784 O HOH A1649 22.528 16.502 13.897 1.00 55.79 O +HETATM 785 O HOH A1650 26.500 7.848 10.348 1.00 68.43 O +HETATM 786 O HOH A1651 3.851 12.983 3.178 1.00 49.71 O +HETATM 787 O HOH A1652 19.786 18.726 20.646 1.00 45.90 O +HETATM 788 O HOH A1653 18.145 27.680 9.755 1.00 64.26 O +HETATM 789 O HOH A1654 17.574 -8.112 7.017 1.00 76.51 O +HETATM 790 O HOH A1655 22.282 13.839 15.539 1.00 60.51 O +HETATM 791 O HOH A1656 21.110 -7.809 14.066 1.00 66.51 O +HETATM 792 O HOH A1657 25.732 22.369 16.313 1.00 59.47 O +HETATM 793 O HOH A1658 13.415 9.318 -2.947 1.00 59.85 O +HETATM 794 O HOH A1659 13.899 22.771 7.168 1.00 63.98 O +HETATM 795 O HOH A1660 27.481 5.665 17.885 1.00 79.40 O +HETATM 796 O HOH A1661 8.580 -4.372 17.408 1.00 60.41 O +HETATM 797 O HOH A1662 24.876 4.074 8.926 1.00 71.07 O +HETATM 798 O HOH A1663 10.525 -6.340 15.708 1.00 53.48 O +HETATM 799 O HOH A1664 -1.284 5.529 19.201 1.00 68.40 O +HETATM 800 O HOH A1665 15.014 11.978 -2.461 1.00 64.00 O +HETATM 801 O HOH A1666 14.106 -9.236 2.519 1.00 67.28 O +HETATM 802 O HOH A1667 14.062 29.978 13.852 1.00 84.39 O +HETATM 803 O HOH A1668 6.500 2.082 -3.927 1.00 73.15 O +HETATM 804 O HOH A1669 -3.999 12.915 12.023 1.00 70.07 O +HETATM 805 O HOH A1670 22.522 10.655 20.491 1.00 62.92 O +HETATM 806 O HOH A1671 5.802 -4.428 16.828 1.00 64.57 O +HETATM 807 O HOH A1672 -0.285 -5.312 2.050 1.00 83.51 O +HETATM 808 O HOH A1673 -0.266 3.144 11.216 1.00 68.25 O +HETATM 809 O HOH A1674 25.407 13.378 14.852 1.00 80.99 O +HETATM 810 O HOH A1675 15.568 7.564 -2.586 1.00 71.16 O +HETATM 811 O HOH A1676 4.787 10.976 22.962 1.00 65.51 O +HETATM 812 O HOH A1677 25.854 23.790 19.080 1.00 69.96 O +HETATM 813 O HOH A1678 6.047 15.849 24.673 1.00 76.93 O +HETATM 814 O HOH A1679 3.270 10.385 25.458 1.00 68.03 O +HETATM 815 O HOH A1680 17.147 -11.645 -0.378 1.00 76.39 O +HETATM 816 O HOH A1681 3.889 11.272 28.440 1.00 57.34 O +HETATM 817 O HOH A1682 0.829 10.575 6.206 1.00 61.71 O +HETATM 818 O HOH A1683 -2.192 14.658 14.063 1.00 83.95 O +CONECT 297 734 +CONECT 329 734 +CONECT 347 735 +CONECT 578 735 +CONECT 734 297 329 736 737 +CONECT 735 347 578 736 737 +CONECT 736 734 735 +CONECT 737 734 735 +MASTER 253 0 1 4 5 0 2 6 817 1 8 8 +END diff --git a/test/jalview/io/2nq2.pdb b/test/jalview/io/2nq2.pdb new file mode 100644 index 0000000..a43217a --- /dev/null +++ b/test/jalview/io/2nq2.pdb @@ -0,0 +1,10096 @@ +HEADER METAL TRANSPORT 30-OCT-06 2NQ2 +TITLE AN INWARD-FACING CONFORMATION OF A PUTATIVE METAL-CHELATE +TITLE 2 TYPE ABC TRANSPORTER. +COMPND MOL_ID: 1; +COMPND 2 MOLECULE: HYPOTHETICAL ABC TRANSPORTER PERMEASE PROTEIN +COMPND 3 HI1471; +COMPND 4 CHAIN: A, B; +COMPND 5 ENGINEERED: YES; +COMPND 6 MOL_ID: 2; +COMPND 7 MOLECULE: HYPOTHETICAL ABC TRANSPORTER ATP-BINDING PROTEIN +COMPND 8 HI1470; +COMPND 9 CHAIN: C, D; +COMPND 10 ENGINEERED: YES +SOURCE MOL_ID: 1; +SOURCE 2 ORGANISM_SCIENTIFIC: HAEMOPHILUS INFLUENZAE; +SOURCE 3 ORGANISM_TAXID: 727; +SOURCE 4 STRAIN: KW20 RD; +SOURCE 5 GENE: HI_1471; +SOURCE 6 EXPRESSION_SYSTEM: ESCHERICHIA COLI; +SOURCE 7 EXPRESSION_SYSTEM_TAXID: 562; +SOURCE 8 EXPRESSION_SYSTEM_STRAIN: BL21(DE3)/B834(DE3); +SOURCE 9 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID; +SOURCE 10 EXPRESSION_SYSTEM_PLASMID: PET19B/PET21B(+); +SOURCE 11 MOL_ID: 2; +SOURCE 12 ORGANISM_SCIENTIFIC: HAEMOPHILUS INFLUENZAE; +SOURCE 13 ORGANISM_TAXID: 727; +SOURCE 14 STRAIN: KW20 RD; +SOURCE 15 GENE: HI_1470; +SOURCE 16 EXPRESSION_SYSTEM: ESCHERICHIA COLI; +SOURCE 17 EXPRESSION_SYSTEM_TAXID: 562; +SOURCE 18 EXPRESSION_SYSTEM_STRAIN: BL21(DE3)/B834(DE3); +SOURCE 19 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID; +SOURCE 20 EXPRESSION_SYSTEM_PLASMID: PET19B/PET21B(+) +KEYWDS PUTATIVE IRON CHELATIN ABC TRANSPORTER, ATP-BINDING PROTEIN, +KEYWDS 2 NUCLEOTIDE BINDING DOMAIN, TRANSMEMBRANE DOMAIN, METAL +KEYWDS 3 TRANSPORT +EXPDTA X-RAY DIFFRACTION +AUTHOR H.P.PINKETT,A.T.LEE,P.LUM,K.P.LOCHER,D.C.REES +REVDAT 3 24-FEB-09 2NQ2 1 VERSN +REVDAT 2 30-JAN-07 2NQ2 1 JRNL +REVDAT 1 02-JAN-07 2NQ2 0 +JRNL AUTH H.W.PINKETT,A.T.LEE,P.LUM,K.P.LOCHER,D.C.REES +JRNL TITL AN INWARD-FACING CONFORMATION OF A PUTATIVE +JRNL TITL 2 METAL-CHELATE-TYPE ABC TRANSPORTER. +JRNL REF SCIENCE V. 315 373 2007 +JRNL REFN ISSN 0036-8075 +JRNL PMID 17158291 +JRNL DOI 10.1126/SCIENCE.1133488 +REMARK 1 +REMARK 2 +REMARK 2 RESOLUTION. 2.40 ANGSTROMS. +REMARK 3 +REMARK 3 REFINEMENT. +REMARK 3 PROGRAM : CNS +REMARK 3 AUTHORS : BRUNGER,ADAMS,CLORE,DELANO,GROS,GROSSE- +REMARK 3 : KUNSTLEVE,JIANG,KUSZEWSKI,NILGES, PANNU, +REMARK 3 : READ,RICE,SIMONSON,WARREN +REMARK 3 +REMARK 3 REFINEMENT TARGET : ENGH & HUBER +REMARK 3 +REMARK 3 DATA USED IN REFINEMENT. +REMARK 3 RESOLUTION RANGE HIGH (ANGSTROMS) : 2.40 +REMARK 3 RESOLUTION RANGE LOW (ANGSTROMS) : 28.00 +REMARK 3 DATA CUTOFF (SIGMA(F)) : 0.000 +REMARK 3 DATA CUTOFF HIGH (ABS(F)) : NULL +REMARK 3 DATA CUTOFF LOW (ABS(F)) : NULL +REMARK 3 COMPLETENESS (WORKING+TEST) (%) : 98.9 +REMARK 3 NUMBER OF REFLECTIONS : 81106 +REMARK 3 +REMARK 3 FIT TO DATA USED IN REFINEMENT. +REMARK 3 CROSS-VALIDATION METHOD : THROUGHOUT +REMARK 3 FREE R VALUE TEST SET SELECTION : RANDOM +REMARK 3 R VALUE (WORKING SET) : 0.222 +REMARK 3 FREE R VALUE : 0.260 +REMARK 3 FREE R VALUE TEST SET SIZE (%) : 9.800 +REMARK 3 FREE R VALUE TEST SET COUNT : 8214 +REMARK 3 ESTIMATED ERROR OF FREE R VALUE : NULL +REMARK 3 +REMARK 3 FIT IN THE HIGHEST RESOLUTION BIN. +REMARK 3 TOTAL NUMBER OF BINS USED : NULL +REMARK 3 BIN RESOLUTION RANGE HIGH (A) : 2.40 +REMARK 3 BIN RESOLUTION RANGE LOW (A) : 2.55 +REMARK 3 BIN COMPLETENESS (WORKING+TEST) (%) : NULL +REMARK 3 REFLECTIONS IN BIN (WORKING SET) : NULL +REMARK 3 BIN R VALUE (WORKING SET) : 0.2490 +REMARK 3 BIN FREE R VALUE : 0.3020 +REMARK 3 BIN FREE R VALUE TEST SET SIZE (%) : NULL +REMARK 3 BIN FREE R VALUE TEST SET COUNT : 1297 +REMARK 3 ESTIMATED ERROR OF BIN FREE R VALUE : 0.008 +REMARK 3 +REMARK 3 NUMBER OF NON-HYDROGEN ATOMS USED IN REFINEMENT. +REMARK 3 PROTEIN ATOMS : 8569 +REMARK 3 NUCLEIC ACID ATOMS : 0 +REMARK 3 HETEROGEN ATOMS : 0 +REMARK 3 SOLVENT ATOMS : 682 +REMARK 3 +REMARK 3 B VALUES. +REMARK 3 FROM WILSON PLOT (A**2) : 31.40 +REMARK 3 MEAN B VALUE (OVERALL, A**2) : 51.09 +REMARK 3 OVERALL ANISOTROPIC B VALUE. +REMARK 3 B11 (A**2) : 5.30400 +REMARK 3 B22 (A**2) : -4.44900 +REMARK 3 B33 (A**2) : -0.84000 +REMARK 3 B12 (A**2) : 0.00000 +REMARK 3 B13 (A**2) : 0.00000 +REMARK 3 B23 (A**2) : 0.00000 +REMARK 3 +REMARK 3 ESTIMATED COORDINATE ERROR. +REMARK 3 ESD FROM LUZZATI PLOT (A) : 0.29 +REMARK 3 ESD FROM SIGMAA (A) : 0.23 +REMARK 3 LOW RESOLUTION CUTOFF (A) : 5.00 +REMARK 3 +REMARK 3 CROSS-VALIDATED ESTIMATED COORDINATE ERROR. +REMARK 3 ESD FROM C-V LUZZATI PLOT (A) : 0.36 +REMARK 3 ESD FROM C-V SIGMAA (A) : 0.31 +REMARK 3 +REMARK 3 RMS DEVIATIONS FROM IDEAL VALUES. +REMARK 3 BOND LENGTHS (A) : 0.006 +REMARK 3 BOND ANGLES (DEGREES) : NULL +REMARK 3 DIHEDRAL ANGLES (DEGREES) : NULL +REMARK 3 IMPROPER ANGLES (DEGREES) : NULL +REMARK 3 +REMARK 3 ISOTROPIC THERMAL MODEL : NULL +REMARK 3 +REMARK 3 ISOTROPIC THERMAL FACTOR RESTRAINTS. RMS SIGMA +REMARK 3 MAIN-CHAIN BOND (A**2) : NULL ; NULL +REMARK 3 MAIN-CHAIN ANGLE (A**2) : NULL ; NULL +REMARK 3 SIDE-CHAIN BOND (A**2) : NULL ; NULL +REMARK 3 SIDE-CHAIN ANGLE (A**2) : NULL ; NULL +REMARK 3 +REMARK 3 BULK SOLVENT MODELING. +REMARK 3 METHOD USED : NULL +REMARK 3 KSOL : NULL +REMARK 3 BSOL : 50.07 +REMARK 3 +REMARK 3 NCS MODEL : NULL +REMARK 3 +REMARK 3 NCS RESTRAINTS. RMS SIGMA/WEIGHT +REMARK 3 GROUP 1 POSITIONAL (A) : NULL ; NULL +REMARK 3 GROUP 1 B-FACTOR (A**2) : NULL ; NULL +REMARK 3 +REMARK 3 PARAMETER FILE 1 : PROTEIN_REP.PARAM +REMARK 3 PARAMETER FILE 2 : WATER_REP.PARAM +REMARK 3 PARAMETER FILE 3 : NULL +REMARK 3 TOPOLOGY FILE 1 : NULL +REMARK 3 TOPOLOGY FILE 2 : NULL +REMARK 3 TOPOLOGY FILE 3 : NULL +REMARK 3 +REMARK 3 OTHER REFINEMENT REMARKS: WATER MOLECULES POSITIONED IN THE +REMARK 3 MEMBRANE SPANNING REGION LIKELY CORRESPOND TO DENSITY FROM +REMARK 3 DISORDERED DETERGENTS AND POSSIBLY ASSOCIATED PHOSPHOLIPIDS. +REMARK 4 +REMARK 4 2NQ2 COMPLIES WITH FORMAT V. 3.15, 01-DEC-08 +REMARK 100 +REMARK 100 THIS ENTRY HAS BEEN PROCESSED BY RCSB ON 28-NOV-06. +REMARK 100 THE RCSB ID CODE IS RCSB040163. +REMARK 200 +REMARK 200 EXPERIMENTAL DETAILS +REMARK 200 EXPERIMENT TYPE : X-RAY DIFFRACTION +REMARK 200 DATE OF DATA COLLECTION : 16-FEB-05; NULL +REMARK 200 TEMPERATURE (KELVIN) : 100; NULL +REMARK 200 PH : 5.5 +REMARK 200 NUMBER OF CRYSTALS USED : 2 +REMARK 200 +REMARK 200 SYNCHROTRON (Y/N) : Y; Y +REMARK 200 RADIATION SOURCE : SSRL; SSRL +REMARK 200 BEAMLINE : BL9-2; BL9-2 +REMARK 200 X-RAY GENERATOR MODEL : NULL; NULL +REMARK 200 MONOCHROMATIC OR LAUE (M/L) : M; M +REMARK 200 WAVELENGTH OR RANGE (A) : 0.97925, 0.89194, 0.97927; +REMARK 200 0.97927 +REMARK 200 MONOCHROMATOR : DOUBLE CRYSTAL MONOCHROMATOR; +REMARK 200 DOUBLE CRYSTAL MONOCHROMATOR +REMARK 200 OPTICS : MIRRORS; NULL +REMARK 200 +REMARK 200 DETECTOR TYPE : IMAGE PLATE; NULL +REMARK 200 DETECTOR MANUFACTURER : MAR SCANNER 345 MM PLATE; NULL +REMARK 200 INTENSITY-INTEGRATION SOFTWARE : DENZO +REMARK 200 DATA SCALING SOFTWARE : SCALEPACK +REMARK 200 +REMARK 200 NUMBER OF UNIQUE REFLECTIONS : 82020 +REMARK 200 RESOLUTION RANGE HIGH (A) : 2.400 +REMARK 200 RESOLUTION RANGE LOW (A) : 30.000 +REMARK 200 REJECTION CRITERIA (SIGMA(I)) : NULL +REMARK 200 +REMARK 200 OVERALL. +REMARK 200 COMPLETENESS FOR RANGE (%) : 99.5 +REMARK 200 DATA REDUNDANCY : 14.500 +REMARK 200 R MERGE (I) : NULL +REMARK 200 R SYM (I) : 0.06100 +REMARK 200 FOR THE DATA SET : 16.1000 +REMARK 200 +REMARK 200 IN THE HIGHEST RESOLUTION SHELL. +REMARK 200 HIGHEST RESOLUTION SHELL, RANGE HIGH (A) : 2.40 +REMARK 200 HIGHEST RESOLUTION SHELL, RANGE LOW (A) : 2.49 +REMARK 200 COMPLETENESS FOR SHELL (%) : 99.2 +REMARK 200 DATA REDUNDANCY IN SHELL : 14.10 +REMARK 200 R MERGE FOR SHELL (I) : NULL +REMARK 200 R SYM FOR SHELL (I) : 0.27000 +REMARK 200 FOR SHELL : NULL +REMARK 200 +REMARK 200 DIFFRACTION PROTOCOL: MAD; SINGLE WAVELENGTH +REMARK 200 METHOD USED TO DETERMINE THE STRUCTURE: MAD +REMARK 200 SOFTWARE USED: SHARP +REMARK 200 STARTING MODEL: NULL +REMARK 200 +REMARK 200 REMARK: NULL +REMARK 280 +REMARK 280 CRYSTAL +REMARK 280 SOLVENT CONTENT, VS (%): 69.77 +REMARK 280 MATTHEWS COEFFICIENT, VM (ANGSTROMS**3/DA): 4.07 +REMARK 280 +REMARK 280 CRYSTALLIZATION CONDITIONS: 34% PENTAERYTHRITOL PROPOXYLATE, +REMARK 280 0.1M SODIUM CITRATE, PH 5.5, 0.2M POTASSIUM CHLORIDE, VAPOR +REMARK 280 DIFFUSION, SITTING DROP, TEMPERATURE 277K +REMARK 290 +REMARK 290 CRYSTALLOGRAPHIC SYMMETRY +REMARK 290 SYMMETRY OPERATORS FOR SPACE GROUP: P 21 21 21 +REMARK 290 +REMARK 290 SYMOP SYMMETRY +REMARK 290 NNNMMM OPERATOR +REMARK 290 1555 X,Y,Z +REMARK 290 2555 -X+1/2,-Y,Z+1/2 +REMARK 290 3555 -X,Y+1/2,-Z+1/2 +REMARK 290 4555 X+1/2,-Y+1/2,-Z +REMARK 290 +REMARK 290 WHERE NNN -> OPERATOR NUMBER +REMARK 290 MMM -> TRANSLATION VECTOR +REMARK 290 +REMARK 290 CRYSTALLOGRAPHIC SYMMETRY TRANSFORMATIONS +REMARK 290 THE FOLLOWING TRANSFORMATIONS OPERATE ON THE ATOM/HETATM +REMARK 290 RECORDS IN THIS ENTRY TO PRODUCE CRYSTALLOGRAPHICALLY +REMARK 290 RELATED MOLECULES. +REMARK 290 SMTRY1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 290 SMTRY2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 290 SMTRY3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 290 SMTRY1 2 -1.000000 0.000000 0.000000 48.92300 +REMARK 290 SMTRY2 2 0.000000 -1.000000 0.000000 0.00000 +REMARK 290 SMTRY3 2 0.000000 0.000000 1.000000 75.13400 +REMARK 290 SMTRY1 3 -1.000000 0.000000 0.000000 0.00000 +REMARK 290 SMTRY2 3 0.000000 1.000000 0.000000 71.23250 +REMARK 290 SMTRY3 3 0.000000 0.000000 -1.000000 75.13400 +REMARK 290 SMTRY1 4 1.000000 0.000000 0.000000 48.92300 +REMARK 290 SMTRY2 4 0.000000 -1.000000 0.000000 71.23250 +REMARK 290 SMTRY3 4 0.000000 0.000000 -1.000000 0.00000 +REMARK 290 +REMARK 290 REMARK: NULL +REMARK 300 +REMARK 300 BIOMOLECULE: 1 +REMARK 300 SEE REMARK 350 FOR THE AUTHOR PROVIDED AND/OR PROGRAM +REMARK 300 GENERATED ASSEMBLY INFORMATION FOR THE STRUCTURE IN +REMARK 300 THIS ENTRY. THE REMARK MAY ALSO PROVIDE INFORMATION ON +REMARK 300 BURIED SURFACE AREA. +REMARK 300 REMARK: THE BIOLOGICAL ASSEMBLY IS A DIMER +REMARK 350 +REMARK 350 COORDINATES FOR A COMPLETE MULTIMER REPRESENTING THE KNOWN +REMARK 350 BIOLOGICALLY SIGNIFICANT OLIGOMERIZATION STATE OF THE +REMARK 350 MOLECULE CAN BE GENERATED BY APPLYING BIOMT TRANSFORMATIONS +REMARK 350 GIVEN BELOW. BOTH NON-CRYSTALLOGRAPHIC AND +REMARK 350 CRYSTALLOGRAPHIC OPERATIONS ARE GIVEN. +REMARK 350 +REMARK 350 BIOMOLECULE: 1 +REMARK 350 AUTHOR DETERMINED BIOLOGICAL UNIT: TETRAMERIC +REMARK 350 SOFTWARE DETERMINED QUATERNARY STRUCTURE: TETRAMERIC +REMARK 350 SOFTWARE USED: PISA +REMARK 350 TOTAL BURIED SURFACE AREA: 10970 ANGSTROM**2 +REMARK 350 SURFACE AREA OF THE COMPLEX: 44500 ANGSTROM**2 +REMARK 350 CHANGE IN SOLVENT FREE ENERGY: -102.0 KCAL/MOL +REMARK 350 APPLY THE FOLLOWING TO CHAINS: A, C, B, D +REMARK 350 BIOMT1 1 1.000000 0.000000 0.000000 0.00000 +REMARK 350 BIOMT2 1 0.000000 1.000000 0.000000 0.00000 +REMARK 350 BIOMT3 1 0.000000 0.000000 1.000000 0.00000 +REMARK 465 +REMARK 465 MISSING RESIDUES +REMARK 465 THE FOLLOWING RESIDUES WERE NOT LOCATED IN THE +REMARK 465 EXPERIMENT. (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN +REMARK 465 IDENTIFIER; SSSEQ=SEQUENCE NUMBER; I=INSERTION CODE.) +REMARK 465 +REMARK 465 M RES C SSSEQI +REMARK 465 MET A 1 +REMARK 465 GLN A 2 +REMARK 465 PRO A 3 +REMARK 465 ASP A 4 +REMARK 465 SER A 5 +REMARK 465 GLY A 38 +REMARK 465 GLN A 39 +REMARK 465 ILE A 40 +REMARK 465 LEU A 41 +REMARK 465 TRP A 42 +REMARK 465 ALA A 43 +REMARK 465 LYS A 44 +REMARK 465 ALA A 45 +REMARK 465 THR A 46 +REMARK 465 ALA A 47 +REMARK 465 LEU A 48 +REMARK 465 GLU A 49 +REMARK 465 ILE A 50 +REMARK 465 PHE A 142 +REMARK 465 ASN A 143 +REMARK 465 GLN A 144 +REMARK 465 ARG A 145 +REMARK 465 LYS A 331 +REMARK 465 ARG A 332 +REMARK 465 GLY A 333 +REMARK 465 GLY A 334 +REMARK 465 MET A 335 +REMARK 465 ASN A 336 +REMARK 465 GLU A 337 +REMARK 465 MET C 1 +REMARK 465 LYS C 253 +REMARK 465 MET B 1 +REMARK 465 GLN B 2 +REMARK 465 PRO B 3 +REMARK 465 ASP B 4 +REMARK 465 PRO B 35 +REMARK 465 GLN B 36 +REMARK 465 ILE B 37 +REMARK 465 GLY B 38 +REMARK 465 GLN B 39 +REMARK 465 ILE B 40 +REMARK 465 LEU B 41 +REMARK 465 TRP B 42 +REMARK 465 ALA B 43 +REMARK 465 LYS B 44 +REMARK 465 ALA B 45 +REMARK 465 THR B 46 +REMARK 465 ALA B 47 +REMARK 465 LEU B 48 +REMARK 465 GLU B 49 +REMARK 465 ILE B 50 +REMARK 465 ASP B 51 +REMARK 465 PRO B 52 +REMARK 465 VAL B 53 +REMARK 465 PHE B 140 +REMARK 465 LYS B 141 +REMARK 465 PHE B 142 +REMARK 465 ASN B 143 +REMARK 465 GLN B 144 +REMARK 465 ARG B 145 +REMARK 465 SER B 146 +REMARK 465 LYS B 331 +REMARK 465 ARG B 332 +REMARK 465 GLY B 333 +REMARK 465 GLY B 334 +REMARK 465 MET B 335 +REMARK 465 ASN B 336 +REMARK 465 GLU B 337 +REMARK 465 GLU D 17 +REMARK 465 ASN D 18 +REMARK 465 PHE D 19 +REMARK 465 LEU D 20 +REMARK 465 LYS D 253 +REMARK 470 +REMARK 470 MISSING ATOM +REMARK 470 THE FOLLOWING RESIDUES HAVE MISSING ATOMS(M=MODEL NUMBER; +REMARK 470 RES=RESIDUE NAME; C=CHAIN IDENTIFIER; SSEQ=SEQUENCE NUMBER; +REMARK 470 I=INSERTION CODE): +REMARK 470 M RES CSSEQI ATOMS +REMARK 470 GLN B 54 CG CD OE1 NE2 +REMARK 470 GLN B 55 CG CD OE1 NE2 +REMARK 470 GLN B 56 CG CD OE1 NE2 +REMARK 470 VAL B 57 CG1 CG2 +REMARK 470 ILE B 58 CG1 CG2 CD1 +REMARK 470 PHE B 59 CG CD1 CD2 CE1 CE2 CZ +REMARK 480 +REMARK 480 ZERO OCCUPANCY ATOM +REMARK 480 THE FOLLOWING RESIDUES HAVE ATOMS MODELED WITH ZERO +REMARK 480 OCCUPANCY. THE LOCATION AND PROPERTIES OF THESE ATOMS +REMARK 480 MAY NOT BE RELIABLE. (M=MODEL NUMBER; RES=RESIDUE NAME; +REMARK 480 C=CHAIN IDENTIFIER; SSEQ=SEQUENCE NUMBER; I=INSERTION CODE): +REMARK 480 M RES C SSEQI ATOMS +REMARK 480 ILE A 9 CD1 +REMARK 480 ILE A 19 CD1 +REMARK 480 ILE A 23 CD1 +REMARK 480 ILE A 27 CD1 +REMARK 480 ILE A 37 CD1 +REMARK 480 ILE A 58 CD1 +REMARK 480 ILE A 66 CD1 +REMARK 480 ILE A 86 CD1 +REMARK 480 ILE A 96 CD1 +REMARK 480 ILE A 97 CD1 +REMARK 480 ILE A 111 CD1 +REMARK 480 ILE A 125 CD1 +REMARK 480 ILE A 151 CD1 +REMARK 480 ILE A 153 CD1 +REMARK 480 ILE A 156 CD1 +REMARK 480 ILE A 171 CD1 +REMARK 480 ILE A 181 CD1 +REMARK 480 ILE A 210 CD1 +REMARK 480 ILE A 243 CD1 +REMARK 480 ILE A 256 CD1 +REMARK 480 ILE A 260 CD1 +REMARK 480 ILE A 266 CD1 +REMARK 480 ILE A 267 CD1 +REMARK 480 LEU A 304 CB CG CD1 CD2 +REMARK 480 ASP A 306 OD1 OD2 +REMARK 480 ILE A 309 CD1 +REMARK 480 ILE A 311 CD1 +REMARK 480 ILE A 313 CD1 +REMARK 480 ILE A 318 CD1 +REMARK 480 LEU A 330 O +REMARK 480 PHE C 19 CB CG CD1 CD2 CE1 CE2 CZ +REMARK 480 ILE C 33 CD1 +REMARK 480 ILE C 54 CD1 +REMARK 480 ILE C 58 CD1 +REMARK 480 ILE C 62 CD1 +REMARK 480 ILE C 68 CD1 +REMARK 480 ILE C 86 CD1 +REMARK 480 ILE C 95 CD1 +REMARK 480 ILE C 137 CD1 +REMARK 480 ILE C 139 CD1 +REMARK 480 ILE C 143 CD1 +REMARK 480 ILE C 150 CD1 +REMARK 480 ILE C 166 CD1 +REMARK 480 ILE C 172 CD1 +REMARK 480 ILE C 195 CD1 +REMARK 480 ILE C 215 CD1 +REMARK 480 LEU C 252 O +REMARK 480 ILE B 9 CD1 +REMARK 480 ILE B 19 CD1 +REMARK 480 ILE B 23 CD1 +REMARK 480 ILE B 27 CD1 +REMARK 480 ARG B 29 CG CD NE CZ NH1 NH2 +REMARK 480 ILE B 66 CD1 +REMARK 480 ILE B 86 CD1 +REMARK 480 ILE B 96 CD1 +REMARK 480 ILE B 97 CD1 +REMARK 480 ILE B 111 CD1 +REMARK 480 ILE B 125 CD1 +REMARK 480 ILE B 151 CD1 +REMARK 480 ILE B 153 CD1 +REMARK 480 ILE B 156 CD1 +REMARK 480 ILE B 171 CD1 +REMARK 480 THR B 174 O +REMARK 480 LYS B 177 NZ +REMARK 480 ILE B 181 CD1 +REMARK 480 ILE B 210 CD1 +REMARK 480 ILE B 243 CD1 +REMARK 480 ILE B 256 CD1 +REMARK 480 ILE B 260 CD1 +REMARK 480 ILE B 266 CD1 +REMARK 480 ILE B 267 CD1 +REMARK 480 ILE B 309 CD1 +REMARK 480 ILE B 311 CD1 +REMARK 480 ILE B 313 CD1 +REMARK 480 ILE B 318 CD1 +REMARK 480 LEU B 330 O +REMARK 480 ILE D 33 CD1 +REMARK 480 ILE D 54 CD1 +REMARK 480 ILE D 58 CD1 +REMARK 480 ILE D 62 CD1 +REMARK 480 ILE D 68 CD1 +REMARK 480 ILE D 86 CD1 +REMARK 480 ILE D 95 CD1 +REMARK 480 ILE D 137 CD1 +REMARK 480 ILE D 139 CD1 +REMARK 480 ILE D 143 CD1 +REMARK 480 ILE D 150 CD1 +REMARK 480 ILE D 166 CD1 +REMARK 480 ILE D 172 CD1 +REMARK 480 ILE D 195 CD1 +REMARK 480 ILE D 215 CD1 +REMARK 480 LEU D 252 O +REMARK 500 +REMARK 500 GEOMETRY AND STEREOCHEMISTRY +REMARK 500 SUBTOPIC: TORSION ANGLES +REMARK 500 +REMARK 500 TORSION ANGLES OUTSIDE THE EXPECTED RAMACHANDRAN REGIONS: +REMARK 500 (M=MODEL NUMBER; RES=RESIDUE NAME; C=CHAIN IDENTIFIER; +REMARK 500 SSEQ=SEQUENCE NUMBER; I=INSERTION CODE). +REMARK 500 +REMARK 500 STANDARD TABLE: +REMARK 500 FORMAT:(10X,I3,1X,A3,1X,A1,I4,A1,4X,F7.2,3X,F7.2) +REMARK 500 +REMARK 500 EXPECTED VALUES: GJ KLEYWEGT AND TA JONES (1996). PHI/PSI- +REMARK 500 CHOLOGY: RAMACHANDRAN REVISITED. STRUCTURE 4, 1395 - 1400 +REMARK 500 +REMARK 500 M RES CSSEQI PSI PHI +REMARK 500 SER A 31 -157.99 -95.04 +REMARK 500 SER A 33 -40.69 -147.53 +REMARK 500 VAL A 61 -73.75 -114.78 +REMARK 500 PRO A 94 22.95 -65.56 +REMARK 500 PHE A 140 55.43 -110.38 +REMARK 500 LEU A 304 -53.15 -28.77 +REMARK 500 PHE C 26 149.83 170.61 +REMARK 500 ASN C 40 123.78 -15.19 +REMARK 500 HIS C 120 20.36 -70.73 +REMARK 500 LYS C 204 89.47 32.38 +REMARK 500 GLN C 205 -7.71 53.58 +REMARK 500 GLU C 238 -8.37 74.98 +REMARK 500 ARG B 29 -72.42 -37.67 +REMARK 500 TYR B 30 72.57 -104.58 +REMARK 500 SER B 31 -163.46 -63.99 +REMARK 500 ILE B 58 -4.14 -58.80 +REMARK 500 PHE B 59 9.36 -62.84 +REMARK 500 PRO B 94 0.53 -60.54 +REMARK 500 PHE B 138 -1.56 -57.76 +REMARK 500 ILE B 171 43.18 -106.33 +REMARK 500 GLU B 176 -60.94 -125.57 +REMARK 500 THR B 191 55.30 -98.01 +REMARK 500 SER B 257 8.95 -155.12 +REMARK 500 LYS B 329 173.01 68.28 +REMARK 500 ASN D 9 39.11 37.06 +REMARK 500 GLN D 15 -46.04 -133.90 +REMARK 500 GLN D 205 -70.80 -103.76 +REMARK 500 LYS D 237 74.21 45.00 +REMARK 500 GLU D 238 -10.13 74.41 +REMARK 500 +REMARK 500 REMARK: NULL +REMARK 525 +REMARK 525 SOLVENT +REMARK 525 +REMARK 525 THE SOLVENT MOLECULES HAVE CHAIN IDENTIFIERS THAT +REMARK 525 INDICATE THE POLYMER CHAIN WITH WHICH THEY ARE MOST +REMARK 525 CLOSELY ASSOCIATED. THE REMARK LISTS ALL THE SOLVENT +REMARK 525 MOLECULES WHICH ARE MORE THAN 5A AWAY FROM THE +REMARK 525 NEAREST POLYMER CHAIN (M = MODEL NUMBER; +REMARK 525 RES=RESIDUE NAME; C=CHAIN IDENTIFIER; SSEQ=SEQUENCE +REMARK 525 NUMBER; I=INSERTION CODE): +REMARK 525 +REMARK 525 M RES CSSEQI +REMARK 525 HOH A 338 DISTANCE = 5.37 ANGSTROMS +REMARK 525 HOH B 338 DISTANCE = 6.06 ANGSTROMS +REMARK 525 HOH A 342 DISTANCE = 6.30 ANGSTROMS +REMARK 525 HOH A 345 DISTANCE = 5.81 ANGSTROMS +REMARK 525 HOH A 346 DISTANCE = 7.29 ANGSTROMS +REMARK 525 HOH A 349 DISTANCE = 6.66 ANGSTROMS +REMARK 525 HOH B 351 DISTANCE = 7.58 ANGSTROMS +REMARK 525 HOH A 358 DISTANCE = 5.71 ANGSTROMS +REMARK 525 HOH B 358 DISTANCE = 7.75 ANGSTROMS +REMARK 525 HOH B 362 DISTANCE = 5.02 ANGSTROMS +REMARK 525 HOH A 363 DISTANCE = 5.13 ANGSTROMS +REMARK 525 HOH B 364 DISTANCE = 5.16 ANGSTROMS +REMARK 525 HOH A 370 DISTANCE = 6.40 ANGSTROMS +REMARK 525 HOH B 376 DISTANCE = 5.09 ANGSTROMS +REMARK 525 HOH C 294 DISTANCE = 5.07 ANGSTROMS +REMARK 525 HOH C 296 DISTANCE = 6.91 ANGSTROMS +REMARK 525 HOH A 382 DISTANCE = 5.29 ANGSTROMS +REMARK 525 HOH A 384 DISTANCE = 5.51 ANGSTROMS +REMARK 525 HOH C 302 DISTANCE = 7.27 ANGSTROMS +REMARK 525 HOH A 389 DISTANCE = 5.06 ANGSTROMS +REMARK 525 HOH A 392 DISTANCE = 9.75 ANGSTROMS +REMARK 525 HOH A 395 DISTANCE = 6.38 ANGSTROMS +REMARK 525 HOH A 396 DISTANCE = 5.75 ANGSTROMS +REMARK 525 HOH A 397 DISTANCE = 6.46 ANGSTROMS +REMARK 525 HOH B 397 DISTANCE = 6.74 ANGSTROMS +REMARK 525 HOH A 398 DISTANCE = 7.71 ANGSTROMS +REMARK 525 HOH A 399 DISTANCE = 7.70 ANGSTROMS +REMARK 525 HOH B 399 DISTANCE = 5.77 ANGSTROMS +REMARK 525 HOH A 400 DISTANCE = 5.78 ANGSTROMS +REMARK 525 HOH A 401 DISTANCE = 7.95 ANGSTROMS +REMARK 525 HOH A 402 DISTANCE = 5.92 ANGSTROMS +REMARK 525 HOH A 405 DISTANCE = 7.57 ANGSTROMS +REMARK 525 HOH A 406 DISTANCE = 5.49 ANGSTROMS +REMARK 525 HOH A 408 DISTANCE = 5.55 ANGSTROMS +REMARK 525 HOH B 409 DISTANCE = 9.52 ANGSTROMS +REMARK 525 HOH B 410 DISTANCE = 6.44 ANGSTROMS +REMARK 525 HOH A 411 DISTANCE = 5.20 ANGSTROMS +REMARK 525 HOH B 411 DISTANCE = 7.86 ANGSTROMS +REMARK 525 HOH A 412 DISTANCE = 5.16 ANGSTROMS +REMARK 525 HOH A 413 DISTANCE = 5.00 ANGSTROMS +REMARK 525 HOH B 413 DISTANCE = 8.08 ANGSTROMS +REMARK 525 HOH D 330 DISTANCE = 6.06 ANGSTROMS +REMARK 525 HOH A 415 DISTANCE = 7.14 ANGSTROMS +REMARK 525 HOH B 415 DISTANCE = 5.04 ANGSTROMS +REMARK 525 HOH A 416 DISTANCE = 6.80 ANGSTROMS +REMARK 525 HOH B 416 DISTANCE = 10.06 ANGSTROMS +REMARK 525 HOH A 417 DISTANCE = 6.57 ANGSTROMS +REMARK 525 HOH A 421 DISTANCE = 8.13 ANGSTROMS +REMARK 525 HOH A 422 DISTANCE = 8.23 ANGSTROMS +REMARK 525 HOH D 338 DISTANCE = 5.22 ANGSTROMS +REMARK 525 HOH A 423 DISTANCE = 9.06 ANGSTROMS +REMARK 525 HOH D 339 DISTANCE = 5.28 ANGSTROMS +REMARK 525 HOH A 424 DISTANCE = 7.85 ANGSTROMS +REMARK 525 HOH A 426 DISTANCE = 6.09 ANGSTROMS +REMARK 525 HOH A 429 DISTANCE = 5.42 ANGSTROMS +REMARK 525 HOH A 430 DISTANCE = 5.84 ANGSTROMS +REMARK 525 HOH B 430 DISTANCE = 7.73 ANGSTROMS +REMARK 525 HOH A 431 DISTANCE = 10.42 ANGSTROMS +REMARK 525 HOH C 347 DISTANCE = 7.06 ANGSTROMS +REMARK 525 HOH A 433 DISTANCE = 6.10 ANGSTROMS +REMARK 525 HOH B 434 DISTANCE = 5.06 ANGSTROMS +REMARK 525 HOH C 354 DISTANCE = 6.04 ANGSTROMS +REMARK 525 HOH C 356 DISTANCE = 6.29 ANGSTROMS +REMARK 525 HOH A 441 DISTANCE = 6.55 ANGSTROMS +REMARK 525 HOH B 441 DISTANCE = 7.64 ANGSTROMS +REMARK 525 HOH A 442 DISTANCE = 8.53 ANGSTROMS +REMARK 525 HOH C 359 DISTANCE = 7.30 ANGSTROMS +REMARK 525 HOH A 444 DISTANCE = 10.19 ANGSTROMS +REMARK 525 HOH A 445 DISTANCE = 5.36 ANGSTROMS +REMARK 525 HOH B 445 DISTANCE = 5.82 ANGSTROMS +REMARK 525 HOH B 446 DISTANCE = 6.30 ANGSTROMS +REMARK 525 HOH A 448 DISTANCE = 8.26 ANGSTROMS +REMARK 525 HOH A 449 DISTANCE = 7.30 ANGSTROMS +REMARK 525 HOH B 449 DISTANCE = 6.83 ANGSTROMS +REMARK 525 HOH A 450 DISTANCE = 9.81 ANGSTROMS +REMARK 525 HOH A 452 DISTANCE = 5.48 ANGSTROMS +REMARK 525 HOH A 453 DISTANCE = 7.51 ANGSTROMS +REMARK 525 HOH B 453 DISTANCE = 8.35 ANGSTROMS +REMARK 525 HOH C 369 DISTANCE = 6.71 ANGSTROMS +REMARK 525 HOH A 454 DISTANCE = 5.21 ANGSTROMS +REMARK 525 HOH A 455 DISTANCE = 8.98 ANGSTROMS +REMARK 525 HOH A 456 DISTANCE = 9.32 ANGSTROMS +REMARK 525 HOH D 372 DISTANCE = 6.89 ANGSTROMS +REMARK 525 HOH B 457 DISTANCE = 6.31 ANGSTROMS +REMARK 525 HOH D 373 DISTANCE = 5.26 ANGSTROMS +REMARK 525 HOH C 374 DISTANCE = 5.29 ANGSTROMS +REMARK 525 HOH A 459 DISTANCE = 7.97 ANGSTROMS +REMARK 525 HOH C 375 DISTANCE = 5.53 ANGSTROMS +REMARK 525 HOH B 460 DISTANCE = 5.34 ANGSTROMS +REMARK 525 HOH D 376 DISTANCE = 6.46 ANGSTROMS +REMARK 525 HOH A 463 DISTANCE = 6.52 ANGSTROMS +REMARK 525 HOH A 464 DISTANCE = 6.23 ANGSTROMS +REMARK 525 HOH B 464 DISTANCE = 7.58 ANGSTROMS +REMARK 525 HOH A 466 DISTANCE = 8.61 ANGSTROMS +REMARK 525 HOH B 466 DISTANCE = 6.22 ANGSTROMS +REMARK 525 HOH C 383 DISTANCE = 8.79 ANGSTROMS +REMARK 525 HOH B 468 DISTANCE = 5.07 ANGSTROMS +REMARK 525 HOH B 469 DISTANCE = 7.64 ANGSTROMS +REMARK 525 HOH C 385 DISTANCE = 6.10 ANGSTROMS +REMARK 525 HOH B 470 DISTANCE = 9.68 ANGSTROMS +REMARK 525 HOH A 471 DISTANCE = 5.61 ANGSTROMS +REMARK 525 HOH C 388 DISTANCE = 5.55 ANGSTROMS +REMARK 525 HOH A 474 DISTANCE = 5.57 ANGSTROMS +REMARK 525 HOH B 476 DISTANCE = 10.97 ANGSTROMS +REMARK 525 HOH A 478 DISTANCE = 8.95 ANGSTROMS +REMARK 525 HOH B 478 DISTANCE = 8.30 ANGSTROMS +REMARK 525 HOH B 479 DISTANCE = 6.15 ANGSTROMS +REMARK 525 HOH B 482 DISTANCE = 9.07 ANGSTROMS +REMARK 525 HOH C 398 DISTANCE = 6.09 ANGSTROMS +REMARK 525 HOH B 483 DISTANCE = 8.06 ANGSTROMS +REMARK 525 HOH B 484 DISTANCE = 8.48 ANGSTROMS +REMARK 525 HOH B 485 DISTANCE = 5.32 ANGSTROMS +REMARK 525 HOH C 401 DISTANCE = 9.94 ANGSTROMS +REMARK 525 HOH D 401 DISTANCE = 6.72 ANGSTROMS +REMARK 525 HOH B 490 DISTANCE = 5.59 ANGSTROMS +REMARK 525 HOH C 406 DISTANCE = 5.52 ANGSTROMS +REMARK 525 HOH C 407 DISTANCE = 7.25 ANGSTROMS +REMARK 525 HOH D 407 DISTANCE = 7.08 ANGSTROMS +REMARK 525 HOH B 492 DISTANCE = 7.25 ANGSTROMS +REMARK 525 HOH C 408 DISTANCE = 9.39 ANGSTROMS +REMARK 525 HOH D 408 DISTANCE = 9.27 ANGSTROMS +REMARK 525 HOH B 493 DISTANCE = 6.63 ANGSTROMS +REMARK 525 HOH C 409 DISTANCE = 6.14 ANGSTROMS +REMARK 525 HOH C 410 DISTANCE = 5.56 ANGSTROMS +REMARK 525 HOH B 495 DISTANCE = 7.33 ANGSTROMS +REMARK 525 HOH B 496 DISTANCE = 6.23 ANGSTROMS +REMARK 525 HOH D 412 DISTANCE = 6.50 ANGSTROMS +REMARK 525 HOH C 413 DISTANCE = 6.54 ANGSTROMS +REMARK 525 HOH B 499 DISTANCE = 5.36 ANGSTROMS +REMARK 525 HOH C 415 DISTANCE = 5.97 ANGSTROMS +REMARK 525 HOH C 417 DISTANCE = 6.59 ANGSTROMS +REMARK 525 HOH C 421 DISTANCE = 5.28 ANGSTROMS +REMARK 525 HOH D 421 DISTANCE = 6.24 ANGSTROMS +REMARK 525 HOH C 422 DISTANCE = 7.91 ANGSTROMS +REMARK 525 HOH D 422 DISTANCE = 7.25 ANGSTROMS +REMARK 525 HOH D 423 DISTANCE = 8.83 ANGSTROMS +REMARK 525 HOH D 432 DISTANCE = 5.76 ANGSTROMS +REMARK 525 HOH D 435 DISTANCE = 7.07 ANGSTROMS +REMARK 525 HOH D 438 DISTANCE = 8.14 ANGSTROMS +REMARK 525 HOH D 445 DISTANCE = 6.07 ANGSTROMS +REMARK 525 HOH D 459 DISTANCE = 6.28 ANGSTROMS +REMARK 525 HOH D 461 DISTANCE = 7.26 ANGSTROMS +DBREF 2NQ2 A 1 337 UNP Q57130 Y1471_HAEIN 1 337 +DBREF 2NQ2 B 1 337 UNP Q57130 Y1471_HAEIN 1 337 +DBREF 2NQ2 C 1 253 UNP Q57399 Y1470_HAEIN 1 253 +DBREF 2NQ2 D 1 253 UNP Q57399 Y1470_HAEIN 1 253 +SEQRES 1 A 337 MET GLN PRO ASP SER TYR PRO LYS ILE LEU PHE GLY LEU +SEQRES 2 A 337 THR LEU LEU LEU VAL ILE THR ALA VAL ILE SER LEU GLY +SEQRES 3 A 337 ILE GLY ARG TYR SER LEU SER VAL PRO GLN ILE GLY GLN +SEQRES 4 A 337 ILE LEU TRP ALA LYS ALA THR ALA LEU GLU ILE ASP PRO +SEQRES 5 A 337 VAL GLN GLN GLN VAL ILE PHE GLN VAL ARG LEU PRO ARG +SEQRES 6 A 337 ILE LEU THR ALA LEU CYS VAL GLY ALA GLY LEU ALA LEU +SEQRES 7 A 337 SER GLY VAL VAL LEU GLN GLY ILE PHE ARG ASN PRO LEU +SEQRES 8 A 337 VAL ASN PRO HIS ILE ILE GLY VAL THR SER GLY SER ALA +SEQRES 9 A 337 PHE GLY GLY THR LEU ALA ILE PHE PHE GLY PHE SER LEU +SEQRES 10 A 337 TYR GLY LEU PHE THR SER THR ILE LEU PHE GLY PHE GLY +SEQRES 11 A 337 THR LEU ALA LEU VAL PHE LEU PHE SER PHE LYS PHE ASN +SEQRES 12 A 337 GLN ARG SER LEU LEU MET LEU ILE LEU ILE GLY MET ILE +SEQRES 13 A 337 LEU SER GLY LEU PHE SER ALA LEU VAL SER LEU LEU GLN +SEQRES 14 A 337 TYR ILE SER ASP THR GLU GLU LYS LEU PRO SER ILE VAL +SEQRES 15 A 337 PHE TRP LEU MET GLY SER PHE ALA THR SER ASN TRP GLU +SEQRES 16 A 337 LYS LEU LEU PHE PHE PHE VAL PRO PHE LEU LEU CYS SER +SEQRES 17 A 337 SER ILE LEU LEU SER LEU SER TRP ARG LEU ASN LEU LEU +SEQRES 18 A 337 SER LEU ASP GLU LYS GLU ALA LYS ALA LEU GLY VAL LYS +SEQRES 19 A 337 MET ALA PRO LEU ARG TRP LEU VAL ILE PHE LEU SER GLY +SEQRES 20 A 337 SER LEU VAL ALA CYS GLN VAL ALA ILE SER GLY SER ILE +SEQRES 21 A 337 GLY TRP VAL GLY LEU ILE ILE PRO HIS LEU SER ARG MET +SEQRES 22 A 337 LEU VAL GLY ALA ASN HIS GLN SER LEU LEU PRO CYS THR +SEQRES 23 A 337 MET LEU VAL GLY ALA THR TYR MET LEU LEU VAL ASP ASN +SEQRES 24 A 337 VAL ALA ARG SER LEU SER ASP ALA GLU ILE PRO ILE SER +SEQRES 25 A 337 ILE LEU THR ALA LEU ILE GLY ALA PRO LEU PHE GLY VAL +SEQRES 26 A 337 LEU VAL TYR LYS LEU LYS ARG GLY GLY MET ASN GLU +SEQRES 1 C 253 MET ASN LYS ALA LEU SER VAL GLU ASN LEU GLY PHE TYR +SEQRES 2 C 253 TYR GLN ALA GLU ASN PHE LEU PHE GLN GLN LEU ASN PHE +SEQRES 3 C 253 ASP LEU ASN LYS GLY ASP ILE LEU ALA VAL LEU GLY GLN +SEQRES 4 C 253 ASN GLY CYS GLY LYS SER THR LEU LEU ASP LEU LEU LEU +SEQRES 5 C 253 GLY ILE HIS ARG PRO ILE GLN GLY LYS ILE GLU VAL TYR +SEQRES 6 C 253 GLN SER ILE GLY PHE VAL PRO GLN PHE PHE SER SER PRO +SEQRES 7 C 253 PHE ALA TYR SER VAL LEU ASP ILE VAL LEU MET GLY ARG +SEQRES 8 C 253 SER THR HIS ILE ASN THR PHE ALA LYS PRO LYS SER HIS +SEQRES 9 C 253 ASP TYR GLN VAL ALA MET GLN ALA LEU ASP TYR LEU ASN +SEQRES 10 C 253 LEU THR HIS LEU ALA LYS ARG GLU PHE THR SER LEU SER +SEQRES 11 C 253 GLY GLY GLN ARG GLN LEU ILE LEU ILE ALA ARG ALA ILE +SEQRES 12 C 253 ALA SER GLU CYS LYS LEU ILE LEU LEU ASP GLU PRO THR +SEQRES 13 C 253 SER ALA LEU ASP LEU ALA ASN GLN ASP ILE VAL LEU SER +SEQRES 14 C 253 LEU LEU ILE ASP LEU ALA GLN SER GLN ASN MET THR VAL +SEQRES 15 C 253 VAL PHE THR THR HIS GLN PRO ASN GLN VAL VAL ALA ILE +SEQRES 16 C 253 ALA ASN LYS THR LEU LEU LEU ASN LYS GLN ASN PHE LYS +SEQRES 17 C 253 PHE GLY GLU THR ARG ASN ILE LEU THR SER GLU ASN LEU +SEQRES 18 C 253 THR ALA LEU PHE HIS LEU PRO MET PHE GLU GLN GLN ALA +SEQRES 19 C 253 GLN TYR LYS GLU SER PHE PHE THR HIS PHE VAL PRO LEU +SEQRES 20 C 253 TYR LYS THR LEU LEU LYS +SEQRES 1 B 337 MET GLN PRO ASP SER TYR PRO LYS ILE LEU PHE GLY LEU +SEQRES 2 B 337 THR LEU LEU LEU VAL ILE THR ALA VAL ILE SER LEU GLY +SEQRES 3 B 337 ILE GLY ARG TYR SER LEU SER VAL PRO GLN ILE GLY GLN +SEQRES 4 B 337 ILE LEU TRP ALA LYS ALA THR ALA LEU GLU ILE ASP PRO +SEQRES 5 B 337 VAL GLN GLN GLN VAL ILE PHE GLN VAL ARG LEU PRO ARG +SEQRES 6 B 337 ILE LEU THR ALA LEU CYS VAL GLY ALA GLY LEU ALA LEU +SEQRES 7 B 337 SER GLY VAL VAL LEU GLN GLY ILE PHE ARG ASN PRO LEU +SEQRES 8 B 337 VAL ASN PRO HIS ILE ILE GLY VAL THR SER GLY SER ALA +SEQRES 9 B 337 PHE GLY GLY THR LEU ALA ILE PHE PHE GLY PHE SER LEU +SEQRES 10 B 337 TYR GLY LEU PHE THR SER THR ILE LEU PHE GLY PHE GLY +SEQRES 11 B 337 THR LEU ALA LEU VAL PHE LEU PHE SER PHE LYS PHE ASN +SEQRES 12 B 337 GLN ARG SER LEU LEU MET LEU ILE LEU ILE GLY MET ILE +SEQRES 13 B 337 LEU SER GLY LEU PHE SER ALA LEU VAL SER LEU LEU GLN +SEQRES 14 B 337 TYR ILE SER ASP THR GLU GLU LYS LEU PRO SER ILE VAL +SEQRES 15 B 337 PHE TRP LEU MET GLY SER PHE ALA THR SER ASN TRP GLU +SEQRES 16 B 337 LYS LEU LEU PHE PHE PHE VAL PRO PHE LEU LEU CYS SER +SEQRES 17 B 337 SER ILE LEU LEU SER LEU SER TRP ARG LEU ASN LEU LEU +SEQRES 18 B 337 SER LEU ASP GLU LYS GLU ALA LYS ALA LEU GLY VAL LYS +SEQRES 19 B 337 MET ALA PRO LEU ARG TRP LEU VAL ILE PHE LEU SER GLY +SEQRES 20 B 337 SER LEU VAL ALA CYS GLN VAL ALA ILE SER GLY SER ILE +SEQRES 21 B 337 GLY TRP VAL GLY LEU ILE ILE PRO HIS LEU SER ARG MET +SEQRES 22 B 337 LEU VAL GLY ALA ASN HIS GLN SER LEU LEU PRO CYS THR +SEQRES 23 B 337 MET LEU VAL GLY ALA THR TYR MET LEU LEU VAL ASP ASN +SEQRES 24 B 337 VAL ALA ARG SER LEU SER ASP ALA GLU ILE PRO ILE SER +SEQRES 25 B 337 ILE LEU THR ALA LEU ILE GLY ALA PRO LEU PHE GLY VAL +SEQRES 26 B 337 LEU VAL TYR LYS LEU LYS ARG GLY GLY MET ASN GLU +SEQRES 1 D 253 MET ASN LYS ALA LEU SER VAL GLU ASN LEU GLY PHE TYR +SEQRES 2 D 253 TYR GLN ALA GLU ASN PHE LEU PHE GLN GLN LEU ASN PHE +SEQRES 3 D 253 ASP LEU ASN LYS GLY ASP ILE LEU ALA VAL LEU GLY GLN +SEQRES 4 D 253 ASN GLY CYS GLY LYS SER THR LEU LEU ASP LEU LEU LEU +SEQRES 5 D 253 GLY ILE HIS ARG PRO ILE GLN GLY LYS ILE GLU VAL TYR +SEQRES 6 D 253 GLN SER ILE GLY PHE VAL PRO GLN PHE PHE SER SER PRO +SEQRES 7 D 253 PHE ALA TYR SER VAL LEU ASP ILE VAL LEU MET GLY ARG +SEQRES 8 D 253 SER THR HIS ILE ASN THR PHE ALA LYS PRO LYS SER HIS +SEQRES 9 D 253 ASP TYR GLN VAL ALA MET GLN ALA LEU ASP TYR LEU ASN +SEQRES 10 D 253 LEU THR HIS LEU ALA LYS ARG GLU PHE THR SER LEU SER +SEQRES 11 D 253 GLY GLY GLN ARG GLN LEU ILE LEU ILE ALA ARG ALA ILE +SEQRES 12 D 253 ALA SER GLU CYS LYS LEU ILE LEU LEU ASP GLU PRO THR +SEQRES 13 D 253 SER ALA LEU ASP LEU ALA ASN GLN ASP ILE VAL LEU SER +SEQRES 14 D 253 LEU LEU ILE ASP LEU ALA GLN SER GLN ASN MET THR VAL +SEQRES 15 D 253 VAL PHE THR THR HIS GLN PRO ASN GLN VAL VAL ALA ILE +SEQRES 16 D 253 ALA ASN LYS THR LEU LEU LEU ASN LYS GLN ASN PHE LYS +SEQRES 17 D 253 PHE GLY GLU THR ARG ASN ILE LEU THR SER GLU ASN LEU +SEQRES 18 D 253 THR ALA LEU PHE HIS LEU PRO MET PHE GLU GLN GLN ALA +SEQRES 19 D 253 GLN TYR LYS GLU SER PHE PHE THR HIS PHE VAL PRO LEU +SEQRES 20 D 253 TYR LYS THR LEU LEU LYS +FORMUL 5 HOH *682(H2 O) +HELIX 1 1 TYR A 6 LEU A 25 1 20 +HELIX 2 2 PRO A 52 VAL A 61 1 10 +HELIX 3 3 VAL A 61 PHE A 87 1 27 +HELIX 4 4 GLY A 98 PHE A 113 1 16 +HELIX 5 5 SER A 116 PHE A 140 1 25 +HELIX 6 6 SER A 146 ILE A 171 1 26 +HELIX 7 7 GLU A 176 LEU A 185 1 10 +HELIX 8 8 ASN A 193 LEU A 214 1 22 +HELIX 9 9 TRP A 216 LEU A 223 5 8 +HELIX 10 10 ASP A 224 LEU A 231 1 8 +HELIX 11 11 LYS A 234 GLY A 258 1 25 +HELIX 12 12 LEU A 265 GLY A 276 1 12 +HELIX 13 13 ASN A 278 LEU A 304 1 27 +HELIX 14 14 PRO A 310 LYS A 329 1 20 +HELIX 15 15 GLY C 43 LEU C 52 1 10 +HELIX 16 16 SER C 82 MET C 89 1 8 +HELIX 17 17 GLY C 90 ILE C 95 5 6 +HELIX 18 18 LYS C 102 LEU C 116 1 15 +HELIX 19 19 LEU C 118 ALA C 122 5 5 +HELIX 20 20 GLU C 125 LEU C 129 5 5 +HELIX 21 21 SER C 130 SER C 145 1 16 +HELIX 22 22 ASP C 160 SER C 177 1 18 +HELIX 23 23 GLN C 188 ALA C 196 1 9 +HELIX 24 24 THR C 212 LEU C 216 1 5 +HELIX 25 25 THR C 217 HIS C 226 1 10 +HELIX 26 26 TYR C 248 LEU C 252 5 5 +HELIX 27 27 SER B 5 GLY B 26 1 22 +HELIX 28 28 VAL B 57 VAL B 61 5 5 +HELIX 29 29 ARG B 62 PHE B 87 1 26 +HELIX 30 30 GLY B 98 PHE B 113 1 16 +HELIX 31 31 SER B 116 PHE B 138 1 23 +HELIX 32 32 LEU B 147 ILE B 171 1 25 +HELIX 33 33 GLU B 176 MET B 186 1 11 +HELIX 34 34 ASN B 193 LEU B 214 1 22 +HELIX 35 35 SER B 215 LEU B 223 5 9 +HELIX 36 36 ASP B 224 LEU B 231 1 8 +HELIX 37 37 LYS B 234 GLY B 258 1 25 +HELIX 38 38 ILE B 266 GLY B 276 1 11 +HELIX 39 39 ASN B 278 SER B 305 1 28 +HELIX 40 40 PRO B 310 TYR B 328 1 19 +HELIX 41 41 GLY D 43 GLY D 53 1 11 +HELIX 42 42 SER D 82 MET D 89 1 8 +HELIX 43 43 GLY D 90 ILE D 95 5 6 +HELIX 44 44 LYS D 102 LEU D 116 1 15 +HELIX 45 45 LEU D 118 ALA D 122 5 5 +HELIX 46 46 GLU D 125 LEU D 129 5 5 +HELIX 47 47 SER D 130 SER D 145 1 16 +HELIX 48 48 ASP D 160 GLN D 178 1 19 +HELIX 49 49 GLN D 188 ALA D 196 1 9 +HELIX 50 50 THR D 212 LEU D 216 1 5 +HELIX 51 51 THR D 217 HIS D 226 1 10 +SHEET 1 A 3 PHE C 19 ASN C 29 0 +SHEET 2 A 3 LYS C 3 TYR C 14 -1 N ALA C 4 O LEU C 28 +SHEET 3 A 3 GLN C 59 VAL C 64 -1 O GLU C 63 N SER C 6 +SHEET 1 B 6 ILE C 68 VAL C 71 0 +SHEET 2 B 6 LEU C 149 LEU C 152 1 O LEU C 149 N GLY C 69 +SHEET 3 B 6 THR C 181 THR C 186 1 O VAL C 183 N LEU C 152 +SHEET 4 B 6 ILE C 33 LEU C 37 1 N LEU C 34 O VAL C 182 +SHEET 5 B 6 LYS C 198 ASN C 203 1 O LEU C 200 N ALA C 35 +SHEET 6 B 6 ASN C 206 GLU C 211 -1 O LYS C 208 N LEU C 201 +SHEET 1 C 2 MET C 229 TYR C 236 0 +SHEET 2 C 2 SER C 239 PRO C 246 -1 O HIS C 243 N GLN C 232 +SHEET 1 D 3 LEU D 24 ASN D 29 0 +SHEET 2 D 3 LYS D 3 GLY D 11 -1 N ALA D 4 O LEU D 28 +SHEET 3 D 3 GLN D 59 VAL D 64 -1 O GLU D 63 N SER D 6 +SHEET 1 E 6 ILE D 68 VAL D 71 0 +SHEET 2 E 6 LEU D 149 LEU D 152 1 O LEU D 151 N VAL D 71 +SHEET 3 E 6 THR D 181 THR D 186 1 O VAL D 183 N LEU D 152 +SHEET 4 E 6 ILE D 33 GLY D 38 1 N LEU D 34 O VAL D 182 +SHEET 5 E 6 LYS D 198 LEU D 202 1 O LEU D 202 N LEU D 37 +SHEET 6 E 6 PHE D 207 GLU D 211 -1 O GLY D 210 N THR D 199 +SHEET 1 F 2 MET D 229 TYR D 236 0 +SHEET 2 F 2 SER D 239 PRO D 246 -1 O SER D 239 N TYR D 236 +CISPEP 1 ASP A 51 PRO A 52 0 -0.21 +CRYST1 97.846 142.465 150.268 90.00 90.00 90.00 P 21 21 21 8 +ORIGX1 1.000000 0.000000 0.000000 0.00000 +ORIGX2 0.000000 1.000000 0.000000 0.00000 +ORIGX3 0.000000 0.000000 1.000000 0.00000 +SCALE1 0.010220 0.000000 0.000000 0.00000 +SCALE2 0.000000 0.007019 0.000000 0.00000 +SCALE3 0.000000 0.000000 0.006655 0.00000 +ATOM 1 N TYR A 6 -23.166 -7.488 19.780 1.00 84.99 N +ATOM 2 CA TYR A 6 -22.296 -7.260 20.972 1.00 85.30 C +ATOM 3 C TYR A 6 -22.638 -8.213 22.115 1.00 84.73 C +ATOM 4 O TYR A 6 -21.792 -8.985 22.564 1.00 84.22 O +ATOM 5 CB TYR A 6 -22.429 -5.813 21.465 1.00 86.56 C +ATOM 6 CG TYR A 6 -21.671 -5.527 22.749 1.00 87.86 C +ATOM 7 CD1 TYR A 6 -22.221 -4.708 23.737 1.00 88.50 C +ATOM 8 CD2 TYR A 6 -20.407 -6.076 22.979 1.00 88.78 C +ATOM 9 CE1 TYR A 6 -21.533 -4.444 24.924 1.00 89.16 C +ATOM 10 CE2 TYR A 6 -19.709 -5.817 24.161 1.00 89.23 C +ATOM 11 CZ TYR A 6 -20.278 -5.002 25.129 1.00 89.37 C +ATOM 12 OH TYR A 6 -19.598 -4.750 26.300 1.00 88.74 O +ATOM 13 N PRO A 7 -23.888 -8.171 22.605 1.00 84.54 N +ATOM 14 CA PRO A 7 -24.268 -9.065 23.704 1.00 83.86 C +ATOM 15 C PRO A 7 -24.041 -10.527 23.336 1.00 82.66 C +ATOM 16 O PRO A 7 -23.681 -11.346 24.181 1.00 82.89 O +ATOM 17 CB PRO A 7 -25.743 -8.736 23.916 1.00 84.57 C +ATOM 18 CG PRO A 7 -26.199 -8.374 22.530 1.00 84.68 C +ATOM 19 CD PRO A 7 -25.074 -7.489 22.054 1.00 84.49 C +ATOM 20 N LYS A 8 -24.251 -10.841 22.062 1.00 80.85 N +ATOM 21 CA LYS A 8 -24.068 -12.198 21.569 1.00 79.35 C +ATOM 22 C LYS A 8 -22.614 -12.629 21.731 1.00 77.29 C +ATOM 23 O LYS A 8 -22.332 -13.803 21.964 1.00 77.76 O +ATOM 24 CB LYS A 8 -24.480 -12.280 20.097 1.00 80.63 C +ATOM 25 CG LYS A 8 -24.407 -13.674 19.500 1.00 82.54 C +ATOM 26 CD LYS A 8 -24.903 -13.685 18.061 1.00 84.24 C +ATOM 27 CE LYS A 8 -24.880 -15.092 17.474 1.00 85.26 C +ATOM 28 NZ LYS A 8 -25.389 -15.121 16.070 1.00 86.27 N +ATOM 29 N ILE A 9 -21.692 -11.678 21.609 1.00 74.96 N +ATOM 30 CA ILE A 9 -20.269 -11.977 21.751 1.00 72.61 C +ATOM 31 C ILE A 9 -19.894 -12.143 23.221 1.00 70.90 C +ATOM 32 O ILE A 9 -19.156 -13.059 23.577 1.00 69.85 O +ATOM 33 CB ILE A 9 -19.387 -10.864 21.128 1.00 72.53 C +ATOM 34 CG1 ILE A 9 -19.612 -10.806 19.614 1.00 71.79 C +ATOM 35 CG2 ILE A 9 -17.917 -11.128 21.434 1.00 71.18 C +ATOM 36 CD1 ILE A 9 -18.834 -9.710 18.916 0.00 71.98 C +ATOM 37 N LEU A 10 -20.405 -11.258 24.073 1.00 69.96 N +ATOM 38 CA LEU A 10 -20.114 -11.330 25.499 1.00 70.21 C +ATOM 39 C LEU A 10 -20.664 -12.614 26.097 1.00 71.29 C +ATOM 40 O LEU A 10 -19.992 -13.284 26.883 1.00 71.58 O +ATOM 41 CB LEU A 10 -20.717 -10.135 26.238 1.00 69.18 C +ATOM 42 CG LEU A 10 -20.137 -8.750 25.951 1.00 69.62 C +ATOM 43 CD1 LEU A 10 -20.744 -7.756 26.929 1.00 68.82 C +ATOM 44 CD2 LEU A 10 -18.617 -8.769 26.091 1.00 68.57 C +ATOM 45 N PHE A 11 -21.894 -12.952 25.724 1.00 71.90 N +ATOM 46 CA PHE A 11 -22.532 -14.157 26.227 1.00 72.34 C +ATOM 47 C PHE A 11 -21.742 -15.383 25.790 1.00 71.61 C +ATOM 48 O PHE A 11 -21.643 -16.364 26.528 1.00 71.42 O +ATOM 49 CB PHE A 11 -23.975 -14.237 25.721 1.00 73.81 C +ATOM 50 CG PHE A 11 -24.717 -15.454 26.192 1.00 75.45 C +ATOM 51 CD1 PHE A 11 -24.703 -16.628 25.443 1.00 75.74 C +ATOM 52 CD2 PHE A 11 -25.417 -15.435 27.395 1.00 76.66 C +ATOM 53 CE1 PHE A 11 -25.377 -17.767 25.886 1.00 76.30 C +ATOM 54 CE2 PHE A 11 -26.094 -16.567 27.847 1.00 76.97 C +ATOM 55 CZ PHE A 11 -26.073 -17.735 27.090 1.00 76.59 C +ATOM 56 N GLY A 12 -21.170 -15.315 24.592 1.00 70.91 N +ATOM 57 CA GLY A 12 -20.385 -16.424 24.081 1.00 69.84 C +ATOM 58 C GLY A 12 -19.074 -16.597 24.829 1.00 69.44 C +ATOM 59 O GLY A 12 -18.683 -17.716 25.161 1.00 68.67 O +ATOM 60 N LEU A 13 -18.390 -15.488 25.095 1.00 68.78 N +ATOM 61 CA LEU A 13 -17.123 -15.535 25.812 1.00 68.09 C +ATOM 62 C LEU A 13 -17.334 -15.946 27.260 1.00 68.07 C +ATOM 63 O LEU A 13 -16.511 -16.657 27.835 1.00 67.59 O +ATOM 64 CB LEU A 13 -16.430 -14.174 25.765 1.00 66.92 C +ATOM 65 CG LEU A 13 -15.925 -13.725 24.395 1.00 66.91 C +ATOM 66 CD1 LEU A 13 -15.236 -12.372 24.532 1.00 66.32 C +ATOM 67 CD2 LEU A 13 -14.970 -14.768 23.827 1.00 65.13 C +ATOM 68 N THR A 14 -18.436 -15.490 27.848 1.00 69.17 N +ATOM 69 CA THR A 14 -18.750 -15.823 29.231 1.00 70.47 C +ATOM 70 C THR A 14 -19.257 -17.265 29.295 1.00 70.97 C +ATOM 71 O THR A 14 -19.623 -17.764 30.356 1.00 71.52 O +ATOM 72 CB THR A 14 -19.812 -14.860 29.812 1.00 70.50 C +ATOM 73 OG1 THR A 14 -19.996 -15.130 31.208 1.00 70.75 O +ATOM 74 CG2 THR A 14 -21.135 -15.028 29.091 1.00 72.18 C +ATOM 75 N LEU A 15 -19.269 -17.925 28.140 1.00 71.58 N +ATOM 76 CA LEU A 15 -19.693 -19.316 28.039 1.00 71.65 C +ATOM 77 C LEU A 15 -18.433 -20.175 28.106 1.00 71.33 C +ATOM 78 O LEU A 15 -18.364 -21.126 28.882 1.00 71.94 O +ATOM 79 CB LEU A 15 -20.406 -19.567 26.710 1.00 73.23 C +ATOM 80 CG LEU A 15 -21.022 -20.955 26.516 1.00 74.67 C +ATOM 81 CD1 LEU A 15 -22.367 -21.009 27.222 1.00 74.66 C +ATOM 82 CD2 LEU A 15 -21.195 -21.248 25.032 1.00 74.78 C +ATOM 83 N LEU A 16 -17.440 -19.833 27.284 1.00 70.85 N +ATOM 84 CA LEU A 16 -16.169 -20.560 27.262 1.00 69.85 C +ATOM 85 C LEU A 16 -15.546 -20.513 28.648 1.00 67.90 C +ATOM 86 O LEU A 16 -14.964 -21.489 29.114 1.00 67.15 O +ATOM 87 CB LEU A 16 -15.186 -19.926 26.273 1.00 70.69 C +ATOM 88 CG LEU A 16 -15.425 -20.030 24.769 1.00 72.54 C +ATOM 89 CD1 LEU A 16 -14.239 -19.402 24.055 1.00 73.03 C +ATOM 90 CD2 LEU A 16 -15.576 -21.485 24.347 1.00 73.34 C +ATOM 91 N LEU A 17 -15.663 -19.356 29.287 1.00 65.98 N +ATOM 92 CA LEU A 17 -15.131 -19.147 30.622 1.00 65.42 C +ATOM 93 C LEU A 17 -15.616 -20.281 31.530 1.00 65.03 C +ATOM 94 O LEU A 17 -14.826 -20.908 32.234 1.00 64.78 O +ATOM 95 CB LEU A 17 -15.613 -17.792 31.151 1.00 65.43 C +ATOM 96 CG LEU A 17 -15.053 -17.175 32.438 1.00 65.86 C +ATOM 97 CD1 LEU A 17 -15.312 -18.085 33.629 1.00 65.64 C +ATOM 98 CD2 LEU A 17 -13.577 -16.918 32.266 1.00 66.40 C +ATOM 99 N VAL A 18 -16.919 -20.548 31.501 1.00 64.68 N +ATOM 100 CA VAL A 18 -17.503 -21.602 32.325 1.00 63.65 C +ATOM 101 C VAL A 18 -17.130 -22.992 31.819 1.00 62.88 C +ATOM 102 O VAL A 18 -16.723 -23.855 32.596 1.00 62.45 O +ATOM 103 CB VAL A 18 -19.039 -21.480 32.376 1.00 64.39 C +ATOM 104 CG1 VAL A 18 -19.636 -22.682 33.095 1.00 65.80 C +ATOM 105 CG2 VAL A 18 -19.429 -20.192 33.090 1.00 63.76 C +ATOM 106 N ILE A 19 -17.267 -23.204 30.515 1.00 61.85 N +ATOM 107 CA ILE A 19 -16.934 -24.489 29.915 1.00 61.69 C +ATOM 108 C ILE A 19 -15.488 -24.900 30.205 1.00 61.60 C +ATOM 109 O ILE A 19 -15.220 -26.061 30.523 1.00 61.80 O +ATOM 110 CB ILE A 19 -17.157 -24.457 28.386 1.00 63.16 C +ATOM 111 CG1 ILE A 19 -18.646 -24.250 28.082 1.00 63.42 C +ATOM 112 CG2 ILE A 19 -16.656 -25.744 27.755 1.00 62.94 C +ATOM 113 CD1 ILE A 19 -18.966 -24.152 26.605 0.00 63.52 C +ATOM 114 N THR A 20 -14.556 -23.954 30.102 1.00 60.30 N +ATOM 115 CA THR A 20 -13.150 -24.253 30.360 1.00 59.01 C +ATOM 116 C THR A 20 -12.890 -24.418 31.856 1.00 57.61 C +ATOM 117 O THR A 20 -11.990 -25.150 32.256 1.00 56.20 O +ATOM 118 CB THR A 20 -12.217 -23.147 29.821 1.00 59.79 C +ATOM 119 OG1 THR A 20 -12.427 -21.941 30.563 1.00 62.81 O +ATOM 120 CG2 THR A 20 -12.490 -22.883 28.349 1.00 60.57 C +ATOM 121 N ALA A 21 -13.672 -23.729 32.679 1.00 57.11 N +ATOM 122 CA ALA A 21 -13.520 -23.827 34.125 1.00 58.20 C +ATOM 123 C ALA A 21 -13.938 -25.233 34.551 1.00 59.70 C +ATOM 124 O ALA A 21 -13.218 -25.917 35.286 1.00 58.46 O +ATOM 125 CB ALA A 21 -14.392 -22.787 34.821 1.00 56.75 C +ATOM 126 N VAL A 22 -15.107 -25.656 34.080 1.00 60.17 N +ATOM 127 CA VAL A 22 -15.619 -26.979 34.401 1.00 60.85 C +ATOM 128 C VAL A 22 -14.646 -28.031 33.888 1.00 61.21 C +ATOM 129 O VAL A 22 -14.253 -28.935 34.628 1.00 60.34 O +ATOM 130 CB VAL A 22 -17.016 -27.211 33.769 1.00 61.51 C +ATOM 131 CG1 VAL A 22 -17.400 -28.685 33.862 1.00 61.36 C +ATOM 132 CG2 VAL A 22 -18.054 -26.353 34.488 1.00 60.83 C +ATOM 133 N ILE A 23 -14.251 -27.903 32.625 1.00 60.84 N +ATOM 134 CA ILE A 23 -13.318 -28.850 32.028 1.00 61.50 C +ATOM 135 C ILE A 23 -12.031 -28.934 32.850 1.00 62.28 C +ATOM 136 O ILE A 23 -11.394 -29.987 32.917 1.00 63.04 O +ATOM 137 CB ILE A 23 -12.983 -28.457 30.569 1.00 61.55 C +ATOM 138 CG1 ILE A 23 -14.226 -28.627 29.690 1.00 61.61 C +ATOM 139 CG2 ILE A 23 -11.850 -29.316 30.038 1.00 61.25 C +ATOM 140 CD1 ILE A 23 -14.021 -28.214 28.247 0.00 61.77 C +ATOM 141 N SER A 24 -11.656 -27.827 33.483 1.00 62.18 N +ATOM 142 CA SER A 24 -10.449 -27.798 34.303 1.00 62.23 C +ATOM 143 C SER A 24 -10.523 -28.875 35.380 1.00 62.31 C +ATOM 144 O SER A 24 -9.526 -29.532 35.689 1.00 61.96 O +ATOM 145 CB SER A 24 -10.283 -26.427 34.967 1.00 61.70 C +ATOM 146 OG SER A 24 -10.039 -25.417 34.006 1.00 61.07 O +ATOM 147 N LEU A 25 -11.713 -29.047 35.949 1.00 61.93 N +ATOM 148 CA LEU A 25 -11.932 -30.044 36.991 1.00 61.42 C +ATOM 149 C LEU A 25 -11.560 -31.440 36.506 1.00 61.05 C +ATOM 150 O LEU A 25 -11.377 -32.351 37.310 1.00 61.25 O +ATOM 151 CB LEU A 25 -13.395 -30.033 37.425 1.00 60.18 C +ATOM 152 CG LEU A 25 -13.924 -28.684 37.903 1.00 59.60 C +ATOM 153 CD1 LEU A 25 -15.430 -28.774 38.125 1.00 58.70 C +ATOM 154 CD2 LEU A 25 -13.198 -28.276 39.176 1.00 57.55 C +ATOM 155 N GLY A 26 -11.446 -31.596 35.190 1.00 60.95 N +ATOM 156 CA GLY A 26 -11.101 -32.883 34.618 1.00 61.97 C +ATOM 157 C GLY A 26 -9.617 -33.093 34.372 1.00 63.47 C +ATOM 158 O GLY A 26 -9.232 -33.900 33.527 1.00 63.50 O +ATOM 159 N ILE A 27 -8.779 -32.374 35.108 1.00 64.79 N +ATOM 160 CA ILE A 27 -7.336 -32.502 34.952 1.00 66.83 C +ATOM 161 C ILE A 27 -6.645 -32.631 36.307 1.00 67.90 C +ATOM 162 O ILE A 27 -7.024 -31.970 37.276 1.00 67.68 O +ATOM 163 CB ILE A 27 -6.743 -31.280 34.214 1.00 67.74 C +ATOM 164 CG1 ILE A 27 -7.369 -31.151 32.824 1.00 68.04 C +ATOM 165 CG2 ILE A 27 -5.230 -31.424 34.103 1.00 68.20 C +ATOM 166 CD1 ILE A 27 -6.891 -29.945 32.041 0.00 67.87 C +ATOM 167 N GLY A 28 -5.633 -33.489 36.371 1.00 69.67 N +ATOM 168 CA GLY A 28 -4.899 -33.673 37.610 1.00 72.11 C +ATOM 169 C GLY A 28 -5.289 -34.893 38.424 1.00 73.83 C +ATOM 170 O GLY A 28 -6.224 -35.620 38.082 1.00 74.68 O +ATOM 171 N ARG A 29 -4.555 -35.114 39.509 1.00 74.51 N +ATOM 172 CA ARG A 29 -4.799 -36.235 40.406 1.00 74.74 C +ATOM 173 C ARG A 29 -6.207 -36.102 40.982 1.00 74.48 C +ATOM 174 O ARG A 29 -6.681 -34.990 41.216 1.00 73.39 O +ATOM 175 CB ARG A 29 -3.774 -36.215 41.543 1.00 76.09 C +ATOM 176 CG ARG A 29 -3.750 -37.464 42.405 1.00 79.60 C +ATOM 177 CD ARG A 29 -2.873 -38.555 41.790 1.00 82.72 C +ATOM 178 NE ARG A 29 -2.880 -39.783 42.585 1.00 83.86 N +ATOM 179 CZ ARG A 29 -2.585 -39.842 43.881 1.00 83.87 C +ATOM 180 NH1 ARG A 29 -2.619 -41.005 44.519 1.00 83.46 N +ATOM 181 NH2 ARG A 29 -2.260 -38.737 44.543 1.00 83.41 N +ATOM 182 N TYR A 30 -6.873 -37.232 41.204 1.00 75.02 N +ATOM 183 CA TYR A 30 -8.224 -37.233 41.761 1.00 75.44 C +ATOM 184 C TYR A 30 -9.173 -36.322 40.986 1.00 75.02 C +ATOM 185 O TYR A 30 -9.965 -35.599 41.584 1.00 74.05 O +ATOM 186 CB TYR A 30 -8.186 -36.781 43.225 1.00 77.12 C +ATOM 187 CG TYR A 30 -7.430 -37.703 44.164 1.00 79.53 C +ATOM 188 CD1 TYR A 30 -6.957 -37.236 45.390 1.00 80.60 C +ATOM 189 CD2 TYR A 30 -7.206 -39.041 43.842 1.00 80.56 C +ATOM 190 CE1 TYR A 30 -6.280 -38.077 46.271 1.00 81.57 C +ATOM 191 CE2 TYR A 30 -6.531 -39.890 44.717 1.00 81.06 C +ATOM 192 CZ TYR A 30 -6.070 -39.402 45.929 1.00 81.12 C +ATOM 193 OH TYR A 30 -5.401 -40.234 46.801 1.00 81.01 O +ATOM 194 N SER A 31 -9.100 -36.362 39.660 1.00 75.86 N +ATOM 195 CA SER A 31 -9.958 -35.522 38.828 1.00 78.95 C +ATOM 196 C SER A 31 -11.230 -36.236 38.360 1.00 80.81 C +ATOM 197 O SER A 31 -11.680 -37.199 38.981 1.00 81.74 O +ATOM 198 CB SER A 31 -9.170 -35.013 37.611 1.00 78.42 C +ATOM 199 OG SER A 31 -8.680 -36.082 36.815 1.00 78.11 O +ATOM 200 N LEU A 32 -11.814 -35.736 37.273 1.00 82.52 N +ATOM 201 CA LEU A 32 -13.021 -36.309 36.681 1.00 83.55 C +ATOM 202 C LEU A 32 -12.652 -36.726 35.263 1.00 86.26 C +ATOM 203 O LEU A 32 -11.518 -36.503 34.835 1.00 86.37 O +ATOM 204 CB LEU A 32 -14.145 -35.271 36.650 1.00 81.58 C +ATOM 205 CG LEU A 32 -14.816 -34.895 37.978 1.00 80.76 C +ATOM 206 CD1 LEU A 32 -13.777 -34.488 39.006 1.00 80.72 C +ATOM 207 CD2 LEU A 32 -15.802 -33.762 37.740 1.00 79.54 C +ATOM 208 N SER A 33 -13.588 -37.324 34.529 1.00 89.58 N +ATOM 209 CA SER A 33 -13.289 -37.761 33.163 1.00 92.43 C +ATOM 210 C SER A 33 -14.465 -37.697 32.192 1.00 94.01 C +ATOM 211 O SER A 33 -14.303 -37.316 31.032 1.00 93.58 O +ATOM 212 CB SER A 33 -12.731 -39.189 33.182 1.00 92.84 C +ATOM 213 OG SER A 33 -12.422 -39.636 31.872 1.00 93.42 O +ATOM 214 N VAL A 34 -15.643 -38.083 32.664 1.00 96.85 N +ATOM 215 CA VAL A 34 -16.835 -38.073 31.825 1.00 99.00 C +ATOM 216 C VAL A 34 -18.004 -37.290 32.430 1.00100.50 C +ATOM 217 O VAL A 34 -18.890 -36.835 31.703 1.00100.76 O +ATOM 218 CB VAL A 34 -17.304 -39.516 31.514 1.00 98.72 C +ATOM 219 CG1 VAL A 34 -17.708 -40.223 32.798 1.00 98.58 C +ATOM 220 CG2 VAL A 34 -18.458 -39.489 30.525 1.00 98.88 C +ATOM 221 N PRO A 35 -18.027 -37.122 33.767 1.00101.53 N +ATOM 222 CA PRO A 35 -19.136 -36.374 34.365 1.00102.25 C +ATOM 223 C PRO A 35 -19.360 -35.015 33.703 1.00103.44 C +ATOM 224 O PRO A 35 -18.506 -34.128 33.771 1.00103.21 O +ATOM 225 CB PRO A 35 -18.712 -36.250 35.825 1.00102.17 C +ATOM 226 CG PRO A 35 -17.980 -37.531 36.058 1.00101.40 C +ATOM 227 CD PRO A 35 -17.124 -37.633 34.816 1.00101.62 C +ATOM 228 N GLN A 36 -20.514 -34.871 33.056 1.00104.65 N +ATOM 229 CA GLN A 36 -20.878 -33.630 32.380 1.00105.18 C +ATOM 230 C GLN A 36 -21.685 -32.777 33.357 1.00105.21 C +ATOM 231 O GLN A 36 -22.893 -32.973 33.520 1.00105.30 O +ATOM 232 CB GLN A 36 -21.713 -33.940 31.132 1.00105.09 C +ATOM 233 CG GLN A 36 -21.872 -32.777 30.155 1.00105.97 C +ATOM 234 CD GLN A 36 -22.688 -31.624 30.715 1.00106.33 C +ATOM 235 OE1 GLN A 36 -23.847 -31.794 31.095 1.00106.54 O +ATOM 236 NE2 GLN A 36 -22.084 -30.440 30.761 1.00106.02 N +ATOM 237 N ILE A 37 -21.007 -31.837 34.010 1.00104.63 N +ATOM 238 CA ILE A 37 -21.647 -30.957 34.982 1.00103.65 C +ATOM 239 C ILE A 37 -22.244 -29.724 34.311 1.00103.23 C +ATOM 240 O ILE A 37 -22.695 -29.783 33.167 1.00102.51 O +ATOM 241 CB ILE A 37 -20.639 -30.495 36.060 1.00103.33 C +ATOM 242 CG1 ILE A 37 -20.025 -31.713 36.756 1.00102.74 C +ATOM 243 CG2 ILE A 37 -21.336 -29.605 37.077 1.00102.57 C +ATOM 244 CD1 ILE A 37 -18.977 -31.366 37.795 0.00101.93 C +ATOM 245 N ASP A 51 -15.206 -36.708 45.993 1.00 89.41 N +ATOM 246 CA ASP A 51 -16.369 -37.575 45.906 1.00 88.88 C +ATOM 247 C ASP A 51 -16.020 -38.959 46.452 1.00 88.36 C +ATOM 248 O ASP A 51 -16.038 -39.948 45.716 1.00 88.05 O +ATOM 249 CB ASP A 51 -16.822 -37.685 44.449 1.00 89.41 C +ATOM 250 CG ASP A 51 -18.210 -38.264 44.314 1.00 88.97 C +ATOM 251 OD1 ASP A 51 -18.430 -39.388 44.805 1.00 89.21 O +ATOM 252 OD2 ASP A 51 -19.079 -37.594 43.716 1.00 89.38 O +ATOM 253 N PRO A 52 -15.676 -39.040 47.752 1.00 87.41 N +ATOM 254 CA PRO A 52 -15.605 -37.908 48.684 1.00 86.06 C +ATOM 255 C PRO A 52 -14.274 -37.165 48.549 1.00 84.59 C +ATOM 256 O PRO A 52 -14.174 -35.977 48.865 1.00 84.40 O +ATOM 257 CB PRO A 52 -15.757 -38.582 50.040 1.00 85.89 C +ATOM 258 CG PRO A 52 -14.994 -39.849 49.839 1.00 86.68 C +ATOM 259 CD PRO A 52 -15.467 -40.313 48.469 1.00 87.02 C +ATOM 260 N VAL A 53 -13.257 -37.879 48.073 1.00 82.29 N +ATOM 261 CA VAL A 53 -11.931 -37.306 47.881 1.00 80.10 C +ATOM 262 C VAL A 53 -11.964 -36.237 46.786 1.00 80.02 C +ATOM 263 O VAL A 53 -11.461 -35.128 46.972 1.00 79.50 O +ATOM 264 CB VAL A 53 -10.906 -38.406 47.504 1.00 78.84 C +ATOM 265 CG1 VAL A 53 -11.353 -39.137 46.253 1.00 77.19 C +ATOM 266 CG2 VAL A 53 -9.537 -37.794 47.297 1.00 78.39 C +ATOM 267 N GLN A 54 -12.563 -36.580 45.649 1.00 79.14 N +ATOM 268 CA GLN A 54 -12.683 -35.667 44.518 1.00 78.62 C +ATOM 269 C GLN A 54 -13.308 -34.347 44.952 1.00 78.30 C +ATOM 270 O GLN A 54 -12.826 -33.269 44.604 1.00 78.34 O +ATOM 271 CB GLN A 54 -13.556 -36.292 43.430 1.00 78.10 C +ATOM 272 CG GLN A 54 -12.965 -37.520 42.763 1.00 78.01 C +ATOM 273 CD GLN A 54 -13.940 -38.178 41.805 1.00 77.91 C +ATOM 274 OE1 GLN A 54 -13.565 -39.042 41.014 1.00 78.55 O +ATOM 275 NE2 GLN A 54 -15.204 -37.776 41.878 1.00 77.47 N +ATOM 276 N GLN A 55 -14.388 -34.450 45.715 1.00 77.80 N +ATOM 277 CA GLN A 55 -15.112 -33.290 46.200 1.00 77.73 C +ATOM 278 C GLN A 55 -14.224 -32.365 47.023 1.00 77.19 C +ATOM 279 O GLN A 55 -14.375 -31.146 46.967 1.00 77.64 O +ATOM 280 CB GLN A 55 -16.319 -33.749 47.023 1.00 78.99 C +ATOM 281 CG GLN A 55 -17.288 -32.642 47.404 1.00 80.74 C +ATOM 282 CD GLN A 55 -18.593 -33.183 47.964 1.00 82.49 C +ATOM 283 OE1 GLN A 55 -19.479 -32.420 48.352 1.00 83.21 O +ATOM 284 NE2 GLN A 55 -18.718 -34.507 48.003 1.00 82.37 N +ATOM 285 N GLN A 56 -13.297 -32.939 47.785 1.00 76.29 N +ATOM 286 CA GLN A 56 -12.399 -32.130 48.604 1.00 74.95 C +ATOM 287 C GLN A 56 -11.260 -31.547 47.766 1.00 72.92 C +ATOM 288 O GLN A 56 -10.754 -30.465 48.062 1.00 72.68 O +ATOM 289 CB GLN A 56 -11.831 -32.960 49.759 1.00 75.85 C +ATOM 290 CG GLN A 56 -12.870 -33.370 50.790 1.00 78.00 C +ATOM 291 CD GLN A 56 -12.254 -34.061 51.993 1.00 80.23 C +ATOM 292 OE1 GLN A 56 -11.439 -33.475 52.708 1.00 81.32 O +ATOM 293 NE2 GLN A 56 -12.641 -35.315 52.223 1.00 80.45 N +ATOM 294 N VAL A 57 -10.861 -32.271 46.725 1.00 70.26 N +ATOM 295 CA VAL A 57 -9.801 -31.811 45.839 1.00 68.64 C +ATOM 296 C VAL A 57 -10.322 -30.633 45.019 1.00 67.50 C +ATOM 297 O VAL A 57 -9.573 -29.717 44.681 1.00 67.10 O +ATOM 298 CB VAL A 57 -9.338 -32.943 44.889 1.00 68.84 C +ATOM 299 CG1 VAL A 57 -8.494 -32.377 43.757 1.00 68.37 C +ATOM 300 CG2 VAL A 57 -8.525 -33.960 45.671 1.00 69.44 C +ATOM 301 N ILE A 58 -11.614 -30.661 44.714 1.00 65.28 N +ATOM 302 CA ILE A 58 -12.245 -29.596 43.953 1.00 63.62 C +ATOM 303 C ILE A 58 -12.407 -28.333 44.798 1.00 63.76 C +ATOM 304 O ILE A 58 -11.972 -27.257 44.398 1.00 63.90 O +ATOM 305 CB ILE A 58 -13.636 -30.038 43.423 1.00 63.02 C +ATOM 306 CG1 ILE A 58 -13.461 -31.003 42.248 1.00 61.71 C +ATOM 307 CG2 ILE A 58 -14.462 -28.823 43.010 1.00 62.13 C +ATOM 308 CD1 ILE A 58 -14.765 -31.537 41.689 0.00 62.22 C +ATOM 309 N PHE A 59 -13.014 -28.469 45.972 1.00 63.57 N +ATOM 310 CA PHE A 59 -13.253 -27.322 46.846 1.00 65.08 C +ATOM 311 C PHE A 59 -12.027 -26.698 47.513 1.00 64.74 C +ATOM 312 O PHE A 59 -11.967 -25.477 47.679 1.00 63.94 O +ATOM 313 CB PHE A 59 -14.269 -27.693 47.937 1.00 67.02 C +ATOM 314 CG PHE A 59 -15.663 -27.963 47.420 1.00 70.27 C +ATOM 315 CD1 PHE A 59 -16.642 -28.477 48.270 1.00 71.63 C +ATOM 316 CD2 PHE A 59 -15.999 -27.711 46.091 1.00 70.80 C +ATOM 317 CE1 PHE A 59 -17.934 -28.739 47.802 1.00 72.55 C +ATOM 318 CE2 PHE A 59 -17.287 -27.969 45.615 1.00 71.39 C +ATOM 319 CZ PHE A 59 -18.255 -28.484 46.471 1.00 72.08 C +ATOM 320 N GLN A 60 -11.053 -27.519 47.891 1.00 64.51 N +ATOM 321 CA GLN A 60 -9.872 -27.005 48.576 1.00 64.06 C +ATOM 322 C GLN A 60 -8.624 -26.810 47.709 1.00 62.39 C +ATOM 323 O GLN A 60 -7.747 -26.017 48.056 1.00 61.52 O +ATOM 324 CB GLN A 60 -9.535 -27.909 49.771 1.00 65.73 C +ATOM 325 CG GLN A 60 -10.725 -28.185 50.691 1.00 70.15 C +ATOM 326 CD GLN A 60 -10.340 -28.900 51.985 1.00 73.13 C +ATOM 327 OE1 GLN A 60 -11.198 -29.454 52.678 1.00 73.10 O +ATOM 328 NE2 GLN A 60 -9.051 -28.878 52.322 1.00 73.62 N +ATOM 329 N VAL A 61 -8.541 -27.511 46.583 1.00 60.58 N +ATOM 330 CA VAL A 61 -7.371 -27.382 45.723 1.00 59.87 C +ATOM 331 C VAL A 61 -7.646 -26.772 44.346 1.00 59.53 C +ATOM 332 O VAL A 61 -7.299 -25.622 44.088 1.00 58.65 O +ATOM 333 CB VAL A 61 -6.676 -28.757 45.522 1.00 60.48 C +ATOM 334 CG1 VAL A 61 -5.485 -28.616 44.584 1.00 59.25 C +ATOM 335 CG2 VAL A 61 -6.224 -29.314 46.866 1.00 59.72 C +ATOM 336 N ARG A 62 -8.271 -27.559 43.477 1.00 59.37 N +ATOM 337 CA ARG A 62 -8.584 -27.164 42.107 1.00 59.05 C +ATOM 338 C ARG A 62 -9.353 -25.853 41.919 1.00 59.53 C +ATOM 339 O ARG A 62 -8.875 -24.939 41.246 1.00 61.00 O +ATOM 340 CB ARG A 62 -9.348 -28.298 41.430 1.00 58.92 C +ATOM 341 CG ARG A 62 -9.194 -28.338 39.929 1.00 61.63 C +ATOM 342 CD ARG A 62 -8.822 -29.740 39.498 1.00 62.88 C +ATOM 343 NE ARG A 62 -7.576 -30.176 40.124 1.00 63.84 N +ATOM 344 CZ ARG A 62 -7.225 -31.449 40.285 1.00 64.11 C +ATOM 345 NH1 ARG A 62 -6.069 -31.752 40.862 1.00 62.43 N +ATOM 346 NH2 ARG A 62 -8.037 -32.419 39.884 1.00 63.45 N +ATOM 347 N LEU A 63 -10.545 -25.763 42.499 1.00 58.62 N +ATOM 348 CA LEU A 63 -11.362 -24.562 42.363 1.00 57.09 C +ATOM 349 C LEU A 63 -10.578 -23.292 42.686 1.00 56.48 C +ATOM 350 O LEU A 63 -10.609 -22.329 41.921 1.00 56.73 O +ATOM 351 CB LEU A 63 -12.603 -24.658 43.256 1.00 55.89 C +ATOM 352 CG LEU A 63 -13.650 -23.545 43.150 1.00 57.37 C +ATOM 353 CD1 LEU A 63 -14.135 -23.425 41.710 1.00 55.57 C +ATOM 354 CD2 LEU A 63 -14.819 -23.849 44.087 1.00 55.80 C +ATOM 355 N PRO A 64 -9.863 -23.273 43.825 1.00 55.77 N +ATOM 356 CA PRO A 64 -9.076 -22.102 44.225 1.00 54.20 C +ATOM 357 C PRO A 64 -8.091 -21.638 43.147 1.00 53.77 C +ATOM 358 O PRO A 64 -7.939 -20.435 42.918 1.00 51.30 O +ATOM 359 CB PRO A 64 -8.360 -22.583 45.486 1.00 54.43 C +ATOM 360 CG PRO A 64 -9.320 -23.558 46.058 1.00 54.60 C +ATOM 361 CD PRO A 64 -9.775 -24.328 44.850 1.00 55.78 C +ATOM 362 N ARG A 65 -7.420 -22.588 42.493 1.00 52.20 N +ATOM 363 CA ARG A 65 -6.464 -22.233 41.452 1.00 53.06 C +ATOM 364 C ARG A 65 -7.190 -21.749 40.198 1.00 52.88 C +ATOM 365 O ARG A 65 -6.772 -20.776 39.573 1.00 54.38 O +ATOM 366 CB ARG A 65 -5.555 -23.416 41.082 1.00 51.06 C +ATOM 367 CG ARG A 65 -4.325 -22.961 40.292 1.00 52.84 C +ATOM 368 CD ARG A 65 -3.703 -24.021 39.384 1.00 50.49 C +ATOM 369 NE ARG A 65 -2.682 -24.818 40.052 1.00 50.94 N +ATOM 370 CZ ARG A 65 -1.557 -25.232 39.474 1.00 51.78 C +ATOM 371 NH1 ARG A 65 -1.292 -24.920 38.210 1.00 50.17 N +ATOM 372 NH2 ARG A 65 -0.699 -25.974 40.159 1.00 52.35 N +ATOM 373 N ILE A 66 -8.273 -22.431 39.836 1.00 53.21 N +ATOM 374 CA ILE A 66 -9.057 -22.069 38.656 1.00 52.09 C +ATOM 375 C ILE A 66 -9.552 -20.623 38.732 1.00 52.16 C +ATOM 376 O ILE A 66 -9.406 -19.857 37.779 1.00 52.20 O +ATOM 377 CB ILE A 66 -10.279 -23.004 38.488 1.00 52.37 C +ATOM 378 CG1 ILE A 66 -9.809 -24.444 38.250 1.00 50.90 C +ATOM 379 CG2 ILE A 66 -11.148 -22.525 37.328 1.00 51.21 C +ATOM 380 CD1 ILE A 66 -10.935 -25.453 38.175 0.00 51.61 C +ATOM 381 N LEU A 67 -10.129 -20.252 39.871 1.00 50.43 N +ATOM 382 CA LEU A 67 -10.641 -18.902 40.053 1.00 49.76 C +ATOM 383 C LEU A 67 -9.513 -17.875 40.151 1.00 49.45 C +ATOM 384 O LEU A 67 -9.692 -16.713 39.783 1.00 48.40 O +ATOM 385 CB LEU A 67 -11.535 -18.833 41.300 1.00 48.98 C +ATOM 386 CG LEU A 67 -12.813 -19.687 41.251 1.00 50.12 C +ATOM 387 CD1 LEU A 67 -13.591 -19.547 42.549 1.00 49.04 C +ATOM 388 CD2 LEU A 67 -13.677 -19.255 40.076 1.00 49.83 C +ATOM 389 N THR A 68 -8.355 -18.303 40.647 1.00 47.84 N +ATOM 390 CA THR A 68 -7.210 -17.408 40.774 1.00 47.23 C +ATOM 391 C THR A 68 -6.658 -17.080 39.382 1.00 47.48 C +ATOM 392 O THR A 68 -6.332 -15.930 39.089 1.00 45.96 O +ATOM 393 CB THR A 68 -6.092 -18.041 41.639 1.00 46.86 C +ATOM 394 OG1 THR A 68 -6.570 -18.222 42.979 1.00 46.62 O +ATOM 395 CG2 THR A 68 -4.859 -17.141 41.675 1.00 45.76 C +ATOM 396 N ALA A 69 -6.559 -18.094 38.529 1.00 45.76 N +ATOM 397 CA ALA A 69 -6.066 -17.889 37.181 1.00 46.14 C +ATOM 398 C ALA A 69 -7.034 -16.966 36.452 1.00 47.41 C +ATOM 399 O ALA A 69 -6.617 -16.013 35.794 1.00 46.81 O +ATOM 400 CB ALA A 69 -5.956 -19.218 36.447 1.00 44.56 C +ATOM 401 N LEU A 70 -8.328 -17.249 36.585 1.00 47.47 N +ATOM 402 CA LEU A 70 -9.365 -16.452 35.939 1.00 46.43 C +ATOM 403 C LEU A 70 -9.308 -14.962 36.290 1.00 46.23 C +ATOM 404 O LEU A 70 -9.337 -14.113 35.402 1.00 46.67 O +ATOM 405 CB LEU A 70 -10.757 -17.001 36.286 1.00 45.68 C +ATOM 406 CG LEU A 70 -11.202 -18.319 35.642 1.00 45.74 C +ATOM 407 CD1 LEU A 70 -12.603 -18.668 36.119 1.00 43.86 C +ATOM 408 CD2 LEU A 70 -11.177 -18.202 34.128 1.00 42.48 C +ATOM 409 N CYS A 71 -9.234 -14.647 37.577 1.00 44.97 N +ATOM 410 CA CYS A 71 -9.190 -13.258 38.019 1.00 45.32 C +ATOM 411 C CYS A 71 -7.867 -12.573 37.684 1.00 45.69 C +ATOM 412 O CYS A 71 -7.834 -11.379 37.392 1.00 44.63 O +ATOM 413 CB CYS A 71 -9.444 -13.175 39.526 1.00 46.09 C +ATOM 414 SG CYS A 71 -11.099 -13.725 40.045 1.00 53.09 S +ATOM 415 N VAL A 72 -6.773 -13.324 37.736 1.00 43.89 N +ATOM 416 CA VAL A 72 -5.471 -12.757 37.433 1.00 41.53 C +ATOM 417 C VAL A 72 -5.341 -12.502 35.935 1.00 41.24 C +ATOM 418 O VAL A 72 -4.706 -11.539 35.514 1.00 41.42 O +ATOM 419 CB VAL A 72 -4.337 -13.686 37.938 1.00 40.80 C +ATOM 420 CG1 VAL A 72 -3.006 -13.342 37.267 1.00 37.58 C +ATOM 421 CG2 VAL A 72 -4.205 -13.530 39.446 1.00 38.19 C +ATOM 422 N GLY A 73 -5.960 -13.359 35.134 1.00 41.12 N +ATOM 423 CA GLY A 73 -5.906 -13.189 33.696 1.00 41.06 C +ATOM 424 C GLY A 73 -6.728 -11.974 33.309 1.00 42.55 C +ATOM 425 O GLY A 73 -6.328 -11.171 32.461 1.00 42.93 O +ATOM 426 N ALA A 74 -7.888 -11.844 33.942 1.00 40.51 N +ATOM 427 CA ALA A 74 -8.784 -10.732 33.690 1.00 41.13 C +ATOM 428 C ALA A 74 -8.109 -9.436 34.128 1.00 40.84 C +ATOM 429 O ALA A 74 -8.186 -8.420 33.438 1.00 39.78 O +ATOM 430 CB ALA A 74 -10.093 -10.935 34.460 1.00 39.82 C +ATOM 431 N GLY A 75 -7.441 -9.495 35.276 1.00 40.73 N +ATOM 432 CA GLY A 75 -6.753 -8.340 35.818 1.00 41.62 C +ATOM 433 C GLY A 75 -5.596 -7.840 34.972 1.00 42.36 C +ATOM 434 O GLY A 75 -5.536 -6.653 34.659 1.00 43.23 O +ATOM 435 N LEU A 76 -4.670 -8.725 34.610 1.00 41.50 N +ATOM 436 CA LEU A 76 -3.530 -8.316 33.791 1.00 42.00 C +ATOM 437 C LEU A 76 -3.988 -7.829 32.416 1.00 41.51 C +ATOM 438 O LEU A 76 -3.380 -6.932 31.841 1.00 40.91 O +ATOM 439 CB LEU A 76 -2.533 -9.466 33.624 1.00 39.94 C +ATOM 440 CG LEU A 76 -1.707 -9.815 34.862 1.00 41.82 C +ATOM 441 CD1 LEU A 76 -0.918 -11.095 34.604 1.00 40.67 C +ATOM 442 CD2 LEU A 76 -0.771 -8.661 35.205 1.00 40.77 C +ATOM 443 N ALA A 77 -5.053 -8.423 31.888 1.00 40.35 N +ATOM 444 CA ALA A 77 -5.566 -8.005 30.592 1.00 40.81 C +ATOM 445 C ALA A 77 -6.182 -6.609 30.742 1.00 43.03 C +ATOM 446 O ALA A 77 -5.942 -5.715 29.927 1.00 40.63 O +ATOM 447 CB ALA A 77 -6.605 -8.987 30.100 1.00 37.97 C +ATOM 448 N LEU A 78 -6.968 -6.432 31.801 1.00 43.21 N +ATOM 449 CA LEU A 78 -7.609 -5.156 32.071 1.00 44.90 C +ATOM 450 C LEU A 78 -6.543 -4.066 32.123 1.00 45.62 C +ATOM 451 O LEU A 78 -6.641 -3.053 31.429 1.00 46.00 O +ATOM 452 CB LEU A 78 -8.349 -5.201 33.412 1.00 44.43 C +ATOM 453 CG LEU A 78 -9.631 -4.372 33.544 1.00 45.43 C +ATOM 454 CD1 LEU A 78 -9.878 -4.058 35.016 1.00 44.32 C +ATOM 455 CD2 LEU A 78 -9.517 -3.083 32.752 1.00 45.60 C +ATOM 456 N SER A 79 -5.528 -4.285 32.954 1.00 44.82 N +ATOM 457 CA SER A 79 -4.440 -3.329 33.114 1.00 44.51 C +ATOM 458 C SER A 79 -3.765 -2.993 31.796 1.00 43.28 C +ATOM 459 O SER A 79 -3.433 -1.837 31.534 1.00 43.67 O +ATOM 460 CB SER A 79 -3.397 -3.874 34.081 1.00 45.67 C +ATOM 461 OG SER A 79 -3.973 -4.083 35.356 1.00 54.84 O +ATOM 462 N GLY A 80 -3.553 -4.011 30.974 1.00 40.76 N +ATOM 463 CA GLY A 80 -2.912 -3.793 29.697 1.00 41.11 C +ATOM 464 C GLY A 80 -3.731 -2.902 28.784 1.00 41.41 C +ATOM 465 O GLY A 80 -3.212 -1.946 28.202 1.00 41.43 O +ATOM 466 N VAL A 81 -5.020 -3.200 28.677 1.00 39.31 N +ATOM 467 CA VAL A 81 -5.893 -2.438 27.805 1.00 40.60 C +ATOM 468 C VAL A 81 -6.099 -0.980 28.232 1.00 41.00 C +ATOM 469 O VAL A 81 -6.176 -0.098 27.379 1.00 40.18 O +ATOM 470 CB VAL A 81 -7.267 -3.137 27.650 1.00 40.93 C +ATOM 471 CG1 VAL A 81 -8.121 -2.920 28.895 1.00 42.64 C +ATOM 472 CG2 VAL A 81 -7.963 -2.626 26.410 1.00 42.47 C +ATOM 473 N VAL A 82 -6.176 -0.712 29.534 1.00 38.62 N +ATOM 474 CA VAL A 82 -6.373 0.663 29.965 1.00 38.93 C +ATOM 475 C VAL A 82 -5.098 1.476 29.780 1.00 39.45 C +ATOM 476 O VAL A 82 -5.156 2.667 29.478 1.00 38.89 O +ATOM 477 CB VAL A 82 -6.842 0.767 31.449 1.00 37.91 C +ATOM 478 CG1 VAL A 82 -8.145 0.004 31.637 1.00 36.98 C +ATOM 479 CG2 VAL A 82 -5.774 0.260 32.382 1.00 39.51 C +ATOM 480 N LEU A 83 -3.950 0.825 29.951 1.00 38.91 N +ATOM 481 CA LEU A 83 -2.660 1.492 29.801 1.00 38.14 C +ATOM 482 C LEU A 83 -2.380 1.764 28.339 1.00 37.24 C +ATOM 483 O LEU A 83 -1.691 2.722 27.997 1.00 37.12 O +ATOM 484 CB LEU A 83 -1.530 0.638 30.386 1.00 36.88 C +ATOM 485 CG LEU A 83 -1.410 0.638 31.912 1.00 38.79 C +ATOM 486 CD1 LEU A 83 -0.335 -0.358 32.342 1.00 38.30 C +ATOM 487 CD2 LEU A 83 -1.066 2.040 32.405 1.00 35.68 C +ATOM 488 N GLN A 84 -2.903 0.902 27.478 1.00 36.55 N +ATOM 489 CA GLN A 84 -2.723 1.075 26.052 1.00 37.08 C +ATOM 490 C GLN A 84 -3.535 2.294 25.624 1.00 37.13 C +ATOM 491 O GLN A 84 -3.145 3.015 24.713 1.00 37.53 O +ATOM 492 CB GLN A 84 -3.158 -0.190 25.304 1.00 36.87 C +ATOM 493 CG GLN A 84 -2.052 -1.245 25.240 1.00 41.01 C +ATOM 494 CD GLN A 84 -2.524 -2.609 24.756 1.00 42.11 C +ATOM 495 OE1 GLN A 84 -3.489 -2.721 24.003 1.00 43.76 O +ATOM 496 NE2 GLN A 84 -1.823 -3.654 25.174 1.00 44.06 N +ATOM 497 N GLY A 85 -4.650 2.528 26.310 1.00 37.59 N +ATOM 498 CA GLY A 85 -5.486 3.676 26.014 1.00 39.08 C +ATOM 499 C GLY A 85 -4.833 4.966 26.498 1.00 41.29 C +ATOM 500 O GLY A 85 -4.889 5.994 25.815 1.00 42.34 O +ATOM 501 N ILE A 86 -4.212 4.914 27.675 1.00 40.68 N +ATOM 502 CA ILE A 86 -3.534 6.078 28.243 1.00 40.79 C +ATOM 503 C ILE A 86 -2.387 6.530 27.337 1.00 40.27 C +ATOM 504 O ILE A 86 -2.256 7.711 27.029 1.00 40.35 O +ATOM 505 CB ILE A 86 -2.943 5.765 29.650 1.00 42.31 C +ATOM 506 CG1 ILE A 86 -4.065 5.618 30.682 1.00 40.17 C +ATOM 507 CG2 ILE A 86 -1.960 6.860 30.064 1.00 41.79 C +ATOM 508 CD1 ILE A 86 -3.576 5.289 32.078 0.00 41.03 C +ATOM 509 N PHE A 87 -1.566 5.579 26.906 1.00 39.04 N +ATOM 510 CA PHE A 87 -0.419 5.876 26.055 1.00 39.16 C +ATOM 511 C PHE A 87 -0.681 5.830 24.548 1.00 38.52 C +ATOM 512 O PHE A 87 0.249 5.923 23.757 1.00 37.16 O +ATOM 513 CB PHE A 87 0.727 4.926 26.409 1.00 39.10 C +ATOM 514 CG PHE A 87 1.274 5.141 27.788 1.00 41.11 C +ATOM 515 CD1 PHE A 87 2.206 6.147 28.031 1.00 40.29 C +ATOM 516 CD2 PHE A 87 0.813 4.379 28.861 1.00 40.42 C +ATOM 517 CE1 PHE A 87 2.669 6.393 29.324 1.00 42.06 C +ATOM 518 CE2 PHE A 87 1.267 4.617 30.155 1.00 39.59 C +ATOM 519 CZ PHE A 87 2.196 5.626 30.389 1.00 41.98 C +ATOM 520 N ARG A 88 -1.939 5.677 24.151 1.00 40.13 N +ATOM 521 CA ARG A 88 -2.289 5.640 22.734 1.00 43.15 C +ATOM 522 C ARG A 88 -1.341 4.759 21.920 1.00 44.91 C +ATOM 523 O ARG A 88 -0.893 5.148 20.840 1.00 43.88 O +ATOM 524 CB ARG A 88 -2.264 7.061 22.159 1.00 43.97 C +ATOM 525 CG ARG A 88 -3.076 8.069 22.952 1.00 43.57 C +ATOM 526 CD ARG A 88 -2.668 9.501 22.608 1.00 45.72 C +ATOM 527 NE ARG A 88 -3.420 10.462 23.406 1.00 46.81 N +ATOM 528 CZ ARG A 88 -2.984 11.670 23.734 1.00 45.28 C +ATOM 529 NH1 ARG A 88 -3.745 12.466 24.467 1.00 44.64 N +ATOM 530 NH2 ARG A 88 -1.787 12.078 23.339 1.00 46.31 N +ATOM 531 N ASN A 89 -1.051 3.568 22.433 1.00 47.09 N +ATOM 532 CA ASN A 89 -0.156 2.647 21.754 1.00 48.45 C +ATOM 533 C ASN A 89 -0.496 1.196 22.079 1.00 50.37 C +ATOM 534 O ASN A 89 -0.453 0.779 23.236 1.00 51.69 O +ATOM 535 CB ASN A 89 1.284 2.938 22.164 1.00 50.72 C +ATOM 536 CG ASN A 89 2.280 2.009 21.500 1.00 53.67 C +ATOM 537 OD1 ASN A 89 3.461 2.018 21.832 1.00 58.95 O +ATOM 538 ND2 ASN A 89 1.811 1.207 20.554 1.00 55.74 N +ATOM 539 N PRO A 90 -0.824 0.400 21.056 1.00 51.26 N +ATOM 540 CA PRO A 90 -1.163 -1.007 21.283 1.00 51.97 C +ATOM 541 C PRO A 90 0.002 -1.870 21.781 1.00 52.66 C +ATOM 542 O PRO A 90 -0.214 -2.974 22.277 1.00 53.95 O +ATOM 543 CB PRO A 90 -1.680 -1.454 19.917 1.00 52.58 C +ATOM 544 CG PRO A 90 -0.880 -0.608 18.968 1.00 52.31 C +ATOM 545 CD PRO A 90 -0.926 0.746 19.627 1.00 50.48 C +ATOM 546 N LEU A 91 1.226 -1.364 21.663 1.00 53.36 N +ATOM 547 CA LEU A 91 2.415 -2.105 22.088 1.00 53.14 C +ATOM 548 C LEU A 91 2.789 -1.872 23.547 1.00 54.75 C +ATOM 549 O LEU A 91 3.884 -2.225 23.982 1.00 57.00 O +ATOM 550 CB LEU A 91 3.607 -1.745 21.196 1.00 51.31 C +ATOM 551 CG LEU A 91 3.459 -2.084 19.709 1.00 52.19 C +ATOM 552 CD1 LEU A 91 4.691 -1.614 18.947 1.00 52.18 C +ATOM 553 CD2 LEU A 91 3.272 -3.590 19.535 1.00 50.63 C +ATOM 554 N VAL A 92 1.884 -1.275 24.307 1.00 55.40 N +ATOM 555 CA VAL A 92 2.146 -1.021 25.715 1.00 55.44 C +ATOM 556 C VAL A 92 1.580 -2.142 26.587 1.00 56.86 C +ATOM 557 O VAL A 92 0.556 -2.744 26.260 1.00 56.66 O +ATOM 558 CB VAL A 92 1.546 0.341 26.142 1.00 54.15 C +ATOM 559 CG1 VAL A 92 1.199 0.335 27.614 1.00 53.26 C +ATOM 560 CG2 VAL A 92 2.549 1.447 25.857 1.00 53.26 C +ATOM 561 N ASN A 93 2.266 -2.426 27.689 1.00 58.16 N +ATOM 562 CA ASN A 93 1.832 -3.461 28.614 1.00 59.90 C +ATOM 563 C ASN A 93 1.877 -2.936 30.048 1.00 61.07 C +ATOM 564 O ASN A 93 2.475 -1.893 30.320 1.00 59.13 O +ATOM 565 CB ASN A 93 2.712 -4.706 28.477 1.00 60.83 C +ATOM 566 CG ASN A 93 4.122 -4.482 28.970 1.00 61.85 C +ATOM 567 OD1 ASN A 93 4.923 -5.409 29.008 1.00 64.54 O +ATOM 568 ND2 ASN A 93 4.437 -3.250 29.346 1.00 64.36 N +ATOM 569 N PRO A 94 1.252 -3.662 30.988 1.00 63.14 N +ATOM 570 CA PRO A 94 1.223 -3.252 32.396 1.00 64.05 C +ATOM 571 C PRO A 94 2.574 -3.252 33.085 1.00 64.83 C +ATOM 572 O PRO A 94 2.640 -3.337 34.308 1.00 67.13 O +ATOM 573 CB PRO A 94 0.260 -4.255 33.022 1.00 64.64 C +ATOM 574 CG PRO A 94 0.509 -5.496 32.213 1.00 64.38 C +ATOM 575 CD PRO A 94 0.554 -4.949 30.804 1.00 63.44 C +ATOM 576 N HIS A 95 3.646 -3.148 32.305 1.00 65.49 N +ATOM 577 CA HIS A 95 4.998 -3.154 32.859 1.00 65.75 C +ATOM 578 C HIS A 95 5.770 -1.857 32.602 1.00 64.47 C +ATOM 579 O HIS A 95 6.807 -1.624 33.218 1.00 65.54 O +ATOM 580 CB HIS A 95 5.798 -4.327 32.274 1.00 69.28 C +ATOM 581 CG HIS A 95 5.149 -5.667 32.460 1.00 73.82 C +ATOM 582 ND1 HIS A 95 5.643 -6.818 31.880 1.00 75.39 N +ATOM 583 CD2 HIS A 95 4.053 -6.043 33.162 1.00 74.84 C +ATOM 584 CE1 HIS A 95 4.878 -7.842 32.218 1.00 76.39 C +ATOM 585 NE2 HIS A 95 3.907 -7.399 32.996 1.00 75.38 N +ATOM 586 N ILE A 96 5.269 -1.016 31.700 1.00 62.17 N +ATOM 587 CA ILE A 96 5.943 0.236 31.361 1.00 59.46 C +ATOM 588 C ILE A 96 5.970 1.299 32.460 1.00 56.80 C +ATOM 589 O ILE A 96 6.776 2.225 32.403 1.00 57.97 O +ATOM 590 CB ILE A 96 5.326 0.877 30.101 1.00 60.77 C +ATOM 591 CG1 ILE A 96 3.886 1.314 30.386 1.00 59.00 C +ATOM 592 CG2 ILE A 96 5.369 -0.121 28.941 1.00 63.02 C +ATOM 593 CD1 ILE A 96 3.281 2.135 29.277 0.00 59.48 C +ATOM 594 N ILE A 97 5.086 1.187 33.444 1.00 53.89 N +ATOM 595 CA ILE A 97 5.061 2.156 34.534 1.00 52.59 C +ATOM 596 C ILE A 97 6.035 1.733 35.630 1.00 51.75 C +ATOM 597 O ILE A 97 6.188 2.418 36.638 1.00 51.69 O +ATOM 598 CB ILE A 97 3.637 2.304 35.138 1.00 53.70 C +ATOM 599 CG1 ILE A 97 2.994 0.926 35.315 1.00 53.73 C +ATOM 600 CG2 ILE A 97 2.780 3.197 34.249 1.00 51.90 C +ATOM 601 CD1 ILE A 97 1.611 0.967 35.934 0.00 53.66 C +ATOM 602 N GLY A 98 6.691 0.597 35.420 1.00 49.90 N +ATOM 603 CA GLY A 98 7.655 0.092 36.380 1.00 49.39 C +ATOM 604 C GLY A 98 7.087 -0.519 37.653 1.00 48.40 C +ATOM 605 O GLY A 98 7.841 -0.879 38.559 1.00 47.58 O +ATOM 606 N VAL A 99 5.770 -0.651 37.736 1.00 46.96 N +ATOM 607 CA VAL A 99 5.164 -1.212 38.937 1.00 47.37 C +ATOM 608 C VAL A 99 5.478 -2.706 39.121 1.00 46.05 C +ATOM 609 O VAL A 99 5.592 -3.183 40.245 1.00 45.44 O +ATOM 610 CB VAL A 99 3.630 -0.985 38.936 1.00 47.90 C +ATOM 611 CG1 VAL A 99 2.996 -1.685 37.741 1.00 49.31 C +ATOM 612 CG2 VAL A 99 3.029 -1.485 40.240 1.00 49.50 C +ATOM 613 N THR A 100 5.629 -3.437 38.021 1.00 45.16 N +ATOM 614 CA THR A 100 5.936 -4.860 38.101 1.00 46.67 C +ATOM 615 C THR A 100 7.334 -5.097 38.678 1.00 47.22 C +ATOM 616 O THR A 100 7.550 -6.046 39.435 1.00 48.07 O +ATOM 617 CB THR A 100 5.836 -5.537 36.714 1.00 48.15 C +ATOM 618 OG1 THR A 100 6.698 -4.871 35.783 1.00 53.01 O +ATOM 619 CG2 THR A 100 4.421 -5.472 36.200 1.00 48.71 C +ATOM 620 N SER A 101 8.282 -4.238 38.320 1.00 44.25 N +ATOM 621 CA SER A 101 9.641 -4.360 38.831 1.00 43.93 C +ATOM 622 C SER A 101 9.672 -3.942 40.292 1.00 43.50 C +ATOM 623 O SER A 101 10.395 -4.523 41.095 1.00 43.35 O +ATOM 624 CB SER A 101 10.597 -3.473 38.034 1.00 43.33 C +ATOM 625 OG SER A 101 10.684 -3.919 36.697 1.00 47.13 O +ATOM 626 N GLY A 102 8.889 -2.918 40.625 1.00 43.61 N +ATOM 627 CA GLY A 102 8.835 -2.441 41.993 1.00 42.64 C +ATOM 628 C GLY A 102 8.279 -3.527 42.889 1.00 42.56 C +ATOM 629 O GLY A 102 8.796 -3.768 43.975 1.00 41.29 O +ATOM 630 N SER A 103 7.221 -4.184 42.425 1.00 42.97 N +ATOM 631 CA SER A 103 6.600 -5.269 43.176 1.00 44.41 C +ATOM 632 C SER A 103 7.548 -6.467 43.252 1.00 43.86 C +ATOM 633 O SER A 103 7.627 -7.147 44.274 1.00 44.99 O +ATOM 634 CB SER A 103 5.292 -5.697 42.503 1.00 46.01 C +ATOM 635 OG SER A 103 4.363 -4.626 42.456 1.00 50.74 O +ATOM 636 N ALA A 104 8.260 -6.725 42.161 1.00 42.84 N +ATOM 637 CA ALA A 104 9.200 -7.836 42.111 1.00 42.45 C +ATOM 638 C ALA A 104 10.261 -7.639 43.178 1.00 42.92 C +ATOM 639 O ALA A 104 10.678 -8.589 43.836 1.00 43.30 O +ATOM 640 CB ALA A 104 9.856 -7.911 40.739 1.00 42.23 C +ATOM 641 N PHE A 105 10.690 -6.394 43.343 1.00 41.56 N +ATOM 642 CA PHE A 105 11.704 -6.062 44.326 1.00 40.98 C +ATOM 643 C PHE A 105 11.149 -6.188 45.734 1.00 41.88 C +ATOM 644 O PHE A 105 11.830 -6.683 46.629 1.00 42.08 O +ATOM 645 CB PHE A 105 12.215 -4.637 44.107 1.00 38.78 C +ATOM 646 CG PHE A 105 13.090 -4.139 45.219 1.00 37.58 C +ATOM 647 CD1 PHE A 105 14.350 -4.693 45.432 1.00 36.05 C +ATOM 648 CD2 PHE A 105 12.640 -3.143 46.079 1.00 36.67 C +ATOM 649 CE1 PHE A 105 15.152 -4.262 46.487 1.00 34.84 C +ATOM 650 CE2 PHE A 105 13.432 -2.705 47.136 1.00 38.23 C +ATOM 651 CZ PHE A 105 14.694 -3.268 47.339 1.00 36.45 C +ATOM 652 N GLY A 106 9.919 -5.721 45.930 1.00 43.03 N +ATOM 653 CA GLY A 106 9.291 -5.804 47.238 1.00 44.33 C +ATOM 654 C GLY A 106 9.210 -7.247 47.709 1.00 46.74 C +ATOM 655 O GLY A 106 9.541 -7.561 48.855 1.00 47.49 O +ATOM 656 N GLY A 107 8.768 -8.132 46.820 1.00 46.25 N +ATOM 657 CA GLY A 107 8.667 -9.536 47.172 1.00 46.82 C +ATOM 658 C GLY A 107 10.038 -10.136 47.424 1.00 47.36 C +ATOM 659 O GLY A 107 10.237 -10.857 48.401 1.00 47.38 O +ATOM 660 N THR A 108 10.987 -9.829 46.540 1.00 46.84 N +ATOM 661 CA THR A 108 12.349 -10.335 46.660 1.00 46.06 C +ATOM 662 C THR A 108 12.957 -9.942 47.995 1.00 47.02 C +ATOM 663 O THR A 108 13.586 -10.759 48.666 1.00 47.91 O +ATOM 664 CB THR A 108 13.246 -9.805 45.515 1.00 44.90 C +ATOM 665 OG1 THR A 108 12.807 -10.367 44.272 1.00 43.98 O +ATOM 666 CG2 THR A 108 14.702 -10.192 45.743 1.00 42.98 C +ATOM 667 N LEU A 109 12.766 -8.687 48.376 1.00 47.25 N +ATOM 668 CA LEU A 109 13.290 -8.186 49.634 1.00 50.08 C +ATOM 669 C LEU A 109 12.683 -8.971 50.794 1.00 51.10 C +ATOM 670 O LEU A 109 13.386 -9.386 51.713 1.00 52.06 O +ATOM 671 CB LEU A 109 12.954 -6.702 49.786 1.00 50.50 C +ATOM 672 CG LEU A 109 13.582 -6.003 50.989 1.00 51.71 C +ATOM 673 CD1 LEU A 109 15.097 -6.070 50.873 1.00 53.25 C +ATOM 674 CD2 LEU A 109 13.115 -4.560 51.047 1.00 52.73 C +ATOM 675 N ALA A 110 11.372 -9.169 50.745 1.00 51.64 N +ATOM 676 CA ALA A 110 10.672 -9.904 51.785 1.00 52.45 C +ATOM 677 C ALA A 110 11.233 -11.320 51.890 1.00 53.61 C +ATOM 678 O ALA A 110 11.432 -11.828 52.987 1.00 54.65 O +ATOM 679 CB ALA A 110 9.178 -9.945 51.480 1.00 51.58 C +ATOM 680 N ILE A 111 11.491 -11.956 50.753 1.00 53.79 N +ATOM 681 CA ILE A 111 12.040 -13.306 50.761 1.00 54.64 C +ATOM 682 C ILE A 111 13.452 -13.305 51.349 1.00 56.65 C +ATOM 683 O ILE A 111 13.820 -14.190 52.122 1.00 58.50 O +ATOM 684 CB ILE A 111 12.100 -13.900 49.333 1.00 53.86 C +ATOM 685 CG1 ILE A 111 10.682 -14.142 48.805 1.00 53.52 C +ATOM 686 CG2 ILE A 111 12.899 -15.198 49.338 1.00 52.57 C +ATOM 687 CD1 ILE A 111 10.634 -14.677 47.388 0.00 53.80 C +ATOM 688 N PHE A 112 14.238 -12.300 50.986 1.00 57.58 N +ATOM 689 CA PHE A 112 15.611 -12.185 51.454 1.00 58.01 C +ATOM 690 C PHE A 112 15.730 -12.092 52.975 1.00 60.24 C +ATOM 691 O PHE A 112 16.632 -12.691 53.569 1.00 61.21 O +ATOM 692 CB PHE A 112 16.267 -10.972 50.790 1.00 56.51 C +ATOM 693 CG PHE A 112 17.683 -10.731 51.217 1.00 53.96 C +ATOM 694 CD1 PHE A 112 17.969 -9.854 52.256 1.00 53.43 C +ATOM 695 CD2 PHE A 112 18.734 -11.380 50.576 1.00 54.05 C +ATOM 696 CE1 PHE A 112 19.285 -9.622 52.653 1.00 53.93 C +ATOM 697 CE2 PHE A 112 20.054 -11.158 50.964 1.00 53.78 C +ATOM 698 CZ PHE A 112 20.330 -10.276 52.005 1.00 53.35 C +ATOM 699 N PHE A 113 14.831 -11.343 53.604 1.00 60.73 N +ATOM 700 CA PHE A 113 14.863 -11.196 55.056 1.00 62.92 C +ATOM 701 C PHE A 113 13.988 -12.232 55.751 1.00 64.64 C +ATOM 702 O PHE A 113 13.704 -12.118 56.942 1.00 65.69 O +ATOM 703 CB PHE A 113 14.416 -9.792 55.471 1.00 61.38 C +ATOM 704 CG PHE A 113 15.424 -8.727 55.173 1.00 62.44 C +ATOM 705 CD1 PHE A 113 15.187 -7.782 54.181 1.00 62.26 C +ATOM 706 CD2 PHE A 113 16.625 -8.679 55.870 1.00 62.72 C +ATOM 707 CE1 PHE A 113 16.134 -6.805 53.887 1.00 62.70 C +ATOM 708 CE2 PHE A 113 17.579 -7.705 55.583 1.00 63.33 C +ATOM 709 CZ PHE A 113 17.332 -6.766 54.587 1.00 62.89 C +ATOM 710 N GLY A 114 13.565 -13.240 54.998 1.00 66.26 N +ATOM 711 CA GLY A 114 12.730 -14.285 55.555 1.00 68.24 C +ATOM 712 C GLY A 114 11.457 -13.785 56.210 1.00 69.77 C +ATOM 713 O GLY A 114 11.126 -14.199 57.321 1.00 71.04 O +ATOM 714 N PHE A 115 10.743 -12.891 55.533 1.00 70.55 N +ATOM 715 CA PHE A 115 9.490 -12.360 56.061 1.00 70.48 C +ATOM 716 C PHE A 115 8.410 -13.429 55.990 1.00 70.89 C +ATOM 717 O PHE A 115 8.631 -14.518 55.458 1.00 71.17 O +ATOM 718 CB PHE A 115 9.031 -11.143 55.254 1.00 69.78 C +ATOM 719 CG PHE A 115 9.786 -9.882 55.559 1.00 70.03 C +ATOM 720 CD1 PHE A 115 9.474 -8.701 54.894 1.00 70.41 C +ATOM 721 CD2 PHE A 115 10.794 -9.865 56.517 1.00 70.03 C +ATOM 722 CE1 PHE A 115 10.151 -7.521 55.176 1.00 70.57 C +ATOM 723 CE2 PHE A 115 11.479 -8.689 56.809 1.00 70.56 C +ATOM 724 CZ PHE A 115 11.156 -7.514 56.137 1.00 71.30 C +ATOM 725 N SER A 116 7.241 -13.110 56.530 1.00 71.35 N +ATOM 726 CA SER A 116 6.120 -14.038 56.510 1.00 71.87 C +ATOM 727 C SER A 116 5.318 -13.793 55.239 1.00 72.40 C +ATOM 728 O SER A 116 5.595 -12.854 54.494 1.00 72.39 O +ATOM 729 CB SER A 116 5.225 -13.823 57.734 1.00 71.47 C +ATOM 730 OG SER A 116 4.669 -12.520 57.739 1.00 70.55 O +ATOM 731 N LEU A 117 4.326 -14.640 54.996 1.00 72.45 N +ATOM 732 CA LEU A 117 3.489 -14.505 53.817 1.00 72.41 C +ATOM 733 C LEU A 117 2.859 -13.116 53.778 1.00 72.74 C +ATOM 734 O LEU A 117 2.881 -12.442 52.745 1.00 72.88 O +ATOM 735 CB LEU A 117 2.410 -15.592 53.825 1.00 72.81 C +ATOM 736 CG LEU A 117 1.399 -15.647 52.677 1.00 73.65 C +ATOM 737 CD1 LEU A 117 0.294 -14.629 52.917 1.00 74.35 C +ATOM 738 CD2 LEU A 117 2.109 -15.407 51.347 1.00 72.73 C +ATOM 739 N TYR A 118 2.304 -12.689 54.908 1.00 72.59 N +ATOM 740 CA TYR A 118 1.675 -11.374 54.996 1.00 72.68 C +ATOM 741 C TYR A 118 2.705 -10.265 54.846 1.00 69.97 C +ATOM 742 O TYR A 118 2.379 -9.154 54.430 1.00 68.30 O +ATOM 743 CB TYR A 118 0.941 -11.215 56.329 1.00 76.53 C +ATOM 744 CG TYR A 118 -0.336 -12.017 56.415 1.00 81.48 C +ATOM 745 CD1 TYR A 118 -0.308 -13.413 56.500 1.00 83.35 C +ATOM 746 CD2 TYR A 118 -1.577 -11.382 56.390 1.00 83.60 C +ATOM 747 CE1 TYR A 118 -1.489 -14.156 56.557 1.00 85.06 C +ATOM 748 CE2 TYR A 118 -2.762 -12.114 56.446 1.00 85.95 C +ATOM 749 CZ TYR A 118 -2.712 -13.498 56.529 1.00 86.02 C +ATOM 750 OH TYR A 118 -3.886 -14.214 56.582 1.00 87.53 O +ATOM 751 N GLY A 119 3.948 -10.577 55.198 1.00 67.92 N +ATOM 752 CA GLY A 119 5.015 -9.604 55.082 1.00 65.48 C +ATOM 753 C GLY A 119 5.386 -9.432 53.624 1.00 63.89 C +ATOM 754 O GLY A 119 5.778 -8.351 53.198 1.00 63.46 O +ATOM 755 N LEU A 120 5.260 -10.513 52.860 1.00 63.18 N +ATOM 756 CA LEU A 120 5.567 -10.492 51.439 1.00 62.13 C +ATOM 757 C LEU A 120 4.506 -9.659 50.724 1.00 61.79 C +ATOM 758 O LEU A 120 4.828 -8.818 49.883 1.00 60.37 O +ATOM 759 CB LEU A 120 5.596 -11.922 50.889 1.00 61.52 C +ATOM 760 CG LEU A 120 5.882 -12.108 49.395 1.00 62.73 C +ATOM 761 CD1 LEU A 120 6.355 -13.523 49.132 1.00 61.81 C +ATOM 762 CD2 LEU A 120 4.632 -11.801 48.582 1.00 62.37 C +ATOM 763 N PHE A 121 3.243 -9.894 51.070 1.00 60.45 N +ATOM 764 CA PHE A 121 2.138 -9.153 50.475 1.00 59.70 C +ATOM 765 C PHE A 121 2.338 -7.655 50.670 1.00 59.66 C +ATOM 766 O PHE A 121 2.343 -6.886 49.710 1.00 60.03 O +ATOM 767 CB PHE A 121 0.804 -9.551 51.120 1.00 59.95 C +ATOM 768 CG PHE A 121 0.291 -10.903 50.706 1.00 60.88 C +ATOM 769 CD1 PHE A 121 -0.919 -11.374 51.210 1.00 61.57 C +ATOM 770 CD2 PHE A 121 1.000 -11.701 49.812 1.00 61.48 C +ATOM 771 CE1 PHE A 121 -1.418 -12.617 50.828 1.00 61.85 C +ATOM 772 CE2 PHE A 121 0.511 -12.947 49.422 1.00 62.30 C +ATOM 773 CZ PHE A 121 -0.702 -13.405 49.932 1.00 63.39 C +ATOM 774 N THR A 122 2.496 -7.244 51.923 1.00 58.43 N +ATOM 775 CA THR A 122 2.672 -5.837 52.233 1.00 58.40 C +ATOM 776 C THR A 122 3.892 -5.253 51.539 1.00 57.56 C +ATOM 777 O THR A 122 3.828 -4.152 50.992 1.00 58.33 O +ATOM 778 CB THR A 122 2.813 -5.603 53.752 1.00 59.59 C +ATOM 779 OG1 THR A 122 3.986 -6.272 54.230 1.00 63.63 O +ATOM 780 CG2 THR A 122 1.590 -6.133 54.490 1.00 58.35 C +ATOM 781 N SER A 123 5.000 -5.989 51.557 1.00 55.67 N +ATOM 782 CA SER A 123 6.233 -5.518 50.933 1.00 53.04 C +ATOM 783 C SER A 123 6.040 -5.357 49.424 1.00 52.22 C +ATOM 784 O SER A 123 6.454 -4.355 48.838 1.00 51.22 O +ATOM 785 CB SER A 123 7.377 -6.497 51.223 1.00 52.71 C +ATOM 786 OG SER A 123 8.640 -5.939 50.891 1.00 49.65 O +ATOM 787 N THR A 124 5.397 -6.345 48.809 1.00 51.46 N +ATOM 788 CA THR A 124 5.138 -6.332 47.376 1.00 50.46 C +ATOM 789 C THR A 124 4.262 -5.145 46.991 1.00 51.48 C +ATOM 790 O THR A 124 4.563 -4.415 46.041 1.00 49.86 O +ATOM 791 CB THR A 124 4.434 -7.626 46.925 1.00 49.97 C +ATOM 792 OG1 THR A 124 5.228 -8.762 47.294 1.00 49.86 O +ATOM 793 CG2 THR A 124 4.241 -7.625 45.416 1.00 50.21 C +ATOM 794 N ILE A 125 3.172 -4.962 47.729 1.00 51.95 N +ATOM 795 CA ILE A 125 2.252 -3.863 47.467 1.00 52.92 C +ATOM 796 C ILE A 125 2.869 -2.515 47.854 1.00 53.36 C +ATOM 797 O ILE A 125 2.690 -1.517 47.160 1.00 53.76 O +ATOM 798 CB ILE A 125 0.916 -4.070 48.231 1.00 52.07 C +ATOM 799 CG1 ILE A 125 0.112 -5.190 47.568 1.00 50.76 C +ATOM 800 CG2 ILE A 125 0.113 -2.782 48.250 1.00 53.20 C +ATOM 801 CD1 ILE A 125 -1.199 -5.500 48.259 0.00 51.34 C +ATOM 802 N LEU A 126 3.611 -2.496 48.954 1.00 54.13 N +ATOM 803 CA LEU A 126 4.243 -1.271 49.421 1.00 54.88 C +ATOM 804 C LEU A 126 5.154 -0.684 48.338 1.00 55.33 C +ATOM 805 O LEU A 126 5.009 0.481 47.957 1.00 55.55 O +ATOM 806 CB LEU A 126 5.049 -1.553 50.693 1.00 57.55 C +ATOM 807 CG LEU A 126 5.293 -0.389 51.662 1.00 60.81 C +ATOM 808 CD1 LEU A 126 6.171 0.684 51.015 1.00 59.90 C +ATOM 809 CD2 LEU A 126 3.941 0.189 52.086 1.00 60.85 C +ATOM 810 N PHE A 127 6.093 -1.484 47.843 1.00 53.33 N +ATOM 811 CA PHE A 127 6.997 -1.001 46.809 1.00 51.82 C +ATOM 812 C PHE A 127 6.298 -0.880 45.459 1.00 51.64 C +ATOM 813 O PHE A 127 6.782 -0.189 44.559 1.00 48.80 O +ATOM 814 CB PHE A 127 8.232 -1.904 46.699 1.00 50.41 C +ATOM 815 CG PHE A 127 9.231 -1.689 47.802 1.00 51.67 C +ATOM 816 CD1 PHE A 127 9.119 -2.372 49.010 1.00 51.72 C +ATOM 817 CD2 PHE A 127 10.262 -0.767 47.649 1.00 52.85 C +ATOM 818 CE1 PHE A 127 10.019 -2.139 50.052 1.00 50.90 C +ATOM 819 CE2 PHE A 127 11.169 -0.525 48.685 1.00 52.87 C +ATOM 820 CZ PHE A 127 11.044 -1.216 49.890 1.00 52.49 C +ATOM 821 N GLY A 128 5.157 -1.549 45.328 1.00 52.35 N +ATOM 822 CA GLY A 128 4.400 -1.477 44.092 1.00 54.30 C +ATOM 823 C GLY A 128 3.755 -0.107 44.010 1.00 55.99 C +ATOM 824 O GLY A 128 3.866 0.589 43.000 1.00 54.46 O +ATOM 825 N PHE A 129 3.076 0.281 45.084 1.00 58.21 N +ATOM 826 CA PHE A 129 2.432 1.587 45.142 1.00 61.80 C +ATOM 827 C PHE A 129 3.528 2.636 45.205 1.00 61.25 C +ATOM 828 O PHE A 129 3.442 3.686 44.570 1.00 61.69 O +ATOM 829 CB PHE A 129 1.547 1.700 46.388 1.00 64.80 C +ATOM 830 CG PHE A 129 0.214 1.015 46.256 1.00 69.05 C +ATOM 831 CD1 PHE A 129 0.129 -0.310 45.838 1.00 70.97 C +ATOM 832 CD2 PHE A 129 -0.960 1.689 46.584 1.00 71.18 C +ATOM 833 CE1 PHE A 129 -1.108 -0.955 45.748 1.00 72.21 C +ATOM 834 CE2 PHE A 129 -2.201 1.052 46.499 1.00 72.05 C +ATOM 835 CZ PHE A 129 -2.273 -0.273 46.080 1.00 71.92 C +ATOM 836 N GLY A 130 4.564 2.334 45.979 1.00 60.68 N +ATOM 837 CA GLY A 130 5.675 3.250 46.120 1.00 59.85 C +ATOM 838 C GLY A 130 6.230 3.647 44.773 1.00 59.44 C +ATOM 839 O GLY A 130 6.595 4.802 44.563 1.00 61.27 O +ATOM 840 N THR A 131 6.298 2.692 43.853 1.00 58.49 N +ATOM 841 CA THR A 131 6.815 2.975 42.522 1.00 58.69 C +ATOM 842 C THR A 131 5.891 3.953 41.800 1.00 58.70 C +ATOM 843 O THR A 131 6.356 4.917 41.185 1.00 57.29 O +ATOM 844 CB THR A 131 6.947 1.687 41.688 1.00 58.36 C +ATOM 845 OG1 THR A 131 7.890 0.811 42.316 1.00 59.67 O +ATOM 846 CG2 THR A 131 7.426 2.008 40.278 1.00 58.56 C +ATOM 847 N LEU A 132 4.585 3.699 41.879 1.00 58.79 N +ATOM 848 CA LEU A 132 3.599 4.568 41.247 1.00 59.06 C +ATOM 849 C LEU A 132 3.793 5.973 41.786 1.00 59.11 C +ATOM 850 O LEU A 132 3.821 6.942 41.028 1.00 58.43 O +ATOM 851 CB LEU A 132 2.175 4.096 41.558 1.00 59.18 C +ATOM 852 CG LEU A 132 1.703 2.809 40.878 1.00 60.81 C +ATOM 853 CD1 LEU A 132 0.270 2.503 41.290 1.00 59.25 C +ATOM 854 CD2 LEU A 132 1.802 2.963 39.370 1.00 59.23 C +ATOM 855 N ALA A 133 3.933 6.068 43.104 1.00 58.90 N +ATOM 856 CA ALA A 133 4.135 7.346 43.763 1.00 59.14 C +ATOM 857 C ALA A 133 5.379 8.022 43.201 1.00 59.68 C +ATOM 858 O ALA A 133 5.359 9.213 42.904 1.00 60.18 O +ATOM 859 CB ALA A 133 4.276 7.143 45.266 1.00 59.45 C +ATOM 860 N LEU A 134 6.463 7.265 43.055 1.00 59.83 N +ATOM 861 CA LEU A 134 7.694 7.832 42.514 1.00 60.94 C +ATOM 862 C LEU A 134 7.468 8.366 41.107 1.00 60.94 C +ATOM 863 O LEU A 134 7.877 9.482 40.791 1.00 60.94 O +ATOM 864 CB LEU A 134 8.822 6.793 42.492 1.00 60.37 C +ATOM 865 CG LEU A 134 9.482 6.481 43.840 1.00 61.90 C +ATOM 866 CD1 LEU A 134 10.621 5.492 43.637 1.00 60.73 C +ATOM 867 CD2 LEU A 134 10.008 7.768 44.471 1.00 60.28 C +ATOM 868 N VAL A 135 6.814 7.569 40.266 1.00 61.20 N +ATOM 869 CA VAL A 135 6.539 7.979 38.895 1.00 61.62 C +ATOM 870 C VAL A 135 5.763 9.288 38.906 1.00 63.03 C +ATOM 871 O VAL A 135 6.016 10.185 38.098 1.00 61.39 O +ATOM 872 CB VAL A 135 5.714 6.918 38.150 1.00 61.82 C +ATOM 873 CG1 VAL A 135 5.344 7.428 36.763 1.00 61.97 C +ATOM 874 CG2 VAL A 135 6.513 5.621 38.049 1.00 61.13 C +ATOM 875 N PHE A 136 4.821 9.387 39.838 1.00 64.00 N +ATOM 876 CA PHE A 136 4.000 10.580 39.984 1.00 66.04 C +ATOM 877 C PHE A 136 4.856 11.782 40.380 1.00 66.94 C +ATOM 878 O PHE A 136 4.795 12.833 39.742 1.00 67.01 O +ATOM 879 CB PHE A 136 2.923 10.351 41.046 1.00 66.02 C +ATOM 880 CG PHE A 136 2.027 11.535 41.259 1.00 67.09 C +ATOM 881 CD1 PHE A 136 1.075 11.883 40.306 1.00 67.50 C +ATOM 882 CD2 PHE A 136 2.148 12.317 42.404 1.00 66.62 C +ATOM 883 CE1 PHE A 136 0.257 12.993 40.488 1.00 67.00 C +ATOM 884 CE2 PHE A 136 1.337 13.429 42.596 1.00 66.25 C +ATOM 885 CZ PHE A 136 0.389 13.768 41.636 1.00 67.17 C +ATOM 886 N LEU A 137 5.652 11.620 41.434 1.00 68.38 N +ATOM 887 CA LEU A 137 6.517 12.691 41.918 1.00 70.25 C +ATOM 888 C LEU A 137 7.495 13.194 40.864 1.00 71.40 C +ATOM 889 O LEU A 137 7.613 14.398 40.655 1.00 71.62 O +ATOM 890 CB LEU A 137 7.288 12.233 43.157 1.00 70.58 C +ATOM 891 CG LEU A 137 6.588 12.405 44.510 1.00 71.96 C +ATOM 892 CD1 LEU A 137 5.199 11.792 44.472 1.00 73.30 C +ATOM 893 CD2 LEU A 137 7.431 11.759 45.599 1.00 72.05 C +ATOM 894 N PHE A 138 8.201 12.277 40.211 1.00 72.97 N +ATOM 895 CA PHE A 138 9.154 12.659 39.176 1.00 75.75 C +ATOM 896 C PHE A 138 8.430 13.256 37.973 1.00 78.33 C +ATOM 897 O PHE A 138 9.024 13.982 37.176 1.00 78.16 O +ATOM 898 CB PHE A 138 9.982 11.448 38.739 1.00 75.76 C +ATOM 899 CG PHE A 138 11.123 11.129 39.663 1.00 75.83 C +ATOM 900 CD1 PHE A 138 12.181 12.020 39.812 1.00 76.10 C +ATOM 901 CD2 PHE A 138 11.139 9.944 40.389 1.00 76.54 C +ATOM 902 CE1 PHE A 138 13.239 11.737 40.671 1.00 75.90 C +ATOM 903 CE2 PHE A 138 12.194 9.651 41.252 1.00 76.81 C +ATOM 904 CZ PHE A 138 13.245 10.551 41.392 1.00 76.02 C +ATOM 905 N SER A 139 7.146 12.937 37.847 1.00 81.59 N +ATOM 906 CA SER A 139 6.323 13.450 36.758 1.00 84.52 C +ATOM 907 C SER A 139 6.130 14.947 36.966 1.00 87.28 C +ATOM 908 O SER A 139 6.023 15.718 36.010 1.00 87.42 O +ATOM 909 CB SER A 139 4.962 12.752 36.754 1.00 84.20 C +ATOM 910 OG SER A 139 4.062 13.383 35.862 1.00 84.74 O +ATOM 911 N PHE A 140 6.087 15.347 38.233 1.00 89.90 N +ATOM 912 CA PHE A 140 5.913 16.745 38.598 1.00 92.67 C +ATOM 913 C PHE A 140 7.203 17.285 39.203 1.00 94.11 C +ATOM 914 O PHE A 140 7.207 17.800 40.322 1.00 95.29 O +ATOM 915 CB PHE A 140 4.765 16.885 39.603 1.00 93.18 C +ATOM 916 CG PHE A 140 3.410 16.548 39.035 1.00 94.97 C +ATOM 917 CD1 PHE A 140 2.278 16.599 39.840 1.00 95.48 C +ATOM 918 CD2 PHE A 140 3.262 16.194 37.694 1.00 95.95 C +ATOM 919 CE1 PHE A 140 1.018 16.305 39.320 1.00 96.59 C +ATOM 920 CE2 PHE A 140 2.008 15.898 37.163 1.00 96.49 C +ATOM 921 CZ PHE A 140 0.883 15.954 37.978 1.00 96.80 C +ATOM 922 N LYS A 141 8.297 17.158 38.456 1.00 94.72 N +ATOM 923 CA LYS A 141 9.604 17.627 38.909 1.00 95.09 C +ATOM 924 C LYS A 141 10.683 17.262 37.894 1.00 94.62 C +ATOM 925 O LYS A 141 10.463 17.337 36.684 1.00 94.36 O +ATOM 926 CB LYS A 141 9.943 17.009 40.271 1.00 96.10 C +ATOM 927 CG LYS A 141 11.246 17.499 40.881 1.00 97.10 C +ATOM 928 CD LYS A 141 11.461 16.908 42.266 1.00 97.90 C +ATOM 929 CE LYS A 141 12.781 17.368 42.869 1.00 98.59 C +ATOM 930 NZ LYS A 141 13.010 16.788 44.224 1.00 99.02 N +ATOM 931 N SER A 146 4.368 14.916 30.083 1.00 57.40 N +ATOM 932 CA SER A 146 4.032 14.230 28.837 1.00 56.25 C +ATOM 933 C SER A 146 4.078 12.712 28.996 1.00 54.26 C +ATOM 934 O SER A 146 4.711 12.186 29.909 1.00 53.30 O +ATOM 935 CB SER A 146 4.997 14.641 27.724 1.00 56.81 C +ATOM 936 OG SER A 146 6.292 14.118 27.965 1.00 57.57 O +ATOM 937 N LEU A 147 3.405 12.020 28.087 1.00 52.82 N +ATOM 938 CA LEU A 147 3.346 10.566 28.098 1.00 52.09 C +ATOM 939 C LEU A 147 4.722 9.922 28.006 1.00 52.42 C +ATOM 940 O LEU A 147 5.070 9.061 28.814 1.00 49.92 O +ATOM 941 CB LEU A 147 2.467 10.079 26.944 1.00 49.41 C +ATOM 942 CG LEU A 147 1.000 9.778 27.266 1.00 48.67 C +ATOM 943 CD1 LEU A 147 0.507 10.684 28.371 1.00 49.41 C +ATOM 944 CD2 LEU A 147 0.162 9.941 26.006 1.00 49.10 C +ATOM 945 N LEU A 148 5.495 10.343 27.011 1.00 52.43 N +ATOM 946 CA LEU A 148 6.833 9.814 26.793 1.00 53.50 C +ATOM 947 C LEU A 148 7.659 9.906 28.076 1.00 54.16 C +ATOM 948 O LEU A 148 8.411 8.987 28.417 1.00 53.09 O +ATOM 949 CB LEU A 148 7.496 10.590 25.647 1.00 54.80 C +ATOM 950 CG LEU A 148 8.932 10.313 25.200 1.00 55.39 C +ATOM 951 CD1 LEU A 148 9.899 11.063 26.094 1.00 58.25 C +ATOM 952 CD2 LEU A 148 9.203 8.820 25.209 1.00 56.38 C +ATOM 953 N MET A 149 7.492 11.008 28.798 1.00 53.73 N +ATOM 954 CA MET A 149 8.222 11.218 30.036 1.00 54.39 C +ATOM 955 C MET A 149 7.905 10.156 31.092 1.00 53.20 C +ATOM 956 O MET A 149 8.801 9.693 31.798 1.00 53.53 O +ATOM 957 CB MET A 149 7.926 12.614 30.581 1.00 56.96 C +ATOM 958 CG MET A 149 9.148 13.295 31.173 1.00 63.29 C +ATOM 959 SD MET A 149 10.577 13.160 30.059 1.00 69.26 S +ATOM 960 CE MET A 149 10.087 14.269 28.717 1.00 69.18 C +ATOM 961 N LEU A 150 6.636 9.770 31.201 1.00 51.68 N +ATOM 962 CA LEU A 150 6.236 8.746 32.167 1.00 50.04 C +ATOM 963 C LEU A 150 6.903 7.424 31.816 1.00 49.19 C +ATOM 964 O LEU A 150 7.325 6.683 32.697 1.00 48.10 O +ATOM 965 CB LEU A 150 4.715 8.557 32.172 1.00 48.62 C +ATOM 966 CG LEU A 150 3.855 9.766 32.546 1.00 49.01 C +ATOM 967 CD1 LEU A 150 2.387 9.354 32.621 1.00 48.49 C +ATOM 968 CD2 LEU A 150 4.319 10.331 33.871 1.00 50.08 C +ATOM 969 N ILE A 151 6.990 7.138 30.520 1.00 49.56 N +ATOM 970 CA ILE A 151 7.610 5.910 30.044 1.00 50.67 C +ATOM 971 C ILE A 151 9.098 5.907 30.378 1.00 52.00 C +ATOM 972 O ILE A 151 9.668 4.873 30.726 1.00 53.51 O +ATOM 973 CB ILE A 151 7.452 5.757 28.521 1.00 50.35 C +ATOM 974 CG1 ILE A 151 5.971 5.599 28.162 1.00 52.09 C +ATOM 975 CG2 ILE A 151 8.250 4.559 28.037 1.00 50.07 C +ATOM 976 CD1 ILE A 151 5.704 5.492 26.675 0.00 51.50 C +ATOM 977 N LEU A 152 9.728 7.067 30.263 1.00 51.75 N +ATOM 978 CA LEU A 152 11.144 7.175 30.559 1.00 52.47 C +ATOM 979 C LEU A 152 11.390 7.043 32.061 1.00 52.35 C +ATOM 980 O LEU A 152 12.316 6.351 32.484 1.00 51.55 O +ATOM 981 CB LEU A 152 11.692 8.504 30.020 1.00 52.62 C +ATOM 982 CG LEU A 152 12.276 8.453 28.595 1.00 53.99 C +ATOM 983 CD1 LEU A 152 11.403 7.611 27.679 1.00 52.97 C +ATOM 984 CD2 LEU A 152 12.426 9.866 28.050 1.00 52.94 C +ATOM 985 N ILE A 153 10.554 7.698 32.860 1.00 51.01 N +ATOM 986 CA ILE A 153 10.683 7.636 34.306 1.00 50.18 C +ATOM 987 C ILE A 153 10.513 6.197 34.792 1.00 50.69 C +ATOM 988 O ILE A 153 11.314 5.704 35.587 1.00 49.99 O +ATOM 989 CB ILE A 153 9.625 8.514 35.003 1.00 50.42 C +ATOM 990 CG1 ILE A 153 9.908 9.996 34.730 1.00 50.02 C +ATOM 991 CG2 ILE A 153 9.616 8.220 36.496 1.00 48.95 C +ATOM 992 CD1 ILE A 153 8.890 10.940 35.337 0.00 50.19 C +ATOM 993 N GLY A 154 9.464 5.534 34.315 1.00 49.50 N +ATOM 994 CA GLY A 154 9.212 4.161 34.714 1.00 50.88 C +ATOM 995 C GLY A 154 10.321 3.229 34.261 1.00 51.39 C +ATOM 996 O GLY A 154 10.604 2.212 34.898 1.00 50.35 O +ATOM 997 N MET A 155 10.954 3.585 33.150 1.00 51.07 N +ATOM 998 CA MET A 155 12.039 2.795 32.594 1.00 50.75 C +ATOM 999 C MET A 155 13.240 2.883 33.534 1.00 49.16 C +ATOM 1000 O MET A 155 13.936 1.893 33.766 1.00 47.03 O +ATOM 1001 CB MET A 155 12.403 3.337 31.214 1.00 55.70 C +ATOM 1002 CG MET A 155 13.209 2.391 30.351 1.00 61.00 C +ATOM 1003 SD MET A 155 13.342 3.032 28.665 1.00 70.42 S +ATOM 1004 CE MET A 155 14.910 3.916 28.763 1.00 68.02 C +ATOM 1005 N ILE A 156 13.471 4.077 34.073 1.00 45.75 N +ATOM 1006 CA ILE A 156 14.569 4.303 34.999 1.00 44.80 C +ATOM 1007 C ILE A 156 14.354 3.483 36.279 1.00 44.86 C +ATOM 1008 O ILE A 156 15.272 2.814 36.762 1.00 44.21 O +ATOM 1009 CB ILE A 156 14.679 5.800 35.370 1.00 44.62 C +ATOM 1010 CG1 ILE A 156 15.260 6.590 34.186 1.00 44.78 C +ATOM 1011 CG2 ILE A 156 15.526 5.970 36.627 1.00 41.37 C +ATOM 1012 CD1 ILE A 156 15.332 8.082 34.423 0.00 44.81 C +ATOM 1013 N LEU A 157 13.138 3.538 36.816 1.00 42.56 N +ATOM 1014 CA LEU A 157 12.798 2.810 38.031 1.00 42.81 C +ATOM 1015 C LEU A 157 12.925 1.299 37.846 1.00 42.94 C +ATOM 1016 O LEU A 157 13.421 0.613 38.735 1.00 44.23 O +ATOM 1017 CB LEU A 157 11.380 3.172 38.484 1.00 42.11 C +ATOM 1018 CG LEU A 157 11.199 4.626 38.933 1.00 40.87 C +ATOM 1019 CD1 LEU A 157 9.731 4.924 39.211 1.00 39.40 C +ATOM 1020 CD2 LEU A 157 12.041 4.868 40.171 1.00 42.13 C +ATOM 1021 N SER A 158 12.484 0.783 36.700 1.00 41.20 N +ATOM 1022 CA SER A 158 12.589 -0.648 36.424 1.00 41.43 C +ATOM 1023 C SER A 158 14.054 -1.065 36.441 1.00 41.91 C +ATOM 1024 O SER A 158 14.403 -2.124 36.969 1.00 43.82 O +ATOM 1025 CB SER A 158 11.982 -0.992 35.058 1.00 40.11 C +ATOM 1026 OG SER A 158 10.583 -0.779 35.056 1.00 39.65 O +ATOM 1027 N GLY A 159 14.909 -0.237 35.850 1.00 40.10 N +ATOM 1028 CA GLY A 159 16.324 -0.544 35.842 1.00 38.33 C +ATOM 1029 C GLY A 159 16.854 -0.613 37.265 1.00 37.65 C +ATOM 1030 O GLY A 159 17.569 -1.541 37.625 1.00 38.29 O +ATOM 1031 N LEU A 160 16.490 0.374 38.075 1.00 36.64 N +ATOM 1032 CA LEU A 160 16.927 0.440 39.461 1.00 38.93 C +ATOM 1033 C LEU A 160 16.455 -0.767 40.270 1.00 39.36 C +ATOM 1034 O LEU A 160 17.245 -1.396 40.979 1.00 39.01 O +ATOM 1035 CB LEU A 160 16.410 1.726 40.104 1.00 39.13 C +ATOM 1036 CG LEU A 160 17.380 2.891 40.338 1.00 42.81 C +ATOM 1037 CD1 LEU A 160 18.520 2.871 39.337 1.00 42.07 C +ATOM 1038 CD2 LEU A 160 16.600 4.200 40.258 1.00 41.29 C +ATOM 1039 N PHE A 161 15.174 -1.093 40.151 1.00 38.13 N +ATOM 1040 CA PHE A 161 14.606 -2.215 40.883 1.00 39.21 C +ATOM 1041 C PHE A 161 15.121 -3.585 40.467 1.00 40.32 C +ATOM 1042 O PHE A 161 15.302 -4.462 41.315 1.00 40.49 O +ATOM 1043 CB PHE A 161 13.081 -2.180 40.790 1.00 37.05 C +ATOM 1044 CG PHE A 161 12.451 -1.166 41.700 1.00 40.15 C +ATOM 1045 CD1 PHE A 161 11.511 -0.258 41.215 1.00 39.86 C +ATOM 1046 CD2 PHE A 161 12.806 -1.113 43.051 1.00 39.89 C +ATOM 1047 CE1 PHE A 161 10.933 0.693 42.058 1.00 41.74 C +ATOM 1048 CE2 PHE A 161 12.234 -0.167 43.905 1.00 42.49 C +ATOM 1049 CZ PHE A 161 11.294 0.740 43.407 1.00 42.44 C +ATOM 1050 N SER A 162 15.363 -3.778 39.174 1.00 40.07 N +ATOM 1051 CA SER A 162 15.851 -5.067 38.713 1.00 41.09 C +ATOM 1052 C SER A 162 17.327 -5.227 39.047 1.00 40.17 C +ATOM 1053 O SER A 162 17.856 -6.333 39.032 1.00 42.49 O +ATOM 1054 CB SER A 162 15.616 -5.236 37.203 1.00 39.91 C +ATOM 1055 OG SER A 162 16.404 -4.343 36.449 1.00 46.01 O +ATOM 1056 N ALA A 163 17.990 -4.118 39.347 1.00 39.32 N +ATOM 1057 CA ALA A 163 19.403 -4.154 39.702 1.00 38.14 C +ATOM 1058 C ALA A 163 19.496 -4.493 41.186 1.00 37.90 C +ATOM 1059 O ALA A 163 20.414 -5.188 41.619 1.00 36.50 O +ATOM 1060 CB ALA A 163 20.054 -2.808 39.436 1.00 33.35 C +ATOM 1061 N LEU A 164 18.543 -3.986 41.959 1.00 37.97 N +ATOM 1062 CA LEU A 164 18.517 -4.249 43.384 1.00 40.57 C +ATOM 1063 C LEU A 164 18.139 -5.708 43.591 1.00 40.37 C +ATOM 1064 O LEU A 164 18.662 -6.364 44.481 1.00 42.22 O +ATOM 1065 CB LEU A 164 17.521 -3.316 44.076 1.00 41.99 C +ATOM 1066 CG LEU A 164 17.911 -1.839 43.955 1.00 43.25 C +ATOM 1067 CD1 LEU A 164 16.866 -0.962 44.622 1.00 43.69 C +ATOM 1068 CD2 LEU A 164 19.278 -1.623 44.592 1.00 43.59 C +ATOM 1069 N VAL A 165 17.242 -6.211 42.746 1.00 40.10 N +ATOM 1070 CA VAL A 165 16.817 -7.600 42.817 1.00 38.82 C +ATOM 1071 C VAL A 165 18.031 -8.482 42.561 1.00 39.80 C +ATOM 1072 O VAL A 165 18.232 -9.494 43.236 1.00 39.63 O +ATOM 1073 CB VAL A 165 15.731 -7.913 41.757 1.00 38.77 C +ATOM 1074 CG1 VAL A 165 15.572 -9.424 41.587 1.00 35.28 C +ATOM 1075 CG2 VAL A 165 14.407 -7.291 42.173 1.00 34.63 C +ATOM 1076 N SER A 166 18.831 -8.096 41.572 1.00 39.43 N +ATOM 1077 CA SER A 166 20.040 -8.833 41.227 1.00 39.33 C +ATOM 1078 C SER A 166 21.052 -8.750 42.355 1.00 38.18 C +ATOM 1079 O SER A 166 21.784 -9.699 42.608 1.00 37.33 O +ATOM 1080 CB SER A 166 20.686 -8.267 39.960 1.00 36.95 C +ATOM 1081 OG SER A 166 20.003 -8.701 38.808 1.00 41.82 O +ATOM 1082 N LEU A 167 21.103 -7.600 43.014 1.00 38.01 N +ATOM 1083 CA LEU A 167 22.041 -7.406 44.107 1.00 40.08 C +ATOM 1084 C LEU A 167 21.693 -8.365 45.239 1.00 41.32 C +ATOM 1085 O LEU A 167 22.558 -9.075 45.748 1.00 41.02 O +ATOM 1086 CB LEU A 167 21.966 -5.973 44.632 1.00 37.84 C +ATOM 1087 CG LEU A 167 23.239 -5.355 45.221 1.00 39.34 C +ATOM 1088 CD1 LEU A 167 22.832 -4.483 46.386 1.00 37.13 C +ATOM 1089 CD2 LEU A 167 24.241 -6.411 45.664 1.00 37.21 C +ATOM 1090 N LEU A 168 20.420 -8.371 45.627 1.00 41.88 N +ATOM 1091 CA LEU A 168 19.953 -9.231 46.706 1.00 46.10 C +ATOM 1092 C LEU A 168 20.232 -10.707 46.451 1.00 47.77 C +ATOM 1093 O LEU A 168 20.765 -11.400 47.318 1.00 48.08 O +ATOM 1094 CB LEU A 168 18.455 -9.028 46.949 1.00 46.14 C +ATOM 1095 CG LEU A 168 18.070 -7.725 47.653 1.00 47.35 C +ATOM 1096 CD1 LEU A 168 16.565 -7.663 47.802 1.00 50.58 C +ATOM 1097 CD2 LEU A 168 18.742 -7.642 49.013 1.00 47.27 C +ATOM 1098 N GLN A 169 19.886 -11.194 45.266 1.00 47.92 N +ATOM 1099 CA GLN A 169 20.124 -12.593 44.991 1.00 50.40 C +ATOM 1100 C GLN A 169 21.616 -12.906 44.911 1.00 50.97 C +ATOM 1101 O GLN A 169 22.025 -14.043 45.144 1.00 51.87 O +ATOM 1102 CB GLN A 169 19.378 -13.033 43.724 1.00 50.60 C +ATOM 1103 CG GLN A 169 19.816 -12.400 42.443 1.00 54.48 C +ATOM 1104 CD GLN A 169 18.860 -12.708 41.296 1.00 55.73 C +ATOM 1105 OE1 GLN A 169 19.127 -12.363 40.144 1.00 59.73 O +ATOM 1106 NE2 GLN A 169 17.740 -13.349 41.607 1.00 51.83 N +ATOM 1107 N TYR A 170 22.432 -11.899 44.616 1.00 49.31 N +ATOM 1108 CA TYR A 170 23.871 -12.111 44.540 1.00 47.75 C +ATOM 1109 C TYR A 170 24.483 -12.236 45.937 1.00 49.18 C +ATOM 1110 O TYR A 170 25.413 -13.013 46.142 1.00 47.09 O +ATOM 1111 CB TYR A 170 24.562 -10.968 43.786 1.00 44.00 C +ATOM 1112 CG TYR A 170 26.076 -11.068 43.821 1.00 40.28 C +ATOM 1113 CD1 TYR A 170 26.827 -10.319 44.731 1.00 40.65 C +ATOM 1114 CD2 TYR A 170 26.751 -11.981 43.005 1.00 38.08 C +ATOM 1115 CE1 TYR A 170 28.214 -10.483 44.836 1.00 38.82 C +ATOM 1116 CE2 TYR A 170 28.128 -12.154 43.100 1.00 36.97 C +ATOM 1117 CZ TYR A 170 28.855 -11.408 44.019 1.00 40.23 C +ATOM 1118 OH TYR A 170 30.213 -11.626 44.153 1.00 42.60 O +ATOM 1119 N ILE A 171 23.962 -11.469 46.889 1.00 50.44 N +ATOM 1120 CA ILE A 171 24.473 -11.500 48.253 1.00 52.69 C +ATOM 1121 C ILE A 171 23.675 -12.455 49.139 1.00 54.71 C +ATOM 1122 O ILE A 171 23.843 -12.461 50.356 1.00 55.94 O +ATOM 1123 CB ILE A 171 24.443 -10.091 48.912 1.00 51.46 C +ATOM 1124 CG1 ILE A 171 23.003 -9.599 49.033 1.00 50.91 C +ATOM 1125 CG2 ILE A 171 25.267 -9.106 48.092 1.00 50.86 C +ATOM 1126 CD1 ILE A 171 22.866 -8.252 49.715 0.00 51.27 C +ATOM 1127 N SER A 172 22.816 -13.265 48.529 1.00 55.84 N +ATOM 1128 CA SER A 172 21.997 -14.201 49.289 1.00 57.75 C +ATOM 1129 C SER A 172 22.549 -15.622 49.253 1.00 59.50 C +ATOM 1130 O SER A 172 23.239 -16.012 48.309 1.00 58.53 O +ATOM 1131 CB SER A 172 20.566 -14.215 48.747 1.00 56.94 C +ATOM 1132 OG SER A 172 20.508 -14.919 47.520 1.00 57.04 O +ATOM 1133 N ASP A 173 22.227 -16.388 50.292 1.00 61.09 N +ATOM 1134 CA ASP A 173 22.657 -17.775 50.408 1.00 63.15 C +ATOM 1135 C ASP A 173 22.171 -18.588 49.216 1.00 63.71 C +ATOM 1136 O ASP A 173 20.971 -18.697 48.976 1.00 61.73 O +ATOM 1137 CB ASP A 173 22.103 -18.387 51.695 1.00 65.30 C +ATOM 1138 CG ASP A 173 22.196 -19.898 51.702 1.00 68.32 C +ATOM 1139 OD1 ASP A 173 23.334 -20.419 51.671 1.00 69.17 O +ATOM 1140 OD2 ASP A 173 21.129 -20.561 51.730 1.00 69.96 O +ATOM 1141 N THR A 174 23.104 -19.173 48.479 1.00 66.61 N +ATOM 1142 CA THR A 174 22.748 -19.962 47.305 1.00 71.27 C +ATOM 1143 C THR A 174 22.098 -21.315 47.610 1.00 72.73 C +ATOM 1144 O THR A 174 21.621 -21.994 46.700 1.00 73.32 O +ATOM 1145 CB THR A 174 23.983 -20.202 46.413 1.00 71.93 C +ATOM 1146 OG1 THR A 174 23.625 -21.057 45.322 1.00 74.08 O +ATOM 1147 CG2 THR A 174 25.103 -20.846 47.214 1.00 72.89 C +ATOM 1148 N GLU A 175 22.069 -21.699 48.885 1.00 74.57 N +ATOM 1149 CA GLU A 175 21.488 -22.979 49.289 1.00 76.10 C +ATOM 1150 C GLU A 175 19.966 -22.984 49.345 1.00 75.78 C +ATOM 1151 O GLU A 175 19.323 -23.867 48.776 1.00 76.48 O +ATOM 1152 CB GLU A 175 22.045 -23.406 50.651 1.00 78.95 C +ATOM 1153 CG GLU A 175 23.547 -23.638 50.653 1.00 82.58 C +ATOM 1154 CD GLU A 175 23.970 -24.718 49.671 1.00 85.41 C +ATOM 1155 OE1 GLU A 175 23.630 -25.901 49.901 1.00 86.80 O +ATOM 1156 OE2 GLU A 175 24.637 -24.383 48.666 1.00 86.84 O +ATOM 1157 N GLU A 176 19.388 -22.008 50.038 1.00 75.21 N +ATOM 1158 CA GLU A 176 17.937 -21.926 50.158 1.00 75.02 C +ATOM 1159 C GLU A 176 17.371 -20.582 49.701 1.00 73.25 C +ATOM 1160 O GLU A 176 16.374 -20.528 48.977 1.00 73.10 O +ATOM 1161 CB GLU A 176 17.526 -22.208 51.609 1.00 77.94 C +ATOM 1162 CG GLU A 176 16.125 -21.736 51.987 1.00 81.71 C +ATOM 1163 CD GLU A 176 16.101 -20.290 52.466 1.00 83.93 C +ATOM 1164 OE1 GLU A 176 14.993 -19.750 52.690 1.00 84.62 O +ATOM 1165 OE2 GLU A 176 17.191 -19.696 52.627 1.00 85.33 O +ATOM 1166 N LYS A 177 18.022 -19.506 50.127 1.00 70.82 N +ATOM 1167 CA LYS A 177 17.609 -18.146 49.804 1.00 67.72 C +ATOM 1168 C LYS A 177 17.476 -17.887 48.296 1.00 65.49 C +ATOM 1169 O LYS A 177 16.414 -17.492 47.812 1.00 65.35 O +ATOM 1170 CB LYS A 177 18.620 -17.168 50.406 1.00 69.22 C +ATOM 1171 CG LYS A 177 18.089 -15.775 50.682 1.00 71.61 C +ATOM 1172 CD LYS A 177 17.734 -15.599 52.154 1.00 72.64 C +ATOM 1173 CE LYS A 177 16.607 -16.524 52.578 1.00 72.94 C +ATOM 1174 NZ LYS A 177 16.278 -16.356 54.020 1.00 75.14 N +ATOM 1175 N LEU A 178 18.558 -18.122 47.560 1.00 62.36 N +ATOM 1176 CA LEU A 178 18.593 -17.892 46.118 1.00 59.67 C +ATOM 1177 C LEU A 178 17.493 -18.573 45.305 1.00 58.24 C +ATOM 1178 O LEU A 178 16.775 -17.911 44.560 1.00 58.15 O +ATOM 1179 CB LEU A 178 19.974 -18.282 45.570 1.00 59.70 C +ATOM 1180 CG LEU A 178 20.325 -18.051 44.095 1.00 58.75 C +ATOM 1181 CD1 LEU A 178 19.661 -19.102 43.229 1.00 59.95 C +ATOM 1182 CD2 LEU A 178 19.907 -16.646 43.677 1.00 57.60 C +ATOM 1183 N PRO A 179 17.352 -19.904 45.425 1.00 57.64 N +ATOM 1184 CA PRO A 179 16.317 -20.623 44.672 1.00 55.59 C +ATOM 1185 C PRO A 179 14.903 -20.080 44.912 1.00 54.54 C +ATOM 1186 O PRO A 179 14.055 -20.104 44.019 1.00 52.58 O +ATOM 1187 CB PRO A 179 16.468 -22.062 45.170 1.00 56.40 C +ATOM 1188 CG PRO A 179 17.914 -22.152 45.514 1.00 56.07 C +ATOM 1189 CD PRO A 179 18.156 -20.844 46.226 1.00 57.62 C +ATOM 1190 N SER A 180 14.657 -19.602 46.129 1.00 53.64 N +ATOM 1191 CA SER A 180 13.353 -19.060 46.485 1.00 53.31 C +ATOM 1192 C SER A 180 13.111 -17.765 45.729 1.00 52.02 C +ATOM 1193 O SER A 180 12.032 -17.557 45.184 1.00 51.79 O +ATOM 1194 CB SER A 180 13.277 -18.797 47.988 1.00 53.49 C +ATOM 1195 OG SER A 180 13.485 -19.993 48.713 1.00 58.20 O +ATOM 1196 N ILE A 181 14.120 -16.897 45.706 1.00 50.44 N +ATOM 1197 CA ILE A 181 14.017 -15.627 45.002 1.00 48.97 C +ATOM 1198 C ILE A 181 13.815 -15.902 43.513 1.00 49.61 C +ATOM 1199 O ILE A 181 12.879 -15.397 42.897 1.00 49.54 O +ATOM 1200 CB ILE A 181 15.299 -14.771 45.178 1.00 47.58 C +ATOM 1201 CG1 ILE A 181 15.485 -14.387 46.650 1.00 43.55 C +ATOM 1202 CG2 ILE A 181 15.216 -13.526 44.299 1.00 44.10 C +ATOM 1203 CD1 ILE A 181 16.744 -13.590 46.924 0.00 45.20 C +ATOM 1204 N VAL A 182 14.687 -16.729 42.950 1.00 49.11 N +ATOM 1205 CA VAL A 182 14.626 -17.064 41.534 1.00 50.19 C +ATOM 1206 C VAL A 182 13.291 -17.616 41.047 1.00 52.11 C +ATOM 1207 O VAL A 182 12.769 -17.171 40.025 1.00 52.99 O +ATOM 1208 CB VAL A 182 15.732 -18.073 41.156 1.00 48.71 C +ATOM 1209 CG1 VAL A 182 15.598 -18.477 39.696 1.00 47.51 C +ATOM 1210 CG2 VAL A 182 17.101 -17.457 41.412 1.00 47.64 C +ATOM 1211 N PHE A 183 12.735 -18.584 41.765 1.00 53.99 N +ATOM 1212 CA PHE A 183 11.475 -19.181 41.339 1.00 55.22 C +ATOM 1213 C PHE A 183 10.258 -18.308 41.599 1.00 54.08 C +ATOM 1214 O PHE A 183 9.282 -18.373 40.856 1.00 54.18 O +ATOM 1215 CB PHE A 183 11.294 -20.562 41.982 1.00 57.68 C +ATOM 1216 CG PHE A 183 12.316 -21.581 41.534 1.00 60.83 C +ATOM 1217 CD1 PHE A 183 12.340 -22.854 42.095 1.00 63.77 C +ATOM 1218 CD2 PHE A 183 13.268 -21.263 40.565 1.00 62.25 C +ATOM 1219 CE1 PHE A 183 13.297 -23.793 41.703 1.00 64.46 C +ATOM 1220 CE2 PHE A 183 14.227 -22.193 40.167 1.00 63.37 C +ATOM 1221 CZ PHE A 183 14.242 -23.460 40.739 1.00 63.62 C +ATOM 1222 N TRP A 184 10.304 -17.486 42.640 1.00 53.30 N +ATOM 1223 CA TRP A 184 9.169 -16.617 42.910 1.00 53.51 C +ATOM 1224 C TRP A 184 9.045 -15.579 41.793 1.00 54.72 C +ATOM 1225 O TRP A 184 7.943 -15.159 41.444 1.00 56.16 O +ATOM 1226 CB TRP A 184 9.322 -15.894 44.246 1.00 51.42 C +ATOM 1227 CG TRP A 184 8.147 -15.000 44.525 1.00 52.05 C +ATOM 1228 CD1 TRP A 184 6.890 -15.390 44.888 1.00 52.57 C +ATOM 1229 CD2 TRP A 184 8.101 -13.574 44.397 1.00 50.88 C +ATOM 1230 NE1 TRP A 184 6.063 -14.298 44.991 1.00 52.66 N +ATOM 1231 CE2 TRP A 184 6.780 -13.170 44.694 1.00 50.34 C +ATOM 1232 CE3 TRP A 184 9.047 -12.598 44.056 1.00 51.34 C +ATOM 1233 CZ2 TRP A 184 6.379 -11.833 44.663 1.00 48.91 C +ATOM 1234 CZ3 TRP A 184 8.649 -11.267 44.024 1.00 50.17 C +ATOM 1235 CH2 TRP A 184 7.325 -10.898 44.327 1.00 49.16 C +ATOM 1236 N LEU A 185 10.179 -15.168 41.233 1.00 54.58 N +ATOM 1237 CA LEU A 185 10.175 -14.181 40.159 1.00 55.14 C +ATOM 1238 C LEU A 185 9.563 -14.755 38.894 1.00 55.60 C +ATOM 1239 O LEU A 185 9.293 -14.024 37.944 1.00 58.14 O +ATOM 1240 CB LEU A 185 11.596 -13.687 39.870 1.00 52.00 C +ATOM 1241 CG LEU A 185 12.262 -12.910 41.009 1.00 50.17 C +ATOM 1242 CD1 LEU A 185 13.699 -12.591 40.638 1.00 50.70 C +ATOM 1243 CD2 LEU A 185 11.481 -11.640 41.294 1.00 49.66 C +ATOM 1244 N MET A 186 9.341 -16.062 38.876 1.00 55.79 N +ATOM 1245 CA MET A 186 8.747 -16.684 37.706 1.00 57.05 C +ATOM 1246 C MET A 186 7.226 -16.721 37.783 1.00 56.63 C +ATOM 1247 O MET A 186 6.548 -16.812 36.769 1.00 57.34 O +ATOM 1248 CB MET A 186 9.311 -18.089 37.506 1.00 59.40 C +ATOM 1249 CG MET A 186 10.680 -18.076 36.859 1.00 62.33 C +ATOM 1250 SD MET A 186 11.352 -19.714 36.576 1.00 66.64 S +ATOM 1251 CE MET A 186 12.920 -19.591 37.464 1.00 64.57 C +ATOM 1252 N GLY A 187 6.685 -16.641 38.988 1.00 55.40 N +ATOM 1253 CA GLY A 187 5.242 -16.643 39.126 1.00 54.90 C +ATOM 1254 C GLY A 187 4.526 -17.869 38.595 1.00 53.64 C +ATOM 1255 O GLY A 187 4.830 -18.384 37.518 1.00 53.85 O +ATOM 1256 N SER A 188 3.559 -18.336 39.375 1.00 52.42 N +ATOM 1257 CA SER A 188 2.761 -19.500 39.015 1.00 50.85 C +ATOM 1258 C SER A 188 1.563 -19.521 39.939 1.00 48.25 C +ATOM 1259 O SER A 188 1.474 -18.721 40.872 1.00 45.22 O +ATOM 1260 CB SER A 188 3.561 -20.797 39.193 1.00 53.18 C +ATOM 1261 OG SER A 188 3.640 -21.175 40.559 1.00 52.52 O +ATOM 1262 N PHE A 189 0.646 -20.441 39.672 1.00 47.47 N +ATOM 1263 CA PHE A 189 -0.559 -20.582 40.475 1.00 47.84 C +ATOM 1264 C PHE A 189 -0.518 -21.904 41.248 1.00 48.97 C +ATOM 1265 O PHE A 189 -1.522 -22.332 41.824 1.00 49.02 O +ATOM 1266 CB PHE A 189 -1.783 -20.541 39.559 1.00 46.54 C +ATOM 1267 CG PHE A 189 -1.903 -19.266 38.760 1.00 46.06 C +ATOM 1268 CD1 PHE A 189 -2.067 -19.308 37.381 1.00 43.81 C +ATOM 1269 CD2 PHE A 189 -1.880 -18.023 39.391 1.00 45.55 C +ATOM 1270 CE1 PHE A 189 -2.209 -18.133 36.640 1.00 44.32 C +ATOM 1271 CE2 PHE A 189 -2.021 -16.843 38.658 1.00 44.37 C +ATOM 1272 CZ PHE A 189 -2.186 -16.899 37.279 1.00 42.23 C +ATOM 1273 N ALA A 190 0.654 -22.535 41.265 1.00 49.13 N +ATOM 1274 CA ALA A 190 0.836 -23.818 41.941 1.00 50.42 C +ATOM 1275 C ALA A 190 0.572 -23.758 43.445 1.00 50.63 C +ATOM 1276 O ALA A 190 0.118 -24.735 44.033 1.00 51.08 O +ATOM 1277 CB ALA A 190 2.242 -24.359 41.672 1.00 47.30 C +ATOM 1278 N THR A 191 0.857 -22.623 44.073 1.00 50.52 N +ATOM 1279 CA THR A 191 0.609 -22.499 45.501 1.00 50.50 C +ATOM 1280 C THR A 191 -0.571 -21.577 45.766 1.00 49.91 C +ATOM 1281 O THR A 191 -0.572 -20.828 46.742 1.00 50.15 O +ATOM 1282 CB THR A 191 1.839 -21.953 46.263 1.00 52.11 C +ATOM 1283 OG1 THR A 191 2.106 -20.608 45.848 1.00 54.96 O +ATOM 1284 CG2 THR A 191 3.066 -22.826 45.998 1.00 50.77 C +ATOM 1285 N SER A 192 -1.580 -21.631 44.900 1.00 50.53 N +ATOM 1286 CA SER A 192 -2.755 -20.787 45.082 1.00 53.46 C +ATOM 1287 C SER A 192 -3.759 -21.436 46.033 1.00 54.66 C +ATOM 1288 O SER A 192 -4.009 -22.639 45.955 1.00 55.93 O +ATOM 1289 CB SER A 192 -3.420 -20.495 43.732 1.00 53.85 C +ATOM 1290 OG SER A 192 -3.928 -21.672 43.139 1.00 56.82 O +ATOM 1291 N ASN A 193 -4.325 -20.630 46.931 1.00 55.07 N +ATOM 1292 CA ASN A 193 -5.297 -21.105 47.912 1.00 54.69 C +ATOM 1293 C ASN A 193 -6.385 -20.058 48.175 1.00 54.70 C +ATOM 1294 O ASN A 193 -6.290 -18.929 47.697 1.00 53.56 O +ATOM 1295 CB ASN A 193 -4.589 -21.449 49.223 1.00 55.68 C +ATOM 1296 CG ASN A 193 -3.874 -20.259 49.827 1.00 56.20 C +ATOM 1297 OD1 ASN A 193 -4.467 -19.195 50.022 1.00 57.21 O +ATOM 1298 ND2 ASN A 193 -2.594 -20.432 50.133 1.00 55.42 N +ATOM 1299 N TRP A 194 -7.410 -20.428 48.944 1.00 53.10 N +ATOM 1300 CA TRP A 194 -8.503 -19.505 49.238 1.00 53.85 C +ATOM 1301 C TRP A 194 -8.076 -18.226 49.963 1.00 54.16 C +ATOM 1302 O TRP A 194 -8.717 -17.182 49.826 1.00 52.83 O +ATOM 1303 CB TRP A 194 -9.607 -20.209 50.042 1.00 53.28 C +ATOM 1304 CG TRP A 194 -10.391 -21.207 49.235 1.00 53.89 C +ATOM 1305 CD1 TRP A 194 -10.267 -22.567 49.265 1.00 51.95 C +ATOM 1306 CD2 TRP A 194 -11.380 -20.918 48.235 1.00 54.13 C +ATOM 1307 NE1 TRP A 194 -11.111 -23.141 48.346 1.00 53.43 N +ATOM 1308 CE2 TRP A 194 -11.806 -22.153 47.699 1.00 53.71 C +ATOM 1309 CE3 TRP A 194 -11.945 -19.733 47.739 1.00 53.68 C +ATOM 1310 CZ2 TRP A 194 -12.774 -22.241 46.689 1.00 54.59 C +ATOM 1311 CZ3 TRP A 194 -12.907 -19.819 46.734 1.00 53.55 C +ATOM 1312 CH2 TRP A 194 -13.310 -21.067 46.221 1.00 54.47 C +ATOM 1313 N GLU A 195 -6.999 -18.297 50.732 1.00 54.90 N +ATOM 1314 CA GLU A 195 -6.536 -17.118 51.450 1.00 56.29 C +ATOM 1315 C GLU A 195 -6.003 -16.062 50.477 1.00 55.67 C +ATOM 1316 O GLU A 195 -6.270 -14.870 50.639 1.00 53.85 O +ATOM 1317 CB GLU A 195 -5.453 -17.506 52.459 1.00 58.34 C +ATOM 1318 CG GLU A 195 -4.887 -16.333 53.235 1.00 62.99 C +ATOM 1319 CD GLU A 195 -3.893 -16.759 54.302 1.00 66.01 C +ATOM 1320 OE1 GLU A 195 -2.910 -17.458 53.969 1.00 66.71 O +ATOM 1321 OE2 GLU A 195 -4.095 -16.387 55.476 1.00 67.60 O +ATOM 1322 N LYS A 196 -5.255 -16.504 49.468 1.00 54.20 N +ATOM 1323 CA LYS A 196 -4.691 -15.595 48.471 1.00 54.00 C +ATOM 1324 C LYS A 196 -5.758 -15.064 47.523 1.00 53.36 C +ATOM 1325 O LYS A 196 -5.795 -13.873 47.223 1.00 52.02 O +ATOM 1326 CB LYS A 196 -3.605 -16.298 47.655 1.00 54.19 C +ATOM 1327 CG LYS A 196 -2.304 -16.529 48.400 1.00 55.98 C +ATOM 1328 CD LYS A 196 -1.342 -17.336 47.545 1.00 57.88 C +ATOM 1329 CE LYS A 196 -0.028 -17.578 48.255 1.00 58.86 C +ATOM 1330 NZ LYS A 196 0.857 -18.482 47.465 1.00 60.60 N +ATOM 1331 N LEU A 197 -6.625 -15.956 47.056 1.00 53.04 N +ATOM 1332 CA LEU A 197 -7.688 -15.571 46.141 1.00 53.35 C +ATOM 1333 C LEU A 197 -8.528 -14.445 46.729 1.00 54.30 C +ATOM 1334 O LEU A 197 -8.809 -13.457 46.052 1.00 54.35 O +ATOM 1335 CB LEU A 197 -8.594 -16.765 45.833 1.00 52.57 C +ATOM 1336 CG LEU A 197 -9.155 -16.857 44.408 1.00 55.39 C +ATOM 1337 CD1 LEU A 197 -10.349 -17.806 44.403 1.00 53.88 C +ATOM 1338 CD2 LEU A 197 -9.569 -15.479 43.901 1.00 52.94 C +ATOM 1339 N LEU A 198 -8.927 -14.590 47.989 1.00 54.65 N +ATOM 1340 CA LEU A 198 -9.750 -13.574 48.633 1.00 56.39 C +ATOM 1341 C LEU A 198 -8.980 -12.284 48.892 1.00 56.42 C +ATOM 1342 O LEU A 198 -9.561 -11.198 48.898 1.00 56.54 O +ATOM 1343 CB LEU A 198 -10.336 -14.115 49.942 1.00 57.31 C +ATOM 1344 CG LEU A 198 -11.203 -15.372 49.784 1.00 59.73 C +ATOM 1345 CD1 LEU A 198 -11.673 -15.853 51.154 1.00 60.13 C +ATOM 1346 CD2 LEU A 198 -12.393 -15.077 48.879 1.00 59.70 C +ATOM 1347 N PHE A 199 -7.674 -12.398 49.105 1.00 55.37 N +ATOM 1348 CA PHE A 199 -6.852 -11.218 49.341 1.00 55.61 C +ATOM 1349 C PHE A 199 -6.831 -10.362 48.071 1.00 55.67 C +ATOM 1350 O PHE A 199 -7.044 -9.151 48.117 1.00 54.87 O +ATOM 1351 CB PHE A 199 -5.421 -11.625 49.696 1.00 56.15 C +ATOM 1352 CG PHE A 199 -4.449 -10.480 49.692 1.00 58.37 C +ATOM 1353 CD1 PHE A 199 -4.448 -9.545 50.723 1.00 59.68 C +ATOM 1354 CD2 PHE A 199 -3.550 -10.320 48.640 1.00 58.71 C +ATOM 1355 CE1 PHE A 199 -3.564 -8.466 50.709 1.00 59.49 C +ATOM 1356 CE2 PHE A 199 -2.666 -9.249 48.615 1.00 59.04 C +ATOM 1357 CZ PHE A 199 -2.672 -8.317 49.654 1.00 59.54 C +ATOM 1358 N PHE A 200 -6.572 -11.014 46.943 1.00 53.34 N +ATOM 1359 CA PHE A 200 -6.504 -10.353 45.648 1.00 52.61 C +ATOM 1360 C PHE A 200 -7.878 -9.950 45.121 1.00 53.04 C +ATOM 1361 O PHE A 200 -8.038 -8.882 44.524 1.00 53.01 O +ATOM 1362 CB PHE A 200 -5.806 -11.280 44.647 1.00 49.87 C +ATOM 1363 CG PHE A 200 -5.879 -10.809 43.226 1.00 51.37 C +ATOM 1364 CD1 PHE A 200 -6.797 -11.365 42.344 1.00 51.25 C +ATOM 1365 CD2 PHE A 200 -5.037 -9.803 42.767 1.00 50.44 C +ATOM 1366 CE1 PHE A 200 -6.874 -10.927 41.028 1.00 50.46 C +ATOM 1367 CE2 PHE A 200 -5.109 -9.361 41.451 1.00 50.33 C +ATOM 1368 CZ PHE A 200 -6.028 -9.922 40.582 1.00 48.74 C +ATOM 1369 N PHE A 201 -8.868 -10.805 45.353 1.00 52.82 N +ATOM 1370 CA PHE A 201 -10.225 -10.558 44.887 1.00 51.70 C +ATOM 1371 C PHE A 201 -10.812 -9.223 45.322 1.00 50.43 C +ATOM 1372 O PHE A 201 -11.534 -8.589 44.557 1.00 51.51 O +ATOM 1373 CB PHE A 201 -11.152 -11.696 45.325 1.00 52.73 C +ATOM 1374 CG PHE A 201 -12.535 -11.595 44.755 1.00 53.24 C +ATOM 1375 CD1 PHE A 201 -13.548 -10.942 45.458 1.00 53.94 C +ATOM 1376 CD2 PHE A 201 -12.812 -12.097 43.484 1.00 52.39 C +ATOM 1377 CE1 PHE A 201 -14.817 -10.785 44.902 1.00 53.92 C +ATOM 1378 CE2 PHE A 201 -14.075 -11.947 42.914 1.00 52.34 C +ATOM 1379 CZ PHE A 201 -15.081 -11.289 43.624 1.00 54.62 C +ATOM 1380 N VAL A 202 -10.515 -8.786 46.538 1.00 49.78 N +ATOM 1381 CA VAL A 202 -11.049 -7.511 47.003 1.00 49.67 C +ATOM 1382 C VAL A 202 -10.546 -6.346 46.133 1.00 49.49 C +ATOM 1383 O VAL A 202 -11.344 -5.575 45.604 1.00 47.88 O +ATOM 1384 CB VAL A 202 -10.692 -7.254 48.492 1.00 49.92 C +ATOM 1385 CG1 VAL A 202 -11.156 -5.877 48.912 1.00 47.94 C +ATOM 1386 CG2 VAL A 202 -11.350 -8.303 49.373 1.00 50.61 C +ATOM 1387 N PRO A 203 -9.217 -6.204 45.975 1.00 49.09 N +ATOM 1388 CA PRO A 203 -8.693 -5.107 45.148 1.00 49.14 C +ATOM 1389 C PRO A 203 -9.147 -5.285 43.701 1.00 48.81 C +ATOM 1390 O PRO A 203 -9.499 -4.324 43.015 1.00 47.81 O +ATOM 1391 CB PRO A 203 -7.178 -5.259 45.279 1.00 48.51 C +ATOM 1392 CG PRO A 203 -7.009 -5.966 46.595 1.00 50.64 C +ATOM 1393 CD PRO A 203 -8.117 -6.977 46.574 1.00 48.26 C +ATOM 1394 N PHE A 204 -9.144 -6.537 43.257 1.00 47.87 N +ATOM 1395 CA PHE A 204 -9.539 -6.876 41.902 1.00 48.01 C +ATOM 1396 C PHE A 204 -10.940 -6.380 41.585 1.00 49.28 C +ATOM 1397 O PHE A 204 -11.148 -5.691 40.590 1.00 50.27 O +ATOM 1398 CB PHE A 204 -9.455 -8.390 41.703 1.00 46.15 C +ATOM 1399 CG PHE A 204 -10.048 -8.864 40.414 1.00 45.31 C +ATOM 1400 CD1 PHE A 204 -11.249 -9.571 40.407 1.00 44.69 C +ATOM 1401 CD2 PHE A 204 -9.425 -8.584 39.202 1.00 42.94 C +ATOM 1402 CE1 PHE A 204 -11.823 -9.995 39.212 1.00 43.35 C +ATOM 1403 CE2 PHE A 204 -9.988 -9.002 38.001 1.00 44.15 C +ATOM 1404 CZ PHE A 204 -11.194 -9.711 38.004 1.00 43.13 C +ATOM 1405 N LEU A 205 -11.898 -6.727 42.437 1.00 50.00 N +ATOM 1406 CA LEU A 205 -13.286 -6.318 42.239 1.00 50.50 C +ATOM 1407 C LEU A 205 -13.441 -4.805 42.343 1.00 50.19 C +ATOM 1408 O LEU A 205 -14.238 -4.199 41.623 1.00 48.13 O +ATOM 1409 CB LEU A 205 -14.186 -6.988 43.277 1.00 51.00 C +ATOM 1410 CG LEU A 205 -15.682 -6.718 43.143 1.00 53.08 C +ATOM 1411 CD1 LEU A 205 -16.200 -7.316 41.838 1.00 51.21 C +ATOM 1412 CD2 LEU A 205 -16.412 -7.313 44.340 1.00 53.80 C +ATOM 1413 N LEU A 206 -12.679 -4.202 43.248 1.00 49.45 N +ATOM 1414 CA LEU A 206 -12.731 -2.764 43.454 1.00 50.52 C +ATOM 1415 C LEU A 206 -12.251 -2.040 42.196 1.00 50.49 C +ATOM 1416 O LEU A 206 -13.006 -1.306 41.559 1.00 49.21 O +ATOM 1417 CB LEU A 206 -11.841 -2.376 44.633 1.00 52.42 C +ATOM 1418 CG LEU A 206 -12.352 -1.272 45.557 1.00 55.18 C +ATOM 1419 CD1 LEU A 206 -12.686 -0.025 44.751 1.00 57.34 C +ATOM 1420 CD2 LEU A 206 -13.590 -1.773 46.295 1.00 58.35 C +ATOM 1421 N CYS A 207 -10.988 -2.270 41.847 1.00 50.42 N +ATOM 1422 CA CYS A 207 -10.357 -1.653 40.684 1.00 48.96 C +ATOM 1423 C CYS A 207 -11.106 -1.883 39.380 1.00 47.44 C +ATOM 1424 O CYS A 207 -11.338 -0.945 38.619 1.00 45.59 O +ATOM 1425 CB CYS A 207 -8.922 -2.160 40.541 1.00 49.58 C +ATOM 1426 SG CYS A 207 -7.835 -1.668 41.899 1.00 51.59 S +ATOM 1427 N SER A 208 -11.477 -3.132 39.125 1.00 46.73 N +ATOM 1428 CA SER A 208 -12.192 -3.477 37.906 1.00 47.80 C +ATOM 1429 C SER A 208 -13.535 -2.767 37.803 1.00 48.48 C +ATOM 1430 O SER A 208 -13.992 -2.449 36.704 1.00 49.32 O +ATOM 1431 CB SER A 208 -12.399 -4.986 37.829 1.00 46.28 C +ATOM 1432 OG SER A 208 -11.148 -5.649 37.827 1.00 49.84 O +ATOM 1433 N SER A 209 -14.164 -2.522 38.949 1.00 48.80 N +ATOM 1434 CA SER A 209 -15.454 -1.844 38.983 1.00 49.31 C +ATOM 1435 C SER A 209 -15.323 -0.376 38.603 1.00 47.45 C +ATOM 1436 O SER A 209 -16.083 0.125 37.779 1.00 45.63 O +ATOM 1437 CB SER A 209 -16.079 -1.949 40.375 1.00 50.97 C +ATOM 1438 OG SER A 209 -16.437 -3.288 40.655 1.00 58.17 O +ATOM 1439 N ILE A 210 -14.374 0.315 39.222 1.00 46.65 N +ATOM 1440 CA ILE A 210 -14.161 1.717 38.916 1.00 46.30 C +ATOM 1441 C ILE A 210 -13.774 1.826 37.439 1.00 46.48 C +ATOM 1442 O ILE A 210 -14.394 2.578 36.686 1.00 44.30 O +ATOM 1443 CB ILE A 210 -13.047 2.319 39.801 1.00 48.06 C +ATOM 1444 CG1 ILE A 210 -13.397 2.131 41.285 1.00 47.23 C +ATOM 1445 CG2 ILE A 210 -12.881 3.803 39.492 1.00 46.56 C +ATOM 1446 CD1 ILE A 210 -12.334 2.639 42.238 0.00 47.67 C +ATOM 1447 N LEU A 211 -12.769 1.054 37.023 1.00 45.43 N +ATOM 1448 CA LEU A 211 -12.323 1.075 35.630 1.00 44.98 C +ATOM 1449 C LEU A 211 -13.471 0.806 34.666 1.00 45.62 C +ATOM 1450 O LEU A 211 -13.550 1.425 33.599 1.00 44.76 O +ATOM 1451 CB LEU A 211 -11.209 0.047 35.388 1.00 42.53 C +ATOM 1452 CG LEU A 211 -9.817 0.398 35.913 1.00 41.85 C +ATOM 1453 CD1 LEU A 211 -8.879 -0.776 35.704 1.00 40.21 C +ATOM 1454 CD2 LEU A 211 -9.297 1.631 35.193 1.00 41.76 C +ATOM 1455 N LEU A 212 -14.354 -0.122 35.024 1.00 44.83 N +ATOM 1456 CA LEU A 212 -15.488 -0.427 34.157 1.00 45.97 C +ATOM 1457 C LEU A 212 -16.492 0.730 34.139 1.00 46.95 C +ATOM 1458 O LEU A 212 -17.176 0.946 33.138 1.00 47.64 O +ATOM 1459 CB LEU A 212 -16.189 -1.710 34.609 1.00 44.98 C +ATOM 1460 CG LEU A 212 -15.587 -3.059 34.190 1.00 48.28 C +ATOM 1461 CD1 LEU A 212 -16.328 -4.184 34.901 1.00 46.77 C +ATOM 1462 CD2 LEU A 212 -15.685 -3.242 32.683 1.00 46.66 C +ATOM 1463 N SER A 213 -16.581 1.473 35.240 1.00 45.55 N +ATOM 1464 CA SER A 213 -17.513 2.589 35.304 1.00 47.35 C +ATOM 1465 C SER A 213 -16.977 3.766 34.485 1.00 46.85 C +ATOM 1466 O SER A 213 -17.741 4.628 34.053 1.00 47.92 O +ATOM 1467 CB SER A 213 -17.755 3.018 36.758 1.00 46.00 C +ATOM 1468 OG SER A 213 -16.626 3.678 37.308 1.00 48.49 O +ATOM 1469 N LEU A 214 -15.660 3.784 34.289 1.00 45.19 N +ATOM 1470 CA LEU A 214 -14.969 4.808 33.509 1.00 44.46 C +ATOM 1471 C LEU A 214 -14.784 4.253 32.110 1.00 44.32 C +ATOM 1472 O LEU A 214 -13.997 4.766 31.326 1.00 45.17 O +ATOM 1473 CB LEU A 214 -13.585 5.084 34.086 1.00 43.39 C +ATOM 1474 CG LEU A 214 -13.428 5.920 35.347 1.00 45.77 C +ATOM 1475 CD1 LEU A 214 -11.998 5.797 35.828 1.00 45.77 C +ATOM 1476 CD2 LEU A 214 -13.777 7.380 35.057 1.00 46.20 C +ATOM 1477 N SER A 215 -15.506 3.181 31.822 1.00 46.22 N +ATOM 1478 CA SER A 215 -15.434 2.499 30.537 1.00 46.36 C +ATOM 1479 C SER A 215 -15.471 3.453 29.341 1.00 47.01 C +ATOM 1480 O SER A 215 -14.597 3.414 28.471 1.00 47.33 O +ATOM 1481 CB SER A 215 -16.588 1.504 30.439 1.00 45.32 C +ATOM 1482 OG SER A 215 -16.327 0.510 29.472 1.00 52.96 O +ATOM 1483 N TRP A 216 -16.482 4.312 29.297 1.00 46.31 N +ATOM 1484 CA TRP A 216 -16.607 5.237 28.183 1.00 45.80 C +ATOM 1485 C TRP A 216 -15.598 6.377 28.226 1.00 45.35 C +ATOM 1486 O TRP A 216 -15.007 6.720 27.207 1.00 46.51 O +ATOM 1487 CB TRP A 216 -18.018 5.814 28.120 1.00 43.08 C +ATOM 1488 CG TRP A 216 -18.226 6.656 26.910 1.00 41.95 C +ATOM 1489 CD1 TRP A 216 -18.413 6.221 25.628 1.00 39.75 C +ATOM 1490 CD2 TRP A 216 -18.216 8.085 26.853 1.00 37.58 C +ATOM 1491 NE1 TRP A 216 -18.520 7.290 24.779 1.00 39.71 N +ATOM 1492 CE2 TRP A 216 -18.401 8.449 25.503 1.00 38.12 C +ATOM 1493 CE3 TRP A 216 -18.067 9.094 27.813 1.00 36.55 C +ATOM 1494 CZ2 TRP A 216 -18.442 9.787 25.083 1.00 35.62 C +ATOM 1495 CZ3 TRP A 216 -18.107 10.426 27.397 1.00 37.95 C +ATOM 1496 CH2 TRP A 216 -18.294 10.757 26.040 1.00 36.03 C +ATOM 1497 N ARG A 217 -15.398 6.964 29.398 1.00 45.38 N +ATOM 1498 CA ARG A 217 -14.453 8.067 29.523 1.00 47.12 C +ATOM 1499 C ARG A 217 -13.053 7.723 29.024 1.00 46.27 C +ATOM 1500 O ARG A 217 -12.321 8.608 28.595 1.00 45.98 O +ATOM 1501 CB ARG A 217 -14.372 8.540 30.973 1.00 48.48 C +ATOM 1502 CG ARG A 217 -15.683 9.068 31.520 1.00 53.03 C +ATOM 1503 CD ARG A 217 -16.034 10.458 30.998 1.00 55.52 C +ATOM 1504 NE ARG A 217 -15.155 11.502 31.526 1.00 55.50 N +ATOM 1505 CZ ARG A 217 -15.423 12.804 31.445 1.00 56.04 C +ATOM 1506 NH1 ARG A 217 -14.578 13.702 31.945 1.00 51.79 N +ATOM 1507 NH2 ARG A 217 -16.550 13.208 30.870 1.00 54.11 N +ATOM 1508 N LEU A 218 -12.675 6.449 29.076 1.00 45.92 N +ATOM 1509 CA LEU A 218 -11.343 6.059 28.621 1.00 44.37 C +ATOM 1510 C LEU A 218 -11.134 6.396 27.147 1.00 42.66 C +ATOM 1511 O LEU A 218 -10.000 6.560 26.699 1.00 41.23 O +ATOM 1512 CB LEU A 218 -11.106 4.564 28.862 1.00 47.06 C +ATOM 1513 CG LEU A 218 -11.094 4.124 30.333 1.00 49.27 C +ATOM 1514 CD1 LEU A 218 -10.815 2.639 30.402 1.00 49.97 C +ATOM 1515 CD2 LEU A 218 -10.039 4.900 31.119 1.00 49.06 C +ATOM 1516 N ASN A 219 -12.227 6.491 26.391 1.00 41.71 N +ATOM 1517 CA ASN A 219 -12.136 6.848 24.980 1.00 40.36 C +ATOM 1518 C ASN A 219 -11.568 8.259 24.834 1.00 39.80 C +ATOM 1519 O ASN A 219 -10.944 8.577 23.825 1.00 38.92 O +ATOM 1520 CB ASN A 219 -13.510 6.805 24.304 1.00 41.99 C +ATOM 1521 CG ASN A 219 -13.999 5.386 24.049 1.00 44.07 C +ATOM 1522 OD1 ASN A 219 -13.217 4.496 23.724 1.00 45.14 O +ATOM 1523 ND2 ASN A 219 -15.304 5.180 24.174 1.00 44.09 N +ATOM 1524 N LEU A 220 -11.782 9.093 25.852 1.00 38.63 N +ATOM 1525 CA LEU A 220 -11.321 10.479 25.854 1.00 39.84 C +ATOM 1526 C LEU A 220 -9.818 10.619 26.073 1.00 41.80 C +ATOM 1527 O LEU A 220 -9.264 11.717 25.950 1.00 41.72 O +ATOM 1528 CB LEU A 220 -12.060 11.275 26.936 1.00 40.47 C +ATOM 1529 CG LEU A 220 -13.586 11.194 26.943 1.00 39.63 C +ATOM 1530 CD1 LEU A 220 -14.130 11.965 28.128 1.00 42.01 C +ATOM 1531 CD2 LEU A 220 -14.138 11.734 25.648 1.00 41.55 C +ATOM 1532 N LEU A 221 -9.170 9.511 26.423 1.00 43.75 N +ATOM 1533 CA LEU A 221 -7.722 9.474 26.648 1.00 44.23 C +ATOM 1534 C LEU A 221 -6.993 9.674 25.320 1.00 43.30 C +ATOM 1535 O LEU A 221 -5.824 10.037 25.288 1.00 44.44 O +ATOM 1536 CB LEU A 221 -7.319 8.113 27.233 1.00 45.58 C +ATOM 1537 CG LEU A 221 -7.093 7.865 28.730 1.00 45.78 C +ATOM 1538 CD1 LEU A 221 -7.794 8.884 29.598 1.00 44.95 C +ATOM 1539 CD2 LEU A 221 -7.578 6.452 29.038 1.00 46.77 C +ATOM 1540 N SER A 222 -7.693 9.413 24.225 1.00 43.09 N +ATOM 1541 CA SER A 222 -7.121 9.558 22.893 1.00 45.88 C +ATOM 1542 C SER A 222 -7.171 11.005 22.390 1.00 46.08 C +ATOM 1543 O SER A 222 -6.572 11.331 21.375 1.00 46.05 O +ATOM 1544 CB SER A 222 -7.877 8.663 21.920 1.00 47.38 C +ATOM 1545 OG SER A 222 -9.231 9.067 21.839 1.00 51.20 O +ATOM 1546 N LEU A 223 -7.896 11.858 23.106 1.00 46.36 N +ATOM 1547 CA LEU A 223 -8.043 13.267 22.748 1.00 46.59 C +ATOM 1548 C LEU A 223 -6.734 14.040 22.906 1.00 48.39 C +ATOM 1549 O LEU A 223 -5.886 13.683 23.728 1.00 49.03 O +ATOM 1550 CB LEU A 223 -9.104 13.914 23.641 1.00 44.61 C +ATOM 1551 CG LEU A 223 -10.534 14.159 23.152 1.00 45.05 C +ATOM 1552 CD1 LEU A 223 -11.017 13.031 22.286 1.00 43.44 C +ATOM 1553 CD2 LEU A 223 -11.437 14.352 24.365 1.00 43.26 C +ATOM 1554 N ASP A 224 -6.567 15.096 22.115 1.00 48.88 N +ATOM 1555 CA ASP A 224 -5.374 15.920 22.231 1.00 48.25 C +ATOM 1556 C ASP A 224 -5.700 17.026 23.233 1.00 45.86 C +ATOM 1557 O ASP A 224 -6.864 17.306 23.504 1.00 42.90 O +ATOM 1558 CB ASP A 224 -4.966 16.520 20.880 1.00 51.38 C +ATOM 1559 CG ASP A 224 -3.510 16.209 20.519 1.00 56.18 C +ATOM 1560 OD1 ASP A 224 -2.935 16.893 19.638 1.00 58.63 O +ATOM 1561 OD2 ASP A 224 -2.938 15.267 21.115 1.00 58.36 O +ATOM 1562 N GLU A 225 -4.660 17.639 23.780 1.00 46.72 N +ATOM 1563 CA GLU A 225 -4.793 18.688 24.786 1.00 47.75 C +ATOM 1564 C GLU A 225 -5.918 19.701 24.571 1.00 45.65 C +ATOM 1565 O GLU A 225 -6.806 19.836 25.411 1.00 44.02 O +ATOM 1566 CB GLU A 225 -3.451 19.416 24.934 1.00 50.35 C +ATOM 1567 CG GLU A 225 -3.462 20.534 25.961 1.00 57.59 C +ATOM 1568 CD GLU A 225 -2.068 20.895 26.451 1.00 60.61 C +ATOM 1569 OE1 GLU A 225 -1.202 21.214 25.606 1.00 62.10 O +ATOM 1570 OE2 GLU A 225 -1.844 20.859 27.685 1.00 61.27 O +ATOM 1571 N LYS A 226 -5.886 20.405 23.447 1.00 44.09 N +ATOM 1572 CA LYS A 226 -6.898 21.411 23.168 1.00 44.55 C +ATOM 1573 C LYS A 226 -8.335 20.909 23.190 1.00 42.65 C +ATOM 1574 O LYS A 226 -9.191 21.504 23.847 1.00 41.88 O +ATOM 1575 CB LYS A 226 -6.604 22.097 21.830 1.00 46.52 C +ATOM 1576 CG LYS A 226 -5.572 23.206 21.945 1.00 49.12 C +ATOM 1577 CD LYS A 226 -5.439 23.997 20.654 1.00 51.85 C +ATOM 1578 CE LYS A 226 -4.584 23.257 19.658 1.00 53.67 C +ATOM 1579 NZ LYS A 226 -3.220 23.049 20.212 1.00 55.45 N +ATOM 1580 N GLU A 227 -8.603 19.823 22.475 1.00 41.82 N +ATOM 1581 CA GLU A 227 -9.953 19.270 22.430 1.00 41.70 C +ATOM 1582 C GLU A 227 -10.387 18.790 23.815 1.00 42.03 C +ATOM 1583 O GLU A 227 -11.552 18.931 24.202 1.00 39.05 O +ATOM 1584 CB GLU A 227 -10.014 18.100 21.447 1.00 42.63 C +ATOM 1585 CG GLU A 227 -11.398 17.473 21.339 1.00 43.61 C +ATOM 1586 CD GLU A 227 -12.396 18.391 20.665 1.00 44.04 C +ATOM 1587 OE1 GLU A 227 -13.611 18.099 20.708 1.00 46.36 O +ATOM 1588 OE2 GLU A 227 -11.961 19.404 20.079 1.00 44.12 O +ATOM 1589 N ALA A 228 -9.439 18.224 24.557 1.00 42.18 N +ATOM 1590 CA ALA A 228 -9.721 17.718 25.894 1.00 43.22 C +ATOM 1591 C ALA A 228 -10.171 18.842 26.812 1.00 43.81 C +ATOM 1592 O ALA A 228 -11.134 18.690 27.563 1.00 43.39 O +ATOM 1593 CB ALA A 228 -8.485 17.032 26.467 1.00 43.10 C +ATOM 1594 N LYS A 229 -9.480 19.974 26.746 1.00 44.96 N +ATOM 1595 CA LYS A 229 -9.829 21.108 27.588 1.00 48.23 C +ATOM 1596 C LYS A 229 -11.201 21.647 27.187 1.00 49.13 C +ATOM 1597 O LYS A 229 -12.025 21.975 28.044 1.00 48.50 O +ATOM 1598 CB LYS A 229 -8.773 22.207 27.454 1.00 51.85 C +ATOM 1599 CG LYS A 229 -8.441 22.929 28.760 1.00 57.81 C +ATOM 1600 CD LYS A 229 -9.642 23.672 29.329 1.00 61.62 C +ATOM 1601 CE LYS A 229 -9.286 24.388 30.633 1.00 64.13 C +ATOM 1602 NZ LYS A 229 -8.850 23.445 31.705 1.00 64.63 N +ATOM 1603 N ALA A 230 -11.441 21.729 25.880 1.00 48.79 N +ATOM 1604 CA ALA A 230 -12.712 22.230 25.367 1.00 48.44 C +ATOM 1605 C ALA A 230 -13.854 21.318 25.790 1.00 48.57 C +ATOM 1606 O ALA A 230 -14.944 21.784 26.118 1.00 48.15 O +ATOM 1607 CB ALA A 230 -12.663 22.331 23.841 1.00 47.38 C +ATOM 1608 N LEU A 231 -13.596 20.014 25.789 1.00 48.63 N +ATOM 1609 CA LEU A 231 -14.613 19.046 26.166 1.00 48.24 C +ATOM 1610 C LEU A 231 -14.744 18.850 27.670 1.00 51.47 C +ATOM 1611 O LEU A 231 -15.473 17.962 28.121 1.00 54.04 O +ATOM 1612 CB LEU A 231 -14.336 17.706 25.490 1.00 44.61 C +ATOM 1613 CG LEU A 231 -14.512 17.730 23.974 1.00 39.74 C +ATOM 1614 CD1 LEU A 231 -14.241 16.351 23.404 1.00 35.00 C +ATOM 1615 CD2 LEU A 231 -15.929 18.188 23.645 1.00 35.32 C +ATOM 1616 N GLY A 232 -14.045 19.678 28.443 1.00 52.59 N +ATOM 1617 CA GLY A 232 -14.124 19.583 29.890 1.00 53.23 C +ATOM 1618 C GLY A 232 -13.518 18.326 30.489 1.00 54.84 C +ATOM 1619 O GLY A 232 -13.803 17.979 31.634 1.00 55.50 O +ATOM 1620 N VAL A 233 -12.685 17.638 29.719 1.00 55.46 N +ATOM 1621 CA VAL A 233 -12.036 16.429 30.199 1.00 57.06 C +ATOM 1622 C VAL A 233 -10.821 16.818 31.033 1.00 59.30 C +ATOM 1623 O VAL A 233 -9.998 17.624 30.600 1.00 60.67 O +ATOM 1624 CB VAL A 233 -11.565 15.545 29.027 1.00 56.71 C +ATOM 1625 CG1 VAL A 233 -10.846 14.314 29.554 1.00 57.43 C +ATOM 1626 CG2 VAL A 233 -12.754 15.144 28.172 1.00 56.52 C +ATOM 1627 N LYS A 234 -10.717 16.250 32.230 1.00 60.69 N +ATOM 1628 CA LYS A 234 -9.592 16.528 33.118 1.00 61.37 C +ATOM 1629 C LYS A 234 -8.562 15.413 32.947 1.00 61.20 C +ATOM 1630 O LYS A 234 -8.486 14.474 33.744 1.00 60.55 O +ATOM 1631 CB LYS A 234 -10.084 16.616 34.565 1.00 63.21 C +ATOM 1632 CG LYS A 234 -11.157 17.686 34.757 1.00 66.78 C +ATOM 1633 CD LYS A 234 -11.558 17.860 36.213 1.00 70.18 C +ATOM 1634 CE LYS A 234 -12.618 18.950 36.360 1.00 72.63 C +ATOM 1635 NZ LYS A 234 -13.016 19.186 37.782 1.00 74.19 N +ATOM 1636 N MET A 235 -7.773 15.543 31.885 1.00 60.45 N +ATOM 1637 CA MET A 235 -6.750 14.575 31.513 1.00 60.28 C +ATOM 1638 C MET A 235 -5.852 14.091 32.646 1.00 59.16 C +ATOM 1639 O MET A 235 -5.800 12.895 32.926 1.00 59.20 O +ATOM 1640 CB MET A 235 -5.879 15.157 30.398 1.00 62.20 C +ATOM 1641 CG MET A 235 -5.215 14.118 29.503 1.00 65.51 C +ATOM 1642 SD MET A 235 -6.386 13.338 28.357 1.00 69.53 S +ATOM 1643 CE MET A 235 -6.734 11.841 29.219 1.00 68.50 C +ATOM 1644 N ALA A 236 -5.141 15.013 33.287 1.00 56.79 N +ATOM 1645 CA ALA A 236 -4.228 14.657 34.367 1.00 56.34 C +ATOM 1646 C ALA A 236 -4.864 13.767 35.441 1.00 55.94 C +ATOM 1647 O ALA A 236 -4.388 12.663 35.690 1.00 55.55 O +ATOM 1648 CB ALA A 236 -3.649 15.918 34.997 1.00 55.55 C +ATOM 1649 N PRO A 237 -5.947 14.234 36.087 1.00 54.95 N +ATOM 1650 CA PRO A 237 -6.612 13.438 37.127 1.00 54.28 C +ATOM 1651 C PRO A 237 -7.073 12.081 36.602 1.00 53.77 C +ATOM 1652 O PRO A 237 -6.907 11.058 37.265 1.00 54.34 O +ATOM 1653 CB PRO A 237 -7.796 14.311 37.534 1.00 54.52 C +ATOM 1654 CG PRO A 237 -7.308 15.698 37.254 1.00 56.32 C +ATOM 1655 CD PRO A 237 -6.612 15.538 35.928 1.00 55.32 C +ATOM 1656 N LEU A 238 -7.658 12.081 35.408 1.00 51.96 N +ATOM 1657 CA LEU A 238 -8.148 10.849 34.802 1.00 50.12 C +ATOM 1658 C LEU A 238 -7.024 9.841 34.521 1.00 50.02 C +ATOM 1659 O LEU A 238 -7.167 8.655 34.820 1.00 48.48 O +ATOM 1660 CB LEU A 238 -8.903 11.166 33.509 1.00 49.10 C +ATOM 1661 CG LEU A 238 -9.470 9.974 32.732 1.00 49.49 C +ATOM 1662 CD1 LEU A 238 -10.463 9.222 33.596 1.00 47.99 C +ATOM 1663 CD2 LEU A 238 -10.138 10.467 31.460 1.00 48.44 C +ATOM 1664 N ARG A 239 -5.914 10.306 33.950 1.00 48.54 N +ATOM 1665 CA ARG A 239 -4.792 9.419 33.651 1.00 48.28 C +ATOM 1666 C ARG A 239 -4.264 8.768 34.920 1.00 48.01 C +ATOM 1667 O ARG A 239 -4.043 7.559 34.962 1.00 47.72 O +ATOM 1668 CB ARG A 239 -3.640 10.181 32.989 1.00 48.91 C +ATOM 1669 CG ARG A 239 -3.818 10.498 31.513 1.00 50.74 C +ATOM 1670 CD ARG A 239 -2.635 11.319 31.000 1.00 51.14 C +ATOM 1671 NE ARG A 239 -2.786 11.687 29.595 1.00 52.42 N +ATOM 1672 CZ ARG A 239 -1.971 12.510 28.939 1.00 51.59 C +ATOM 1673 NH1 ARG A 239 -2.192 12.780 27.661 1.00 52.55 N +ATOM 1674 NH2 ARG A 239 -0.937 13.063 29.555 1.00 50.36 N +ATOM 1675 N TRP A 240 -4.058 9.577 35.953 1.00 48.22 N +ATOM 1676 CA TRP A 240 -3.541 9.071 37.211 1.00 49.16 C +ATOM 1677 C TRP A 240 -4.501 8.105 37.898 1.00 47.37 C +ATOM 1678 O TRP A 240 -4.069 7.113 38.466 1.00 47.30 O +ATOM 1679 CB TRP A 240 -3.172 10.235 38.135 1.00 50.08 C +ATOM 1680 CG TRP A 240 -1.952 10.976 37.660 1.00 55.15 C +ATOM 1681 CD1 TRP A 240 -1.891 12.273 37.224 1.00 57.87 C +ATOM 1682 CD2 TRP A 240 -0.624 10.447 37.525 1.00 56.55 C +ATOM 1683 NE1 TRP A 240 -0.609 12.581 36.822 1.00 57.41 N +ATOM 1684 CE2 TRP A 240 0.187 11.479 36.996 1.00 57.47 C +ATOM 1685 CE3 TRP A 240 -0.041 9.200 37.797 1.00 56.70 C +ATOM 1686 CZ2 TRP A 240 1.552 11.302 36.734 1.00 58.12 C +ATOM 1687 CZ3 TRP A 240 1.316 9.024 37.536 1.00 57.70 C +ATOM 1688 CH2 TRP A 240 2.097 10.072 37.008 1.00 58.35 C +ATOM 1689 N LEU A 241 -5.799 8.383 37.836 1.00 46.34 N +ATOM 1690 CA LEU A 241 -6.782 7.501 38.450 1.00 44.69 C +ATOM 1691 C LEU A 241 -6.659 6.133 37.783 1.00 44.50 C +ATOM 1692 O LEU A 241 -6.722 5.098 38.447 1.00 43.60 O +ATOM 1693 CB LEU A 241 -8.197 8.040 38.238 1.00 44.28 C +ATOM 1694 CG LEU A 241 -9.300 7.704 39.255 1.00 47.85 C +ATOM 1695 CD1 LEU A 241 -10.560 7.371 38.477 1.00 46.86 C +ATOM 1696 CD2 LEU A 241 -8.920 6.538 40.169 1.00 44.83 C +ATOM 1697 N VAL A 242 -6.478 6.135 36.466 1.00 43.25 N +ATOM 1698 CA VAL A 242 -6.345 4.892 35.720 1.00 44.08 C +ATOM 1699 C VAL A 242 -4.991 4.233 35.973 1.00 44.83 C +ATOM 1700 O VAL A 242 -4.924 3.022 36.133 1.00 45.25 O +ATOM 1701 CB VAL A 242 -6.532 5.115 34.199 1.00 43.04 C +ATOM 1702 CG1 VAL A 242 -6.298 3.819 33.449 1.00 43.17 C +ATOM 1703 CG2 VAL A 242 -7.940 5.610 33.916 1.00 42.96 C +ATOM 1704 N ILE A 243 -3.919 5.024 36.008 1.00 44.55 N +ATOM 1705 CA ILE A 243 -2.586 4.481 36.258 1.00 45.48 C +ATOM 1706 C ILE A 243 -2.548 3.789 37.627 1.00 47.90 C +ATOM 1707 O ILE A 243 -1.991 2.698 37.763 1.00 48.80 O +ATOM 1708 CB ILE A 243 -1.485 5.598 36.211 1.00 44.95 C +ATOM 1709 CG1 ILE A 243 -1.217 6.026 34.763 1.00 42.03 C +ATOM 1710 CG2 ILE A 243 -0.195 5.104 36.854 1.00 40.45 C +ATOM 1711 CD1 ILE A 243 -0.206 7.147 34.627 0.00 43.27 C +ATOM 1712 N PHE A 244 -3.150 4.423 38.630 1.00 48.64 N +ATOM 1713 CA PHE A 244 -3.190 3.885 39.986 1.00 48.89 C +ATOM 1714 C PHE A 244 -3.968 2.574 40.066 1.00 48.87 C +ATOM 1715 O PHE A 244 -3.487 1.590 40.629 1.00 48.40 O +ATOM 1716 CB PHE A 244 -3.822 4.906 40.934 1.00 53.09 C +ATOM 1717 CG PHE A 244 -4.047 4.384 42.329 1.00 58.68 C +ATOM 1718 CD1 PHE A 244 -2.978 4.218 43.209 1.00 61.13 C +ATOM 1719 CD2 PHE A 244 -5.328 4.040 42.760 1.00 60.55 C +ATOM 1720 CE1 PHE A 244 -3.181 3.715 44.501 1.00 61.90 C +ATOM 1721 CE2 PHE A 244 -5.543 3.535 44.050 1.00 61.27 C +ATOM 1722 CZ PHE A 244 -4.468 3.373 44.920 1.00 61.16 C +ATOM 1723 N LEU A 245 -5.176 2.567 39.511 1.00 46.72 N +ATOM 1724 CA LEU A 245 -6.013 1.376 39.528 1.00 47.02 C +ATOM 1725 C LEU A 245 -5.355 0.258 38.726 1.00 47.18 C +ATOM 1726 O LEU A 245 -5.418 -0.913 39.094 1.00 45.67 O +ATOM 1727 CB LEU A 245 -7.392 1.691 38.940 1.00 46.79 C +ATOM 1728 CG LEU A 245 -8.238 2.737 39.676 1.00 47.87 C +ATOM 1729 CD1 LEU A 245 -9.457 3.097 38.839 1.00 45.75 C +ATOM 1730 CD2 LEU A 245 -8.655 2.197 41.032 1.00 45.93 C +ATOM 1731 N SER A 246 -4.725 0.642 37.623 1.00 47.35 N +ATOM 1732 CA SER A 246 -4.037 -0.293 36.745 1.00 47.41 C +ATOM 1733 C SER A 246 -2.838 -0.896 37.477 1.00 46.76 C +ATOM 1734 O SER A 246 -2.600 -2.103 37.414 1.00 44.66 O +ATOM 1735 CB SER A 246 -3.570 0.442 35.485 1.00 46.45 C +ATOM 1736 OG SER A 246 -2.981 -0.444 34.555 1.00 52.27 O +ATOM 1737 N GLY A 247 -2.096 -0.037 38.173 1.00 46.73 N +ATOM 1738 CA GLY A 247 -0.928 -0.472 38.916 1.00 46.22 C +ATOM 1739 C GLY A 247 -1.288 -1.237 40.174 1.00 47.28 C +ATOM 1740 O GLY A 247 -0.542 -2.117 40.602 1.00 47.20 O +ATOM 1741 N SER A 248 -2.424 -0.898 40.778 1.00 47.89 N +ATOM 1742 CA SER A 248 -2.875 -1.585 41.984 1.00 47.88 C +ATOM 1743 C SER A 248 -3.198 -3.040 41.656 1.00 48.11 C +ATOM 1744 O SER A 248 -2.858 -3.945 42.417 1.00 47.57 O +ATOM 1745 CB SER A 248 -4.112 -0.899 42.565 1.00 48.06 C +ATOM 1746 OG SER A 248 -3.762 0.323 43.186 1.00 49.01 O +ATOM 1747 N LEU A 249 -3.858 -3.262 40.522 1.00 46.68 N +ATOM 1748 CA LEU A 249 -4.193 -4.617 40.108 1.00 47.09 C +ATOM 1749 C LEU A 249 -2.926 -5.455 39.996 1.00 46.77 C +ATOM 1750 O LEU A 249 -2.834 -6.543 40.560 1.00 49.16 O +ATOM 1751 CB LEU A 249 -4.905 -4.617 38.752 1.00 44.88 C +ATOM 1752 CG LEU A 249 -6.419 -4.431 38.696 1.00 45.46 C +ATOM 1753 CD1 LEU A 249 -6.856 -4.290 37.240 1.00 44.57 C +ATOM 1754 CD2 LEU A 249 -7.109 -5.620 39.345 1.00 44.64 C +ATOM 1755 N VAL A 250 -1.949 -4.937 39.262 1.00 45.87 N +ATOM 1756 CA VAL A 250 -0.691 -5.641 39.054 1.00 44.96 C +ATOM 1757 C VAL A 250 0.108 -5.885 40.337 1.00 44.29 C +ATOM 1758 O VAL A 250 0.643 -6.974 40.530 1.00 44.55 O +ATOM 1759 CB VAL A 250 0.171 -4.890 38.013 1.00 44.14 C +ATOM 1760 CG1 VAL A 250 1.594 -5.430 37.998 1.00 42.66 C +ATOM 1761 CG2 VAL A 250 -0.465 -5.048 36.635 1.00 44.19 C +ATOM 1762 N ALA A 251 0.184 -4.885 41.208 1.00 41.77 N +ATOM 1763 CA ALA A 251 0.912 -5.031 42.464 1.00 42.63 C +ATOM 1764 C ALA A 251 0.312 -6.170 43.287 1.00 43.77 C +ATOM 1765 O ALA A 251 1.031 -7.029 43.801 1.00 42.58 O +ATOM 1766 CB ALA A 251 0.858 -3.737 43.260 1.00 40.41 C +ATOM 1767 N CYS A 252 -1.011 -6.167 43.406 1.00 44.14 N +ATOM 1768 CA CYS A 252 -1.715 -7.189 44.161 1.00 44.46 C +ATOM 1769 C CYS A 252 -1.617 -8.541 43.459 1.00 44.77 C +ATOM 1770 O CYS A 252 -1.612 -9.590 44.101 1.00 45.77 O +ATOM 1771 CB CYS A 252 -3.180 -6.784 44.339 1.00 44.46 C +ATOM 1772 SG CYS A 252 -3.405 -5.303 45.360 1.00 46.59 S +ATOM 1773 N GLN A 253 -1.538 -8.516 42.135 1.00 43.07 N +ATOM 1774 CA GLN A 253 -1.423 -9.751 41.380 1.00 42.47 C +ATOM 1775 C GLN A 253 -0.052 -10.392 41.622 1.00 43.61 C +ATOM 1776 O GLN A 253 0.055 -11.602 41.840 1.00 43.42 O +ATOM 1777 CB GLN A 253 -1.629 -9.479 39.890 1.00 39.34 C +ATOM 1778 CG GLN A 253 -1.278 -10.648 38.999 1.00 38.82 C +ATOM 1779 CD GLN A 253 0.169 -10.619 38.540 1.00 43.00 C +ATOM 1780 OE1 GLN A 253 0.778 -11.662 38.303 1.00 45.41 O +ATOM 1781 NE2 GLN A 253 0.722 -9.418 38.395 1.00 44.11 N +ATOM 1782 N VAL A 254 0.993 -9.572 41.586 1.00 42.99 N +ATOM 1783 CA VAL A 254 2.349 -10.057 41.797 1.00 42.97 C +ATOM 1784 C VAL A 254 2.487 -10.594 43.227 1.00 44.18 C +ATOM 1785 O VAL A 254 3.159 -11.603 43.466 1.00 42.49 O +ATOM 1786 CB VAL A 254 3.375 -8.919 41.539 1.00 41.96 C +ATOM 1787 CG1 VAL A 254 4.776 -9.338 41.988 1.00 40.90 C +ATOM 1788 CG2 VAL A 254 3.383 -8.571 40.049 1.00 39.80 C +ATOM 1789 N ALA A 255 1.826 -9.924 44.165 1.00 43.86 N +ATOM 1790 CA ALA A 255 1.866 -10.314 45.563 1.00 45.45 C +ATOM 1791 C ALA A 255 1.408 -11.760 45.801 1.00 46.69 C +ATOM 1792 O ALA A 255 1.965 -12.446 46.656 1.00 47.27 O +ATOM 1793 CB ALA A 255 1.026 -9.352 46.393 1.00 45.36 C +ATOM 1794 N ILE A 256 0.414 -12.226 45.043 1.00 46.36 N +ATOM 1795 CA ILE A 256 -0.086 -13.586 45.218 1.00 45.99 C +ATOM 1796 C ILE A 256 0.291 -14.594 44.132 1.00 47.48 C +ATOM 1797 O ILE A 256 -0.038 -15.777 44.258 1.00 48.59 O +ATOM 1798 CB ILE A 256 -1.636 -13.629 45.354 1.00 46.93 C +ATOM 1799 CG1 ILE A 256 -2.301 -13.327 44.003 1.00 45.51 C +ATOM 1800 CG2 ILE A 256 -2.091 -12.653 46.436 1.00 46.06 C +ATOM 1801 CD1 ILE A 256 -3.770 -13.667 43.958 0.00 46.06 C +ATOM 1802 N SER A 257 0.965 -14.157 43.071 1.00 46.41 N +ATOM 1803 CA SER A 257 1.329 -15.100 42.017 1.00 44.26 C +ATOM 1804 C SER A 257 2.642 -14.820 41.299 1.00 43.35 C +ATOM 1805 O SER A 257 2.959 -15.482 40.309 1.00 42.22 O +ATOM 1806 CB SER A 257 0.200 -15.201 40.988 1.00 46.63 C +ATOM 1807 OG SER A 257 -0.029 -13.963 40.334 1.00 47.17 O +ATOM 1808 N GLY A 258 3.410 -13.854 41.793 1.00 42.75 N +ATOM 1809 CA GLY A 258 4.680 -13.535 41.159 1.00 43.81 C +ATOM 1810 C GLY A 258 4.578 -12.768 39.844 1.00 43.83 C +ATOM 1811 O GLY A 258 3.531 -12.204 39.519 1.00 44.59 O +ATOM 1812 N SER A 259 5.671 -12.762 39.084 1.00 43.90 N +ATOM 1813 CA SER A 259 5.745 -12.054 37.804 1.00 42.56 C +ATOM 1814 C SER A 259 5.227 -12.836 36.605 1.00 41.54 C +ATOM 1815 O SER A 259 5.820 -13.834 36.198 1.00 42.21 O +ATOM 1816 CB SER A 259 7.189 -11.645 37.518 1.00 42.97 C +ATOM 1817 OG SER A 259 7.710 -10.852 38.568 1.00 45.81 O +ATOM 1818 N ILE A 260 4.122 -12.369 36.035 1.00 40.35 N +ATOM 1819 CA ILE A 260 3.533 -13.001 34.862 1.00 40.93 C +ATOM 1820 C ILE A 260 3.516 -11.969 33.728 1.00 42.96 C +ATOM 1821 O ILE A 260 3.055 -10.839 33.915 1.00 43.35 O +ATOM 1822 CB ILE A 260 2.085 -13.465 35.140 1.00 40.00 C +ATOM 1823 CG1 ILE A 260 2.057 -14.424 36.343 1.00 39.95 C +ATOM 1824 CG2 ILE A 260 1.507 -14.131 33.895 1.00 36.89 C +ATOM 1825 CD1 ILE A 260 0.669 -14.893 36.725 0.00 39.92 C +ATOM 1826 N GLY A 261 4.022 -12.355 32.561 1.00 43.03 N +ATOM 1827 CA GLY A 261 4.046 -11.438 31.434 1.00 43.49 C +ATOM 1828 C GLY A 261 3.403 -11.981 30.172 1.00 44.22 C +ATOM 1829 O GLY A 261 2.767 -13.041 30.189 1.00 44.49 O +ATOM 1830 N TRP A 262 3.568 -11.243 29.076 1.00 42.87 N +ATOM 1831 CA TRP A 262 3.019 -11.616 27.778 1.00 42.58 C +ATOM 1832 C TRP A 262 1.516 -11.849 27.782 1.00 44.31 C +ATOM 1833 O TRP A 262 1.006 -12.700 27.048 1.00 45.41 O +ATOM 1834 CB TRP A 262 3.731 -12.858 27.230 1.00 43.21 C +ATOM 1835 CG TRP A 262 5.118 -12.557 26.773 1.00 44.41 C +ATOM 1836 CD1 TRP A 262 6.259 -12.604 27.522 1.00 43.06 C +ATOM 1837 CD2 TRP A 262 5.501 -12.060 25.485 1.00 43.42 C +ATOM 1838 NE1 TRP A 262 7.330 -12.161 26.782 1.00 44.22 N +ATOM 1839 CE2 TRP A 262 6.894 -11.820 25.528 1.00 43.50 C +ATOM 1840 CE3 TRP A 262 4.802 -11.789 24.301 1.00 43.91 C +ATOM 1841 CZ2 TRP A 262 7.604 -11.321 24.430 1.00 42.46 C +ATOM 1842 CZ3 TRP A 262 5.510 -11.290 23.206 1.00 45.88 C +ATOM 1843 CH2 TRP A 262 6.900 -11.062 23.283 1.00 43.41 C +ATOM 1844 N VAL A 263 0.803 -11.089 28.602 1.00 44.61 N +ATOM 1845 CA VAL A 263 -0.645 -11.228 28.674 1.00 46.47 C +ATOM 1846 C VAL A 263 -1.330 -9.932 28.257 1.00 47.60 C +ATOM 1847 O VAL A 263 -2.074 -9.897 27.273 1.00 44.76 O +ATOM 1848 CB VAL A 263 -1.106 -11.603 30.110 1.00 46.59 C +ATOM 1849 CG1 VAL A 263 -2.624 -11.513 30.208 1.00 45.88 C +ATOM 1850 CG2 VAL A 263 -0.636 -13.015 30.464 1.00 45.18 C +ATOM 1851 N GLY A 264 -1.064 -8.873 29.018 1.00 50.35 N +ATOM 1852 CA GLY A 264 -1.656 -7.576 28.751 1.00 52.62 C +ATOM 1853 C GLY A 264 -1.352 -7.063 27.363 1.00 53.68 C +ATOM 1854 O GLY A 264 -2.039 -6.182 26.856 1.00 55.31 O +ATOM 1855 N LEU A 265 -0.324 -7.618 26.738 1.00 54.01 N +ATOM 1856 CA LEU A 265 0.048 -7.193 25.401 1.00 53.91 C +ATOM 1857 C LEU A 265 -0.898 -7.728 24.328 1.00 55.09 C +ATOM 1858 O LEU A 265 -1.504 -6.949 23.586 1.00 58.19 O +ATOM 1859 CB LEU A 265 1.476 -7.644 25.088 1.00 55.43 C +ATOM 1860 CG LEU A 265 2.131 -7.016 23.857 1.00 56.41 C +ATOM 1861 CD1 LEU A 265 2.224 -5.501 24.053 1.00 56.35 C +ATOM 1862 CD2 LEU A 265 3.520 -7.611 23.647 1.00 55.79 C +ATOM 1863 N ILE A 266 -1.045 -9.052 24.267 1.00 53.94 N +ATOM 1864 CA ILE A 266 -1.875 -9.693 23.248 1.00 51.43 C +ATOM 1865 C ILE A 266 -3.381 -9.806 23.474 1.00 50.24 C +ATOM 1866 O ILE A 266 -4.146 -9.870 22.505 1.00 49.51 O +ATOM 1867 CB ILE A 266 -1.355 -11.120 22.933 1.00 52.81 C +ATOM 1868 CG1 ILE A 266 -1.685 -12.076 24.084 1.00 52.15 C +ATOM 1869 CG2 ILE A 266 0.148 -11.080 22.703 1.00 54.47 C +ATOM 1870 CD1 ILE A 266 -1.259 -13.509 23.838 0.00 52.49 C +ATOM 1871 N ILE A 267 -3.821 -9.841 24.726 1.00 47.64 N +ATOM 1872 CA ILE A 267 -5.249 -9.989 24.976 1.00 47.10 C +ATOM 1873 C ILE A 267 -6.082 -8.813 24.476 1.00 47.12 C +ATOM 1874 O ILE A 267 -7.068 -9.013 23.761 1.00 47.35 O +ATOM 1875 CB ILE A 267 -5.538 -10.265 26.476 1.00 46.98 C +ATOM 1876 CG1 ILE A 267 -4.947 -11.626 26.855 1.00 47.46 C +ATOM 1877 CG2 ILE A 267 -7.051 -10.279 26.737 1.00 46.14 C +ATOM 1878 CD1 ILE A 267 -5.152 -12.008 28.298 0.00 47.31 C +ATOM 1879 N PRO A 268 -5.714 -7.575 24.844 1.00 47.14 N +ATOM 1880 CA PRO A 268 -6.535 -6.471 24.337 1.00 47.58 C +ATOM 1881 C PRO A 268 -6.613 -6.447 22.811 1.00 47.09 C +ATOM 1882 O PRO A 268 -7.638 -6.066 22.248 1.00 47.03 O +ATOM 1883 CB PRO A 268 -5.876 -5.225 24.941 1.00 46.46 C +ATOM 1884 CG PRO A 268 -4.528 -5.694 25.407 1.00 47.36 C +ATOM 1885 CD PRO A 268 -4.752 -7.100 25.848 1.00 46.63 C +ATOM 1886 N HIS A 269 -5.549 -6.877 22.140 1.00 48.08 N +ATOM 1887 CA HIS A 269 -5.568 -6.915 20.679 1.00 50.70 C +ATOM 1888 C HIS A 269 -6.647 -7.890 20.199 1.00 51.19 C +ATOM 1889 O HIS A 269 -7.490 -7.536 19.372 1.00 51.65 O +ATOM 1890 CB HIS A 269 -4.210 -7.344 20.117 1.00 53.97 C +ATOM 1891 CG HIS A 269 -4.230 -7.605 18.643 1.00 59.64 C +ATOM 1892 ND1 HIS A 269 -4.647 -6.663 17.725 1.00 62.42 N +ATOM 1893 CD2 HIS A 269 -3.923 -8.714 17.928 1.00 62.41 C +ATOM 1894 CE1 HIS A 269 -4.599 -7.181 16.510 1.00 63.13 C +ATOM 1895 NE2 HIS A 269 -4.164 -8.425 16.606 1.00 64.54 N +ATOM 1896 N LEU A 270 -6.617 -9.118 20.713 1.00 50.29 N +ATOM 1897 CA LEU A 270 -7.615 -10.114 20.334 1.00 49.96 C +ATOM 1898 C LEU A 270 -9.011 -9.575 20.613 1.00 48.94 C +ATOM 1899 O LEU A 270 -9.943 -9.804 19.847 1.00 48.99 O +ATOM 1900 CB LEU A 270 -7.417 -11.413 21.120 1.00 50.79 C +ATOM 1901 CG LEU A 270 -6.191 -12.267 20.799 1.00 51.19 C +ATOM 1902 CD1 LEU A 270 -6.184 -13.486 21.698 1.00 51.71 C +ATOM 1903 CD2 LEU A 270 -6.224 -12.687 19.336 1.00 51.76 C +ATOM 1904 N SER A 271 -9.151 -8.852 21.716 1.00 48.28 N +ATOM 1905 CA SER A 271 -10.441 -8.295 22.082 1.00 48.21 C +ATOM 1906 C SER A 271 -10.900 -7.245 21.083 1.00 49.33 C +ATOM 1907 O SER A 271 -12.078 -7.205 20.729 1.00 50.19 O +ATOM 1908 CB SER A 271 -10.376 -7.694 23.483 1.00 47.88 C +ATOM 1909 OG SER A 271 -10.015 -8.678 24.435 1.00 46.23 O +ATOM 1910 N ARG A 272 -9.985 -6.390 20.631 1.00 49.38 N +ATOM 1911 CA ARG A 272 -10.358 -5.368 19.658 1.00 51.11 C +ATOM 1912 C ARG A 272 -10.733 -6.041 18.341 1.00 52.55 C +ATOM 1913 O ARG A 272 -11.470 -5.477 17.532 1.00 52.20 O +ATOM 1914 CB ARG A 272 -9.226 -4.345 19.458 1.00 49.48 C +ATOM 1915 CG ARG A 272 -9.212 -3.250 20.529 1.00 48.72 C +ATOM 1916 CD ARG A 272 -8.098 -2.223 20.329 1.00 48.51 C +ATOM 1917 NE ARG A 272 -6.776 -2.813 20.501 1.00 48.19 N +ATOM 1918 CZ ARG A 272 -5.993 -2.624 21.560 1.00 46.74 C +ATOM 1919 NH1 ARG A 272 -4.809 -3.219 21.609 1.00 45.41 N +ATOM 1920 NH2 ARG A 272 -6.379 -1.837 22.557 1.00 44.67 N +ATOM 1921 N MET A 273 -10.239 -7.257 18.130 1.00 54.02 N +ATOM 1922 CA MET A 273 -10.585 -7.992 16.918 1.00 56.32 C +ATOM 1923 C MET A 273 -12.032 -8.470 17.037 1.00 56.43 C +ATOM 1924 O MET A 273 -12.724 -8.655 16.037 1.00 56.69 O +ATOM 1925 CB MET A 273 -9.665 -9.201 16.731 1.00 57.47 C +ATOM 1926 CG MET A 273 -8.256 -8.850 16.286 1.00 61.31 C +ATOM 1927 SD MET A 273 -7.197 -10.306 16.096 1.00 65.08 S +ATOM 1928 CE MET A 273 -7.665 -10.875 14.450 1.00 64.60 C +ATOM 1929 N LEU A 274 -12.489 -8.648 18.272 1.00 55.39 N +ATOM 1930 CA LEU A 274 -13.839 -9.123 18.525 1.00 55.49 C +ATOM 1931 C LEU A 274 -14.914 -8.058 18.657 1.00 55.61 C +ATOM 1932 O LEU A 274 -15.945 -8.134 17.991 1.00 56.62 O +ATOM 1933 CB LEU A 274 -13.860 -9.994 19.788 1.00 56.04 C +ATOM 1934 CG LEU A 274 -13.426 -11.462 19.691 1.00 56.72 C +ATOM 1935 CD1 LEU A 274 -12.130 -11.588 18.904 1.00 58.60 C +ATOM 1936 CD2 LEU A 274 -13.262 -12.028 21.091 1.00 56.55 C +ATOM 1937 N VAL A 275 -14.679 -7.062 19.505 1.00 55.32 N +ATOM 1938 CA VAL A 275 -15.685 -6.036 19.749 1.00 54.47 C +ATOM 1939 C VAL A 275 -15.344 -4.602 19.320 1.00 54.04 C +ATOM 1940 O VAL A 275 -16.139 -3.688 19.531 1.00 55.16 O +ATOM 1941 CB VAL A 275 -16.071 -6.046 21.255 1.00 55.32 C +ATOM 1942 CG1 VAL A 275 -14.947 -5.453 22.088 1.00 54.87 C +ATOM 1943 CG2 VAL A 275 -17.369 -5.293 21.479 1.00 58.42 C +ATOM 1944 N GLY A 276 -14.178 -4.390 18.721 1.00 52.73 N +ATOM 1945 CA GLY A 276 -13.826 -3.045 18.296 1.00 50.59 C +ATOM 1946 C GLY A 276 -13.049 -2.212 19.304 1.00 50.43 C +ATOM 1947 O GLY A 276 -12.658 -2.697 20.369 1.00 49.87 O +ATOM 1948 N ALA A 277 -12.855 -0.936 18.972 1.00 48.95 N +ATOM 1949 CA ALA A 277 -12.091 -0.003 19.797 1.00 47.88 C +ATOM 1950 C ALA A 277 -12.820 0.713 20.935 1.00 47.46 C +ATOM 1951 O ALA A 277 -12.185 1.117 21.910 1.00 48.73 O +ATOM 1952 CB ALA A 277 -11.422 1.031 18.894 1.00 48.50 C +ATOM 1953 N ASN A 278 -14.131 0.893 20.827 1.00 47.04 N +ATOM 1954 CA ASN A 278 -14.862 1.575 21.891 1.00 46.98 C +ATOM 1955 C ASN A 278 -14.605 0.858 23.219 1.00 48.71 C +ATOM 1956 O ASN A 278 -14.974 -0.304 23.389 1.00 47.72 O +ATOM 1957 CB ASN A 278 -16.360 1.610 21.568 1.00 45.39 C +ATOM 1958 CG ASN A 278 -17.171 2.321 22.638 1.00 48.43 C +ATOM 1959 OD1 ASN A 278 -16.667 3.205 23.328 1.00 47.38 O +ATOM 1960 ND2 ASN A 278 -18.441 1.946 22.771 1.00 50.82 N +ATOM 1961 N HIS A 279 -13.962 1.554 24.153 1.00 51.38 N +ATOM 1962 CA HIS A 279 -13.631 0.969 25.451 1.00 54.33 C +ATOM 1963 C HIS A 279 -14.829 0.492 26.255 1.00 55.91 C +ATOM 1964 O HIS A 279 -14.719 -0.456 27.039 1.00 55.75 O +ATOM 1965 CB HIS A 279 -12.814 1.953 26.299 1.00 53.88 C +ATOM 1966 CG HIS A 279 -11.437 2.206 25.768 1.00 55.72 C +ATOM 1967 ND1 HIS A 279 -11.168 3.172 24.822 1.00 56.40 N +ATOM 1968 CD2 HIS A 279 -10.258 1.592 26.025 1.00 55.05 C +ATOM 1969 CE1 HIS A 279 -9.882 3.143 24.520 1.00 56.41 C +ATOM 1970 NE2 HIS A 279 -9.308 2.192 25.236 1.00 56.12 N +ATOM 1971 N GLN A 280 -15.970 1.144 26.064 1.00 57.60 N +ATOM 1972 CA GLN A 280 -17.179 0.773 26.786 1.00 58.45 C +ATOM 1973 C GLN A 280 -17.498 -0.708 26.582 1.00 57.91 C +ATOM 1974 O GLN A 280 -18.103 -1.351 27.443 1.00 57.69 O +ATOM 1975 CB GLN A 280 -18.352 1.636 26.319 1.00 61.09 C +ATOM 1976 CG GLN A 280 -19.633 1.425 27.110 1.00 65.06 C +ATOM 1977 CD GLN A 280 -20.753 2.361 26.679 1.00 68.02 C +ATOM 1978 OE1 GLN A 280 -21.878 2.263 27.174 1.00 70.39 O +ATOM 1979 NE2 GLN A 280 -20.451 3.273 25.754 1.00 67.24 N +ATOM 1980 N SER A 281 -17.079 -1.247 25.442 1.00 56.67 N +ATOM 1981 CA SER A 281 -17.315 -2.650 25.122 1.00 55.81 C +ATOM 1982 C SER A 281 -16.024 -3.458 25.200 1.00 53.82 C +ATOM 1983 O SER A 281 -16.053 -4.674 25.393 1.00 53.21 O +ATOM 1984 CB SER A 281 -17.902 -2.780 23.713 1.00 57.37 C +ATOM 1985 OG SER A 281 -19.173 -2.160 23.629 1.00 62.17 O +ATOM 1986 N LEU A 282 -14.897 -2.769 25.055 1.00 51.15 N +ATOM 1987 CA LEU A 282 -13.585 -3.403 25.072 1.00 49.20 C +ATOM 1988 C LEU A 282 -13.164 -3.949 26.435 1.00 47.11 C +ATOM 1989 O LEU A 282 -12.688 -5.074 26.522 1.00 45.79 O +ATOM 1990 CB LEU A 282 -12.515 -2.417 24.594 1.00 47.05 C +ATOM 1991 CG LEU A 282 -11.522 -2.827 23.501 1.00 49.04 C +ATOM 1992 CD1 LEU A 282 -10.278 -1.948 23.650 1.00 48.56 C +ATOM 1993 CD2 LEU A 282 -11.131 -4.297 23.601 1.00 43.30 C +ATOM 1994 N LEU A 283 -13.318 -3.151 27.488 1.00 46.10 N +ATOM 1995 CA LEU A 283 -12.914 -3.590 28.817 1.00 46.39 C +ATOM 1996 C LEU A 283 -13.562 -4.908 29.231 1.00 48.75 C +ATOM 1997 O LEU A 283 -12.864 -5.856 29.590 1.00 48.35 O +ATOM 1998 CB LEU A 283 -13.214 -2.518 29.872 1.00 44.04 C +ATOM 1999 CG LEU A 283 -12.457 -1.186 29.828 1.00 44.77 C +ATOM 2000 CD1 LEU A 283 -12.309 -0.657 31.249 1.00 41.41 C +ATOM 2001 CD2 LEU A 283 -11.092 -1.355 29.208 1.00 44.20 C +ATOM 2002 N PRO A 284 -14.903 -4.990 29.192 1.00 50.04 N +ATOM 2003 CA PRO A 284 -15.555 -6.246 29.581 1.00 50.19 C +ATOM 2004 C PRO A 284 -15.110 -7.428 28.724 1.00 49.54 C +ATOM 2005 O PRO A 284 -14.927 -8.538 29.230 1.00 49.75 O +ATOM 2006 CB PRO A 284 -17.043 -5.929 29.435 1.00 50.59 C +ATOM 2007 CG PRO A 284 -17.063 -4.840 28.390 1.00 52.67 C +ATOM 2008 CD PRO A 284 -15.901 -3.980 28.798 1.00 50.00 C +ATOM 2009 N CYS A 285 -14.917 -7.185 27.431 1.00 47.11 N +ATOM 2010 CA CYS A 285 -14.485 -8.235 26.519 1.00 44.84 C +ATOM 2011 C CYS A 285 -13.049 -8.683 26.789 1.00 45.24 C +ATOM 2012 O CYS A 285 -12.749 -9.874 26.722 1.00 46.12 O +ATOM 2013 CB CYS A 285 -14.616 -7.768 25.068 1.00 43.73 C +ATOM 2014 SG CYS A 285 -14.045 -8.965 23.824 1.00 47.61 S +ATOM 2015 N THR A 286 -12.157 -7.745 27.100 1.00 45.16 N +ATOM 2016 CA THR A 286 -10.770 -8.115 27.360 1.00 43.79 C +ATOM 2017 C THR A 286 -10.661 -8.863 28.687 1.00 42.53 C +ATOM 2018 O THR A 286 -9.820 -9.749 28.838 1.00 40.85 O +ATOM 2019 CB THR A 286 -9.822 -6.885 27.393 1.00 43.75 C +ATOM 2020 OG1 THR A 286 -10.062 -6.123 28.579 1.00 50.55 O +ATOM 2021 CG2 THR A 286 -10.053 -5.998 26.188 1.00 42.31 C +ATOM 2022 N MET A 287 -11.507 -8.498 29.647 1.00 41.95 N +ATOM 2023 CA MET A 287 -11.516 -9.163 30.947 1.00 42.96 C +ATOM 2024 C MET A 287 -11.900 -10.628 30.768 1.00 43.09 C +ATOM 2025 O MET A 287 -11.259 -11.513 31.316 1.00 43.79 O +ATOM 2026 CB MET A 287 -12.513 -8.496 31.891 1.00 41.74 C +ATOM 2027 CG MET A 287 -12.043 -7.180 32.470 1.00 41.92 C +ATOM 2028 SD MET A 287 -13.194 -6.585 33.710 1.00 44.80 S +ATOM 2029 CE MET A 287 -12.541 -7.421 35.210 1.00 46.71 C +ATOM 2030 N LEU A 288 -12.943 -10.872 29.984 1.00 43.67 N +ATOM 2031 CA LEU A 288 -13.416 -12.221 29.723 1.00 45.68 C +ATOM 2032 C LEU A 288 -12.441 -13.065 28.900 1.00 46.76 C +ATOM 2033 O LEU A 288 -12.252 -14.254 29.176 1.00 46.61 O +ATOM 2034 CB LEU A 288 -14.775 -12.167 29.023 1.00 46.39 C +ATOM 2035 CG LEU A 288 -15.932 -11.764 29.939 1.00 48.02 C +ATOM 2036 CD1 LEU A 288 -17.208 -11.568 29.133 1.00 48.13 C +ATOM 2037 CD2 LEU A 288 -16.120 -12.849 30.997 1.00 49.24 C +ATOM 2038 N VAL A 289 -11.830 -12.463 27.884 1.00 45.60 N +ATOM 2039 CA VAL A 289 -10.879 -13.194 27.055 1.00 43.88 C +ATOM 2040 C VAL A 289 -9.602 -13.450 27.853 1.00 44.28 C +ATOM 2041 O VAL A 289 -8.951 -14.482 27.689 1.00 44.14 O +ATOM 2042 CB VAL A 289 -10.519 -12.408 25.773 1.00 42.31 C +ATOM 2043 CG1 VAL A 289 -9.420 -13.130 25.008 1.00 41.10 C +ATOM 2044 CG2 VAL A 289 -11.745 -12.257 24.900 1.00 41.30 C +ATOM 2045 N GLY A 290 -9.255 -12.503 28.718 1.00 42.65 N +ATOM 2046 CA GLY A 290 -8.059 -12.645 29.520 1.00 42.72 C +ATOM 2047 C GLY A 290 -8.199 -13.748 30.549 1.00 44.13 C +ATOM 2048 O GLY A 290 -7.271 -14.535 30.762 1.00 42.41 O +ATOM 2049 N ALA A 291 -9.365 -13.799 31.187 1.00 42.96 N +ATOM 2050 CA ALA A 291 -9.652 -14.803 32.202 1.00 43.13 C +ATOM 2051 C ALA A 291 -9.533 -16.204 31.613 1.00 42.49 C +ATOM 2052 O ALA A 291 -8.781 -17.037 32.120 1.00 40.32 O +ATOM 2053 CB ALA A 291 -11.053 -14.587 32.774 1.00 42.03 C +ATOM 2054 N THR A 292 -10.270 -16.454 30.537 1.00 43.30 N +ATOM 2055 CA THR A 292 -10.250 -17.754 29.885 1.00 44.73 C +ATOM 2056 C THR A 292 -8.851 -18.121 29.406 1.00 44.83 C +ATOM 2057 O THR A 292 -8.391 -19.251 29.596 1.00 46.09 O +ATOM 2058 CB THR A 292 -11.209 -17.794 28.675 1.00 45.23 C +ATOM 2059 OG1 THR A 292 -12.548 -17.529 29.114 1.00 47.71 O +ATOM 2060 CG2 THR A 292 -11.163 -19.169 28.004 1.00 44.06 C +ATOM 2061 N TYR A 293 -8.180 -17.164 28.779 1.00 43.77 N +ATOM 2062 CA TYR A 293 -6.839 -17.389 28.263 1.00 42.35 C +ATOM 2063 C TYR A 293 -5.854 -17.803 29.360 1.00 41.40 C +ATOM 2064 O TYR A 293 -5.062 -18.718 29.177 1.00 41.08 O +ATOM 2065 CB TYR A 293 -6.351 -16.123 27.541 1.00 42.46 C +ATOM 2066 CG TYR A 293 -4.940 -16.200 27.008 1.00 40.84 C +ATOM 2067 CD1 TYR A 293 -3.861 -15.771 27.775 1.00 42.03 C +ATOM 2068 CD2 TYR A 293 -4.683 -16.720 25.743 1.00 41.63 C +ATOM 2069 CE1 TYR A 293 -2.556 -15.857 27.294 1.00 43.74 C +ATOM 2070 CE2 TYR A 293 -3.386 -16.813 25.252 1.00 43.55 C +ATOM 2071 CZ TYR A 293 -2.325 -16.380 26.032 1.00 45.58 C +ATOM 2072 OH TYR A 293 -1.034 -16.474 25.553 1.00 47.27 O +ATOM 2073 N MET A 294 -5.903 -17.140 30.506 1.00 42.73 N +ATOM 2074 CA MET A 294 -4.979 -17.487 31.577 1.00 45.44 C +ATOM 2075 C MET A 294 -5.276 -18.898 32.095 1.00 46.02 C +ATOM 2076 O MET A 294 -4.364 -19.699 32.288 1.00 46.64 O +ATOM 2077 CB MET A 294 -5.068 -16.468 32.718 1.00 45.41 C +ATOM 2078 CG MET A 294 -3.932 -16.585 33.733 1.00 48.64 C +ATOM 2079 SD MET A 294 -2.299 -16.108 33.076 1.00 50.48 S +ATOM 2080 CE MET A 294 -2.084 -14.554 33.911 1.00 51.28 C +ATOM 2081 N LEU A 295 -6.555 -19.191 32.315 1.00 46.11 N +ATOM 2082 CA LEU A 295 -6.977 -20.502 32.791 1.00 46.96 C +ATOM 2083 C LEU A 295 -6.485 -21.584 31.827 1.00 47.78 C +ATOM 2084 O LEU A 295 -5.942 -22.598 32.254 1.00 47.13 O +ATOM 2085 CB LEU A 295 -8.505 -20.557 32.904 1.00 46.02 C +ATOM 2086 CG LEU A 295 -9.126 -21.886 33.360 1.00 48.48 C +ATOM 2087 CD1 LEU A 295 -8.581 -22.282 34.739 1.00 46.15 C +ATOM 2088 CD2 LEU A 295 -10.647 -21.754 33.400 1.00 43.56 C +ATOM 2089 N LEU A 296 -6.669 -21.365 30.529 1.00 49.16 N +ATOM 2090 CA LEU A 296 -6.215 -22.337 29.541 1.00 52.82 C +ATOM 2091 C LEU A 296 -4.716 -22.579 29.689 1.00 54.56 C +ATOM 2092 O LEU A 296 -4.255 -23.719 29.695 1.00 55.44 O +ATOM 2093 CB LEU A 296 -6.506 -21.848 28.116 1.00 51.97 C +ATOM 2094 CG LEU A 296 -7.966 -21.810 27.655 1.00 53.81 C +ATOM 2095 CD1 LEU A 296 -8.038 -21.209 26.255 1.00 51.62 C +ATOM 2096 CD2 LEU A 296 -8.559 -23.218 27.665 1.00 51.52 C +ATOM 2097 N VAL A 297 -3.954 -21.500 29.813 1.00 55.62 N +ATOM 2098 CA VAL A 297 -2.511 -21.617 29.950 1.00 56.52 C +ATOM 2099 C VAL A 297 -2.111 -22.278 31.266 1.00 58.06 C +ATOM 2100 O VAL A 297 -1.180 -23.082 31.300 1.00 56.90 O +ATOM 2101 CB VAL A 297 -1.831 -20.225 29.850 1.00 56.12 C +ATOM 2102 CG1 VAL A 297 -0.329 -20.346 30.098 1.00 51.75 C +ATOM 2103 CG2 VAL A 297 -2.093 -19.624 28.474 1.00 55.76 C +ATOM 2104 N ASP A 298 -2.814 -21.944 32.345 1.00 59.16 N +ATOM 2105 CA ASP A 298 -2.494 -22.509 33.649 1.00 62.05 C +ATOM 2106 C ASP A 298 -2.734 -24.008 33.758 1.00 63.79 C +ATOM 2107 O ASP A 298 -1.933 -24.720 34.357 1.00 63.53 O +ATOM 2108 CB ASP A 298 -3.278 -21.809 34.756 1.00 61.87 C +ATOM 2109 CG ASP A 298 -2.973 -22.383 36.133 1.00 63.69 C +ATOM 2110 OD1 ASP A 298 -3.917 -22.856 36.804 1.00 64.41 O +ATOM 2111 OD2 ASP A 298 -1.788 -22.362 36.541 1.00 62.85 O +ATOM 2112 N ASN A 299 -3.838 -24.496 33.203 1.00 66.08 N +ATOM 2113 CA ASN A 299 -4.097 -25.923 33.287 1.00 68.98 C +ATOM 2114 C ASN A 299 -3.334 -26.666 32.191 1.00 69.93 C +ATOM 2115 O ASN A 299 -3.560 -27.851 31.940 1.00 71.25 O +ATOM 2116 CB ASN A 299 -5.611 -26.220 33.266 1.00 68.34 C +ATOM 2117 CG ASN A 299 -6.276 -25.851 31.962 1.00 69.42 C +ATOM 2118 OD1 ASN A 299 -7.491 -25.636 31.916 1.00 69.06 O +ATOM 2119 ND2 ASN A 299 -5.497 -25.794 30.889 1.00 70.57 N +ATOM 2120 N VAL A 300 -2.425 -25.946 31.541 1.00 70.13 N +ATOM 2121 CA VAL A 300 -1.564 -26.531 30.520 1.00 70.95 C +ATOM 2122 C VAL A 300 -0.238 -26.722 31.246 1.00 71.65 C +ATOM 2123 O VAL A 300 0.507 -27.659 30.974 1.00 71.88 O +ATOM 2124 CB VAL A 300 -1.361 -25.592 29.303 1.00 70.66 C +ATOM 2125 CG1 VAL A 300 -0.129 -26.014 28.512 1.00 69.00 C +ATOM 2126 CG2 VAL A 300 -2.580 -25.652 28.398 1.00 70.65 C +ATOM 2127 N ALA A 301 0.033 -25.823 32.188 1.00 72.85 N +ATOM 2128 CA ALA A 301 1.247 -25.886 32.990 1.00 75.20 C +ATOM 2129 C ALA A 301 1.183 -27.144 33.850 1.00 77.14 C +ATOM 2130 O ALA A 301 2.209 -27.673 34.283 1.00 77.61 O +ATOM 2131 CB ALA A 301 1.354 -24.652 33.874 1.00 74.20 C +ATOM 2132 N ARG A 302 -0.038 -27.612 34.095 1.00 79.18 N +ATOM 2133 CA ARG A 302 -0.260 -28.813 34.889 1.00 81.20 C +ATOM 2134 C ARG A 302 -0.224 -30.029 33.970 1.00 82.96 C +ATOM 2135 O ARG A 302 0.537 -30.969 34.197 1.00 84.12 O +ATOM 2136 CB ARG A 302 -1.617 -28.751 35.594 1.00 79.86 C +ATOM 2137 CG ARG A 302 -1.815 -27.556 36.505 1.00 77.35 C +ATOM 2138 CD ARG A 302 -3.119 -27.693 37.274 1.00 77.42 C +ATOM 2139 NE ARG A 302 -4.280 -27.785 36.389 1.00 77.88 N +ATOM 2140 CZ ARG A 302 -5.479 -28.225 36.766 1.00 77.01 C +ATOM 2141 NH1 ARG A 302 -6.476 -28.271 35.894 1.00 74.75 N +ATOM 2142 NH2 ARG A 302 -5.679 -28.631 38.012 1.00 77.06 N +ATOM 2143 N SER A 303 -1.051 -30.002 32.929 1.00 84.53 N +ATOM 2144 CA SER A 303 -1.116 -31.097 31.967 1.00 86.61 C +ATOM 2145 C SER A 303 0.256 -31.396 31.369 1.00 88.13 C +ATOM 2146 O SER A 303 0.770 -32.507 31.495 1.00 88.27 O +ATOM 2147 CB SER A 303 -2.085 -30.752 30.833 1.00 86.59 C +ATOM 2148 OG SER A 303 -3.392 -30.512 31.320 1.00 88.65 O +ATOM 2149 N LEU A 304 0.831 -30.384 30.721 1.00 89.66 N +ATOM 2150 CA LEU A 304 2.132 -30.474 30.061 1.00 90.14 C +ATOM 2151 C LEU A 304 3.102 -31.481 30.673 1.00 90.37 C +ATOM 2152 O LEU A 304 3.631 -32.340 29.967 1.00 91.13 O +ATOM 2153 CB LEU A 304 2.791 -29.089 30.020 0.00 90.24 C +ATOM 2154 CG LEU A 304 4.020 -28.862 29.128 0.00 90.34 C +ATOM 2155 CD1 LEU A 304 5.229 -29.604 29.675 0.00 90.39 C +ATOM 2156 CD2 LEU A 304 3.701 -29.310 27.710 0.00 90.39 C +ATOM 2157 N SER A 305 3.341 -31.382 31.976 1.00 89.79 N +ATOM 2158 CA SER A 305 4.275 -32.296 32.627 1.00 89.25 C +ATOM 2159 C SER A 305 3.803 -32.776 33.993 1.00 88.33 C +ATOM 2160 O SER A 305 2.748 -32.367 34.475 1.00 88.25 O +ATOM 2161 CB SER A 305 5.640 -31.615 32.768 1.00 89.57 C +ATOM 2162 OG SER A 305 6.567 -32.450 33.438 1.00 90.99 O +ATOM 2163 N ASP A 306 4.593 -33.658 34.603 1.00 87.81 N +ATOM 2164 CA ASP A 306 4.284 -34.189 35.930 1.00 86.29 C +ATOM 2165 C ASP A 306 4.638 -33.101 36.935 1.00 84.47 C +ATOM 2166 O ASP A 306 3.969 -32.935 37.959 1.00 83.81 O +ATOM 2167 CB ASP A 306 5.114 -35.448 36.219 1.00 86.75 C +ATOM 2168 CG ASP A 306 4.791 -36.591 35.275 1.00 86.96 C +ATOM 2169 OD1 ASP A 306 4.970 -36.422 34.051 0.00 87.00 O +ATOM 2170 OD2 ASP A 306 4.359 -37.659 35.758 0.00 87.00 O +ATOM 2171 N ALA A 307 5.698 -32.362 36.622 1.00 81.89 N +ATOM 2172 CA ALA A 307 6.161 -31.272 37.469 1.00 79.83 C +ATOM 2173 C ALA A 307 5.474 -29.970 37.063 1.00 78.18 C +ATOM 2174 O ALA A 307 5.051 -29.805 35.915 1.00 78.87 O +ATOM 2175 CB ALA A 307 7.676 -31.124 37.352 1.00 79.47 C +ATOM 2176 N GLU A 308 5.363 -29.049 38.012 1.00 75.02 N +ATOM 2177 CA GLU A 308 4.731 -27.764 37.759 1.00 71.72 C +ATOM 2178 C GLU A 308 5.701 -26.788 37.109 1.00 68.30 C +ATOM 2179 O GLU A 308 6.632 -26.314 37.757 1.00 68.29 O +ATOM 2180 CB GLU A 308 4.219 -27.157 39.070 1.00 72.78 C +ATOM 2181 CG GLU A 308 2.910 -27.738 39.584 1.00 75.54 C +ATOM 2182 CD GLU A 308 1.722 -27.367 38.711 1.00 76.95 C +ATOM 2183 OE1 GLU A 308 1.496 -26.157 38.500 1.00 77.33 O +ATOM 2184 OE2 GLU A 308 1.014 -28.284 38.240 1.00 78.64 O +ATOM 2185 N ILE A 309 5.496 -26.499 35.828 1.00 63.54 N +ATOM 2186 CA ILE A 309 6.350 -25.537 35.141 1.00 59.93 C +ATOM 2187 C ILE A 309 5.730 -24.164 35.394 1.00 56.20 C +ATOM 2188 O ILE A 309 4.545 -23.962 35.145 1.00 53.54 O +ATOM 2189 CB ILE A 309 6.411 -25.813 33.618 1.00 60.55 C +ATOM 2190 CG1 ILE A 309 7.173 -24.690 32.909 1.00 59.96 C +ATOM 2191 CG2 ILE A 309 5.015 -25.938 33.056 1.00 61.20 C +ATOM 2192 CD1 ILE A 309 7.455 -24.967 31.446 0.00 60.20 C +ATOM 2193 N PRO A 310 6.516 -23.210 35.921 1.00 54.92 N +ATOM 2194 CA PRO A 310 5.964 -21.875 36.185 1.00 54.60 C +ATOM 2195 C PRO A 310 5.220 -21.320 34.970 1.00 53.25 C +ATOM 2196 O PRO A 310 5.717 -21.374 33.842 1.00 51.37 O +ATOM 2197 CB PRO A 310 7.198 -21.054 36.577 1.00 55.67 C +ATOM 2198 CG PRO A 310 8.340 -21.792 35.925 1.00 55.96 C +ATOM 2199 CD PRO A 310 7.970 -23.233 36.149 1.00 54.75 C +ATOM 2200 N ILE A 311 4.022 -20.799 35.214 1.00 51.85 N +ATOM 2201 CA ILE A 311 3.175 -20.276 34.149 1.00 50.55 C +ATOM 2202 C ILE A 311 3.811 -19.137 33.349 1.00 49.22 C +ATOM 2203 O ILE A 311 3.408 -18.871 32.220 1.00 48.73 O +ATOM 2204 CB ILE A 311 1.792 -19.828 34.718 1.00 50.31 C +ATOM 2205 CG1 ILE A 311 0.765 -19.750 33.587 1.00 49.66 C +ATOM 2206 CG2 ILE A 311 1.923 -18.489 35.437 1.00 50.10 C +ATOM 2207 CD1 ILE A 311 -0.634 -19.409 34.044 0.00 49.78 C +ATOM 2208 N SER A 312 4.810 -18.476 33.920 1.00 48.48 N +ATOM 2209 CA SER A 312 5.470 -17.383 33.218 1.00 49.38 C +ATOM 2210 C SER A 312 6.224 -17.909 32.002 1.00 49.44 C +ATOM 2211 O SER A 312 6.311 -17.238 30.970 1.00 48.61 O +ATOM 2212 CB SER A 312 6.433 -16.651 34.151 1.00 50.88 C +ATOM 2213 OG SER A 312 7.388 -17.544 34.703 1.00 52.99 O +ATOM 2214 N ILE A 313 6.775 -19.111 32.122 1.00 48.51 N +ATOM 2215 CA ILE A 313 7.492 -19.710 31.007 1.00 47.70 C +ATOM 2216 C ILE A 313 6.500 -19.983 29.877 1.00 47.66 C +ATOM 2217 O ILE A 313 6.800 -19.744 28.708 1.00 48.78 O +ATOM 2218 CB ILE A 313 8.164 -21.043 31.409 1.00 48.13 C +ATOM 2219 CG1 ILE A 313 9.206 -20.802 32.506 1.00 48.53 C +ATOM 2220 CG2 ILE A 313 8.814 -21.680 30.189 1.00 50.20 C +ATOM 2221 CD1 ILE A 313 9.929 -22.055 32.956 0.00 48.38 C +ATOM 2222 N LEU A 314 5.315 -20.475 30.233 1.00 46.62 N +ATOM 2223 CA LEU A 314 4.286 -20.790 29.244 1.00 46.67 C +ATOM 2224 C LEU A 314 3.625 -19.588 28.568 1.00 45.60 C +ATOM 2225 O LEU A 314 3.303 -19.650 27.381 1.00 44.95 O +ATOM 2226 CB LEU A 314 3.199 -21.677 29.863 1.00 48.65 C +ATOM 2227 CG LEU A 314 3.479 -23.182 29.980 1.00 51.09 C +ATOM 2228 CD1 LEU A 314 3.904 -23.739 28.617 1.00 49.87 C +ATOM 2229 CD2 LEU A 314 4.560 -23.425 31.007 1.00 51.32 C +ATOM 2230 N THR A 315 3.395 -18.507 29.307 1.00 43.82 N +ATOM 2231 CA THR A 315 2.789 -17.334 28.686 1.00 45.29 C +ATOM 2232 C THR A 315 3.743 -16.763 27.632 1.00 45.09 C +ATOM 2233 O THR A 315 3.305 -16.242 26.610 1.00 45.59 O +ATOM 2234 CB THR A 315 2.460 -16.228 29.713 1.00 44.63 C +ATOM 2235 OG1 THR A 315 3.632 -15.901 30.466 1.00 43.89 O +ATOM 2236 CG2 THR A 315 1.348 -16.685 30.649 1.00 44.91 C +ATOM 2237 N ALA A 316 5.045 -16.888 27.877 1.00 44.25 N +ATOM 2238 CA ALA A 316 6.054 -16.393 26.947 1.00 45.29 C +ATOM 2239 C ALA A 316 6.196 -17.290 25.720 1.00 46.59 C +ATOM 2240 O ALA A 316 6.313 -16.802 24.598 1.00 47.67 O +ATOM 2241 CB ALA A 316 7.398 -16.263 27.656 1.00 42.81 C +ATOM 2242 N LEU A 317 6.184 -18.601 25.931 1.00 48.19 N +ATOM 2243 CA LEU A 317 6.322 -19.545 24.825 1.00 48.33 C +ATOM 2244 C LEU A 317 5.079 -19.567 23.952 1.00 48.43 C +ATOM 2245 O LEU A 317 5.154 -19.872 22.765 1.00 48.14 O +ATOM 2246 CB LEU A 317 6.595 -20.956 25.350 1.00 48.74 C +ATOM 2247 CG LEU A 317 7.941 -21.203 26.029 1.00 51.25 C +ATOM 2248 CD1 LEU A 317 7.993 -22.638 26.537 1.00 53.24 C +ATOM 2249 CD2 LEU A 317 9.073 -20.954 25.043 1.00 51.87 C +ATOM 2250 N ILE A 318 3.931 -19.258 24.545 1.00 48.83 N +ATOM 2251 CA ILE A 318 2.678 -19.241 23.799 1.00 48.47 C +ATOM 2252 C ILE A 318 2.452 -17.830 23.272 1.00 49.22 C +ATOM 2253 O ILE A 318 2.165 -17.626 22.088 1.00 48.46 O +ATOM 2254 CB ILE A 318 1.466 -19.623 24.692 1.00 48.25 C +ATOM 2255 CG1 ILE A 318 1.630 -21.045 25.244 1.00 47.46 C +ATOM 2256 CG2 ILE A 318 0.182 -19.525 23.882 1.00 47.04 C +ATOM 2257 CD1 ILE A 318 0.516 -21.477 26.176 0.00 47.89 C +ATOM 2258 N GLY A 319 2.599 -16.863 24.171 1.00 49.13 N +ATOM 2259 CA GLY A 319 2.399 -15.471 23.819 1.00 51.20 C +ATOM 2260 C GLY A 319 3.228 -14.953 22.665 1.00 52.33 C +ATOM 2261 O GLY A 319 2.680 -14.538 21.649 1.00 52.55 O +ATOM 2262 N ALA A 320 4.548 -14.971 22.817 1.00 55.13 N +ATOM 2263 CA ALA A 320 5.445 -14.475 21.779 1.00 56.80 C +ATOM 2264 C ALA A 320 5.036 -14.913 20.372 1.00 57.76 C +ATOM 2265 O ALA A 320 4.719 -14.078 19.523 1.00 58.09 O +ATOM 2266 CB ALA A 320 6.875 -14.908 22.072 1.00 56.75 C +ATOM 2267 N PRO A 321 5.025 -16.228 20.104 1.00 59.23 N +ATOM 2268 CA PRO A 321 4.637 -16.669 18.761 1.00 59.39 C +ATOM 2269 C PRO A 321 3.233 -16.216 18.369 1.00 59.27 C +ATOM 2270 O PRO A 321 2.984 -15.866 17.213 1.00 60.08 O +ATOM 2271 CB PRO A 321 4.772 -18.188 18.845 1.00 59.23 C +ATOM 2272 CG PRO A 321 4.479 -18.469 20.269 1.00 60.48 C +ATOM 2273 CD PRO A 321 5.235 -17.382 20.993 1.00 59.07 C +ATOM 2274 N LEU A 322 2.320 -16.212 19.333 1.00 58.23 N +ATOM 2275 CA LEU A 322 0.955 -15.788 19.061 1.00 58.21 C +ATOM 2276 C LEU A 322 0.964 -14.311 18.678 1.00 59.45 C +ATOM 2277 O LEU A 322 0.197 -13.870 17.815 1.00 58.93 O +ATOM 2278 CB LEU A 322 0.077 -16.002 20.293 1.00 57.36 C +ATOM 2279 CG LEU A 322 -1.409 -15.689 20.109 1.00 58.11 C +ATOM 2280 CD1 LEU A 322 -1.993 -16.581 19.026 1.00 58.02 C +ATOM 2281 CD2 LEU A 322 -2.142 -15.895 21.423 1.00 58.17 C +ATOM 2282 N PHE A 323 1.842 -13.554 19.330 1.00 60.03 N +ATOM 2283 CA PHE A 323 1.987 -12.128 19.073 1.00 60.34 C +ATOM 2284 C PHE A 323 2.410 -11.957 17.619 1.00 61.51 C +ATOM 2285 O PHE A 323 1.871 -11.120 16.895 1.00 60.06 O +ATOM 2286 CB PHE A 323 3.053 -11.540 20.000 1.00 59.72 C +ATOM 2287 CG PHE A 323 3.244 -10.056 19.853 1.00 58.44 C +ATOM 2288 CD1 PHE A 323 2.252 -9.169 20.252 1.00 59.30 C +ATOM 2289 CD2 PHE A 323 4.429 -9.544 19.331 1.00 58.62 C +ATOM 2290 CE1 PHE A 323 2.438 -7.790 20.136 1.00 58.46 C +ATOM 2291 CE2 PHE A 323 4.625 -8.169 19.210 1.00 57.55 C +ATOM 2292 CZ PHE A 323 3.629 -7.292 19.614 1.00 58.74 C +ATOM 2293 N GLY A 324 3.378 -12.765 17.198 1.00 63.27 N +ATOM 2294 CA GLY A 324 3.853 -12.697 15.831 1.00 65.22 C +ATOM 2295 C GLY A 324 2.718 -12.954 14.863 1.00 66.85 C +ATOM 2296 O GLY A 324 2.516 -12.200 13.911 1.00 66.60 O +ATOM 2297 N VAL A 325 1.970 -14.024 15.114 1.00 67.88 N +ATOM 2298 CA VAL A 325 0.845 -14.393 14.267 1.00 68.53 C +ATOM 2299 C VAL A 325 -0.174 -13.269 14.173 1.00 69.27 C +ATOM 2300 O VAL A 325 -0.712 -13.000 13.100 1.00 69.19 O +ATOM 2301 CB VAL A 325 0.147 -15.660 14.797 1.00 68.48 C +ATOM 2302 CG1 VAL A 325 -1.146 -15.905 14.037 1.00 69.10 C +ATOM 2303 CG2 VAL A 325 1.076 -16.855 14.651 1.00 68.06 C +ATOM 2304 N LEU A 326 -0.440 -12.613 15.296 1.00 70.96 N +ATOM 2305 CA LEU A 326 -1.400 -11.516 15.314 1.00 73.29 C +ATOM 2306 C LEU A 326 -0.882 -10.322 14.517 1.00 75.05 C +ATOM 2307 O LEU A 326 -1.654 -9.631 13.850 1.00 75.21 O +ATOM 2308 CB LEU A 326 -1.706 -11.104 16.757 1.00 73.01 C +ATOM 2309 CG LEU A 326 -2.445 -12.166 17.583 1.00 74.29 C +ATOM 2310 CD1 LEU A 326 -2.648 -11.679 19.010 1.00 73.18 C +ATOM 2311 CD2 LEU A 326 -3.786 -12.474 16.927 1.00 73.09 C +ATOM 2312 N VAL A 327 0.426 -10.089 14.585 1.00 77.14 N +ATOM 2313 CA VAL A 327 1.052 -8.988 13.860 1.00 79.41 C +ATOM 2314 C VAL A 327 1.144 -9.339 12.378 1.00 81.79 C +ATOM 2315 O VAL A 327 0.903 -8.497 11.512 1.00 81.80 O +ATOM 2316 CB VAL A 327 2.472 -8.700 14.396 1.00 78.98 C +ATOM 2317 CG1 VAL A 327 3.202 -7.751 13.460 1.00 78.94 C +ATOM 2318 CG2 VAL A 327 2.388 -8.093 15.791 1.00 78.40 C +ATOM 2319 N TYR A 328 1.496 -10.590 12.100 1.00 84.49 N +ATOM 2320 CA TYR A 328 1.613 -11.078 10.732 1.00 87.31 C +ATOM 2321 C TYR A 328 0.368 -10.714 9.926 1.00 88.84 C +ATOM 2322 O TYR A 328 0.470 -10.269 8.782 1.00 89.40 O +ATOM 2323 CB TYR A 328 1.810 -12.599 10.738 1.00 88.57 C +ATOM 2324 CG TYR A 328 1.738 -13.246 9.371 1.00 90.19 C +ATOM 2325 CD1 TYR A 328 2.619 -12.879 8.354 1.00 90.39 C +ATOM 2326 CD2 TYR A 328 0.780 -14.223 9.092 1.00 90.60 C +ATOM 2327 CE1 TYR A 328 2.548 -13.466 7.092 1.00 90.75 C +ATOM 2328 CE2 TYR A 328 0.699 -14.817 7.835 1.00 90.96 C +ATOM 2329 CZ TYR A 328 1.585 -14.434 6.840 1.00 91.59 C +ATOM 2330 OH TYR A 328 1.502 -15.010 5.592 1.00 92.09 O +ATOM 2331 N LYS A 329 -0.803 -10.900 10.531 1.00 90.44 N +ATOM 2332 CA LYS A 329 -2.066 -10.586 9.870 1.00 91.69 C +ATOM 2333 C LYS A 329 -2.440 -9.115 10.043 1.00 93.20 C +ATOM 2334 O LYS A 329 -3.361 -8.778 10.788 1.00 92.94 O +ATOM 2335 CB LYS A 329 -3.195 -11.473 10.415 1.00 91.90 C +ATOM 2336 CG LYS A 329 -3.425 -11.364 11.921 1.00 92.94 C +ATOM 2337 CD LYS A 329 -4.768 -11.966 12.345 1.00 92.93 C +ATOM 2338 CE LYS A 329 -4.841 -13.467 12.088 1.00 92.96 C +ATOM 2339 NZ LYS A 329 -6.151 -14.040 12.516 1.00 91.93 N +ATOM 2340 N LEU A 330 -1.718 -8.239 9.351 1.00 94.33 N +ATOM 2341 CA LEU A 330 -1.985 -6.807 9.423 1.00 94.40 C +ATOM 2342 C LEU A 330 -3.237 -6.469 8.622 1.00 93.71 C +ATOM 2343 O LEU A 330 -3.827 -7.399 8.033 0.00 93.76 O +ATOM 2344 CB LEU A 330 -0.795 -6.012 8.874 1.00 95.29 C +ATOM 2345 CG LEU A 330 0.515 -6.071 9.666 1.00 96.50 C +ATOM 2346 CD1 LEU A 330 1.614 -5.347 8.901 1.00 96.16 C +ATOM 2347 CD2 LEU A 330 0.312 -5.444 11.039 1.00 96.29 C +TER 2348 LEU A 330 +ATOM 2349 N ASN C 2 -25.162 40.320 21.248 1.00 60.07 N +ATOM 2350 CA ASN C 2 -24.385 40.442 22.519 1.00 59.62 C +ATOM 2351 C ASN C 2 -22.991 39.835 22.327 1.00 57.17 C +ATOM 2352 O ASN C 2 -22.751 39.108 21.365 1.00 55.10 O +ATOM 2353 CB ASN C 2 -25.123 39.717 23.656 1.00 61.61 C +ATOM 2354 CG ASN C 2 -24.748 40.245 25.042 1.00 66.11 C +ATOM 2355 OD1 ASN C 2 -23.574 40.241 25.435 1.00 67.16 O +ATOM 2356 ND2 ASN C 2 -25.751 40.699 25.791 1.00 65.28 N +ATOM 2357 N LYS C 3 -22.082 40.145 23.248 1.00 55.09 N +ATOM 2358 CA LYS C 3 -20.713 39.642 23.198 1.00 52.93 C +ATOM 2359 C LYS C 3 -20.614 38.118 23.196 1.00 49.17 C +ATOM 2360 O LYS C 3 -21.454 37.421 23.761 1.00 48.05 O +ATOM 2361 CB LYS C 3 -19.899 40.197 24.372 1.00 56.54 C +ATOM 2362 CG LYS C 3 -19.315 41.586 24.139 1.00 59.85 C +ATOM 2363 CD LYS C 3 -18.503 42.059 25.343 1.00 62.71 C +ATOM 2364 CE LYS C 3 -17.667 43.297 25.015 1.00 65.02 C +ATOM 2365 NZ LYS C 3 -18.488 44.450 24.530 1.00 66.98 N +ATOM 2366 N ALA C 4 -19.578 37.614 22.538 1.00 46.35 N +ATOM 2367 CA ALA C 4 -19.335 36.182 22.456 1.00 44.79 C +ATOM 2368 C ALA C 4 -17.964 35.921 23.055 1.00 42.55 C +ATOM 2369 O ALA C 4 -17.752 34.942 23.767 1.00 40.84 O +ATOM 2370 CB ALA C 4 -19.367 35.725 21.003 1.00 44.78 C +ATOM 2371 N LEU C 5 -17.041 36.830 22.774 1.00 41.09 N +ATOM 2372 CA LEU C 5 -15.678 36.711 23.256 1.00 39.89 C +ATOM 2373 C LEU C 5 -15.018 38.078 23.374 1.00 39.36 C +ATOM 2374 O LEU C 5 -15.297 38.993 22.592 1.00 37.08 O +ATOM 2375 CB LEU C 5 -14.867 35.842 22.290 1.00 42.57 C +ATOM 2376 CG LEU C 5 -13.349 35.777 22.475 1.00 43.21 C +ATOM 2377 CD1 LEU C 5 -13.010 35.003 23.751 1.00 43.98 C +ATOM 2378 CD2 LEU C 5 -12.732 35.096 21.263 1.00 46.34 C +ATOM 2379 N SER C 6 -14.126 38.200 24.349 1.00 38.09 N +ATOM 2380 CA SER C 6 -13.402 39.438 24.560 1.00 40.38 C +ATOM 2381 C SER C 6 -11.951 39.158 24.928 1.00 39.08 C +ATOM 2382 O SER C 6 -11.660 38.321 25.781 1.00 39.42 O +ATOM 2383 CB SER C 6 -14.066 40.270 25.659 1.00 42.06 C +ATOM 2384 OG SER C 6 -13.293 41.427 25.925 1.00 44.68 O +ATOM 2385 N VAL C 7 -11.046 39.872 24.273 1.00 39.74 N +ATOM 2386 CA VAL C 7 -9.618 39.726 24.500 1.00 40.96 C +ATOM 2387 C VAL C 7 -9.085 41.124 24.765 1.00 42.97 C +ATOM 2388 O VAL C 7 -9.112 41.982 23.885 1.00 43.61 O +ATOM 2389 CB VAL C 7 -8.934 39.106 23.259 1.00 40.82 C +ATOM 2390 CG1 VAL C 7 -7.432 39.017 23.468 1.00 39.67 C +ATOM 2391 CG2 VAL C 7 -9.517 37.714 22.998 1.00 40.41 C +ATOM 2392 N GLU C 8 -8.599 41.351 25.982 1.00 45.71 N +ATOM 2393 CA GLU C 8 -8.114 42.671 26.360 1.00 47.29 C +ATOM 2394 C GLU C 8 -6.674 42.722 26.843 1.00 46.01 C +ATOM 2395 O GLU C 8 -6.294 41.999 27.766 1.00 48.07 O +ATOM 2396 CB GLU C 8 -9.025 43.240 27.452 1.00 52.22 C +ATOM 2397 CG GLU C 8 -10.513 43.139 27.127 1.00 58.26 C +ATOM 2398 CD GLU C 8 -11.403 43.577 28.277 1.00 62.81 C +ATOM 2399 OE1 GLU C 8 -12.644 43.509 28.129 1.00 64.46 O +ATOM 2400 OE2 GLU C 8 -10.865 43.988 29.328 1.00 66.39 O +ATOM 2401 N ASN C 9 -5.876 43.573 26.206 1.00 43.91 N +ATOM 2402 CA ASN C 9 -4.486 43.771 26.600 1.00 44.83 C +ATOM 2403 C ASN C 9 -3.705 42.453 26.704 1.00 45.67 C +ATOM 2404 O ASN C 9 -2.783 42.319 27.520 1.00 44.93 O +ATOM 2405 CB ASN C 9 -4.470 44.502 27.952 1.00 45.56 C +ATOM 2406 CG ASN C 9 -3.124 45.104 28.283 1.00 48.04 C +ATOM 2407 OD1 ASN C 9 -2.690 45.085 29.440 1.00 51.48 O +ATOM 2408 ND2 ASN C 9 -2.460 45.659 27.276 1.00 46.80 N +ATOM 2409 N LEU C 10 -4.064 41.487 25.865 1.00 45.03 N +ATOM 2410 CA LEU C 10 -3.409 40.191 25.882 1.00 42.75 C +ATOM 2411 C LEU C 10 -1.960 40.233 25.424 1.00 41.96 C +ATOM 2412 O LEU C 10 -1.632 40.843 24.412 1.00 40.01 O +ATOM 2413 CB LEU C 10 -4.180 39.203 25.012 1.00 44.27 C +ATOM 2414 CG LEU C 10 -3.825 37.735 25.243 1.00 45.90 C +ATOM 2415 CD1 LEU C 10 -4.282 37.348 26.643 1.00 45.76 C +ATOM 2416 CD2 LEU C 10 -4.508 36.849 24.194 1.00 45.37 C +ATOM 2417 N GLY C 11 -1.101 39.573 26.195 1.00 42.39 N +ATOM 2418 CA GLY C 11 0.314 39.485 25.885 1.00 42.67 C +ATOM 2419 C GLY C 11 0.735 38.038 26.114 1.00 45.87 C +ATOM 2420 O GLY C 11 0.362 37.427 27.118 1.00 43.75 O +ATOM 2421 N PHE C 12 1.507 37.474 25.195 1.00 49.23 N +ATOM 2422 CA PHE C 12 1.925 36.079 25.341 1.00 51.80 C +ATOM 2423 C PHE C 12 3.176 35.746 24.541 1.00 52.84 C +ATOM 2424 O PHE C 12 3.486 36.400 23.547 1.00 51.24 O +ATOM 2425 CB PHE C 12 0.779 35.154 24.921 1.00 51.73 C +ATOM 2426 CG PHE C 12 0.316 35.366 23.508 1.00 50.39 C +ATOM 2427 CD1 PHE C 12 0.795 34.567 22.478 1.00 50.63 C +ATOM 2428 CD2 PHE C 12 -0.606 36.364 23.208 1.00 51.45 C +ATOM 2429 CE1 PHE C 12 0.359 34.756 21.166 1.00 50.89 C +ATOM 2430 CE2 PHE C 12 -1.046 36.563 21.897 1.00 50.23 C +ATOM 2431 CZ PHE C 12 -0.564 35.757 20.877 1.00 49.44 C +ATOM 2432 N TYR C 13 3.885 34.714 24.982 1.00 55.84 N +ATOM 2433 CA TYR C 13 5.112 34.301 24.320 1.00 58.88 C +ATOM 2434 C TYR C 13 4.895 33.068 23.462 1.00 60.50 C +ATOM 2435 O TYR C 13 4.092 32.196 23.793 1.00 60.33 O +ATOM 2436 CB TYR C 13 6.194 34.009 25.364 1.00 60.49 C +ATOM 2437 CG TYR C 13 7.595 33.881 24.805 1.00 63.43 C +ATOM 2438 CD1 TYR C 13 8.239 32.643 24.744 1.00 63.99 C +ATOM 2439 CD2 TYR C 13 8.291 35.006 24.364 1.00 65.36 C +ATOM 2440 CE1 TYR C 13 9.549 32.532 24.261 1.00 65.36 C +ATOM 2441 CE2 TYR C 13 9.595 34.908 23.879 1.00 66.75 C +ATOM 2442 CZ TYR C 13 10.220 33.671 23.831 1.00 67.42 C +ATOM 2443 OH TYR C 13 11.516 33.588 23.358 1.00 69.17 O +ATOM 2444 N TYR C 14 5.612 33.015 22.348 1.00 62.94 N +ATOM 2445 CA TYR C 14 5.548 31.881 21.442 1.00 66.20 C +ATOM 2446 C TYR C 14 6.981 31.386 21.333 1.00 66.99 C +ATOM 2447 O TYR C 14 7.804 31.997 20.648 1.00 65.82 O +ATOM 2448 CB TYR C 14 5.022 32.312 20.069 1.00 67.81 C +ATOM 2449 CG TYR C 14 4.979 31.193 19.050 1.00 69.99 C +ATOM 2450 CD1 TYR C 14 4.282 30.013 19.310 1.00 70.89 C +ATOM 2451 CD2 TYR C 14 5.642 31.310 17.828 1.00 70.66 C +ATOM 2452 CE1 TYR C 14 4.248 28.974 18.379 1.00 72.62 C +ATOM 2453 CE2 TYR C 14 5.615 30.281 16.889 1.00 72.16 C +ATOM 2454 CZ TYR C 14 4.918 29.115 17.172 1.00 73.56 C +ATOM 2455 OH TYR C 14 4.902 28.087 16.254 1.00 74.58 O +ATOM 2456 N GLN C 15 7.272 30.293 22.035 1.00 69.18 N +ATOM 2457 CA GLN C 15 8.611 29.704 22.055 1.00 72.49 C +ATOM 2458 C GLN C 15 9.212 29.510 20.673 1.00 73.06 C +ATOM 2459 O GLN C 15 10.245 30.096 20.348 1.00 73.51 O +ATOM 2460 CB GLN C 15 8.585 28.350 22.763 1.00 74.02 C +ATOM 2461 CG GLN C 15 8.125 28.399 24.201 1.00 77.54 C +ATOM 2462 CD GLN C 15 7.987 27.015 24.801 1.00 80.08 C +ATOM 2463 OE1 GLN C 15 8.954 26.251 24.861 1.00 81.14 O +ATOM 2464 NE2 GLN C 15 6.778 26.680 25.246 1.00 81.13 N +ATOM 2465 N ALA C 16 8.558 28.676 19.870 1.00 73.82 N +ATOM 2466 CA ALA C 16 9.017 28.364 18.523 1.00 74.67 C +ATOM 2467 C ALA C 16 9.769 29.498 17.833 1.00 75.49 C +ATOM 2468 O ALA C 16 10.936 29.341 17.475 1.00 76.05 O +ATOM 2469 CB ALA C 16 7.844 27.924 17.669 1.00 74.32 C +ATOM 2470 N GLU C 17 9.115 30.641 17.651 1.00 76.30 N +ATOM 2471 CA GLU C 17 9.758 31.767 16.977 1.00 77.04 C +ATOM 2472 C GLU C 17 10.319 32.807 17.935 1.00 76.94 C +ATOM 2473 O GLU C 17 10.739 33.886 17.521 1.00 75.49 O +ATOM 2474 CB GLU C 17 8.776 32.422 16.005 1.00 78.24 C +ATOM 2475 CG GLU C 17 8.173 31.441 15.010 1.00 79.98 C +ATOM 2476 CD GLU C 17 9.227 30.673 14.228 1.00 80.83 C +ATOM 2477 OE1 GLU C 17 8.859 29.706 13.524 1.00 82.38 O +ATOM 2478 OE2 GLU C 17 10.420 31.037 14.313 1.00 79.92 O +ATOM 2479 N ASN C 18 10.321 32.467 19.219 1.00 78.19 N +ATOM 2480 CA ASN C 18 10.838 33.341 20.264 1.00 78.75 C +ATOM 2481 C ASN C 18 10.415 34.800 20.149 1.00 78.55 C +ATOM 2482 O ASN C 18 11.262 35.695 20.159 1.00 79.17 O +ATOM 2483 CB ASN C 18 12.368 33.268 20.301 1.00 80.40 C +ATOM 2484 CG ASN C 18 12.881 31.891 20.689 1.00 82.44 C +ATOM 2485 OD1 ASN C 18 12.704 30.915 19.954 1.00 82.84 O +ATOM 2486 ND2 ASN C 18 13.519 31.806 21.853 1.00 82.76 N +ATOM 2487 N PHE C 19 9.115 35.048 20.024 1.00 76.95 N +ATOM 2488 CA PHE C 19 8.644 36.423 19.954 1.00 75.52 C +ATOM 2489 C PHE C 19 7.469 36.682 20.901 1.00 74.38 C +ATOM 2490 O PHE C 19 6.613 35.820 21.112 1.00 73.92 O +ATOM 2491 CB PHE C 19 8.339 36.835 18.498 0.00 75.89 C +ATOM 2492 CG PHE C 19 7.310 35.988 17.790 0.00 76.12 C +ATOM 2493 CD1 PHE C 19 7.217 36.041 16.401 0.00 76.24 C +ATOM 2494 CD2 PHE C 19 6.413 35.187 18.483 0.00 76.24 C +ATOM 2495 CE1 PHE C 19 6.251 35.312 15.717 0.00 76.33 C +ATOM 2496 CE2 PHE C 19 5.442 34.457 17.806 0.00 76.33 C +ATOM 2497 CZ PHE C 19 5.360 34.519 16.421 0.00 76.35 C +ATOM 2498 N LEU C 20 7.459 37.875 21.490 1.00 72.12 N +ATOM 2499 CA LEU C 20 6.443 38.263 22.462 1.00 68.76 C +ATOM 2500 C LEU C 20 5.391 39.207 21.884 1.00 67.43 C +ATOM 2501 O LEU C 20 5.715 40.305 21.436 1.00 67.20 O +ATOM 2502 CB LEU C 20 7.142 38.931 23.654 1.00 69.19 C +ATOM 2503 CG LEU C 20 6.528 39.023 25.056 1.00 69.77 C +ATOM 2504 CD1 LEU C 20 5.220 39.786 25.025 1.00 70.03 C +ATOM 2505 CD2 LEU C 20 6.322 37.625 25.600 1.00 71.48 C +ATOM 2506 N PHE C 21 4.134 38.772 21.894 1.00 66.16 N +ATOM 2507 CA PHE C 21 3.024 39.590 21.404 1.00 65.40 C +ATOM 2508 C PHE C 21 2.528 40.451 22.563 1.00 64.68 C +ATOM 2509 O PHE C 21 2.402 39.963 23.687 1.00 63.10 O +ATOM 2510 CB PHE C 21 1.873 38.705 20.921 1.00 65.96 C +ATOM 2511 CG PHE C 21 2.121 38.048 19.599 1.00 67.44 C +ATOM 2512 CD1 PHE C 21 2.141 38.800 18.429 1.00 67.18 C +ATOM 2513 CD2 PHE C 21 2.327 36.674 19.520 1.00 67.50 C +ATOM 2514 CE1 PHE C 21 2.363 38.192 17.196 1.00 68.45 C +ATOM 2515 CE2 PHE C 21 2.550 36.055 18.293 1.00 69.40 C +ATOM 2516 CZ PHE C 21 2.568 36.816 17.126 1.00 69.04 C +ATOM 2517 N GLN C 22 2.234 41.720 22.296 1.00 63.88 N +ATOM 2518 CA GLN C 22 1.764 42.604 23.354 1.00 64.19 C +ATOM 2519 C GLN C 22 0.505 43.401 23.042 1.00 62.78 C +ATOM 2520 O GLN C 22 0.215 43.711 21.890 1.00 63.07 O +ATOM 2521 CB GLN C 22 2.874 43.577 23.754 1.00 65.22 C +ATOM 2522 CG GLN C 22 4.054 42.919 24.434 1.00 68.70 C +ATOM 2523 CD GLN C 22 5.050 43.928 24.970 1.00 69.64 C +ATOM 2524 OE1 GLN C 22 4.683 44.854 25.694 1.00 71.32 O +ATOM 2525 NE2 GLN C 22 6.319 43.751 24.622 1.00 70.66 N +ATOM 2526 N GLN C 23 -0.231 43.724 24.099 1.00 61.99 N +ATOM 2527 CA GLN C 23 -1.460 44.515 24.025 1.00 61.67 C +ATOM 2528 C GLN C 23 -2.425 44.150 22.899 1.00 59.09 C +ATOM 2529 O GLN C 23 -2.904 45.016 22.160 1.00 57.26 O +ATOM 2530 CB GLN C 23 -1.099 46.003 23.945 1.00 62.93 C +ATOM 2531 CG GLN C 23 -0.323 46.492 25.156 1.00 66.28 C +ATOM 2532 CD GLN C 23 0.132 47.927 25.016 1.00 68.60 C +ATOM 2533 OE1 GLN C 23 -0.678 48.832 24.810 1.00 69.69 O +ATOM 2534 NE2 GLN C 23 1.436 48.144 25.130 1.00 70.10 N +ATOM 2535 N LEU C 24 -2.722 42.862 22.790 1.00 56.26 N +ATOM 2536 CA LEU C 24 -3.632 42.375 21.772 1.00 52.72 C +ATOM 2537 C LEU C 24 -5.053 42.618 22.273 1.00 50.75 C +ATOM 2538 O LEU C 24 -5.400 42.243 23.396 1.00 49.55 O +ATOM 2539 CB LEU C 24 -3.402 40.879 21.549 1.00 54.48 C +ATOM 2540 CG LEU C 24 -3.864 40.206 20.252 1.00 56.46 C +ATOM 2541 CD1 LEU C 24 -3.875 38.692 20.461 1.00 55.42 C +ATOM 2542 CD2 LEU C 24 -5.245 40.688 19.858 1.00 56.17 C +ATOM 2543 N ASN C 25 -5.872 43.253 21.443 1.00 48.32 N +ATOM 2544 CA ASN C 25 -7.255 43.525 21.802 1.00 47.50 C +ATOM 2545 C ASN C 25 -8.198 43.184 20.655 1.00 48.21 C +ATOM 2546 O ASN C 25 -7.850 43.324 19.479 1.00 49.91 O +ATOM 2547 CB ASN C 25 -7.472 45.012 22.142 1.00 47.00 C +ATOM 2548 CG ASN C 25 -6.725 45.456 23.381 1.00 45.90 C +ATOM 2549 OD1 ASN C 25 -5.547 45.798 23.315 1.00 45.06 O +ATOM 2550 ND2 ASN C 25 -7.409 45.448 24.522 1.00 42.45 N +ATOM 2551 N PHE C 26 -9.393 42.734 21.019 1.00 45.87 N +ATOM 2552 CA PHE C 26 -10.453 42.432 20.072 1.00 45.00 C +ATOM 2553 C PHE C 26 -11.593 41.730 20.771 1.00 45.12 C +ATOM 2554 O PHE C 26 -11.395 41.047 21.773 1.00 46.28 O +ATOM 2555 CB PHE C 26 -9.965 41.608 18.861 1.00 42.29 C +ATOM 2556 CG PHE C 26 -9.586 40.186 19.170 1.00 42.82 C +ATOM 2557 CD1 PHE C 26 -8.267 39.846 19.435 1.00 40.44 C +ATOM 2558 CD2 PHE C 26 -10.541 39.177 19.148 1.00 43.13 C +ATOM 2559 CE1 PHE C 26 -7.901 38.525 19.670 1.00 43.02 C +ATOM 2560 CE2 PHE C 26 -10.184 37.850 19.382 1.00 43.63 C +ATOM 2561 CZ PHE C 26 -8.861 37.525 19.643 1.00 42.10 C +ATOM 2562 N ASP C 27 -12.796 41.946 20.255 1.00 45.21 N +ATOM 2563 CA ASP C 27 -13.995 41.337 20.797 1.00 46.05 C +ATOM 2564 C ASP C 27 -14.826 40.794 19.647 1.00 43.85 C +ATOM 2565 O ASP C 27 -14.743 41.283 18.523 1.00 40.95 O +ATOM 2566 CB ASP C 27 -14.824 42.357 21.591 1.00 52.00 C +ATOM 2567 CG ASP C 27 -14.419 43.794 21.311 1.00 58.70 C +ATOM 2568 OD1 ASP C 27 -14.305 44.175 20.119 1.00 59.98 O +ATOM 2569 OD2 ASP C 27 -14.218 44.546 22.296 1.00 61.72 O +ATOM 2570 N LEU C 28 -15.622 39.775 19.939 1.00 41.79 N +ATOM 2571 CA LEU C 28 -16.476 39.173 18.937 1.00 41.56 C +ATOM 2572 C LEU C 28 -17.888 39.052 19.475 1.00 41.18 C +ATOM 2573 O LEU C 28 -18.088 38.799 20.665 1.00 41.99 O +ATOM 2574 CB LEU C 28 -15.971 37.778 18.562 1.00 40.80 C +ATOM 2575 CG LEU C 28 -14.615 37.640 17.879 1.00 41.68 C +ATOM 2576 CD1 LEU C 28 -14.373 36.166 17.569 1.00 40.42 C +ATOM 2577 CD2 LEU C 28 -14.577 38.481 16.607 1.00 41.15 C +ATOM 2578 N ASN C 29 -18.866 39.230 18.595 1.00 40.40 N +ATOM 2579 CA ASN C 29 -20.263 39.110 18.981 1.00 41.31 C +ATOM 2580 C ASN C 29 -20.797 37.828 18.379 1.00 41.59 C +ATOM 2581 O ASN C 29 -20.142 37.207 17.535 1.00 42.56 O +ATOM 2582 CB ASN C 29 -21.075 40.291 18.451 1.00 42.46 C +ATOM 2583 CG ASN C 29 -20.624 41.609 19.029 1.00 42.56 C +ATOM 2584 OD1 ASN C 29 -20.156 42.488 18.307 1.00 45.81 O +ATOM 2585 ND2 ASN C 29 -20.751 41.753 20.340 1.00 43.63 N +ATOM 2586 N LYS C 30 -21.987 37.433 18.811 1.00 40.08 N +ATOM 2587 CA LYS C 30 -22.607 36.228 18.292 1.00 40.27 C +ATOM 2588 C LYS C 30 -22.840 36.398 16.798 1.00 37.97 C +ATOM 2589 O LYS C 30 -23.217 37.480 16.341 1.00 39.16 O +ATOM 2590 CB LYS C 30 -23.938 35.974 19.000 1.00 41.79 C +ATOM 2591 CG LYS C 30 -23.814 35.782 20.499 1.00 47.42 C +ATOM 2592 CD LYS C 30 -25.190 35.589 21.137 1.00 52.41 C +ATOM 2593 CE LYS C 30 -25.083 35.341 22.635 1.00 55.09 C +ATOM 2594 NZ LYS C 30 -26.400 34.933 23.208 1.00 58.64 N +ATOM 2595 N GLY C 31 -22.601 35.338 16.035 1.00 35.78 N +ATOM 2596 CA GLY C 31 -22.802 35.416 14.599 1.00 33.98 C +ATOM 2597 C GLY C 31 -21.591 35.881 13.802 1.00 31.71 C +ATOM 2598 O GLY C 31 -21.597 35.800 12.583 1.00 36.69 O +ATOM 2599 N ASP C 32 -20.558 36.374 14.473 1.00 30.14 N +ATOM 2600 CA ASP C 32 -19.342 36.827 13.786 1.00 30.10 C +ATOM 2601 C ASP C 32 -18.505 35.650 13.290 1.00 30.54 C +ATOM 2602 O ASP C 32 -18.584 34.541 13.826 1.00 30.56 O +ATOM 2603 CB ASP C 32 -18.451 37.643 14.730 1.00 30.05 C +ATOM 2604 CG ASP C 32 -18.855 39.103 14.824 1.00 33.06 C +ATOM 2605 OD1 ASP C 32 -18.273 39.803 15.685 1.00 30.55 O +ATOM 2606 OD2 ASP C 32 -19.734 39.552 14.041 1.00 35.16 O +ATOM 2607 N ILE C 33 -17.716 35.893 12.251 1.00 30.57 N +ATOM 2608 CA ILE C 33 -16.814 34.881 11.729 1.00 29.03 C +ATOM 2609 C ILE C 33 -15.486 35.609 11.670 1.00 28.50 C +ATOM 2610 O ILE C 33 -15.313 36.545 10.884 1.00 28.57 O +ATOM 2611 CB ILE C 33 -17.190 34.381 10.310 1.00 30.96 C +ATOM 2612 CG1 ILE C 33 -18.508 33.601 10.347 1.00 31.28 C +ATOM 2613 CG2 ILE C 33 -16.085 33.463 9.775 1.00 26.91 C +ATOM 2614 CD1 ILE C 33 -18.981 33.122 8.989 0.00 31.11 C +ATOM 2615 N LEU C 34 -14.567 35.203 12.538 1.00 27.87 N +ATOM 2616 CA LEU C 34 -13.246 35.812 12.596 1.00 27.29 C +ATOM 2617 C LEU C 34 -12.196 34.895 11.980 1.00 27.16 C +ATOM 2618 O LEU C 34 -12.117 33.715 12.312 1.00 27.37 O +ATOM 2619 CB LEU C 34 -12.855 36.107 14.046 1.00 24.12 C +ATOM 2620 CG LEU C 34 -11.364 36.423 14.238 1.00 26.26 C +ATOM 2621 CD1 LEU C 34 -11.052 37.788 13.629 1.00 21.10 C +ATOM 2622 CD2 LEU C 34 -10.999 36.409 15.721 1.00 21.72 C +ATOM 2623 N ALA C 35 -11.395 35.443 11.080 1.00 26.34 N +ATOM 2624 CA ALA C 35 -10.337 34.676 10.462 1.00 26.24 C +ATOM 2625 C ALA C 35 -9.026 35.148 11.059 1.00 27.16 C +ATOM 2626 O ALA C 35 -8.776 36.353 11.148 1.00 29.03 O +ATOM 2627 CB ALA C 35 -10.327 34.886 8.953 1.00 27.68 C +ATOM 2628 N VAL C 36 -8.213 34.204 11.518 1.00 25.83 N +ATOM 2629 CA VAL C 36 -6.904 34.544 12.058 1.00 26.83 C +ATOM 2630 C VAL C 36 -5.957 34.181 10.926 1.00 27.13 C +ATOM 2631 O VAL C 36 -5.649 33.018 10.732 1.00 28.22 O +ATOM 2632 CB VAL C 36 -6.571 33.720 13.321 1.00 28.74 C +ATOM 2633 CG1 VAL C 36 -5.180 34.093 13.850 1.00 21.74 C +ATOM 2634 CG2 VAL C 36 -7.632 33.983 14.389 1.00 25.47 C +ATOM 2635 N LEU C 37 -5.540 35.187 10.160 1.00 29.48 N +ATOM 2636 CA LEU C 37 -4.655 35.003 9.016 1.00 31.13 C +ATOM 2637 C LEU C 37 -3.179 35.178 9.356 1.00 33.49 C +ATOM 2638 O LEU C 37 -2.750 36.243 9.808 1.00 33.28 O +ATOM 2639 CB LEU C 37 -5.043 35.990 7.907 1.00 30.32 C +ATOM 2640 CG LEU C 37 -4.366 35.908 6.534 1.00 32.23 C +ATOM 2641 CD1 LEU C 37 -4.639 34.551 5.866 1.00 27.67 C +ATOM 2642 CD2 LEU C 37 -4.917 37.041 5.666 1.00 34.28 C +ATOM 2643 N GLY C 38 -2.410 34.119 9.128 1.00 35.43 N +ATOM 2644 CA GLY C 38 -0.983 34.144 9.388 1.00 38.40 C +ATOM 2645 C GLY C 38 -0.339 32.991 8.647 1.00 41.60 C +ATOM 2646 O GLY C 38 -1.041 32.179 8.049 1.00 45.08 O +ATOM 2647 N GLN C 39 0.985 32.906 8.668 1.00 45.53 N +ATOM 2648 CA GLN C 39 1.676 31.815 7.985 1.00 50.09 C +ATOM 2649 C GLN C 39 2.293 30.845 8.989 1.00 55.60 C +ATOM 2650 O GLN C 39 2.560 31.207 10.138 1.00 56.17 O +ATOM 2651 CB GLN C 39 2.774 32.358 7.076 1.00 46.79 C +ATOM 2652 CG GLN C 39 2.294 33.411 6.108 1.00 47.28 C +ATOM 2653 CD GLN C 39 3.224 33.586 4.927 1.00 46.06 C +ATOM 2654 OE1 GLN C 39 3.131 32.861 3.928 1.00 42.11 O +ATOM 2655 NE2 GLN C 39 4.137 34.543 5.035 1.00 42.05 N +ATOM 2656 N ASN C 40 2.510 29.614 8.533 1.00 60.46 N +ATOM 2657 CA ASN C 40 3.099 28.536 9.330 1.00 64.98 C +ATOM 2658 C ASN C 40 3.787 29.005 10.614 1.00 66.44 C +ATOM 2659 O ASN C 40 4.693 29.842 10.575 1.00 67.11 O +ATOM 2660 CB ASN C 40 4.109 27.769 8.472 1.00 67.36 C +ATOM 2661 CG ASN C 40 3.538 27.359 7.124 1.00 70.08 C +ATOM 2662 OD1 ASN C 40 2.743 26.422 7.030 1.00 71.18 O +ATOM 2663 ND2 ASN C 40 3.933 28.073 6.073 1.00 69.57 N +ATOM 2664 N GLY C 41 3.354 28.455 11.746 1.00 67.30 N +ATOM 2665 CA GLY C 41 3.948 28.815 13.023 1.00 68.16 C +ATOM 2666 C GLY C 41 4.117 30.309 13.217 1.00 68.48 C +ATOM 2667 O GLY C 41 5.237 30.825 13.193 1.00 69.74 O +ATOM 2668 N CYS C 42 3.000 31.001 13.423 1.00 67.09 N +ATOM 2669 CA CYS C 42 2.996 32.449 13.617 1.00 64.97 C +ATOM 2670 C CYS C 42 2.449 32.810 14.995 1.00 64.12 C +ATOM 2671 O CYS C 42 2.452 33.977 15.390 1.00 63.65 O +ATOM 2672 CB CYS C 42 2.115 33.095 12.554 1.00 64.97 C +ATOM 2673 SG CYS C 42 0.470 32.354 12.509 1.00 62.72 S +ATOM 2674 N GLY C 43 1.967 31.801 15.713 1.00 62.98 N +ATOM 2675 CA GLY C 43 1.408 32.035 17.028 1.00 60.97 C +ATOM 2676 C GLY C 43 -0.053 31.630 17.107 1.00 59.83 C +ATOM 2677 O GLY C 43 -0.676 31.769 18.158 1.00 60.91 O +ATOM 2678 N LYS C 44 -0.608 31.141 16.000 1.00 58.50 N +ATOM 2679 CA LYS C 44 -2.005 30.702 15.978 1.00 58.93 C +ATOM 2680 C LYS C 44 -2.191 29.636 17.053 1.00 58.76 C +ATOM 2681 O LYS C 44 -3.191 29.618 17.774 1.00 59.44 O +ATOM 2682 CB LYS C 44 -2.357 30.097 14.619 1.00 58.22 C +ATOM 2683 CG LYS C 44 -2.355 31.073 13.458 1.00 57.09 C +ATOM 2684 CD LYS C 44 -2.481 30.306 12.162 1.00 57.01 C +ATOM 2685 CE LYS C 44 -2.369 31.192 10.941 1.00 55.09 C +ATOM 2686 NZ LYS C 44 -2.108 30.343 9.736 1.00 51.39 N +ATOM 2687 N SER C 45 -1.208 28.750 17.139 1.00 57.99 N +ATOM 2688 CA SER C 45 -1.202 27.665 18.105 1.00 57.43 C +ATOM 2689 C SER C 45 -1.349 28.204 19.519 1.00 56.50 C +ATOM 2690 O SER C 45 -2.192 27.742 20.291 1.00 55.04 O +ATOM 2691 CB SER C 45 0.114 26.887 17.990 1.00 59.44 C +ATOM 2692 OG SER C 45 0.245 25.935 19.031 1.00 61.80 O +ATOM 2693 N THR C 46 -0.517 29.181 19.859 1.00 54.55 N +ATOM 2694 CA THR C 46 -0.561 29.761 21.187 1.00 52.76 C +ATOM 2695 C THR C 46 -1.880 30.497 21.386 1.00 50.44 C +ATOM 2696 O THR C 46 -2.532 30.347 22.421 1.00 51.12 O +ATOM 2697 CB THR C 46 0.612 30.738 21.402 1.00 54.00 C +ATOM 2698 OG1 THR C 46 1.838 30.089 21.051 1.00 55.39 O +ATOM 2699 CG2 THR C 46 0.689 31.169 22.864 1.00 53.40 C +ATOM 2700 N LEU C 47 -2.276 31.276 20.386 1.00 47.83 N +ATOM 2701 CA LEU C 47 -3.514 32.044 20.460 1.00 47.21 C +ATOM 2702 C LEU C 47 -4.691 31.146 20.834 1.00 46.46 C +ATOM 2703 O LEU C 47 -5.431 31.446 21.775 1.00 45.20 O +ATOM 2704 CB LEU C 47 -3.795 32.733 19.122 1.00 46.94 C +ATOM 2705 CG LEU C 47 -4.516 34.086 19.160 1.00 49.23 C +ATOM 2706 CD1 LEU C 47 -4.890 34.497 17.738 1.00 45.84 C +ATOM 2707 CD2 LEU C 47 -5.758 34.008 20.029 1.00 50.16 C +ATOM 2708 N LEU C 48 -4.860 30.048 20.098 1.00 45.70 N +ATOM 2709 CA LEU C 48 -5.950 29.112 20.366 1.00 46.75 C +ATOM 2710 C LEU C 48 -5.806 28.507 21.755 1.00 46.39 C +ATOM 2711 O LEU C 48 -6.790 28.367 22.481 1.00 46.01 O +ATOM 2712 CB LEU C 48 -5.980 28.001 19.310 1.00 46.53 C +ATOM 2713 CG LEU C 48 -6.261 28.473 17.880 1.00 46.31 C +ATOM 2714 CD1 LEU C 48 -6.012 27.330 16.906 1.00 50.68 C +ATOM 2715 CD2 LEU C 48 -7.687 28.975 17.767 1.00 45.07 C +ATOM 2716 N ASP C 49 -4.581 28.150 22.125 1.00 48.72 N +ATOM 2717 CA ASP C 49 -4.326 27.585 23.452 1.00 51.59 C +ATOM 2718 C ASP C 49 -4.867 28.540 24.507 1.00 50.77 C +ATOM 2719 O ASP C 49 -5.570 28.128 25.434 1.00 49.33 O +ATOM 2720 CB ASP C 49 -2.823 27.395 23.696 1.00 55.63 C +ATOM 2721 CG ASP C 49 -2.263 26.151 23.020 1.00 60.28 C +ATOM 2722 OD1 ASP C 49 -1.032 25.938 23.116 1.00 62.15 O +ATOM 2723 OD2 ASP C 49 -3.043 25.389 22.402 1.00 62.84 O +ATOM 2724 N LEU C 50 -4.534 29.820 24.355 1.00 49.02 N +ATOM 2725 CA LEU C 50 -4.979 30.837 25.298 1.00 48.36 C +ATOM 2726 C LEU C 50 -6.495 30.957 25.323 1.00 47.22 C +ATOM 2727 O LEU C 50 -7.095 31.011 26.394 1.00 47.76 O +ATOM 2728 CB LEU C 50 -4.352 32.192 24.960 1.00 48.06 C +ATOM 2729 CG LEU C 50 -2.839 32.296 25.169 1.00 48.95 C +ATOM 2730 CD1 LEU C 50 -2.338 33.624 24.638 1.00 48.59 C +ATOM 2731 CD2 LEU C 50 -2.514 32.152 26.652 1.00 49.16 C +ATOM 2732 N LEU C 51 -7.121 30.981 24.152 1.00 46.20 N +ATOM 2733 CA LEU C 51 -8.574 31.100 24.107 1.00 47.05 C +ATOM 2734 C LEU C 51 -9.264 29.941 24.821 1.00 47.07 C +ATOM 2735 O LEU C 51 -10.321 30.124 25.417 1.00 46.95 O +ATOM 2736 CB LEU C 51 -9.064 31.207 22.658 1.00 45.78 C +ATOM 2737 CG LEU C 51 -8.602 32.460 21.901 1.00 48.24 C +ATOM 2738 CD1 LEU C 51 -9.172 32.451 20.488 1.00 47.68 C +ATOM 2739 CD2 LEU C 51 -9.054 33.714 22.647 1.00 47.98 C +ATOM 2740 N LEU C 52 -8.663 28.755 24.762 1.00 49.11 N +ATOM 2741 CA LEU C 52 -9.217 27.573 25.419 1.00 51.76 C +ATOM 2742 C LEU C 52 -8.729 27.488 26.863 1.00 54.08 C +ATOM 2743 O LEU C 52 -9.140 26.608 27.625 1.00 55.24 O +ATOM 2744 CB LEU C 52 -8.809 26.310 24.663 1.00 51.74 C +ATOM 2745 CG LEU C 52 -9.471 26.106 23.299 1.00 52.32 C +ATOM 2746 CD1 LEU C 52 -8.795 24.968 22.559 1.00 50.25 C +ATOM 2747 CD2 LEU C 52 -10.960 25.826 23.498 1.00 52.21 C +ATOM 2748 N GLY C 53 -7.846 28.409 27.228 1.00 54.96 N +ATOM 2749 CA GLY C 53 -7.318 28.443 28.576 1.00 56.48 C +ATOM 2750 C GLY C 53 -6.460 27.266 29.006 1.00 57.68 C +ATOM 2751 O GLY C 53 -6.575 26.817 30.144 1.00 57.89 O +ATOM 2752 N ILE C 54 -5.605 26.748 28.127 1.00 58.20 N +ATOM 2753 CA ILE C 54 -4.763 25.634 28.539 1.00 59.50 C +ATOM 2754 C ILE C 54 -3.775 26.224 29.540 1.00 60.62 C +ATOM 2755 O ILE C 54 -3.392 25.575 30.515 1.00 62.28 O +ATOM 2756 CB ILE C 54 -3.999 24.980 27.357 1.00 59.28 C +ATOM 2757 CG1 ILE C 54 -2.878 25.897 26.872 1.00 59.65 C +ATOM 2758 CG2 ILE C 54 -4.975 24.645 26.236 1.00 56.41 C +ATOM 2759 CD1 ILE C 54 -1.868 25.200 25.989 0.00 59.55 C +ATOM 2760 N HIS C 55 -3.368 27.464 29.292 1.00 60.58 N +ATOM 2761 CA HIS C 55 -2.470 28.160 30.200 1.00 60.01 C +ATOM 2762 C HIS C 55 -2.782 29.650 30.201 1.00 58.51 C +ATOM 2763 O HIS C 55 -3.438 30.162 29.294 1.00 56.36 O +ATOM 2764 CB HIS C 55 -0.993 27.924 29.843 1.00 61.87 C +ATOM 2765 CG HIS C 55 -0.534 28.625 28.600 1.00 63.84 C +ATOM 2766 ND1 HIS C 55 -0.523 28.018 27.362 1.00 63.92 N +ATOM 2767 CD2 HIS C 55 -0.031 29.868 28.414 1.00 63.99 C +ATOM 2768 CE1 HIS C 55 -0.030 28.856 26.467 1.00 63.27 C +ATOM 2769 NE2 HIS C 55 0.276 29.986 27.080 1.00 64.77 N +ATOM 2770 N ARG C 56 -2.320 30.333 31.240 1.00 57.39 N +ATOM 2771 CA ARG C 56 -2.541 31.761 31.395 1.00 54.99 C +ATOM 2772 C ARG C 56 -1.530 32.550 30.573 1.00 52.18 C +ATOM 2773 O ARG C 56 -0.433 32.075 30.302 1.00 51.54 O +ATOM 2774 CB ARG C 56 -2.428 32.132 32.879 1.00 57.50 C +ATOM 2775 CG ARG C 56 -3.523 31.516 33.746 1.00 60.36 C +ATOM 2776 CD ARG C 56 -3.137 31.422 35.223 1.00 64.84 C +ATOM 2777 NE ARG C 56 -2.676 32.691 35.780 1.00 68.34 N +ATOM 2778 CZ ARG C 56 -1.395 33.018 35.942 1.00 71.38 C +ATOM 2779 NH1 ARG C 56 -1.072 34.200 36.455 1.00 71.66 N +ATOM 2780 NH2 ARG C 56 -0.436 32.161 35.605 1.00 71.99 N +ATOM 2781 N PRO C 57 -1.902 33.763 30.145 1.00 49.69 N +ATOM 2782 CA PRO C 57 -1.016 34.618 29.351 1.00 48.33 C +ATOM 2783 C PRO C 57 -0.115 35.461 30.254 1.00 47.90 C +ATOM 2784 O PRO C 57 -0.309 35.495 31.463 1.00 47.91 O +ATOM 2785 CB PRO C 57 -1.997 35.478 28.568 1.00 47.61 C +ATOM 2786 CG PRO C 57 -3.086 35.697 29.570 1.00 46.81 C +ATOM 2787 CD PRO C 57 -3.270 34.315 30.181 1.00 48.74 C +ATOM 2788 N ILE C 58 0.871 36.131 29.670 1.00 48.40 N +ATOM 2789 CA ILE C 58 1.757 36.986 30.449 1.00 51.88 C +ATOM 2790 C ILE C 58 0.951 38.182 30.977 1.00 53.02 C +ATOM 2791 O ILE C 58 0.969 38.472 32.174 1.00 52.96 O +ATOM 2792 CB ILE C 58 2.939 37.502 29.594 1.00 53.52 C +ATOM 2793 CG1 ILE C 58 3.838 36.330 29.196 1.00 54.13 C +ATOM 2794 CG2 ILE C 58 3.734 38.547 30.372 1.00 54.86 C +ATOM 2795 CD1 ILE C 58 5.071 36.731 28.425 0.00 54.02 C +ATOM 2796 N GLN C 59 0.242 38.862 30.077 1.00 52.85 N +ATOM 2797 CA GLN C 59 -0.584 40.012 30.443 1.00 53.48 C +ATOM 2798 C GLN C 59 -1.963 39.892 29.795 1.00 52.46 C +ATOM 2799 O GLN C 59 -2.179 39.059 28.913 1.00 49.97 O +ATOM 2800 CB GLN C 59 0.047 41.318 29.950 1.00 55.88 C +ATOM 2801 CG GLN C 59 1.568 41.350 29.933 1.00 59.93 C +ATOM 2802 CD GLN C 59 2.105 42.552 29.166 1.00 62.48 C +ATOM 2803 OE1 GLN C 59 1.984 43.698 29.612 1.00 65.92 O +ATOM 2804 NE2 GLN C 59 2.689 42.297 27.999 1.00 61.89 N +ATOM 2805 N GLY C 60 -2.891 40.736 30.235 1.00 51.31 N +ATOM 2806 CA GLY C 60 -4.221 40.741 29.660 1.00 50.39 C +ATOM 2807 C GLY C 60 -5.223 39.745 30.199 1.00 50.00 C +ATOM 2808 O GLY C 60 -4.931 38.946 31.080 1.00 49.68 O +ATOM 2809 N LYS C 61 -6.424 39.795 29.639 1.00 50.45 N +ATOM 2810 CA LYS C 61 -7.508 38.921 30.055 1.00 50.10 C +ATOM 2811 C LYS C 61 -8.302 38.411 28.849 1.00 48.35 C +ATOM 2812 O LYS C 61 -8.396 39.078 27.814 1.00 46.31 O +ATOM 2813 CB LYS C 61 -8.439 39.694 31.000 1.00 52.53 C +ATOM 2814 CG LYS C 61 -9.676 38.940 31.447 1.00 57.70 C +ATOM 2815 CD LYS C 61 -10.609 39.825 32.276 1.00 61.85 C +ATOM 2816 CE LYS C 61 -11.157 40.997 31.462 1.00 65.05 C +ATOM 2817 NZ LYS C 61 -12.126 41.826 32.242 1.00 66.53 N +ATOM 2818 N ILE C 62 -8.864 37.219 28.996 1.00 46.25 N +ATOM 2819 CA ILE C 62 -9.678 36.617 27.957 1.00 46.19 C +ATOM 2820 C ILE C 62 -10.992 36.211 28.599 1.00 46.31 C +ATOM 2821 O ILE C 62 -10.997 35.456 29.565 1.00 47.53 O +ATOM 2822 CB ILE C 62 -9.031 35.332 27.361 1.00 44.08 C +ATOM 2823 CG1 ILE C 62 -7.744 35.675 26.609 1.00 42.71 C +ATOM 2824 CG2 ILE C 62 -10.024 34.646 26.427 1.00 42.24 C +ATOM 2825 CD1 ILE C 62 -7.021 34.470 26.043 0.00 43.32 C +ATOM 2826 N GLU C 63 -12.104 36.706 28.069 1.00 47.45 N +ATOM 2827 CA GLU C 63 -13.409 36.346 28.608 1.00 48.44 C +ATOM 2828 C GLU C 63 -14.276 35.749 27.500 1.00 47.37 C +ATOM 2829 O GLU C 63 -14.484 36.382 26.463 1.00 46.03 O +ATOM 2830 CB GLU C 63 -14.100 37.578 29.202 1.00 52.66 C +ATOM 2831 CG GLU C 63 -15.406 37.257 29.925 1.00 60.11 C +ATOM 2832 CD GLU C 63 -15.188 36.679 31.321 1.00 64.95 C +ATOM 2833 OE1 GLU C 63 -14.189 35.951 31.521 1.00 67.41 O +ATOM 2834 OE2 GLU C 63 -16.027 36.943 32.214 1.00 67.29 O +ATOM 2835 N VAL C 64 -14.765 34.529 27.704 1.00 46.38 N +ATOM 2836 CA VAL C 64 -15.613 33.892 26.702 1.00 46.97 C +ATOM 2837 C VAL C 64 -17.018 33.772 27.285 1.00 47.40 C +ATOM 2838 O VAL C 64 -17.214 33.231 28.370 1.00 48.26 O +ATOM 2839 CB VAL C 64 -15.041 32.502 26.260 1.00 46.30 C +ATOM 2840 CG1 VAL C 64 -13.595 32.376 26.704 1.00 44.82 C +ATOM 2841 CG2 VAL C 64 -15.885 31.365 26.790 1.00 46.86 C +ATOM 2842 N TYR C 65 -17.992 34.293 26.548 1.00 47.82 N +ATOM 2843 CA TYR C 65 -19.381 34.328 26.987 1.00 47.11 C +ATOM 2844 C TYR C 65 -20.284 33.226 26.462 1.00 46.70 C +ATOM 2845 O TYR C 65 -21.461 33.173 26.808 1.00 45.78 O +ATOM 2846 CB TYR C 65 -19.972 35.680 26.599 1.00 48.29 C +ATOM 2847 CG TYR C 65 -19.148 36.848 27.084 1.00 51.75 C +ATOM 2848 CD1 TYR C 65 -19.232 37.285 28.409 1.00 52.41 C +ATOM 2849 CD2 TYR C 65 -18.275 37.515 26.224 1.00 50.77 C +ATOM 2850 CE1 TYR C 65 -18.468 38.359 28.861 1.00 54.16 C +ATOM 2851 CE2 TYR C 65 -17.507 38.589 26.669 1.00 52.47 C +ATOM 2852 CZ TYR C 65 -17.610 39.007 27.987 1.00 53.72 C +ATOM 2853 OH TYR C 65 -16.867 40.078 28.432 1.00 56.28 O +ATOM 2854 N GLN C 66 -19.744 32.357 25.618 1.00 47.32 N +ATOM 2855 CA GLN C 66 -20.530 31.264 25.050 1.00 47.30 C +ATOM 2856 C GLN C 66 -19.807 29.943 25.290 1.00 45.54 C +ATOM 2857 O GLN C 66 -18.593 29.928 25.492 1.00 45.22 O +ATOM 2858 CB GLN C 66 -20.703 31.459 23.536 1.00 49.54 C +ATOM 2859 CG GLN C 66 -21.502 32.687 23.101 1.00 53.85 C +ATOM 2860 CD GLN C 66 -21.742 32.713 21.584 1.00 57.32 C +ATOM 2861 OE1 GLN C 66 -20.822 32.953 20.795 1.00 57.26 O +ATOM 2862 NE2 GLN C 66 -22.980 32.449 21.177 1.00 58.66 N +ATOM 2863 N SER C 67 -20.544 28.837 25.279 1.00 43.65 N +ATOM 2864 CA SER C 67 -19.910 27.539 25.459 1.00 43.64 C +ATOM 2865 C SER C 67 -18.970 27.397 24.256 1.00 42.61 C +ATOM 2866 O SER C 67 -19.348 27.686 23.119 1.00 41.01 O +ATOM 2867 CB SER C 67 -20.955 26.427 25.470 1.00 42.44 C +ATOM 2868 OG SER C 67 -21.751 26.476 24.303 1.00 49.20 O +ATOM 2869 N ILE C 68 -17.746 26.958 24.514 1.00 41.29 N +ATOM 2870 CA ILE C 68 -16.745 26.843 23.470 1.00 40.99 C +ATOM 2871 C ILE C 68 -16.451 25.420 23.000 1.00 40.48 C +ATOM 2872 O ILE C 68 -16.343 24.492 23.801 1.00 42.24 O +ATOM 2873 CB ILE C 68 -15.433 27.499 23.945 1.00 41.66 C +ATOM 2874 CG1 ILE C 68 -14.435 27.589 22.791 1.00 42.70 C +ATOM 2875 CG2 ILE C 68 -14.849 26.692 25.100 1.00 43.21 C +ATOM 2876 CD1 ILE C 68 -13.170 28.349 23.131 0.00 42.27 C +ATOM 2877 N GLY C 69 -16.334 25.271 21.684 1.00 39.13 N +ATOM 2878 CA GLY C 69 -16.025 23.995 21.066 1.00 33.88 C +ATOM 2879 C GLY C 69 -14.732 24.182 20.283 1.00 33.35 C +ATOM 2880 O GLY C 69 -14.375 25.308 19.936 1.00 31.68 O +ATOM 2881 N PHE C 70 -14.022 23.095 20.002 1.00 30.39 N +ATOM 2882 CA PHE C 70 -12.767 23.187 19.279 1.00 28.52 C +ATOM 2883 C PHE C 70 -12.679 22.108 18.221 1.00 28.72 C +ATOM 2884 O PHE C 70 -13.228 21.021 18.388 1.00 28.96 O +ATOM 2885 CB PHE C 70 -11.589 23.063 20.258 1.00 30.27 C +ATOM 2886 CG PHE C 70 -10.233 22.991 19.593 1.00 30.38 C +ATOM 2887 CD1 PHE C 70 -9.542 21.784 19.519 1.00 30.10 C +ATOM 2888 CD2 PHE C 70 -9.656 24.124 19.031 1.00 28.84 C +ATOM 2889 CE1 PHE C 70 -8.291 21.705 18.888 1.00 30.07 C +ATOM 2890 CE2 PHE C 70 -8.409 24.062 18.398 1.00 31.23 C +ATOM 2891 CZ PHE C 70 -7.724 22.846 18.325 1.00 28.77 C +ATOM 2892 N VAL C 71 -12.013 22.429 17.114 1.00 27.16 N +ATOM 2893 CA VAL C 71 -11.822 21.477 16.033 1.00 25.28 C +ATOM 2894 C VAL C 71 -10.361 21.508 15.604 1.00 27.36 C +ATOM 2895 O VAL C 71 -9.885 22.498 15.053 1.00 27.93 O +ATOM 2896 CB VAL C 71 -12.688 21.806 14.797 1.00 25.67 C +ATOM 2897 CG1 VAL C 71 -12.659 20.620 13.827 1.00 20.69 C +ATOM 2898 CG2 VAL C 71 -14.128 22.127 15.218 1.00 21.53 C +ATOM 2899 N PRO C 72 -9.618 20.430 15.876 1.00 26.43 N +ATOM 2900 CA PRO C 72 -8.210 20.414 15.475 1.00 25.89 C +ATOM 2901 C PRO C 72 -8.163 20.075 13.994 1.00 26.07 C +ATOM 2902 O PRO C 72 -9.168 19.674 13.408 1.00 25.45 O +ATOM 2903 CB PRO C 72 -7.619 19.299 16.337 1.00 26.88 C +ATOM 2904 CG PRO C 72 -8.749 18.300 16.355 1.00 26.97 C +ATOM 2905 CD PRO C 72 -9.980 19.196 16.595 1.00 27.28 C +ATOM 2906 N GLN C 73 -6.997 20.228 13.393 1.00 28.01 N +ATOM 2907 CA GLN C 73 -6.854 19.934 11.984 1.00 32.59 C +ATOM 2908 C GLN C 73 -6.899 18.428 11.730 1.00 35.15 C +ATOM 2909 O GLN C 73 -7.385 17.980 10.688 1.00 36.40 O +ATOM 2910 CB GLN C 73 -5.535 20.509 11.465 1.00 31.62 C +ATOM 2911 CG GLN C 73 -5.464 20.547 9.964 1.00 35.79 C +ATOM 2912 CD GLN C 73 -4.128 21.039 9.446 1.00 36.64 C +ATOM 2913 OE1 GLN C 73 -3.914 21.105 8.236 1.00 38.55 O +ATOM 2914 NE2 GLN C 73 -3.225 21.385 10.355 1.00 33.41 N +ATOM 2915 N PHE C 74 -6.414 17.648 12.694 1.00 36.48 N +ATOM 2916 CA PHE C 74 -6.375 16.196 12.547 1.00 36.38 C +ATOM 2917 C PHE C 74 -6.698 15.445 13.826 1.00 36.78 C +ATOM 2918 O PHE C 74 -6.592 15.982 14.922 1.00 36.58 O +ATOM 2919 CB PHE C 74 -4.975 15.756 12.106 1.00 33.87 C +ATOM 2920 CG PHE C 74 -4.479 16.444 10.877 1.00 34.86 C +ATOM 2921 CD1 PHE C 74 -5.118 16.253 9.649 1.00 34.19 C +ATOM 2922 CD2 PHE C 74 -3.356 17.269 10.935 1.00 32.57 C +ATOM 2923 CE1 PHE C 74 -4.642 16.874 8.493 1.00 33.25 C +ATOM 2924 CE2 PHE C 74 -2.869 17.895 9.789 1.00 32.59 C +ATOM 2925 CZ PHE C 74 -3.511 17.698 8.562 1.00 34.15 C +ATOM 2926 N PHE C 75 -7.097 14.191 13.669 1.00 38.96 N +ATOM 2927 CA PHE C 75 -7.351 13.325 14.809 1.00 41.06 C +ATOM 2928 C PHE C 75 -6.553 12.074 14.492 1.00 42.82 C +ATOM 2929 O PHE C 75 -6.831 11.383 13.513 1.00 41.74 O +ATOM 2930 CB PHE C 75 -8.824 12.948 14.955 1.00 41.37 C +ATOM 2931 CG PHE C 75 -9.069 11.911 16.020 1.00 40.38 C +ATOM 2932 CD1 PHE C 75 -8.993 12.249 17.370 1.00 41.24 C +ATOM 2933 CD2 PHE C 75 -9.313 10.584 15.675 1.00 40.52 C +ATOM 2934 CE1 PHE C 75 -9.154 11.281 18.367 1.00 41.93 C +ATOM 2935 CE2 PHE C 75 -9.477 9.602 16.660 1.00 41.64 C +ATOM 2936 CZ PHE C 75 -9.398 9.950 18.011 1.00 40.50 C +ATOM 2937 N SER C 76 -5.552 11.790 15.311 1.00 45.45 N +ATOM 2938 CA SER C 76 -4.713 10.620 15.090 1.00 48.29 C +ATOM 2939 C SER C 76 -4.864 9.627 16.226 1.00 47.07 C +ATOM 2940 O SER C 76 -4.733 9.985 17.394 1.00 47.74 O +ATOM 2941 CB SER C 76 -3.245 11.043 14.969 1.00 50.67 C +ATOM 2942 OG SER C 76 -2.412 9.931 14.707 1.00 56.45 O +ATOM 2943 N SER C 77 -5.149 8.379 15.878 1.00 46.48 N +ATOM 2944 CA SER C 77 -5.301 7.335 16.878 1.00 45.79 C +ATOM 2945 C SER C 77 -5.032 5.969 16.271 1.00 45.98 C +ATOM 2946 O SER C 77 -5.516 5.661 15.184 1.00 44.42 O +ATOM 2947 CB SER C 77 -6.707 7.358 17.467 1.00 45.80 C +ATOM 2948 OG SER C 77 -6.878 6.301 18.391 1.00 48.42 O +ATOM 2949 N PRO C 78 -4.233 5.139 16.959 1.00 46.53 N +ATOM 2950 CA PRO C 78 -3.925 3.799 16.452 1.00 46.91 C +ATOM 2951 C PRO C 78 -5.133 2.866 16.553 1.00 46.89 C +ATOM 2952 O PRO C 78 -5.118 1.760 16.013 1.00 49.47 O +ATOM 2953 CB PRO C 78 -2.765 3.352 17.341 1.00 46.04 C +ATOM 2954 CG PRO C 78 -3.040 4.071 18.639 1.00 46.76 C +ATOM 2955 CD PRO C 78 -3.432 5.446 18.158 1.00 46.02 C +ATOM 2956 N PHE C 79 -6.185 3.328 17.223 1.00 44.87 N +ATOM 2957 CA PHE C 79 -7.393 2.526 17.405 1.00 44.22 C +ATOM 2958 C PHE C 79 -8.463 2.795 16.350 1.00 44.50 C +ATOM 2959 O PHE C 79 -8.729 3.943 15.993 1.00 45.70 O +ATOM 2960 CB PHE C 79 -7.959 2.779 18.800 1.00 42.68 C +ATOM 2961 CG PHE C 79 -6.956 2.576 19.892 1.00 39.24 C +ATOM 2962 CD1 PHE C 79 -6.837 3.500 20.924 1.00 39.55 C +ATOM 2963 CD2 PHE C 79 -6.120 1.465 19.883 1.00 37.58 C +ATOM 2964 CE1 PHE C 79 -5.889 3.318 21.934 1.00 38.83 C +ATOM 2965 CE2 PHE C 79 -5.176 1.275 20.881 1.00 38.42 C +ATOM 2966 CZ PHE C 79 -5.059 2.203 21.909 1.00 39.20 C +ATOM 2967 N ALA C 80 -9.083 1.722 15.873 1.00 43.46 N +ATOM 2968 CA ALA C 80 -10.107 1.804 14.840 1.00 42.11 C +ATOM 2969 C ALA C 80 -11.437 2.404 15.272 1.00 40.83 C +ATOM 2970 O ALA C 80 -12.488 1.802 15.051 1.00 42.12 O +ATOM 2971 CB ALA C 80 -10.342 0.415 14.242 1.00 43.33 C +ATOM 2972 N TYR C 81 -11.406 3.591 15.867 1.00 39.64 N +ATOM 2973 CA TYR C 81 -12.643 4.237 16.284 1.00 39.77 C +ATOM 2974 C TYR C 81 -13.563 4.487 15.095 1.00 40.10 C +ATOM 2975 O TYR C 81 -13.107 4.755 13.987 1.00 39.66 O +ATOM 2976 CB TYR C 81 -12.360 5.570 16.969 1.00 40.17 C +ATOM 2977 CG TYR C 81 -11.810 5.453 18.366 1.00 40.17 C +ATOM 2978 CD1 TYR C 81 -10.523 5.899 18.665 1.00 39.56 C +ATOM 2979 CD2 TYR C 81 -12.588 4.932 19.399 1.00 39.45 C +ATOM 2980 CE1 TYR C 81 -10.023 5.834 19.962 1.00 41.05 C +ATOM 2981 CE2 TYR C 81 -12.099 4.860 20.701 1.00 40.44 C +ATOM 2982 CZ TYR C 81 -10.815 5.313 20.975 1.00 41.51 C +ATOM 2983 OH TYR C 81 -10.319 5.247 22.258 1.00 42.15 O +ATOM 2984 N SER C 82 -14.867 4.397 15.332 1.00 41.07 N +ATOM 2985 CA SER C 82 -15.840 4.634 14.274 1.00 40.57 C +ATOM 2986 C SER C 82 -16.251 6.105 14.292 1.00 39.69 C +ATOM 2987 O SER C 82 -15.988 6.826 15.259 1.00 38.63 O +ATOM 2988 CB SER C 82 -17.082 3.772 14.491 1.00 38.98 C +ATOM 2989 OG SER C 82 -17.797 4.223 15.630 1.00 41.69 O +ATOM 2990 N VAL C 83 -16.905 6.534 13.218 1.00 38.09 N +ATOM 2991 CA VAL C 83 -17.377 7.902 13.099 1.00 38.17 C +ATOM 2992 C VAL C 83 -18.211 8.266 14.311 1.00 38.56 C +ATOM 2993 O VAL C 83 -17.951 9.276 14.963 1.00 41.28 O +ATOM 2994 CB VAL C 83 -18.216 8.082 11.803 1.00 37.97 C +ATOM 2995 CG1 VAL C 83 -18.968 9.403 11.826 1.00 34.38 C +ATOM 2996 CG2 VAL C 83 -17.295 8.026 10.601 1.00 34.62 C +ATOM 2997 N LEU C 84 -19.203 7.438 14.622 1.00 39.92 N +ATOM 2998 CA LEU C 84 -20.068 7.684 15.776 1.00 40.92 C +ATOM 2999 C LEU C 84 -19.269 7.785 17.074 1.00 40.66 C +ATOM 3000 O LEU C 84 -19.567 8.623 17.923 1.00 43.34 O +ATOM 3001 CB LEU C 84 -21.108 6.570 15.918 1.00 42.01 C +ATOM 3002 CG LEU C 84 -22.551 7.021 16.148 1.00 43.38 C +ATOM 3003 CD1 LEU C 84 -23.376 5.827 16.606 1.00 44.59 C +ATOM 3004 CD2 LEU C 84 -22.610 8.134 17.184 1.00 44.09 C +ATOM 3005 N ASP C 85 -18.264 6.925 17.231 1.00 40.27 N +ATOM 3006 CA ASP C 85 -17.421 6.935 18.430 1.00 39.70 C +ATOM 3007 C ASP C 85 -16.745 8.296 18.580 1.00 38.03 C +ATOM 3008 O ASP C 85 -16.657 8.852 19.679 1.00 35.15 O +ATOM 3009 CB ASP C 85 -16.330 5.853 18.338 1.00 43.73 C +ATOM 3010 CG ASP C 85 -16.869 4.441 18.519 1.00 47.11 C +ATOM 3011 OD1 ASP C 85 -16.174 3.482 18.106 1.00 49.07 O +ATOM 3012 OD2 ASP C 85 -17.973 4.285 19.083 1.00 49.99 O +ATOM 3013 N ILE C 86 -16.251 8.826 17.467 1.00 36.13 N +ATOM 3014 CA ILE C 86 -15.584 10.115 17.498 1.00 33.55 C +ATOM 3015 C ILE C 86 -16.556 11.248 17.819 1.00 33.70 C +ATOM 3016 O ILE C 86 -16.299 12.065 18.698 1.00 31.56 O +ATOM 3017 CB ILE C 86 -14.860 10.390 16.157 1.00 34.91 C +ATOM 3018 CG1 ILE C 86 -13.655 9.440 16.037 1.00 30.36 C +ATOM 3019 CG2 ILE C 86 -14.469 11.874 16.057 1.00 28.94 C +ATOM 3020 CD1 ILE C 86 -12.575 9.915 15.108 0.00 32.01 C +ATOM 3021 N VAL C 87 -17.688 11.281 17.129 1.00 35.16 N +ATOM 3022 CA VAL C 87 -18.663 12.340 17.363 1.00 34.94 C +ATOM 3023 C VAL C 87 -19.225 12.279 18.779 1.00 36.42 C +ATOM 3024 O VAL C 87 -19.338 13.301 19.455 1.00 37.81 O +ATOM 3025 CB VAL C 87 -19.818 12.263 16.336 1.00 34.17 C +ATOM 3026 CG1 VAL C 87 -20.866 13.314 16.652 1.00 30.00 C +ATOM 3027 CG2 VAL C 87 -19.267 12.463 14.916 1.00 28.79 C +ATOM 3028 N LEU C 88 -19.557 11.076 19.232 1.00 37.10 N +ATOM 3029 CA LEU C 88 -20.117 10.884 20.565 1.00 36.93 C +ATOM 3030 C LEU C 88 -19.229 11.473 21.659 1.00 37.38 C +ATOM 3031 O LEU C 88 -19.722 11.951 22.684 1.00 41.14 O +ATOM 3032 CB LEU C 88 -20.346 9.395 20.819 1.00 38.13 C +ATOM 3033 CG LEU C 88 -21.259 9.018 21.987 1.00 41.13 C +ATOM 3034 CD1 LEU C 88 -22.679 9.556 21.762 1.00 35.29 C +ATOM 3035 CD2 LEU C 88 -21.275 7.494 22.110 1.00 42.48 C +ATOM 3036 N MET C 89 -17.920 11.453 21.450 1.00 35.62 N +ATOM 3037 CA MET C 89 -17.015 12.019 22.437 1.00 36.90 C +ATOM 3038 C MET C 89 -17.380 13.475 22.704 1.00 37.18 C +ATOM 3039 O MET C 89 -17.044 14.032 23.753 1.00 37.10 O +ATOM 3040 CB MET C 89 -15.563 11.918 21.955 1.00 38.62 C +ATOM 3041 CG MET C 89 -15.057 10.482 21.828 1.00 39.96 C +ATOM 3042 SD MET C 89 -13.252 10.356 21.692 1.00 45.27 S +ATOM 3043 CE MET C 89 -13.083 8.772 20.757 1.00 40.24 C +ATOM 3044 N GLY C 90 -18.067 14.091 21.745 1.00 37.70 N +ATOM 3045 CA GLY C 90 -18.482 15.474 21.904 1.00 38.04 C +ATOM 3046 C GLY C 90 -19.518 15.634 23.004 1.00 40.86 C +ATOM 3047 O GLY C 90 -19.778 16.746 23.463 1.00 39.98 O +ATOM 3048 N ARG C 91 -20.109 14.521 23.436 1.00 42.25 N +ATOM 3049 CA ARG C 91 -21.115 14.544 24.494 1.00 43.86 C +ATOM 3050 C ARG C 91 -20.445 14.512 25.863 1.00 45.40 C +ATOM 3051 O ARG C 91 -21.106 14.451 26.902 1.00 46.01 O +ATOM 3052 CB ARG C 91 -22.060 13.350 24.340 1.00 43.88 C +ATOM 3053 CG ARG C 91 -22.847 13.372 23.037 1.00 44.66 C +ATOM 3054 CD ARG C 91 -23.647 14.665 22.920 1.00 45.58 C +ATOM 3055 NE ARG C 91 -24.693 14.763 23.936 1.00 47.34 N +ATOM 3056 CZ ARG C 91 -25.369 15.876 24.211 1.00 48.43 C +ATOM 3057 NH1 ARG C 91 -26.308 15.875 25.146 1.00 44.94 N +ATOM 3058 NH2 ARG C 91 -25.094 16.998 23.560 1.00 48.47 N +ATOM 3059 N SER C 92 -19.121 14.566 25.845 1.00 46.14 N +ATOM 3060 CA SER C 92 -18.313 14.544 27.048 1.00 47.35 C +ATOM 3061 C SER C 92 -18.914 15.302 28.231 1.00 48.97 C +ATOM 3062 O SER C 92 -19.107 14.727 29.304 1.00 47.93 O +ATOM 3063 CB SER C 92 -16.923 15.099 26.728 1.00 48.34 C +ATOM 3064 OG SER C 92 -16.139 15.224 27.898 1.00 53.39 O +ATOM 3065 N THR C 93 -19.213 16.586 28.040 1.00 50.39 N +ATOM 3066 CA THR C 93 -19.760 17.412 29.122 1.00 51.64 C +ATOM 3067 C THR C 93 -21.212 17.141 29.488 1.00 52.24 C +ATOM 3068 O THR C 93 -21.729 17.727 30.432 1.00 54.00 O +ATOM 3069 CB THR C 93 -19.613 18.918 28.808 1.00 52.36 C +ATOM 3070 OG1 THR C 93 -20.155 19.196 27.507 1.00 52.72 O +ATOM 3071 CG2 THR C 93 -18.142 19.326 28.851 1.00 51.74 C +ATOM 3072 N HIS C 94 -21.870 16.256 28.753 1.00 53.58 N +ATOM 3073 CA HIS C 94 -23.261 15.932 29.046 1.00 55.53 C +ATOM 3074 C HIS C 94 -23.388 14.557 29.695 1.00 55.78 C +ATOM 3075 O HIS C 94 -24.493 14.035 29.886 1.00 56.54 O +ATOM 3076 CB HIS C 94 -24.099 16.002 27.769 1.00 56.98 C +ATOM 3077 CG HIS C 94 -24.279 17.395 27.251 1.00 60.45 C +ATOM 3078 ND1 HIS C 94 -23.244 18.131 26.716 1.00 61.89 N +ATOM 3079 CD2 HIS C 94 -25.366 18.201 27.225 1.00 60.78 C +ATOM 3080 CE1 HIS C 94 -23.685 19.330 26.382 1.00 60.71 C +ATOM 3081 NE2 HIS C 94 -24.970 19.399 26.681 1.00 61.60 N +ATOM 3082 N ILE C 95 -22.241 13.983 30.042 1.00 54.13 N +ATOM 3083 CA ILE C 95 -22.185 12.675 30.674 1.00 52.07 C +ATOM 3084 C ILE C 95 -21.304 12.791 31.911 1.00 52.93 C +ATOM 3085 O ILE C 95 -20.232 13.396 31.866 1.00 51.78 O +ATOM 3086 CB ILE C 95 -21.584 11.629 29.717 1.00 51.91 C +ATOM 3087 CG1 ILE C 95 -22.388 11.595 28.415 1.00 49.95 C +ATOM 3088 CG2 ILE C 95 -21.579 10.259 30.375 1.00 50.10 C +ATOM 3089 CD1 ILE C 95 -21.788 10.707 27.348 0.00 50.80 C +ATOM 3090 N ASN C 96 -21.764 12.231 33.025 1.00 54.82 N +ATOM 3091 CA ASN C 96 -20.986 12.287 34.255 1.00 56.07 C +ATOM 3092 C ASN C 96 -19.784 11.347 34.187 1.00 54.88 C +ATOM 3093 O ASN C 96 -19.819 10.316 33.515 1.00 53.22 O +ATOM 3094 CB ASN C 96 -21.865 11.945 35.459 1.00 59.26 C +ATOM 3095 CG ASN C 96 -22.775 13.094 35.858 1.00 63.10 C +ATOM 3096 OD1 ASN C 96 -23.559 12.983 36.802 1.00 65.14 O +ATOM 3097 ND2 ASN C 96 -22.670 14.209 35.141 1.00 63.69 N +ATOM 3098 N THR C 97 -18.724 11.720 34.891 1.00 54.57 N +ATOM 3099 CA THR C 97 -17.486 10.959 34.916 1.00 55.45 C +ATOM 3100 C THR C 97 -17.631 9.441 34.920 1.00 55.38 C +ATOM 3101 O THR C 97 -17.002 8.757 34.115 1.00 56.25 O +ATOM 3102 CB THR C 97 -16.632 11.361 36.125 1.00 56.97 C +ATOM 3103 OG1 THR C 97 -16.425 12.780 36.105 1.00 58.65 O +ATOM 3104 CG2 THR C 97 -15.281 10.651 36.083 1.00 56.70 C +ATOM 3105 N PHE C 98 -18.454 8.904 35.813 1.00 53.16 N +ATOM 3106 CA PHE C 98 -18.598 7.459 35.877 1.00 51.05 C +ATOM 3107 C PHE C 98 -19.876 6.953 35.248 1.00 51.12 C +ATOM 3108 O PHE C 98 -20.347 5.859 35.567 1.00 52.40 O +ATOM 3109 CB PHE C 98 -18.503 6.992 37.328 1.00 49.23 C +ATOM 3110 CG PHE C 98 -17.250 7.439 38.015 1.00 48.59 C +ATOM 3111 CD1 PHE C 98 -17.232 8.611 38.760 1.00 47.90 C +ATOM 3112 CD2 PHE C 98 -16.070 6.715 37.875 1.00 49.03 C +ATOM 3113 CE1 PHE C 98 -16.056 9.061 39.354 1.00 48.47 C +ATOM 3114 CE2 PHE C 98 -14.886 7.154 38.464 1.00 48.75 C +ATOM 3115 CZ PHE C 98 -14.879 8.331 39.206 1.00 48.28 C +ATOM 3116 N ALA C 99 -20.432 7.740 34.338 1.00 49.07 N +ATOM 3117 CA ALA C 99 -21.663 7.347 33.679 1.00 48.01 C +ATOM 3118 C ALA C 99 -21.429 6.966 32.226 1.00 48.24 C +ATOM 3119 O ALA C 99 -20.340 7.142 31.684 1.00 47.75 O +ATOM 3120 CB ALA C 99 -22.676 8.470 33.769 1.00 48.26 C +ATOM 3121 N LYS C 100 -22.467 6.434 31.602 1.00 49.10 N +ATOM 3122 CA LYS C 100 -22.394 6.028 30.211 1.00 51.27 C +ATOM 3123 C LYS C 100 -23.301 6.936 29.390 1.00 51.51 C +ATOM 3124 O LYS C 100 -24.261 7.503 29.913 1.00 50.83 O +ATOM 3125 CB LYS C 100 -22.857 4.575 30.063 1.00 51.22 C +ATOM 3126 CG LYS C 100 -22.019 3.563 30.831 1.00 54.71 C +ATOM 3127 CD LYS C 100 -20.584 3.524 30.316 1.00 56.89 C +ATOM 3128 CE LYS C 100 -19.834 2.294 30.812 1.00 57.38 C +ATOM 3129 NZ LYS C 100 -19.573 2.324 32.271 1.00 58.53 N +ATOM 3130 N PRO C 101 -22.996 7.104 28.096 1.00 52.00 N +ATOM 3131 CA PRO C 101 -23.854 7.962 27.282 1.00 52.36 C +ATOM 3132 C PRO C 101 -25.259 7.367 27.227 1.00 53.75 C +ATOM 3133 O PRO C 101 -25.425 6.146 27.285 1.00 52.83 O +ATOM 3134 CB PRO C 101 -23.153 7.958 25.920 1.00 52.94 C +ATOM 3135 CG PRO C 101 -22.436 6.640 25.899 1.00 51.66 C +ATOM 3136 CD PRO C 101 -21.886 6.557 27.297 1.00 51.83 C +ATOM 3137 N LYS C 102 -26.263 8.233 27.130 1.00 54.99 N +ATOM 3138 CA LYS C 102 -27.653 7.794 27.067 1.00 56.44 C +ATOM 3139 C LYS C 102 -28.188 7.930 25.651 1.00 56.39 C +ATOM 3140 O LYS C 102 -27.532 8.510 24.787 1.00 56.35 O +ATOM 3141 CB LYS C 102 -28.515 8.617 28.032 1.00 57.94 C +ATOM 3142 CG LYS C 102 -28.262 8.302 29.496 1.00 60.06 C +ATOM 3143 CD LYS C 102 -29.135 9.148 30.407 1.00 63.57 C +ATOM 3144 CE LYS C 102 -29.079 8.634 31.840 1.00 65.76 C +ATOM 3145 NZ LYS C 102 -27.681 8.545 32.362 1.00 66.31 N +ATOM 3146 N SER C 103 -29.384 7.397 25.419 1.00 56.35 N +ATOM 3147 CA SER C 103 -29.997 7.456 24.099 1.00 56.18 C +ATOM 3148 C SER C 103 -30.020 8.885 23.564 1.00 55.62 C +ATOM 3149 O SER C 103 -29.881 9.096 22.363 1.00 56.23 O +ATOM 3150 CB SER C 103 -31.420 6.894 24.145 1.00 56.29 C +ATOM 3151 OG SER C 103 -32.248 7.680 24.983 1.00 58.12 O +ATOM 3152 N HIS C 104 -30.194 9.860 24.454 1.00 54.81 N +ATOM 3153 CA HIS C 104 -30.219 11.262 24.050 1.00 55.25 C +ATOM 3154 C HIS C 104 -28.873 11.648 23.438 1.00 55.43 C +ATOM 3155 O HIS C 104 -28.820 12.300 22.394 1.00 55.16 O +ATOM 3156 CB HIS C 104 -30.511 12.168 25.252 1.00 55.08 C +ATOM 3157 CG HIS C 104 -30.563 13.629 24.913 1.00 55.31 C +ATOM 3158 ND1 HIS C 104 -31.387 14.139 23.932 1.00 55.17 N +ATOM 3159 CD2 HIS C 104 -29.909 14.691 25.442 1.00 55.51 C +ATOM 3160 CE1 HIS C 104 -31.239 15.451 23.871 1.00 54.61 C +ATOM 3161 NE2 HIS C 104 -30.348 15.812 24.777 1.00 54.72 N +ATOM 3162 N ASP C 105 -27.791 11.242 24.097 1.00 54.01 N +ATOM 3163 CA ASP C 105 -26.451 11.535 23.610 1.00 52.15 C +ATOM 3164 C ASP C 105 -26.264 10.982 22.201 1.00 51.50 C +ATOM 3165 O ASP C 105 -25.679 11.644 21.346 1.00 50.62 O +ATOM 3166 CB ASP C 105 -25.408 10.954 24.565 1.00 50.06 C +ATOM 3167 CG ASP C 105 -25.408 11.655 25.911 1.00 51.10 C +ATOM 3168 OD1 ASP C 105 -25.598 10.972 26.945 1.00 52.47 O +ATOM 3169 OD2 ASP C 105 -25.222 12.893 25.935 1.00 47.12 O +ATOM 3170 N TYR C 106 -26.763 9.774 21.952 1.00 51.23 N +ATOM 3171 CA TYR C 106 -26.652 9.194 20.619 1.00 51.63 C +ATOM 3172 C TYR C 106 -27.557 9.964 19.659 1.00 51.96 C +ATOM 3173 O TYR C 106 -27.292 10.045 18.457 1.00 52.36 O +ATOM 3174 CB TYR C 106 -27.064 7.720 20.620 1.00 52.81 C +ATOM 3175 CG TYR C 106 -26.119 6.804 21.362 1.00 54.64 C +ATOM 3176 CD1 TYR C 106 -26.197 6.662 22.749 1.00 55.53 C +ATOM 3177 CD2 TYR C 106 -25.131 6.090 20.681 1.00 54.37 C +ATOM 3178 CE1 TYR C 106 -25.314 5.829 23.440 1.00 56.71 C +ATOM 3179 CE2 TYR C 106 -24.242 5.256 21.364 1.00 56.26 C +ATOM 3180 CZ TYR C 106 -24.340 5.131 22.742 1.00 56.28 C +ATOM 3181 OH TYR C 106 -23.469 4.311 23.424 1.00 57.70 O +ATOM 3182 N GLN C 107 -28.633 10.525 20.194 1.00 50.84 N +ATOM 3183 CA GLN C 107 -29.562 11.287 19.377 1.00 51.78 C +ATOM 3184 C GLN C 107 -28.883 12.552 18.845 1.00 49.61 C +ATOM 3185 O GLN C 107 -28.894 12.815 17.644 1.00 48.43 O +ATOM 3186 CB GLN C 107 -30.803 11.662 20.197 1.00 54.07 C +ATOM 3187 CG GLN C 107 -31.806 12.531 19.441 1.00 58.99 C +ATOM 3188 CD GLN C 107 -33.085 12.776 20.224 1.00 62.35 C +ATOM 3189 OE1 GLN C 107 -33.061 13.338 21.324 1.00 64.28 O +ATOM 3190 NE2 GLN C 107 -34.212 12.353 19.659 1.00 63.76 N +ATOM 3191 N VAL C 108 -28.288 13.325 19.748 1.00 47.68 N +ATOM 3192 CA VAL C 108 -27.609 14.554 19.368 1.00 47.48 C +ATOM 3193 C VAL C 108 -26.486 14.307 18.363 1.00 48.40 C +ATOM 3194 O VAL C 108 -26.353 15.039 17.378 1.00 47.80 O +ATOM 3195 CB VAL C 108 -27.020 15.267 20.599 1.00 47.29 C +ATOM 3196 CG1 VAL C 108 -26.182 16.461 20.155 1.00 45.09 C +ATOM 3197 CG2 VAL C 108 -28.147 15.717 21.523 1.00 44.16 C +ATOM 3198 N ALA C 109 -25.678 13.280 18.617 1.00 46.91 N +ATOM 3199 CA ALA C 109 -24.575 12.951 17.724 1.00 46.77 C +ATOM 3200 C ALA C 109 -25.124 12.645 16.346 1.00 46.90 C +ATOM 3201 O ALA C 109 -24.592 13.108 15.337 1.00 46.94 O +ATOM 3202 CB ALA C 109 -23.800 11.751 18.255 1.00 45.78 C +ATOM 3203 N MET C 110 -26.200 11.865 16.313 1.00 47.45 N +ATOM 3204 CA MET C 110 -26.832 11.489 15.058 1.00 47.91 C +ATOM 3205 C MET C 110 -27.406 12.690 14.321 1.00 46.71 C +ATOM 3206 O MET C 110 -27.320 12.766 13.094 1.00 45.21 O +ATOM 3207 CB MET C 110 -27.938 10.457 15.303 1.00 50.05 C +ATOM 3208 CG MET C 110 -27.423 9.058 15.595 1.00 51.94 C +ATOM 3209 SD MET C 110 -26.508 8.343 14.206 1.00 55.54 S +ATOM 3210 CE MET C 110 -24.904 8.542 14.791 1.00 56.22 C +ATOM 3211 N GLN C 111 -28.004 13.627 15.046 1.00 46.14 N +ATOM 3212 CA GLN C 111 -28.542 14.784 14.355 1.00 48.66 C +ATOM 3213 C GLN C 111 -27.413 15.706 13.903 1.00 49.19 C +ATOM 3214 O GLN C 111 -27.577 16.474 12.954 1.00 50.09 O +ATOM 3215 CB GLN C 111 -29.574 15.528 15.215 1.00 50.02 C +ATOM 3216 CG GLN C 111 -29.275 15.637 16.689 1.00 54.09 C +ATOM 3217 CD GLN C 111 -30.505 16.065 17.487 1.00 55.35 C +ATOM 3218 OE1 GLN C 111 -31.572 15.461 17.372 1.00 53.35 O +ATOM 3219 NE2 GLN C 111 -30.356 17.103 18.300 1.00 56.34 N +ATOM 3220 N ALA C 112 -26.259 15.607 14.561 1.00 47.79 N +ATOM 3221 CA ALA C 112 -25.104 16.415 14.181 1.00 47.89 C +ATOM 3222 C ALA C 112 -24.631 15.919 12.822 1.00 47.60 C +ATOM 3223 O ALA C 112 -24.324 16.710 11.931 1.00 47.35 O +ATOM 3224 CB ALA C 112 -23.989 16.273 15.202 1.00 45.95 C +ATOM 3225 N LEU C 113 -24.581 14.597 12.676 1.00 47.28 N +ATOM 3226 CA LEU C 113 -24.166 13.962 11.431 1.00 46.32 C +ATOM 3227 C LEU C 113 -25.189 14.245 10.342 1.00 46.52 C +ATOM 3228 O LEU C 113 -24.845 14.479 9.183 1.00 48.22 O +ATOM 3229 CB LEU C 113 -24.053 12.450 11.624 1.00 45.02 C +ATOM 3230 CG LEU C 113 -22.875 11.946 12.457 1.00 46.66 C +ATOM 3231 CD1 LEU C 113 -22.993 10.435 12.661 1.00 44.05 C +ATOM 3232 CD2 LEU C 113 -21.574 12.304 11.745 1.00 40.94 C +ATOM 3233 N ASP C 114 -26.455 14.214 10.731 1.00 46.68 N +ATOM 3234 CA ASP C 114 -27.553 14.454 9.810 1.00 46.66 C +ATOM 3235 C ASP C 114 -27.472 15.869 9.263 1.00 45.22 C +ATOM 3236 O ASP C 114 -27.621 16.093 8.063 1.00 42.13 O +ATOM 3237 CB ASP C 114 -28.884 14.239 10.531 1.00 49.20 C +ATOM 3238 CG ASP C 114 -30.071 14.449 9.629 1.00 53.47 C +ATOM 3239 OD1 ASP C 114 -30.041 13.943 8.485 1.00 54.66 O +ATOM 3240 OD2 ASP C 114 -31.034 15.114 10.069 1.00 56.37 O +ATOM 3241 N TYR C 115 -27.232 16.820 10.158 1.00 44.76 N +ATOM 3242 CA TYR C 115 -27.117 18.208 9.770 1.00 44.62 C +ATOM 3243 C TYR C 115 -26.087 18.372 8.656 1.00 44.28 C +ATOM 3244 O TYR C 115 -26.269 19.190 7.765 1.00 44.35 O +ATOM 3245 CB TYR C 115 -26.720 19.051 10.974 1.00 45.94 C +ATOM 3246 CG TYR C 115 -26.336 20.459 10.617 1.00 46.64 C +ATOM 3247 CD1 TYR C 115 -27.289 21.375 10.166 1.00 47.71 C +ATOM 3248 CD2 TYR C 115 -25.013 20.880 10.724 1.00 49.34 C +ATOM 3249 CE1 TYR C 115 -26.930 22.681 9.833 1.00 47.81 C +ATOM 3250 CE2 TYR C 115 -24.642 22.180 10.395 1.00 49.87 C +ATOM 3251 CZ TYR C 115 -25.605 23.073 9.953 1.00 49.29 C +ATOM 3252 OH TYR C 115 -25.229 24.356 9.651 1.00 51.75 O +ATOM 3253 N LEU C 116 -25.017 17.585 8.701 1.00 43.83 N +ATOM 3254 CA LEU C 116 -23.970 17.661 7.681 1.00 43.74 C +ATOM 3255 C LEU C 116 -24.174 16.632 6.557 1.00 44.76 C +ATOM 3256 O LEU C 116 -23.321 16.485 5.665 1.00 41.73 O +ATOM 3257 CB LEU C 116 -22.598 17.442 8.325 1.00 43.65 C +ATOM 3258 CG LEU C 116 -22.228 18.383 9.470 1.00 44.31 C +ATOM 3259 CD1 LEU C 116 -20.905 17.968 10.082 1.00 42.44 C +ATOM 3260 CD2 LEU C 116 -22.159 19.800 8.945 1.00 46.07 C +ATOM 3261 N ASN C 117 -25.299 15.922 6.613 1.00 43.68 N +ATOM 3262 CA ASN C 117 -25.633 14.904 5.620 1.00 45.16 C +ATOM 3263 C ASN C 117 -24.574 13.814 5.565 1.00 45.01 C +ATOM 3264 O ASN C 117 -24.137 13.419 4.483 1.00 43.41 O +ATOM 3265 CB ASN C 117 -25.783 15.535 4.231 1.00 46.27 C +ATOM 3266 CG ASN C 117 -26.824 16.632 4.201 1.00 48.81 C +ATOM 3267 OD1 ASN C 117 -26.517 17.782 3.883 1.00 51.83 O +ATOM 3268 ND2 ASN C 117 -28.063 16.287 4.540 1.00 48.13 N +ATOM 3269 N LEU C 118 -24.163 13.332 6.733 1.00 46.08 N +ATOM 3270 CA LEU C 118 -23.146 12.286 6.811 1.00 48.21 C +ATOM 3271 C LEU C 118 -23.631 11.099 7.638 1.00 47.75 C +ATOM 3272 O LEU C 118 -22.832 10.298 8.122 1.00 46.07 O +ATOM 3273 CB LEU C 118 -21.855 12.847 7.423 1.00 48.25 C +ATOM 3274 CG LEU C 118 -21.206 14.010 6.668 1.00 49.90 C +ATOM 3275 CD1 LEU C 118 -20.025 14.534 7.465 1.00 48.36 C +ATOM 3276 CD2 LEU C 118 -20.770 13.544 5.272 1.00 48.63 C +ATOM 3277 N THR C 119 -24.945 10.999 7.801 1.00 49.03 N +ATOM 3278 CA THR C 119 -25.539 9.911 8.563 1.00 50.64 C +ATOM 3279 C THR C 119 -25.029 8.565 8.065 1.00 50.13 C +ATOM 3280 O THR C 119 -24.750 7.667 8.860 1.00 51.13 O +ATOM 3281 CB THR C 119 -27.074 9.940 8.456 1.00 52.23 C +ATOM 3282 OG1 THR C 119 -27.576 11.088 9.149 1.00 54.18 O +ATOM 3283 CG2 THR C 119 -27.680 8.688 9.067 1.00 54.70 C +ATOM 3284 N HIS C 120 -24.891 8.443 6.750 1.00 48.94 N +ATOM 3285 CA HIS C 120 -24.424 7.209 6.127 1.00 49.21 C +ATOM 3286 C HIS C 120 -22.945 6.935 6.382 1.00 50.68 C +ATOM 3287 O HIS C 120 -22.316 6.176 5.645 1.00 52.71 O +ATOM 3288 CB HIS C 120 -24.648 7.268 4.619 1.00 48.04 C +ATOM 3289 CG HIS C 120 -23.696 8.177 3.905 1.00 49.92 C +ATOM 3290 ND1 HIS C 120 -23.728 9.550 4.041 1.00 50.55 N +ATOM 3291 CD2 HIS C 120 -22.669 7.907 3.065 1.00 48.40 C +ATOM 3292 CE1 HIS C 120 -22.763 10.086 3.314 1.00 48.53 C +ATOM 3293 NE2 HIS C 120 -22.105 9.110 2.713 1.00 50.33 N +ATOM 3294 N LEU C 121 -22.385 7.550 7.415 1.00 50.61 N +ATOM 3295 CA LEU C 121 -20.974 7.357 7.733 1.00 49.16 C +ATOM 3296 C LEU C 121 -20.812 6.891 9.171 1.00 48.16 C +ATOM 3297 O LEU C 121 -19.742 6.442 9.569 1.00 49.49 O +ATOM 3298 CB LEU C 121 -20.214 8.672 7.534 1.00 48.30 C +ATOM 3299 CG LEU C 121 -19.279 8.845 6.335 1.00 49.44 C +ATOM 3300 CD1 LEU C 121 -19.893 8.277 5.075 1.00 50.39 C +ATOM 3301 CD2 LEU C 121 -18.972 10.327 6.164 1.00 49.23 C +ATOM 3302 N ALA C 122 -21.889 6.997 9.940 1.00 48.25 N +ATOM 3303 CA ALA C 122 -21.890 6.629 11.351 1.00 50.52 C +ATOM 3304 C ALA C 122 -21.094 5.381 11.735 1.00 51.43 C +ATOM 3305 O ALA C 122 -20.310 5.414 12.685 1.00 52.67 O +ATOM 3306 CB ALA C 122 -23.332 6.496 11.846 1.00 48.59 C +ATOM 3307 N LYS C 123 -21.288 4.290 11.001 1.00 52.71 N +ATOM 3308 CA LYS C 123 -20.608 3.031 11.309 1.00 53.38 C +ATOM 3309 C LYS C 123 -19.243 2.853 10.658 1.00 51.54 C +ATOM 3310 O LYS C 123 -18.529 1.901 10.962 1.00 52.43 O +ATOM 3311 CB LYS C 123 -21.502 1.848 10.918 1.00 55.12 C +ATOM 3312 CG LYS C 123 -22.873 1.846 11.577 1.00 59.59 C +ATOM 3313 CD LYS C 123 -22.754 1.801 13.091 1.00 63.76 C +ATOM 3314 CE LYS C 123 -24.119 1.686 13.754 1.00 66.68 C +ATOM 3315 NZ LYS C 123 -24.011 1.626 15.245 1.00 69.77 N +ATOM 3316 N ARG C 124 -18.880 3.757 9.760 1.00 49.97 N +ATOM 3317 CA ARG C 124 -17.597 3.661 9.073 1.00 49.19 C +ATOM 3318 C ARG C 124 -16.406 3.858 10.009 1.00 48.63 C +ATOM 3319 O ARG C 124 -16.518 4.491 11.061 1.00 48.70 O +ATOM 3320 CB ARG C 124 -17.534 4.693 7.941 1.00 49.42 C +ATOM 3321 CG ARG C 124 -18.444 4.388 6.762 1.00 50.51 C +ATOM 3322 CD ARG C 124 -17.875 3.257 5.921 1.00 50.96 C +ATOM 3323 NE ARG C 124 -16.633 3.647 5.260 1.00 51.67 N +ATOM 3324 CZ ARG C 124 -16.555 4.564 4.299 1.00 53.22 C +ATOM 3325 NH1 ARG C 124 -15.383 4.857 3.756 1.00 53.12 N +ATOM 3326 NH2 ARG C 124 -17.650 5.182 3.874 1.00 52.85 N +ATOM 3327 N GLU C 125 -15.264 3.303 9.627 1.00 47.33 N +ATOM 3328 CA GLU C 125 -14.060 3.458 10.422 1.00 47.66 C +ATOM 3329 C GLU C 125 -13.470 4.820 10.069 1.00 46.03 C +ATOM 3330 O GLU C 125 -13.118 5.075 8.913 1.00 45.89 O +ATOM 3331 CB GLU C 125 -13.057 2.359 10.092 1.00 51.50 C +ATOM 3332 CG GLU C 125 -11.772 2.447 10.891 1.00 57.85 C +ATOM 3333 CD GLU C 125 -10.879 1.235 10.685 1.00 62.44 C +ATOM 3334 OE1 GLU C 125 -11.404 0.098 10.763 1.00 63.54 O +ATOM 3335 OE2 GLU C 125 -9.660 1.419 10.459 1.00 64.33 O +ATOM 3336 N PHE C 126 -13.362 5.688 11.068 1.00 42.19 N +ATOM 3337 CA PHE C 126 -12.838 7.031 10.866 1.00 39.85 C +ATOM 3338 C PHE C 126 -11.671 7.156 9.889 1.00 39.70 C +ATOM 3339 O PHE C 126 -11.698 8.023 9.018 1.00 38.77 O +ATOM 3340 CB PHE C 126 -12.425 7.643 12.200 1.00 36.74 C +ATOM 3341 CG PHE C 126 -12.016 9.082 12.097 1.00 35.60 C +ATOM 3342 CD1 PHE C 126 -12.974 10.080 11.958 1.00 33.35 C +ATOM 3343 CD2 PHE C 126 -10.672 9.443 12.144 1.00 35.51 C +ATOM 3344 CE1 PHE C 126 -12.604 11.420 11.873 1.00 35.30 C +ATOM 3345 CE2 PHE C 126 -10.290 10.786 12.056 1.00 35.68 C +ATOM 3346 CZ PHE C 126 -11.261 11.774 11.921 1.00 34.64 C +ATOM 3347 N THR C 127 -10.653 6.307 10.032 1.00 40.09 N +ATOM 3348 CA THR C 127 -9.473 6.376 9.159 1.00 42.28 C +ATOM 3349 C THR C 127 -9.694 5.913 7.732 1.00 42.40 C +ATOM 3350 O THR C 127 -8.791 6.014 6.909 1.00 44.99 O +ATOM 3351 CB THR C 127 -8.276 5.555 9.712 1.00 42.49 C +ATOM 3352 OG1 THR C 127 -8.683 4.197 9.924 1.00 45.09 O +ATOM 3353 CG2 THR C 127 -7.759 6.156 11.016 1.00 38.78 C +ATOM 3354 N SER C 128 -10.880 5.401 7.430 1.00 42.82 N +ATOM 3355 CA SER C 128 -11.162 4.937 6.074 1.00 43.55 C +ATOM 3356 C SER C 128 -11.800 6.055 5.260 1.00 43.64 C +ATOM 3357 O SER C 128 -12.061 5.894 4.071 1.00 42.97 O +ATOM 3358 CB SER C 128 -12.112 3.740 6.100 1.00 41.49 C +ATOM 3359 OG SER C 128 -13.420 4.141 6.478 1.00 41.98 O +ATOM 3360 N LEU C 129 -12.060 7.182 5.914 1.00 43.21 N +ATOM 3361 CA LEU C 129 -12.676 8.321 5.251 1.00 42.91 C +ATOM 3362 C LEU C 129 -11.627 9.209 4.614 1.00 42.24 C +ATOM 3363 O LEU C 129 -10.435 9.084 4.901 1.00 41.46 O +ATOM 3364 CB LEU C 129 -13.485 9.137 6.254 1.00 43.25 C +ATOM 3365 CG LEU C 129 -14.537 8.332 7.018 1.00 45.92 C +ATOM 3366 CD1 LEU C 129 -15.144 9.208 8.071 1.00 47.96 C +ATOM 3367 CD2 LEU C 129 -15.601 7.810 6.078 1.00 44.46 C +ATOM 3368 N SER C 130 -12.075 10.101 3.736 1.00 42.27 N +ATOM 3369 CA SER C 130 -11.170 11.034 3.067 1.00 40.11 C +ATOM 3370 C SER C 130 -10.835 12.159 4.050 1.00 37.98 C +ATOM 3371 O SER C 130 -11.444 12.261 5.114 1.00 34.78 O +ATOM 3372 CB SER C 130 -11.850 11.625 1.827 1.00 40.35 C +ATOM 3373 OG SER C 130 -13.011 12.370 2.190 1.00 42.33 O +ATOM 3374 N GLY C 131 -9.869 12.999 3.689 1.00 38.51 N +ATOM 3375 CA GLY C 131 -9.496 14.106 4.550 1.00 35.62 C +ATOM 3376 C GLY C 131 -10.669 15.038 4.790 1.00 35.56 C +ATOM 3377 O GLY C 131 -10.886 15.485 5.911 1.00 36.07 O +ATOM 3378 N GLY C 132 -11.434 15.315 3.737 1.00 35.78 N +ATOM 3379 CA GLY C 132 -12.582 16.200 3.846 1.00 35.74 C +ATOM 3380 C GLY C 132 -13.667 15.671 4.759 1.00 35.39 C +ATOM 3381 O GLY C 132 -14.236 16.425 5.548 1.00 37.91 O +ATOM 3382 N GLN C 133 -13.965 14.379 4.658 1.00 35.34 N +ATOM 3383 CA GLN C 133 -14.986 13.768 5.506 1.00 35.72 C +ATOM 3384 C GLN C 133 -14.499 13.731 6.954 1.00 33.93 C +ATOM 3385 O GLN C 133 -15.284 13.908 7.888 1.00 33.13 O +ATOM 3386 CB GLN C 133 -15.292 12.343 5.039 1.00 37.80 C +ATOM 3387 CG GLN C 133 -15.888 12.243 3.641 1.00 39.11 C +ATOM 3388 CD GLN C 133 -16.046 10.796 3.178 1.00 41.34 C +ATOM 3389 OE1 GLN C 133 -15.079 10.023 3.157 1.00 40.70 O +ATOM 3390 NE2 GLN C 133 -17.267 10.427 2.804 1.00 40.40 N +ATOM 3391 N ARG C 134 -13.202 13.490 7.136 1.00 31.56 N +ATOM 3392 CA ARG C 134 -12.621 13.448 8.474 1.00 33.99 C +ATOM 3393 C ARG C 134 -12.774 14.800 9.154 1.00 31.69 C +ATOM 3394 O ARG C 134 -13.236 14.888 10.296 1.00 32.62 O +ATOM 3395 CB ARG C 134 -11.138 13.105 8.418 1.00 35.24 C +ATOM 3396 CG ARG C 134 -10.793 11.667 8.086 1.00 40.55 C +ATOM 3397 CD ARG C 134 -9.406 11.423 8.642 1.00 44.59 C +ATOM 3398 NE ARG C 134 -8.740 10.251 8.110 1.00 51.55 N +ATOM 3399 CZ ARG C 134 -7.637 9.730 8.644 1.00 55.27 C +ATOM 3400 NH1 ARG C 134 -7.075 8.656 8.100 1.00 55.92 N +ATOM 3401 NH2 ARG C 134 -7.105 10.275 9.734 1.00 55.02 N +ATOM 3402 N GLN C 135 -12.371 15.852 8.445 1.00 30.37 N +ATOM 3403 CA GLN C 135 -12.470 17.205 8.973 1.00 31.46 C +ATOM 3404 C GLN C 135 -13.937 17.507 9.293 1.00 29.72 C +ATOM 3405 O GLN C 135 -14.239 18.064 10.338 1.00 31.55 O +ATOM 3406 CB GLN C 135 -11.891 18.208 7.954 1.00 31.25 C +ATOM 3407 CG GLN C 135 -12.101 19.697 8.269 1.00 31.62 C +ATOM 3408 CD GLN C 135 -11.478 20.133 9.583 1.00 35.09 C +ATOM 3409 OE1 GLN C 135 -10.336 19.795 9.888 1.00 38.66 O +ATOM 3410 NE2 GLN C 135 -12.227 20.898 10.365 1.00 32.88 N +ATOM 3411 N LEU C 136 -14.853 17.124 8.409 1.00 30.55 N +ATOM 3412 CA LEU C 136 -16.267 17.376 8.668 1.00 31.57 C +ATOM 3413 C LEU C 136 -16.734 16.601 9.904 1.00 30.99 C +ATOM 3414 O LEU C 136 -17.489 17.121 10.732 1.00 31.06 O +ATOM 3415 CB LEU C 136 -17.120 16.997 7.449 1.00 31.99 C +ATOM 3416 CG LEU C 136 -17.005 17.917 6.225 1.00 34.78 C +ATOM 3417 CD1 LEU C 136 -17.869 17.385 5.094 1.00 36.34 C +ATOM 3418 CD2 LEU C 136 -17.435 19.325 6.590 1.00 31.99 C +ATOM 3419 N ILE C 137 -16.284 15.360 10.043 1.00 29.59 N +ATOM 3420 CA ILE C 137 -16.685 14.590 11.208 1.00 29.52 C +ATOM 3421 C ILE C 137 -16.177 15.254 12.486 1.00 30.30 C +ATOM 3422 O ILE C 137 -16.850 15.205 13.514 1.00 28.62 O +ATOM 3423 CB ILE C 137 -16.194 13.130 11.108 1.00 30.97 C +ATOM 3424 CG1 ILE C 137 -17.072 12.391 10.095 1.00 29.38 C +ATOM 3425 CG2 ILE C 137 -16.237 12.437 12.487 1.00 30.13 C +ATOM 3426 CD1 ILE C 137 -16.721 10.966 9.931 0.00 29.88 C +ATOM 3427 N LEU C 138 -15.006 15.893 12.423 1.00 29.16 N +ATOM 3428 CA LEU C 138 -14.470 16.561 13.601 1.00 28.90 C +ATOM 3429 C LEU C 138 -15.291 17.805 13.927 1.00 30.30 C +ATOM 3430 O LEU C 138 -15.388 18.209 15.093 1.00 29.24 O +ATOM 3431 CB LEU C 138 -12.995 16.927 13.406 1.00 27.85 C +ATOM 3432 CG LEU C 138 -12.028 15.738 13.319 1.00 30.12 C +ATOM 3433 CD1 LEU C 138 -10.582 16.239 13.192 1.00 23.31 C +ATOM 3434 CD2 LEU C 138 -12.201 14.845 14.575 1.00 27.50 C +ATOM 3435 N ILE C 139 -15.884 18.425 12.908 1.00 30.59 N +ATOM 3436 CA ILE C 139 -16.715 19.597 13.172 1.00 30.21 C +ATOM 3437 C ILE C 139 -18.003 19.084 13.835 1.00 30.99 C +ATOM 3438 O ILE C 139 -18.550 19.716 14.743 1.00 31.15 O +ATOM 3439 CB ILE C 139 -17.077 20.379 11.879 1.00 29.19 C +ATOM 3440 CG1 ILE C 139 -15.813 20.967 11.230 1.00 27.83 C +ATOM 3441 CG2 ILE C 139 -18.060 21.519 12.225 1.00 28.59 C +ATOM 3442 CD1 ILE C 139 -16.073 21.700 9.930 0.00 28.40 C +ATOM 3443 N ALA C 140 -18.477 17.928 13.380 1.00 29.71 N +ATOM 3444 CA ALA C 140 -19.679 17.320 13.946 1.00 32.39 C +ATOM 3445 C ALA C 140 -19.506 17.028 15.442 1.00 32.91 C +ATOM 3446 O ALA C 140 -20.400 17.312 16.243 1.00 34.47 O +ATOM 3447 CB ALA C 140 -20.023 16.027 13.198 1.00 30.18 C +ATOM 3448 N ARG C 141 -18.361 16.481 15.839 1.00 34.07 N +ATOM 3449 CA ARG C 141 -18.182 16.184 17.254 1.00 34.51 C +ATOM 3450 C ARG C 141 -18.241 17.467 18.084 1.00 35.07 C +ATOM 3451 O ARG C 141 -18.767 17.455 19.197 1.00 33.42 O +ATOM 3452 CB ARG C 141 -16.880 15.420 17.496 1.00 34.56 C +ATOM 3453 CG ARG C 141 -15.669 16.267 17.692 1.00 40.33 C +ATOM 3454 CD ARG C 141 -15.049 15.961 19.032 1.00 39.30 C +ATOM 3455 NE ARG C 141 -14.011 14.942 18.966 1.00 38.72 N +ATOM 3456 CZ ARG C 141 -12.756 15.155 18.573 1.00 36.18 C +ATOM 3457 NH1 ARG C 141 -11.893 14.152 18.560 1.00 36.82 N +ATOM 3458 NH2 ARG C 141 -12.359 16.354 18.194 1.00 32.17 N +ATOM 3459 N ALA C 142 -17.724 18.576 17.549 1.00 34.08 N +ATOM 3460 CA ALA C 142 -17.786 19.850 18.274 1.00 34.99 C +ATOM 3461 C ALA C 142 -19.248 20.303 18.321 1.00 35.82 C +ATOM 3462 O ALA C 142 -19.714 20.833 19.326 1.00 35.43 O +ATOM 3463 CB ALA C 142 -16.935 20.916 17.579 1.00 34.59 C +ATOM 3464 N ILE C 143 -19.964 20.091 17.221 1.00 37.18 N +ATOM 3465 CA ILE C 143 -21.374 20.457 17.136 1.00 39.72 C +ATOM 3466 C ILE C 143 -22.195 19.655 18.146 1.00 40.45 C +ATOM 3467 O ILE C 143 -23.045 20.206 18.837 1.00 40.85 O +ATOM 3468 CB ILE C 143 -21.933 20.203 15.709 1.00 40.89 C +ATOM 3469 CG1 ILE C 143 -21.533 21.359 14.784 1.00 40.66 C +ATOM 3470 CG2 ILE C 143 -23.448 20.020 15.754 1.00 39.63 C +ATOM 3471 CD1 ILE C 143 -21.994 21.189 13.350 0.00 40.70 C +ATOM 3472 N ALA C 144 -21.942 18.351 18.222 1.00 40.89 N +ATOM 3473 CA ALA C 144 -22.660 17.495 19.159 1.00 39.93 C +ATOM 3474 C ALA C 144 -22.457 17.966 20.598 1.00 39.47 C +ATOM 3475 O ALA C 144 -23.253 17.645 21.475 1.00 41.13 O +ATOM 3476 CB ALA C 144 -22.194 16.047 19.013 1.00 39.86 C +ATOM 3477 N SER C 145 -21.395 18.725 20.846 1.00 38.21 N +ATOM 3478 CA SER C 145 -21.128 19.213 22.195 1.00 39.73 C +ATOM 3479 C SER C 145 -22.077 20.362 22.517 1.00 40.58 C +ATOM 3480 O SER C 145 -22.196 20.781 23.668 1.00 38.63 O +ATOM 3481 CB SER C 145 -19.678 19.695 22.324 1.00 38.62 C +ATOM 3482 OG SER C 145 -19.524 21.017 21.833 1.00 41.39 O +ATOM 3483 N GLU C 146 -22.736 20.868 21.477 1.00 41.56 N +ATOM 3484 CA GLU C 146 -23.688 21.967 21.602 1.00 44.47 C +ATOM 3485 C GLU C 146 -23.056 23.316 21.948 1.00 42.42 C +ATOM 3486 O GLU C 146 -23.677 24.151 22.597 1.00 43.43 O +ATOM 3487 CB GLU C 146 -24.763 21.610 22.633 1.00 47.38 C +ATOM 3488 CG GLU C 146 -25.636 20.441 22.208 1.00 53.27 C +ATOM 3489 CD GLU C 146 -26.650 20.049 23.267 1.00 57.89 C +ATOM 3490 OE1 GLU C 146 -27.557 19.242 22.959 1.00 59.22 O +ATOM 3491 OE2 GLU C 146 -26.537 20.541 24.412 1.00 61.78 O +ATOM 3492 N CYS C 147 -21.824 23.527 21.500 1.00 40.73 N +ATOM 3493 CA CYS C 147 -21.123 24.783 21.743 1.00 39.28 C +ATOM 3494 C CYS C 147 -21.754 25.882 20.888 1.00 38.88 C +ATOM 3495 O CYS C 147 -22.481 25.594 19.939 1.00 37.50 O +ATOM 3496 CB CYS C 147 -19.652 24.638 21.363 1.00 41.28 C +ATOM 3497 SG CYS C 147 -19.378 24.252 19.598 1.00 44.15 S +ATOM 3498 N LYS C 148 -21.475 27.136 21.227 1.00 38.08 N +ATOM 3499 CA LYS C 148 -22.007 28.270 20.479 1.00 39.34 C +ATOM 3500 C LYS C 148 -20.852 29.027 19.825 1.00 38.33 C +ATOM 3501 O LYS C 148 -21.032 29.735 18.836 1.00 38.19 O +ATOM 3502 CB LYS C 148 -22.804 29.194 21.408 1.00 42.69 C +ATOM 3503 CG LYS C 148 -24.068 28.551 21.974 1.00 47.27 C +ATOM 3504 CD LYS C 148 -24.987 28.079 20.859 1.00 51.90 C +ATOM 3505 CE LYS C 148 -26.292 27.486 21.391 1.00 56.83 C +ATOM 3506 NZ LYS C 148 -26.102 26.204 22.140 1.00 60.77 N +ATOM 3507 N LEU C 149 -19.664 28.861 20.396 1.00 36.52 N +ATOM 3508 CA LEU C 149 -18.440 29.474 19.889 1.00 34.46 C +ATOM 3509 C LEU C 149 -17.562 28.316 19.424 1.00 34.57 C +ATOM 3510 O LEU C 149 -17.107 27.508 20.242 1.00 33.94 O +ATOM 3511 CB LEU C 149 -17.734 30.241 21.003 1.00 31.63 C +ATOM 3512 CG LEU C 149 -16.337 30.770 20.687 1.00 34.57 C +ATOM 3513 CD1 LEU C 149 -16.363 31.645 19.431 1.00 33.12 C +ATOM 3514 CD2 LEU C 149 -15.832 31.557 21.890 1.00 34.75 C +ATOM 3515 N ILE C 150 -17.339 28.220 18.116 1.00 32.48 N +ATOM 3516 CA ILE C 150 -16.536 27.134 17.580 1.00 30.78 C +ATOM 3517 C ILE C 150 -15.191 27.627 17.021 1.00 31.37 C +ATOM 3518 O ILE C 150 -15.139 28.488 16.140 1.00 29.55 O +ATOM 3519 CB ILE C 150 -17.331 26.353 16.488 1.00 31.53 C +ATOM 3520 CG1 ILE C 150 -16.586 25.069 16.090 1.00 30.89 C +ATOM 3521 CG2 ILE C 150 -17.553 27.240 15.270 1.00 33.18 C +ATOM 3522 CD1 ILE C 150 -17.317 24.224 15.069 0.00 31.06 C +ATOM 3523 N LEU C 151 -14.110 27.080 17.573 1.00 29.01 N +ATOM 3524 CA LEU C 151 -12.753 27.405 17.158 1.00 30.08 C +ATOM 3525 C LEU C 151 -12.187 26.292 16.267 1.00 29.75 C +ATOM 3526 O LEU C 151 -12.144 25.122 16.668 1.00 28.30 O +ATOM 3527 CB LEU C 151 -11.854 27.570 18.382 1.00 32.44 C +ATOM 3528 CG LEU C 151 -11.855 28.902 19.133 1.00 35.48 C +ATOM 3529 CD1 LEU C 151 -13.251 29.280 19.577 1.00 35.67 C +ATOM 3530 CD2 LEU C 151 -10.920 28.771 20.331 1.00 37.86 C +ATOM 3531 N LEU C 152 -11.763 26.652 15.061 1.00 28.56 N +ATOM 3532 CA LEU C 152 -11.202 25.664 14.140 1.00 28.87 C +ATOM 3533 C LEU C 152 -9.769 25.983 13.757 1.00 28.72 C +ATOM 3534 O LEU C 152 -9.450 27.109 13.346 1.00 26.98 O +ATOM 3535 CB LEU C 152 -12.038 25.557 12.863 1.00 26.53 C +ATOM 3536 CG LEU C 152 -13.508 25.168 13.041 1.00 26.38 C +ATOM 3537 CD1 LEU C 152 -14.337 26.430 13.257 1.00 26.53 C +ATOM 3538 CD2 LEU C 152 -13.995 24.414 11.803 1.00 23.34 C +ATOM 3539 N ASP C 153 -8.909 24.982 13.906 1.00 27.37 N +ATOM 3540 CA ASP C 153 -7.511 25.127 13.559 1.00 29.26 C +ATOM 3541 C ASP C 153 -7.284 24.662 12.117 1.00 29.60 C +ATOM 3542 O ASP C 153 -7.457 23.473 11.808 1.00 24.97 O +ATOM 3543 CB ASP C 153 -6.646 24.291 14.493 1.00 33.24 C +ATOM 3544 CG ASP C 153 -5.171 24.498 14.243 1.00 38.98 C +ATOM 3545 OD1 ASP C 153 -4.370 23.633 14.645 1.00 43.58 O +ATOM 3546 OD2 ASP C 153 -4.807 25.540 13.654 1.00 43.86 O +ATOM 3547 N GLU C 154 -6.910 25.603 11.246 1.00 27.13 N +ATOM 3548 CA GLU C 154 -6.642 25.311 9.834 1.00 28.66 C +ATOM 3549 C GLU C 154 -7.652 24.342 9.217 1.00 28.10 C +ATOM 3550 O GLU C 154 -7.268 23.347 8.612 1.00 27.20 O +ATOM 3551 CB GLU C 154 -5.232 24.726 9.688 1.00 31.10 C +ATOM 3552 CG GLU C 154 -4.130 25.613 10.258 1.00 36.92 C +ATOM 3553 CD GLU C 154 -3.916 26.880 9.457 1.00 42.73 C +ATOM 3554 OE1 GLU C 154 -3.497 27.896 10.054 1.00 48.73 O +ATOM 3555 OE2 GLU C 154 -4.150 26.868 8.229 1.00 46.67 O +ATOM 3556 N PRO C 155 -8.956 24.644 9.327 1.00 29.83 N +ATOM 3557 CA PRO C 155 -9.978 23.749 8.769 1.00 30.25 C +ATOM 3558 C PRO C 155 -9.921 23.400 7.282 1.00 31.23 C +ATOM 3559 O PRO C 155 -10.434 22.355 6.872 1.00 33.16 O +ATOM 3560 CB PRO C 155 -11.294 24.434 9.159 1.00 29.15 C +ATOM 3561 CG PRO C 155 -10.918 25.895 9.213 1.00 27.57 C +ATOM 3562 CD PRO C 155 -9.567 25.870 9.881 1.00 27.79 C +ATOM 3563 N THR C 156 -9.287 24.236 6.473 1.00 29.39 N +ATOM 3564 CA THR C 156 -9.248 23.961 5.040 1.00 29.13 C +ATOM 3565 C THR C 156 -7.898 23.596 4.441 1.00 29.73 C +ATOM 3566 O THR C 156 -7.847 23.019 3.364 1.00 28.59 O +ATOM 3567 CB THR C 156 -9.711 25.172 4.236 1.00 29.83 C +ATOM 3568 OG1 THR C 156 -8.796 26.248 4.470 1.00 26.78 O +ATOM 3569 CG2 THR C 156 -11.119 25.586 4.623 1.00 30.59 C +ATOM 3570 N SER C 157 -6.821 23.944 5.134 1.00 31.70 N +ATOM 3571 CA SER C 157 -5.459 23.742 4.640 1.00 34.95 C +ATOM 3572 C SER C 157 -5.092 22.446 3.948 1.00 35.25 C +ATOM 3573 O SER C 157 -4.383 22.477 2.942 1.00 38.51 O +ATOM 3574 CB SER C 157 -4.454 24.004 5.768 1.00 35.41 C +ATOM 3575 OG SER C 157 -4.708 25.272 6.350 1.00 40.28 O +ATOM 3576 N ALA C 158 -5.566 21.316 4.460 1.00 32.73 N +ATOM 3577 CA ALA C 158 -5.209 20.028 3.875 1.00 33.60 C +ATOM 3578 C ALA C 158 -6.274 19.370 3.009 1.00 34.47 C +ATOM 3579 O ALA C 158 -6.110 18.216 2.605 1.00 37.31 O +ATOM 3580 CB ALA C 158 -4.787 19.055 4.994 1.00 31.37 C +ATOM 3581 N LEU C 159 -7.350 20.082 2.701 1.00 32.25 N +ATOM 3582 CA LEU C 159 -8.411 19.478 1.906 1.00 33.06 C +ATOM 3583 C LEU C 159 -8.329 19.808 0.422 1.00 35.00 C +ATOM 3584 O LEU C 159 -7.684 20.780 0.027 1.00 37.44 O +ATOM 3585 CB LEU C 159 -9.778 19.910 2.453 1.00 30.71 C +ATOM 3586 CG LEU C 159 -9.950 19.956 3.981 1.00 31.65 C +ATOM 3587 CD1 LEU C 159 -11.405 20.215 4.308 1.00 28.17 C +ATOM 3588 CD2 LEU C 159 -9.491 18.650 4.621 1.00 27.99 C +ATOM 3589 N ASP C 160 -8.962 18.987 -0.413 1.00 36.73 N +ATOM 3590 CA ASP C 160 -8.973 19.281 -1.837 1.00 36.93 C +ATOM 3591 C ASP C 160 -9.914 20.475 -1.983 1.00 34.91 C +ATOM 3592 O ASP C 160 -10.688 20.767 -1.066 1.00 33.64 O +ATOM 3593 CB ASP C 160 -9.471 18.083 -2.653 1.00 41.98 C +ATOM 3594 CG ASP C 160 -10.829 17.583 -2.207 1.00 47.95 C +ATOM 3595 OD1 ASP C 160 -11.695 18.401 -1.829 1.00 52.46 O +ATOM 3596 OD2 ASP C 160 -11.041 16.354 -2.257 1.00 54.74 O +ATOM 3597 N LEU C 161 -9.846 21.167 -3.117 1.00 32.50 N +ATOM 3598 CA LEU C 161 -10.673 22.350 -3.343 1.00 31.17 C +ATOM 3599 C LEU C 161 -12.175 22.161 -3.136 1.00 30.02 C +ATOM 3600 O LEU C 161 -12.821 22.994 -2.491 1.00 27.15 O +ATOM 3601 CB LEU C 161 -10.409 22.930 -4.743 1.00 30.05 C +ATOM 3602 CG LEU C 161 -8.998 23.495 -4.955 1.00 33.51 C +ATOM 3603 CD1 LEU C 161 -8.910 24.202 -6.310 1.00 32.61 C +ATOM 3604 CD2 LEU C 161 -8.664 24.477 -3.829 1.00 33.68 C +ATOM 3605 N ALA C 162 -12.732 21.080 -3.677 1.00 27.99 N +ATOM 3606 CA ALA C 162 -14.164 20.830 -3.528 1.00 30.13 C +ATOM 3607 C ALA C 162 -14.581 20.753 -2.052 1.00 29.27 C +ATOM 3608 O ALA C 162 -15.638 21.258 -1.676 1.00 28.48 O +ATOM 3609 CB ALA C 162 -14.555 19.540 -4.262 1.00 26.88 C +ATOM 3610 N ASN C 163 -13.739 20.137 -1.222 1.00 29.33 N +ATOM 3611 CA ASN C 163 -14.029 20.003 0.212 1.00 31.95 C +ATOM 3612 C ASN C 163 -13.813 21.289 0.987 1.00 29.81 C +ATOM 3613 O ASN C 163 -14.493 21.550 1.972 1.00 31.00 O +ATOM 3614 CB ASN C 163 -13.197 18.878 0.837 1.00 32.17 C +ATOM 3615 CG ASN C 163 -13.658 17.514 0.391 1.00 36.15 C +ATOM 3616 OD1 ASN C 163 -14.857 17.241 0.357 1.00 39.06 O +ATOM 3617 ND2 ASN C 163 -12.716 16.645 0.050 1.00 38.44 N +ATOM 3618 N GLN C 164 -12.853 22.088 0.549 1.00 29.94 N +ATOM 3619 CA GLN C 164 -12.605 23.365 1.192 1.00 30.46 C +ATOM 3620 C GLN C 164 -13.870 24.188 0.966 1.00 29.27 C +ATOM 3621 O GLN C 164 -14.334 24.902 1.857 1.00 29.16 O +ATOM 3622 CB GLN C 164 -11.403 24.058 0.553 1.00 30.82 C +ATOM 3623 CG GLN C 164 -10.083 23.385 0.848 1.00 35.43 C +ATOM 3624 CD GLN C 164 -8.921 24.061 0.151 1.00 38.13 C +ATOM 3625 OE1 GLN C 164 -8.703 25.259 0.308 1.00 36.61 O +ATOM 3626 NE2 GLN C 164 -8.169 23.291 -0.628 1.00 39.38 N +ATOM 3627 N ASP C 165 -14.428 24.065 -0.235 1.00 29.81 N +ATOM 3628 CA ASP C 165 -15.645 24.780 -0.587 1.00 30.00 C +ATOM 3629 C ASP C 165 -16.790 24.377 0.344 1.00 28.64 C +ATOM 3630 O ASP C 165 -17.521 25.227 0.836 1.00 28.06 O +ATOM 3631 CB ASP C 165 -16.030 24.484 -2.034 1.00 32.21 C +ATOM 3632 CG ASP C 165 -17.240 25.275 -2.486 1.00 34.99 C +ATOM 3633 OD1 ASP C 165 -18.141 24.668 -3.090 1.00 39.77 O +ATOM 3634 OD2 ASP C 165 -17.295 26.502 -2.244 1.00 35.93 O +ATOM 3635 N ILE C 166 -16.938 23.078 0.589 1.00 28.59 N +ATOM 3636 CA ILE C 166 -17.996 22.596 1.465 1.00 28.15 C +ATOM 3637 C ILE C 166 -17.812 23.156 2.878 1.00 28.19 C +ATOM 3638 O ILE C 166 -18.778 23.572 3.523 1.00 28.97 O +ATOM 3639 CB ILE C 166 -18.022 21.037 1.509 1.00 31.35 C +ATOM 3640 CG1 ILE C 166 -18.525 20.483 0.162 1.00 32.35 C +ATOM 3641 CG2 ILE C 166 -18.924 20.538 2.650 1.00 27.38 C +ATOM 3642 CD1 ILE C 166 -18.536 18.970 0.081 0.00 31.85 C +ATOM 3643 N VAL C 167 -16.570 23.194 3.345 1.00 27.46 N +ATOM 3644 CA VAL C 167 -16.288 23.687 4.681 1.00 27.12 C +ATOM 3645 C VAL C 167 -16.591 25.174 4.826 1.00 25.58 C +ATOM 3646 O VAL C 167 -17.160 25.596 5.838 1.00 23.90 O +ATOM 3647 CB VAL C 167 -14.808 23.399 5.087 1.00 27.92 C +ATOM 3648 CG1 VAL C 167 -14.464 24.115 6.395 1.00 26.11 C +ATOM 3649 CG2 VAL C 167 -14.613 21.918 5.267 1.00 24.31 C +ATOM 3650 N LEU C 168 -16.216 25.968 3.825 1.00 24.46 N +ATOM 3651 CA LEU C 168 -16.481 27.408 3.880 1.00 24.85 C +ATOM 3652 C LEU C 168 -17.987 27.666 3.947 1.00 24.07 C +ATOM 3653 O LEU C 168 -18.447 28.481 4.744 1.00 22.94 O +ATOM 3654 CB LEU C 168 -15.888 28.129 2.659 1.00 22.03 C +ATOM 3655 CG LEU C 168 -14.359 28.133 2.569 1.00 23.08 C +ATOM 3656 CD1 LEU C 168 -13.929 28.690 1.202 1.00 22.45 C +ATOM 3657 CD2 LEU C 168 -13.766 28.941 3.725 1.00 16.85 C +ATOM 3658 N SER C 169 -18.749 26.966 3.116 1.00 25.48 N +ATOM 3659 CA SER C 169 -20.206 27.123 3.109 1.00 28.15 C +ATOM 3660 C SER C 169 -20.795 26.723 4.457 1.00 28.37 C +ATOM 3661 O SER C 169 -21.690 27.397 4.972 1.00 26.18 O +ATOM 3662 CB SER C 169 -20.839 26.267 2.010 1.00 24.17 C +ATOM 3663 OG SER C 169 -20.430 26.733 0.742 1.00 30.75 O +ATOM 3664 N LEU C 170 -20.275 25.634 5.025 1.00 28.26 N +ATOM 3665 CA LEU C 170 -20.748 25.147 6.315 1.00 28.42 C +ATOM 3666 C LEU C 170 -20.546 26.181 7.426 1.00 29.55 C +ATOM 3667 O LEU C 170 -21.461 26.441 8.203 1.00 31.26 O +ATOM 3668 CB LEU C 170 -20.029 23.842 6.680 1.00 28.15 C +ATOM 3669 CG LEU C 170 -20.226 23.298 8.102 1.00 29.94 C +ATOM 3670 CD1 LEU C 170 -21.711 23.032 8.357 1.00 27.17 C +ATOM 3671 CD2 LEU C 170 -19.402 22.014 8.279 1.00 28.47 C +ATOM 3672 N LEU C 171 -19.356 26.776 7.492 1.00 29.33 N +ATOM 3673 CA LEU C 171 -19.059 27.761 8.530 1.00 31.78 C +ATOM 3674 C LEU C 171 -19.968 28.987 8.451 1.00 32.75 C +ATOM 3675 O LEU C 171 -20.336 29.557 9.481 1.00 30.15 O +ATOM 3676 CB LEU C 171 -17.577 28.193 8.469 1.00 29.67 C +ATOM 3677 CG LEU C 171 -16.528 27.086 8.685 1.00 30.03 C +ATOM 3678 CD1 LEU C 171 -15.135 27.690 8.729 1.00 29.74 C +ATOM 3679 CD2 LEU C 171 -16.810 26.342 9.985 1.00 28.85 C +ATOM 3680 N ILE C 172 -20.321 29.392 7.233 1.00 33.81 N +ATOM 3681 CA ILE C 172 -21.201 30.534 7.045 1.00 34.93 C +ATOM 3682 C ILE C 172 -22.594 30.164 7.546 1.00 35.83 C +ATOM 3683 O ILE C 172 -23.268 30.965 8.188 1.00 36.20 O +ATOM 3684 CB ILE C 172 -21.267 30.969 5.544 1.00 36.32 C +ATOM 3685 CG1 ILE C 172 -20.408 32.231 5.335 1.00 35.17 C +ATOM 3686 CG2 ILE C 172 -22.720 31.235 5.133 1.00 34.97 C +ATOM 3687 CD1 ILE C 172 -20.391 32.738 3.908 0.00 35.57 C +ATOM 3688 N ASP C 173 -23.010 28.936 7.262 1.00 36.43 N +ATOM 3689 CA ASP C 173 -24.310 28.456 7.692 1.00 37.07 C +ATOM 3690 C ASP C 173 -24.398 28.324 9.219 1.00 37.32 C +ATOM 3691 O ASP C 173 -25.457 28.553 9.808 1.00 39.16 O +ATOM 3692 CB ASP C 173 -24.616 27.111 7.023 1.00 38.96 C +ATOM 3693 CG ASP C 173 -26.055 26.669 7.238 1.00 44.32 C +ATOM 3694 OD1 ASP C 173 -26.307 25.850 8.142 1.00 43.97 O +ATOM 3695 OD2 ASP C 173 -26.946 27.157 6.507 1.00 49.96 O +ATOM 3696 N LEU C 174 -23.293 27.964 9.864 1.00 34.54 N +ATOM 3697 CA LEU C 174 -23.289 27.819 11.315 1.00 33.51 C +ATOM 3698 C LEU C 174 -23.450 29.171 11.992 1.00 35.15 C +ATOM 3699 O LEU C 174 -24.118 29.287 13.016 1.00 33.62 O +ATOM 3700 CB LEU C 174 -21.985 27.172 11.797 1.00 31.30 C +ATOM 3701 CG LEU C 174 -21.710 25.718 11.414 1.00 31.46 C +ATOM 3702 CD1 LEU C 174 -20.360 25.270 11.992 1.00 32.16 C +ATOM 3703 CD2 LEU C 174 -22.837 24.837 11.941 1.00 32.38 C +ATOM 3704 N ALA C 175 -22.832 30.195 11.416 1.00 36.86 N +ATOM 3705 CA ALA C 175 -22.899 31.536 11.982 1.00 39.32 C +ATOM 3706 C ALA C 175 -24.187 32.276 11.636 1.00 41.31 C +ATOM 3707 O ALA C 175 -24.754 32.967 12.478 1.00 42.66 O +ATOM 3708 CB ALA C 175 -21.684 32.360 11.525 1.00 36.70 C +ATOM 3709 N GLN C 176 -24.655 32.128 10.403 1.00 45.22 N +ATOM 3710 CA GLN C 176 -25.864 32.824 9.976 1.00 49.68 C +ATOM 3711 C GLN C 176 -27.167 32.117 10.316 1.00 50.73 C +ATOM 3712 O GLN C 176 -28.150 32.765 10.646 1.00 53.06 O +ATOM 3713 CB GLN C 176 -25.812 33.104 8.468 1.00 50.66 C +ATOM 3714 CG GLN C 176 -24.701 34.069 8.052 1.00 54.61 C +ATOM 3715 CD GLN C 176 -24.708 34.385 6.557 1.00 57.21 C +ATOM 3716 OE1 GLN C 176 -23.908 35.196 6.076 1.00 56.58 O +ATOM 3717 NE2 GLN C 176 -25.613 33.745 5.817 1.00 58.71 N +ATOM 3718 N SER C 177 -27.180 30.793 10.256 1.00 53.27 N +ATOM 3719 CA SER C 177 -28.404 30.051 10.540 1.00 54.35 C +ATOM 3720 C SER C 177 -28.536 29.511 11.955 1.00 54.14 C +ATOM 3721 O SER C 177 -29.636 29.482 12.501 1.00 56.73 O +ATOM 3722 CB SER C 177 -28.551 28.890 9.555 1.00 55.42 C +ATOM 3723 OG SER C 177 -28.502 29.359 8.219 1.00 60.11 O +ATOM 3724 N GLN C 178 -27.429 29.082 12.552 1.00 53.23 N +ATOM 3725 CA GLN C 178 -27.478 28.516 13.896 1.00 51.94 C +ATOM 3726 C GLN C 178 -26.944 29.465 14.953 1.00 52.01 C +ATOM 3727 O GLN C 178 -26.690 29.061 16.081 1.00 53.91 O +ATOM 3728 CB GLN C 178 -26.687 27.210 13.927 1.00 51.65 C +ATOM 3729 CG GLN C 178 -26.925 26.335 12.697 1.00 55.06 C +ATOM 3730 CD GLN C 178 -28.381 25.912 12.530 1.00 57.63 C +ATOM 3731 OE1 GLN C 178 -28.789 25.462 11.456 1.00 58.44 O +ATOM 3732 NE2 GLN C 178 -29.166 26.042 13.597 1.00 57.31 N +ATOM 3733 N ASN C 179 -26.791 30.729 14.580 1.00 52.74 N +ATOM 3734 CA ASN C 179 -26.270 31.768 15.467 1.00 54.48 C +ATOM 3735 C ASN C 179 -25.064 31.330 16.292 1.00 53.06 C +ATOM 3736 O ASN C 179 -25.030 31.519 17.508 1.00 54.53 O +ATOM 3737 CB ASN C 179 -27.353 32.299 16.418 1.00 58.46 C +ATOM 3738 CG ASN C 179 -27.004 33.687 16.983 1.00 62.84 C +ATOM 3739 OD1 ASN C 179 -27.482 34.085 18.051 1.00 64.37 O +ATOM 3740 ND2 ASN C 179 -26.178 34.431 16.251 1.00 63.43 N +ATOM 3741 N MET C 180 -24.085 30.725 15.628 1.00 49.47 N +ATOM 3742 CA MET C 180 -22.857 30.314 16.289 1.00 44.15 C +ATOM 3743 C MET C 180 -21.812 31.373 15.970 1.00 41.60 C +ATOM 3744 O MET C 180 -21.984 32.155 15.035 1.00 40.64 O +ATOM 3745 CB MET C 180 -22.375 28.971 15.754 1.00 47.24 C +ATOM 3746 CG MET C 180 -23.112 27.766 16.305 1.00 49.64 C +ATOM 3747 SD MET C 180 -22.173 26.270 15.990 1.00 52.55 S +ATOM 3748 CE MET C 180 -23.240 25.460 14.887 1.00 53.80 C +ATOM 3749 N THR C 181 -20.745 31.422 16.760 1.00 37.54 N +ATOM 3750 CA THR C 181 -19.667 32.361 16.512 1.00 34.14 C +ATOM 3751 C THR C 181 -18.496 31.494 16.058 1.00 34.61 C +ATOM 3752 O THR C 181 -18.189 30.478 16.684 1.00 34.63 O +ATOM 3753 CB THR C 181 -19.308 33.151 17.774 1.00 35.19 C +ATOM 3754 OG1 THR C 181 -20.452 33.907 18.190 1.00 37.90 O +ATOM 3755 CG2 THR C 181 -18.156 34.118 17.501 1.00 31.38 C +ATOM 3756 N VAL C 182 -17.856 31.887 14.961 1.00 32.57 N +ATOM 3757 CA VAL C 182 -16.765 31.107 14.399 1.00 29.88 C +ATOM 3758 C VAL C 182 -15.408 31.785 14.369 1.00 29.28 C +ATOM 3759 O VAL C 182 -15.298 32.958 14.011 1.00 31.56 O +ATOM 3760 CB VAL C 182 -17.111 30.674 12.952 1.00 30.39 C +ATOM 3761 CG1 VAL C 182 -15.939 29.929 12.321 1.00 26.29 C +ATOM 3762 CG2 VAL C 182 -18.362 29.806 12.960 1.00 27.83 C +ATOM 3763 N VAL C 183 -14.380 31.029 14.753 1.00 27.86 N +ATOM 3764 CA VAL C 183 -12.993 31.494 14.727 1.00 26.64 C +ATOM 3765 C VAL C 183 -12.172 30.367 14.070 1.00 28.72 C +ATOM 3766 O VAL C 183 -12.136 29.238 14.575 1.00 27.53 O +ATOM 3767 CB VAL C 183 -12.412 31.733 16.138 1.00 27.75 C +ATOM 3768 CG1 VAL C 183 -10.990 32.269 16.020 1.00 24.40 C +ATOM 3769 CG2 VAL C 183 -13.295 32.702 16.933 1.00 25.76 C +ATOM 3770 N PHE C 184 -11.538 30.669 12.937 1.00 26.43 N +ATOM 3771 CA PHE C 184 -10.719 29.686 12.243 1.00 26.70 C +ATOM 3772 C PHE C 184 -9.406 30.320 11.806 1.00 25.53 C +ATOM 3773 O PHE C 184 -9.344 31.521 11.563 1.00 25.90 O +ATOM 3774 CB PHE C 184 -11.468 29.084 11.034 1.00 25.54 C +ATOM 3775 CG PHE C 184 -11.616 30.019 9.859 1.00 29.09 C +ATOM 3776 CD1 PHE C 184 -12.475 31.121 9.920 1.00 28.67 C +ATOM 3777 CD2 PHE C 184 -10.908 29.786 8.675 1.00 27.23 C +ATOM 3778 CE1 PHE C 184 -12.627 31.977 8.812 1.00 28.48 C +ATOM 3779 CE2 PHE C 184 -11.053 30.634 7.562 1.00 25.81 C +ATOM 3780 CZ PHE C 184 -11.910 31.727 7.631 1.00 27.24 C +ATOM 3781 N THR C 185 -8.355 29.506 11.738 1.00 26.66 N +ATOM 3782 CA THR C 185 -7.031 29.972 11.332 1.00 26.48 C +ATOM 3783 C THR C 185 -6.859 29.604 9.865 1.00 27.68 C +ATOM 3784 O THR C 185 -7.415 28.608 9.404 1.00 26.46 O +ATOM 3785 CB THR C 185 -5.891 29.323 12.198 1.00 27.44 C +ATOM 3786 OG1 THR C 185 -5.895 27.898 12.050 1.00 30.38 O +ATOM 3787 CG2 THR C 185 -6.097 29.646 13.668 1.00 25.94 C +ATOM 3788 N THR C 186 -6.103 30.419 9.133 1.00 29.10 N +ATOM 3789 CA THR C 186 -5.885 30.204 7.709 1.00 27.61 C +ATOM 3790 C THR C 186 -4.701 31.038 7.210 1.00 28.40 C +ATOM 3791 O THR C 186 -4.247 31.961 7.891 1.00 27.41 O +ATOM 3792 CB THR C 186 -7.156 30.623 6.907 1.00 31.65 C +ATOM 3793 OG1 THR C 186 -6.966 30.379 5.507 1.00 36.64 O +ATOM 3794 CG2 THR C 186 -7.435 32.103 7.101 1.00 30.64 C +ATOM 3795 N HIS C 187 -4.201 30.702 6.022 1.00 28.08 N +ATOM 3796 CA HIS C 187 -3.108 31.451 5.414 1.00 30.75 C +ATOM 3797 C HIS C 187 -3.586 31.907 4.037 1.00 30.23 C +ATOM 3798 O HIS C 187 -2.812 32.454 3.256 1.00 30.13 O +ATOM 3799 CB HIS C 187 -1.844 30.590 5.254 1.00 30.97 C +ATOM 3800 CG HIS C 187 -2.064 29.324 4.485 1.00 36.15 C +ATOM 3801 ND1 HIS C 187 -2.334 28.119 5.097 1.00 39.25 N +ATOM 3802 CD2 HIS C 187 -2.096 29.083 3.152 1.00 36.15 C +ATOM 3803 CE1 HIS C 187 -2.526 27.191 4.175 1.00 37.70 C +ATOM 3804 NE2 HIS C 187 -2.388 27.750 2.987 1.00 38.95 N +ATOM 3805 N GLN C 188 -4.874 31.702 3.771 1.00 27.97 N +ATOM 3806 CA GLN C 188 -5.471 32.035 2.483 1.00 32.14 C +ATOM 3807 C GLN C 188 -6.434 33.233 2.478 1.00 30.83 C +ATOM 3808 O GLN C 188 -7.609 33.106 2.825 1.00 31.92 O +ATOM 3809 CB GLN C 188 -6.181 30.788 1.935 1.00 33.48 C +ATOM 3810 CG GLN C 188 -5.224 29.670 1.504 1.00 40.25 C +ATOM 3811 CD GLN C 188 -5.917 28.323 1.323 1.00 45.61 C +ATOM 3812 OE1 GLN C 188 -6.042 27.540 2.270 1.00 49.20 O +ATOM 3813 NE2 GLN C 188 -6.381 28.052 0.102 1.00 49.36 N +ATOM 3814 N PRO C 189 -5.951 34.407 2.049 1.00 28.92 N +ATOM 3815 CA PRO C 189 -6.795 35.605 2.011 1.00 29.35 C +ATOM 3816 C PRO C 189 -8.119 35.509 1.244 1.00 28.40 C +ATOM 3817 O PRO C 189 -9.101 36.139 1.636 1.00 29.97 O +ATOM 3818 CB PRO C 189 -5.853 36.685 1.455 1.00 30.34 C +ATOM 3819 CG PRO C 189 -4.818 35.913 0.696 1.00 31.93 C +ATOM 3820 CD PRO C 189 -4.589 34.704 1.573 1.00 30.88 C +ATOM 3821 N ASN C 190 -8.166 34.739 0.162 1.00 25.71 N +ATOM 3822 CA ASN C 190 -9.420 34.616 -0.588 1.00 27.15 C +ATOM 3823 C ASN C 190 -10.508 33.954 0.268 1.00 27.93 C +ATOM 3824 O ASN C 190 -11.689 34.274 0.139 1.00 28.63 O +ATOM 3825 CB ASN C 190 -9.225 33.796 -1.876 1.00 26.69 C +ATOM 3826 CG ASN C 190 -8.400 34.528 -2.935 1.00 25.55 C +ATOM 3827 OD1 ASN C 190 -8.140 33.985 -4.012 1.00 27.43 O +ATOM 3828 ND2 ASN C 190 -7.983 35.749 -2.635 1.00 21.51 N +ATOM 3829 N GLN C 191 -10.108 33.026 1.138 1.00 26.09 N +ATOM 3830 CA GLN C 191 -11.067 32.346 2.000 1.00 28.77 C +ATOM 3831 C GLN C 191 -11.544 33.291 3.094 1.00 28.07 C +ATOM 3832 O GLN C 191 -12.661 33.164 3.592 1.00 28.38 O +ATOM 3833 CB GLN C 191 -10.447 31.073 2.603 1.00 27.56 C +ATOM 3834 CG GLN C 191 -10.113 30.049 1.525 1.00 29.17 C +ATOM 3835 CD GLN C 191 -9.634 28.718 2.067 1.00 33.19 C +ATOM 3836 OE1 GLN C 191 -9.403 28.561 3.268 1.00 33.01 O +ATOM 3837 NE2 GLN C 191 -9.473 27.750 1.173 1.00 31.15 N +ATOM 3838 N VAL C 192 -10.698 34.254 3.440 1.00 27.05 N +ATOM 3839 CA VAL C 192 -11.031 35.239 4.460 1.00 26.67 C +ATOM 3840 C VAL C 192 -12.109 36.191 3.932 1.00 29.64 C +ATOM 3841 O VAL C 192 -13.117 36.420 4.592 1.00 28.77 O +ATOM 3842 CB VAL C 192 -9.780 36.044 4.868 1.00 26.68 C +ATOM 3843 CG1 VAL C 192 -10.155 37.145 5.822 1.00 22.44 C +ATOM 3844 CG2 VAL C 192 -8.741 35.098 5.510 1.00 23.24 C +ATOM 3845 N VAL C 193 -11.911 36.725 2.730 1.00 30.44 N +ATOM 3846 CA VAL C 193 -12.894 37.636 2.165 1.00 30.39 C +ATOM 3847 C VAL C 193 -14.181 36.873 1.849 1.00 30.35 C +ATOM 3848 O VAL C 193 -15.269 37.439 1.853 1.00 31.84 O +ATOM 3849 CB VAL C 193 -12.355 38.329 0.875 1.00 32.92 C +ATOM 3850 CG1 VAL C 193 -12.518 37.409 -0.345 1.00 29.27 C +ATOM 3851 CG2 VAL C 193 -13.079 39.656 0.660 1.00 32.14 C +ATOM 3852 N ALA C 194 -14.059 35.577 1.591 1.00 31.17 N +ATOM 3853 CA ALA C 194 -15.232 34.761 1.278 1.00 28.70 C +ATOM 3854 C ALA C 194 -16.217 34.584 2.435 1.00 29.97 C +ATOM 3855 O ALA C 194 -17.428 34.602 2.218 1.00 31.73 O +ATOM 3856 CB ALA C 194 -14.795 33.394 0.786 1.00 27.81 C +ATOM 3857 N ILE C 195 -15.723 34.426 3.664 1.00 28.30 N +ATOM 3858 CA ILE C 195 -16.645 34.183 4.770 1.00 27.63 C +ATOM 3859 C ILE C 195 -16.437 34.913 6.096 1.00 27.47 C +ATOM 3860 O ILE C 195 -17.278 34.822 6.982 1.00 28.24 O +ATOM 3861 CB ILE C 195 -16.690 32.665 5.099 1.00 28.00 C +ATOM 3862 CG1 ILE C 195 -15.394 32.236 5.812 1.00 25.76 C +ATOM 3863 CG2 ILE C 195 -16.867 31.855 3.813 1.00 23.91 C +ATOM 3864 CD1 ILE C 195 -15.376 30.782 6.237 0.00 26.57 C +ATOM 3865 N ALA C 196 -15.333 35.627 6.249 1.00 25.27 N +ATOM 3866 CA ALA C 196 -15.066 36.294 7.515 1.00 26.77 C +ATOM 3867 C ALA C 196 -15.357 37.792 7.535 1.00 27.67 C +ATOM 3868 O ALA C 196 -14.739 38.554 6.796 1.00 27.22 O +ATOM 3869 CB ALA C 196 -13.608 36.048 7.927 1.00 21.13 C +ATOM 3870 N ASN C 197 -16.275 38.213 8.400 1.00 26.34 N +ATOM 3871 CA ASN C 197 -16.595 39.632 8.515 1.00 28.52 C +ATOM 3872 C ASN C 197 -15.541 40.336 9.373 1.00 28.61 C +ATOM 3873 O ASN C 197 -15.409 41.551 9.315 1.00 32.04 O +ATOM 3874 CB ASN C 197 -18.014 39.840 9.093 1.00 27.96 C +ATOM 3875 CG ASN C 197 -18.186 39.257 10.490 1.00 31.54 C +ATOM 3876 OD1 ASN C 197 -17.883 38.084 10.737 1.00 33.67 O +ATOM 3877 ND2 ASN C 197 -18.691 40.075 11.412 1.00 32.12 N +ATOM 3878 N LYS C 198 -14.783 39.566 10.153 1.00 30.84 N +ATOM 3879 CA LYS C 198 -13.708 40.107 11.000 1.00 29.65 C +ATOM 3880 C LYS C 198 -12.430 39.311 10.733 1.00 29.79 C +ATOM 3881 O LYS C 198 -12.495 38.105 10.486 1.00 29.71 O +ATOM 3882 CB LYS C 198 -14.044 39.966 12.493 1.00 29.30 C +ATOM 3883 CG LYS C 198 -15.327 40.645 12.965 1.00 34.09 C +ATOM 3884 CD LYS C 198 -15.233 42.154 12.914 1.00 36.25 C +ATOM 3885 CE LYS C 198 -16.555 42.804 13.332 1.00 38.42 C +ATOM 3886 NZ LYS C 198 -16.972 42.450 14.719 1.00 38.38 N +ATOM 3887 N THR C 199 -11.273 39.971 10.763 1.00 29.50 N +ATOM 3888 CA THR C 199 -10.015 39.253 10.571 1.00 30.47 C +ATOM 3889 C THR C 199 -8.887 39.799 11.444 1.00 31.44 C +ATOM 3890 O THR C 199 -8.827 40.991 11.751 1.00 31.59 O +ATOM 3891 CB THR C 199 -9.537 39.200 9.058 1.00 32.68 C +ATOM 3892 OG1 THR C 199 -8.303 39.908 8.896 1.00 36.32 O +ATOM 3893 CG2 THR C 199 -10.551 39.779 8.136 1.00 30.19 C +ATOM 3894 N LEU C 200 -8.000 38.896 11.850 1.00 31.15 N +ATOM 3895 CA LEU C 200 -6.861 39.230 12.689 1.00 31.52 C +ATOM 3896 C LEU C 200 -5.625 38.798 11.917 1.00 32.65 C +ATOM 3897 O LEU C 200 -5.493 37.620 11.575 1.00 32.84 O +ATOM 3898 CB LEU C 200 -6.937 38.441 14.005 1.00 33.43 C +ATOM 3899 CG LEU C 200 -6.013 38.762 15.187 1.00 34.52 C +ATOM 3900 CD1 LEU C 200 -6.115 37.644 16.201 1.00 35.27 C +ATOM 3901 CD2 LEU C 200 -4.587 38.909 14.737 1.00 37.71 C +ATOM 3902 N LEU C 201 -4.730 39.740 11.638 1.00 33.16 N +ATOM 3903 CA LEU C 201 -3.500 39.438 10.915 1.00 36.52 C +ATOM 3904 C LEU C 201 -2.350 39.290 11.899 1.00 40.15 C +ATOM 3905 O LEU C 201 -2.098 40.196 12.699 1.00 39.49 O +ATOM 3906 CB LEU C 201 -3.153 40.558 9.927 1.00 38.42 C +ATOM 3907 CG LEU C 201 -4.085 40.882 8.761 1.00 38.26 C +ATOM 3908 CD1 LEU C 201 -3.404 41.910 7.864 1.00 37.61 C +ATOM 3909 CD2 LEU C 201 -4.395 39.626 7.970 1.00 38.33 C +ATOM 3910 N LEU C 202 -1.656 38.155 11.842 1.00 42.64 N +ATOM 3911 CA LEU C 202 -0.523 37.903 12.729 1.00 47.03 C +ATOM 3912 C LEU C 202 0.797 37.957 11.965 1.00 50.17 C +ATOM 3913 O LEU C 202 1.087 37.079 11.156 1.00 50.18 O +ATOM 3914 CB LEU C 202 -0.651 36.534 13.393 1.00 48.30 C +ATOM 3915 CG LEU C 202 -1.771 36.274 14.400 1.00 49.67 C +ATOM 3916 CD1 LEU C 202 -1.563 34.879 14.992 1.00 48.98 C +ATOM 3917 CD2 LEU C 202 -1.758 37.326 15.506 1.00 49.14 C +ATOM 3918 N ASN C 203 1.598 38.981 12.239 1.00 54.30 N +ATOM 3919 CA ASN C 203 2.885 39.157 11.575 1.00 59.01 C +ATOM 3920 C ASN C 203 3.987 39.577 12.545 1.00 62.17 C +ATOM 3921 O ASN C 203 3.975 40.702 13.041 1.00 62.35 O +ATOM 3922 CB ASN C 203 2.760 40.227 10.493 1.00 60.54 C +ATOM 3923 CG ASN C 203 4.076 40.499 9.786 1.00 60.82 C +ATOM 3924 OD1 ASN C 203 4.382 41.641 9.444 1.00 59.93 O +ATOM 3925 ND2 ASN C 203 4.855 39.445 9.549 1.00 60.48 N +ATOM 3926 N LYS C 204 4.934 38.675 12.804 1.00 66.50 N +ATOM 3927 CA LYS C 204 6.069 38.944 13.699 1.00 70.06 C +ATOM 3928 C LYS C 204 5.744 39.899 14.855 1.00 71.56 C +ATOM 3929 O LYS C 204 5.911 41.117 14.730 1.00 71.70 O +ATOM 3930 CB LYS C 204 7.239 39.530 12.896 1.00 72.18 C +ATOM 3931 CG LYS C 204 7.859 38.589 11.867 1.00 75.06 C +ATOM 3932 CD LYS C 204 8.938 37.703 12.484 1.00 78.17 C +ATOM 3933 CE LYS C 204 10.158 38.517 12.923 1.00 78.52 C +ATOM 3934 NZ LYS C 204 11.217 37.673 13.559 1.00 78.69 N +ATOM 3935 N GLN C 205 5.293 39.346 15.978 1.00 72.01 N +ATOM 3936 CA GLN C 205 4.953 40.149 17.154 1.00 72.62 C +ATOM 3937 C GLN C 205 3.964 41.287 16.887 1.00 71.81 C +ATOM 3938 O GLN C 205 3.503 41.941 17.825 1.00 73.46 O +ATOM 3939 CB GLN C 205 6.222 40.723 17.795 1.00 72.97 C +ATOM 3940 CG GLN C 205 7.121 39.674 18.421 1.00 74.43 C +ATOM 3941 CD GLN C 205 8.294 40.270 19.180 1.00 75.25 C +ATOM 3942 OE1 GLN C 205 9.108 39.545 19.755 1.00 75.62 O +ATOM 3943 NE2 GLN C 205 8.383 41.595 19.189 1.00 76.03 N +ATOM 3944 N ASN C 206 3.644 41.529 15.618 1.00 70.27 N +ATOM 3945 CA ASN C 206 2.701 42.584 15.257 1.00 68.84 C +ATOM 3946 C ASN C 206 1.394 41.980 14.769 1.00 65.79 C +ATOM 3947 O ASN C 206 1.342 40.808 14.398 1.00 64.49 O +ATOM 3948 CB ASN C 206 3.281 43.493 14.169 1.00 71.54 C +ATOM 3949 CG ASN C 206 4.477 44.286 14.652 1.00 74.34 C +ATOM 3950 OD1 ASN C 206 5.559 43.736 14.860 1.00 75.86 O +ATOM 3951 ND2 ASN C 206 4.285 45.587 14.843 1.00 75.29 N +ATOM 3952 N PHE C 207 0.342 42.792 14.763 1.00 62.89 N +ATOM 3953 CA PHE C 207 -0.967 42.324 14.340 1.00 59.12 C +ATOM 3954 C PHE C 207 -1.903 43.462 13.961 1.00 56.45 C +ATOM 3955 O PHE C 207 -1.579 44.635 14.125 1.00 56.83 O +ATOM 3956 CB PHE C 207 -1.599 41.498 15.460 1.00 59.02 C +ATOM 3957 CG PHE C 207 -1.727 42.239 16.756 1.00 59.88 C +ATOM 3958 CD1 PHE C 207 -2.629 43.292 16.887 1.00 60.96 C +ATOM 3959 CD2 PHE C 207 -0.933 41.898 17.847 1.00 61.34 C +ATOM 3960 CE1 PHE C 207 -2.740 43.996 18.084 1.00 59.84 C +ATOM 3961 CE2 PHE C 207 -1.035 42.595 19.050 1.00 60.70 C +ATOM 3962 CZ PHE C 207 -1.941 43.646 19.166 1.00 60.57 C +ATOM 3963 N LYS C 208 -3.068 43.088 13.447 1.00 52.23 N +ATOM 3964 CA LYS C 208 -4.098 44.034 13.046 1.00 48.88 C +ATOM 3965 C LYS C 208 -5.445 43.331 13.130 1.00 45.29 C +ATOM 3966 O LYS C 208 -5.605 42.207 12.653 1.00 44.00 O +ATOM 3967 CB LYS C 208 -3.871 44.528 11.614 1.00 49.83 C +ATOM 3968 CG LYS C 208 -2.734 45.509 11.457 1.00 51.23 C +ATOM 3969 CD LYS C 208 -2.710 46.080 10.049 1.00 54.18 C +ATOM 3970 CE LYS C 208 -1.613 47.125 9.889 1.00 55.93 C +ATOM 3971 NZ LYS C 208 -1.829 48.297 10.784 1.00 57.29 N +ATOM 3972 N PHE C 209 -6.408 43.998 13.747 1.00 40.89 N +ATOM 3973 CA PHE C 209 -7.738 43.445 13.905 1.00 38.58 C +ATOM 3974 C PHE C 209 -8.781 44.476 13.505 1.00 38.90 C +ATOM 3975 O PHE C 209 -8.587 45.671 13.710 1.00 40.23 O +ATOM 3976 CB PHE C 209 -7.976 43.052 15.359 1.00 35.07 C +ATOM 3977 CG PHE C 209 -9.391 42.651 15.642 1.00 33.35 C +ATOM 3978 CD1 PHE C 209 -9.846 41.379 15.318 1.00 32.15 C +ATOM 3979 CD2 PHE C 209 -10.282 43.561 16.190 1.00 31.92 C +ATOM 3980 CE1 PHE C 209 -11.177 41.015 15.538 1.00 33.15 C +ATOM 3981 CE2 PHE C 209 -11.607 43.213 16.412 1.00 33.04 C +ATOM 3982 CZ PHE C 209 -12.060 41.934 16.085 1.00 34.08 C +ATOM 3983 N GLY C 210 -9.891 44.002 12.950 1.00 38.56 N +ATOM 3984 CA GLY C 210 -10.957 44.892 12.544 1.00 37.51 C +ATOM 3985 C GLY C 210 -11.844 44.269 11.487 1.00 37.85 C +ATOM 3986 O GLY C 210 -11.824 43.052 11.282 1.00 38.34 O +ATOM 3987 N GLU C 211 -12.635 45.109 10.828 1.00 36.22 N +ATOM 3988 CA GLU C 211 -13.522 44.659 9.765 1.00 36.25 C +ATOM 3989 C GLU C 211 -12.636 44.134 8.653 1.00 33.40 C +ATOM 3990 O GLU C 211 -11.617 44.739 8.322 1.00 33.32 O +ATOM 3991 CB GLU C 211 -14.366 45.823 9.238 1.00 40.35 C +ATOM 3992 CG GLU C 211 -15.171 46.524 10.309 1.00 45.99 C +ATOM 3993 CD GLU C 211 -16.000 45.547 11.100 1.00 50.10 C +ATOM 3994 OE1 GLU C 211 -16.751 44.770 10.472 1.00 55.17 O +ATOM 3995 OE2 GLU C 211 -15.898 45.545 12.345 1.00 55.16 O +ATOM 3996 N THR C 212 -13.027 43.003 8.085 1.00 30.38 N +ATOM 3997 CA THR C 212 -12.267 42.385 7.014 1.00 27.78 C +ATOM 3998 C THR C 212 -11.906 43.336 5.871 1.00 28.29 C +ATOM 3999 O THR C 212 -10.746 43.393 5.472 1.00 31.21 O +ATOM 4000 CB THR C 212 -13.027 41.168 6.466 1.00 26.33 C +ATOM 4001 OG1 THR C 212 -13.135 40.184 7.508 1.00 24.89 O +ATOM 4002 CG2 THR C 212 -12.301 40.564 5.264 1.00 24.62 C +ATOM 4003 N ARG C 213 -12.878 44.079 5.347 1.00 27.97 N +ATOM 4004 CA ARG C 213 -12.609 45.013 4.247 1.00 29.23 C +ATOM 4005 C ARG C 213 -11.617 46.115 4.627 1.00 30.34 C +ATOM 4006 O ARG C 213 -10.990 46.712 3.756 1.00 29.84 O +ATOM 4007 CB ARG C 213 -13.907 45.659 3.748 1.00 29.91 C +ATOM 4008 CG ARG C 213 -14.907 44.697 3.103 1.00 27.37 C +ATOM 4009 CD ARG C 213 -14.463 44.252 1.718 1.00 28.93 C +ATOM 4010 NE ARG C 213 -15.410 43.298 1.140 1.00 29.04 N +ATOM 4011 CZ ARG C 213 -15.251 42.681 -0.028 1.00 27.79 C +ATOM 4012 NH1 ARG C 213 -16.174 41.827 -0.460 1.00 30.00 N +ATOM 4013 NH2 ARG C 213 -14.179 42.912 -0.764 1.00 26.86 N +ATOM 4014 N ASN C 214 -11.486 46.395 5.921 1.00 32.14 N +ATOM 4015 CA ASN C 214 -10.553 47.420 6.386 1.00 33.71 C +ATOM 4016 C ASN C 214 -9.138 46.834 6.531 1.00 34.33 C +ATOM 4017 O ASN C 214 -8.139 47.529 6.336 1.00 35.12 O +ATOM 4018 CB ASN C 214 -10.991 47.969 7.754 1.00 35.29 C +ATOM 4019 CG ASN C 214 -12.322 48.704 7.707 1.00 40.05 C +ATOM 4020 OD1 ASN C 214 -12.988 48.847 8.737 1.00 40.90 O +ATOM 4021 ND2 ASN C 214 -12.709 49.188 6.523 1.00 38.67 N +ATOM 4022 N ILE C 215 -9.065 45.552 6.872 1.00 32.58 N +ATOM 4023 CA ILE C 215 -7.788 44.885 7.095 1.00 32.94 C +ATOM 4024 C ILE C 215 -7.165 44.195 5.896 1.00 31.25 C +ATOM 4025 O ILE C 215 -5.945 44.246 5.715 1.00 32.66 O +ATOM 4026 CB ILE C 215 -7.916 43.840 8.229 1.00 33.85 C +ATOM 4027 CG1 ILE C 215 -8.383 44.522 9.507 1.00 31.95 C +ATOM 4028 CG2 ILE C 215 -6.577 43.158 8.473 1.00 31.91 C +ATOM 4029 CD1 ILE C 215 -8.526 43.565 10.638 0.00 32.61 C +ATOM 4030 N LEU C 216 -7.990 43.525 5.101 1.00 30.27 N +ATOM 4031 CA LEU C 216 -7.502 42.824 3.919 1.00 30.50 C +ATOM 4032 C LEU C 216 -7.222 43.775 2.791 1.00 29.80 C +ATOM 4033 O LEU C 216 -8.033 43.905 1.887 1.00 32.76 O +ATOM 4034 CB LEU C 216 -8.519 41.817 3.403 1.00 31.21 C +ATOM 4035 CG LEU C 216 -8.634 40.464 4.076 1.00 32.03 C +ATOM 4036 CD1 LEU C 216 -9.459 39.551 3.166 1.00 27.35 C +ATOM 4037 CD2 LEU C 216 -7.249 39.893 4.318 1.00 29.23 C +ATOM 4038 N THR C 217 -6.075 44.426 2.827 1.00 30.11 N +ATOM 4039 CA THR C 217 -5.723 45.368 1.778 1.00 30.68 C +ATOM 4040 C THR C 217 -4.371 44.974 1.205 1.00 31.01 C +ATOM 4041 O THR C 217 -3.615 44.245 1.841 1.00 30.23 O +ATOM 4042 CB THR C 217 -5.637 46.794 2.349 1.00 31.72 C +ATOM 4043 OG1 THR C 217 -4.568 46.854 3.306 1.00 33.25 O +ATOM 4044 CG2 THR C 217 -6.950 47.161 3.053 1.00 30.78 C +ATOM 4045 N SER C 218 -4.076 45.455 0.003 1.00 32.85 N +ATOM 4046 CA SER C 218 -2.811 45.167 -0.653 1.00 35.39 C +ATOM 4047 C SER C 218 -1.660 45.523 0.269 1.00 34.82 C +ATOM 4048 O SER C 218 -0.722 44.745 0.429 1.00 36.14 O +ATOM 4049 CB SER C 218 -2.696 45.967 -1.958 1.00 36.41 C +ATOM 4050 OG SER C 218 -3.698 45.563 -2.877 1.00 40.17 O +ATOM 4051 N GLU C 219 -1.743 46.698 0.883 1.00 35.31 N +ATOM 4052 CA GLU C 219 -0.695 47.163 1.786 1.00 37.14 C +ATOM 4053 C GLU C 219 -0.495 46.259 3.006 1.00 33.78 C +ATOM 4054 O GLU C 219 0.628 45.929 3.361 1.00 31.68 O +ATOM 4055 CB GLU C 219 -0.995 48.599 2.242 1.00 40.73 C +ATOM 4056 CG GLU C 219 -0.054 49.122 3.314 1.00 49.60 C +ATOM 4057 CD GLU C 219 -0.232 50.609 3.586 1.00 56.19 C +ATOM 4058 OE1 GLU C 219 0.384 51.120 4.552 1.00 58.02 O +ATOM 4059 OE2 GLU C 219 -0.982 51.266 2.830 1.00 59.20 O +ATOM 4060 N ASN C 220 -1.582 45.860 3.652 1.00 33.07 N +ATOM 4061 CA ASN C 220 -1.459 45.005 4.821 1.00 32.09 C +ATOM 4062 C ASN C 220 -0.976 43.603 4.447 1.00 30.87 C +ATOM 4063 O ASN C 220 -0.131 43.033 5.123 1.00 28.81 O +ATOM 4064 CB ASN C 220 -2.799 44.937 5.562 1.00 33.31 C +ATOM 4065 CG ASN C 220 -3.058 46.177 6.427 1.00 35.08 C +ATOM 4066 OD1 ASN C 220 -4.172 46.387 6.913 1.00 37.27 O +ATOM 4067 ND2 ASN C 220 -2.028 46.987 6.630 1.00 31.69 N +ATOM 4068 N LEU C 221 -1.486 43.059 3.350 1.00 29.47 N +ATOM 4069 CA LEU C 221 -1.079 41.720 2.946 1.00 30.90 C +ATOM 4070 C LEU C 221 0.367 41.685 2.464 1.00 30.76 C +ATOM 4071 O LEU C 221 1.102 40.739 2.758 1.00 28.42 O +ATOM 4072 CB LEU C 221 -2.029 41.176 1.878 1.00 27.86 C +ATOM 4073 CG LEU C 221 -3.431 40.902 2.441 1.00 29.86 C +ATOM 4074 CD1 LEU C 221 -4.375 40.453 1.331 1.00 26.22 C +ATOM 4075 CD2 LEU C 221 -3.337 39.839 3.534 1.00 27.00 C +ATOM 4076 N THR C 222 0.783 42.725 1.749 1.00 30.24 N +ATOM 4077 CA THR C 222 2.150 42.796 1.256 1.00 28.80 C +ATOM 4078 C THR C 222 3.129 42.831 2.435 1.00 30.63 C +ATOM 4079 O THR C 222 4.186 42.208 2.381 1.00 31.03 O +ATOM 4080 CB THR C 222 2.353 44.044 0.364 1.00 30.77 C +ATOM 4081 OG1 THR C 222 1.527 43.932 -0.804 1.00 27.94 O +ATOM 4082 CG2 THR C 222 3.817 44.176 -0.061 1.00 26.14 C +ATOM 4083 N ALA C 223 2.773 43.548 3.499 1.00 28.64 N +ATOM 4084 CA ALA C 223 3.631 43.621 4.682 1.00 31.39 C +ATOM 4085 C ALA C 223 3.628 42.281 5.427 1.00 31.91 C +ATOM 4086 O ALA C 223 4.649 41.851 5.955 1.00 34.22 O +ATOM 4087 CB ALA C 223 3.159 44.745 5.624 1.00 28.82 C +ATOM 4088 N LEU C 224 2.476 41.630 5.470 1.00 32.12 N +ATOM 4089 CA LEU C 224 2.356 40.341 6.137 1.00 35.33 C +ATOM 4090 C LEU C 224 3.114 39.218 5.411 1.00 35.27 C +ATOM 4091 O LEU C 224 3.815 38.425 6.043 1.00 35.91 O +ATOM 4092 CB LEU C 224 0.880 39.950 6.253 1.00 37.68 C +ATOM 4093 CG LEU C 224 0.604 38.528 6.760 1.00 40.09 C +ATOM 4094 CD1 LEU C 224 1.236 38.357 8.128 1.00 41.73 C +ATOM 4095 CD2 LEU C 224 -0.897 38.286 6.849 1.00 39.60 C +ATOM 4096 N PHE C 225 2.980 39.163 4.088 1.00 32.81 N +ATOM 4097 CA PHE C 225 3.620 38.112 3.296 1.00 32.84 C +ATOM 4098 C PHE C 225 5.024 38.404 2.771 1.00 33.17 C +ATOM 4099 O PHE C 225 5.661 37.528 2.186 1.00 32.46 O +ATOM 4100 CB PHE C 225 2.703 37.719 2.128 1.00 30.15 C +ATOM 4101 CG PHE C 225 1.440 37.017 2.566 1.00 32.23 C +ATOM 4102 CD1 PHE C 225 0.188 37.573 2.314 1.00 29.11 C +ATOM 4103 CD2 PHE C 225 1.507 35.815 3.263 1.00 31.69 C +ATOM 4104 CE1 PHE C 225 -0.969 36.947 2.751 1.00 30.72 C +ATOM 4105 CE2 PHE C 225 0.351 35.180 3.703 1.00 32.63 C +ATOM 4106 CZ PHE C 225 -0.891 35.747 3.447 1.00 31.61 C +ATOM 4107 N HIS C 226 5.508 39.624 2.983 1.00 33.74 N +ATOM 4108 CA HIS C 226 6.846 40.004 2.525 1.00 36.86 C +ATOM 4109 C HIS C 226 7.022 39.693 1.039 1.00 35.38 C +ATOM 4110 O HIS C 226 8.102 39.347 0.574 1.00 36.84 O +ATOM 4111 CB HIS C 226 7.899 39.280 3.367 1.00 37.65 C +ATOM 4112 CG HIS C 226 7.687 39.446 4.836 1.00 42.44 C +ATOM 4113 ND1 HIS C 226 7.784 40.669 5.466 1.00 44.09 N +ATOM 4114 CD2 HIS C 226 7.300 38.562 5.787 1.00 44.95 C +ATOM 4115 CE1 HIS C 226 7.462 40.532 6.740 1.00 44.54 C +ATOM 4116 NE2 HIS C 226 7.163 39.263 6.961 1.00 44.82 N +ATOM 4117 N LEU C 227 5.928 39.847 0.310 1.00 34.76 N +ATOM 4118 CA LEU C 227 5.869 39.619 -1.122 1.00 33.14 C +ATOM 4119 C LEU C 227 4.746 40.545 -1.574 1.00 34.22 C +ATOM 4120 O LEU C 227 3.753 40.696 -0.863 1.00 33.32 O +ATOM 4121 CB LEU C 227 5.470 38.166 -1.401 1.00 33.37 C +ATOM 4122 CG LEU C 227 5.525 37.725 -2.862 1.00 32.95 C +ATOM 4123 CD1 LEU C 227 6.965 37.707 -3.311 1.00 33.02 C +ATOM 4124 CD2 LEU C 227 4.914 36.355 -3.020 1.00 33.95 C +ATOM 4125 N PRO C 228 4.885 41.193 -2.741 1.00 34.25 N +ATOM 4126 CA PRO C 228 3.770 42.064 -3.128 1.00 33.12 C +ATOM 4127 C PRO C 228 2.469 41.291 -3.343 1.00 33.90 C +ATOM 4128 O PRO C 228 2.440 40.245 -3.996 1.00 32.16 O +ATOM 4129 CB PRO C 228 4.275 42.757 -4.403 1.00 33.40 C +ATOM 4130 CG PRO C 228 5.387 41.881 -4.894 1.00 33.83 C +ATOM 4131 CD PRO C 228 6.037 41.354 -3.646 1.00 34.37 C +ATOM 4132 N MET C 229 1.398 41.803 -2.753 1.00 34.82 N +ATOM 4133 CA MET C 229 0.083 41.188 -2.863 1.00 36.56 C +ATOM 4134 C MET C 229 -0.864 42.288 -3.302 1.00 35.75 C +ATOM 4135 O MET C 229 -0.819 43.400 -2.768 1.00 33.94 O +ATOM 4136 CB MET C 229 -0.387 40.661 -1.504 1.00 38.34 C +ATOM 4137 CG MET C 229 0.496 39.600 -0.876 1.00 42.19 C +ATOM 4138 SD MET C 229 0.159 37.945 -1.502 1.00 48.12 S +ATOM 4139 CE MET C 229 -1.616 37.760 -1.035 1.00 36.62 C +ATOM 4140 N PHE C 230 -1.718 41.996 -4.272 1.00 35.14 N +ATOM 4141 CA PHE C 230 -2.656 43.013 -4.702 1.00 38.64 C +ATOM 4142 C PHE C 230 -4.067 42.503 -4.859 1.00 36.18 C +ATOM 4143 O PHE C 230 -4.295 41.373 -5.278 1.00 35.90 O +ATOM 4144 CB PHE C 230 -2.189 43.694 -5.994 1.00 39.81 C +ATOM 4145 CG PHE C 230 -1.929 42.755 -7.130 1.00 44.46 C +ATOM 4146 CD1 PHE C 230 -0.783 41.971 -7.155 1.00 47.51 C +ATOM 4147 CD2 PHE C 230 -2.808 42.694 -8.211 1.00 46.23 C +ATOM 4148 CE1 PHE C 230 -0.507 41.136 -8.250 1.00 48.52 C +ATOM 4149 CE2 PHE C 230 -2.543 41.865 -9.311 1.00 47.43 C +ATOM 4150 CZ PHE C 230 -1.391 41.088 -9.328 1.00 48.13 C +ATOM 4151 N GLU C 231 -5.015 43.351 -4.492 1.00 35.76 N +ATOM 4152 CA GLU C 231 -6.420 43.019 -4.595 1.00 36.00 C +ATOM 4153 C GLU C 231 -6.826 43.127 -6.061 1.00 35.64 C +ATOM 4154 O GLU C 231 -6.392 44.028 -6.768 1.00 35.56 O +ATOM 4155 CB GLU C 231 -7.237 43.985 -3.745 1.00 36.14 C +ATOM 4156 CG GLU C 231 -8.725 43.692 -3.723 1.00 43.14 C +ATOM 4157 CD GLU C 231 -9.499 44.703 -2.896 1.00 46.97 C +ATOM 4158 OE1 GLU C 231 -10.745 44.635 -2.882 1.00 51.51 O +ATOM 4159 OE2 GLU C 231 -8.862 45.567 -2.255 1.00 52.10 O +ATOM 4160 N GLN C 232 -7.649 42.194 -6.514 1.00 36.29 N +ATOM 4161 CA GLN C 232 -8.114 42.186 -7.891 1.00 39.20 C +ATOM 4162 C GLN C 232 -9.622 42.019 -7.949 1.00 38.79 C +ATOM 4163 O GLN C 232 -10.195 41.221 -7.213 1.00 38.82 O +ATOM 4164 CB GLN C 232 -7.456 41.045 -8.670 1.00 42.33 C +ATOM 4165 CG GLN C 232 -6.101 41.393 -9.266 1.00 51.15 C +ATOM 4166 CD GLN C 232 -6.185 41.717 -10.747 1.00 52.96 C +ATOM 4167 OE1 GLN C 232 -5.210 42.150 -11.353 1.00 58.04 O +ATOM 4168 NE2 GLN C 232 -7.355 41.501 -11.336 1.00 57.01 N +ATOM 4169 N GLN C 233 -10.261 42.785 -8.822 1.00 39.40 N +ATOM 4170 CA GLN C 233 -11.702 42.697 -8.998 1.00 38.36 C +ATOM 4171 C GLN C 233 -11.971 41.729 -10.137 1.00 37.56 C +ATOM 4172 O GLN C 233 -11.124 41.506 -11.005 1.00 36.60 O +ATOM 4173 CB GLN C 233 -12.284 44.055 -9.360 1.00 41.26 C +ATOM 4174 CG GLN C 233 -12.114 45.120 -8.304 1.00 47.51 C +ATOM 4175 CD GLN C 233 -12.449 46.495 -8.845 1.00 51.94 C +ATOM 4176 OE1 GLN C 233 -13.528 46.708 -9.398 1.00 55.29 O +ATOM 4177 NE2 GLN C 233 -11.521 47.436 -8.697 1.00 55.17 N +ATOM 4178 N ALA C 234 -13.154 41.144 -10.136 1.00 35.72 N +ATOM 4179 CA ALA C 234 -13.499 40.220 -11.188 1.00 34.43 C +ATOM 4180 C ALA C 234 -15.003 40.059 -11.243 1.00 34.65 C +ATOM 4181 O ALA C 234 -15.719 40.417 -10.304 1.00 34.94 O +ATOM 4182 CB ALA C 234 -12.823 38.868 -10.947 1.00 32.88 C +ATOM 4183 N GLN C 235 -15.469 39.539 -12.366 1.00 36.34 N +ATOM 4184 CA GLN C 235 -16.881 39.279 -12.578 1.00 39.49 C +ATOM 4185 C GLN C 235 -17.004 37.960 -13.302 1.00 38.66 C +ATOM 4186 O GLN C 235 -16.374 37.742 -14.332 1.00 40.32 O +ATOM 4187 CB GLN C 235 -17.535 40.390 -13.400 1.00 41.51 C +ATOM 4188 CG GLN C 235 -18.141 41.492 -12.546 1.00 44.71 C +ATOM 4189 CD GLN C 235 -18.898 42.513 -13.367 1.00 48.50 C +ATOM 4190 OE1 GLN C 235 -18.306 43.435 -13.944 1.00 48.45 O +ATOM 4191 NE2 GLN C 235 -20.220 42.348 -13.438 1.00 48.88 N +ATOM 4192 N TYR C 236 -17.807 37.076 -12.734 1.00 39.01 N +ATOM 4193 CA TYR C 236 -18.046 35.763 -13.288 1.00 36.38 C +ATOM 4194 C TYR C 236 -19.554 35.626 -13.452 1.00 38.50 C +ATOM 4195 O TYR C 236 -20.293 35.599 -12.463 1.00 37.86 O +ATOM 4196 CB TYR C 236 -17.509 34.706 -12.322 1.00 35.47 C +ATOM 4197 CG TYR C 236 -17.919 33.301 -12.660 1.00 34.21 C +ATOM 4198 CD1 TYR C 236 -18.836 32.615 -11.869 1.00 32.76 C +ATOM 4199 CD2 TYR C 236 -17.384 32.651 -13.771 1.00 34.19 C +ATOM 4200 CE1 TYR C 236 -19.209 31.306 -12.174 1.00 35.78 C +ATOM 4201 CE2 TYR C 236 -17.747 31.348 -14.087 1.00 36.00 C +ATOM 4202 CZ TYR C 236 -18.655 30.679 -13.284 1.00 38.31 C +ATOM 4203 OH TYR C 236 -18.978 29.369 -13.574 1.00 41.75 O +ATOM 4204 N LYS C 237 -20.003 35.550 -14.703 1.00 41.68 N +ATOM 4205 CA LYS C 237 -21.425 35.434 -15.017 1.00 43.06 C +ATOM 4206 C LYS C 237 -22.233 36.490 -14.267 1.00 43.63 C +ATOM 4207 O LYS C 237 -23.196 36.163 -13.568 1.00 43.50 O +ATOM 4208 CB LYS C 237 -21.948 34.045 -14.645 1.00 44.41 C +ATOM 4209 CG LYS C 237 -21.296 32.891 -15.395 1.00 49.95 C +ATOM 4210 CD LYS C 237 -22.018 31.580 -15.091 1.00 53.23 C +ATOM 4211 CE LYS C 237 -21.261 30.370 -15.621 1.00 55.63 C +ATOM 4212 NZ LYS C 237 -21.030 30.435 -17.096 1.00 58.49 N +ATOM 4213 N GLU C 238 -21.834 37.753 -14.403 1.00 43.79 N +ATOM 4214 CA GLU C 238 -22.528 38.856 -13.730 1.00 45.92 C +ATOM 4215 C GLU C 238 -22.264 38.976 -12.221 1.00 42.65 C +ATOM 4216 O GLU C 238 -22.690 39.940 -11.596 1.00 41.74 O +ATOM 4217 CB GLU C 238 -24.040 38.757 -13.956 1.00 50.38 C +ATOM 4218 CG GLU C 238 -24.568 39.605 -15.097 1.00 60.42 C +ATOM 4219 CD GLU C 238 -26.086 39.755 -15.054 1.00 65.07 C +ATOM 4220 OE1 GLU C 238 -26.625 40.594 -15.811 1.00 67.48 O +ATOM 4221 OE2 GLU C 238 -26.740 39.033 -14.263 1.00 67.95 O +ATOM 4222 N SER C 239 -21.587 37.996 -11.632 1.00 39.61 N +ATOM 4223 CA SER C 239 -21.279 38.053 -10.210 1.00 37.14 C +ATOM 4224 C SER C 239 -19.931 38.714 -9.954 1.00 34.13 C +ATOM 4225 O SER C 239 -18.887 38.206 -10.362 1.00 32.57 O +ATOM 4226 CB SER C 239 -21.277 36.650 -9.588 1.00 38.73 C +ATOM 4227 OG SER C 239 -22.584 36.269 -9.195 1.00 43.17 O +ATOM 4228 N PHE C 240 -19.967 39.852 -9.272 1.00 32.13 N +ATOM 4229 CA PHE C 240 -18.758 40.590 -8.927 1.00 30.12 C +ATOM 4230 C PHE C 240 -18.119 39.976 -7.687 1.00 28.66 C +ATOM 4231 O PHE C 240 -18.820 39.449 -6.831 1.00 26.11 O +ATOM 4232 CB PHE C 240 -19.112 42.042 -8.625 1.00 28.20 C +ATOM 4233 CG PHE C 240 -17.976 42.838 -8.053 1.00 32.57 C +ATOM 4234 CD1 PHE C 240 -17.028 43.429 -8.887 1.00 32.54 C +ATOM 4235 CD2 PHE C 240 -17.851 43.004 -6.676 1.00 31.65 C +ATOM 4236 CE1 PHE C 240 -15.977 44.177 -8.355 1.00 28.95 C +ATOM 4237 CE2 PHE C 240 -16.800 43.751 -6.140 1.00 33.70 C +ATOM 4238 CZ PHE C 240 -15.865 44.338 -6.983 1.00 31.44 C +ATOM 4239 N PHE C 241 -16.792 40.030 -7.603 1.00 29.69 N +ATOM 4240 CA PHE C 241 -16.080 39.528 -6.434 1.00 29.62 C +ATOM 4241 C PHE C 241 -14.645 40.024 -6.438 1.00 31.03 C +ATOM 4242 O PHE C 241 -14.140 40.464 -7.471 1.00 31.44 O +ATOM 4243 CB PHE C 241 -16.144 37.987 -6.357 1.00 30.42 C +ATOM 4244 CG PHE C 241 -15.340 37.264 -7.415 1.00 33.56 C +ATOM 4245 CD1 PHE C 241 -14.018 36.877 -7.166 1.00 31.54 C +ATOM 4246 CD2 PHE C 241 -15.914 36.932 -8.642 1.00 33.06 C +ATOM 4247 CE1 PHE C 241 -13.283 36.167 -8.121 1.00 32.84 C +ATOM 4248 CE2 PHE C 241 -15.188 36.222 -9.610 1.00 33.45 C +ATOM 4249 CZ PHE C 241 -13.871 35.838 -9.349 1.00 33.61 C +ATOM 4250 N THR C 242 -14.012 40.008 -5.270 1.00 31.70 N +ATOM 4251 CA THR C 242 -12.624 40.423 -5.146 1.00 34.00 C +ATOM 4252 C THR C 242 -11.793 39.233 -4.649 1.00 33.86 C +ATOM 4253 O THR C 242 -12.310 38.326 -3.988 1.00 31.41 O +ATOM 4254 CB THR C 242 -12.455 41.615 -4.159 1.00 38.26 C +ATOM 4255 OG1 THR C 242 -12.749 41.199 -2.822 1.00 38.95 O +ATOM 4256 CG2 THR C 242 -13.392 42.744 -4.529 1.00 44.01 C +ATOM 4257 N HIS C 243 -10.513 39.228 -5.005 1.00 33.30 N +ATOM 4258 CA HIS C 243 -9.591 38.174 -4.591 1.00 31.98 C +ATOM 4259 C HIS C 243 -8.208 38.797 -4.568 1.00 30.83 C +ATOM 4260 O HIS C 243 -8.018 39.906 -5.080 1.00 29.89 O +ATOM 4261 CB HIS C 243 -9.654 36.959 -5.546 1.00 30.59 C +ATOM 4262 CG HIS C 243 -9.302 37.275 -6.964 1.00 33.51 C +ATOM 4263 ND1 HIS C 243 -8.029 37.122 -7.468 1.00 32.14 N +ATOM 4264 CD2 HIS C 243 -10.047 37.786 -7.975 1.00 34.80 C +ATOM 4265 CE1 HIS C 243 -8.003 37.528 -8.725 1.00 32.85 C +ATOM 4266 NE2 HIS C 243 -9.215 37.936 -9.058 1.00 32.81 N +ATOM 4267 N PHE C 244 -7.249 38.097 -3.969 1.00 30.24 N +ATOM 4268 CA PHE C 244 -5.900 38.624 -3.850 1.00 30.07 C +ATOM 4269 C PHE C 244 -4.850 37.784 -4.545 1.00 30.60 C +ATOM 4270 O PHE C 244 -4.837 36.559 -4.417 1.00 29.89 O +ATOM 4271 CB PHE C 244 -5.556 38.784 -2.375 1.00 31.23 C +ATOM 4272 CG PHE C 244 -6.533 39.641 -1.634 1.00 33.58 C +ATOM 4273 CD1 PHE C 244 -7.709 39.100 -1.131 1.00 34.20 C +ATOM 4274 CD2 PHE C 244 -6.317 41.012 -1.509 1.00 35.55 C +ATOM 4275 CE1 PHE C 244 -8.660 39.911 -0.520 1.00 34.76 C +ATOM 4276 CE2 PHE C 244 -7.265 41.830 -0.899 1.00 35.33 C +ATOM 4277 CZ PHE C 244 -8.440 41.274 -0.405 1.00 34.20 C +ATOM 4278 N VAL C 245 -3.961 38.438 -5.286 1.00 28.24 N +ATOM 4279 CA VAL C 245 -2.940 37.684 -5.979 1.00 30.87 C +ATOM 4280 C VAL C 245 -1.507 38.008 -5.546 1.00 31.56 C +ATOM 4281 O VAL C 245 -1.095 39.167 -5.473 1.00 31.50 O +ATOM 4282 CB VAL C 245 -3.111 37.787 -7.545 1.00 31.66 C +ATOM 4283 CG1 VAL C 245 -4.150 38.821 -7.907 1.00 34.41 C +ATOM 4284 CG2 VAL C 245 -1.791 38.088 -8.210 1.00 31.79 C +ATOM 4285 N PRO C 246 -0.741 36.962 -5.212 1.00 30.33 N +ATOM 4286 CA PRO C 246 0.655 37.105 -4.785 1.00 31.64 C +ATOM 4287 C PRO C 246 1.495 37.304 -6.051 1.00 33.13 C +ATOM 4288 O PRO C 246 1.328 36.586 -7.033 1.00 32.87 O +ATOM 4289 CB PRO C 246 0.939 35.780 -4.075 1.00 31.48 C +ATOM 4290 CG PRO C 246 0.109 34.795 -4.865 1.00 31.16 C +ATOM 4291 CD PRO C 246 -1.185 35.555 -5.176 1.00 27.97 C +ATOM 4292 N LEU C 247 2.384 38.287 -6.030 1.00 34.35 N +ATOM 4293 CA LEU C 247 3.204 38.588 -7.194 1.00 37.50 C +ATOM 4294 C LEU C 247 4.573 37.910 -7.166 1.00 37.38 C +ATOM 4295 O LEU C 247 5.546 38.489 -6.680 1.00 37.94 O +ATOM 4296 CB LEU C 247 3.368 40.110 -7.303 1.00 39.63 C +ATOM 4297 CG LEU C 247 3.730 40.745 -8.647 1.00 44.23 C +ATOM 4298 CD1 LEU C 247 5.169 40.441 -8.982 1.00 48.37 C +ATOM 4299 CD2 LEU C 247 2.795 40.239 -9.728 1.00 43.97 C +ATOM 4300 N TYR C 248 4.646 36.685 -7.683 1.00 36.01 N +ATOM 4301 CA TYR C 248 5.917 35.961 -7.724 1.00 36.63 C +ATOM 4302 C TYR C 248 6.819 36.623 -8.744 1.00 37.68 C +ATOM 4303 O TYR C 248 6.379 36.965 -9.837 1.00 39.91 O +ATOM 4304 CB TYR C 248 5.717 34.505 -8.130 1.00 33.75 C +ATOM 4305 CG TYR C 248 4.869 33.717 -7.176 1.00 32.99 C +ATOM 4306 CD1 TYR C 248 3.676 33.137 -7.604 1.00 31.06 C +ATOM 4307 CD2 TYR C 248 5.262 33.534 -5.847 1.00 31.92 C +ATOM 4308 CE1 TYR C 248 2.899 32.392 -6.743 1.00 32.38 C +ATOM 4309 CE2 TYR C 248 4.486 32.785 -4.968 1.00 32.66 C +ATOM 4310 CZ TYR C 248 3.306 32.217 -5.429 1.00 32.85 C +ATOM 4311 OH TYR C 248 2.535 31.454 -4.598 1.00 35.24 O +ATOM 4312 N LYS C 249 8.083 36.791 -8.387 1.00 38.77 N +ATOM 4313 CA LYS C 249 9.042 37.423 -9.269 1.00 41.30 C +ATOM 4314 C LYS C 249 9.038 36.783 -10.662 1.00 42.43 C +ATOM 4315 O LYS C 249 9.195 37.473 -11.666 1.00 43.62 O +ATOM 4316 CB LYS C 249 10.433 37.343 -8.640 1.00 44.09 C +ATOM 4317 CG LYS C 249 11.429 38.330 -9.203 1.00 49.41 C +ATOM 4318 CD LYS C 249 12.772 38.217 -8.494 1.00 54.67 C +ATOM 4319 CE LYS C 249 12.643 38.495 -6.998 1.00 57.69 C +ATOM 4320 NZ LYS C 249 13.969 38.448 -6.308 1.00 60.80 N +ATOM 4321 N THR C 250 8.833 35.470 -10.719 1.00 41.04 N +ATOM 4322 CA THR C 250 8.816 34.745 -11.988 1.00 41.83 C +ATOM 4323 C THR C 250 7.584 35.000 -12.871 1.00 43.75 C +ATOM 4324 O THR C 250 7.578 34.646 -14.054 1.00 41.53 O +ATOM 4325 CB THR C 250 8.932 33.222 -11.753 1.00 40.73 C +ATOM 4326 OG1 THR C 250 8.022 32.832 -10.717 1.00 38.49 O +ATOM 4327 CG2 THR C 250 10.354 32.841 -11.363 1.00 36.43 C +ATOM 4328 N LEU C 251 6.536 35.589 -12.301 1.00 45.22 N +ATOM 4329 CA LEU C 251 5.337 35.879 -13.083 1.00 46.90 C +ATOM 4330 C LEU C 251 5.662 37.018 -14.044 1.00 49.10 C +ATOM 4331 O LEU C 251 5.136 37.079 -15.154 1.00 51.41 O +ATOM 4332 CB LEU C 251 4.173 36.280 -12.169 1.00 44.77 C +ATOM 4333 CG LEU C 251 3.496 35.154 -11.375 1.00 45.07 C +ATOM 4334 CD1 LEU C 251 2.566 35.730 -10.311 1.00 38.42 C +ATOM 4335 CD2 LEU C 251 2.735 34.253 -12.332 1.00 43.24 C +ATOM 4336 N LEU C 252 6.545 37.908 -13.607 1.00 51.44 N +ATOM 4337 CA LEU C 252 6.972 39.054 -14.400 1.00 53.87 C +ATOM 4338 C LEU C 252 7.736 38.627 -15.651 1.00 55.23 C +ATOM 4339 O LEU C 252 7.325 39.037 -16.757 0.00 55.44 O +ATOM 4340 CB LEU C 252 7.845 39.973 -13.541 1.00 53.81 C +ATOM 4341 CG LEU C 252 7.135 41.059 -12.718 1.00 55.90 C +ATOM 4342 CD1 LEU C 252 5.804 40.557 -12.189 1.00 55.94 C +ATOM 4343 CD2 LEU C 252 8.047 41.499 -11.580 1.00 55.82 C +TER 4344 LEU C 252 +ATOM 4345 N SER B 5 37.342 21.962 18.520 1.00 73.14 N +ATOM 4346 CA SER B 5 38.282 21.216 17.637 1.00 73.31 C +ATOM 4347 C SER B 5 38.216 19.716 17.919 1.00 73.52 C +ATOM 4348 O SER B 5 38.547 19.261 19.015 1.00 73.42 O +ATOM 4349 CB SER B 5 39.709 21.723 17.847 1.00 73.31 C +ATOM 4350 OG SER B 5 40.624 21.025 17.023 1.00 73.48 O +ATOM 4351 N TYR B 6 37.791 18.956 16.915 1.00 74.08 N +ATOM 4352 CA TYR B 6 37.657 17.508 17.038 1.00 74.03 C +ATOM 4353 C TYR B 6 38.907 16.817 17.587 1.00 74.45 C +ATOM 4354 O TYR B 6 38.825 16.069 18.563 1.00 74.32 O +ATOM 4355 CB TYR B 6 37.277 16.902 15.681 1.00 72.87 C +ATOM 4356 CG TYR B 6 37.054 15.408 15.724 1.00 72.29 C +ATOM 4357 CD1 TYR B 6 36.045 14.856 16.515 1.00 71.71 C +ATOM 4358 CD2 TYR B 6 37.865 14.543 14.990 1.00 72.33 C +ATOM 4359 CE1 TYR B 6 35.852 13.480 16.575 1.00 71.28 C +ATOM 4360 CE2 TYR B 6 37.679 13.163 15.042 1.00 71.42 C +ATOM 4361 CZ TYR B 6 36.674 12.640 15.836 1.00 71.00 C +ATOM 4362 OH TYR B 6 36.493 11.280 15.893 1.00 70.50 O +ATOM 4363 N PRO B 7 40.078 17.052 16.966 1.00 75.44 N +ATOM 4364 CA PRO B 7 41.331 16.434 17.421 1.00 75.49 C +ATOM 4365 C PRO B 7 41.619 16.662 18.907 1.00 74.90 C +ATOM 4366 O PRO B 7 42.052 15.751 19.610 1.00 74.15 O +ATOM 4367 CB PRO B 7 42.379 17.088 16.525 1.00 76.10 C +ATOM 4368 CG PRO B 7 41.625 17.304 15.248 1.00 75.95 C +ATOM 4369 CD PRO B 7 40.311 17.855 15.750 1.00 75.80 C +ATOM 4370 N LYS B 8 41.378 17.881 19.380 1.00 74.94 N +ATOM 4371 CA LYS B 8 41.622 18.206 20.780 1.00 74.69 C +ATOM 4372 C LYS B 8 40.779 17.326 21.689 1.00 73.47 C +ATOM 4373 O LYS B 8 41.266 16.819 22.700 1.00 73.68 O +ATOM 4374 CB LYS B 8 41.305 19.679 21.051 1.00 75.96 C +ATOM 4375 CG LYS B 8 42.080 20.643 20.167 1.00 76.85 C +ATOM 4376 CD LYS B 8 41.840 22.091 20.562 1.00 77.26 C +ATOM 4377 CE LYS B 8 42.571 23.034 19.619 1.00 77.88 C +ATOM 4378 NZ LYS B 8 44.026 22.708 19.533 1.00 78.39 N +ATOM 4379 N ILE B 9 39.513 17.149 21.322 1.00 72.32 N +ATOM 4380 CA ILE B 9 38.594 16.328 22.101 1.00 69.38 C +ATOM 4381 C ILE B 9 39.122 14.903 22.213 1.00 67.89 C +ATOM 4382 O ILE B 9 39.177 14.345 23.307 1.00 66.50 O +ATOM 4383 CB ILE B 9 37.192 16.287 21.458 1.00 69.64 C +ATOM 4384 CG1 ILE B 9 36.673 17.711 21.240 1.00 69.31 C +ATOM 4385 CG2 ILE B 9 36.232 15.514 22.356 1.00 67.88 C +ATOM 4386 CD1 ILE B 9 35.323 17.778 20.556 0.00 69.42 C +ATOM 4387 N LEU B 10 39.512 14.319 21.082 1.00 67.47 N +ATOM 4388 CA LEU B 10 40.038 12.956 21.075 1.00 68.47 C +ATOM 4389 C LEU B 10 41.267 12.798 21.972 1.00 69.08 C +ATOM 4390 O LEU B 10 41.410 11.785 22.655 1.00 69.00 O +ATOM 4391 CB LEU B 10 40.380 12.519 19.649 1.00 67.72 C +ATOM 4392 CG LEU B 10 39.202 12.323 18.693 1.00 67.34 C +ATOM 4393 CD1 LEU B 10 39.729 11.816 17.366 1.00 67.72 C +ATOM 4394 CD2 LEU B 10 38.207 11.330 19.270 1.00 66.83 C +ATOM 4395 N PHE B 11 42.154 13.791 21.963 1.00 70.03 N +ATOM 4396 CA PHE B 11 43.350 13.753 22.805 1.00 70.86 C +ATOM 4397 C PHE B 11 42.923 13.753 24.263 1.00 69.13 C +ATOM 4398 O PHE B 11 43.327 12.892 25.044 1.00 69.15 O +ATOM 4399 CB PHE B 11 44.236 14.977 22.552 1.00 74.81 C +ATOM 4400 CG PHE B 11 45.261 14.782 21.468 1.00 78.57 C +ATOM 4401 CD1 PHE B 11 44.875 14.458 20.168 1.00 80.53 C +ATOM 4402 CD2 PHE B 11 46.617 14.944 21.745 1.00 80.55 C +ATOM 4403 CE1 PHE B 11 45.829 14.301 19.154 1.00 82.19 C +ATOM 4404 CE2 PHE B 11 47.580 14.790 20.741 1.00 82.20 C +ATOM 4405 CZ PHE B 11 47.185 14.469 19.443 1.00 82.29 C +ATOM 4406 N GLY B 12 42.101 14.733 24.621 1.00 67.23 N +ATOM 4407 CA GLY B 12 41.625 14.838 25.986 1.00 65.83 C +ATOM 4408 C GLY B 12 40.990 13.552 26.473 1.00 65.14 C +ATOM 4409 O GLY B 12 41.204 13.137 27.613 1.00 64.79 O +ATOM 4410 N LEU B 13 40.204 12.918 25.607 1.00 64.20 N +ATOM 4411 CA LEU B 13 39.534 11.674 25.956 1.00 62.68 C +ATOM 4412 C LEU B 13 40.526 10.535 26.124 1.00 62.28 C +ATOM 4413 O LEU B 13 40.450 9.776 27.090 1.00 61.74 O +ATOM 4414 CB LEU B 13 38.495 11.312 24.889 1.00 60.98 C +ATOM 4415 CG LEU B 13 37.197 12.126 24.915 1.00 58.60 C +ATOM 4416 CD1 LEU B 13 36.357 11.776 23.709 1.00 58.16 C +ATOM 4417 CD2 LEU B 13 36.431 11.844 26.198 1.00 57.39 C +ATOM 4418 N THR B 14 41.458 10.421 25.184 1.00 63.06 N +ATOM 4419 CA THR B 14 42.470 9.370 25.232 1.00 63.74 C +ATOM 4420 C THR B 14 43.326 9.519 26.483 1.00 64.58 C +ATOM 4421 O THR B 14 43.708 8.532 27.115 1.00 64.87 O +ATOM 4422 CB THR B 14 43.388 9.426 24.009 1.00 62.70 C +ATOM 4423 OG1 THR B 14 42.600 9.339 22.817 1.00 62.27 O +ATOM 4424 CG2 THR B 14 44.377 8.271 24.040 1.00 63.82 C +ATOM 4425 N LEU B 15 43.620 10.764 26.833 1.00 65.14 N +ATOM 4426 CA LEU B 15 44.422 11.060 28.008 1.00 65.77 C +ATOM 4427 C LEU B 15 43.647 10.605 29.237 1.00 64.91 C +ATOM 4428 O LEU B 15 44.175 9.909 30.105 1.00 65.50 O +ATOM 4429 CB LEU B 15 44.690 12.565 28.080 1.00 67.81 C +ATOM 4430 CG LEU B 15 45.918 13.043 28.861 1.00 69.20 C +ATOM 4431 CD1 LEU B 15 46.011 14.557 28.744 1.00 69.99 C +ATOM 4432 CD2 LEU B 15 45.827 12.617 30.318 1.00 69.48 C +ATOM 4433 N LEU B 16 42.382 11.007 29.295 1.00 64.17 N +ATOM 4434 CA LEU B 16 41.497 10.656 30.397 1.00 62.74 C +ATOM 4435 C LEU B 16 41.389 9.139 30.531 1.00 62.12 C +ATOM 4436 O LEU B 16 41.303 8.597 31.635 1.00 60.66 O +ATOM 4437 CB LEU B 16 40.112 11.244 30.144 1.00 62.89 C +ATOM 4438 CG LEU B 16 39.050 10.984 31.209 1.00 62.62 C +ATOM 4439 CD1 LEU B 16 39.420 11.719 32.490 1.00 61.01 C +ATOM 4440 CD2 LEU B 16 37.697 11.447 30.689 1.00 62.20 C +ATOM 4441 N LEU B 17 41.383 8.457 29.394 1.00 61.39 N +ATOM 4442 CA LEU B 17 41.287 7.010 29.394 1.00 61.22 C +ATOM 4443 C LEU B 17 42.489 6.457 30.149 1.00 62.61 C +ATOM 4444 O LEU B 17 42.344 5.602 31.019 1.00 62.40 O +ATOM 4445 CB LEU B 17 41.249 6.485 27.951 1.00 58.28 C +ATOM 4446 CG LEU B 17 41.112 4.975 27.727 1.00 56.38 C +ATOM 4447 CD1 LEU B 17 40.610 4.706 26.325 1.00 54.45 C +ATOM 4448 CD2 LEU B 17 42.450 4.288 27.964 1.00 56.15 C +ATOM 4449 N VAL B 18 43.674 6.968 29.829 1.00 65.16 N +ATOM 4450 CA VAL B 18 44.902 6.516 30.478 1.00 66.54 C +ATOM 4451 C VAL B 18 44.966 6.897 31.957 1.00 66.98 C +ATOM 4452 O VAL B 18 45.362 6.085 32.794 1.00 67.09 O +ATOM 4453 CB VAL B 18 46.146 7.071 29.758 1.00 67.38 C +ATOM 4454 CG1 VAL B 18 47.407 6.555 30.435 1.00 68.29 C +ATOM 4455 CG2 VAL B 18 46.123 6.657 28.286 1.00 66.68 C +ATOM 4456 N ILE B 19 44.583 8.127 32.284 1.00 67.43 N +ATOM 4457 CA ILE B 19 44.597 8.551 33.677 1.00 68.17 C +ATOM 4458 C ILE B 19 43.723 7.587 34.471 1.00 69.32 C +ATOM 4459 O ILE B 19 44.053 7.209 35.596 1.00 70.60 O +ATOM 4460 CB ILE B 19 44.036 9.981 33.857 1.00 69.01 C +ATOM 4461 CG1 ILE B 19 44.946 10.998 33.165 1.00 68.71 C +ATOM 4462 CG2 ILE B 19 43.912 10.307 35.346 1.00 68.23 C +ATOM 4463 CD1 ILE B 19 44.481 12.435 33.314 0.00 68.99 C +ATOM 4464 N THR B 20 42.608 7.187 33.871 1.00 68.92 N +ATOM 4465 CA THR B 20 41.680 6.264 34.515 1.00 68.10 C +ATOM 4466 C THR B 20 42.307 4.877 34.671 1.00 67.83 C +ATOM 4467 O THR B 20 42.042 4.172 35.645 1.00 65.75 O +ATOM 4468 CB THR B 20 40.371 6.145 33.696 1.00 67.91 C +ATOM 4469 OG1 THR B 20 39.776 7.442 33.557 1.00 67.16 O +ATOM 4470 CG2 THR B 20 39.381 5.219 34.393 1.00 67.78 C +ATOM 4471 N ALA B 21 43.139 4.493 33.707 1.00 68.67 N +ATOM 4472 CA ALA B 21 43.800 3.193 33.735 1.00 70.57 C +ATOM 4473 C ALA B 21 44.788 3.108 34.894 1.00 71.94 C +ATOM 4474 O ALA B 21 44.866 2.090 35.583 1.00 71.70 O +ATOM 4475 CB ALA B 21 44.518 2.944 32.417 1.00 70.26 C +ATOM 4476 N VAL B 22 45.542 4.184 35.102 1.00 72.91 N +ATOM 4477 CA VAL B 22 46.520 4.233 36.182 1.00 73.57 C +ATOM 4478 C VAL B 22 45.830 4.248 37.540 1.00 74.46 C +ATOM 4479 O VAL B 22 46.156 3.450 38.418 1.00 75.58 O +ATOM 4480 CB VAL B 22 47.413 5.474 36.061 1.00 73.79 C +ATOM 4481 CG1 VAL B 22 48.337 5.568 37.266 1.00 73.48 C +ATOM 4482 CG2 VAL B 22 48.217 5.402 34.767 1.00 72.51 C +ATOM 4483 N ILE B 23 44.879 5.158 37.718 1.00 74.87 N +ATOM 4484 CA ILE B 23 44.148 5.229 38.978 1.00 75.40 C +ATOM 4485 C ILE B 23 43.575 3.843 39.254 1.00 75.74 C +ATOM 4486 O ILE B 23 43.277 3.490 40.395 1.00 76.69 O +ATOM 4487 CB ILE B 23 42.987 6.251 38.901 1.00 75.27 C +ATOM 4488 CG1 ILE B 23 43.546 7.659 38.685 1.00 75.90 C +ATOM 4489 CG2 ILE B 23 42.162 6.207 40.178 1.00 75.31 C +ATOM 4490 CD1 ILE B 23 42.483 8.729 38.540 0.00 75.79 C +ATOM 4491 N SER B 24 43.435 3.059 38.190 1.00 75.60 N +ATOM 4492 CA SER B 24 42.899 1.712 38.286 1.00 75.68 C +ATOM 4493 C SER B 24 43.881 0.796 39.010 1.00 75.69 C +ATOM 4494 O SER B 24 43.478 -0.162 39.673 1.00 75.37 O +ATOM 4495 CB SER B 24 42.608 1.172 36.881 1.00 75.09 C +ATOM 4496 OG SER B 24 42.007 -0.109 36.932 1.00 77.23 O +ATOM 4497 N LEU B 25 45.169 1.100 38.881 1.00 75.55 N +ATOM 4498 CA LEU B 25 46.217 0.309 39.518 1.00 75.30 C +ATOM 4499 C LEU B 25 46.346 0.626 41.004 1.00 75.62 C +ATOM 4500 O LEU B 25 46.998 -0.105 41.743 1.00 76.19 O +ATOM 4501 CB LEU B 25 47.560 0.551 38.821 1.00 73.74 C +ATOM 4502 CG LEU B 25 47.643 0.115 37.354 1.00 73.40 C +ATOM 4503 CD1 LEU B 25 48.997 0.495 36.784 1.00 72.71 C +ATOM 4504 CD2 LEU B 25 47.419 -1.388 37.244 1.00 71.59 C +ATOM 4505 N GLY B 26 45.717 1.714 41.437 1.00 75.89 N +ATOM 4506 CA GLY B 26 45.779 2.097 42.834 1.00 75.22 C +ATOM 4507 C GLY B 26 44.605 1.580 43.647 1.00 75.65 C +ATOM 4508 O GLY B 26 44.324 2.089 44.732 1.00 74.34 O +ATOM 4509 N ILE B 27 43.918 0.568 43.127 1.00 76.33 N +ATOM 4510 CA ILE B 27 42.769 -0.011 43.817 1.00 78.37 C +ATOM 4511 C ILE B 27 42.931 -1.523 43.938 1.00 80.72 C +ATOM 4512 O ILE B 27 43.420 -2.178 43.018 1.00 80.90 O +ATOM 4513 CB ILE B 27 41.447 0.278 43.060 1.00 77.54 C +ATOM 4514 CG1 ILE B 27 41.259 1.787 42.888 1.00 77.51 C +ATOM 4515 CG2 ILE B 27 40.270 -0.312 43.822 1.00 75.86 C +ATOM 4516 CD1 ILE B 27 40.019 2.168 42.105 0.00 77.37 C +ATOM 4517 N GLY B 28 42.524 -2.075 45.076 1.00 83.46 N +ATOM 4518 CA GLY B 28 42.633 -3.510 45.266 1.00 87.65 C +ATOM 4519 C GLY B 28 43.751 -3.967 46.185 1.00 90.11 C +ATOM 4520 O GLY B 28 44.530 -3.161 46.694 1.00 89.67 O +ATOM 4521 N ARG B 29 43.827 -5.282 46.375 1.00 93.10 N +ATOM 4522 CA ARG B 29 44.816 -5.921 47.238 1.00 95.84 C +ATOM 4523 C ARG B 29 46.212 -5.303 47.225 1.00 97.51 C +ATOM 4524 O ARG B 29 46.618 -4.661 48.196 1.00 98.73 O +ATOM 4525 CB ARG B 29 44.912 -7.408 46.889 1.00 95.86 C +ATOM 4526 CG ARG B 29 43.583 -8.140 46.976 0.00 96.21 C +ATOM 4527 CD ARG B 29 43.721 -9.605 46.601 0.00 96.48 C +ATOM 4528 NE ARG B 29 42.427 -10.283 46.592 0.00 96.83 N +ATOM 4529 CZ ARG B 29 42.258 -11.568 46.297 0.00 97.01 C +ATOM 4530 NH1 ARG B 29 41.042 -12.098 46.313 0.00 97.16 N +ATOM 4531 NH2 ARG B 29 43.302 -12.324 45.987 0.00 97.16 N +ATOM 4532 N TYR B 30 46.950 -5.499 46.138 1.00 98.59 N +ATOM 4533 CA TYR B 30 48.302 -4.963 46.046 1.00 99.99 C +ATOM 4534 C TYR B 30 48.366 -3.742 45.142 1.00101.25 C +ATOM 4535 O TYR B 30 48.896 -3.801 44.032 1.00101.71 O +ATOM 4536 CB TYR B 30 49.260 -6.047 45.544 1.00100.42 C +ATOM 4537 CG TYR B 30 49.262 -7.290 46.410 1.00101.23 C +ATOM 4538 CD1 TYR B 30 48.152 -8.137 46.453 1.00101.34 C +ATOM 4539 CD2 TYR B 30 50.361 -7.605 47.210 1.00101.25 C +ATOM 4540 CE1 TYR B 30 48.134 -9.264 47.273 1.00101.93 C +ATOM 4541 CE2 TYR B 30 50.353 -8.731 48.035 1.00101.75 C +ATOM 4542 CZ TYR B 30 49.237 -9.555 48.061 1.00102.18 C +ATOM 4543 OH TYR B 30 49.222 -10.664 48.877 1.00102.44 O +ATOM 4544 N SER B 31 47.830 -2.633 45.640 1.00102.25 N +ATOM 4545 CA SER B 31 47.795 -1.374 44.905 1.00103.58 C +ATOM 4546 C SER B 31 49.186 -0.815 44.626 1.00104.51 C +ATOM 4547 O SER B 31 50.183 -1.527 44.721 1.00105.18 O +ATOM 4548 CB SER B 31 46.986 -0.343 45.691 1.00103.88 C +ATOM 4549 OG SER B 31 45.716 -0.861 46.043 1.00104.42 O +ATOM 4550 N LEU B 32 49.236 0.467 44.275 1.00105.58 N +ATOM 4551 CA LEU B 32 50.491 1.151 43.982 1.00106.75 C +ATOM 4552 C LEU B 32 50.656 2.378 44.875 1.00108.26 C +ATOM 4553 O LEU B 32 49.880 2.590 45.809 1.00108.69 O +ATOM 4554 CB LEU B 32 50.538 1.580 42.512 1.00105.65 C +ATOM 4555 CG LEU B 32 50.983 0.565 41.454 1.00105.29 C +ATOM 4556 CD1 LEU B 32 52.469 0.308 41.603 1.00105.36 C +ATOM 4557 CD2 LEU B 32 50.191 -0.725 41.584 1.00105.37 C +ATOM 4558 N SER B 33 51.670 3.185 44.578 1.00109.63 N +ATOM 4559 CA SER B 33 51.948 4.391 45.350 1.00110.29 C +ATOM 4560 C SER B 33 51.023 5.535 44.949 1.00110.67 C +ATOM 4561 O SER B 33 50.942 5.901 43.775 1.00110.41 O +ATOM 4562 CB SER B 33 53.403 4.815 45.148 1.00110.02 C +ATOM 4563 OG SER B 33 54.283 3.758 45.482 1.00110.93 O +ATOM 4564 N VAL B 34 50.329 6.094 45.936 1.00111.03 N +ATOM 4565 CA VAL B 34 49.407 7.198 45.702 1.00111.18 C +ATOM 4566 C VAL B 34 50.160 8.472 45.333 1.00111.29 C +ATOM 4567 O VAL B 34 50.810 8.539 44.291 1.00111.64 O +ATOM 4568 CB VAL B 34 48.548 7.475 46.954 1.00111.20 C +ATOM 4569 CG1 VAL B 34 49.445 7.772 48.146 1.00111.04 C +ATOM 4570 CG2 VAL B 34 47.608 8.640 46.690 1.00111.11 C +ATOM 4571 N GLN B 54 57.638 -4.847 44.318 1.00 93.35 N +ATOM 4572 CA GLN B 54 58.037 -5.913 43.405 1.00 94.00 C +ATOM 4573 C GLN B 54 57.214 -7.176 43.651 1.00 94.46 C +ATOM 4574 O GLN B 54 56.878 -7.904 42.712 1.00 94.03 O +ATOM 4575 CB GLN B 54 59.520 -6.214 43.571 1.00 93.82 C +ATOM 4576 N GLN B 55 56.898 -7.433 44.918 1.00 94.97 N +ATOM 4577 CA GLN B 55 56.105 -8.602 45.287 1.00 95.05 C +ATOM 4578 C GLN B 55 54.682 -8.420 44.768 1.00 94.75 C +ATOM 4579 O GLN B 55 53.895 -9.370 44.717 1.00 94.01 O +ATOM 4580 CB GLN B 55 56.095 -8.772 46.806 1.00 95.14 C +ATOM 4581 N GLN B 56 54.366 -7.186 44.384 1.00 94.50 N +ATOM 4582 CA GLN B 56 53.049 -6.842 43.859 1.00 93.73 C +ATOM 4583 C GLN B 56 53.085 -6.773 42.333 1.00 93.08 C +ATOM 4584 O GLN B 56 53.071 -5.689 41.746 1.00 92.65 O +ATOM 4585 CB GLN B 56 52.589 -5.503 44.436 1.00 93.47 C +ATOM 4586 N VAL B 57 53.149 -7.940 41.699 1.00 92.13 N +ATOM 4587 CA VAL B 57 53.173 -8.023 40.244 1.00 91.46 C +ATOM 4588 C VAL B 57 51.813 -8.532 39.782 1.00 90.81 C +ATOM 4589 O VAL B 57 51.683 -9.111 38.701 1.00 90.06 O +ATOM 4590 CB VAL B 57 54.278 -8.970 39.787 1.00 91.37 C +ATOM 4591 N ILE B 58 50.803 -8.307 40.622 1.00 89.90 N +ATOM 4592 CA ILE B 58 49.434 -8.725 40.340 1.00 89.31 C +ATOM 4593 C ILE B 58 48.925 -8.097 39.045 1.00 88.81 C +ATOM 4594 O ILE B 58 47.816 -8.392 38.597 1.00 88.53 O +ATOM 4595 CB ILE B 58 48.520 -8.340 41.502 1.00 88.62 C +ATOM 4596 N PHE B 59 49.743 -7.234 38.449 1.00 87.59 N +ATOM 4597 CA PHE B 59 49.389 -6.565 37.207 1.00 87.06 C +ATOM 4598 C PHE B 59 49.201 -7.562 36.063 1.00 87.11 C +ATOM 4599 O PHE B 59 49.077 -7.167 34.903 1.00 87.93 O +ATOM 4600 CB PHE B 59 50.458 -5.543 36.844 1.00 86.34 C +ATOM 4601 N GLN B 60 49.190 -8.852 36.390 1.00 86.01 N +ATOM 4602 CA GLN B 60 48.994 -9.899 35.390 1.00 84.54 C +ATOM 4603 C GLN B 60 47.627 -10.537 35.609 1.00 83.14 C +ATOM 4604 O GLN B 60 47.339 -11.623 35.112 1.00 82.89 O +ATOM 4605 CB GLN B 60 50.088 -10.961 35.497 1.00 86.49 C +ATOM 4606 CG GLN B 60 51.510 -10.417 35.374 1.00 87.87 C +ATOM 4607 CD GLN B 60 51.673 -9.418 34.236 1.00 88.73 C +ATOM 4608 OE1 GLN B 60 51.308 -8.247 34.363 1.00 87.39 O +ATOM 4609 NE2 GLN B 60 52.218 -9.882 33.114 1.00 88.33 N +ATOM 4610 N VAL B 61 46.797 -9.836 36.374 1.00 81.30 N +ATOM 4611 CA VAL B 61 45.436 -10.257 36.688 1.00 79.00 C +ATOM 4612 C VAL B 61 44.573 -8.998 36.623 1.00 77.51 C +ATOM 4613 O VAL B 61 43.360 -9.058 36.406 1.00 76.68 O +ATOM 4614 CB VAL B 61 45.345 -10.832 38.115 1.00 79.03 C +ATOM 4615 CG1 VAL B 61 43.915 -11.238 38.425 1.00 78.41 C +ATOM 4616 CG2 VAL B 61 46.282 -12.016 38.256 1.00 79.61 C +ATOM 4617 N ARG B 62 45.233 -7.857 36.801 1.00 75.11 N +ATOM 4618 CA ARG B 62 44.589 -6.551 36.797 1.00 73.57 C +ATOM 4619 C ARG B 62 44.631 -5.896 35.414 1.00 72.05 C +ATOM 4620 O ARG B 62 43.611 -5.415 34.914 1.00 71.32 O +ATOM 4621 CB ARG B 62 45.280 -5.650 37.827 1.00 74.06 C +ATOM 4622 CG ARG B 62 44.552 -4.360 38.123 1.00 75.32 C +ATOM 4623 CD ARG B 62 45.264 -3.539 39.190 1.00 76.01 C +ATOM 4624 NE ARG B 62 45.468 -4.257 40.452 1.00 77.41 N +ATOM 4625 CZ ARG B 62 44.519 -4.913 41.120 1.00 77.77 C +ATOM 4626 NH1 ARG B 62 44.812 -5.523 42.262 1.00 76.34 N +ATOM 4627 NH2 ARG B 62 43.282 -4.980 40.644 1.00 78.41 N +ATOM 4628 N LEU B 63 45.814 -5.880 34.803 1.00 69.95 N +ATOM 4629 CA LEU B 63 45.994 -5.287 33.482 1.00 67.58 C +ATOM 4630 C LEU B 63 45.035 -5.930 32.484 1.00 65.65 C +ATOM 4631 O LEU B 63 44.383 -5.238 31.707 1.00 65.66 O +ATOM 4632 CB LEU B 63 47.442 -5.469 33.009 1.00 67.61 C +ATOM 4633 CG LEU B 63 48.027 -4.396 32.082 1.00 67.79 C +ATOM 4634 CD1 LEU B 63 49.465 -4.740 31.753 1.00 67.19 C +ATOM 4635 CD2 LEU B 63 47.209 -4.288 30.813 1.00 68.67 C +ATOM 4636 N PRO B 64 44.938 -7.268 32.488 1.00 64.11 N +ATOM 4637 CA PRO B 64 44.022 -7.916 31.546 1.00 62.48 C +ATOM 4638 C PRO B 64 42.569 -7.545 31.845 1.00 61.11 C +ATOM 4639 O PRO B 64 41.688 -7.692 30.992 1.00 58.69 O +ATOM 4640 CB PRO B 64 44.304 -9.402 31.761 1.00 62.64 C +ATOM 4641 CG PRO B 64 44.697 -9.459 33.203 1.00 62.51 C +ATOM 4642 CD PRO B 64 45.622 -8.273 33.320 1.00 63.48 C +ATOM 4643 N ARG B 65 42.322 -7.070 33.063 1.00 58.74 N +ATOM 4644 CA ARG B 65 40.977 -6.679 33.451 1.00 56.79 C +ATOM 4645 C ARG B 65 40.707 -5.243 33.014 1.00 55.64 C +ATOM 4646 O ARG B 65 39.606 -4.914 32.576 1.00 55.34 O +ATOM 4647 CB ARG B 65 40.786 -6.813 34.962 1.00 56.42 C +ATOM 4648 CG ARG B 65 39.459 -6.253 35.441 1.00 55.67 C +ATOM 4649 CD ARG B 65 39.056 -6.808 36.775 1.00 54.04 C +ATOM 4650 NE ARG B 65 37.848 -6.163 37.274 1.00 54.16 N +ATOM 4651 CZ ARG B 65 37.126 -6.621 38.290 1.00 53.41 C +ATOM 4652 NH1 ARG B 65 37.490 -7.734 38.912 1.00 56.05 N +ATOM 4653 NH2 ARG B 65 36.047 -5.966 38.688 1.00 52.02 N +ATOM 4654 N ILE B 66 41.718 -4.393 33.140 1.00 53.49 N +ATOM 4655 CA ILE B 66 41.592 -3.004 32.733 1.00 52.37 C +ATOM 4656 C ILE B 66 41.325 -2.986 31.230 1.00 52.51 C +ATOM 4657 O ILE B 66 40.453 -2.257 30.747 1.00 52.68 O +ATOM 4658 CB ILE B 66 42.889 -2.215 33.039 1.00 51.55 C +ATOM 4659 CG1 ILE B 66 43.027 -2.014 34.550 1.00 51.08 C +ATOM 4660 CG2 ILE B 66 42.880 -0.875 32.313 1.00 50.05 C +ATOM 4661 CD1 ILE B 66 44.299 -1.302 34.963 0.00 51.39 C +ATOM 4662 N LEU B 67 42.076 -3.812 30.505 1.00 50.27 N +ATOM 4663 CA LEU B 67 41.958 -3.917 29.057 1.00 49.01 C +ATOM 4664 C LEU B 67 40.624 -4.504 28.608 1.00 48.07 C +ATOM 4665 O LEU B 67 40.102 -4.131 27.554 1.00 48.11 O +ATOM 4666 CB LEU B 67 43.110 -4.761 28.505 1.00 48.90 C +ATOM 4667 CG LEU B 67 44.376 -4.054 28.002 1.00 51.19 C +ATOM 4668 CD1 LEU B 67 44.732 -2.856 28.864 1.00 52.78 C +ATOM 4669 CD2 LEU B 67 45.512 -5.059 27.979 1.00 51.13 C +ATOM 4670 N THR B 68 40.077 -5.417 29.405 1.00 44.17 N +ATOM 4671 CA THR B 68 38.804 -6.042 29.073 1.00 42.63 C +ATOM 4672 C THR B 68 37.660 -5.041 29.220 1.00 41.74 C +ATOM 4673 O THR B 68 36.771 -4.971 28.371 1.00 42.69 O +ATOM 4674 CB THR B 68 38.514 -7.264 29.981 1.00 40.67 C +ATOM 4675 OG1 THR B 68 39.564 -8.230 29.838 1.00 43.75 O +ATOM 4676 CG2 THR B 68 37.191 -7.920 29.590 1.00 36.93 C +ATOM 4677 N ALA B 69 37.693 -4.273 30.303 1.00 40.70 N +ATOM 4678 CA ALA B 69 36.671 -3.276 30.576 1.00 41.42 C +ATOM 4679 C ALA B 69 36.675 -2.207 29.481 1.00 41.86 C +ATOM 4680 O ALA B 69 35.615 -1.773 29.023 1.00 40.31 O +ATOM 4681 CB ALA B 69 36.917 -2.634 31.936 1.00 39.55 C +ATOM 4682 N LEU B 70 37.871 -1.793 29.073 1.00 42.45 N +ATOM 4683 CA LEU B 70 38.034 -0.784 28.032 1.00 42.54 C +ATOM 4684 C LEU B 70 37.433 -1.260 26.713 1.00 41.93 C +ATOM 4685 O LEU B 70 36.592 -0.582 26.122 1.00 40.42 O +ATOM 4686 CB LEU B 70 39.521 -0.462 27.834 1.00 43.08 C +ATOM 4687 CG LEU B 70 40.242 0.217 29.003 1.00 43.52 C +ATOM 4688 CD1 LEU B 70 41.726 0.294 28.707 1.00 44.36 C +ATOM 4689 CD2 LEU B 70 39.671 1.618 29.230 1.00 44.55 C +ATOM 4690 N CYS B 71 37.854 -2.437 26.267 1.00 41.10 N +ATOM 4691 CA CYS B 71 37.363 -2.989 25.015 1.00 41.95 C +ATOM 4692 C CYS B 71 35.869 -3.268 25.035 1.00 42.24 C +ATOM 4693 O CYS B 71 35.174 -3.030 24.041 1.00 41.60 O +ATOM 4694 CB CYS B 71 38.114 -4.278 24.675 1.00 43.19 C +ATOM 4695 SG CYS B 71 39.870 -4.033 24.304 1.00 50.88 S +ATOM 4696 N VAL B 72 35.374 -3.784 26.158 1.00 40.51 N +ATOM 4697 CA VAL B 72 33.954 -4.100 26.277 1.00 37.85 C +ATOM 4698 C VAL B 72 33.112 -2.826 26.295 1.00 36.24 C +ATOM 4699 O VAL B 72 32.029 -2.783 25.719 1.00 34.71 O +ATOM 4700 CB VAL B 72 33.674 -4.948 27.556 1.00 38.66 C +ATOM 4701 CG1 VAL B 72 32.173 -4.958 27.885 1.00 33.72 C +ATOM 4702 CG2 VAL B 72 34.166 -6.384 27.333 1.00 35.38 C +ATOM 4703 N GLY B 73 33.616 -1.791 26.957 1.00 34.66 N +ATOM 4704 CA GLY B 73 32.890 -0.539 27.013 1.00 34.46 C +ATOM 4705 C GLY B 73 32.798 0.056 25.620 1.00 34.21 C +ATOM 4706 O GLY B 73 31.725 0.448 25.171 1.00 33.65 O +ATOM 4707 N ALA B 74 33.936 0.097 24.936 1.00 33.38 N +ATOM 4708 CA ALA B 74 34.022 0.626 23.586 1.00 34.47 C +ATOM 4709 C ALA B 74 33.108 -0.140 22.635 1.00 35.49 C +ATOM 4710 O ALA B 74 32.434 0.456 21.798 1.00 37.05 O +ATOM 4711 CB ALA B 74 35.467 0.548 23.096 1.00 31.93 C +ATOM 4712 N GLY B 75 33.086 -1.463 22.780 1.00 35.56 N +ATOM 4713 CA GLY B 75 32.278 -2.304 21.919 1.00 34.21 C +ATOM 4714 C GLY B 75 30.787 -2.185 22.143 1.00 34.03 C +ATOM 4715 O GLY B 75 30.008 -2.274 21.194 1.00 34.67 O +ATOM 4716 N LEU B 76 30.381 -1.999 23.394 1.00 33.57 N +ATOM 4717 CA LEU B 76 28.964 -1.864 23.703 1.00 33.91 C +ATOM 4718 C LEU B 76 28.477 -0.495 23.260 1.00 33.84 C +ATOM 4719 O LEU B 76 27.371 -0.355 22.743 1.00 32.79 O +ATOM 4720 CB LEU B 76 28.702 -2.042 25.205 1.00 33.57 C +ATOM 4721 CG LEU B 76 28.631 -3.471 25.760 1.00 35.85 C +ATOM 4722 CD1 LEU B 76 28.396 -3.438 27.275 1.00 33.05 C +ATOM 4723 CD2 LEU B 76 27.503 -4.217 25.066 1.00 35.28 C +ATOM 4724 N ALA B 77 29.306 0.518 23.472 1.00 33.40 N +ATOM 4725 CA ALA B 77 28.940 1.866 23.078 1.00 35.63 C +ATOM 4726 C ALA B 77 28.820 1.922 21.551 1.00 34.37 C +ATOM 4727 O ALA B 77 27.902 2.536 21.017 1.00 33.22 O +ATOM 4728 CB ALA B 77 29.991 2.863 23.568 1.00 34.12 C +ATOM 4729 N LEU B 78 29.747 1.262 20.865 1.00 33.97 N +ATOM 4730 CA LEU B 78 29.777 1.234 19.401 1.00 34.82 C +ATOM 4731 C LEU B 78 28.499 0.623 18.827 1.00 33.44 C +ATOM 4732 O LEU B 78 27.900 1.164 17.883 1.00 31.78 O +ATOM 4733 CB LEU B 78 30.978 0.417 18.916 1.00 34.60 C +ATOM 4734 CG LEU B 78 31.778 0.849 17.683 1.00 35.90 C +ATOM 4735 CD1 LEU B 78 32.364 -0.395 17.033 1.00 36.66 C +ATOM 4736 CD2 LEU B 78 30.913 1.591 16.685 1.00 36.85 C +ATOM 4737 N SER B 79 28.101 -0.514 19.390 1.00 32.49 N +ATOM 4738 CA SER B 79 26.895 -1.214 18.953 1.00 33.66 C +ATOM 4739 C SER B 79 25.684 -0.333 19.169 1.00 29.03 C +ATOM 4740 O SER B 79 24.784 -0.277 18.336 1.00 29.97 O +ATOM 4741 CB SER B 79 26.708 -2.515 19.741 1.00 35.30 C +ATOM 4742 OG SER B 79 27.785 -3.400 19.506 1.00 44.04 O +ATOM 4743 N GLY B 80 25.671 0.346 20.304 1.00 26.59 N +ATOM 4744 CA GLY B 80 24.569 1.224 20.628 1.00 29.45 C +ATOM 4745 C GLY B 80 24.407 2.353 19.622 1.00 30.28 C +ATOM 4746 O GLY B 80 23.317 2.556 19.092 1.00 30.47 O +ATOM 4747 N VAL B 81 25.487 3.080 19.346 1.00 29.29 N +ATOM 4748 CA VAL B 81 25.413 4.192 18.415 1.00 30.34 C +ATOM 4749 C VAL B 81 25.068 3.770 16.974 1.00 31.44 C +ATOM 4750 O VAL B 81 24.285 4.452 16.304 1.00 31.77 O +ATOM 4751 CB VAL B 81 26.733 5.026 18.441 1.00 30.81 C +ATOM 4752 CG1 VAL B 81 27.889 4.218 17.878 1.00 33.14 C +ATOM 4753 CG2 VAL B 81 26.551 6.321 17.656 1.00 31.11 C +ATOM 4754 N VAL B 82 25.615 2.651 16.497 1.00 30.20 N +ATOM 4755 CA VAL B 82 25.315 2.230 15.129 1.00 32.19 C +ATOM 4756 C VAL B 82 23.878 1.748 15.007 1.00 32.58 C +ATOM 4757 O VAL B 82 23.246 1.932 13.962 1.00 34.48 O +ATOM 4758 CB VAL B 82 26.283 1.119 14.596 1.00 32.90 C +ATOM 4759 CG1 VAL B 82 27.731 1.600 14.676 1.00 31.09 C +ATOM 4760 CG2 VAL B 82 26.089 -0.174 15.370 1.00 36.47 C +ATOM 4761 N LEU B 83 23.354 1.147 16.071 1.00 30.90 N +ATOM 4762 CA LEU B 83 21.973 0.681 16.051 1.00 31.10 C +ATOM 4763 C LEU B 83 21.016 1.866 16.115 1.00 29.20 C +ATOM 4764 O LEU B 83 19.947 1.846 15.508 1.00 30.02 O +ATOM 4765 CB LEU B 83 21.703 -0.291 17.209 1.00 31.17 C +ATOM 4766 CG LEU B 83 22.400 -1.649 17.046 1.00 33.34 C +ATOM 4767 CD1 LEU B 83 22.018 -2.582 18.198 1.00 32.86 C +ATOM 4768 CD2 LEU B 83 22.004 -2.258 15.702 1.00 30.02 C +ATOM 4769 N GLN B 84 21.394 2.896 16.859 1.00 26.68 N +ATOM 4770 CA GLN B 84 20.565 4.084 16.944 1.00 30.55 C +ATOM 4771 C GLN B 84 20.514 4.744 15.558 1.00 32.03 C +ATOM 4772 O GLN B 84 19.502 5.327 15.181 1.00 31.44 O +ATOM 4773 CB GLN B 84 21.128 5.049 17.983 1.00 27.92 C +ATOM 4774 CG GLN B 84 21.086 4.478 19.369 1.00 31.44 C +ATOM 4775 CD GLN B 84 21.582 5.436 20.422 1.00 32.52 C +ATOM 4776 OE1 GLN B 84 21.597 5.105 21.603 1.00 37.55 O +ATOM 4777 NE2 GLN B 84 21.990 6.624 20.008 1.00 30.26 N +ATOM 4778 N GLY B 85 21.613 4.631 14.808 1.00 33.43 N +ATOM 4779 CA GLY B 85 21.665 5.177 13.463 1.00 33.59 C +ATOM 4780 C GLY B 85 20.792 4.375 12.506 1.00 34.41 C +ATOM 4781 O GLY B 85 20.079 4.956 11.689 1.00 33.33 O +ATOM 4782 N ILE B 86 20.842 3.045 12.602 1.00 34.91 N +ATOM 4783 CA ILE B 86 20.028 2.183 11.740 1.00 36.49 C +ATOM 4784 C ILE B 86 18.546 2.427 11.992 1.00 35.40 C +ATOM 4785 O ILE B 86 17.765 2.607 11.056 1.00 34.93 O +ATOM 4786 CB ILE B 86 20.291 0.666 11.989 1.00 40.23 C +ATOM 4787 CG1 ILE B 86 21.653 0.256 11.422 1.00 40.19 C +ATOM 4788 CG2 ILE B 86 19.188 -0.166 11.343 1.00 40.03 C +ATOM 4789 CD1 ILE B 86 21.976 -1.212 11.615 0.00 40.14 C +ATOM 4790 N PHE B 87 18.162 2.447 13.262 1.00 33.92 N +ATOM 4791 CA PHE B 87 16.766 2.647 13.612 1.00 35.30 C +ATOM 4792 C PHE B 87 16.330 4.096 13.721 1.00 35.19 C +ATOM 4793 O PHE B 87 15.194 4.376 14.083 1.00 35.55 O +ATOM 4794 CB PHE B 87 16.436 1.885 14.902 1.00 34.31 C +ATOM 4795 CG PHE B 87 16.454 0.394 14.726 1.00 35.25 C +ATOM 4796 CD1 PHE B 87 17.628 -0.331 14.917 1.00 34.87 C +ATOM 4797 CD2 PHE B 87 15.315 -0.278 14.277 1.00 36.48 C +ATOM 4798 CE1 PHE B 87 17.674 -1.705 14.656 1.00 36.80 C +ATOM 4799 CE2 PHE B 87 15.346 -1.653 14.012 1.00 37.37 C +ATOM 4800 CZ PHE B 87 16.529 -2.367 14.200 1.00 37.56 C +ATOM 4801 N ARG B 88 17.231 5.017 13.397 1.00 37.61 N +ATOM 4802 CA ARG B 88 16.911 6.438 13.440 1.00 39.27 C +ATOM 4803 C ARG B 88 16.216 6.782 14.756 1.00 41.00 C +ATOM 4804 O ARG B 88 15.299 7.604 14.797 1.00 41.67 O +ATOM 4805 CB ARG B 88 16.004 6.803 12.255 1.00 37.62 C +ATOM 4806 CG ARG B 88 16.485 6.251 10.920 1.00 41.35 C +ATOM 4807 CD ARG B 88 15.927 7.052 9.754 1.00 47.53 C +ATOM 4808 NE ARG B 88 14.805 6.391 9.100 1.00 50.94 N +ATOM 4809 CZ ARG B 88 14.884 5.795 7.915 1.00 54.16 C +ATOM 4810 NH1 ARG B 88 13.812 5.210 7.394 1.00 57.24 N +ATOM 4811 NH2 ARG B 88 16.029 5.790 7.243 1.00 54.11 N +ATOM 4812 N ASN B 89 16.665 6.156 15.837 1.00 42.98 N +ATOM 4813 CA ASN B 89 16.071 6.395 17.146 1.00 44.23 C +ATOM 4814 C ASN B 89 17.149 6.386 18.224 1.00 43.90 C +ATOM 4815 O ASN B 89 17.934 5.447 18.324 1.00 41.90 O +ATOM 4816 CB ASN B 89 15.019 5.321 17.431 1.00 46.49 C +ATOM 4817 CG ASN B 89 14.224 5.594 18.697 1.00 50.92 C +ATOM 4818 OD1 ASN B 89 13.333 4.820 19.059 1.00 54.52 O +ATOM 4819 ND2 ASN B 89 14.537 6.692 19.378 1.00 50.75 N +ATOM 4820 N PRO B 90 17.211 7.450 19.037 1.00 45.84 N +ATOM 4821 CA PRO B 90 18.210 7.545 20.107 1.00 46.74 C +ATOM 4822 C PRO B 90 17.908 6.702 21.349 1.00 47.92 C +ATOM 4823 O PRO B 90 18.739 6.608 22.248 1.00 48.01 O +ATOM 4824 CB PRO B 90 18.243 9.040 20.413 1.00 46.94 C +ATOM 4825 CG PRO B 90 16.823 9.460 20.151 1.00 47.97 C +ATOM 4826 CD PRO B 90 16.504 8.734 18.858 1.00 47.04 C +ATOM 4827 N LEU B 91 16.730 6.086 21.394 1.00 49.62 N +ATOM 4828 CA LEU B 91 16.353 5.265 22.541 1.00 51.13 C +ATOM 4829 C LEU B 91 16.558 3.785 22.281 1.00 51.28 C +ATOM 4830 O LEU B 91 16.079 2.939 23.027 1.00 53.39 O +ATOM 4831 CB LEU B 91 14.900 5.531 22.934 1.00 50.95 C +ATOM 4832 CG LEU B 91 14.685 6.977 23.389 1.00 52.67 C +ATOM 4833 CD1 LEU B 91 13.224 7.205 23.737 1.00 53.46 C +ATOM 4834 CD2 LEU B 91 15.580 7.272 24.585 1.00 52.69 C +ATOM 4835 N VAL B 92 17.285 3.483 21.217 1.00 51.09 N +ATOM 4836 CA VAL B 92 17.585 2.109 20.847 1.00 50.44 C +ATOM 4837 C VAL B 92 18.912 1.721 21.493 1.00 51.13 C +ATOM 4838 O VAL B 92 19.757 2.575 21.748 1.00 52.24 O +ATOM 4839 CB VAL B 92 17.676 1.974 19.298 1.00 48.55 C +ATOM 4840 CG1 VAL B 92 18.599 0.839 18.901 1.00 47.18 C +ATOM 4841 CG2 VAL B 92 16.294 1.742 18.730 1.00 47.84 C +ATOM 4842 N ASN B 93 19.085 0.436 21.774 1.00 51.16 N +ATOM 4843 CA ASN B 93 20.319 -0.047 22.375 1.00 52.01 C +ATOM 4844 C ASN B 93 20.672 -1.385 21.754 1.00 52.03 C +ATOM 4845 O ASN B 93 19.888 -1.942 20.989 1.00 51.74 O +ATOM 4846 CB ASN B 93 20.170 -0.170 23.895 1.00 52.33 C +ATOM 4847 CG ASN B 93 18.962 -0.984 24.304 1.00 53.79 C +ATOM 4848 OD1 ASN B 93 18.912 -2.198 24.106 1.00 51.72 O +ATOM 4849 ND2 ASN B 93 17.973 -0.312 24.879 1.00 56.21 N +ATOM 4850 N PRO B 94 21.860 -1.920 22.068 1.00 53.23 N +ATOM 4851 CA PRO B 94 22.265 -3.207 21.495 1.00 54.00 C +ATOM 4852 C PRO B 94 21.383 -4.413 21.805 1.00 54.85 C +ATOM 4853 O PRO B 94 21.658 -5.508 21.330 1.00 56.36 O +ATOM 4854 CB PRO B 94 23.694 -3.379 22.010 1.00 52.89 C +ATOM 4855 CG PRO B 94 23.701 -2.606 23.289 1.00 53.22 C +ATOM 4856 CD PRO B 94 22.915 -1.375 22.942 1.00 52.57 C +ATOM 4857 N HIS B 95 20.307 -4.217 22.560 1.00 56.48 N +ATOM 4858 CA HIS B 95 19.441 -5.336 22.923 1.00 57.12 C +ATOM 4859 C HIS B 95 18.027 -5.312 22.339 1.00 57.74 C +ATOM 4860 O HIS B 95 17.132 -5.965 22.874 1.00 58.25 O +ATOM 4861 CB HIS B 95 19.335 -5.437 24.450 1.00 59.47 C +ATOM 4862 CG HIS B 95 20.595 -5.067 25.173 1.00 61.88 C +ATOM 4863 ND1 HIS B 95 21.828 -5.584 24.838 1.00 63.09 N +ATOM 4864 CD2 HIS B 95 20.812 -4.221 26.208 1.00 62.11 C +ATOM 4865 CE1 HIS B 95 22.750 -5.072 25.633 1.00 63.08 C +ATOM 4866 NE2 HIS B 95 22.160 -4.241 26.474 1.00 62.41 N +ATOM 4867 N ILE B 96 17.808 -4.575 21.255 1.00 57.16 N +ATOM 4868 CA ILE B 96 16.467 -4.527 20.671 1.00 57.52 C +ATOM 4869 C ILE B 96 16.341 -5.495 19.503 1.00 55.96 C +ATOM 4870 O ILE B 96 15.244 -5.756 19.011 1.00 55.98 O +ATOM 4871 CB ILE B 96 16.099 -3.112 20.156 1.00 59.11 C +ATOM 4872 CG1 ILE B 96 16.965 -2.752 18.946 1.00 59.30 C +ATOM 4873 CG2 ILE B 96 16.263 -2.092 21.278 1.00 60.18 C +ATOM 4874 CD1 ILE B 96 16.475 -1.545 18.184 0.00 59.17 C +ATOM 4875 N ILE B 97 17.475 -6.023 19.065 1.00 54.19 N +ATOM 4876 CA ILE B 97 17.498 -6.951 17.950 1.00 54.35 C +ATOM 4877 C ILE B 97 17.426 -8.404 18.450 1.00 53.21 C +ATOM 4878 O ILE B 97 17.352 -9.344 17.660 1.00 51.88 O +ATOM 4879 CB ILE B 97 18.771 -6.705 17.093 1.00 55.53 C +ATOM 4880 CG1 ILE B 97 18.766 -7.610 15.860 1.00 56.77 C +ATOM 4881 CG2 ILE B 97 20.019 -6.902 17.946 1.00 55.98 C +ATOM 4882 CD1 ILE B 97 17.614 -7.351 14.914 0.00 56.19 C +ATOM 4883 N GLY B 98 17.443 -8.569 19.771 1.00 52.39 N +ATOM 4884 CA GLY B 98 17.353 -9.889 20.376 1.00 51.31 C +ATOM 4885 C GLY B 98 18.626 -10.712 20.504 1.00 50.90 C +ATOM 4886 O GLY B 98 18.577 -11.829 21.011 1.00 51.46 O +ATOM 4887 N VAL B 99 19.761 -10.171 20.067 1.00 49.69 N +ATOM 4888 CA VAL B 99 21.034 -10.893 20.118 1.00 48.94 C +ATOM 4889 C VAL B 99 21.554 -11.194 21.518 1.00 49.70 C +ATOM 4890 O VAL B 99 22.204 -12.215 21.740 1.00 50.58 O +ATOM 4891 CB VAL B 99 22.133 -10.132 19.356 1.00 47.72 C +ATOM 4892 CG1 VAL B 99 23.429 -10.917 19.378 1.00 46.29 C +ATOM 4893 CG2 VAL B 99 21.694 -9.905 17.927 1.00 50.23 C +ATOM 4894 N THR B 100 21.285 -10.303 22.461 1.00 49.52 N +ATOM 4895 CA THR B 100 21.742 -10.506 23.825 1.00 49.32 C +ATOM 4896 C THR B 100 20.976 -11.648 24.489 1.00 49.11 C +ATOM 4897 O THR B 100 21.538 -12.399 25.287 1.00 49.24 O +ATOM 4898 CB THR B 100 21.597 -9.215 24.650 1.00 49.63 C +ATOM 4899 OG1 THR B 100 20.265 -8.700 24.522 1.00 53.04 O +ATOM 4900 CG2 THR B 100 22.571 -8.177 24.152 1.00 51.79 C +ATOM 4901 N SER B 101 19.696 -11.781 24.160 1.00 47.84 N +ATOM 4902 CA SER B 101 18.891 -12.857 24.717 1.00 48.53 C +ATOM 4903 C SER B 101 19.350 -14.197 24.149 1.00 48.15 C +ATOM 4904 O SER B 101 19.592 -15.139 24.895 1.00 49.27 O +ATOM 4905 CB SER B 101 17.412 -12.639 24.404 1.00 46.57 C +ATOM 4906 OG SER B 101 16.885 -11.627 25.239 1.00 49.74 O +ATOM 4907 N GLY B 102 19.473 -14.272 22.828 1.00 47.27 N +ATOM 4908 CA GLY B 102 19.917 -15.500 22.199 1.00 48.54 C +ATOM 4909 C GLY B 102 21.270 -15.918 22.746 1.00 49.89 C +ATOM 4910 O GLY B 102 21.477 -17.082 23.092 1.00 49.15 O +ATOM 4911 N SER B 103 22.195 -14.965 22.828 1.00 49.19 N +ATOM 4912 CA SER B 103 23.528 -15.248 23.346 1.00 49.30 C +ATOM 4913 C SER B 103 23.426 -15.750 24.773 1.00 49.35 C +ATOM 4914 O SER B 103 24.096 -16.711 25.146 1.00 48.37 O +ATOM 4915 CB SER B 103 24.405 -13.992 23.313 1.00 49.29 C +ATOM 4916 OG SER B 103 24.677 -13.582 21.983 1.00 51.42 O +ATOM 4917 N ALA B 104 22.588 -15.088 25.568 1.00 49.30 N +ATOM 4918 CA ALA B 104 22.398 -15.464 26.961 1.00 49.69 C +ATOM 4919 C ALA B 104 21.949 -16.916 27.026 1.00 50.82 C +ATOM 4920 O ALA B 104 22.425 -17.682 27.857 1.00 49.00 O +ATOM 4921 CB ALA B 104 21.361 -14.562 27.616 1.00 49.95 C +ATOM 4922 N PHE B 105 21.031 -17.288 26.141 1.00 51.22 N +ATOM 4923 CA PHE B 105 20.543 -18.656 26.100 1.00 54.26 C +ATOM 4924 C PHE B 105 21.665 -19.629 25.726 1.00 55.31 C +ATOM 4925 O PHE B 105 21.834 -20.666 26.366 1.00 56.59 O +ATOM 4926 CB PHE B 105 19.402 -18.793 25.094 1.00 53.51 C +ATOM 4927 CG PHE B 105 18.963 -20.213 24.882 1.00 55.55 C +ATOM 4928 CD1 PHE B 105 18.434 -20.956 25.936 1.00 55.59 C +ATOM 4929 CD2 PHE B 105 19.104 -20.820 23.639 1.00 55.73 C +ATOM 4930 CE1 PHE B 105 18.051 -22.285 25.753 1.00 54.56 C +ATOM 4931 CE2 PHE B 105 18.724 -22.151 23.445 1.00 56.16 C +ATOM 4932 CZ PHE B 105 18.197 -22.883 24.503 1.00 55.13 C +ATOM 4933 N GLY B 106 22.421 -19.290 24.685 1.00 55.92 N +ATOM 4934 CA GLY B 106 23.513 -20.139 24.246 1.00 55.68 C +ATOM 4935 C GLY B 106 24.502 -20.410 25.363 1.00 56.75 C +ATOM 4936 O GLY B 106 24.956 -21.542 25.545 1.00 56.30 O +ATOM 4937 N GLY B 107 24.838 -19.369 26.115 1.00 55.90 N +ATOM 4938 CA GLY B 107 25.771 -19.529 27.211 1.00 57.28 C +ATOM 4939 C GLY B 107 25.141 -20.264 28.377 1.00 58.70 C +ATOM 4940 O GLY B 107 25.840 -20.915 29.154 1.00 60.35 O +ATOM 4941 N THR B 108 23.822 -20.149 28.513 1.00 58.27 N +ATOM 4942 CA THR B 108 23.102 -20.825 29.586 1.00 58.06 C +ATOM 4943 C THR B 108 22.974 -22.302 29.225 1.00 58.51 C +ATOM 4944 O THR B 108 23.151 -23.175 30.071 1.00 58.23 O +ATOM 4945 CB THR B 108 21.686 -20.236 29.790 1.00 57.07 C +ATOM 4946 OG1 THR B 108 21.790 -18.910 30.321 1.00 58.37 O +ATOM 4947 CG2 THR B 108 20.884 -21.093 30.765 1.00 56.84 C +ATOM 4948 N LEU B 109 22.672 -22.570 27.959 1.00 58.20 N +ATOM 4949 CA LEU B 109 22.528 -23.933 27.478 1.00 59.06 C +ATOM 4950 C LEU B 109 23.849 -24.666 27.686 1.00 60.45 C +ATOM 4951 O LEU B 109 23.865 -25.863 27.964 1.00 60.94 O +ATOM 4952 CB LEU B 109 22.168 -23.929 25.991 1.00 59.44 C +ATOM 4953 CG LEU B 109 21.720 -25.245 25.347 1.00 60.03 C +ATOM 4954 CD1 LEU B 109 20.388 -25.682 25.940 1.00 60.16 C +ATOM 4955 CD2 LEU B 109 21.585 -25.058 23.838 1.00 59.77 C +ATOM 4956 N ALA B 110 24.953 -23.934 27.563 1.00 60.23 N +ATOM 4957 CA ALA B 110 26.284 -24.507 27.731 1.00 61.52 C +ATOM 4958 C ALA B 110 26.603 -24.842 29.188 1.00 62.37 C +ATOM 4959 O ALA B 110 27.199 -25.879 29.471 1.00 63.38 O +ATOM 4960 CB ALA B 110 27.340 -23.556 27.170 1.00 59.45 C +ATOM 4961 N ILE B 111 26.221 -23.965 30.110 1.00 62.92 N +ATOM 4962 CA ILE B 111 26.478 -24.211 31.526 1.00 63.90 C +ATOM 4963 C ILE B 111 25.658 -25.411 31.986 1.00 65.44 C +ATOM 4964 O ILE B 111 26.143 -26.271 32.724 1.00 65.89 O +ATOM 4965 CB ILE B 111 26.092 -22.993 32.390 1.00 64.10 C +ATOM 4966 CG1 ILE B 111 27.038 -21.823 32.094 1.00 64.02 C +ATOM 4967 CG2 ILE B 111 26.129 -23.369 33.868 1.00 62.18 C +ATOM 4968 CD1 ILE B 111 26.708 -20.558 32.859 0.00 64.14 C +ATOM 4969 N PHE B 112 24.410 -25.454 31.538 1.00 66.23 N +ATOM 4970 CA PHE B 112 23.495 -26.530 31.883 1.00 66.75 C +ATOM 4971 C PHE B 112 24.099 -27.881 31.507 1.00 67.65 C +ATOM 4972 O PHE B 112 23.926 -28.864 32.222 1.00 67.53 O +ATOM 4973 CB PHE B 112 22.161 -26.304 31.163 1.00 66.33 C +ATOM 4974 CG PHE B 112 21.134 -27.362 31.424 1.00 65.27 C +ATOM 4975 CD1 PHE B 112 20.982 -28.431 30.549 1.00 65.92 C +ATOM 4976 CD2 PHE B 112 20.306 -27.284 32.537 1.00 66.21 C +ATOM 4977 CE1 PHE B 112 20.016 -29.408 30.777 1.00 65.86 C +ATOM 4978 CE2 PHE B 112 19.336 -28.257 32.777 1.00 66.65 C +ATOM 4979 CZ PHE B 112 19.191 -29.320 31.893 1.00 66.42 C +ATOM 4980 N PHE B 113 24.819 -27.922 30.391 1.00 68.29 N +ATOM 4981 CA PHE B 113 25.445 -29.160 29.941 1.00 69.34 C +ATOM 4982 C PHE B 113 26.931 -29.220 30.306 1.00 69.69 C +ATOM 4983 O PHE B 113 27.681 -30.035 29.769 1.00 69.84 O +ATOM 4984 CB PHE B 113 25.268 -29.325 28.430 1.00 69.49 C +ATOM 4985 CG PHE B 113 23.846 -29.577 28.009 1.00 70.81 C +ATOM 4986 CD1 PHE B 113 23.125 -30.637 28.548 1.00 71.83 C +ATOM 4987 CD2 PHE B 113 23.231 -28.763 27.064 1.00 71.71 C +ATOM 4988 CE1 PHE B 113 21.812 -30.883 28.152 1.00 72.39 C +ATOM 4989 CE2 PHE B 113 21.919 -28.999 26.661 1.00 72.13 C +ATOM 4990 CZ PHE B 113 21.208 -30.061 27.206 1.00 72.89 C +ATOM 4991 N GLY B 114 27.343 -28.349 31.221 1.00 69.71 N +ATOM 4992 CA GLY B 114 28.725 -28.317 31.666 1.00 69.59 C +ATOM 4993 C GLY B 114 29.811 -28.258 30.606 1.00 70.23 C +ATOM 4994 O GLY B 114 30.870 -28.857 30.783 1.00 71.23 O +ATOM 4995 N PHE B 115 29.570 -27.545 29.509 1.00 69.99 N +ATOM 4996 CA PHE B 115 30.577 -27.422 28.454 1.00 69.99 C +ATOM 4997 C PHE B 115 31.842 -26.764 29.002 1.00 69.67 C +ATOM 4998 O PHE B 115 31.854 -26.239 30.117 1.00 68.02 O +ATOM 4999 CB PHE B 115 30.060 -26.558 27.297 1.00 71.25 C +ATOM 5000 CG PHE B 115 28.949 -27.181 26.504 1.00 72.78 C +ATOM 5001 CD1 PHE B 115 28.317 -26.452 25.497 1.00 73.15 C +ATOM 5002 CD2 PHE B 115 28.537 -28.489 26.746 1.00 72.76 C +ATOM 5003 CE1 PHE B 115 27.292 -27.013 24.740 1.00 74.06 C +ATOM 5004 CE2 PHE B 115 27.509 -29.064 25.993 1.00 73.88 C +ATOM 5005 CZ PHE B 115 26.886 -28.324 24.988 1.00 74.50 C +ATOM 5006 N SER B 116 32.905 -26.791 28.204 1.00 70.33 N +ATOM 5007 CA SER B 116 34.168 -26.172 28.587 1.00 71.53 C +ATOM 5008 C SER B 116 34.076 -24.670 28.303 1.00 72.64 C +ATOM 5009 O SER B 116 33.136 -24.216 27.650 1.00 72.39 O +ATOM 5010 CB SER B 116 35.314 -26.783 27.783 1.00 70.97 C +ATOM 5011 OG SER B 116 35.023 -26.751 26.396 1.00 71.60 O +ATOM 5012 N LEU B 117 35.051 -23.907 28.788 1.00 73.26 N +ATOM 5013 CA LEU B 117 35.060 -22.462 28.586 1.00 73.32 C +ATOM 5014 C LEU B 117 34.866 -22.114 27.112 1.00 73.36 C +ATOM 5015 O LEU B 117 34.132 -21.182 26.774 1.00 73.56 O +ATOM 5016 CB LEU B 117 36.380 -21.862 29.077 1.00 74.52 C +ATOM 5017 CG LEU B 117 36.300 -20.519 29.816 1.00 75.67 C +ATOM 5018 CD1 LEU B 117 37.703 -19.947 30.000 1.00 75.29 C +ATOM 5019 CD2 LEU B 117 35.437 -19.548 29.040 1.00 74.92 C +ATOM 5020 N TYR B 118 35.522 -22.868 26.236 1.00 72.78 N +ATOM 5021 CA TYR B 118 35.414 -22.626 24.803 1.00 72.57 C +ATOM 5022 C TYR B 118 34.089 -23.136 24.259 1.00 70.35 C +ATOM 5023 O TYR B 118 33.613 -22.671 23.224 1.00 70.29 O +ATOM 5024 CB TYR B 118 36.581 -23.283 24.061 1.00 75.96 C +ATOM 5025 CG TYR B 118 37.933 -22.752 24.488 1.00 80.26 C +ATOM 5026 CD1 TYR B 118 38.517 -23.155 25.692 1.00 82.25 C +ATOM 5027 CD2 TYR B 118 38.616 -21.821 23.705 1.00 82.29 C +ATOM 5028 CE1 TYR B 118 39.750 -22.643 26.106 1.00 83.62 C +ATOM 5029 CE2 TYR B 118 39.848 -21.301 24.109 1.00 84.45 C +ATOM 5030 CZ TYR B 118 40.410 -21.716 25.309 1.00 84.29 C +ATOM 5031 OH TYR B 118 41.627 -21.206 25.708 1.00 84.69 O +ATOM 5032 N GLY B 119 33.498 -24.098 24.958 1.00 68.09 N +ATOM 5033 CA GLY B 119 32.217 -24.626 24.534 1.00 64.87 C +ATOM 5034 C GLY B 119 31.175 -23.555 24.794 1.00 62.71 C +ATOM 5035 O GLY B 119 30.184 -23.436 24.073 1.00 61.91 O +ATOM 5036 N LEU B 120 31.413 -22.771 25.841 1.00 60.81 N +ATOM 5037 CA LEU B 120 30.521 -21.685 26.216 1.00 59.27 C +ATOM 5038 C LEU B 120 30.637 -20.580 25.168 1.00 58.69 C +ATOM 5039 O LEU B 120 29.628 -20.061 24.691 1.00 58.04 O +ATOM 5040 CB LEU B 120 30.895 -21.159 27.605 1.00 58.45 C +ATOM 5041 CG LEU B 120 30.103 -19.962 28.136 1.00 58.70 C +ATOM 5042 CD1 LEU B 120 30.115 -19.963 29.655 1.00 56.61 C +ATOM 5043 CD2 LEU B 120 30.697 -18.675 27.584 1.00 57.48 C +ATOM 5044 N PHE B 121 31.871 -20.238 24.810 1.00 57.40 N +ATOM 5045 CA PHE B 121 32.134 -19.216 23.802 1.00 56.79 C +ATOM 5046 C PHE B 121 31.398 -19.533 22.508 1.00 58.12 C +ATOM 5047 O PHE B 121 30.622 -18.724 21.997 1.00 58.37 O +ATOM 5048 CB PHE B 121 33.626 -19.151 23.475 1.00 55.65 C +ATOM 5049 CG PHE B 121 34.475 -18.582 24.568 1.00 55.00 C +ATOM 5050 CD1 PHE B 121 35.860 -18.618 24.463 1.00 55.59 C +ATOM 5051 CD2 PHE B 121 33.903 -17.990 25.685 1.00 55.36 C +ATOM 5052 CE1 PHE B 121 36.666 -18.072 25.455 1.00 55.18 C +ATOM 5053 CE2 PHE B 121 34.700 -17.439 26.683 1.00 55.58 C +ATOM 5054 CZ PHE B 121 36.085 -17.481 26.566 1.00 55.45 C +ATOM 5055 N THR B 122 31.664 -20.721 21.978 1.00 58.58 N +ATOM 5056 CA THR B 122 31.066 -21.153 20.725 1.00 58.07 C +ATOM 5057 C THR B 122 29.540 -21.234 20.764 1.00 56.27 C +ATOM 5058 O THR B 122 28.874 -20.897 19.782 1.00 55.00 O +ATOM 5059 CB THR B 122 31.666 -22.517 20.279 1.00 59.14 C +ATOM 5060 OG1 THR B 122 30.968 -22.999 19.124 1.00 60.77 O +ATOM 5061 CG2 THR B 122 31.562 -23.539 21.394 1.00 61.47 C +ATOM 5062 N SER B 123 28.985 -21.665 21.893 1.00 55.12 N +ATOM 5063 CA SER B 123 27.534 -21.776 22.019 1.00 54.09 C +ATOM 5064 C SER B 123 26.886 -20.393 22.085 1.00 53.07 C +ATOM 5065 O SER B 123 25.883 -20.135 21.422 1.00 53.11 O +ATOM 5066 CB SER B 123 27.162 -22.582 23.268 1.00 54.31 C +ATOM 5067 OG SER B 123 25.765 -22.843 23.302 1.00 52.72 O +ATOM 5068 N THR B 124 27.463 -19.512 22.894 1.00 52.03 N +ATOM 5069 CA THR B 124 26.960 -18.152 23.038 1.00 51.87 C +ATOM 5070 C THR B 124 26.923 -17.483 21.667 1.00 53.06 C +ATOM 5071 O THR B 124 25.880 -16.999 21.215 1.00 50.92 O +ATOM 5072 CB THR B 124 27.880 -17.315 23.948 1.00 52.10 C +ATOM 5073 OG1 THR B 124 27.974 -17.933 25.237 1.00 48.90 O +ATOM 5074 CG2 THR B 124 27.335 -15.892 24.096 1.00 50.58 C +ATOM 5075 N ILE B 125 28.081 -17.470 21.016 1.00 53.52 N +ATOM 5076 CA ILE B 125 28.238 -16.873 19.700 1.00 54.74 C +ATOM 5077 C ILE B 125 27.331 -17.520 18.659 1.00 55.94 C +ATOM 5078 O ILE B 125 26.726 -16.830 17.839 1.00 55.80 O +ATOM 5079 CB ILE B 125 29.709 -16.980 19.228 1.00 55.79 C +ATOM 5080 CG1 ILE B 125 30.604 -16.107 20.115 1.00 55.68 C +ATOM 5081 CG2 ILE B 125 29.825 -16.569 17.768 1.00 56.18 C +ATOM 5082 CD1 ILE B 125 32.078 -16.185 19.769 0.00 55.88 C +ATOM 5083 N LEU B 126 27.234 -18.844 18.696 1.00 57.13 N +ATOM 5084 CA LEU B 126 26.407 -19.567 17.740 1.00 58.19 C +ATOM 5085 C LEU B 126 24.949 -19.134 17.829 1.00 58.55 C +ATOM 5086 O LEU B 126 24.314 -18.865 16.811 1.00 59.20 O +ATOM 5087 CB LEU B 126 26.521 -21.075 17.979 1.00 60.91 C +ATOM 5088 CG LEU B 126 26.038 -22.042 16.887 1.00 63.80 C +ATOM 5089 CD1 LEU B 126 24.524 -21.966 16.729 1.00 64.05 C +ATOM 5090 CD2 LEU B 126 26.744 -21.715 15.573 1.00 64.09 C +ATOM 5091 N PHE B 127 24.410 -19.072 19.040 1.00 58.80 N +ATOM 5092 CA PHE B 127 23.023 -18.657 19.196 1.00 58.39 C +ATOM 5093 C PHE B 127 22.873 -17.155 18.999 1.00 57.80 C +ATOM 5094 O PHE B 127 21.795 -16.668 18.660 1.00 55.72 O +ATOM 5095 CB PHE B 127 22.481 -19.082 20.559 1.00 58.46 C +ATOM 5096 CG PHE B 127 22.039 -20.511 20.602 1.00 61.53 C +ATOM 5097 CD1 PHE B 127 22.934 -21.523 20.928 1.00 62.16 C +ATOM 5098 CD2 PHE B 127 20.731 -20.854 20.266 1.00 62.20 C +ATOM 5099 CE1 PHE B 127 22.534 -22.857 20.918 1.00 61.93 C +ATOM 5100 CE2 PHE B 127 20.322 -22.182 20.252 1.00 62.62 C +ATOM 5101 CZ PHE B 127 21.226 -23.186 20.578 1.00 62.86 C +ATOM 5102 N GLY B 128 23.960 -16.424 19.218 1.00 58.29 N +ATOM 5103 CA GLY B 128 23.922 -14.991 19.011 1.00 59.48 C +ATOM 5104 C GLY B 128 23.736 -14.789 17.519 1.00 61.09 C +ATOM 5105 O GLY B 128 22.773 -14.156 17.083 1.00 60.33 O +ATOM 5106 N PHE B 129 24.655 -15.351 16.737 1.00 62.26 N +ATOM 5107 CA PHE B 129 24.600 -15.264 15.281 1.00 64.49 C +ATOM 5108 C PHE B 129 23.262 -15.792 14.786 1.00 64.06 C +ATOM 5109 O PHE B 129 22.598 -15.163 13.961 1.00 64.94 O +ATOM 5110 CB PHE B 129 25.728 -16.091 14.650 1.00 67.97 C +ATOM 5111 CG PHE B 129 27.058 -15.385 14.600 1.00 71.92 C +ATOM 5112 CD1 PHE B 129 27.649 -14.887 15.756 1.00 73.19 C +ATOM 5113 CD2 PHE B 129 27.729 -15.232 13.389 1.00 74.72 C +ATOM 5114 CE1 PHE B 129 28.894 -14.245 15.708 1.00 74.76 C +ATOM 5115 CE2 PHE B 129 28.973 -14.593 13.331 1.00 75.52 C +ATOM 5116 CZ PHE B 129 29.555 -14.099 14.495 1.00 73.94 C +ATOM 5117 N GLY B 130 22.875 -16.955 15.299 1.00 63.54 N +ATOM 5118 CA GLY B 130 21.622 -17.570 14.902 1.00 62.14 C +ATOM 5119 C GLY B 130 20.429 -16.650 15.052 1.00 61.75 C +ATOM 5120 O GLY B 130 19.545 -16.622 14.193 1.00 61.73 O +ATOM 5121 N THR B 131 20.390 -15.896 16.146 1.00 60.77 N +ATOM 5122 CA THR B 131 19.283 -14.980 16.367 1.00 59.24 C +ATOM 5123 C THR B 131 19.269 -13.961 15.234 1.00 58.92 C +ATOM 5124 O THR B 131 18.201 -13.605 14.730 1.00 58.49 O +ATOM 5125 CB THR B 131 19.414 -14.257 17.712 1.00 59.28 C +ATOM 5126 OG1 THR B 131 19.577 -15.226 18.754 1.00 58.07 O +ATOM 5127 CG2 THR B 131 18.162 -13.429 17.992 1.00 58.02 C +ATOM 5128 N LEU B 132 20.455 -13.500 14.835 1.00 58.18 N +ATOM 5129 CA LEU B 132 20.569 -12.545 13.738 1.00 57.41 C +ATOM 5130 C LEU B 132 19.972 -13.177 12.483 1.00 56.76 C +ATOM 5131 O LEU B 132 19.166 -12.561 11.783 1.00 55.47 O +ATOM 5132 CB LEU B 132 22.034 -12.184 13.460 1.00 59.31 C +ATOM 5133 CG LEU B 132 22.821 -11.216 14.355 1.00 60.56 C +ATOM 5134 CD1 LEU B 132 21.942 -10.031 14.721 1.00 60.27 C +ATOM 5135 CD2 LEU B 132 23.300 -11.920 15.599 1.00 61.66 C +ATOM 5136 N ALA B 133 20.374 -14.413 12.206 1.00 55.71 N +ATOM 5137 CA ALA B 133 19.874 -15.129 11.039 1.00 56.35 C +ATOM 5138 C ALA B 133 18.347 -15.192 11.056 1.00 56.53 C +ATOM 5139 O ALA B 133 17.695 -14.927 10.047 1.00 55.97 O +ATOM 5140 CB ALA B 133 20.459 -16.537 11.000 1.00 56.54 C +ATOM 5141 N LEU B 134 17.780 -15.538 12.208 1.00 56.18 N +ATOM 5142 CA LEU B 134 16.333 -15.631 12.335 1.00 57.74 C +ATOM 5143 C LEU B 134 15.662 -14.303 12.044 1.00 58.73 C +ATOM 5144 O LEU B 134 14.679 -14.246 11.299 1.00 58.55 O +ATOM 5145 CB LEU B 134 15.940 -16.105 13.737 1.00 58.20 C +ATOM 5146 CG LEU B 134 16.223 -17.577 14.042 1.00 58.30 C +ATOM 5147 CD1 LEU B 134 15.719 -17.923 15.435 1.00 56.51 C +ATOM 5148 CD2 LEU B 134 15.540 -18.449 12.995 1.00 57.81 C +ATOM 5149 N VAL B 135 16.185 -13.236 12.641 1.00 59.27 N +ATOM 5150 CA VAL B 135 15.622 -11.910 12.424 1.00 60.57 C +ATOM 5151 C VAL B 135 15.686 -11.602 10.938 1.00 60.59 C +ATOM 5152 O VAL B 135 14.780 -10.983 10.379 1.00 60.27 O +ATOM 5153 CB VAL B 135 16.401 -10.824 13.193 1.00 61.18 C +ATOM 5154 CG1 VAL B 135 15.852 -9.450 12.835 1.00 59.87 C +ATOM 5155 CG2 VAL B 135 16.285 -11.067 14.695 1.00 58.52 C +ATOM 5156 N PHE B 136 16.764 -12.049 10.305 1.00 61.49 N +ATOM 5157 CA PHE B 136 16.949 -11.839 8.880 1.00 63.52 C +ATOM 5158 C PHE B 136 15.885 -12.625 8.116 1.00 64.77 C +ATOM 5159 O PHE B 136 15.137 -12.057 7.322 1.00 63.93 O +ATOM 5160 CB PHE B 136 18.341 -12.304 8.447 1.00 63.44 C +ATOM 5161 CG PHE B 136 18.646 -12.030 7.003 1.00 64.03 C +ATOM 5162 CD1 PHE B 136 18.815 -10.724 6.551 1.00 64.20 C +ATOM 5163 CD2 PHE B 136 18.747 -13.073 6.089 1.00 65.02 C +ATOM 5164 CE1 PHE B 136 19.081 -10.457 5.212 1.00 64.56 C +ATOM 5165 CE2 PHE B 136 19.013 -12.818 4.741 1.00 65.33 C +ATOM 5166 CZ PHE B 136 19.180 -11.505 4.304 1.00 65.51 C +ATOM 5167 N LEU B 137 15.818 -13.930 8.367 1.00 66.25 N +ATOM 5168 CA LEU B 137 14.846 -14.784 7.691 1.00 68.66 C +ATOM 5169 C LEU B 137 13.418 -14.274 7.838 1.00 69.34 C +ATOM 5170 O LEU B 137 12.724 -14.059 6.847 1.00 69.42 O +ATOM 5171 CB LEU B 137 14.930 -16.222 8.220 1.00 69.43 C +ATOM 5172 CG LEU B 137 15.984 -17.168 7.624 1.00 70.86 C +ATOM 5173 CD1 LEU B 137 15.706 -17.362 6.140 1.00 71.83 C +ATOM 5174 CD2 LEU B 137 17.382 -16.615 7.829 1.00 71.48 C +ATOM 5175 N PHE B 138 12.986 -14.076 9.078 1.00 71.15 N +ATOM 5176 CA PHE B 138 11.633 -13.604 9.355 1.00 72.87 C +ATOM 5177 C PHE B 138 11.264 -12.266 8.708 1.00 73.36 C +ATOM 5178 O PHE B 138 10.136 -11.798 8.856 1.00 73.53 O +ATOM 5179 CB PHE B 138 11.412 -13.529 10.871 1.00 73.70 C +ATOM 5180 CG PHE B 138 11.238 -14.874 11.528 1.00 75.69 C +ATOM 5181 CD1 PHE B 138 11.350 -15.007 12.909 1.00 76.70 C +ATOM 5182 CD2 PHE B 138 10.938 -16.007 10.771 1.00 76.43 C +ATOM 5183 CE1 PHE B 138 11.167 -16.248 13.527 1.00 77.32 C +ATOM 5184 CE2 PHE B 138 10.753 -17.250 11.379 1.00 76.41 C +ATOM 5185 CZ PHE B 138 10.867 -17.371 12.758 1.00 76.32 C +ATOM 5186 N SER B 139 12.201 -11.651 7.993 1.00 73.81 N +ATOM 5187 CA SER B 139 11.917 -10.377 7.336 1.00 74.44 C +ATOM 5188 C SER B 139 11.726 -10.565 5.831 1.00 74.95 C +ATOM 5189 O SER B 139 12.538 -11.209 5.161 1.00 75.57 O +ATOM 5190 CB SER B 139 13.047 -9.374 7.588 1.00 74.29 C +ATOM 5191 OG SER B 139 14.226 -9.736 6.892 1.00 74.73 O +ATOM 5192 N LEU B 147 11.381 -1.730 9.472 1.00 44.58 N +ATOM 5193 CA LEU B 147 12.237 -1.317 10.582 1.00 47.10 C +ATOM 5194 C LEU B 147 11.560 -1.648 11.905 1.00 47.51 C +ATOM 5195 O LEU B 147 12.164 -2.259 12.793 1.00 46.19 O +ATOM 5196 CB LEU B 147 12.522 0.183 10.505 1.00 47.50 C +ATOM 5197 CG LEU B 147 13.960 0.673 10.705 1.00 46.20 C +ATOM 5198 CD1 LEU B 147 14.954 -0.187 9.929 1.00 44.35 C +ATOM 5199 CD2 LEU B 147 14.036 2.114 10.241 1.00 44.73 C +ATOM 5200 N LEU B 148 10.303 -1.242 12.034 1.00 48.22 N +ATOM 5201 CA LEU B 148 9.540 -1.523 13.243 1.00 50.13 C +ATOM 5202 C LEU B 148 9.379 -3.043 13.351 1.00 49.71 C +ATOM 5203 O LEU B 148 9.387 -3.605 14.449 1.00 48.79 O +ATOM 5204 CB LEU B 148 8.172 -0.828 13.175 1.00 50.98 C +ATOM 5205 CG LEU B 148 7.214 -0.920 14.372 1.00 53.73 C +ATOM 5206 CD1 LEU B 148 6.483 -2.247 14.358 1.00 54.76 C +ATOM 5207 CD2 LEU B 148 7.983 -0.733 15.672 1.00 53.40 C +ATOM 5208 N MET B 149 9.250 -3.699 12.200 1.00 49.24 N +ATOM 5209 CA MET B 149 9.107 -5.149 12.144 1.00 50.75 C +ATOM 5210 C MET B 149 10.314 -5.871 12.732 1.00 50.68 C +ATOM 5211 O MET B 149 10.170 -6.917 13.367 1.00 51.35 O +ATOM 5212 CB MET B 149 8.900 -5.608 10.702 1.00 54.39 C +ATOM 5213 CG MET B 149 7.463 -5.509 10.223 1.00 60.15 C +ATOM 5214 SD MET B 149 6.344 -6.538 11.221 1.00 66.17 S +ATOM 5215 CE MET B 149 5.463 -5.250 12.137 1.00 64.03 C +ATOM 5216 N LEU B 150 11.505 -5.325 12.511 1.00 48.82 N +ATOM 5217 CA LEU B 150 12.704 -5.939 13.054 1.00 48.76 C +ATOM 5218 C LEU B 150 12.632 -5.875 14.572 1.00 48.53 C +ATOM 5219 O LEU B 150 13.024 -6.813 15.260 1.00 48.32 O +ATOM 5220 CB LEU B 150 13.955 -5.213 12.562 1.00 48.71 C +ATOM 5221 CG LEU B 150 14.175 -5.214 11.051 1.00 50.12 C +ATOM 5222 CD1 LEU B 150 15.552 -4.640 10.740 1.00 48.62 C +ATOM 5223 CD2 LEU B 150 14.047 -6.638 10.516 1.00 50.68 C +ATOM 5224 N ILE B 151 12.122 -4.760 15.084 1.00 47.71 N +ATOM 5225 CA ILE B 151 11.985 -4.570 16.521 1.00 47.49 C +ATOM 5226 C ILE B 151 10.967 -5.559 17.098 1.00 47.20 C +ATOM 5227 O ILE B 151 11.203 -6.169 18.143 1.00 46.29 O +ATOM 5228 CB ILE B 151 11.535 -3.131 16.852 1.00 45.81 C +ATOM 5229 CG1 ILE B 151 12.606 -2.134 16.403 1.00 46.19 C +ATOM 5230 CG2 ILE B 151 11.281 -2.998 18.341 1.00 45.70 C +ATOM 5231 CD1 ILE B 151 12.234 -0.683 16.637 0.00 46.09 C +ATOM 5232 N LEU B 152 9.834 -5.709 16.422 1.00 46.44 N +ATOM 5233 CA LEU B 152 8.812 -6.636 16.884 1.00 47.57 C +ATOM 5234 C LEU B 152 9.338 -8.076 16.823 1.00 48.30 C +ATOM 5235 O LEU B 152 9.097 -8.868 17.737 1.00 44.78 O +ATOM 5236 CB LEU B 152 7.540 -6.476 16.046 1.00 48.19 C +ATOM 5237 CG LEU B 152 6.464 -5.544 16.626 1.00 50.33 C +ATOM 5238 CD1 LEU B 152 7.089 -4.306 17.246 1.00 49.61 C +ATOM 5239 CD2 LEU B 152 5.484 -5.164 15.525 1.00 50.84 C +ATOM 5240 N ILE B 153 10.066 -8.401 15.753 1.00 46.87 N +ATOM 5241 CA ILE B 153 10.639 -9.732 15.608 1.00 48.06 C +ATOM 5242 C ILE B 153 11.638 -9.973 16.742 1.00 48.53 C +ATOM 5243 O ILE B 153 11.612 -11.018 17.390 1.00 47.26 O +ATOM 5244 CB ILE B 153 11.386 -9.898 14.263 1.00 48.74 C +ATOM 5245 CG1 ILE B 153 10.388 -9.943 13.100 1.00 48.41 C +ATOM 5246 CG2 ILE B 153 12.233 -11.163 14.299 1.00 46.50 C +ATOM 5247 CD1 ILE B 153 11.036 -10.052 11.734 0.00 48.61 C +ATOM 5248 N GLY B 154 12.517 -9.001 16.969 1.00 48.57 N +ATOM 5249 CA GLY B 154 13.508 -9.124 18.021 1.00 49.61 C +ATOM 5250 C GLY B 154 12.866 -9.256 19.391 1.00 51.23 C +ATOM 5251 O GLY B 154 13.446 -9.829 20.314 1.00 50.57 O +ATOM 5252 N MET B 155 11.661 -8.714 19.517 1.00 52.33 N +ATOM 5253 CA MET B 155 10.906 -8.751 20.760 1.00 52.13 C +ATOM 5254 C MET B 155 10.406 -10.175 21.008 1.00 51.68 C +ATOM 5255 O MET B 155 10.457 -10.678 22.130 1.00 50.13 O +ATOM 5256 CB MET B 155 9.727 -7.789 20.644 1.00 56.20 C +ATOM 5257 CG MET B 155 8.904 -7.610 21.896 1.00 60.81 C +ATOM 5258 SD MET B 155 7.600 -6.401 21.585 1.00 67.63 S +ATOM 5259 CE MET B 155 8.588 -4.906 21.393 1.00 66.25 C +ATOM 5260 N ILE B 156 9.918 -10.808 19.948 1.00 50.33 N +ATOM 5261 CA ILE B 156 9.415 -12.171 20.010 1.00 51.04 C +ATOM 5262 C ILE B 156 10.558 -13.118 20.388 1.00 51.39 C +ATOM 5263 O ILE B 156 10.458 -13.877 21.356 1.00 49.57 O +ATOM 5264 CB ILE B 156 8.822 -12.591 18.645 1.00 51.34 C +ATOM 5265 CG1 ILE B 156 7.571 -11.760 18.347 1.00 50.85 C +ATOM 5266 CG2 ILE B 156 8.498 -14.081 18.642 1.00 52.88 C +ATOM 5267 CD1 ILE B 156 6.966 -12.029 16.985 0.00 51.13 C +ATOM 5268 N LEU B 157 11.643 -13.057 19.619 1.00 50.68 N +ATOM 5269 CA LEU B 157 12.814 -13.892 19.856 1.00 50.70 C +ATOM 5270 C LEU B 157 13.366 -13.669 21.257 1.00 51.36 C +ATOM 5271 O LEU B 157 13.733 -14.615 21.951 1.00 51.53 O +ATOM 5272 CB LEU B 157 13.898 -13.585 18.821 1.00 50.86 C +ATOM 5273 CG LEU B 157 13.978 -14.459 17.565 1.00 51.57 C +ATOM 5274 CD1 LEU B 157 12.612 -14.630 16.955 1.00 52.86 C +ATOM 5275 CD2 LEU B 157 14.932 -13.818 16.570 1.00 51.05 C +ATOM 5276 N SER B 158 13.427 -12.411 21.669 1.00 50.79 N +ATOM 5277 CA SER B 158 13.928 -12.073 22.992 1.00 51.44 C +ATOM 5278 C SER B 158 13.047 -12.750 24.045 1.00 51.56 C +ATOM 5279 O SER B 158 13.529 -13.172 25.096 1.00 52.21 O +ATOM 5280 CB SER B 158 13.908 -10.552 23.181 1.00 52.25 C +ATOM 5281 OG SER B 158 14.597 -10.161 24.356 1.00 55.86 O +ATOM 5282 N GLY B 159 11.756 -12.859 23.746 1.00 50.50 N +ATOM 5283 CA GLY B 159 10.823 -13.484 24.665 1.00 49.83 C +ATOM 5284 C GLY B 159 10.981 -14.993 24.762 1.00 49.45 C +ATOM 5285 O GLY B 159 11.001 -15.545 25.858 1.00 47.85 O +ATOM 5286 N LEU B 160 11.079 -15.666 23.620 1.00 49.39 N +ATOM 5287 CA LEU B 160 11.251 -17.115 23.616 1.00 50.08 C +ATOM 5288 C LEU B 160 12.533 -17.485 24.364 1.00 50.16 C +ATOM 5289 O LEU B 160 12.514 -18.316 25.269 1.00 50.90 O +ATOM 5290 CB LEU B 160 11.318 -17.646 22.179 1.00 48.03 C +ATOM 5291 CG LEU B 160 10.034 -17.527 21.356 1.00 50.03 C +ATOM 5292 CD1 LEU B 160 10.275 -18.031 19.936 1.00 49.26 C +ATOM 5293 CD2 LEU B 160 8.929 -18.327 22.025 1.00 49.72 C +ATOM 5294 N PHE B 161 13.643 -16.850 23.996 1.00 49.75 N +ATOM 5295 CA PHE B 161 14.920 -17.133 24.636 1.00 50.46 C +ATOM 5296 C PHE B 161 14.908 -16.904 26.143 1.00 50.69 C +ATOM 5297 O PHE B 161 15.534 -17.659 26.886 1.00 50.41 O +ATOM 5298 CB PHE B 161 16.045 -16.317 23.985 1.00 49.45 C +ATOM 5299 CG PHE B 161 16.455 -16.830 22.635 1.00 51.27 C +ATOM 5300 CD1 PHE B 161 16.118 -16.138 21.475 1.00 52.70 C +ATOM 5301 CD2 PHE B 161 17.148 -18.031 22.518 1.00 52.60 C +ATOM 5302 CE1 PHE B 161 16.461 -16.637 20.219 1.00 54.25 C +ATOM 5303 CE2 PHE B 161 17.496 -18.539 21.265 1.00 52.99 C +ATOM 5304 CZ PHE B 161 17.150 -17.839 20.114 1.00 52.26 C +ATOM 5305 N SER B 162 14.207 -15.868 26.596 1.00 50.67 N +ATOM 5306 CA SER B 162 14.131 -15.591 28.023 1.00 51.28 C +ATOM 5307 C SER B 162 13.342 -16.709 28.688 1.00 51.50 C +ATOM 5308 O SER B 162 13.652 -17.136 29.801 1.00 51.09 O +ATOM 5309 CB SER B 162 13.448 -14.245 28.284 1.00 52.16 C +ATOM 5310 OG SER B 162 14.333 -13.171 28.025 1.00 57.28 O +ATOM 5311 N ALA B 163 12.315 -17.181 27.993 1.00 50.79 N +ATOM 5312 CA ALA B 163 11.499 -18.261 28.512 1.00 51.64 C +ATOM 5313 C ALA B 163 12.377 -19.509 28.625 1.00 52.07 C +ATOM 5314 O ALA B 163 12.349 -20.199 29.647 1.00 52.41 O +ATOM 5315 CB ALA B 163 10.318 -18.520 27.588 1.00 50.33 C +ATOM 5316 N LEU B 164 13.168 -19.781 27.586 1.00 50.85 N +ATOM 5317 CA LEU B 164 14.049 -20.948 27.585 1.00 51.21 C +ATOM 5318 C LEU B 164 15.097 -20.874 28.689 1.00 51.59 C +ATOM 5319 O LEU B 164 15.379 -21.876 29.345 1.00 52.56 O +ATOM 5320 CB LEU B 164 14.739 -21.113 26.229 1.00 50.18 C +ATOM 5321 CG LEU B 164 13.810 -21.341 25.034 1.00 50.39 C +ATOM 5322 CD1 LEU B 164 14.632 -21.702 23.809 1.00 51.82 C +ATOM 5323 CD2 LEU B 164 12.824 -22.455 25.352 1.00 52.60 C +ATOM 5324 N VAL B 165 15.674 -19.694 28.896 1.00 50.45 N +ATOM 5325 CA VAL B 165 16.669 -19.529 29.949 1.00 49.81 C +ATOM 5326 C VAL B 165 16.027 -19.818 31.309 1.00 50.70 C +ATOM 5327 O VAL B 165 16.652 -20.414 32.189 1.00 49.59 O +ATOM 5328 CB VAL B 165 17.249 -18.095 29.960 1.00 48.66 C +ATOM 5329 CG1 VAL B 165 18.059 -17.862 31.228 1.00 47.87 C +ATOM 5330 CG2 VAL B 165 18.134 -17.889 28.747 1.00 48.43 C +ATOM 5331 N SER B 166 14.776 -19.394 31.472 1.00 51.99 N +ATOM 5332 CA SER B 166 14.051 -19.609 32.720 1.00 53.57 C +ATOM 5333 C SER B 166 13.758 -21.081 32.926 1.00 53.79 C +ATOM 5334 O SER B 166 13.838 -21.578 34.043 1.00 53.63 O +ATOM 5335 CB SER B 166 12.731 -18.833 32.723 1.00 53.80 C +ATOM 5336 OG SER B 166 12.964 -17.442 32.796 1.00 54.62 O +ATOM 5337 N LEU B 167 13.413 -21.772 31.845 1.00 55.28 N +ATOM 5338 CA LEU B 167 13.111 -23.193 31.915 1.00 57.35 C +ATOM 5339 C LEU B 167 14.327 -23.982 32.400 1.00 58.72 C +ATOM 5340 O LEU B 167 14.265 -24.649 33.433 1.00 59.17 O +ATOM 5341 CB LEU B 167 12.671 -23.712 30.542 1.00 57.54 C +ATOM 5342 CG LEU B 167 12.237 -25.181 30.482 1.00 58.03 C +ATOM 5343 CD1 LEU B 167 11.016 -25.389 31.376 1.00 57.82 C +ATOM 5344 CD2 LEU B 167 11.921 -25.569 29.043 1.00 57.66 C +ATOM 5345 N LEU B 168 15.427 -23.896 31.652 1.00 59.60 N +ATOM 5346 CA LEU B 168 16.663 -24.601 31.994 1.00 60.30 C +ATOM 5347 C LEU B 168 17.117 -24.250 33.399 1.00 60.75 C +ATOM 5348 O LEU B 168 17.762 -25.043 34.081 1.00 61.70 O +ATOM 5349 CB LEU B 168 17.773 -24.237 31.008 1.00 59.03 C +ATOM 5350 CG LEU B 168 17.571 -24.638 29.545 1.00 60.65 C +ATOM 5351 CD1 LEU B 168 18.757 -24.158 28.719 1.00 61.01 C +ATOM 5352 CD2 LEU B 168 17.422 -26.145 29.437 1.00 59.82 C +ATOM 5353 N GLN B 169 16.772 -23.045 33.821 1.00 61.30 N +ATOM 5354 CA GLN B 169 17.133 -22.545 35.133 1.00 62.09 C +ATOM 5355 C GLN B 169 16.244 -23.203 36.189 1.00 63.65 C +ATOM 5356 O GLN B 169 16.673 -23.460 37.316 1.00 63.52 O +ATOM 5357 CB GLN B 169 16.950 -21.029 35.131 1.00 61.52 C +ATOM 5358 CG GLN B 169 17.503 -20.282 36.313 1.00 60.78 C +ATOM 5359 CD GLN B 169 17.530 -18.785 36.056 1.00 59.77 C +ATOM 5360 OE1 GLN B 169 16.509 -18.183 35.735 1.00 60.16 O +ATOM 5361 NE2 GLN B 169 18.700 -18.181 36.189 1.00 60.32 N +ATOM 5362 N TYR B 170 15.008 -23.495 35.805 1.00 64.46 N +ATOM 5363 CA TYR B 170 14.051 -24.108 36.711 1.00 65.84 C +ATOM 5364 C TYR B 170 14.196 -25.628 36.808 1.00 66.64 C +ATOM 5365 O TYR B 170 13.850 -26.224 37.828 1.00 65.52 O +ATOM 5366 CB TYR B 170 12.629 -23.734 36.277 1.00 65.17 C +ATOM 5367 CG TYR B 170 11.534 -24.367 37.107 1.00 64.55 C +ATOM 5368 CD1 TYR B 170 10.959 -25.580 36.730 1.00 64.60 C +ATOM 5369 CD2 TYR B 170 11.080 -23.758 38.276 1.00 64.24 C +ATOM 5370 CE1 TYR B 170 9.957 -26.172 37.498 1.00 65.21 C +ATOM 5371 CE2 TYR B 170 10.080 -24.340 39.052 1.00 65.02 C +ATOM 5372 CZ TYR B 170 9.524 -25.546 38.657 1.00 65.81 C +ATOM 5373 OH TYR B 170 8.534 -26.126 39.417 1.00 68.71 O +ATOM 5374 N ILE B 171 14.716 -26.249 35.754 1.00 67.96 N +ATOM 5375 CA ILE B 171 14.883 -27.696 35.734 1.00 69.07 C +ATOM 5376 C ILE B 171 16.336 -28.133 35.891 1.00 70.75 C +ATOM 5377 O ILE B 171 16.797 -29.038 35.194 1.00 71.40 O +ATOM 5378 CB ILE B 171 14.327 -28.301 34.424 1.00 68.62 C +ATOM 5379 CG1 ILE B 171 15.126 -27.791 33.222 1.00 68.73 C +ATOM 5380 CG2 ILE B 171 12.862 -27.939 34.275 1.00 69.02 C +ATOM 5381 CD1 ILE B 171 14.684 -28.375 31.895 0.00 68.62 C +ATOM 5382 N SER B 172 17.055 -27.497 36.810 1.00 71.50 N +ATOM 5383 CA SER B 172 18.453 -27.844 37.041 1.00 73.21 C +ATOM 5384 C SER B 172 18.754 -27.873 38.535 1.00 74.45 C +ATOM 5385 O SER B 172 17.978 -27.349 39.331 1.00 75.58 O +ATOM 5386 CB SER B 172 19.370 -26.837 36.334 1.00 72.48 C +ATOM 5387 OG SER B 172 19.195 -25.526 36.843 1.00 70.83 O +ATOM 5388 N ASP B 173 19.871 -28.494 38.913 1.00 75.92 N +ATOM 5389 CA ASP B 173 20.268 -28.580 40.321 1.00 78.14 C +ATOM 5390 C ASP B 173 20.382 -27.187 40.929 1.00 78.21 C +ATOM 5391 O ASP B 173 21.111 -26.341 40.413 1.00 78.55 O +ATOM 5392 CB ASP B 173 21.613 -29.309 40.456 1.00 80.10 C +ATOM 5393 CG ASP B 173 22.184 -29.235 41.869 1.00 82.44 C +ATOM 5394 OD1 ASP B 173 21.510 -29.688 42.820 1.00 83.60 O +ATOM 5395 OD2 ASP B 173 23.311 -28.721 42.029 1.00 83.05 O +ATOM 5396 N THR B 174 19.671 -26.959 42.031 1.00 78.34 N +ATOM 5397 CA THR B 174 19.677 -25.658 42.698 1.00 79.10 C +ATOM 5398 C THR B 174 20.834 -25.487 43.674 1.00 79.67 C +ATOM 5399 O THR B 174 20.814 -24.593 44.520 0.00 79.94 O +ATOM 5400 CB THR B 174 18.369 -25.426 43.476 1.00 78.15 C +ATOM 5401 OG1 THR B 174 18.310 -26.325 44.589 1.00 77.37 O +ATOM 5402 CG2 THR B 174 17.167 -25.665 42.576 1.00 77.73 C +ATOM 5403 N GLU B 175 21.842 -26.342 43.555 1.00 81.41 N +ATOM 5404 CA GLU B 175 22.990 -26.270 44.445 1.00 83.74 C +ATOM 5405 C GLU B 175 24.305 -26.098 43.694 1.00 83.66 C +ATOM 5406 O GLU B 175 25.295 -25.629 44.259 1.00 83.50 O +ATOM 5407 CB GLU B 175 23.049 -27.527 45.316 1.00 86.24 C +ATOM 5408 CG GLU B 175 21.808 -27.733 46.173 1.00 89.94 C +ATOM 5409 CD GLU B 175 21.452 -26.496 46.986 1.00 91.91 C +ATOM 5410 OE1 GLU B 175 22.296 -26.050 47.791 1.00 92.93 O +ATOM 5411 OE2 GLU B 175 20.330 -25.969 46.817 1.00 92.69 O +ATOM 5412 N GLU B 176 24.309 -26.465 42.417 1.00 83.53 N +ATOM 5413 CA GLU B 176 25.513 -26.356 41.606 1.00 82.81 C +ATOM 5414 C GLU B 176 25.283 -25.550 40.329 1.00 80.87 C +ATOM 5415 O GLU B 176 25.904 -24.508 40.119 1.00 81.12 O +ATOM 5416 CB GLU B 176 26.016 -27.756 41.243 1.00 85.03 C +ATOM 5417 CG GLU B 176 27.521 -27.850 41.056 1.00 88.73 C +ATOM 5418 CD GLU B 176 28.282 -27.548 42.337 1.00 91.08 C +ATOM 5419 OE1 GLU B 176 28.197 -26.399 42.828 1.00 92.64 O +ATOM 5420 OE2 GLU B 176 28.962 -28.461 42.857 1.00 91.63 O +ATOM 5421 N LYS B 177 24.380 -26.034 39.482 1.00 78.22 N +ATOM 5422 CA LYS B 177 24.086 -25.375 38.217 1.00 75.08 C +ATOM 5423 C LYS B 177 23.278 -24.078 38.314 1.00 72.49 C +ATOM 5424 O LYS B 177 23.585 -23.113 37.617 1.00 73.19 O +ATOM 5425 CB LYS B 177 23.369 -26.348 37.271 1.00 75.34 C +ATOM 5426 CG LYS B 177 24.185 -27.570 36.880 1.00 76.29 C +ATOM 5427 CD LYS B 177 25.456 -27.188 36.135 1.00 77.32 C +ATOM 5428 CE LYS B 177 26.263 -28.422 35.745 1.00 77.48 C +ATOM 5429 NZ LYS B 177 26.670 -29.218 36.936 0.00 77.53 N +ATOM 5430 N LEU B 178 22.257 -24.042 39.167 1.00 68.58 N +ATOM 5431 CA LEU B 178 21.435 -22.838 39.279 1.00 65.29 C +ATOM 5432 C LEU B 178 22.226 -21.554 39.529 1.00 63.03 C +ATOM 5433 O LEU B 178 22.166 -20.628 38.724 1.00 62.32 O +ATOM 5434 CB LEU B 178 20.359 -22.993 40.362 1.00 63.99 C +ATOM 5435 CG LEU B 178 19.456 -21.758 40.511 1.00 63.31 C +ATOM 5436 CD1 LEU B 178 18.745 -21.496 39.193 1.00 61.19 C +ATOM 5437 CD2 LEU B 178 18.444 -21.960 41.632 1.00 62.52 C +ATOM 5438 N PRO B 179 22.978 -21.476 40.643 1.00 61.41 N +ATOM 5439 CA PRO B 179 23.750 -20.255 40.913 1.00 60.14 C +ATOM 5440 C PRO B 179 24.835 -19.991 39.873 1.00 59.21 C +ATOM 5441 O PRO B 179 25.304 -18.864 39.718 1.00 58.43 O +ATOM 5442 CB PRO B 179 24.325 -20.509 42.303 1.00 58.84 C +ATOM 5443 CG PRO B 179 24.507 -21.982 42.315 1.00 60.84 C +ATOM 5444 CD PRO B 179 23.223 -22.484 41.688 1.00 60.88 C +ATOM 5445 N SER B 180 25.228 -21.037 39.158 1.00 58.01 N +ATOM 5446 CA SER B 180 26.250 -20.903 38.137 1.00 57.36 C +ATOM 5447 C SER B 180 25.644 -20.224 36.909 1.00 56.49 C +ATOM 5448 O SER B 180 26.299 -19.421 36.243 1.00 56.01 O +ATOM 5449 CB SER B 180 26.803 -22.279 37.767 1.00 58.43 C +ATOM 5450 OG SER B 180 28.043 -22.159 37.094 1.00 60.29 O +ATOM 5451 N ILE B 181 24.393 -20.555 36.610 1.00 55.19 N +ATOM 5452 CA ILE B 181 23.699 -19.956 35.475 1.00 54.37 C +ATOM 5453 C ILE B 181 23.410 -18.501 35.834 1.00 54.00 C +ATOM 5454 O ILE B 181 23.834 -17.576 35.143 1.00 53.56 O +ATOM 5455 CB ILE B 181 22.356 -20.674 35.188 1.00 53.37 C +ATOM 5456 CG1 ILE B 181 22.615 -22.123 34.767 1.00 52.07 C +ATOM 5457 CG2 ILE B 181 21.588 -19.931 34.103 1.00 52.73 C +ATOM 5458 CD1 ILE B 181 21.355 -22.925 34.511 0.00 52.68 C +ATOM 5459 N VAL B 182 22.701 -18.324 36.942 1.00 53.41 N +ATOM 5460 CA VAL B 182 22.317 -17.017 37.448 1.00 53.68 C +ATOM 5461 C VAL B 182 23.424 -15.973 37.460 1.00 54.95 C +ATOM 5462 O VAL B 182 23.219 -14.843 37.022 1.00 56.25 O +ATOM 5463 CB VAL B 182 21.760 -17.135 38.882 1.00 52.81 C +ATOM 5464 CG1 VAL B 182 21.520 -15.752 39.474 1.00 51.11 C +ATOM 5465 CG2 VAL B 182 20.472 -17.943 38.865 1.00 53.91 C +ATOM 5466 N PHE B 183 24.597 -16.334 37.961 1.00 55.83 N +ATOM 5467 CA PHE B 183 25.674 -15.364 38.030 1.00 55.90 C +ATOM 5468 C PHE B 183 26.500 -15.197 36.766 1.00 54.40 C +ATOM 5469 O PHE B 183 27.320 -14.285 36.677 1.00 54.53 O +ATOM 5470 CB PHE B 183 26.549 -15.655 39.247 1.00 57.93 C +ATOM 5471 CG PHE B 183 25.805 -15.518 40.543 1.00 62.35 C +ATOM 5472 CD1 PHE B 183 25.100 -14.348 40.828 1.00 62.95 C +ATOM 5473 CD2 PHE B 183 25.759 -16.567 41.458 1.00 63.58 C +ATOM 5474 CE1 PHE B 183 24.357 -14.226 42.002 1.00 63.92 C +ATOM 5475 CE2 PHE B 183 25.018 -16.454 42.635 1.00 64.88 C +ATOM 5476 CZ PHE B 183 24.315 -15.281 42.906 1.00 64.98 C +ATOM 5477 N TRP B 184 26.296 -16.071 35.789 1.00 53.13 N +ATOM 5478 CA TRP B 184 26.998 -15.909 34.527 1.00 52.65 C +ATOM 5479 C TRP B 184 26.158 -14.882 33.772 1.00 53.04 C +ATOM 5480 O TRP B 184 26.685 -14.006 33.094 1.00 52.59 O +ATOM 5481 CB TRP B 184 27.035 -17.198 33.713 1.00 50.85 C +ATOM 5482 CG TRP B 184 27.565 -16.943 32.332 1.00 49.83 C +ATOM 5483 CD1 TRP B 184 28.859 -16.673 31.990 1.00 49.83 C +ATOM 5484 CD2 TRP B 184 26.801 -16.833 31.126 1.00 47.43 C +ATOM 5485 NE1 TRP B 184 28.947 -16.397 30.647 1.00 50.53 N +ATOM 5486 CE2 TRP B 184 27.699 -16.488 30.092 1.00 47.99 C +ATOM 5487 CE3 TRP B 184 25.443 -16.988 30.819 1.00 47.03 C +ATOM 5488 CZ2 TRP B 184 27.287 -16.295 28.773 1.00 46.33 C +ATOM 5489 CZ3 TRP B 184 25.031 -16.796 29.506 1.00 48.27 C +ATOM 5490 CH2 TRP B 184 25.953 -16.452 28.499 1.00 48.85 C +ATOM 5491 N LEU B 185 24.841 -15.009 33.913 1.00 53.19 N +ATOM 5492 CA LEU B 185 23.891 -14.111 33.274 1.00 53.75 C +ATOM 5493 C LEU B 185 24.117 -12.660 33.661 1.00 54.77 C +ATOM 5494 O LEU B 185 23.999 -11.773 32.817 1.00 55.74 O +ATOM 5495 CB LEU B 185 22.459 -14.503 33.625 1.00 52.74 C +ATOM 5496 CG LEU B 185 21.873 -15.730 32.925 1.00 52.62 C +ATOM 5497 CD1 LEU B 185 20.479 -15.999 33.480 1.00 54.04 C +ATOM 5498 CD2 LEU B 185 21.812 -15.499 31.423 1.00 52.86 C +ATOM 5499 N MET B 186 24.428 -12.393 34.925 1.00 54.16 N +ATOM 5500 CA MET B 186 24.660 -11.006 35.291 1.00 54.93 C +ATOM 5501 C MET B 186 26.123 -10.629 35.095 1.00 54.00 C +ATOM 5502 O MET B 186 26.982 -10.952 35.911 1.00 55.39 O +ATOM 5503 CB MET B 186 24.166 -10.701 36.720 1.00 54.79 C +ATOM 5504 CG MET B 186 24.698 -11.543 37.858 1.00 56.96 C +ATOM 5505 SD MET B 186 24.089 -10.867 39.448 1.00 56.48 S +ATOM 5506 CE MET B 186 22.651 -11.879 39.765 1.00 56.99 C +ATOM 5507 N GLY B 187 26.372 -9.949 33.976 1.00 53.33 N +ATOM 5508 CA GLY B 187 27.700 -9.506 33.575 1.00 51.01 C +ATOM 5509 C GLY B 187 28.674 -9.106 34.659 1.00 51.07 C +ATOM 5510 O GLY B 187 28.305 -8.429 35.620 1.00 51.13 O +ATOM 5511 N SER B 188 29.934 -9.498 34.477 1.00 50.77 N +ATOM 5512 CA SER B 188 30.984 -9.220 35.451 1.00 51.35 C +ATOM 5513 C SER B 188 32.391 -9.346 34.857 1.00 50.92 C +ATOM 5514 O SER B 188 32.619 -10.118 33.932 1.00 51.81 O +ATOM 5515 CB SER B 188 30.835 -10.193 36.634 1.00 53.22 C +ATOM 5516 OG SER B 188 31.843 -9.997 37.613 1.00 55.43 O +ATOM 5517 N PHE B 189 33.333 -8.582 35.396 1.00 51.27 N +ATOM 5518 CA PHE B 189 34.719 -8.625 34.938 1.00 52.88 C +ATOM 5519 C PHE B 189 35.580 -9.353 35.976 1.00 54.71 C +ATOM 5520 O PHE B 189 36.800 -9.437 35.840 1.00 54.51 O +ATOM 5521 CB PHE B 189 35.251 -7.201 34.739 1.00 53.21 C +ATOM 5522 CG PHE B 189 34.611 -6.465 33.590 1.00 53.55 C +ATOM 5523 CD1 PHE B 189 34.462 -5.083 33.633 1.00 52.41 C +ATOM 5524 CD2 PHE B 189 34.157 -7.153 32.464 1.00 53.80 C +ATOM 5525 CE1 PHE B 189 33.868 -4.398 32.574 1.00 52.76 C +ATOM 5526 CE2 PHE B 189 33.564 -6.476 31.402 1.00 53.23 C +ATOM 5527 CZ PHE B 189 33.419 -5.096 31.459 1.00 52.32 C +ATOM 5528 N ALA B 190 34.926 -9.882 37.008 1.00 56.49 N +ATOM 5529 CA ALA B 190 35.601 -10.592 38.095 1.00 59.97 C +ATOM 5530 C ALA B 190 36.618 -11.621 37.616 1.00 60.68 C +ATOM 5531 O ALA B 190 37.770 -11.615 38.050 1.00 60.95 O +ATOM 5532 CB ALA B 190 34.565 -11.275 38.991 1.00 59.88 C +ATOM 5533 N THR B 191 36.186 -12.499 36.719 1.00 62.21 N +ATOM 5534 CA THR B 191 37.049 -13.547 36.192 1.00 62.88 C +ATOM 5535 C THR B 191 37.667 -13.207 34.840 1.00 63.71 C +ATOM 5536 O THR B 191 37.531 -13.970 33.883 1.00 64.94 O +ATOM 5537 CB THR B 191 36.269 -14.856 36.052 1.00 62.68 C +ATOM 5538 OG1 THR B 191 35.221 -14.687 35.091 1.00 63.37 O +ATOM 5539 CG2 THR B 191 35.659 -15.251 37.386 1.00 61.37 C +ATOM 5540 N SER B 192 38.358 -12.073 34.766 1.00 63.99 N +ATOM 5541 CA SER B 192 38.993 -11.640 33.522 1.00 64.30 C +ATOM 5542 C SER B 192 40.448 -12.101 33.412 1.00 64.66 C +ATOM 5543 O SER B 192 41.245 -11.906 34.334 1.00 64.77 O +ATOM 5544 CB SER B 192 38.941 -10.113 33.410 1.00 64.53 C +ATOM 5545 OG SER B 192 37.606 -9.643 33.441 1.00 66.28 O +ATOM 5546 N ASN B 193 40.790 -12.703 32.277 1.00 64.47 N +ATOM 5547 CA ASN B 193 42.147 -13.185 32.033 1.00 64.32 C +ATOM 5548 C ASN B 193 42.535 -12.932 30.581 1.00 64.44 C +ATOM 5549 O ASN B 193 41.679 -12.651 29.744 1.00 64.07 O +ATOM 5550 CB ASN B 193 42.245 -14.678 32.355 1.00 63.74 C +ATOM 5551 CG ASN B 193 41.267 -15.512 31.557 1.00 64.48 C +ATOM 5552 OD1 ASN B 193 40.499 -16.293 32.119 1.00 63.98 O +ATOM 5553 ND2 ASN B 193 41.292 -15.356 30.239 1.00 64.89 N +ATOM 5554 N TRP B 194 43.825 -13.036 30.282 1.00 65.21 N +ATOM 5555 CA TRP B 194 44.302 -12.793 28.925 1.00 65.74 C +ATOM 5556 C TRP B 194 43.656 -13.701 27.888 1.00 65.78 C +ATOM 5557 O TRP B 194 43.490 -13.311 26.731 1.00 65.97 O +ATOM 5558 CB TRP B 194 45.825 -12.934 28.857 1.00 66.04 C +ATOM 5559 CG TRP B 194 46.558 -11.916 29.679 1.00 65.72 C +ATOM 5560 CD1 TRP B 194 46.988 -12.055 30.968 1.00 65.50 C +ATOM 5561 CD2 TRP B 194 46.929 -10.592 29.273 1.00 65.63 C +ATOM 5562 NE1 TRP B 194 47.607 -10.901 31.390 1.00 65.14 N +ATOM 5563 CE2 TRP B 194 47.585 -9.987 30.370 1.00 65.55 C +ATOM 5564 CE3 TRP B 194 46.771 -9.858 28.089 1.00 64.83 C +ATOM 5565 CZ2 TRP B 194 48.085 -8.680 30.318 1.00 64.67 C +ATOM 5566 CZ3 TRP B 194 47.268 -8.558 28.036 1.00 64.74 C +ATOM 5567 CH2 TRP B 194 47.917 -7.984 29.146 1.00 64.89 C +ATOM 5568 N GLU B 195 43.289 -14.910 28.295 1.00 65.31 N +ATOM 5569 CA GLU B 195 42.658 -15.840 27.369 1.00 65.39 C +ATOM 5570 C GLU B 195 41.405 -15.190 26.797 1.00 64.02 C +ATOM 5571 O GLU B 195 41.254 -15.063 25.582 1.00 63.87 O +ATOM 5572 CB GLU B 195 42.274 -17.133 28.086 1.00 67.15 C +ATOM 5573 CG GLU B 195 41.733 -18.213 27.167 1.00 69.55 C +ATOM 5574 CD GLU B 195 41.131 -19.369 27.937 1.00 72.47 C +ATOM 5575 OE1 GLU B 195 41.790 -19.857 28.881 1.00 73.48 O +ATOM 5576 OE2 GLU B 195 40.003 -19.790 27.598 1.00 73.08 O +ATOM 5577 N LYS B 196 40.511 -14.780 27.691 1.00 62.36 N +ATOM 5578 CA LYS B 196 39.264 -14.138 27.302 1.00 60.33 C +ATOM 5579 C LYS B 196 39.524 -12.846 26.527 1.00 58.27 C +ATOM 5580 O LYS B 196 39.005 -12.659 25.429 1.00 56.62 O +ATOM 5581 CB LYS B 196 38.423 -13.854 28.550 1.00 61.03 C +ATOM 5582 CG LYS B 196 38.009 -15.115 29.300 1.00 62.03 C +ATOM 5583 CD LYS B 196 37.123 -14.798 30.498 1.00 64.33 C +ATOM 5584 CE LYS B 196 36.631 -16.073 31.179 1.00 66.30 C +ATOM 5585 NZ LYS B 196 35.775 -15.793 32.368 1.00 68.10 N +ATOM 5586 N LEU B 197 40.341 -11.967 27.100 1.00 56.05 N +ATOM 5587 CA LEU B 197 40.680 -10.702 26.468 1.00 54.65 C +ATOM 5588 C LEU B 197 41.122 -10.856 25.012 1.00 56.48 C +ATOM 5589 O LEU B 197 40.586 -10.195 24.120 1.00 56.45 O +ATOM 5590 CB LEU B 197 41.782 -10.001 27.263 1.00 52.81 C +ATOM 5591 CG LEU B 197 42.379 -8.733 26.645 1.00 51.83 C +ATOM 5592 CD1 LEU B 197 41.274 -7.729 26.330 1.00 52.30 C +ATOM 5593 CD2 LEU B 197 43.387 -8.138 27.598 1.00 48.99 C +ATOM 5594 N LEU B 198 42.098 -11.726 24.768 1.00 57.67 N +ATOM 5595 CA LEU B 198 42.589 -11.933 23.412 1.00 57.71 C +ATOM 5596 C LEU B 198 41.537 -12.590 22.528 1.00 56.25 C +ATOM 5597 O LEU B 198 41.523 -12.388 21.312 1.00 56.94 O +ATOM 5598 CB LEU B 198 43.875 -12.768 23.427 1.00 59.02 C +ATOM 5599 CG LEU B 198 45.057 -12.118 24.160 1.00 61.31 C +ATOM 5600 CD1 LEU B 198 46.283 -13.013 24.047 1.00 62.36 C +ATOM 5601 CD2 LEU B 198 45.356 -10.743 23.570 1.00 61.03 C +ATOM 5602 N PHE B 199 40.650 -13.372 23.130 1.00 53.72 N +ATOM 5603 CA PHE B 199 39.599 -14.014 22.351 1.00 53.36 C +ATOM 5604 C PHE B 199 38.620 -12.944 21.860 1.00 53.09 C +ATOM 5605 O PHE B 199 38.160 -12.980 20.715 1.00 52.96 O +ATOM 5606 CB PHE B 199 38.839 -15.037 23.194 1.00 52.71 C +ATOM 5607 CG PHE B 199 37.617 -15.584 22.512 1.00 54.10 C +ATOM 5608 CD1 PHE B 199 37.733 -16.530 21.501 1.00 54.62 C +ATOM 5609 CD2 PHE B 199 36.351 -15.114 22.847 1.00 54.57 C +ATOM 5610 CE1 PHE B 199 36.601 -17.001 20.828 1.00 55.85 C +ATOM 5611 CE2 PHE B 199 35.215 -15.575 22.182 1.00 54.99 C +ATOM 5612 CZ PHE B 199 35.341 -16.521 21.170 1.00 56.01 C +ATOM 5613 N PHE B 200 38.308 -11.995 22.739 1.00 51.12 N +ATOM 5614 CA PHE B 200 37.384 -10.916 22.418 1.00 49.54 C +ATOM 5615 C PHE B 200 38.005 -9.871 21.503 1.00 48.10 C +ATOM 5616 O PHE B 200 37.368 -9.406 20.564 1.00 45.62 O +ATOM 5617 CB PHE B 200 36.902 -10.240 23.703 1.00 48.71 C +ATOM 5618 CG PHE B 200 36.027 -9.040 23.469 1.00 46.81 C +ATOM 5619 CD1 PHE B 200 36.521 -7.754 23.664 1.00 46.30 C +ATOM 5620 CD2 PHE B 200 34.713 -9.195 23.044 1.00 45.24 C +ATOM 5621 CE1 PHE B 200 35.715 -6.637 23.439 1.00 45.47 C +ATOM 5622 CE2 PHE B 200 33.901 -8.086 22.816 1.00 44.43 C +ATOM 5623 CZ PHE B 200 34.402 -6.806 23.014 1.00 42.62 C +ATOM 5624 N PHE B 201 39.254 -9.520 21.786 1.00 48.35 N +ATOM 5625 CA PHE B 201 39.972 -8.510 21.023 1.00 49.46 C +ATOM 5626 C PHE B 201 39.998 -8.749 19.520 1.00 49.57 C +ATOM 5627 O PHE B 201 39.910 -7.802 18.746 1.00 49.45 O +ATOM 5628 CB PHE B 201 41.407 -8.380 21.539 1.00 50.68 C +ATOM 5629 CG PHE B 201 42.109 -7.137 21.069 1.00 52.05 C +ATOM 5630 CD1 PHE B 201 41.666 -5.879 21.474 1.00 52.73 C +ATOM 5631 CD2 PHE B 201 43.207 -7.221 20.219 1.00 53.11 C +ATOM 5632 CE1 PHE B 201 42.307 -4.720 21.040 1.00 52.99 C +ATOM 5633 CE2 PHE B 201 43.859 -6.068 19.777 1.00 53.80 C +ATOM 5634 CZ PHE B 201 43.407 -4.813 20.189 1.00 54.15 C +ATOM 5635 N VAL B 202 40.123 -10.001 19.096 1.00 50.21 N +ATOM 5636 CA VAL B 202 40.163 -10.278 17.666 1.00 50.75 C +ATOM 5637 C VAL B 202 38.877 -9.820 16.976 1.00 52.05 C +ATOM 5638 O VAL B 202 38.925 -9.016 16.044 1.00 52.25 O +ATOM 5639 CB VAL B 202 40.416 -11.779 17.389 1.00 51.80 C +ATOM 5640 CG1 VAL B 202 40.284 -12.074 15.900 1.00 48.33 C +ATOM 5641 CG2 VAL B 202 41.810 -12.157 17.873 1.00 51.13 C +ATOM 5642 N PRO B 203 37.709 -10.321 17.418 1.00 52.78 N +ATOM 5643 CA PRO B 203 36.465 -9.887 16.770 1.00 51.25 C +ATOM 5644 C PRO B 203 36.259 -8.391 16.998 1.00 50.38 C +ATOM 5645 O PRO B 203 35.796 -7.669 16.116 1.00 50.21 O +ATOM 5646 CB PRO B 203 35.392 -10.717 17.478 1.00 51.82 C +ATOM 5647 CG PRO B 203 36.129 -11.937 17.926 1.00 53.27 C +ATOM 5648 CD PRO B 203 37.434 -11.357 18.427 1.00 53.26 C +ATOM 5649 N PHE B 204 36.613 -7.932 18.193 1.00 47.83 N +ATOM 5650 CA PHE B 204 36.459 -6.532 18.542 1.00 47.25 C +ATOM 5651 C PHE B 204 37.165 -5.624 17.542 1.00 48.32 C +ATOM 5652 O PHE B 204 36.554 -4.711 16.989 1.00 48.32 O +ATOM 5653 CB PHE B 204 36.990 -6.284 19.955 1.00 44.81 C +ATOM 5654 CG PHE B 204 37.112 -4.831 20.310 1.00 43.77 C +ATOM 5655 CD1 PHE B 204 38.358 -4.210 20.336 1.00 42.23 C +ATOM 5656 CD2 PHE B 204 35.981 -4.075 20.605 1.00 41.34 C +ATOM 5657 CE1 PHE B 204 38.474 -2.853 20.653 1.00 40.66 C +ATOM 5658 CE2 PHE B 204 36.090 -2.720 20.921 1.00 39.13 C +ATOM 5659 CZ PHE B 204 37.336 -2.110 20.946 1.00 36.54 C +ATOM 5660 N LEU B 205 38.447 -5.886 17.310 1.00 48.87 N +ATOM 5661 CA LEU B 205 39.253 -5.101 16.381 1.00 50.01 C +ATOM 5662 C LEU B 205 38.716 -5.203 14.959 1.00 50.14 C +ATOM 5663 O LEU B 205 38.611 -4.205 14.252 1.00 50.33 O +ATOM 5664 CB LEU B 205 40.703 -5.583 16.429 1.00 51.94 C +ATOM 5665 CG LEU B 205 41.772 -4.866 15.605 1.00 53.68 C +ATOM 5666 CD1 LEU B 205 43.143 -5.238 16.150 1.00 53.59 C +ATOM 5667 CD2 LEU B 205 41.656 -5.246 14.136 1.00 54.85 C +ATOM 5668 N LEU B 206 38.367 -6.416 14.552 1.00 49.81 N +ATOM 5669 CA LEU B 206 37.846 -6.661 13.217 1.00 48.74 C +ATOM 5670 C LEU B 206 36.522 -5.924 12.991 1.00 48.97 C +ATOM 5671 O LEU B 206 36.355 -5.228 11.989 1.00 48.14 O +ATOM 5672 CB LEU B 206 37.674 -8.173 13.012 1.00 50.67 C +ATOM 5673 CG LEU B 206 37.320 -8.767 11.644 1.00 51.93 C +ATOM 5674 CD1 LEU B 206 35.836 -8.613 11.369 1.00 53.54 C +ATOM 5675 CD2 LEU B 206 38.158 -8.096 10.564 1.00 54.86 C +ATOM 5676 N CYS B 207 35.586 -6.066 13.924 1.00 48.35 N +ATOM 5677 CA CYS B 207 34.284 -5.413 13.797 1.00 47.61 C +ATOM 5678 C CYS B 207 34.362 -3.889 13.873 1.00 45.90 C +ATOM 5679 O CYS B 207 33.713 -3.190 13.092 1.00 45.17 O +ATOM 5680 CB CYS B 207 33.322 -5.943 14.864 1.00 47.31 C +ATOM 5681 SG CYS B 207 32.711 -7.610 14.506 1.00 53.04 S +ATOM 5682 N SER B 208 35.159 -3.380 14.808 1.00 42.74 N +ATOM 5683 CA SER B 208 35.322 -1.946 14.969 1.00 42.41 C +ATOM 5684 C SER B 208 35.923 -1.303 13.723 1.00 43.75 C +ATOM 5685 O SER B 208 35.506 -0.218 13.316 1.00 43.88 O +ATOM 5686 CB SER B 208 36.213 -1.644 16.170 1.00 41.09 C +ATOM 5687 OG SER B 208 35.591 -2.050 17.374 1.00 45.22 O +ATOM 5688 N SER B 209 36.905 -1.973 13.124 1.00 43.01 N +ATOM 5689 CA SER B 209 37.564 -1.455 11.929 1.00 42.28 C +ATOM 5690 C SER B 209 36.600 -1.286 10.768 1.00 39.69 C +ATOM 5691 O SER B 209 36.600 -0.251 10.106 1.00 40.69 O +ATOM 5692 CB SER B 209 38.710 -2.375 11.504 1.00 43.85 C +ATOM 5693 OG SER B 209 39.748 -2.354 12.464 1.00 49.38 O +ATOM 5694 N ILE B 210 35.788 -2.304 10.518 1.00 37.32 N +ATOM 5695 CA ILE B 210 34.825 -2.245 9.433 1.00 37.67 C +ATOM 5696 C ILE B 210 33.793 -1.147 9.696 1.00 38.49 C +ATOM 5697 O ILE B 210 33.474 -0.368 8.802 1.00 37.22 O +ATOM 5698 CB ILE B 210 34.093 -3.593 9.249 1.00 37.23 C +ATOM 5699 CG1 ILE B 210 35.095 -4.690 8.864 1.00 37.75 C +ATOM 5700 CG2 ILE B 210 33.031 -3.466 8.154 1.00 37.26 C +ATOM 5701 CD1 ILE B 210 34.477 -6.066 8.718 0.00 37.50 C +ATOM 5702 N LEU B 211 33.271 -1.082 10.921 1.00 38.64 N +ATOM 5703 CA LEU B 211 32.284 -0.060 11.252 1.00 36.66 C +ATOM 5704 C LEU B 211 32.887 1.330 11.117 1.00 35.72 C +ATOM 5705 O LEU B 211 32.245 2.243 10.595 1.00 34.00 O +ATOM 5706 CB LEU B 211 31.732 -0.269 12.667 1.00 35.30 C +ATOM 5707 CG LEU B 211 30.839 -1.511 12.798 1.00 37.55 C +ATOM 5708 CD1 LEU B 211 30.470 -1.744 14.256 1.00 35.81 C +ATOM 5709 CD2 LEU B 211 29.587 -1.333 11.941 1.00 36.03 C +ATOM 5710 N LEU B 212 34.122 1.490 11.576 1.00 35.76 N +ATOM 5711 CA LEU B 212 34.790 2.782 11.483 1.00 36.98 C +ATOM 5712 C LEU B 212 35.012 3.195 10.034 1.00 36.83 C +ATOM 5713 O LEU B 212 34.982 4.379 9.716 1.00 38.59 O +ATOM 5714 CB LEU B 212 36.126 2.757 12.222 1.00 36.33 C +ATOM 5715 CG LEU B 212 36.008 2.838 13.745 1.00 38.53 C +ATOM 5716 CD1 LEU B 212 37.374 2.630 14.385 1.00 38.94 C +ATOM 5717 CD2 LEU B 212 35.425 4.180 14.140 1.00 35.48 C +ATOM 5718 N SER B 213 35.216 2.222 9.152 1.00 34.97 N +ATOM 5719 CA SER B 213 35.435 2.537 7.750 1.00 34.21 C +ATOM 5720 C SER B 213 34.114 2.866 7.062 1.00 34.99 C +ATOM 5721 O SER B 213 34.117 3.411 5.959 1.00 35.26 O +ATOM 5722 CB SER B 213 36.128 1.378 7.032 1.00 33.09 C +ATOM 5723 OG SER B 213 35.231 0.301 6.826 1.00 39.83 O +ATOM 5724 N LEU B 214 32.997 2.524 7.714 1.00 34.06 N +ATOM 5725 CA LEU B 214 31.643 2.809 7.213 1.00 32.93 C +ATOM 5726 C LEU B 214 31.109 4.016 7.982 1.00 33.31 C +ATOM 5727 O LEU B 214 29.930 4.361 7.902 1.00 33.99 O +ATOM 5728 CB LEU B 214 30.697 1.630 7.463 1.00 33.85 C +ATOM 5729 CG LEU B 214 30.775 0.395 6.573 1.00 36.46 C +ATOM 5730 CD1 LEU B 214 29.898 -0.694 7.159 1.00 38.28 C +ATOM 5731 CD2 LEU B 214 30.332 0.747 5.152 1.00 37.62 C +ATOM 5732 N SER B 215 31.999 4.631 8.747 1.00 31.61 N +ATOM 5733 CA SER B 215 31.686 5.790 9.565 1.00 33.82 C +ATOM 5734 C SER B 215 30.758 6.809 8.918 1.00 33.68 C +ATOM 5735 O SER B 215 29.675 7.096 9.430 1.00 32.64 O +ATOM 5736 CB SER B 215 32.979 6.501 9.945 1.00 32.80 C +ATOM 5737 OG SER B 215 33.099 6.539 11.340 1.00 41.51 O +ATOM 5738 N TRP B 216 31.206 7.369 7.800 1.00 32.16 N +ATOM 5739 CA TRP B 216 30.440 8.387 7.105 1.00 31.18 C +ATOM 5740 C TRP B 216 29.210 7.813 6.428 1.00 31.11 C +ATOM 5741 O TRP B 216 28.165 8.456 6.377 1.00 29.11 O +ATOM 5742 CB TRP B 216 31.318 9.092 6.067 1.00 28.73 C +ATOM 5743 CG TRP B 216 30.601 10.189 5.353 1.00 28.20 C +ATOM 5744 CD1 TRP B 216 30.374 11.461 5.811 1.00 25.25 C +ATOM 5745 CD2 TRP B 216 29.966 10.100 4.073 1.00 24.05 C +ATOM 5746 NE1 TRP B 216 29.634 12.164 4.890 1.00 29.80 N +ATOM 5747 CE2 TRP B 216 29.369 11.354 3.815 1.00 27.26 C +ATOM 5748 CE3 TRP B 216 29.841 9.079 3.122 1.00 25.28 C +ATOM 5749 CZ2 TRP B 216 28.652 11.619 2.636 1.00 23.92 C +ATOM 5750 CZ3 TRP B 216 29.127 9.337 1.950 1.00 25.36 C +ATOM 5751 CH2 TRP B 216 28.541 10.603 1.720 1.00 24.03 C +ATOM 5752 N ARG B 217 29.330 6.601 5.909 1.00 31.78 N +ATOM 5753 CA ARG B 217 28.205 5.986 5.229 1.00 33.55 C +ATOM 5754 C ARG B 217 27.022 5.772 6.177 1.00 33.66 C +ATOM 5755 O ARG B 217 25.876 5.713 5.735 1.00 31.47 O +ATOM 5756 CB ARG B 217 28.621 4.658 4.603 1.00 33.67 C +ATOM 5757 CG ARG B 217 27.728 4.252 3.444 1.00 37.49 C +ATOM 5758 CD ARG B 217 28.555 4.080 2.194 1.00 39.11 C +ATOM 5759 NE ARG B 217 27.871 4.603 1.020 1.00 43.10 N +ATOM 5760 CZ ARG B 217 28.415 5.462 0.164 1.00 41.60 C +ATOM 5761 NH1 ARG B 217 27.716 5.883 -0.880 1.00 44.40 N +ATOM 5762 NH2 ARG B 217 29.654 5.904 0.353 1.00 41.42 N +ATOM 5763 N LEU B 218 27.295 5.666 7.476 1.00 33.67 N +ATOM 5764 CA LEU B 218 26.223 5.478 8.450 1.00 34.45 C +ATOM 5765 C LEU B 218 25.259 6.653 8.408 1.00 31.62 C +ATOM 5766 O LEU B 218 24.073 6.494 8.673 1.00 30.77 O +ATOM 5767 CB LEU B 218 26.781 5.334 9.873 1.00 39.37 C +ATOM 5768 CG LEU B 218 27.503 4.026 10.210 1.00 45.28 C +ATOM 5769 CD1 LEU B 218 27.900 4.041 11.682 1.00 48.56 C +ATOM 5770 CD2 LEU B 218 26.594 2.826 9.917 1.00 46.98 C +ATOM 5771 N ASN B 219 25.768 7.835 8.080 1.00 29.69 N +ATOM 5772 CA ASN B 219 24.914 9.013 8.003 1.00 28.98 C +ATOM 5773 C ASN B 219 23.779 8.783 7.019 1.00 27.87 C +ATOM 5774 O ASN B 219 22.669 9.259 7.223 1.00 27.50 O +ATOM 5775 CB ASN B 219 25.710 10.246 7.566 1.00 27.96 C +ATOM 5776 CG ASN B 219 26.677 10.726 8.628 1.00 31.82 C +ATOM 5777 OD1 ASN B 219 26.408 10.622 9.820 1.00 33.19 O +ATOM 5778 ND2 ASN B 219 27.805 11.275 8.196 1.00 33.49 N +ATOM 5779 N LEU B 220 24.069 8.040 5.957 1.00 29.74 N +ATOM 5780 CA LEU B 220 23.102 7.741 4.907 1.00 31.58 C +ATOM 5781 C LEU B 220 21.958 6.820 5.322 1.00 33.32 C +ATOM 5782 O LEU B 220 20.922 6.786 4.655 1.00 29.49 O +ATOM 5783 CB LEU B 220 23.829 7.149 3.706 1.00 33.00 C +ATOM 5784 CG LEU B 220 24.943 8.066 3.206 1.00 33.14 C +ATOM 5785 CD1 LEU B 220 25.728 7.352 2.128 1.00 35.02 C +ATOM 5786 CD2 LEU B 220 24.345 9.377 2.687 1.00 34.42 C +ATOM 5787 N LEU B 221 22.141 6.067 6.405 1.00 36.42 N +ATOM 5788 CA LEU B 221 21.075 5.192 6.893 1.00 41.29 C +ATOM 5789 C LEU B 221 19.918 6.031 7.442 1.00 42.22 C +ATOM 5790 O LEU B 221 18.855 5.500 7.757 1.00 44.73 O +ATOM 5791 CB LEU B 221 21.582 4.272 8.006 1.00 43.90 C +ATOM 5792 CG LEU B 221 22.369 3.019 7.616 1.00 47.17 C +ATOM 5793 CD1 LEU B 221 22.762 2.259 8.874 1.00 49.66 C +ATOM 5794 CD2 LEU B 221 21.519 2.137 6.722 1.00 48.66 C +ATOM 5795 N SER B 222 20.136 7.337 7.553 1.00 41.41 N +ATOM 5796 CA SER B 222 19.130 8.264 8.067 1.00 44.28 C +ATOM 5797 C SER B 222 18.234 8.815 6.946 1.00 45.20 C +ATOM 5798 O SER B 222 17.308 9.581 7.196 1.00 44.73 O +ATOM 5799 CB SER B 222 19.828 9.427 8.788 1.00 47.28 C +ATOM 5800 OG SER B 222 20.829 8.953 9.694 1.00 51.49 O +ATOM 5801 N LEU B 223 18.516 8.420 5.711 1.00 46.50 N +ATOM 5802 CA LEU B 223 17.743 8.873 4.558 1.00 47.93 C +ATOM 5803 C LEU B 223 16.450 8.083 4.332 1.00 49.38 C +ATOM 5804 O LEU B 223 16.254 7.011 4.899 1.00 48.66 O +ATOM 5805 CB LEU B 223 18.610 8.788 3.299 1.00 47.16 C +ATOM 5806 CG LEU B 223 19.490 9.979 2.895 1.00 48.05 C +ATOM 5807 CD1 LEU B 223 19.676 10.941 4.044 1.00 50.09 C +ATOM 5808 CD2 LEU B 223 20.822 9.455 2.401 1.00 48.70 C +ATOM 5809 N ASP B 224 15.557 8.635 3.515 1.00 50.85 N +ATOM 5810 CA ASP B 224 14.316 7.947 3.194 1.00 52.01 C +ATOM 5811 C ASP B 224 14.507 7.253 1.846 1.00 52.65 C +ATOM 5812 O ASP B 224 15.373 7.634 1.045 1.00 49.95 O +ATOM 5813 CB ASP B 224 13.136 8.922 3.116 1.00 54.76 C +ATOM 5814 CG ASP B 224 12.064 8.634 4.169 1.00 59.82 C +ATOM 5815 OD1 ASP B 224 10.952 9.202 4.065 1.00 61.16 O +ATOM 5816 OD2 ASP B 224 12.332 7.845 5.109 1.00 61.94 O +ATOM 5817 N GLU B 225 13.690 6.233 1.613 1.00 52.49 N +ATOM 5818 CA GLU B 225 13.739 5.436 0.400 1.00 51.58 C +ATOM 5819 C GLU B 225 14.064 6.220 -0.876 1.00 50.74 C +ATOM 5820 O GLU B 225 15.040 5.919 -1.566 1.00 49.91 O +ATOM 5821 CB GLU B 225 12.407 4.700 0.236 1.00 53.82 C +ATOM 5822 CG GLU B 225 12.412 3.602 -0.821 1.00 60.04 C +ATOM 5823 CD GLU B 225 11.110 2.805 -0.844 1.00 63.50 C +ATOM 5824 OE1 GLU B 225 11.035 1.795 -1.578 1.00 65.71 O +ATOM 5825 OE2 GLU B 225 10.161 3.189 -0.130 1.00 65.12 O +ATOM 5826 N LYS B 226 13.258 7.228 -1.185 1.00 49.87 N +ATOM 5827 CA LYS B 226 13.463 7.999 -2.406 1.00 49.61 C +ATOM 5828 C LYS B 226 14.840 8.638 -2.555 1.00 47.86 C +ATOM 5829 O LYS B 226 15.448 8.550 -3.627 1.00 47.02 O +ATOM 5830 CB LYS B 226 12.372 9.064 -2.557 1.00 51.78 C +ATOM 5831 CG LYS B 226 10.956 8.513 -2.441 1.00 56.10 C +ATOM 5832 CD LYS B 226 9.925 9.495 -2.976 1.00 58.90 C +ATOM 5833 CE LYS B 226 8.599 9.364 -2.239 1.00 61.08 C +ATOM 5834 NZ LYS B 226 8.091 7.966 -2.228 1.00 62.76 N +ATOM 5835 N GLU B 227 15.341 9.279 -1.501 1.00 46.54 N +ATOM 5836 CA GLU B 227 16.656 9.908 -1.590 1.00 44.57 C +ATOM 5837 C GLU B 227 17.737 8.835 -1.686 1.00 43.45 C +ATOM 5838 O GLU B 227 18.682 8.955 -2.477 1.00 39.26 O +ATOM 5839 CB GLU B 227 16.925 10.814 -0.384 1.00 44.92 C +ATOM 5840 CG GLU B 227 18.190 11.664 -0.545 1.00 44.12 C +ATOM 5841 CD GLU B 227 18.112 12.593 -1.743 1.00 45.78 C +ATOM 5842 OE1 GLU B 227 19.147 13.185 -2.124 1.00 46.88 O +ATOM 5843 OE2 GLU B 227 17.008 12.739 -2.305 1.00 46.28 O +ATOM 5844 N ALA B 228 17.587 7.785 -0.881 1.00 43.96 N +ATOM 5845 CA ALA B 228 18.535 6.674 -0.889 1.00 45.11 C +ATOM 5846 C ALA B 228 18.653 6.123 -2.309 1.00 46.71 C +ATOM 5847 O ALA B 228 19.755 5.884 -2.808 1.00 47.88 O +ATOM 5848 CB ALA B 228 18.065 5.582 0.057 1.00 43.76 C +ATOM 5849 N LYS B 229 17.513 5.942 -2.963 1.00 46.94 N +ATOM 5850 CA LYS B 229 17.493 5.425 -4.324 1.00 49.26 C +ATOM 5851 C LYS B 229 18.204 6.402 -5.251 1.00 50.21 C +ATOM 5852 O LYS B 229 19.019 6.002 -6.088 1.00 51.02 O +ATOM 5853 CB LYS B 229 16.044 5.233 -4.793 1.00 51.65 C +ATOM 5854 CG LYS B 229 15.856 4.181 -5.880 1.00 53.66 C +ATOM 5855 CD LYS B 229 16.518 4.581 -7.181 1.00 56.69 C +ATOM 5856 CE LYS B 229 16.370 3.479 -8.220 1.00 59.04 C +ATOM 5857 NZ LYS B 229 16.910 2.183 -7.713 1.00 60.51 N +ATOM 5858 N ALA B 230 17.882 7.684 -5.107 1.00 49.06 N +ATOM 5859 CA ALA B 230 18.497 8.710 -5.934 1.00 48.43 C +ATOM 5860 C ALA B 230 19.997 8.747 -5.675 1.00 46.12 C +ATOM 5861 O ALA B 230 20.795 8.799 -6.604 1.00 45.11 O +ATOM 5862 CB ALA B 230 17.875 10.076 -5.633 1.00 50.06 C +ATOM 5863 N LEU B 231 20.373 8.702 -4.404 1.00 46.64 N +ATOM 5864 CA LEU B 231 21.782 8.743 -4.026 1.00 47.39 C +ATOM 5865 C LEU B 231 22.484 7.402 -4.224 1.00 48.24 C +ATOM 5866 O LEU B 231 23.634 7.227 -3.809 1.00 50.07 O +ATOM 5867 CB LEU B 231 21.917 9.207 -2.572 1.00 44.73 C +ATOM 5868 CG LEU B 231 21.415 10.639 -2.339 1.00 43.80 C +ATOM 5869 CD1 LEU B 231 21.640 11.048 -0.888 1.00 41.07 C +ATOM 5870 CD2 LEU B 231 22.141 11.585 -3.282 1.00 39.84 C +ATOM 5871 N GLY B 232 21.780 6.466 -4.861 1.00 48.44 N +ATOM 5872 CA GLY B 232 22.331 5.151 -5.138 1.00 45.78 C +ATOM 5873 C GLY B 232 22.788 4.373 -3.919 1.00 45.09 C +ATOM 5874 O GLY B 232 23.725 3.582 -4.004 1.00 45.08 O +ATOM 5875 N VAL B 233 22.127 4.585 -2.789 1.00 43.71 N +ATOM 5876 CA VAL B 233 22.487 3.893 -1.563 1.00 44.47 C +ATOM 5877 C VAL B 233 21.774 2.556 -1.458 1.00 46.24 C +ATOM 5878 O VAL B 233 20.554 2.480 -1.582 1.00 46.93 O +ATOM 5879 CB VAL B 233 22.127 4.732 -0.318 1.00 43.41 C +ATOM 5880 CG1 VAL B 233 22.535 3.987 0.940 1.00 44.19 C +ATOM 5881 CG2 VAL B 233 22.824 6.091 -0.381 1.00 42.83 C +ATOM 5882 N LYS B 234 22.545 1.500 -1.233 1.00 49.12 N +ATOM 5883 CA LYS B 234 21.988 0.158 -1.085 1.00 52.16 C +ATOM 5884 C LYS B 234 21.662 -0.013 0.392 1.00 50.68 C +ATOM 5885 O LYS B 234 22.428 -0.607 1.148 1.00 50.58 O +ATOM 5886 CB LYS B 234 23.011 -0.896 -1.527 1.00 55.79 C +ATOM 5887 CG LYS B 234 23.529 -0.717 -2.950 1.00 58.83 C +ATOM 5888 CD LYS B 234 22.381 -0.656 -3.957 1.00 63.56 C +ATOM 5889 CE LYS B 234 22.893 -0.648 -5.395 1.00 65.71 C +ATOM 5890 NZ LYS B 234 23.578 -1.934 -5.740 1.00 67.62 N +ATOM 5891 N MET B 235 20.517 0.530 0.788 1.00 50.80 N +ATOM 5892 CA MET B 235 20.058 0.498 2.169 1.00 50.11 C +ATOM 5893 C MET B 235 20.041 -0.884 2.814 1.00 49.03 C +ATOM 5894 O MET B 235 20.655 -1.084 3.859 1.00 48.56 O +ATOM 5895 CB MET B 235 18.664 1.116 2.256 1.00 51.54 C +ATOM 5896 CG MET B 235 18.183 1.380 3.675 1.00 55.72 C +ATOM 5897 SD MET B 235 19.122 2.688 4.512 1.00 60.05 S +ATOM 5898 CE MET B 235 18.226 4.155 3.988 1.00 56.03 C +ATOM 5899 N ALA B 236 19.337 -1.827 2.193 1.00 48.01 N +ATOM 5900 CA ALA B 236 19.214 -3.185 2.716 1.00 47.12 C +ATOM 5901 C ALA B 236 20.561 -3.822 3.053 1.00 45.90 C +ATOM 5902 O ALA B 236 20.809 -4.184 4.201 1.00 46.55 O +ATOM 5903 CB ALA B 236 18.442 -4.062 1.723 1.00 48.79 C +ATOM 5904 N PRO B 237 21.446 -3.972 2.059 1.00 44.25 N +ATOM 5905 CA PRO B 237 22.761 -4.571 2.311 1.00 44.02 C +ATOM 5906 C PRO B 237 23.524 -3.887 3.446 1.00 43.45 C +ATOM 5907 O PRO B 237 24.058 -4.548 4.336 1.00 43.62 O +ATOM 5908 CB PRO B 237 23.476 -4.400 0.973 1.00 43.39 C +ATOM 5909 CG PRO B 237 22.369 -4.515 -0.007 1.00 43.12 C +ATOM 5910 CD PRO B 237 21.267 -3.693 0.624 1.00 43.29 C +ATOM 5911 N LEU B 238 23.577 -2.558 3.392 1.00 43.00 N +ATOM 5912 CA LEU B 238 24.283 -1.756 4.389 1.00 41.63 C +ATOM 5913 C LEU B 238 23.726 -1.972 5.793 1.00 40.61 C +ATOM 5914 O LEU B 238 24.473 -2.188 6.749 1.00 38.40 O +ATOM 5915 CB LEU B 238 24.182 -0.269 4.018 1.00 43.07 C +ATOM 5916 CG LEU B 238 24.693 0.746 5.050 1.00 44.54 C +ATOM 5917 CD1 LEU B 238 26.195 0.589 5.215 1.00 43.58 C +ATOM 5918 CD2 LEU B 238 24.347 2.168 4.604 1.00 44.47 C +ATOM 5919 N ARG B 239 22.404 -1.906 5.894 1.00 39.25 N +ATOM 5920 CA ARG B 239 21.693 -2.067 7.149 1.00 41.73 C +ATOM 5921 C ARG B 239 21.999 -3.422 7.797 1.00 42.59 C +ATOM 5922 O ARG B 239 22.303 -3.494 8.992 1.00 42.97 O +ATOM 5923 CB ARG B 239 20.197 -1.911 6.876 1.00 44.41 C +ATOM 5924 CG ARG B 239 19.332 -1.680 8.089 1.00 47.49 C +ATOM 5925 CD ARG B 239 17.891 -1.380 7.674 1.00 50.98 C +ATOM 5926 NE ARG B 239 17.722 -0.046 7.093 1.00 52.09 N +ATOM 5927 CZ ARG B 239 16.567 0.416 6.621 1.00 54.02 C +ATOM 5928 NH1 ARG B 239 16.492 1.636 6.115 1.00 56.30 N +ATOM 5929 NH2 ARG B 239 15.481 -0.344 6.650 1.00 54.66 N +ATOM 5930 N TRP B 240 21.930 -4.490 7.006 1.00 41.95 N +ATOM 5931 CA TRP B 240 22.215 -5.828 7.505 1.00 43.23 C +ATOM 5932 C TRP B 240 23.680 -6.009 7.881 1.00 43.05 C +ATOM 5933 O TRP B 240 23.989 -6.706 8.846 1.00 42.88 O +ATOM 5934 CB TRP B 240 21.805 -6.881 6.474 1.00 45.81 C +ATOM 5935 CG TRP B 240 20.330 -7.070 6.430 1.00 48.08 C +ATOM 5936 CD1 TRP B 240 19.494 -6.781 5.391 1.00 47.99 C +ATOM 5937 CD2 TRP B 240 19.500 -7.531 7.502 1.00 49.22 C +ATOM 5938 NE1 TRP B 240 18.188 -7.028 5.752 1.00 49.98 N +ATOM 5939 CE2 TRP B 240 18.164 -7.489 7.043 1.00 50.28 C +ATOM 5940 CE3 TRP B 240 19.756 -7.974 8.808 1.00 50.13 C +ATOM 5941 CZ2 TRP B 240 17.083 -7.873 7.844 1.00 50.20 C +ATOM 5942 CZ3 TRP B 240 18.678 -8.357 9.609 1.00 50.31 C +ATOM 5943 CH2 TRP B 240 17.359 -8.302 9.121 1.00 50.65 C +ATOM 5944 N LEU B 241 24.581 -5.376 7.133 1.00 41.20 N +ATOM 5945 CA LEU B 241 26.003 -5.475 7.437 1.00 41.18 C +ATOM 5946 C LEU B 241 26.243 -4.899 8.831 1.00 41.52 C +ATOM 5947 O LEU B 241 26.927 -5.504 9.661 1.00 42.25 O +ATOM 5948 CB LEU B 241 26.834 -4.688 6.420 1.00 40.88 C +ATOM 5949 CG LEU B 241 28.275 -5.152 6.149 1.00 41.40 C +ATOM 5950 CD1 LEU B 241 29.152 -3.939 5.962 1.00 41.55 C +ATOM 5951 CD2 LEU B 241 28.806 -6.012 7.280 1.00 42.14 C +ATOM 5952 N VAL B 242 25.678 -3.720 9.077 1.00 40.23 N +ATOM 5953 CA VAL B 242 25.817 -3.049 10.366 1.00 39.98 C +ATOM 5954 C VAL B 242 25.145 -3.863 11.480 1.00 39.43 C +ATOM 5955 O VAL B 242 25.683 -3.980 12.576 1.00 37.04 O +ATOM 5956 CB VAL B 242 25.204 -1.625 10.310 1.00 40.00 C +ATOM 5957 CG1 VAL B 242 25.241 -0.971 11.680 1.00 42.01 C +ATOM 5958 CG2 VAL B 242 25.968 -0.783 9.312 1.00 39.94 C +ATOM 5959 N ILE B 243 23.970 -4.424 11.201 1.00 39.63 N +ATOM 5960 CA ILE B 243 23.284 -5.229 12.204 1.00 40.66 C +ATOM 5961 C ILE B 243 24.148 -6.432 12.598 1.00 42.52 C +ATOM 5962 O ILE B 243 24.287 -6.734 13.787 1.00 42.46 O +ATOM 5963 CB ILE B 243 21.907 -5.746 11.703 1.00 40.70 C +ATOM 5964 CG1 ILE B 243 20.886 -4.599 11.670 1.00 38.19 C +ATOM 5965 CG2 ILE B 243 21.417 -6.882 12.603 1.00 39.18 C +ATOM 5966 CD1 ILE B 243 19.523 -5.002 11.146 0.00 39.18 C +ATOM 5967 N PHE B 244 24.733 -7.109 11.609 1.00 42.27 N +ATOM 5968 CA PHE B 244 25.570 -8.272 11.887 1.00 43.63 C +ATOM 5969 C PHE B 244 26.860 -7.925 12.621 1.00 42.78 C +ATOM 5970 O PHE B 244 27.281 -8.653 13.515 1.00 43.51 O +ATOM 5971 CB PHE B 244 25.891 -9.039 10.595 1.00 47.58 C +ATOM 5972 CG PHE B 244 24.755 -9.916 10.113 1.00 53.31 C +ATOM 5973 CD1 PHE B 244 23.990 -9.557 9.002 1.00 53.99 C +ATOM 5974 CD2 PHE B 244 24.430 -11.093 10.791 1.00 54.26 C +ATOM 5975 CE1 PHE B 244 22.917 -10.355 8.574 1.00 53.83 C +ATOM 5976 CE2 PHE B 244 23.359 -11.893 10.369 1.00 54.77 C +ATOM 5977 CZ PHE B 244 22.603 -11.520 9.259 1.00 54.07 C +ATOM 5978 N LEU B 245 27.479 -6.809 12.259 1.00 41.36 N +ATOM 5979 CA LEU B 245 28.715 -6.390 12.910 1.00 40.61 C +ATOM 5980 C LEU B 245 28.484 -5.964 14.354 1.00 40.84 C +ATOM 5981 O LEU B 245 29.290 -6.269 15.233 1.00 41.19 O +ATOM 5982 CB LEU B 245 29.363 -5.238 12.139 1.00 40.67 C +ATOM 5983 CG LEU B 245 29.892 -5.595 10.747 1.00 43.00 C +ATOM 5984 CD1 LEU B 245 30.330 -4.334 10.023 1.00 41.89 C +ATOM 5985 CD2 LEU B 245 31.052 -6.575 10.883 1.00 42.25 C +ATOM 5986 N SER B 246 27.402 -5.242 14.608 1.00 39.48 N +ATOM 5987 CA SER B 246 27.132 -4.819 15.973 1.00 41.40 C +ATOM 5988 C SER B 246 26.647 -6.021 16.790 1.00 40.32 C +ATOM 5989 O SER B 246 26.929 -6.122 17.981 1.00 39.09 O +ATOM 5990 CB SER B 246 26.100 -3.684 15.993 1.00 40.76 C +ATOM 5991 OG SER B 246 24.970 -3.997 15.203 1.00 46.64 O +ATOM 5992 N GLY B 247 25.938 -6.936 16.134 1.00 39.82 N +ATOM 5993 CA GLY B 247 25.444 -8.121 16.813 1.00 41.11 C +ATOM 5994 C GLY B 247 26.596 -9.038 17.169 1.00 42.64 C +ATOM 5995 O GLY B 247 26.640 -9.605 18.260 1.00 43.04 O +ATOM 5996 N SER B 248 27.538 -9.181 16.245 1.00 43.61 N +ATOM 5997 CA SER B 248 28.702 -10.022 16.477 1.00 46.64 C +ATOM 5998 C SER B 248 29.487 -9.492 17.673 1.00 46.54 C +ATOM 5999 O SER B 248 30.004 -10.251 18.497 1.00 45.84 O +ATOM 6000 CB SER B 248 29.603 -10.024 15.242 1.00 47.76 C +ATOM 6001 OG SER B 248 28.925 -10.574 14.124 1.00 52.71 O +ATOM 6002 N LEU B 249 29.558 -8.173 17.754 1.00 45.97 N +ATOM 6003 CA LEU B 249 30.279 -7.498 18.813 1.00 46.64 C +ATOM 6004 C LEU B 249 29.693 -7.823 20.182 1.00 46.46 C +ATOM 6005 O LEU B 249 30.427 -8.067 21.139 1.00 46.44 O +ATOM 6006 CB LEU B 249 30.233 -5.993 18.555 1.00 46.46 C +ATOM 6007 CG LEU B 249 31.400 -5.109 18.987 1.00 48.25 C +ATOM 6008 CD1 LEU B 249 32.717 -5.783 18.681 1.00 47.73 C +ATOM 6009 CD2 LEU B 249 31.296 -3.770 18.246 1.00 48.59 C +ATOM 6010 N VAL B 250 28.368 -7.840 20.270 1.00 45.74 N +ATOM 6011 CA VAL B 250 27.698 -8.114 21.533 1.00 45.27 C +ATOM 6012 C VAL B 250 27.783 -9.582 21.935 1.00 44.83 C +ATOM 6013 O VAL B 250 28.026 -9.894 23.102 1.00 42.00 O +ATOM 6014 CB VAL B 250 26.215 -7.691 21.481 1.00 46.15 C +ATOM 6015 CG1 VAL B 250 25.552 -7.973 22.810 1.00 47.67 C +ATOM 6016 CG2 VAL B 250 26.110 -6.211 21.160 1.00 47.46 C +ATOM 6017 N ALA B 251 27.581 -10.475 20.971 1.00 44.41 N +ATOM 6018 CA ALA B 251 27.646 -11.907 21.239 1.00 44.15 C +ATOM 6019 C ALA B 251 29.005 -12.254 21.830 1.00 44.25 C +ATOM 6020 O ALA B 251 29.088 -12.970 22.831 1.00 43.28 O +ATOM 6021 CB ALA B 251 27.408 -12.701 19.961 1.00 44.87 C +ATOM 6022 N CYS B 252 30.071 -11.738 21.224 1.00 41.95 N +ATOM 6023 CA CYS B 252 31.406 -12.011 21.731 1.00 42.38 C +ATOM 6024 C CYS B 252 31.596 -11.399 23.112 1.00 43.42 C +ATOM 6025 O CYS B 252 32.310 -11.951 23.950 1.00 44.07 O +ATOM 6026 CB CYS B 252 32.466 -11.481 20.766 1.00 42.08 C +ATOM 6027 SG CYS B 252 32.478 -12.359 19.182 1.00 46.55 S +ATOM 6028 N GLN B 253 30.950 -10.264 23.355 1.00 43.91 N +ATOM 6029 CA GLN B 253 31.057 -9.605 24.653 1.00 44.15 C +ATOM 6030 C GLN B 253 30.378 -10.447 25.733 1.00 43.78 C +ATOM 6031 O GLN B 253 30.932 -10.650 26.811 1.00 42.63 O +ATOM 6032 CB GLN B 253 30.430 -8.203 24.596 1.00 44.12 C +ATOM 6033 CG GLN B 253 30.312 -7.499 25.946 1.00 43.72 C +ATOM 6034 CD GLN B 253 28.981 -7.760 26.634 1.00 45.59 C +ATOM 6035 OE1 GLN B 253 28.910 -7.835 27.860 1.00 49.14 O +ATOM 6036 NE2 GLN B 253 27.919 -7.886 25.847 1.00 43.65 N +ATOM 6037 N VAL B 254 29.177 -10.932 25.443 1.00 43.10 N +ATOM 6038 CA VAL B 254 28.449 -11.749 26.402 1.00 44.40 C +ATOM 6039 C VAL B 254 29.280 -12.991 26.723 1.00 46.11 C +ATOM 6040 O VAL B 254 29.476 -13.339 27.889 1.00 46.24 O +ATOM 6041 CB VAL B 254 27.079 -12.175 25.833 1.00 43.11 C +ATOM 6042 CG1 VAL B 254 26.397 -13.178 26.767 1.00 39.09 C +ATOM 6043 CG2 VAL B 254 26.202 -10.941 25.651 1.00 43.01 C +ATOM 6044 N ALA B 255 29.781 -13.628 25.670 1.00 46.28 N +ATOM 6045 CA ALA B 255 30.594 -14.831 25.774 1.00 46.58 C +ATOM 6046 C ALA B 255 31.702 -14.751 26.826 1.00 46.90 C +ATOM 6047 O ALA B 255 31.986 -15.742 27.492 1.00 47.10 O +ATOM 6048 CB ALA B 255 31.197 -15.163 24.410 1.00 43.76 C +ATOM 6049 N ILE B 256 32.321 -13.584 26.990 1.00 46.03 N +ATOM 6050 CA ILE B 256 33.401 -13.460 27.963 1.00 44.61 C +ATOM 6051 C ILE B 256 33.113 -12.598 29.192 1.00 45.07 C +ATOM 6052 O ILE B 256 34.000 -12.407 30.031 1.00 44.04 O +ATOM 6053 CB ILE B 256 34.695 -12.919 27.302 1.00 44.60 C +ATOM 6054 CG1 ILE B 256 34.550 -11.423 26.995 1.00 43.05 C +ATOM 6055 CG2 ILE B 256 34.994 -13.710 26.027 1.00 43.63 C +ATOM 6056 CD1 ILE B 256 35.855 -10.740 26.672 0.00 43.69 C +ATOM 6057 N SER B 257 31.893 -12.082 29.320 1.00 44.06 N +ATOM 6058 CA SER B 257 31.588 -11.243 30.474 1.00 45.10 C +ATOM 6059 C SER B 257 30.117 -11.180 30.875 1.00 45.07 C +ATOM 6060 O SER B 257 29.736 -10.377 31.729 1.00 45.28 O +ATOM 6061 CB SER B 257 32.113 -9.823 30.237 1.00 47.19 C +ATOM 6062 OG SER B 257 31.565 -9.258 29.053 1.00 47.92 O +ATOM 6063 N GLY B 258 29.289 -12.021 30.268 1.00 44.49 N +ATOM 6064 CA GLY B 258 27.879 -12.019 30.616 1.00 45.03 C +ATOM 6065 C GLY B 258 27.070 -10.849 30.079 1.00 46.01 C +ATOM 6066 O GLY B 258 27.524 -10.091 29.220 1.00 46.11 O +ATOM 6067 N SER B 259 25.860 -10.703 30.605 1.00 45.63 N +ATOM 6068 CA SER B 259 24.948 -9.652 30.185 1.00 44.53 C +ATOM 6069 C SER B 259 25.177 -8.320 30.896 1.00 43.48 C +ATOM 6070 O SER B 259 24.974 -8.207 32.104 1.00 43.18 O +ATOM 6071 CB SER B 259 23.507 -10.122 30.403 1.00 46.07 C +ATOM 6072 OG SER B 259 22.572 -9.115 30.056 1.00 51.73 O +ATOM 6073 N ILE B 260 25.603 -7.314 30.136 1.00 41.89 N +ATOM 6074 CA ILE B 260 25.845 -5.980 30.681 1.00 41.73 C +ATOM 6075 C ILE B 260 24.983 -4.948 29.946 1.00 40.88 C +ATOM 6076 O ILE B 260 25.042 -4.833 28.723 1.00 41.41 O +ATOM 6077 CB ILE B 260 27.326 -5.573 30.541 1.00 42.27 C +ATOM 6078 CG1 ILE B 260 28.230 -6.615 31.215 1.00 42.60 C +ATOM 6079 CG2 ILE B 260 27.536 -4.191 31.153 1.00 39.13 C +ATOM 6080 CD1 ILE B 260 29.710 -6.323 31.084 0.00 42.53 C +ATOM 6081 N GLY B 261 24.187 -4.193 30.690 1.00 40.79 N +ATOM 6082 CA GLY B 261 23.330 -3.207 30.060 1.00 37.61 C +ATOM 6083 C GLY B 261 23.580 -1.771 30.475 1.00 37.64 C +ATOM 6084 O GLY B 261 24.576 -1.466 31.135 1.00 35.17 O +ATOM 6085 N TRP B 262 22.664 -0.892 30.072 1.00 36.14 N +ATOM 6086 CA TRP B 262 22.733 0.532 30.378 1.00 36.09 C +ATOM 6087 C TRP B 262 24.021 1.221 29.945 1.00 36.68 C +ATOM 6088 O TRP B 262 24.443 2.195 30.562 1.00 38.00 O +ATOM 6089 CB TRP B 262 22.500 0.772 31.876 1.00 37.19 C +ATOM 6090 CG TRP B 262 21.109 0.439 32.291 1.00 39.82 C +ATOM 6091 CD1 TRP B 262 20.658 -0.758 32.762 1.00 39.79 C +ATOM 6092 CD2 TRP B 262 19.959 1.287 32.179 1.00 40.62 C +ATOM 6093 NE1 TRP B 262 19.297 -0.711 32.947 1.00 42.34 N +ATOM 6094 CE2 TRP B 262 18.842 0.533 32.598 1.00 41.80 C +ATOM 6095 CE3 TRP B 262 19.765 2.613 31.760 1.00 42.52 C +ATOM 6096 CZ2 TRP B 262 17.544 1.058 32.613 1.00 43.51 C +ATOM 6097 CZ3 TRP B 262 18.474 3.138 31.774 1.00 43.73 C +ATOM 6098 CH2 TRP B 262 17.380 2.358 32.199 1.00 45.88 C +ATOM 6099 N VAL B 263 24.654 0.720 28.895 1.00 36.04 N +ATOM 6100 CA VAL B 263 25.871 1.352 28.411 1.00 38.70 C +ATOM 6101 C VAL B 263 25.649 1.929 27.010 1.00 39.44 C +ATOM 6102 O VAL B 263 25.770 3.138 26.794 1.00 37.90 O +ATOM 6103 CB VAL B 263 27.054 0.358 28.376 1.00 38.37 C +ATOM 6104 CG1 VAL B 263 28.259 1.010 27.717 1.00 37.02 C +ATOM 6105 CG2 VAL B 263 27.414 -0.065 29.785 1.00 39.01 C +ATOM 6106 N GLY B 264 25.305 1.057 26.069 1.00 40.08 N +ATOM 6107 CA GLY B 264 25.077 1.495 24.706 1.00 44.27 C +ATOM 6108 C GLY B 264 23.934 2.475 24.551 1.00 44.80 C +ATOM 6109 O GLY B 264 23.742 3.039 23.479 1.00 48.61 O +ATOM 6110 N LEU B 265 23.182 2.692 25.619 1.00 44.93 N +ATOM 6111 CA LEU B 265 22.048 3.599 25.573 1.00 44.38 C +ATOM 6112 C LEU B 265 22.420 5.025 25.957 1.00 45.31 C +ATOM 6113 O LEU B 265 21.867 5.977 25.415 1.00 48.98 O +ATOM 6114 CB LEU B 265 20.948 3.108 26.520 1.00 44.85 C +ATOM 6115 CG LEU B 265 19.465 3.406 26.251 1.00 46.30 C +ATOM 6116 CD1 LEU B 265 18.790 3.742 27.578 1.00 46.90 C +ATOM 6117 CD2 LEU B 265 19.296 4.560 25.269 1.00 48.27 C +ATOM 6118 N ILE B 266 23.349 5.182 26.895 1.00 43.07 N +ATOM 6119 CA ILE B 266 23.719 6.515 27.347 1.00 41.46 C +ATOM 6120 C ILE B 266 24.983 7.108 26.737 1.00 39.62 C +ATOM 6121 O ILE B 266 25.072 8.328 26.573 1.00 38.04 O +ATOM 6122 CB ILE B 266 23.871 6.560 28.893 1.00 43.27 C +ATOM 6123 CG1 ILE B 266 25.040 5.682 29.344 1.00 43.41 C +ATOM 6124 CG2 ILE B 266 22.585 6.078 29.553 1.00 46.69 C +ATOM 6125 CD1 ILE B 266 25.298 5.717 30.837 0.00 43.43 C +ATOM 6126 N ILE B 267 25.946 6.257 26.396 1.00 35.80 N +ATOM 6127 CA ILE B 267 27.209 6.729 25.848 1.00 35.01 C +ATOM 6128 C ILE B 267 27.111 7.494 24.529 1.00 33.60 C +ATOM 6129 O ILE B 267 27.758 8.520 24.374 1.00 33.39 O +ATOM 6130 CB ILE B 267 28.232 5.566 25.720 1.00 35.27 C +ATOM 6131 CG1 ILE B 267 28.545 5.013 27.116 1.00 36.61 C +ATOM 6132 CG2 ILE B 267 29.530 6.070 25.094 1.00 32.92 C +ATOM 6133 CD1 ILE B 267 29.489 3.845 27.116 0.00 36.07 C +ATOM 6134 N PRO B 268 26.310 7.011 23.564 1.00 33.18 N +ATOM 6135 CA PRO B 268 26.206 7.746 22.296 1.00 33.07 C +ATOM 6136 C PRO B 268 25.689 9.169 22.518 1.00 34.55 C +ATOM 6137 O PRO B 268 26.140 10.108 21.860 1.00 34.81 O +ATOM 6138 CB PRO B 268 25.240 6.893 21.478 1.00 32.57 C +ATOM 6139 CG PRO B 268 25.543 5.503 21.969 1.00 31.30 C +ATOM 6140 CD PRO B 268 25.635 5.704 23.469 1.00 31.32 C +ATOM 6141 N HIS B 269 24.754 9.332 23.452 1.00 36.19 N +ATOM 6142 CA HIS B 269 24.218 10.657 23.757 1.00 38.23 C +ATOM 6143 C HIS B 269 25.323 11.572 24.296 1.00 38.33 C +ATOM 6144 O HIS B 269 25.447 12.729 23.872 1.00 33.99 O +ATOM 6145 CB HIS B 269 23.093 10.572 24.793 1.00 43.74 C +ATOM 6146 CG HIS B 269 22.544 11.909 25.186 1.00 49.85 C +ATOM 6147 ND1 HIS B 269 21.858 12.720 24.306 1.00 52.84 N +ATOM 6148 CD2 HIS B 269 22.623 12.600 26.349 1.00 52.90 C +ATOM 6149 CE1 HIS B 269 21.539 13.852 24.908 1.00 53.94 C +ATOM 6150 NE2 HIS B 269 21.992 13.806 26.148 1.00 54.73 N +ATOM 6151 N LEU B 270 26.116 11.060 25.239 1.00 36.82 N +ATOM 6152 CA LEU B 270 27.209 11.848 25.799 1.00 37.89 C +ATOM 6153 C LEU B 270 28.195 12.210 24.691 1.00 36.86 C +ATOM 6154 O LEU B 270 28.660 13.346 24.602 1.00 36.04 O +ATOM 6155 CB LEU B 270 27.949 11.068 26.888 1.00 39.54 C +ATOM 6156 CG LEU B 270 27.196 10.781 28.187 1.00 43.70 C +ATOM 6157 CD1 LEU B 270 28.083 9.960 29.118 1.00 43.43 C +ATOM 6158 CD2 LEU B 270 26.796 12.089 28.847 1.00 44.88 C +ATOM 6159 N SER B 271 28.506 11.232 23.849 1.00 35.33 N +ATOM 6160 CA SER B 271 29.436 11.433 22.751 1.00 36.64 C +ATOM 6161 C SER B 271 28.885 12.472 21.796 1.00 36.69 C +ATOM 6162 O SER B 271 29.620 13.294 21.266 1.00 37.88 O +ATOM 6163 CB SER B 271 29.665 10.114 22.017 1.00 35.39 C +ATOM 6164 OG SER B 271 30.277 9.183 22.886 1.00 37.63 O +ATOM 6165 N ARG B 272 27.577 12.404 21.592 1.00 37.67 N +ATOM 6166 CA ARG B 272 26.832 13.306 20.728 1.00 38.89 C +ATOM 6167 C ARG B 272 26.999 14.746 21.235 1.00 38.66 C +ATOM 6168 O ARG B 272 27.191 15.674 20.450 1.00 39.02 O +ATOM 6169 CB ARG B 272 25.359 12.895 20.764 1.00 40.53 C +ATOM 6170 CG ARG B 272 24.508 13.370 19.625 1.00 44.17 C +ATOM 6171 CD ARG B 272 24.418 12.344 18.514 1.00 44.16 C +ATOM 6172 NE ARG B 272 23.871 11.074 18.975 1.00 46.16 N +ATOM 6173 CZ ARG B 272 23.607 10.053 18.169 1.00 48.66 C +ATOM 6174 NH1 ARG B 272 23.119 8.917 18.663 1.00 42.38 N +ATOM 6175 NH2 ARG B 272 23.821 10.180 16.855 1.00 50.86 N +ATOM 6176 N MET B 273 26.931 14.924 22.550 1.00 39.05 N +ATOM 6177 CA MET B 273 27.084 16.242 23.162 1.00 39.59 C +ATOM 6178 C MET B 273 28.499 16.764 22.977 1.00 39.19 C +ATOM 6179 O MET B 273 28.730 17.970 23.011 1.00 39.64 O +ATOM 6180 CB MET B 273 26.785 16.181 24.664 1.00 42.19 C +ATOM 6181 CG MET B 273 25.349 15.824 25.024 1.00 48.39 C +ATOM 6182 SD MET B 273 25.182 15.423 26.791 1.00 53.05 S +ATOM 6183 CE MET B 273 24.759 17.040 27.462 1.00 52.16 C +ATOM 6184 N LEU B 274 29.445 15.850 22.791 1.00 37.75 N +ATOM 6185 CA LEU B 274 30.840 16.224 22.617 1.00 38.00 C +ATOM 6186 C LEU B 274 31.234 16.579 21.192 1.00 37.45 C +ATOM 6187 O LEU B 274 31.835 17.626 20.958 1.00 36.87 O +ATOM 6188 CB LEU B 274 31.760 15.102 23.102 1.00 39.51 C +ATOM 6189 CG LEU B 274 31.946 14.920 24.612 1.00 43.34 C +ATOM 6190 CD1 LEU B 274 32.810 13.685 24.867 1.00 42.21 C +ATOM 6191 CD2 LEU B 274 32.600 16.171 25.205 1.00 42.05 C +ATOM 6192 N VAL B 275 30.901 15.715 20.239 1.00 34.81 N +ATOM 6193 CA VAL B 275 31.289 15.969 18.865 1.00 35.12 C +ATOM 6194 C VAL B 275 30.176 16.087 17.832 1.00 35.14 C +ATOM 6195 O VAL B 275 30.458 16.246 16.647 1.00 37.25 O +ATOM 6196 CB VAL B 275 32.280 14.902 18.385 1.00 35.02 C +ATOM 6197 CG1 VAL B 275 33.483 14.874 19.309 1.00 36.35 C +ATOM 6198 CG2 VAL B 275 31.604 13.535 18.348 1.00 34.49 C +ATOM 6199 N GLY B 276 28.919 16.013 18.258 1.00 34.16 N +ATOM 6200 CA GLY B 276 27.837 16.130 17.292 1.00 30.97 C +ATOM 6201 C GLY B 276 27.296 14.829 16.710 1.00 32.44 C +ATOM 6202 O GLY B 276 27.684 13.722 17.125 1.00 28.30 O +ATOM 6203 N ALA B 277 26.420 14.983 15.713 1.00 30.42 N +ATOM 6204 CA ALA B 277 25.738 13.874 15.048 1.00 30.00 C +ATOM 6205 C ALA B 277 26.446 13.174 13.887 1.00 29.63 C +ATOM 6206 O ALA B 277 26.106 12.035 13.556 1.00 31.10 O +ATOM 6207 CB ALA B 277 24.347 14.347 14.581 1.00 29.67 C +ATOM 6208 N ASN B 278 27.399 13.841 13.246 1.00 29.33 N +ATOM 6209 CA ASN B 278 28.118 13.229 12.123 1.00 29.42 C +ATOM 6210 C ASN B 278 28.789 11.939 12.618 1.00 29.29 C +ATOM 6211 O ASN B 278 29.679 11.985 13.456 1.00 28.93 O +ATOM 6212 CB ASN B 278 29.164 14.214 11.596 1.00 28.87 C +ATOM 6213 CG ASN B 278 30.002 13.651 10.456 1.00 32.67 C +ATOM 6214 OD1 ASN B 278 31.068 14.190 10.151 1.00 41.54 O +ATOM 6215 ND2 ASN B 278 29.535 12.586 9.822 1.00 29.56 N +ATOM 6216 N HIS B 279 28.363 10.795 12.092 1.00 31.48 N +ATOM 6217 CA HIS B 279 28.911 9.506 12.527 1.00 33.03 C +ATOM 6218 C HIS B 279 30.406 9.329 12.310 1.00 34.91 C +ATOM 6219 O HIS B 279 31.061 8.568 13.040 1.00 36.42 O +ATOM 6220 CB HIS B 279 28.160 8.341 11.864 1.00 31.66 C +ATOM 6221 CG HIS B 279 26.729 8.212 12.297 1.00 31.71 C +ATOM 6222 ND1 HIS B 279 25.695 8.875 11.671 1.00 33.44 N +ATOM 6223 CD2 HIS B 279 26.167 7.517 13.313 1.00 31.77 C +ATOM 6224 CE1 HIS B 279 24.557 8.595 12.282 1.00 32.85 C +ATOM 6225 NE2 HIS B 279 24.816 7.773 13.283 1.00 33.48 N +ATOM 6226 N GLN B 280 30.950 10.027 11.318 1.00 35.93 N +ATOM 6227 CA GLN B 280 32.373 9.935 11.013 1.00 36.49 C +ATOM 6228 C GLN B 280 33.212 10.274 12.237 1.00 36.54 C +ATOM 6229 O GLN B 280 34.252 9.670 12.484 1.00 39.23 O +ATOM 6230 CB GLN B 280 32.733 10.882 9.870 1.00 38.04 C +ATOM 6231 CG GLN B 280 34.088 10.618 9.259 1.00 37.87 C +ATOM 6232 CD GLN B 280 34.395 11.577 8.118 1.00 40.52 C +ATOM 6233 OE1 GLN B 280 33.496 11.998 7.397 1.00 41.53 O +ATOM 6234 NE2 GLN B 280 35.669 11.911 7.942 1.00 38.01 N +ATOM 6235 N SER B 281 32.763 11.249 13.010 1.00 36.45 N +ATOM 6236 CA SER B 281 33.502 11.614 14.199 1.00 37.30 C +ATOM 6237 C SER B 281 32.828 11.080 15.461 1.00 36.50 C +ATOM 6238 O SER B 281 33.462 10.981 16.511 1.00 37.40 O +ATOM 6239 CB SER B 281 33.654 13.131 14.267 1.00 39.05 C +ATOM 6240 OG SER B 281 32.425 13.763 13.999 1.00 45.15 O +ATOM 6241 N LEU B 282 31.552 10.712 15.347 1.00 34.43 N +ATOM 6242 CA LEU B 282 30.794 10.194 16.483 1.00 34.27 C +ATOM 6243 C LEU B 282 31.284 8.818 16.939 1.00 35.09 C +ATOM 6244 O LEU B 282 31.448 8.590 18.132 1.00 34.85 O +ATOM 6245 CB LEU B 282 29.310 10.071 16.136 1.00 32.76 C +ATOM 6246 CG LEU B 282 28.256 10.508 17.167 1.00 34.19 C +ATOM 6247 CD1 LEU B 282 26.969 9.735 16.886 1.00 30.85 C +ATOM 6248 CD2 LEU B 282 28.713 10.281 18.599 1.00 26.82 C +ATOM 6249 N LEU B 283 31.509 7.908 15.990 1.00 34.70 N +ATOM 6250 CA LEU B 283 31.945 6.555 16.328 1.00 35.61 C +ATOM 6251 C LEU B 283 33.229 6.475 17.158 1.00 37.71 C +ATOM 6252 O LEU B 283 33.233 5.861 18.229 1.00 38.67 O +ATOM 6253 CB LEU B 283 32.085 5.687 15.066 1.00 30.98 C +ATOM 6254 CG LEU B 283 30.857 5.382 14.196 1.00 29.98 C +ATOM 6255 CD1 LEU B 283 30.872 3.922 13.829 1.00 24.49 C +ATOM 6256 CD2 LEU B 283 29.560 5.727 14.899 1.00 30.50 C +ATOM 6257 N PRO B 284 34.333 7.084 16.685 1.00 38.18 N +ATOM 6258 CA PRO B 284 35.551 6.993 17.501 1.00 38.55 C +ATOM 6259 C PRO B 284 35.399 7.650 18.870 1.00 37.53 C +ATOM 6260 O PRO B 284 35.936 7.165 19.870 1.00 36.82 O +ATOM 6261 CB PRO B 284 36.624 7.660 16.622 1.00 39.82 C +ATOM 6262 CG PRO B 284 35.850 8.505 15.661 1.00 40.00 C +ATOM 6263 CD PRO B 284 34.621 7.685 15.371 1.00 39.57 C +ATOM 6264 N CYS B 285 34.657 8.748 18.916 1.00 35.98 N +ATOM 6265 CA CYS B 285 34.437 9.434 20.179 1.00 35.28 C +ATOM 6266 C CYS B 285 33.629 8.543 21.117 1.00 34.45 C +ATOM 6267 O CYS B 285 33.878 8.505 22.320 1.00 34.45 O +ATOM 6268 CB CYS B 285 33.686 10.745 19.951 1.00 33.72 C +ATOM 6269 SG CYS B 285 33.232 11.616 21.484 1.00 37.93 S +ATOM 6270 N THR B 286 32.657 7.835 20.550 1.00 33.13 N +ATOM 6271 CA THR B 286 31.792 6.950 21.311 1.00 33.83 C +ATOM 6272 C THR B 286 32.602 5.782 21.880 1.00 34.69 C +ATOM 6273 O THR B 286 32.422 5.395 23.033 1.00 33.39 O +ATOM 6274 CB THR B 286 30.632 6.445 20.421 1.00 32.89 C +ATOM 6275 OG1 THR B 286 29.758 7.541 20.141 1.00 32.81 O +ATOM 6276 CG2 THR B 286 29.840 5.353 21.107 1.00 30.63 C +ATOM 6277 N MET B 287 33.504 5.238 21.075 1.00 34.87 N +ATOM 6278 CA MET B 287 34.357 4.150 21.537 1.00 37.45 C +ATOM 6279 C MET B 287 35.238 4.605 22.705 1.00 36.91 C +ATOM 6280 O MET B 287 35.372 3.895 23.692 1.00 36.87 O +ATOM 6281 CB MET B 287 35.240 3.648 20.401 1.00 37.45 C +ATOM 6282 CG MET B 287 34.463 3.039 19.261 1.00 39.23 C +ATOM 6283 SD MET B 287 35.535 2.123 18.154 1.00 42.84 S +ATOM 6284 CE MET B 287 36.360 3.486 17.371 1.00 48.66 C +ATOM 6285 N LEU B 288 35.821 5.796 22.600 1.00 37.79 N +ATOM 6286 CA LEU B 288 36.682 6.310 23.668 1.00 38.16 C +ATOM 6287 C LEU B 288 35.915 6.620 24.947 1.00 37.82 C +ATOM 6288 O LEU B 288 36.381 6.316 26.049 1.00 37.90 O +ATOM 6289 CB LEU B 288 37.422 7.562 23.203 1.00 37.50 C +ATOM 6290 CG LEU B 288 38.544 7.289 22.199 1.00 40.80 C +ATOM 6291 CD1 LEU B 288 39.022 8.598 21.586 1.00 40.49 C +ATOM 6292 CD2 LEU B 288 39.688 6.562 22.903 1.00 42.01 C +ATOM 6293 N VAL B 289 34.743 7.226 24.798 1.00 36.18 N +ATOM 6294 CA VAL B 289 33.906 7.562 25.943 1.00 34.24 C +ATOM 6295 C VAL B 289 33.398 6.283 26.612 1.00 34.29 C +ATOM 6296 O VAL B 289 33.353 6.186 27.831 1.00 34.95 O +ATOM 6297 CB VAL B 289 32.698 8.426 25.508 1.00 33.98 C +ATOM 6298 CG1 VAL B 289 31.745 8.639 26.691 1.00 28.54 C +ATOM 6299 CG2 VAL B 289 33.197 9.768 24.953 1.00 28.93 C +ATOM 6300 N GLY B 290 33.015 5.307 25.798 1.00 34.71 N +ATOM 6301 CA GLY B 290 32.527 4.047 26.325 1.00 35.16 C +ATOM 6302 C GLY B 290 33.597 3.269 27.076 1.00 36.97 C +ATOM 6303 O GLY B 290 33.337 2.736 28.154 1.00 33.81 O +ATOM 6304 N ALA B 291 34.801 3.205 26.507 1.00 36.15 N +ATOM 6305 CA ALA B 291 35.908 2.493 27.138 1.00 36.93 C +ATOM 6306 C ALA B 291 36.205 3.098 28.509 1.00 36.73 C +ATOM 6307 O ALA B 291 36.267 2.388 29.512 1.00 34.98 O +ATOM 6308 CB ALA B 291 37.152 2.557 26.253 1.00 33.05 C +ATOM 6309 N THR B 292 36.369 4.414 28.546 1.00 36.98 N +ATOM 6310 CA THR B 292 36.662 5.110 29.792 1.00 38.47 C +ATOM 6311 C THR B 292 35.532 4.991 30.802 1.00 37.24 C +ATOM 6312 O THR B 292 35.777 4.901 31.999 1.00 38.24 O +ATOM 6313 CB THR B 292 36.947 6.608 29.542 1.00 39.48 C +ATOM 6314 OG1 THR B 292 38.001 6.731 28.579 1.00 41.26 O +ATOM 6315 CG2 THR B 292 37.368 7.300 30.840 1.00 37.99 C +ATOM 6316 N TYR B 293 34.294 4.996 30.322 1.00 37.72 N +ATOM 6317 CA TYR B 293 33.146 4.885 31.213 1.00 37.30 C +ATOM 6318 C TYR B 293 33.108 3.512 31.908 1.00 37.87 C +ATOM 6319 O TYR B 293 32.885 3.432 33.116 1.00 36.44 O +ATOM 6320 CB TYR B 293 31.849 5.129 30.433 1.00 35.91 C +ATOM 6321 CG TYR B 293 30.590 5.023 31.268 1.00 34.05 C +ATOM 6322 CD1 TYR B 293 29.788 3.882 31.220 1.00 34.47 C +ATOM 6323 CD2 TYR B 293 30.204 6.062 32.108 1.00 35.23 C +ATOM 6324 CE1 TYR B 293 28.627 3.782 31.993 1.00 34.78 C +ATOM 6325 CE2 TYR B 293 29.051 5.974 32.885 1.00 36.94 C +ATOM 6326 CZ TYR B 293 28.266 4.834 32.823 1.00 37.51 C +ATOM 6327 OH TYR B 293 27.120 4.758 33.590 1.00 38.84 O +ATOM 6328 N MET B 294 33.324 2.443 31.148 1.00 38.77 N +ATOM 6329 CA MET B 294 33.325 1.097 31.714 1.00 42.03 C +ATOM 6330 C MET B 294 34.447 0.926 32.729 1.00 42.24 C +ATOM 6331 O MET B 294 34.234 0.402 33.817 1.00 40.82 O +ATOM 6332 CB MET B 294 33.479 0.048 30.617 1.00 41.86 C +ATOM 6333 CG MET B 294 32.161 -0.534 30.175 1.00 48.32 C +ATOM 6334 SD MET B 294 31.300 -1.469 31.463 1.00 45.33 S +ATOM 6335 CE MET B 294 30.761 -2.838 30.484 1.00 49.18 C +ATOM 6336 N LEU B 295 35.645 1.363 32.366 1.00 43.03 N +ATOM 6337 CA LEU B 295 36.769 1.256 33.274 1.00 44.97 C +ATOM 6338 C LEU B 295 36.420 2.049 34.529 1.00 45.49 C +ATOM 6339 O LEU B 295 36.720 1.633 35.646 1.00 45.24 O +ATOM 6340 CB LEU B 295 38.037 1.811 32.615 1.00 44.95 C +ATOM 6341 CG LEU B 295 39.339 1.712 33.424 1.00 47.10 C +ATOM 6342 CD1 LEU B 295 39.541 0.292 33.928 1.00 45.08 C +ATOM 6343 CD2 LEU B 295 40.505 2.139 32.556 1.00 44.85 C +ATOM 6344 N LEU B 296 35.753 3.180 34.326 1.00 46.61 N +ATOM 6345 CA LEU B 296 35.351 4.063 35.413 1.00 47.88 C +ATOM 6346 C LEU B 296 34.357 3.378 36.354 1.00 47.50 C +ATOM 6347 O LEU B 296 34.469 3.488 37.573 1.00 48.09 O +ATOM 6348 CB LEU B 296 34.728 5.331 34.828 1.00 50.40 C +ATOM 6349 CG LEU B 296 34.793 6.641 35.616 1.00 54.08 C +ATOM 6350 CD1 LEU B 296 33.983 6.535 36.895 1.00 54.20 C +ATOM 6351 CD2 LEU B 296 36.251 6.971 35.914 1.00 55.43 C +ATOM 6352 N VAL B 297 33.386 2.673 35.788 1.00 45.60 N +ATOM 6353 CA VAL B 297 32.391 1.984 36.598 1.00 45.94 C +ATOM 6354 C VAL B 297 33.016 0.787 37.324 1.00 46.34 C +ATOM 6355 O VAL B 297 32.668 0.494 38.467 1.00 44.34 O +ATOM 6356 CB VAL B 297 31.200 1.508 35.729 1.00 45.73 C +ATOM 6357 CG1 VAL B 297 30.217 0.706 36.571 1.00 42.53 C +ATOM 6358 CG2 VAL B 297 30.500 2.712 35.115 1.00 44.45 C +ATOM 6359 N ASP B 298 33.945 0.107 36.658 1.00 47.71 N +ATOM 6360 CA ASP B 298 34.623 -1.040 37.253 1.00 50.15 C +ATOM 6361 C ASP B 298 35.372 -0.597 38.516 1.00 50.94 C +ATOM 6362 O ASP B 298 35.304 -1.259 39.552 1.00 51.43 O +ATOM 6363 CB ASP B 298 35.618 -1.647 36.262 1.00 50.69 C +ATOM 6364 CG ASP B 298 36.011 -3.072 36.627 1.00 53.30 C +ATOM 6365 OD1 ASP B 298 37.171 -3.464 36.368 1.00 54.59 O +ATOM 6366 OD2 ASP B 298 35.153 -3.807 37.162 1.00 53.89 O +ATOM 6367 N ASN B 299 36.084 0.525 38.422 1.00 50.15 N +ATOM 6368 CA ASN B 299 36.836 1.052 39.554 1.00 49.61 C +ATOM 6369 C ASN B 299 35.909 1.400 40.714 1.00 50.54 C +ATOM 6370 O ASN B 299 36.282 1.262 41.880 1.00 51.09 O +ATOM 6371 CB ASN B 299 37.626 2.293 39.138 1.00 48.97 C +ATOM 6372 CG ASN B 299 38.771 1.972 38.200 1.00 49.08 C +ATOM 6373 OD1 ASN B 299 39.462 2.869 37.732 1.00 51.94 O +ATOM 6374 ND2 ASN B 299 38.979 0.692 37.923 1.00 50.52 N +ATOM 6375 N VAL B 300 34.704 1.862 40.396 1.00 50.74 N +ATOM 6376 CA VAL B 300 33.740 2.201 41.432 1.00 51.48 C +ATOM 6377 C VAL B 300 33.342 0.919 42.146 1.00 53.03 C +ATOM 6378 O VAL B 300 33.134 0.911 43.353 1.00 54.38 O +ATOM 6379 CB VAL B 300 32.478 2.852 40.839 1.00 50.93 C +ATOM 6380 CG1 VAL B 300 31.465 3.135 41.942 1.00 49.27 C +ATOM 6381 CG2 VAL B 300 32.850 4.138 40.125 1.00 50.24 C +ATOM 6382 N ALA B 301 33.246 -0.164 41.383 1.00 54.55 N +ATOM 6383 CA ALA B 301 32.878 -1.468 41.920 1.00 56.58 C +ATOM 6384 C ALA B 301 33.959 -1.986 42.864 1.00 57.76 C +ATOM 6385 O ALA B 301 33.698 -2.262 44.036 1.00 57.59 O +ATOM 6386 CB ALA B 301 32.675 -2.459 40.778 1.00 55.62 C +ATOM 6387 N ARG B 302 35.169 -2.114 42.328 1.00 58.00 N +ATOM 6388 CA ARG B 302 36.324 -2.602 43.065 1.00 58.29 C +ATOM 6389 C ARG B 302 36.640 -1.801 44.322 1.00 59.55 C +ATOM 6390 O ARG B 302 37.135 -2.353 45.306 1.00 60.93 O +ATOM 6391 CB ARG B 302 37.548 -2.604 42.152 1.00 57.12 C +ATOM 6392 CG ARG B 302 37.495 -3.630 41.038 1.00 57.91 C +ATOM 6393 CD ARG B 302 38.581 -3.353 40.024 1.00 59.18 C +ATOM 6394 NE ARG B 302 39.888 -3.238 40.656 1.00 62.52 N +ATOM 6395 CZ ARG B 302 40.932 -2.624 40.106 1.00 64.65 C +ATOM 6396 NH1 ARG B 302 42.088 -2.568 40.753 1.00 65.61 N +ATOM 6397 NH2 ARG B 302 40.819 -2.054 38.915 1.00 67.69 N +ATOM 6398 N SER B 303 36.357 -0.503 44.290 1.00 59.01 N +ATOM 6399 CA SER B 303 36.631 0.358 45.432 1.00 59.01 C +ATOM 6400 C SER B 303 35.521 0.329 46.483 1.00 57.80 C +ATOM 6401 O SER B 303 35.789 0.522 47.666 1.00 56.54 O +ATOM 6402 CB SER B 303 36.858 1.801 44.966 1.00 60.51 C +ATOM 6403 OG SER B 303 35.664 2.363 44.444 1.00 63.80 O +ATOM 6404 N LEU B 304 34.283 0.095 46.054 1.00 57.10 N +ATOM 6405 CA LEU B 304 33.154 0.050 46.984 1.00 57.44 C +ATOM 6406 C LEU B 304 33.156 -1.192 47.869 1.00 57.81 C +ATOM 6407 O LEU B 304 32.640 -1.166 48.985 1.00 58.24 O +ATOM 6408 CB LEU B 304 31.819 0.102 46.233 1.00 57.78 C +ATOM 6409 CG LEU B 304 31.196 1.453 45.870 1.00 58.80 C +ATOM 6410 CD1 LEU B 304 29.885 1.208 45.148 1.00 58.67 C +ATOM 6411 CD2 LEU B 304 30.952 2.283 47.122 1.00 57.99 C +ATOM 6412 N SER B 305 33.729 -2.280 47.370 1.00 57.18 N +ATOM 6413 CA SER B 305 33.757 -3.522 48.124 1.00 57.04 C +ATOM 6414 C SER B 305 34.607 -4.581 47.438 1.00 56.06 C +ATOM 6415 O SER B 305 34.766 -4.562 46.216 1.00 55.86 O +ATOM 6416 CB SER B 305 32.329 -4.049 48.296 1.00 58.23 C +ATOM 6417 OG SER B 305 32.320 -5.437 48.594 1.00 61.43 O +ATOM 6418 N ASP B 306 35.151 -5.499 48.232 1.00 53.37 N +ATOM 6419 CA ASP B 306 35.967 -6.579 47.700 1.00 52.84 C +ATOM 6420 C ASP B 306 35.071 -7.784 47.449 1.00 50.55 C +ATOM 6421 O ASP B 306 35.554 -8.867 47.135 1.00 50.72 O +ATOM 6422 CB ASP B 306 37.073 -6.963 48.689 1.00 57.24 C +ATOM 6423 CG ASP B 306 38.070 -5.840 48.926 1.00 60.74 C +ATOM 6424 OD1 ASP B 306 37.636 -4.715 49.249 1.00 65.55 O +ATOM 6425 OD2 ASP B 306 39.291 -6.084 48.799 1.00 62.35 O +ATOM 6426 N ALA B 307 33.763 -7.586 47.576 1.00 48.74 N +ATOM 6427 CA ALA B 307 32.802 -8.668 47.374 1.00 49.30 C +ATOM 6428 C ALA B 307 32.565 -8.997 45.903 1.00 49.21 C +ATOM 6429 O ALA B 307 31.771 -9.888 45.579 1.00 48.96 O +ATOM 6430 CB ALA B 307 31.470 -8.321 48.049 1.00 48.26 C +ATOM 6431 N GLU B 308 33.245 -8.282 45.012 1.00 48.94 N +ATOM 6432 CA GLU B 308 33.090 -8.523 43.580 1.00 48.62 C +ATOM 6433 C GLU B 308 31.642 -8.370 43.102 1.00 44.21 C +ATOM 6434 O GLU B 308 31.072 -9.278 42.497 1.00 41.64 O +ATOM 6435 CB GLU B 308 33.604 -9.925 43.223 1.00 52.22 C +ATOM 6436 CG GLU B 308 35.116 -10.034 43.186 1.00 59.93 C +ATOM 6437 CD GLU B 308 35.736 -9.068 42.184 1.00 64.66 C +ATOM 6438 OE1 GLU B 308 35.425 -9.169 40.975 1.00 67.58 O +ATOM 6439 OE2 GLU B 308 36.534 -8.204 42.605 1.00 67.91 O +ATOM 6440 N ILE B 309 31.042 -7.226 43.394 1.00 43.56 N +ATOM 6441 CA ILE B 309 29.676 -6.973 42.951 1.00 44.32 C +ATOM 6442 C ILE B 309 29.705 -6.972 41.419 1.00 42.05 C +ATOM 6443 O ILE B 309 30.478 -6.239 40.803 1.00 37.72 O +ATOM 6444 CB ILE B 309 29.170 -5.606 43.465 1.00 45.93 C +ATOM 6445 CG1 ILE B 309 29.074 -5.635 44.999 1.00 45.88 C +ATOM 6446 CG2 ILE B 309 27.818 -5.282 42.841 1.00 43.96 C +ATOM 6447 CD1 ILE B 309 28.632 -4.323 45.614 0.00 45.90 C +ATOM 6448 N PRO B 310 28.888 -7.822 40.785 1.00 41.54 N +ATOM 6449 CA PRO B 310 28.910 -7.834 39.316 1.00 42.43 C +ATOM 6450 C PRO B 310 28.654 -6.444 38.714 1.00 41.39 C +ATOM 6451 O PRO B 310 27.725 -5.736 39.115 1.00 39.06 O +ATOM 6452 CB PRO B 310 27.851 -8.884 38.953 1.00 42.08 C +ATOM 6453 CG PRO B 310 26.973 -8.950 40.164 1.00 44.93 C +ATOM 6454 CD PRO B 310 27.917 -8.787 41.321 1.00 41.11 C +ATOM 6455 N ILE B 311 29.507 -6.068 37.762 1.00 40.09 N +ATOM 6456 CA ILE B 311 29.448 -4.760 37.111 1.00 38.92 C +ATOM 6457 C ILE B 311 28.089 -4.430 36.487 1.00 39.00 C +ATOM 6458 O ILE B 311 27.713 -3.262 36.399 1.00 37.64 O +ATOM 6459 CB ILE B 311 30.591 -4.623 36.048 1.00 38.92 C +ATOM 6460 CG1 ILE B 311 30.845 -3.140 35.737 1.00 38.52 C +ATOM 6461 CG2 ILE B 311 30.258 -5.430 34.809 1.00 34.95 C +ATOM 6462 CD1 ILE B 311 31.985 -2.893 34.780 0.00 38.55 C +ATOM 6463 N SER B 312 27.348 -5.454 36.075 1.00 37.86 N +ATOM 6464 CA SER B 312 26.035 -5.235 35.494 1.00 37.59 C +ATOM 6465 C SER B 312 25.113 -4.545 36.497 1.00 38.25 C +ATOM 6466 O SER B 312 24.251 -3.757 36.108 1.00 38.15 O +ATOM 6467 CB SER B 312 25.421 -6.562 35.040 1.00 39.55 C +ATOM 6468 OG SER B 312 25.544 -7.556 36.044 1.00 40.92 O +ATOM 6469 N ILE B 313 25.282 -4.838 37.785 1.00 36.49 N +ATOM 6470 CA ILE B 313 24.452 -4.200 38.799 1.00 34.61 C +ATOM 6471 C ILE B 313 24.789 -2.707 38.844 1.00 34.95 C +ATOM 6472 O ILE B 313 23.899 -1.868 38.941 1.00 35.08 O +ATOM 6473 CB ILE B 313 24.692 -4.787 40.221 1.00 36.07 C +ATOM 6474 CG1 ILE B 313 24.303 -6.270 40.263 1.00 37.86 C +ATOM 6475 CG2 ILE B 313 23.884 -3.990 41.265 1.00 32.74 C +ATOM 6476 CD1 ILE B 313 24.538 -6.931 41.606 0.00 37.10 C +ATOM 6477 N LEU B 314 26.078 -2.384 38.774 1.00 34.69 N +ATOM 6478 CA LEU B 314 26.514 -0.989 38.836 1.00 37.04 C +ATOM 6479 C LEU B 314 26.229 -0.142 37.597 1.00 34.66 C +ATOM 6480 O LEU B 314 25.966 1.048 37.720 1.00 34.07 O +ATOM 6481 CB LEU B 314 28.008 -0.902 39.154 1.00 40.05 C +ATOM 6482 CG LEU B 314 28.424 -1.249 40.585 1.00 45.77 C +ATOM 6483 CD1 LEU B 314 29.906 -0.984 40.715 1.00 50.09 C +ATOM 6484 CD2 LEU B 314 27.662 -0.410 41.599 1.00 46.11 C +ATOM 6485 N THR B 315 26.285 -0.737 36.411 1.00 32.65 N +ATOM 6486 CA THR B 315 26.012 0.039 35.209 1.00 35.00 C +ATOM 6487 C THR B 315 24.554 0.478 35.217 1.00 35.69 C +ATOM 6488 O THR B 315 24.208 1.499 34.640 1.00 34.97 O +ATOM 6489 CB THR B 315 26.302 -0.761 33.924 1.00 33.16 C +ATOM 6490 OG1 THR B 315 25.593 -2.002 33.960 1.00 31.40 O +ATOM 6491 CG2 THR B 315 27.788 -1.022 33.790 1.00 28.62 C +ATOM 6492 N ALA B 316 23.707 -0.297 35.892 1.00 37.44 N +ATOM 6493 CA ALA B 316 22.286 0.022 35.996 1.00 37.31 C +ATOM 6494 C ALA B 316 22.034 1.044 37.105 1.00 39.08 C +ATOM 6495 O ALA B 316 21.230 1.960 36.936 1.00 38.51 O +ATOM 6496 CB ALA B 316 21.483 -1.248 36.261 1.00 36.80 C +ATOM 6497 N LEU B 317 22.716 0.889 38.238 1.00 39.43 N +ATOM 6498 CA LEU B 317 22.544 1.812 39.361 1.00 40.88 C +ATOM 6499 C LEU B 317 23.100 3.188 39.033 1.00 41.10 C +ATOM 6500 O LEU B 317 22.572 4.208 39.481 1.00 40.90 O +ATOM 6501 CB LEU B 317 23.232 1.272 40.618 1.00 39.85 C +ATOM 6502 CG LEU B 317 22.508 0.137 41.344 1.00 43.59 C +ATOM 6503 CD1 LEU B 317 23.355 -0.343 42.515 1.00 42.20 C +ATOM 6504 CD2 LEU B 317 21.140 0.630 41.835 1.00 41.90 C +ATOM 6505 N ILE B 318 24.186 3.212 38.269 1.00 40.96 N +ATOM 6506 CA ILE B 318 24.794 4.469 37.863 1.00 41.62 C +ATOM 6507 C ILE B 318 24.101 4.929 36.577 1.00 42.32 C +ATOM 6508 O ILE B 318 23.737 6.093 36.430 1.00 43.35 O +ATOM 6509 CB ILE B 318 26.311 4.302 37.561 1.00 41.69 C +ATOM 6510 CG1 ILE B 318 27.074 3.908 38.834 1.00 39.34 C +ATOM 6511 CG2 ILE B 318 26.864 5.602 36.965 1.00 40.60 C +ATOM 6512 CD1 ILE B 318 28.556 3.682 38.618 0.00 40.23 C +ATOM 6513 N GLY B 319 23.908 3.986 35.662 1.00 41.65 N +ATOM 6514 CA GLY B 319 23.305 4.283 34.375 1.00 43.11 C +ATOM 6515 C GLY B 319 21.883 4.803 34.307 1.00 44.01 C +ATOM 6516 O GLY B 319 21.627 5.777 33.603 1.00 44.60 O +ATOM 6517 N ALA B 320 20.953 4.158 35.004 1.00 44.17 N +ATOM 6518 CA ALA B 320 19.559 4.590 34.974 1.00 45.77 C +ATOM 6519 C ALA B 320 19.393 6.051 35.422 1.00 47.91 C +ATOM 6520 O ALA B 320 18.773 6.853 34.724 1.00 46.03 O +ATOM 6521 CB ALA B 320 18.701 3.662 35.834 1.00 44.99 C +ATOM 6522 N PRO B 321 19.933 6.412 36.597 1.00 49.66 N +ATOM 6523 CA PRO B 321 19.792 7.802 37.042 1.00 51.07 C +ATOM 6524 C PRO B 321 20.549 8.788 36.147 1.00 52.63 C +ATOM 6525 O PRO B 321 20.120 9.932 35.978 1.00 52.19 O +ATOM 6526 CB PRO B 321 20.332 7.768 38.473 1.00 49.87 C +ATOM 6527 CG PRO B 321 21.304 6.645 38.446 1.00 50.79 C +ATOM 6528 CD PRO B 321 20.574 5.597 37.641 1.00 49.71 C +ATOM 6529 N LEU B 322 21.669 8.348 35.577 1.00 52.38 N +ATOM 6530 CA LEU B 322 22.441 9.214 34.692 1.00 52.08 C +ATOM 6531 C LEU B 322 21.629 9.484 33.428 1.00 51.86 C +ATOM 6532 O LEU B 322 21.680 10.578 32.864 1.00 52.81 O +ATOM 6533 CB LEU B 322 23.777 8.568 34.327 1.00 50.80 C +ATOM 6534 CG LEU B 322 24.669 9.374 33.377 1.00 52.22 C +ATOM 6535 CD1 LEU B 322 24.749 10.827 33.823 1.00 51.19 C +ATOM 6536 CD2 LEU B 322 26.058 8.754 33.346 1.00 52.31 C +ATOM 6537 N PHE B 323 20.883 8.477 32.989 1.00 51.32 N +ATOM 6538 CA PHE B 323 20.029 8.593 31.813 1.00 51.47 C +ATOM 6539 C PHE B 323 18.965 9.644 32.137 1.00 52.96 C +ATOM 6540 O PHE B 323 18.575 10.439 31.282 1.00 52.85 O +ATOM 6541 CB PHE B 323 19.371 7.242 31.526 1.00 50.41 C +ATOM 6542 CG PHE B 323 18.380 7.263 30.397 1.00 49.84 C +ATOM 6543 CD1 PHE B 323 18.804 7.400 29.078 1.00 50.59 C +ATOM 6544 CD2 PHE B 323 17.018 7.113 30.649 1.00 50.26 C +ATOM 6545 CE1 PHE B 323 17.888 7.382 28.026 1.00 49.07 C +ATOM 6546 CE2 PHE B 323 16.092 7.095 29.603 1.00 50.44 C +ATOM 6547 CZ PHE B 323 16.529 7.228 28.290 1.00 49.87 C +ATOM 6548 N GLY B 324 18.512 9.642 33.388 1.00 53.23 N +ATOM 6549 CA GLY B 324 17.511 10.597 33.823 1.00 54.17 C +ATOM 6550 C GLY B 324 18.011 12.028 33.740 1.00 55.13 C +ATOM 6551 O GLY B 324 17.339 12.892 33.180 1.00 53.40 O +ATOM 6552 N VAL B 325 19.189 12.288 34.301 1.00 56.12 N +ATOM 6553 CA VAL B 325 19.754 13.630 34.262 1.00 57.81 C +ATOM 6554 C VAL B 325 19.978 14.050 32.811 1.00 59.05 C +ATOM 6555 O VAL B 325 19.836 15.219 32.472 1.00 59.12 O +ATOM 6556 CB VAL B 325 21.097 13.709 35.017 1.00 57.45 C +ATOM 6557 CG1 VAL B 325 20.945 13.122 36.399 1.00 56.59 C +ATOM 6558 CG2 VAL B 325 22.180 12.988 34.238 1.00 59.22 C +ATOM 6559 N LEU B 326 20.320 13.090 31.960 1.00 60.39 N +ATOM 6560 CA LEU B 326 20.550 13.372 30.552 1.00 62.37 C +ATOM 6561 C LEU B 326 19.256 13.779 29.866 1.00 64.22 C +ATOM 6562 O LEU B 326 19.231 14.745 29.101 1.00 65.01 O +ATOM 6563 CB LEU B 326 21.143 12.147 29.852 1.00 63.15 C +ATOM 6564 CG LEU B 326 22.665 12.106 29.670 1.00 65.71 C +ATOM 6565 CD1 LEU B 326 23.371 12.580 30.928 1.00 67.05 C +ATOM 6566 CD2 LEU B 326 23.090 10.690 29.311 1.00 65.33 C +ATOM 6567 N VAL B 327 18.183 13.041 30.133 1.00 65.63 N +ATOM 6568 CA VAL B 327 16.893 13.349 29.529 1.00 67.52 C +ATOM 6569 C VAL B 327 16.359 14.647 30.122 1.00 69.92 C +ATOM 6570 O VAL B 327 15.608 15.377 29.476 1.00 69.66 O +ATOM 6571 CB VAL B 327 15.876 12.216 29.759 1.00 66.32 C +ATOM 6572 CG1 VAL B 327 14.525 12.605 29.183 1.00 66.52 C +ATOM 6573 CG2 VAL B 327 16.369 10.942 29.098 1.00 65.52 C +ATOM 6574 N TYR B 328 16.756 14.932 31.358 1.00 72.74 N +ATOM 6575 CA TYR B 328 16.348 16.163 32.022 1.00 76.02 C +ATOM 6576 C TYR B 328 17.037 17.291 31.257 1.00 77.78 C +ATOM 6577 O TYR B 328 16.844 18.472 31.546 1.00 78.09 O +ATOM 6578 CB TYR B 328 16.812 16.151 33.478 1.00 77.74 C +ATOM 6579 CG TYR B 328 16.485 17.408 34.254 1.00 79.63 C +ATOM 6580 CD1 TYR B 328 15.163 17.760 34.531 1.00 80.32 C +ATOM 6581 CD2 TYR B 328 17.501 18.241 34.724 1.00 80.04 C +ATOM 6582 CE1 TYR B 328 14.863 18.913 35.260 1.00 80.80 C +ATOM 6583 CE2 TYR B 328 17.214 19.391 35.450 1.00 80.87 C +ATOM 6584 CZ TYR B 328 15.895 19.722 35.716 1.00 81.38 C +ATOM 6585 OH TYR B 328 15.615 20.857 36.441 1.00 82.03 O +ATOM 6586 N LYS B 329 17.850 16.890 30.281 1.00 79.88 N +ATOM 6587 CA LYS B 329 18.600 17.787 29.405 1.00 81.39 C +ATOM 6588 C LYS B 329 19.723 18.587 30.050 1.00 83.59 C +ATOM 6589 O LYS B 329 19.907 18.562 31.268 1.00 83.24 O +ATOM 6590 CB LYS B 329 17.642 18.733 28.672 1.00 80.39 C +ATOM 6591 CG LYS B 329 16.803 18.031 27.617 1.00 79.33 C +ATOM 6592 CD LYS B 329 17.701 17.265 26.658 1.00 78.67 C +ATOM 6593 CE LYS B 329 16.904 16.425 25.680 1.00 79.11 C +ATOM 6594 NZ LYS B 329 17.802 15.656 24.775 1.00 78.42 N +ATOM 6595 N LEU B 330 20.480 19.283 29.204 1.00 85.60 N +ATOM 6596 CA LEU B 330 21.605 20.106 29.642 1.00 86.96 C +ATOM 6597 C LEU B 330 21.379 21.542 29.157 1.00 86.93 C +ATOM 6598 O LEU B 330 20.366 21.767 28.462 0.00 86.83 O +ATOM 6599 CB LEU B 330 22.913 19.551 29.058 1.00 86.99 C +ATOM 6600 CG LEU B 330 24.204 19.585 29.890 1.00 87.63 C +ATOM 6601 CD1 LEU B 330 24.624 21.019 30.165 1.00 87.55 C +ATOM 6602 CD2 LEU B 330 23.993 18.820 31.190 1.00 86.69 C +TER 6603 LEU B 330 +ATOM 6604 N MET D 1 21.489 14.233 -28.081 1.00 65.94 N +ATOM 6605 CA MET D 1 20.004 14.146 -28.062 1.00 65.25 C +ATOM 6606 C MET D 1 19.459 15.278 -27.194 1.00 64.01 C +ATOM 6607 O MET D 1 20.121 15.729 -26.258 1.00 64.00 O +ATOM 6608 CB MET D 1 19.566 12.797 -27.489 1.00 66.50 C +ATOM 6609 CG MET D 1 20.002 12.587 -26.053 1.00 70.14 C +ATOM 6610 SD MET D 1 19.434 11.037 -25.347 1.00 73.49 S +ATOM 6611 CE MET D 1 20.975 10.113 -25.255 1.00 72.32 C +ATOM 6612 N ASN D 2 18.250 15.731 -27.503 1.00 61.98 N +ATOM 6613 CA ASN D 2 17.641 16.815 -26.746 1.00 60.38 C +ATOM 6614 C ASN D 2 16.700 16.301 -25.653 1.00 56.40 C +ATOM 6615 O ASN D 2 16.200 17.085 -24.848 1.00 53.87 O +ATOM 6616 CB ASN D 2 16.890 17.754 -27.703 1.00 63.07 C +ATOM 6617 CG ASN D 2 16.369 19.011 -27.012 1.00 65.94 C +ATOM 6618 OD1 ASN D 2 17.078 19.650 -26.229 1.00 66.66 O +ATOM 6619 ND2 ASN D 2 15.129 19.380 -27.318 1.00 67.68 N +ATOM 6620 N LYS D 3 16.474 14.988 -25.624 1.00 51.85 N +ATOM 6621 CA LYS D 3 15.595 14.384 -24.630 1.00 50.18 C +ATOM 6622 C LYS D 3 16.244 14.160 -23.265 1.00 47.66 C +ATOM 6623 O LYS D 3 17.427 13.826 -23.167 1.00 46.91 O +ATOM 6624 CB LYS D 3 15.046 13.050 -25.132 1.00 53.27 C +ATOM 6625 CG LYS D 3 13.891 13.165 -26.112 1.00 58.47 C +ATOM 6626 CD LYS D 3 13.192 11.819 -26.261 1.00 61.14 C +ATOM 6627 CE LYS D 3 12.068 11.869 -27.279 1.00 62.78 C +ATOM 6628 NZ LYS D 3 11.275 10.604 -27.263 1.00 64.77 N +ATOM 6629 N ALA D 4 15.449 14.352 -22.213 1.00 43.77 N +ATOM 6630 CA ALA D 4 15.915 14.168 -20.843 1.00 38.58 C +ATOM 6631 C ALA D 4 15.269 12.909 -20.306 1.00 36.04 C +ATOM 6632 O ALA D 4 15.864 12.189 -19.516 1.00 33.78 O +ATOM 6633 CB ALA D 4 15.528 15.375 -19.976 1.00 38.29 C +ATOM 6634 N LEU D 5 14.044 12.649 -20.749 1.00 35.06 N +ATOM 6635 CA LEU D 5 13.313 11.470 -20.315 1.00 35.55 C +ATOM 6636 C LEU D 5 12.076 11.306 -21.174 1.00 36.90 C +ATOM 6637 O LEU D 5 11.635 12.254 -21.840 1.00 35.10 O +ATOM 6638 CB LEU D 5 12.890 11.607 -18.843 1.00 40.00 C +ATOM 6639 CG LEU D 5 11.736 12.569 -18.518 1.00 40.72 C +ATOM 6640 CD1 LEU D 5 10.405 11.868 -18.742 1.00 36.81 C +ATOM 6641 CD2 LEU D 5 11.832 13.022 -17.062 1.00 41.60 C +ATOM 6642 N SER D 6 11.522 10.098 -21.156 1.00 36.04 N +ATOM 6643 CA SER D 6 10.316 9.801 -21.906 1.00 39.64 C +ATOM 6644 C SER D 6 9.601 8.651 -21.228 1.00 39.65 C +ATOM 6645 O SER D 6 10.243 7.741 -20.701 1.00 40.08 O +ATOM 6646 CB SER D 6 10.649 9.433 -23.363 1.00 42.73 C +ATOM 6647 OG SER D 6 11.551 8.344 -23.441 1.00 47.40 O +ATOM 6648 N VAL D 7 8.273 8.707 -21.205 1.00 39.40 N +ATOM 6649 CA VAL D 7 7.502 7.638 -20.595 1.00 42.62 C +ATOM 6650 C VAL D 7 6.499 7.184 -21.648 1.00 45.22 C +ATOM 6651 O VAL D 7 5.873 8.006 -22.325 1.00 45.72 O +ATOM 6652 CB VAL D 7 6.784 8.100 -19.288 1.00 40.74 C +ATOM 6653 CG1 VAL D 7 7.623 9.160 -18.577 1.00 38.95 C +ATOM 6654 CG2 VAL D 7 5.392 8.598 -19.586 1.00 42.83 C +ATOM 6655 N GLU D 8 6.357 5.870 -21.780 1.00 48.01 N +ATOM 6656 CA GLU D 8 5.488 5.288 -22.789 1.00 51.28 C +ATOM 6657 C GLU D 8 4.424 4.366 -22.213 1.00 51.33 C +ATOM 6658 O GLU D 8 4.733 3.473 -21.423 1.00 52.68 O +ATOM 6659 CB GLU D 8 6.368 4.524 -23.781 1.00 53.67 C +ATOM 6660 CG GLU D 8 5.649 3.881 -24.952 1.00 59.99 C +ATOM 6661 CD GLU D 8 6.557 2.919 -25.707 1.00 62.23 C +ATOM 6662 OE1 GLU D 8 7.620 3.358 -26.204 1.00 63.10 O +ATOM 6663 OE2 GLU D 8 6.210 1.721 -25.793 1.00 64.78 O +ATOM 6664 N ASN D 9 3.175 4.591 -22.617 1.00 52.03 N +ATOM 6665 CA ASN D 9 2.035 3.780 -22.182 1.00 54.22 C +ATOM 6666 C ASN D 9 2.149 3.346 -20.726 1.00 53.74 C +ATOM 6667 O ASN D 9 1.789 2.222 -20.374 1.00 54.06 O +ATOM 6668 CB ASN D 9 1.909 2.530 -23.067 1.00 56.54 C +ATOM 6669 CG ASN D 9 0.592 1.787 -22.854 1.00 61.57 C +ATOM 6670 OD1 ASN D 9 0.497 0.581 -23.093 1.00 63.53 O +ATOM 6671 ND2 ASN D 9 -0.434 2.510 -22.415 1.00 63.73 N +ATOM 6672 N LEU D 10 2.638 4.242 -19.877 1.00 53.66 N +ATOM 6673 CA LEU D 10 2.819 3.922 -18.470 1.00 53.02 C +ATOM 6674 C LEU D 10 1.518 3.641 -17.732 1.00 52.97 C +ATOM 6675 O LEU D 10 0.564 4.409 -17.813 1.00 51.66 O +ATOM 6676 CB LEU D 10 3.570 5.055 -17.772 1.00 52.56 C +ATOM 6677 CG LEU D 10 3.876 4.862 -16.286 1.00 51.87 C +ATOM 6678 CD1 LEU D 10 4.653 3.572 -16.078 1.00 49.45 C +ATOM 6679 CD2 LEU D 10 4.676 6.062 -15.779 1.00 50.76 C +ATOM 6680 N GLY D 11 1.494 2.524 -17.013 1.00 55.02 N +ATOM 6681 CA GLY D 11 0.324 2.145 -16.240 1.00 57.12 C +ATOM 6682 C GLY D 11 0.793 1.566 -14.919 1.00 58.81 C +ATOM 6683 O GLY D 11 1.768 0.817 -14.890 1.00 59.24 O +ATOM 6684 N PHE D 12 0.113 1.897 -13.825 1.00 61.11 N +ATOM 6685 CA PHE D 12 0.526 1.391 -12.520 1.00 63.15 C +ATOM 6686 C PHE D 12 -0.562 1.411 -11.454 1.00 65.74 C +ATOM 6687 O PHE D 12 -1.485 2.228 -11.493 1.00 64.24 O +ATOM 6688 CB PHE D 12 1.750 2.183 -12.028 1.00 61.85 C +ATOM 6689 CG PHE D 12 2.202 1.822 -10.632 1.00 60.38 C +ATOM 6690 CD1 PHE D 12 1.588 2.384 -9.514 1.00 58.90 C +ATOM 6691 CD2 PHE D 12 3.237 0.911 -10.435 1.00 59.24 C +ATOM 6692 CE1 PHE D 12 2.000 2.043 -8.224 1.00 57.43 C +ATOM 6693 CE2 PHE D 12 3.655 0.564 -9.146 1.00 56.69 C +ATOM 6694 CZ PHE D 12 3.036 1.131 -8.043 1.00 55.63 C +ATOM 6695 N TYR D 13 -0.431 0.488 -10.504 1.00 69.55 N +ATOM 6696 CA TYR D 13 -1.345 0.361 -9.376 1.00 74.19 C +ATOM 6697 C TYR D 13 -0.567 -0.272 -8.227 1.00 76.85 C +ATOM 6698 O TYR D 13 0.367 -1.041 -8.459 1.00 77.51 O +ATOM 6699 CB TYR D 13 -2.559 -0.506 -9.746 1.00 75.62 C +ATOM 6700 CG TYR D 13 -2.233 -1.905 -10.237 1.00 77.96 C +ATOM 6701 CD1 TYR D 13 -1.675 -2.861 -9.383 1.00 78.11 C +ATOM 6702 CD2 TYR D 13 -2.487 -2.275 -11.560 1.00 78.73 C +ATOM 6703 CE1 TYR D 13 -1.377 -4.148 -9.834 1.00 78.90 C +ATOM 6704 CE2 TYR D 13 -2.193 -3.560 -12.022 1.00 79.29 C +ATOM 6705 CZ TYR D 13 -1.638 -4.490 -11.154 1.00 79.79 C +ATOM 6706 OH TYR D 13 -1.341 -5.757 -11.608 1.00 80.87 O +ATOM 6707 N TYR D 14 -0.935 0.063 -6.994 1.00 79.76 N +ATOM 6708 CA TYR D 14 -0.255 -0.496 -5.831 1.00 82.84 C +ATOM 6709 C TYR D 14 -0.798 -1.873 -5.467 1.00 85.68 C +ATOM 6710 O TYR D 14 -0.035 -2.789 -5.153 1.00 85.40 O +ATOM 6711 CB TYR D 14 -0.393 0.430 -4.619 1.00 82.29 C +ATOM 6712 CG TYR D 14 0.583 1.583 -4.597 1.00 82.07 C +ATOM 6713 CD1 TYR D 14 0.332 2.752 -5.310 1.00 82.42 C +ATOM 6714 CD2 TYR D 14 1.766 1.500 -3.863 1.00 82.08 C +ATOM 6715 CE1 TYR D 14 1.235 3.814 -5.292 1.00 82.92 C +ATOM 6716 CE2 TYR D 14 2.676 2.553 -3.839 1.00 82.62 C +ATOM 6717 CZ TYR D 14 2.405 3.707 -4.554 1.00 82.99 C +ATOM 6718 OH TYR D 14 3.306 4.750 -4.531 1.00 83.52 O +ATOM 6719 N GLN D 15 -2.120 -2.014 -5.511 1.00 88.67 N +ATOM 6720 CA GLN D 15 -2.758 -3.277 -5.169 1.00 91.88 C +ATOM 6721 C GLN D 15 -3.827 -3.677 -6.186 1.00 92.97 C +ATOM 6722 O GLN D 15 -3.873 -4.829 -6.625 1.00 93.32 O +ATOM 6723 CB GLN D 15 -3.370 -3.176 -3.770 1.00 93.26 C +ATOM 6724 CG GLN D 15 -3.914 -4.484 -3.221 1.00 96.50 C +ATOM 6725 CD GLN D 15 -4.368 -4.364 -1.774 1.00 98.30 C +ATOM 6726 OE1 GLN D 15 -4.891 -5.317 -1.191 1.00 99.18 O +ATOM 6727 NE2 GLN D 15 -4.166 -3.188 -1.186 1.00 98.89 N +ATOM 6728 N ALA D 16 -4.678 -2.725 -6.560 1.00 93.73 N +ATOM 6729 CA ALA D 16 -5.746 -2.980 -7.525 1.00 94.33 C +ATOM 6730 C ALA D 16 -5.210 -3.653 -8.788 1.00 94.75 C +ATOM 6731 O ALA D 16 -5.683 -4.720 -9.188 1.00 94.68 O +ATOM 6732 CB ALA D 16 -6.446 -1.670 -7.888 1.00 94.07 C +ATOM 6733 N PHE D 21 -3.357 5.722 -12.767 1.00 68.59 N +ATOM 6734 CA PHE D 21 -3.331 6.064 -14.187 1.00 68.67 C +ATOM 6735 C PHE D 21 -3.058 4.868 -15.102 1.00 68.26 C +ATOM 6736 O PHE D 21 -2.707 3.780 -14.642 1.00 67.84 O +ATOM 6737 CB PHE D 21 -2.297 7.172 -14.455 1.00 68.36 C +ATOM 6738 CG PHE D 21 -1.071 7.091 -13.584 1.00 68.37 C +ATOM 6739 CD1 PHE D 21 -0.941 7.916 -12.469 1.00 67.71 C +ATOM 6740 CD2 PHE D 21 -0.055 6.181 -13.866 1.00 67.93 C +ATOM 6741 CE1 PHE D 21 0.181 7.836 -11.648 1.00 66.69 C +ATOM 6742 CE2 PHE D 21 1.070 6.094 -13.051 1.00 66.50 C +ATOM 6743 CZ PHE D 21 1.188 6.924 -11.939 1.00 66.62 C +ATOM 6744 N GLN D 22 -3.226 5.090 -16.403 1.00 68.46 N +ATOM 6745 CA GLN D 22 -3.027 4.056 -17.413 1.00 68.03 C +ATOM 6746 C GLN D 22 -2.820 4.747 -18.768 1.00 66.35 C +ATOM 6747 O GLN D 22 -3.381 5.813 -19.011 1.00 65.57 O +ATOM 6748 CB GLN D 22 -4.265 3.148 -17.453 1.00 69.77 C +ATOM 6749 CG GLN D 22 -4.038 1.759 -18.043 1.00 72.35 C +ATOM 6750 CD GLN D 22 -5.278 0.872 -17.956 1.00 73.53 C +ATOM 6751 OE1 GLN D 22 -5.818 0.644 -16.871 1.00 73.67 O +ATOM 6752 NE2 GLN D 22 -5.728 0.365 -19.101 1.00 74.21 N +ATOM 6753 N GLN D 23 -2.013 4.145 -19.639 1.00 65.92 N +ATOM 6754 CA GLN D 23 -1.729 4.713 -20.963 1.00 65.04 C +ATOM 6755 C GLN D 23 -1.149 6.129 -20.903 1.00 63.26 C +ATOM 6756 O GLN D 23 -1.473 6.975 -21.745 1.00 61.89 O +ATOM 6757 CB GLN D 23 -2.995 4.738 -21.831 1.00 68.17 C +ATOM 6758 CG GLN D 23 -3.301 3.444 -22.576 1.00 72.20 C +ATOM 6759 CD GLN D 23 -3.707 2.310 -21.654 1.00 75.29 C +ATOM 6760 OE1 GLN D 23 -4.716 2.399 -20.949 1.00 76.08 O +ATOM 6761 NE2 GLN D 23 -2.924 1.234 -21.655 1.00 75.78 N +ATOM 6762 N LEU D 24 -0.284 6.380 -19.923 1.00 60.40 N +ATOM 6763 CA LEU D 24 0.322 7.701 -19.758 1.00 56.85 C +ATOM 6764 C LEU D 24 1.535 7.872 -20.661 1.00 54.79 C +ATOM 6765 O LEU D 24 2.449 7.046 -20.642 1.00 53.88 O +ATOM 6766 CB LEU D 24 0.750 7.904 -18.307 1.00 56.88 C +ATOM 6767 CG LEU D 24 0.660 9.315 -17.719 1.00 56.91 C +ATOM 6768 CD1 LEU D 24 1.494 9.353 -16.444 1.00 55.68 C +ATOM 6769 CD2 LEU D 24 1.153 10.357 -18.712 1.00 55.95 C +ATOM 6770 N ASN D 25 1.546 8.951 -21.441 1.00 52.26 N +ATOM 6771 CA ASN D 25 2.654 9.224 -22.350 1.00 50.94 C +ATOM 6772 C ASN D 25 3.110 10.676 -22.313 1.00 50.86 C +ATOM 6773 O ASN D 25 2.292 11.601 -22.315 1.00 51.42 O +ATOM 6774 CB ASN D 25 2.274 8.903 -23.806 1.00 52.17 C +ATOM 6775 CG ASN D 25 1.703 7.511 -23.977 1.00 51.55 C +ATOM 6776 OD1 ASN D 25 0.514 7.283 -23.756 1.00 53.77 O +ATOM 6777 ND2 ASN D 25 2.551 6.570 -24.363 1.00 51.79 N +ATOM 6778 N PHE D 26 4.422 10.865 -22.281 1.00 47.65 N +ATOM 6779 CA PHE D 26 5.012 12.192 -22.315 1.00 45.76 C +ATOM 6780 C PHE D 26 6.523 12.096 -22.308 1.00 44.87 C +ATOM 6781 O PHE D 26 7.093 11.086 -21.901 1.00 43.94 O +ATOM 6782 CB PHE D 26 4.522 13.088 -21.152 1.00 43.32 C +ATOM 6783 CG PHE D 26 5.007 12.675 -19.786 1.00 40.80 C +ATOM 6784 CD1 PHE D 26 4.311 11.732 -19.038 1.00 39.09 C +ATOM 6785 CD2 PHE D 26 6.148 13.257 -19.233 1.00 40.31 C +ATOM 6786 CE1 PHE D 26 4.744 11.372 -17.754 1.00 39.24 C +ATOM 6787 CE2 PHE D 26 6.589 12.905 -17.951 1.00 38.55 C +ATOM 6788 CZ PHE D 26 5.884 11.960 -17.213 1.00 38.18 C +ATOM 6789 N ASP D 27 7.168 13.143 -22.802 1.00 45.63 N +ATOM 6790 CA ASP D 27 8.616 13.186 -22.823 1.00 46.44 C +ATOM 6791 C ASP D 27 9.096 14.607 -22.583 1.00 42.57 C +ATOM 6792 O ASP D 27 8.387 15.576 -22.858 1.00 42.01 O +ATOM 6793 CB ASP D 27 9.163 12.640 -24.149 1.00 51.74 C +ATOM 6794 CG ASP D 27 8.543 13.300 -25.358 1.00 57.28 C +ATOM 6795 OD1 ASP D 27 8.619 14.547 -25.465 1.00 58.71 O +ATOM 6796 OD2 ASP D 27 7.990 12.561 -26.209 1.00 62.75 O +ATOM 6797 N LEU D 28 10.305 14.724 -22.056 1.00 40.27 N +ATOM 6798 CA LEU D 28 10.871 16.028 -21.762 1.00 38.76 C +ATOM 6799 C LEU D 28 12.203 16.222 -22.434 1.00 38.82 C +ATOM 6800 O LEU D 28 12.961 15.270 -22.643 1.00 39.05 O +ATOM 6801 CB LEU D 28 11.076 16.204 -20.255 1.00 37.04 C +ATOM 6802 CG LEU D 28 9.853 16.184 -19.349 1.00 37.87 C +ATOM 6803 CD1 LEU D 28 10.316 16.319 -17.899 1.00 38.45 C +ATOM 6804 CD2 LEU D 28 8.905 17.309 -19.741 1.00 36.62 C +ATOM 6805 N ASN D 29 12.490 17.476 -22.746 1.00 37.78 N +ATOM 6806 CA ASN D 29 13.742 17.832 -23.366 1.00 39.60 C +ATOM 6807 C ASN D 29 14.599 18.484 -22.299 1.00 39.62 C +ATOM 6808 O ASN D 29 14.079 18.996 -21.306 1.00 41.70 O +ATOM 6809 CB ASN D 29 13.482 18.788 -24.528 1.00 41.09 C +ATOM 6810 CG ASN D 29 12.650 18.145 -25.625 1.00 43.22 C +ATOM 6811 OD1 ASN D 29 11.843 18.806 -26.269 1.00 46.42 O +ATOM 6812 ND2 ASN D 29 12.847 16.848 -25.842 1.00 42.58 N +ATOM 6813 N LYS D 30 15.910 18.453 -22.488 1.00 38.10 N +ATOM 6814 CA LYS D 30 16.804 19.058 -21.521 1.00 38.26 C +ATOM 6815 C LYS D 30 16.421 20.523 -21.361 1.00 37.43 C +ATOM 6816 O LYS D 30 16.064 21.184 -22.340 1.00 38.33 O +ATOM 6817 CB LYS D 30 18.260 18.939 -21.993 1.00 38.79 C +ATOM 6818 CG LYS D 30 18.682 17.511 -22.356 1.00 44.20 C +ATOM 6819 CD LYS D 30 20.202 17.383 -22.479 1.00 47.73 C +ATOM 6820 CE LYS D 30 20.627 16.101 -23.210 1.00 50.06 C +ATOM 6821 NZ LYS D 30 20.157 14.841 -22.567 1.00 53.04 N +ATOM 6822 N GLY D 31 16.470 21.024 -20.128 1.00 34.19 N +ATOM 6823 CA GLY D 31 16.143 22.418 -19.896 1.00 30.16 C +ATOM 6824 C GLY D 31 14.669 22.713 -19.701 1.00 29.94 C +ATOM 6825 O GLY D 31 14.288 23.856 -19.460 1.00 31.89 O +ATOM 6826 N ASP D 32 13.830 21.695 -19.827 1.00 28.88 N +ATOM 6827 CA ASP D 32 12.394 21.867 -19.637 1.00 30.83 C +ATOM 6828 C ASP D 32 12.047 21.927 -18.137 1.00 32.00 C +ATOM 6829 O ASP D 32 12.792 21.420 -17.286 1.00 29.28 O +ATOM 6830 CB ASP D 32 11.633 20.677 -20.245 1.00 32.89 C +ATOM 6831 CG ASP D 32 11.303 20.857 -21.727 1.00 34.70 C +ATOM 6832 OD1 ASP D 32 10.769 19.888 -22.314 1.00 35.30 O +ATOM 6833 OD2 ASP D 32 11.552 21.946 -22.298 1.00 33.59 O +ATOM 6834 N ILE D 33 10.933 22.578 -17.817 1.00 30.99 N +ATOM 6835 CA ILE D 33 10.448 22.596 -16.445 1.00 29.50 C +ATOM 6836 C ILE D 33 9.065 21.960 -16.515 1.00 27.71 C +ATOM 6837 O ILE D 33 8.145 22.504 -17.124 1.00 28.70 O +ATOM 6838 CB ILE D 33 10.306 24.002 -15.840 1.00 30.90 C +ATOM 6839 CG1 ILE D 33 11.679 24.683 -15.721 1.00 29.35 C +ATOM 6840 CG2 ILE D 33 9.653 23.876 -14.444 1.00 26.38 C +ATOM 6841 CD1 ILE D 33 11.630 26.082 -15.147 0.00 29.84 C +ATOM 6842 N LEU D 34 8.931 20.789 -15.914 1.00 27.68 N +ATOM 6843 CA LEU D 34 7.664 20.069 -15.906 1.00 27.17 C +ATOM 6844 C LEU D 34 6.999 20.189 -14.541 1.00 27.61 C +ATOM 6845 O LEU D 34 7.619 19.915 -13.509 1.00 25.18 O +ATOM 6846 CB LEU D 34 7.893 18.573 -16.179 1.00 28.14 C +ATOM 6847 CG LEU D 34 6.751 17.670 -16.670 1.00 30.16 C +ATOM 6848 CD1 LEU D 34 6.839 16.344 -15.982 1.00 30.30 C +ATOM 6849 CD2 LEU D 34 5.393 18.288 -16.427 1.00 32.48 C +ATOM 6850 N ALA D 35 5.736 20.591 -14.542 1.00 27.50 N +ATOM 6851 CA ALA D 35 4.978 20.668 -13.312 1.00 27.48 C +ATOM 6852 C ALA D 35 3.904 19.595 -13.415 1.00 28.34 C +ATOM 6853 O ALA D 35 3.168 19.536 -14.405 1.00 26.53 O +ATOM 6854 CB ALA D 35 4.329 22.045 -13.145 1.00 26.92 C +ATOM 6855 N VAL D 36 3.858 18.719 -12.414 1.00 27.66 N +ATOM 6856 CA VAL D 36 2.839 17.686 -12.352 1.00 29.49 C +ATOM 6857 C VAL D 36 1.798 18.282 -11.404 1.00 29.32 C +ATOM 6858 O VAL D 36 1.988 18.285 -10.193 1.00 29.63 O +ATOM 6859 CB VAL D 36 3.396 16.372 -11.759 1.00 30.78 C +ATOM 6860 CG1 VAL D 36 2.332 15.293 -11.820 1.00 29.40 C +ATOM 6861 CG2 VAL D 36 4.635 15.933 -12.530 1.00 30.16 C +ATOM 6862 N LEU D 37 0.716 18.805 -11.971 1.00 31.59 N +ATOM 6863 CA LEU D 37 -0.348 19.456 -11.212 1.00 32.31 C +ATOM 6864 C LEU D 37 -1.433 18.494 -10.772 1.00 32.88 C +ATOM 6865 O LEU D 37 -1.994 17.769 -11.586 1.00 33.53 O +ATOM 6866 CB LEU D 37 -0.996 20.546 -12.062 1.00 32.50 C +ATOM 6867 CG LEU D 37 -1.265 21.942 -11.504 1.00 34.70 C +ATOM 6868 CD1 LEU D 37 -2.463 22.507 -12.258 1.00 27.91 C +ATOM 6869 CD2 LEU D 37 -1.520 21.918 -9.994 1.00 31.07 C +ATOM 6870 N GLY D 38 -1.742 18.512 -9.480 1.00 34.59 N +ATOM 6871 CA GLY D 38 -2.770 17.637 -8.951 1.00 34.51 C +ATOM 6872 C GLY D 38 -2.990 17.831 -7.466 1.00 34.94 C +ATOM 6873 O GLY D 38 -2.272 18.586 -6.812 1.00 36.29 O +ATOM 6874 N GLN D 39 -3.991 17.153 -6.925 1.00 37.06 N +ATOM 6875 CA GLN D 39 -4.281 17.263 -5.505 1.00 40.36 C +ATOM 6876 C GLN D 39 -3.774 16.006 -4.789 1.00 44.72 C +ATOM 6877 O GLN D 39 -3.606 14.957 -5.412 1.00 45.51 O +ATOM 6878 CB GLN D 39 -5.781 17.454 -5.299 1.00 36.64 C +ATOM 6879 CG GLN D 39 -6.350 18.613 -6.110 1.00 36.43 C +ATOM 6880 CD GLN D 39 -7.696 19.098 -5.595 1.00 36.24 C +ATOM 6881 OE1 GLN D 39 -7.762 19.910 -4.669 1.00 33.70 O +ATOM 6882 NE2 GLN D 39 -8.774 18.594 -6.186 1.00 32.10 N +ATOM 6883 N ASN D 40 -3.518 16.127 -3.488 1.00 49.54 N +ATOM 6884 CA ASN D 40 -3.001 15.024 -2.677 1.00 53.73 C +ATOM 6885 C ASN D 40 -3.646 13.669 -2.926 1.00 54.94 C +ATOM 6886 O ASN D 40 -4.870 13.553 -3.032 1.00 56.32 O +ATOM 6887 CB ASN D 40 -3.128 15.352 -1.183 1.00 56.97 C +ATOM 6888 CG ASN D 40 -2.667 14.196 -0.287 1.00 62.15 C +ATOM 6889 OD1 ASN D 40 -1.465 13.946 -0.132 1.00 62.62 O +ATOM 6890 ND2 ASN D 40 -3.628 13.480 0.294 1.00 61.01 N +ATOM 6891 N GLY D 41 -2.801 12.644 -2.999 1.00 55.80 N +ATOM 6892 CA GLY D 41 -3.269 11.284 -3.207 1.00 56.20 C +ATOM 6893 C GLY D 41 -3.897 11.014 -4.557 1.00 56.14 C +ATOM 6894 O GLY D 41 -4.595 10.017 -4.731 1.00 56.11 O +ATOM 6895 N CYS D 42 -3.646 11.889 -5.523 1.00 56.53 N +ATOM 6896 CA CYS D 42 -4.222 11.705 -6.845 1.00 57.04 C +ATOM 6897 C CYS D 42 -3.231 11.256 -7.913 1.00 55.24 C +ATOM 6898 O CYS D 42 -3.469 11.453 -9.098 1.00 56.05 O +ATOM 6899 CB CYS D 42 -4.942 12.986 -7.284 1.00 58.99 C +ATOM 6900 SG CYS D 42 -6.408 13.376 -6.266 1.00 63.18 S +ATOM 6901 N GLY D 43 -2.121 10.657 -7.491 1.00 54.04 N +ATOM 6902 CA GLY D 43 -1.147 10.161 -8.447 1.00 53.13 C +ATOM 6903 C GLY D 43 0.257 10.748 -8.508 1.00 52.44 C +ATOM 6904 O GLY D 43 1.234 9.992 -8.552 1.00 49.47 O +ATOM 6905 N LYS D 44 0.359 12.079 -8.506 1.00 51.88 N +ATOM 6906 CA LYS D 44 1.645 12.773 -8.617 1.00 51.93 C +ATOM 6907 C LYS D 44 2.787 12.253 -7.752 1.00 51.54 C +ATOM 6908 O LYS D 44 3.930 12.190 -8.203 1.00 51.89 O +ATOM 6909 CB LYS D 44 1.463 14.273 -8.375 1.00 52.23 C +ATOM 6910 CG LYS D 44 1.015 14.639 -6.985 1.00 48.55 C +ATOM 6911 CD LYS D 44 0.683 16.114 -6.913 1.00 46.25 C +ATOM 6912 CE LYS D 44 0.196 16.476 -5.526 1.00 45.38 C +ATOM 6913 NZ LYS D 44 -0.100 17.912 -5.438 1.00 46.16 N +ATOM 6914 N SER D 45 2.496 11.877 -6.517 1.00 50.18 N +ATOM 6915 CA SER D 45 3.554 11.364 -5.661 1.00 50.05 C +ATOM 6916 C SER D 45 4.088 10.024 -6.181 1.00 48.14 C +ATOM 6917 O SER D 45 5.294 9.827 -6.278 1.00 49.63 O +ATOM 6918 CB SER D 45 3.048 11.203 -4.230 1.00 49.82 C +ATOM 6919 OG SER D 45 4.110 10.809 -3.383 1.00 53.11 O +ATOM 6920 N THR D 46 3.188 9.106 -6.513 1.00 47.86 N +ATOM 6921 CA THR D 46 3.580 7.791 -7.029 1.00 47.17 C +ATOM 6922 C THR D 46 4.335 7.901 -8.362 1.00 45.26 C +ATOM 6923 O THR D 46 5.217 7.091 -8.658 1.00 42.71 O +ATOM 6924 CB THR D 46 2.339 6.887 -7.203 1.00 47.76 C +ATOM 6925 OG1 THR D 46 1.777 6.619 -5.911 1.00 48.08 O +ATOM 6926 CG2 THR D 46 2.708 5.569 -7.877 1.00 46.35 C +ATOM 6927 N LEU D 47 3.989 8.912 -9.153 1.00 43.93 N +ATOM 6928 CA LEU D 47 4.653 9.142 -10.429 1.00 44.65 C +ATOM 6929 C LEU D 47 6.145 9.378 -10.185 1.00 45.17 C +ATOM 6930 O LEU D 47 6.987 8.817 -10.887 1.00 44.01 O +ATOM 6931 CB LEU D 47 4.063 10.368 -11.123 1.00 46.10 C +ATOM 6932 CG LEU D 47 3.884 10.375 -12.646 1.00 48.03 C +ATOM 6933 CD1 LEU D 47 4.005 11.817 -13.121 1.00 47.33 C +ATOM 6934 CD2 LEU D 47 4.922 9.497 -13.344 1.00 46.55 C +ATOM 6935 N LEU D 48 6.473 10.210 -9.191 1.00 44.93 N +ATOM 6936 CA LEU D 48 7.875 10.496 -8.884 1.00 45.37 C +ATOM 6937 C LEU D 48 8.606 9.229 -8.491 1.00 45.66 C +ATOM 6938 O LEU D 48 9.763 9.035 -8.855 1.00 45.24 O +ATOM 6939 CB LEU D 48 8.009 11.522 -7.748 1.00 46.33 C +ATOM 6940 CG LEU D 48 7.737 12.995 -8.054 1.00 44.82 C +ATOM 6941 CD1 LEU D 48 8.189 13.837 -6.873 1.00 46.59 C +ATOM 6942 CD2 LEU D 48 8.481 13.423 -9.297 1.00 45.01 C +ATOM 6943 N ASP D 49 7.933 8.378 -7.727 1.00 47.29 N +ATOM 6944 CA ASP D 49 8.519 7.113 -7.309 1.00 50.77 C +ATOM 6945 C ASP D 49 8.884 6.287 -8.544 1.00 49.13 C +ATOM 6946 O ASP D 49 9.917 5.614 -8.568 1.00 48.86 O +ATOM 6947 CB ASP D 49 7.528 6.333 -6.439 1.00 56.16 C +ATOM 6948 CG ASP D 49 7.367 6.935 -5.050 1.00 62.39 C +ATOM 6949 OD1 ASP D 49 7.250 8.176 -4.945 1.00 65.76 O +ATOM 6950 OD2 ASP D 49 7.348 6.164 -4.062 1.00 65.32 O +ATOM 6951 N LEU D 50 8.032 6.346 -9.565 1.00 46.65 N +ATOM 6952 CA LEU D 50 8.261 5.604 -10.806 1.00 45.94 C +ATOM 6953 C LEU D 50 9.408 6.196 -11.610 1.00 44.76 C +ATOM 6954 O LEU D 50 10.212 5.457 -12.183 1.00 43.58 O +ATOM 6955 CB LEU D 50 6.999 5.591 -11.672 1.00 45.47 C +ATOM 6956 CG LEU D 50 5.811 4.805 -11.116 1.00 48.24 C +ATOM 6957 CD1 LEU D 50 4.587 5.004 -12.006 1.00 48.06 C +ATOM 6958 CD2 LEU D 50 6.182 3.333 -11.030 1.00 47.79 C +ATOM 6959 N LEU D 51 9.482 7.524 -11.655 1.00 42.63 N +ATOM 6960 CA LEU D 51 10.542 8.186 -12.395 1.00 43.77 C +ATOM 6961 C LEU D 51 11.901 7.921 -11.751 1.00 45.96 C +ATOM 6962 O LEU D 51 12.926 7.923 -12.436 1.00 45.78 O +ATOM 6963 CB LEU D 51 10.277 9.693 -12.491 1.00 42.88 C +ATOM 6964 CG LEU D 51 9.075 10.128 -13.339 1.00 44.20 C +ATOM 6965 CD1 LEU D 51 8.917 11.644 -13.285 1.00 43.19 C +ATOM 6966 CD2 LEU D 51 9.269 9.668 -14.782 1.00 44.12 C +ATOM 6967 N LEU D 52 11.908 7.677 -10.441 1.00 47.64 N +ATOM 6968 CA LEU D 52 13.152 7.390 -9.726 1.00 49.59 C +ATOM 6969 C LEU D 52 13.519 5.923 -9.869 1.00 51.14 C +ATOM 6970 O LEU D 52 14.685 5.551 -9.751 1.00 53.38 O +ATOM 6971 CB LEU D 52 13.024 7.735 -8.237 1.00 49.35 C +ATOM 6972 CG LEU D 52 13.194 9.211 -7.866 1.00 49.41 C +ATOM 6973 CD1 LEU D 52 12.728 9.456 -6.440 1.00 49.83 C +ATOM 6974 CD2 LEU D 52 14.651 9.602 -8.044 1.00 48.23 C +ATOM 6975 N GLY D 53 12.515 5.093 -10.124 1.00 52.78 N +ATOM 6976 CA GLY D 53 12.755 3.673 -10.278 1.00 54.61 C +ATOM 6977 C GLY D 53 12.536 2.892 -8.996 1.00 56.57 C +ATOM 6978 O GLY D 53 12.935 1.734 -8.901 1.00 56.43 O +ATOM 6979 N ILE D 54 11.909 3.520 -8.006 1.00 58.97 N +ATOM 6980 CA ILE D 54 11.644 2.848 -6.738 1.00 61.48 C +ATOM 6981 C ILE D 54 10.667 1.695 -6.950 1.00 63.59 C +ATOM 6982 O ILE D 54 10.685 0.708 -6.212 1.00 65.60 O +ATOM 6983 CB ILE D 54 11.063 3.826 -5.693 1.00 61.38 C +ATOM 6984 CG1 ILE D 54 12.157 4.786 -5.215 1.00 60.05 C +ATOM 6985 CG2 ILE D 54 10.484 3.055 -4.515 1.00 61.47 C +ATOM 6986 CD1 ILE D 54 11.672 5.820 -4.229 0.00 60.57 C +ATOM 6987 N HIS D 55 9.821 1.821 -7.968 1.00 64.69 N +ATOM 6988 CA HIS D 55 8.840 0.791 -8.287 1.00 65.70 C +ATOM 6989 C HIS D 55 8.837 0.445 -9.770 1.00 65.76 C +ATOM 6990 O HIS D 55 9.061 1.304 -10.627 1.00 65.26 O +ATOM 6991 CB HIS D 55 7.443 1.246 -7.861 1.00 66.60 C +ATOM 6992 CG HIS D 55 7.243 1.261 -6.379 1.00 68.48 C +ATOM 6993 ND1 HIS D 55 6.257 2.006 -5.769 1.00 68.65 N +ATOM 6994 CD2 HIS D 55 7.890 0.607 -5.385 1.00 69.35 C +ATOM 6995 CE1 HIS D 55 6.307 1.811 -4.463 1.00 70.62 C +ATOM 6996 NE2 HIS D 55 7.289 0.966 -4.204 1.00 69.24 N +ATOM 6997 N ARG D 56 8.586 -0.825 -10.061 1.00 66.24 N +ATOM 6998 CA ARG D 56 8.545 -1.315 -11.431 1.00 67.16 C +ATOM 6999 C ARG D 56 7.165 -1.030 -12.026 1.00 65.46 C +ATOM 7000 O ARG D 56 6.141 -1.333 -11.412 1.00 66.20 O +ATOM 7001 CB ARG D 56 8.810 -2.824 -11.445 1.00 70.49 C +ATOM 7002 CG ARG D 56 9.002 -3.426 -12.828 1.00 75.72 C +ATOM 7003 CD ARG D 56 8.685 -4.923 -12.839 1.00 79.47 C +ATOM 7004 NE ARG D 56 9.448 -5.678 -11.844 1.00 83.33 N +ATOM 7005 CZ ARG D 56 9.291 -6.980 -11.609 1.00 84.97 C +ATOM 7006 NH1 ARG D 56 8.396 -7.680 -12.298 1.00 85.06 N +ATOM 7007 NH2 ARG D 56 10.024 -7.582 -10.681 1.00 84.94 N +ATOM 7008 N PRO D 57 7.121 -0.434 -13.226 1.00 63.71 N +ATOM 7009 CA PRO D 57 5.860 -0.112 -13.902 1.00 63.18 C +ATOM 7010 C PRO D 57 5.081 -1.385 -14.229 1.00 63.19 C +ATOM 7011 O PRO D 57 5.673 -2.383 -14.628 1.00 64.07 O +ATOM 7012 CB PRO D 57 6.322 0.593 -15.177 1.00 62.45 C +ATOM 7013 CG PRO D 57 7.645 1.164 -14.803 1.00 61.27 C +ATOM 7014 CD PRO D 57 8.268 0.061 -14.003 1.00 62.84 C +ATOM 7015 N ILE D 58 3.763 -1.359 -14.063 1.00 63.56 N +ATOM 7016 CA ILE D 58 2.957 -2.534 -14.381 1.00 64.32 C +ATOM 7017 C ILE D 58 2.786 -2.613 -15.898 1.00 63.95 C +ATOM 7018 O ILE D 58 2.762 -3.701 -16.475 1.00 63.89 O +ATOM 7019 CB ILE D 58 1.570 -2.485 -13.681 1.00 64.93 C +ATOM 7020 CG1 ILE D 58 1.699 -2.983 -12.236 1.00 63.72 C +ATOM 7021 CG2 ILE D 58 0.562 -3.345 -14.435 1.00 65.26 C +ATOM 7022 CD1 ILE D 58 2.650 -2.178 -11.381 0.00 64.32 C +ATOM 7023 N GLN D 59 2.678 -1.450 -16.533 1.00 62.73 N +ATOM 7024 CA GLN D 59 2.543 -1.360 -17.983 1.00 61.86 C +ATOM 7025 C GLN D 59 3.388 -0.193 -18.485 1.00 60.83 C +ATOM 7026 O GLN D 59 3.600 0.788 -17.764 1.00 60.01 O +ATOM 7027 CB GLN D 59 1.079 -1.149 -18.382 1.00 63.54 C +ATOM 7028 CG GLN D 59 0.174 -2.316 -18.025 1.00 67.62 C +ATOM 7029 CD GLN D 59 -1.268 -2.119 -18.470 1.00 69.80 C +ATOM 7030 OE1 GLN D 59 -2.119 -2.990 -18.253 1.00 69.88 O +ATOM 7031 NE2 GLN D 59 -1.552 -0.976 -19.096 1.00 69.92 N +ATOM 7032 N GLY D 60 3.875 -0.307 -19.716 1.00 57.92 N +ATOM 7033 CA GLY D 60 4.690 0.746 -20.294 1.00 54.95 C +ATOM 7034 C GLY D 60 6.139 0.703 -19.849 1.00 53.34 C +ATOM 7035 O GLY D 60 6.618 -0.318 -19.352 1.00 52.67 O +ATOM 7036 N LYS D 61 6.840 1.817 -20.030 1.00 51.27 N +ATOM 7037 CA LYS D 61 8.241 1.914 -19.644 1.00 49.68 C +ATOM 7038 C LYS D 61 8.681 3.367 -19.492 1.00 48.08 C +ATOM 7039 O LYS D 61 8.097 4.278 -20.086 1.00 47.00 O +ATOM 7040 CB LYS D 61 9.137 1.221 -20.676 1.00 50.70 C +ATOM 7041 CG LYS D 61 9.105 1.855 -22.059 1.00 52.67 C +ATOM 7042 CD LYS D 61 10.247 1.345 -22.932 1.00 54.98 C +ATOM 7043 CE LYS D 61 10.312 2.119 -24.249 1.00 56.82 C +ATOM 7044 NZ LYS D 61 11.486 1.726 -25.086 1.00 60.26 N +ATOM 7045 N ILE D 62 9.727 3.566 -18.697 1.00 46.56 N +ATOM 7046 CA ILE D 62 10.268 4.892 -18.438 1.00 44.50 C +ATOM 7047 C ILE D 62 11.751 4.921 -18.765 1.00 42.89 C +ATOM 7048 O ILE D 62 12.510 4.059 -18.333 1.00 42.09 O +ATOM 7049 CB ILE D 62 10.087 5.293 -16.947 1.00 45.07 C +ATOM 7050 CG1 ILE D 62 8.601 5.299 -16.584 1.00 44.19 C +ATOM 7051 CG2 ILE D 62 10.700 6.670 -16.696 1.00 45.36 C +ATOM 7052 CD1 ILE D 62 8.323 5.624 -15.131 0.00 44.54 C +ATOM 7053 N GLU D 63 12.160 5.920 -19.532 1.00 42.54 N +ATOM 7054 CA GLU D 63 13.555 6.064 -19.907 1.00 43.85 C +ATOM 7055 C GLU D 63 14.089 7.408 -19.439 1.00 42.21 C +ATOM 7056 O GLU D 63 13.502 8.453 -19.713 1.00 41.93 O +ATOM 7057 CB GLU D 63 13.711 5.934 -21.426 1.00 48.30 C +ATOM 7058 CG GLU D 63 13.817 4.496 -21.921 1.00 52.76 C +ATOM 7059 CD GLU D 63 13.830 4.399 -23.438 1.00 55.00 C +ATOM 7060 OE1 GLU D 63 14.560 5.177 -24.086 1.00 56.67 O +ATOM 7061 OE2 GLU D 63 13.113 3.536 -23.985 1.00 58.00 O +ATOM 7062 N VAL D 64 15.209 7.367 -18.728 1.00 41.11 N +ATOM 7063 CA VAL D 64 15.844 8.565 -18.206 1.00 40.46 C +ATOM 7064 C VAL D 64 17.205 8.727 -18.869 1.00 39.46 C +ATOM 7065 O VAL D 64 18.045 7.832 -18.796 1.00 40.44 O +ATOM 7066 CB VAL D 64 16.014 8.462 -16.678 1.00 40.43 C +ATOM 7067 CG1 VAL D 64 16.613 9.751 -16.130 1.00 40.21 C +ATOM 7068 CG2 VAL D 64 14.658 8.179 -16.031 1.00 39.72 C +ATOM 7069 N TYR D 65 17.428 9.871 -19.505 1.00 37.35 N +ATOM 7070 CA TYR D 65 18.684 10.102 -20.209 1.00 37.87 C +ATOM 7071 C TYR D 65 19.656 11.041 -19.515 1.00 38.33 C +ATOM 7072 O TYR D 65 20.595 11.528 -20.133 1.00 37.54 O +ATOM 7073 CB TYR D 65 18.392 10.620 -21.613 1.00 36.41 C +ATOM 7074 CG TYR D 65 17.298 9.851 -22.317 1.00 35.22 C +ATOM 7075 CD1 TYR D 65 16.106 10.480 -22.685 1.00 35.21 C +ATOM 7076 CD2 TYR D 65 17.454 8.496 -22.621 1.00 34.08 C +ATOM 7077 CE1 TYR D 65 15.096 9.783 -23.342 1.00 36.86 C +ATOM 7078 CE2 TYR D 65 16.444 7.782 -23.281 1.00 36.09 C +ATOM 7079 CZ TYR D 65 15.272 8.434 -23.638 1.00 37.96 C +ATOM 7080 OH TYR D 65 14.277 7.749 -24.300 1.00 40.03 O +ATOM 7081 N GLN D 66 19.429 11.293 -18.231 1.00 39.15 N +ATOM 7082 CA GLN D 66 20.306 12.160 -17.460 1.00 38.53 C +ATOM 7083 C GLN D 66 20.388 11.687 -16.013 1.00 37.98 C +ATOM 7084 O GLN D 66 19.493 10.999 -15.529 1.00 37.85 O +ATOM 7085 CB GLN D 66 19.790 13.591 -17.484 1.00 41.73 C +ATOM 7086 CG GLN D 66 19.778 14.242 -18.850 1.00 46.11 C +ATOM 7087 CD GLN D 66 19.446 15.716 -18.759 1.00 47.71 C +ATOM 7088 OE1 GLN D 66 18.369 16.091 -18.291 1.00 49.47 O +ATOM 7089 NE2 GLN D 66 20.374 16.564 -19.193 1.00 48.75 N +ATOM 7090 N SER D 67 21.468 12.048 -15.328 1.00 35.36 N +ATOM 7091 CA SER D 67 21.627 11.678 -13.928 1.00 35.95 C +ATOM 7092 C SER D 67 20.508 12.373 -13.149 1.00 34.11 C +ATOM 7093 O SER D 67 20.232 13.554 -13.366 1.00 33.83 O +ATOM 7094 CB SER D 67 23.002 12.120 -13.414 1.00 33.97 C +ATOM 7095 OG SER D 67 23.213 13.502 -13.667 1.00 41.70 O +ATOM 7096 N ILE D 68 19.859 11.628 -12.262 1.00 34.89 N +ATOM 7097 CA ILE D 68 18.750 12.142 -11.477 1.00 35.12 C +ATOM 7098 C ILE D 68 19.112 12.498 -10.041 1.00 33.70 C +ATOM 7099 O ILE D 68 19.908 11.825 -9.395 1.00 33.33 O +ATOM 7100 CB ILE D 68 17.575 11.128 -11.445 1.00 39.56 C +ATOM 7101 CG1 ILE D 68 16.919 11.032 -12.824 1.00 41.54 C +ATOM 7102 CG2 ILE D 68 16.517 11.577 -10.439 1.00 42.97 C +ATOM 7103 CD1 ILE D 68 15.770 10.044 -12.891 0.00 40.74 C +ATOM 7104 N GLY D 69 18.522 13.587 -9.568 1.00 33.25 N +ATOM 7105 CA GLY D 69 18.725 14.052 -8.209 1.00 31.11 C +ATOM 7106 C GLY D 69 17.321 14.165 -7.639 1.00 31.52 C +ATOM 7107 O GLY D 69 16.378 14.472 -8.377 1.00 30.99 O +ATOM 7108 N PHE D 70 17.151 13.911 -6.346 1.00 28.83 N +ATOM 7109 CA PHE D 70 15.817 14.001 -5.773 1.00 26.03 C +ATOM 7110 C PHE D 70 15.735 14.914 -4.561 1.00 24.61 C +ATOM 7111 O PHE D 70 16.643 14.950 -3.725 1.00 22.80 O +ATOM 7112 CB PHE D 70 15.302 12.598 -5.413 1.00 26.00 C +ATOM 7113 CG PHE D 70 13.951 12.597 -4.729 1.00 28.31 C +ATOM 7114 CD1 PHE D 70 13.847 12.352 -3.360 1.00 23.49 C +ATOM 7115 CD2 PHE D 70 12.787 12.862 -5.451 1.00 26.44 C +ATOM 7116 CE1 PHE D 70 12.604 12.373 -2.724 1.00 26.48 C +ATOM 7117 CE2 PHE D 70 11.529 12.888 -4.817 1.00 24.48 C +ATOM 7118 CZ PHE D 70 11.439 12.644 -3.456 1.00 22.82 C +ATOM 7119 N VAL D 71 14.641 15.668 -4.482 1.00 23.54 N +ATOM 7120 CA VAL D 71 14.414 16.557 -3.350 1.00 20.87 C +ATOM 7121 C VAL D 71 13.083 16.234 -2.681 1.00 22.15 C +ATOM 7122 O VAL D 71 12.026 16.513 -3.233 1.00 23.56 O +ATOM 7123 CB VAL D 71 14.386 18.052 -3.769 1.00 21.16 C +ATOM 7124 CG1 VAL D 71 14.395 18.939 -2.506 1.00 15.36 C +ATOM 7125 CG2 VAL D 71 15.598 18.385 -4.658 1.00 16.07 C +ATOM 7126 N PRO D 72 13.118 15.615 -1.491 1.00 23.14 N +ATOM 7127 CA PRO D 72 11.885 15.270 -0.765 1.00 22.60 C +ATOM 7128 C PRO D 72 11.273 16.537 -0.159 1.00 23.58 C +ATOM 7129 O PRO D 72 11.944 17.559 -0.057 1.00 26.22 O +ATOM 7130 CB PRO D 72 12.378 14.310 0.315 1.00 22.16 C +ATOM 7131 CG PRO D 72 13.738 14.884 0.646 1.00 22.67 C +ATOM 7132 CD PRO D 72 14.312 15.176 -0.741 1.00 22.05 C +ATOM 7133 N GLN D 73 10.015 16.479 0.257 1.00 23.81 N +ATOM 7134 CA GLN D 73 9.399 17.659 0.834 1.00 25.46 C +ATOM 7135 C GLN D 73 10.014 18.000 2.184 1.00 26.94 C +ATOM 7136 O GLN D 73 10.168 19.171 2.529 1.00 27.78 O +ATOM 7137 CB GLN D 73 7.889 17.469 0.987 1.00 25.91 C +ATOM 7138 CG GLN D 73 7.180 18.778 1.301 1.00 33.53 C +ATOM 7139 CD GLN D 73 5.668 18.649 1.455 1.00 34.80 C +ATOM 7140 OE1 GLN D 73 4.981 19.638 1.720 1.00 37.86 O +ATOM 7141 NE2 GLN D 73 5.147 17.441 1.290 1.00 33.94 N +ATOM 7142 N PHE D 74 10.380 16.970 2.938 1.00 27.63 N +ATOM 7143 CA PHE D 74 10.962 17.152 4.258 1.00 29.08 C +ATOM 7144 C PHE D 74 12.089 16.188 4.516 1.00 30.39 C +ATOM 7145 O PHE D 74 12.224 15.171 3.839 1.00 31.08 O +ATOM 7146 CB PHE D 74 9.917 16.898 5.354 1.00 27.11 C +ATOM 7147 CG PHE D 74 8.701 17.751 5.241 1.00 29.19 C +ATOM 7148 CD1 PHE D 74 8.789 19.135 5.392 1.00 28.46 C +ATOM 7149 CD2 PHE D 74 7.461 17.175 4.967 1.00 27.29 C +ATOM 7150 CE1 PHE D 74 7.654 19.937 5.269 1.00 30.21 C +ATOM 7151 CE2 PHE D 74 6.321 17.965 4.843 1.00 28.90 C +ATOM 7152 CZ PHE D 74 6.414 19.348 4.994 1.00 29.96 C +ATOM 7153 N PHE D 75 12.881 16.527 5.523 1.00 31.17 N +ATOM 7154 CA PHE D 75 13.965 15.686 5.987 1.00 35.16 C +ATOM 7155 C PHE D 75 13.837 15.648 7.514 1.00 39.06 C +ATOM 7156 O PHE D 75 14.089 16.656 8.192 1.00 41.83 O +ATOM 7157 CB PHE D 75 15.334 16.254 5.644 1.00 32.29 C +ATOM 7158 CG PHE D 75 16.444 15.516 6.318 1.00 30.93 C +ATOM 7159 CD1 PHE D 75 16.909 14.312 5.799 1.00 35.87 C +ATOM 7160 CD2 PHE D 75 16.952 15.960 7.530 1.00 30.68 C +ATOM 7161 CE1 PHE D 75 17.871 13.551 6.487 1.00 35.64 C +ATOM 7162 CE2 PHE D 75 17.911 15.214 8.230 1.00 29.82 C +ATOM 7163 CZ PHE D 75 18.370 14.009 7.708 1.00 31.71 C +ATOM 7164 N SER D 76 13.435 14.506 8.054 1.00 39.52 N +ATOM 7165 CA SER D 76 13.292 14.367 9.504 1.00 43.49 C +ATOM 7166 C SER D 76 14.311 13.408 10.091 1.00 43.11 C +ATOM 7167 O SER D 76 14.464 12.279 9.627 1.00 44.61 O +ATOM 7168 CB SER D 76 11.893 13.863 9.875 1.00 45.34 C +ATOM 7169 OG SER D 76 10.898 14.817 9.553 1.00 53.56 O +ATOM 7170 N SER D 77 15.007 13.866 11.119 1.00 43.48 N +ATOM 7171 CA SER D 77 15.983 13.037 11.797 1.00 42.07 C +ATOM 7172 C SER D 77 16.111 13.478 13.245 1.00 42.15 C +ATOM 7173 O SER D 77 16.190 14.670 13.536 1.00 41.19 O +ATOM 7174 CB SER D 77 17.346 13.144 11.123 1.00 43.34 C +ATOM 7175 OG SER D 77 18.361 12.670 11.996 1.00 43.67 O +ATOM 7176 N PRO D 78 16.097 12.520 14.179 1.00 42.04 N +ATOM 7177 CA PRO D 78 16.232 12.902 15.587 1.00 41.45 C +ATOM 7178 C PRO D 78 17.663 13.397 15.848 1.00 42.35 C +ATOM 7179 O PRO D 78 17.956 13.981 16.902 1.00 40.18 O +ATOM 7180 CB PRO D 78 15.907 11.605 16.328 1.00 41.96 C +ATOM 7181 CG PRO D 78 16.278 10.524 15.320 1.00 41.59 C +ATOM 7182 CD PRO D 78 15.742 11.096 14.044 1.00 40.01 C +ATOM 7183 N PHE D 79 18.541 13.179 14.865 1.00 39.61 N +ATOM 7184 CA PHE D 79 19.945 13.588 14.968 1.00 38.22 C +ATOM 7185 C PHE D 79 20.175 14.998 14.440 1.00 35.61 C +ATOM 7186 O PHE D 79 19.764 15.336 13.330 1.00 36.63 O +ATOM 7187 CB PHE D 79 20.823 12.592 14.213 1.00 35.03 C +ATOM 7188 CG PHE D 79 20.607 11.181 14.643 1.00 32.70 C +ATOM 7189 CD1 PHE D 79 20.427 10.170 13.703 1.00 31.46 C +ATOM 7190 CD2 PHE D 79 20.534 10.866 16.004 1.00 29.13 C +ATOM 7191 CE1 PHE D 79 20.169 8.856 14.117 1.00 32.51 C +ATOM 7192 CE2 PHE D 79 20.279 9.564 16.423 1.00 30.76 C +ATOM 7193 CZ PHE D 79 20.094 8.558 15.482 1.00 32.69 C +ATOM 7194 N ALA D 80 20.851 15.806 15.246 1.00 32.99 N +ATOM 7195 CA ALA D 80 21.132 17.195 14.902 1.00 31.03 C +ATOM 7196 C ALA D 80 22.253 17.379 13.878 1.00 27.68 C +ATOM 7197 O ALA D 80 23.268 18.007 14.166 1.00 27.00 O +ATOM 7198 CB ALA D 80 21.449 17.991 16.184 1.00 28.95 C +ATOM 7199 N TYR D 81 22.070 16.828 12.685 1.00 26.35 N +ATOM 7200 CA TYR D 81 23.059 16.981 11.634 1.00 26.59 C +ATOM 7201 C TYR D 81 23.146 18.469 11.260 1.00 26.26 C +ATOM 7202 O TYR D 81 22.158 19.210 11.346 1.00 25.80 O +ATOM 7203 CB TYR D 81 22.651 16.195 10.379 1.00 28.99 C +ATOM 7204 CG TYR D 81 22.753 14.687 10.469 1.00 29.57 C +ATOM 7205 CD1 TYR D 81 21.615 13.881 10.358 1.00 31.60 C +ATOM 7206 CD2 TYR D 81 23.990 14.058 10.627 1.00 29.89 C +ATOM 7207 CE1 TYR D 81 21.710 12.482 10.400 1.00 29.32 C +ATOM 7208 CE2 TYR D 81 24.093 12.658 10.672 1.00 31.18 C +ATOM 7209 CZ TYR D 81 22.950 11.884 10.556 1.00 31.00 C +ATOM 7210 OH TYR D 81 23.058 10.512 10.571 1.00 37.08 O +ATOM 7211 N SER D 82 24.331 18.898 10.848 1.00 24.14 N +ATOM 7212 CA SER D 82 24.546 20.280 10.411 1.00 23.41 C +ATOM 7213 C SER D 82 24.145 20.406 8.934 1.00 22.34 C +ATOM 7214 O SER D 82 23.986 19.402 8.220 1.00 21.73 O +ATOM 7215 CB SER D 82 26.024 20.642 10.503 1.00 23.49 C +ATOM 7216 OG SER D 82 26.732 19.970 9.462 1.00 25.93 O +ATOM 7217 N VAL D 83 24.019 21.645 8.475 1.00 23.07 N +ATOM 7218 CA VAL D 83 23.691 21.926 7.078 1.00 20.44 C +ATOM 7219 C VAL D 83 24.708 21.232 6.170 1.00 20.89 C +ATOM 7220 O VAL D 83 24.349 20.557 5.204 1.00 20.85 O +ATOM 7221 CB VAL D 83 23.696 23.470 6.817 1.00 19.54 C +ATOM 7222 CG1 VAL D 83 23.734 23.772 5.325 1.00 12.82 C +ATOM 7223 CG2 VAL D 83 22.460 24.086 7.438 1.00 18.33 C +ATOM 7224 N LEU D 84 25.988 21.389 6.484 1.00 24.20 N +ATOM 7225 CA LEU D 84 27.025 20.755 5.683 1.00 24.95 C +ATOM 7226 C LEU D 84 26.918 19.226 5.693 1.00 26.45 C +ATOM 7227 O LEU D 84 27.131 18.598 4.660 1.00 28.17 O +ATOM 7228 CB LEU D 84 28.404 21.179 6.178 1.00 28.24 C +ATOM 7229 CG LEU D 84 29.538 20.637 5.308 1.00 32.79 C +ATOM 7230 CD1 LEU D 84 29.388 21.149 3.872 1.00 31.81 C +ATOM 7231 CD2 LEU D 84 30.870 21.069 5.900 1.00 34.64 C +ATOM 7232 N ASP D 85 26.604 18.627 6.849 1.00 26.84 N +ATOM 7233 CA ASP D 85 26.462 17.165 6.936 1.00 24.67 C +ATOM 7234 C ASP D 85 25.404 16.721 5.927 1.00 24.35 C +ATOM 7235 O ASP D 85 25.595 15.742 5.196 1.00 24.52 O +ATOM 7236 CB ASP D 85 25.971 16.709 8.322 1.00 26.89 C +ATOM 7237 CG ASP D 85 27.012 16.846 9.420 1.00 31.00 C +ATOM 7238 OD1 ASP D 85 26.593 17.045 10.593 1.00 31.29 O +ATOM 7239 OD2 ASP D 85 28.225 16.739 9.135 1.00 31.87 O +ATOM 7240 N ILE D 86 24.272 17.428 5.918 1.00 20.80 N +ATOM 7241 CA ILE D 86 23.171 17.107 5.015 1.00 21.96 C +ATOM 7242 C ILE D 86 23.520 17.272 3.530 1.00 22.56 C +ATOM 7243 O ILE D 86 23.240 16.385 2.723 1.00 20.36 O +ATOM 7244 CB ILE D 86 21.909 17.954 5.353 1.00 25.24 C +ATOM 7245 CG1 ILE D 86 21.374 17.574 6.748 1.00 23.45 C +ATOM 7246 CG2 ILE D 86 20.829 17.729 4.297 1.00 21.36 C +ATOM 7247 CD1 ILE D 86 20.997 16.113 6.890 0.00 24.20 C +ATOM 7248 N VAL D 87 24.136 18.397 3.169 1.00 23.36 N +ATOM 7249 CA VAL D 87 24.515 18.637 1.771 1.00 23.75 C +ATOM 7250 C VAL D 87 25.558 17.626 1.310 1.00 23.65 C +ATOM 7251 O VAL D 87 25.515 17.146 0.167 1.00 23.29 O +ATOM 7252 CB VAL D 87 25.101 20.063 1.568 1.00 25.23 C +ATOM 7253 CG1 VAL D 87 25.563 20.240 0.126 1.00 19.57 C +ATOM 7254 CG2 VAL D 87 24.054 21.108 1.927 1.00 23.46 C +ATOM 7255 N LEU D 88 26.492 17.297 2.198 1.00 23.01 N +ATOM 7256 CA LEU D 88 27.561 16.342 1.861 1.00 25.39 C +ATOM 7257 C LEU D 88 27.043 14.938 1.516 1.00 26.12 C +ATOM 7258 O LEU D 88 27.701 14.181 0.793 1.00 26.43 O +ATOM 7259 CB LEU D 88 28.563 16.253 3.017 1.00 25.58 C +ATOM 7260 CG LEU D 88 29.949 15.651 2.757 1.00 30.54 C +ATOM 7261 CD1 LEU D 88 30.730 16.489 1.723 1.00 24.91 C +ATOM 7262 CD2 LEU D 88 30.709 15.584 4.090 1.00 28.25 C +ATOM 7263 N MET D 89 25.870 14.583 2.026 1.00 27.00 N +ATOM 7264 CA MET D 89 25.315 13.265 1.734 1.00 28.75 C +ATOM 7265 C MET D 89 25.075 13.152 0.241 1.00 27.44 C +ATOM 7266 O MET D 89 25.021 12.047 -0.308 1.00 26.46 O +ATOM 7267 CB MET D 89 24.008 13.033 2.510 1.00 30.46 C +ATOM 7268 CG MET D 89 24.224 12.842 4.010 1.00 35.56 C +ATOM 7269 SD MET D 89 22.711 12.557 4.969 1.00 43.77 S +ATOM 7270 CE MET D 89 23.271 13.074 6.634 1.00 40.45 C +ATOM 7271 N GLY D 90 24.940 14.301 -0.419 1.00 27.19 N +ATOM 7272 CA GLY D 90 24.730 14.294 -1.859 1.00 26.56 C +ATOM 7273 C GLY D 90 25.938 13.771 -2.628 1.00 27.70 C +ATOM 7274 O GLY D 90 25.826 13.464 -3.815 1.00 29.22 O +ATOM 7275 N ARG D 91 27.088 13.668 -1.954 1.00 27.61 N +ATOM 7276 CA ARG D 91 28.332 13.176 -2.565 1.00 29.68 C +ATOM 7277 C ARG D 91 28.390 11.660 -2.494 1.00 31.80 C +ATOM 7278 O ARG D 91 29.384 11.045 -2.880 1.00 32.32 O +ATOM 7279 CB ARG D 91 29.568 13.759 -1.851 1.00 25.65 C +ATOM 7280 CG ARG D 91 29.689 15.276 -1.968 1.00 26.40 C +ATOM 7281 CD ARG D 91 29.651 15.691 -3.440 1.00 28.51 C +ATOM 7282 NE ARG D 91 30.853 15.278 -4.168 1.00 28.87 N +ATOM 7283 CZ ARG D 91 30.993 15.348 -5.492 1.00 30.35 C +ATOM 7284 NH1 ARG D 91 32.127 14.962 -6.061 1.00 23.75 N +ATOM 7285 NH2 ARG D 91 29.996 15.787 -6.252 1.00 29.82 N +ATOM 7286 N SER D 92 27.310 11.072 -1.999 1.00 31.61 N +ATOM 7287 CA SER D 92 27.201 9.631 -1.846 1.00 34.02 C +ATOM 7288 C SER D 92 27.770 8.768 -2.984 1.00 34.17 C +ATOM 7289 O SER D 92 28.578 7.877 -2.736 1.00 33.73 O +ATOM 7290 CB SER D 92 25.734 9.263 -1.611 1.00 34.54 C +ATOM 7291 OG SER D 92 25.616 7.888 -1.312 1.00 40.60 O +ATOM 7292 N THR D 93 27.348 9.015 -4.222 1.00 35.51 N +ATOM 7293 CA THR D 93 27.823 8.214 -5.354 1.00 38.43 C +ATOM 7294 C THR D 93 29.247 8.539 -5.812 1.00 38.06 C +ATOM 7295 O THR D 93 29.763 7.901 -6.722 1.00 39.62 O +ATOM 7296 CB THR D 93 26.899 8.358 -6.590 1.00 39.73 C +ATOM 7297 OG1 THR D 93 27.018 9.681 -7.119 1.00 42.24 O +ATOM 7298 CG2 THR D 93 25.442 8.110 -6.210 1.00 40.84 C +ATOM 7299 N HIS D 94 29.881 9.525 -5.190 1.00 36.86 N +ATOM 7300 CA HIS D 94 31.244 9.903 -5.560 1.00 35.84 C +ATOM 7301 C HIS D 94 32.221 9.434 -4.498 1.00 35.16 C +ATOM 7302 O HIS D 94 33.421 9.683 -4.587 1.00 35.12 O +ATOM 7303 CB HIS D 94 31.342 11.423 -5.718 1.00 35.46 C +ATOM 7304 CG HIS D 94 30.446 11.973 -6.784 1.00 38.82 C +ATOM 7305 ND1 HIS D 94 30.768 11.926 -8.124 1.00 41.18 N +ATOM 7306 CD2 HIS D 94 29.218 12.540 -6.712 1.00 38.71 C +ATOM 7307 CE1 HIS D 94 29.776 12.439 -8.831 1.00 41.59 C +ATOM 7308 NE2 HIS D 94 28.822 12.819 -7.999 1.00 41.31 N +ATOM 7309 N ILE D 95 31.690 8.769 -3.479 1.00 35.25 N +ATOM 7310 CA ILE D 95 32.498 8.261 -2.381 1.00 34.20 C +ATOM 7311 C ILE D 95 32.258 6.758 -2.284 1.00 35.03 C +ATOM 7312 O ILE D 95 31.121 6.315 -2.162 1.00 36.83 O +ATOM 7313 CB ILE D 95 32.095 8.912 -1.034 1.00 33.45 C +ATOM 7314 CG1 ILE D 95 32.268 10.439 -1.095 1.00 33.13 C +ATOM 7315 CG2 ILE D 95 32.922 8.314 0.089 1.00 29.43 C +ATOM 7316 CD1 ILE D 95 31.792 11.160 0.148 0.00 33.22 C +ATOM 7317 N ASN D 96 33.326 5.976 -2.342 1.00 35.19 N +ATOM 7318 CA ASN D 96 33.206 4.527 -2.256 1.00 36.84 C +ATOM 7319 C ASN D 96 32.627 4.076 -0.911 1.00 36.87 C +ATOM 7320 O ASN D 96 32.828 4.725 0.114 1.00 35.79 O +ATOM 7321 CB ASN D 96 34.580 3.895 -2.487 1.00 36.85 C +ATOM 7322 CG ASN D 96 35.059 4.056 -3.932 1.00 43.28 C +ATOM 7323 OD1 ASN D 96 36.263 4.061 -4.204 1.00 42.79 O +ATOM 7324 ND2 ASN D 96 34.112 4.178 -4.864 1.00 40.46 N +ATOM 7325 N THR D 97 31.917 2.954 -0.934 1.00 36.83 N +ATOM 7326 CA THR D 97 31.291 2.384 0.248 1.00 38.36 C +ATOM 7327 C THR D 97 32.097 2.475 1.542 1.00 39.27 C +ATOM 7328 O THR D 97 31.568 2.895 2.570 1.00 40.33 O +ATOM 7329 CB THR D 97 30.954 0.904 0.030 1.00 40.51 C +ATOM 7330 OG1 THR D 97 30.151 0.762 -1.146 1.00 43.72 O +ATOM 7331 CG2 THR D 97 30.180 0.359 1.226 1.00 40.40 C +ATOM 7332 N PHE D 98 33.365 2.079 1.510 1.00 39.92 N +ATOM 7333 CA PHE D 98 34.172 2.122 2.726 1.00 39.58 C +ATOM 7334 C PHE D 98 35.140 3.281 2.802 1.00 39.15 C +ATOM 7335 O PHE D 98 36.018 3.308 3.664 1.00 40.92 O +ATOM 7336 CB PHE D 98 34.925 0.798 2.909 1.00 41.14 C +ATOM 7337 CG PHE D 98 34.020 -0.399 2.942 1.00 42.05 C +ATOM 7338 CD1 PHE D 98 33.591 -0.993 1.758 1.00 42.25 C +ATOM 7339 CD2 PHE D 98 33.537 -0.887 4.154 1.00 42.30 C +ATOM 7340 CE1 PHE D 98 32.687 -2.058 1.777 1.00 44.51 C +ATOM 7341 CE2 PHE D 98 32.631 -1.950 4.188 1.00 43.60 C +ATOM 7342 CZ PHE D 98 32.203 -2.537 2.998 1.00 43.88 C +ATOM 7343 N ALA D 99 34.972 4.253 1.916 1.00 38.76 N +ATOM 7344 CA ALA D 99 35.851 5.415 1.918 1.00 37.86 C +ATOM 7345 C ALA D 99 35.196 6.605 2.610 1.00 36.60 C +ATOM 7346 O ALA D 99 33.993 6.614 2.866 1.00 36.10 O +ATOM 7347 CB ALA D 99 36.230 5.785 0.492 1.00 36.44 C +ATOM 7348 N LYS D 100 36.003 7.613 2.897 1.00 35.73 N +ATOM 7349 CA LYS D 100 35.542 8.830 3.548 1.00 36.07 C +ATOM 7350 C LYS D 100 35.517 9.975 2.532 1.00 34.86 C +ATOM 7351 O LYS D 100 36.189 9.913 1.507 1.00 33.51 O +ATOM 7352 CB LYS D 100 36.499 9.195 4.678 1.00 35.98 C +ATOM 7353 CG LYS D 100 36.584 8.166 5.780 1.00 39.36 C +ATOM 7354 CD LYS D 100 35.256 8.025 6.509 1.00 40.91 C +ATOM 7355 CE LYS D 100 35.452 7.478 7.924 1.00 43.63 C +ATOM 7356 NZ LYS D 100 36.102 6.147 7.936 1.00 42.43 N +ATOM 7357 N PRO D 101 34.723 11.025 2.788 1.00 34.03 N +ATOM 7358 CA PRO D 101 34.727 12.116 1.804 1.00 34.38 C +ATOM 7359 C PRO D 101 36.091 12.800 1.742 1.00 34.31 C +ATOM 7360 O PRO D 101 36.760 12.956 2.766 1.00 34.83 O +ATOM 7361 CB PRO D 101 33.622 13.056 2.305 1.00 32.69 C +ATOM 7362 CG PRO D 101 33.464 12.702 3.759 1.00 36.50 C +ATOM 7363 CD PRO D 101 33.650 11.207 3.780 1.00 32.65 C +ATOM 7364 N LYS D 102 36.499 13.205 0.542 1.00 34.20 N +ATOM 7365 CA LYS D 102 37.787 13.879 0.350 1.00 33.72 C +ATOM 7366 C LYS D 102 37.577 15.381 0.188 1.00 33.78 C +ATOM 7367 O LYS D 102 36.442 15.854 0.188 1.00 35.33 O +ATOM 7368 CB LYS D 102 38.501 13.314 -0.885 1.00 36.30 C +ATOM 7369 CG LYS D 102 38.709 11.799 -0.842 1.00 38.31 C +ATOM 7370 CD LYS D 102 39.553 11.310 -2.019 1.00 45.44 C +ATOM 7371 CE LYS D 102 39.553 9.778 -2.134 1.00 46.82 C +ATOM 7372 NZ LYS D 102 40.016 9.100 -0.885 1.00 48.79 N +ATOM 7373 N SER D 103 38.668 16.128 0.047 1.00 33.35 N +ATOM 7374 CA SER D 103 38.598 17.586 -0.099 1.00 34.57 C +ATOM 7375 C SER D 103 37.638 18.035 -1.188 1.00 32.57 C +ATOM 7376 O SER D 103 36.839 18.954 -0.993 1.00 29.64 O +ATOM 7377 CB SER D 103 39.985 18.167 -0.401 1.00 34.16 C +ATOM 7378 OG SER D 103 40.786 18.131 0.764 1.00 42.32 O +ATOM 7379 N HIS D 104 37.735 17.388 -2.340 1.00 29.97 N +ATOM 7380 CA HIS D 104 36.874 17.734 -3.445 1.00 31.23 C +ATOM 7381 C HIS D 104 35.399 17.663 -3.050 1.00 30.69 C +ATOM 7382 O HIS D 104 34.615 18.516 -3.450 1.00 32.12 O +ATOM 7383 CB HIS D 104 37.131 16.814 -4.637 1.00 29.88 C +ATOM 7384 CG HIS D 104 36.455 17.277 -5.886 1.00 31.65 C +ATOM 7385 ND1 HIS D 104 35.635 16.463 -6.638 1.00 30.54 N +ATOM 7386 CD2 HIS D 104 36.434 18.491 -6.483 1.00 28.91 C +ATOM 7387 CE1 HIS D 104 35.135 17.158 -7.644 1.00 29.12 C +ATOM 7388 NE2 HIS D 104 35.603 18.390 -7.573 1.00 31.24 N +ATOM 7389 N ASP D 105 35.027 16.653 -2.265 1.00 30.73 N +ATOM 7390 CA ASP D 105 33.634 16.491 -1.835 1.00 29.12 C +ATOM 7391 C ASP D 105 33.166 17.679 -1.002 1.00 28.24 C +ATOM 7392 O ASP D 105 32.035 18.138 -1.155 1.00 28.77 O +ATOM 7393 CB ASP D 105 33.463 15.187 -1.043 1.00 26.82 C +ATOM 7394 CG ASP D 105 33.765 13.970 -1.874 1.00 26.65 C +ATOM 7395 OD1 ASP D 105 34.706 13.227 -1.528 1.00 30.46 O +ATOM 7396 OD2 ASP D 105 33.067 13.758 -2.883 1.00 26.24 O +ATOM 7397 N TYR D 106 34.023 18.179 -0.119 1.00 26.64 N +ATOM 7398 CA TYR D 106 33.644 19.334 0.684 1.00 28.03 C +ATOM 7399 C TYR D 106 33.556 20.592 -0.190 1.00 29.58 C +ATOM 7400 O TYR D 106 32.720 21.471 0.050 1.00 28.58 O +ATOM 7401 CB TYR D 106 34.650 19.567 1.819 1.00 30.52 C +ATOM 7402 CG TYR D 106 34.620 18.496 2.880 1.00 35.38 C +ATOM 7403 CD1 TYR D 106 35.379 17.335 2.741 1.00 37.60 C +ATOM 7404 CD2 TYR D 106 33.789 18.613 4.001 1.00 35.86 C +ATOM 7405 CE1 TYR D 106 35.318 16.318 3.684 1.00 39.03 C +ATOM 7406 CE2 TYR D 106 33.718 17.592 4.955 1.00 37.46 C +ATOM 7407 CZ TYR D 106 34.490 16.451 4.786 1.00 39.75 C +ATOM 7408 OH TYR D 106 34.468 15.441 5.725 1.00 44.22 O +ATOM 7409 N GLN D 107 34.411 20.661 -1.211 1.00 27.94 N +ATOM 7410 CA GLN D 107 34.447 21.804 -2.121 1.00 27.76 C +ATOM 7411 C GLN D 107 33.173 21.915 -2.933 1.00 26.69 C +ATOM 7412 O GLN D 107 32.626 23.007 -3.109 1.00 24.83 O +ATOM 7413 CB GLN D 107 35.648 21.689 -3.069 1.00 27.64 C +ATOM 7414 CG GLN D 107 36.993 21.798 -2.355 1.00 30.82 C +ATOM 7415 CD GLN D 107 38.161 21.324 -3.206 1.00 31.49 C +ATOM 7416 OE1 GLN D 107 39.294 21.302 -2.747 1.00 35.90 O +ATOM 7417 NE2 GLN D 107 37.886 20.944 -4.446 1.00 31.10 N +ATOM 7418 N VAL D 108 32.706 20.780 -3.439 1.00 25.59 N +ATOM 7419 CA VAL D 108 31.492 20.777 -4.224 1.00 25.00 C +ATOM 7420 C VAL D 108 30.284 21.104 -3.349 1.00 24.94 C +ATOM 7421 O VAL D 108 29.422 21.878 -3.760 1.00 23.89 O +ATOM 7422 CB VAL D 108 31.294 19.428 -4.921 1.00 26.22 C +ATOM 7423 CG1 VAL D 108 29.942 19.409 -5.648 1.00 24.81 C +ATOM 7424 CG2 VAL D 108 32.439 19.204 -5.918 1.00 26.07 C +ATOM 7425 N ALA D 109 30.225 20.522 -2.150 1.00 22.76 N +ATOM 7426 CA ALA D 109 29.118 20.792 -1.240 1.00 23.16 C +ATOM 7427 C ALA D 109 29.121 22.288 -0.941 1.00 24.46 C +ATOM 7428 O ALA D 109 28.076 22.936 -0.982 1.00 25.38 O +ATOM 7429 CB ALA D 109 29.267 19.976 0.056 1.00 19.44 C +ATOM 7430 N MET D 110 30.302 22.837 -0.657 1.00 25.63 N +ATOM 7431 CA MET D 110 30.429 24.271 -0.381 1.00 26.52 C +ATOM 7432 C MET D 110 30.020 25.085 -1.606 1.00 26.98 C +ATOM 7433 O MET D 110 29.422 26.158 -1.480 1.00 26.01 O +ATOM 7434 CB MET D 110 31.874 24.623 -0.006 1.00 30.06 C +ATOM 7435 CG MET D 110 32.285 24.232 1.411 1.00 34.70 C +ATOM 7436 SD MET D 110 31.506 25.269 2.665 1.00 44.37 S +ATOM 7437 CE MET D 110 30.226 24.221 3.200 1.00 42.45 C +ATOM 7438 N GLN D 111 30.339 24.569 -2.791 1.00 25.95 N +ATOM 7439 CA GLN D 111 30.013 25.250 -4.040 1.00 28.39 C +ATOM 7440 C GLN D 111 28.494 25.341 -4.214 1.00 27.32 C +ATOM 7441 O GLN D 111 27.970 26.332 -4.724 1.00 28.59 O +ATOM 7442 CB GLN D 111 30.631 24.495 -5.224 1.00 31.32 C +ATOM 7443 CG GLN D 111 30.593 25.232 -6.556 1.00 40.94 C +ATOM 7444 CD GLN D 111 31.059 24.356 -7.721 1.00 49.50 C +ATOM 7445 OE1 GLN D 111 31.912 23.476 -7.548 1.00 53.22 O +ATOM 7446 NE2 GLN D 111 30.510 24.603 -8.914 1.00 50.10 N +ATOM 7447 N ALA D 112 27.790 24.297 -3.794 1.00 26.10 N +ATOM 7448 CA ALA D 112 26.339 24.277 -3.891 1.00 25.14 C +ATOM 7449 C ALA D 112 25.740 25.298 -2.907 1.00 26.25 C +ATOM 7450 O ALA D 112 24.779 25.991 -3.236 1.00 27.94 O +ATOM 7451 CB ALA D 112 25.811 22.867 -3.602 1.00 22.40 C +ATOM 7452 N LEU D 113 26.307 25.397 -1.704 1.00 25.40 N +ATOM 7453 CA LEU D 113 25.815 26.370 -0.729 1.00 25.67 C +ATOM 7454 C LEU D 113 26.101 27.791 -1.235 1.00 27.08 C +ATOM 7455 O LEU D 113 25.274 28.687 -1.067 1.00 25.05 O +ATOM 7456 CB LEU D 113 26.476 26.160 0.641 1.00 21.80 C +ATOM 7457 CG LEU D 113 26.090 24.867 1.383 1.00 25.31 C +ATOM 7458 CD1 LEU D 113 26.911 24.731 2.648 1.00 22.31 C +ATOM 7459 CD2 LEU D 113 24.605 24.877 1.712 1.00 21.47 C +ATOM 7460 N ASP D 114 27.270 27.983 -1.855 1.00 27.82 N +ATOM 7461 CA ASP D 114 27.663 29.287 -2.401 1.00 27.50 C +ATOM 7462 C ASP D 114 26.637 29.735 -3.435 1.00 28.06 C +ATOM 7463 O ASP D 114 26.172 30.871 -3.419 1.00 30.96 O +ATOM 7464 CB ASP D 114 29.021 29.210 -3.105 1.00 26.88 C +ATOM 7465 CG ASP D 114 30.190 29.043 -2.149 1.00 31.66 C +ATOM 7466 OD1 ASP D 114 31.240 28.540 -2.605 1.00 33.22 O +ATOM 7467 OD2 ASP D 114 30.084 29.419 -0.958 1.00 34.15 O +ATOM 7468 N TYR D 115 26.293 28.826 -4.336 1.00 27.02 N +ATOM 7469 CA TYR D 115 25.340 29.122 -5.393 1.00 28.54 C +ATOM 7470 C TYR D 115 23.984 29.592 -4.862 1.00 27.64 C +ATOM 7471 O TYR D 115 23.352 30.456 -5.463 1.00 28.15 O +ATOM 7472 CB TYR D 115 25.181 27.895 -6.291 1.00 29.11 C +ATOM 7473 CG TYR D 115 24.077 28.011 -7.294 1.00 31.86 C +ATOM 7474 CD1 TYR D 115 24.154 28.907 -8.359 1.00 34.64 C +ATOM 7475 CD2 TYR D 115 22.923 27.244 -7.157 1.00 33.89 C +ATOM 7476 CE1 TYR D 115 23.092 29.033 -9.265 1.00 33.92 C +ATOM 7477 CE2 TYR D 115 21.873 27.358 -8.038 1.00 32.06 C +ATOM 7478 CZ TYR D 115 21.954 28.250 -9.086 1.00 33.54 C +ATOM 7479 OH TYR D 115 20.874 28.354 -9.927 1.00 37.01 O +ATOM 7480 N LEU D 116 23.539 29.030 -3.740 1.00 27.42 N +ATOM 7481 CA LEU D 116 22.271 29.441 -3.147 1.00 26.04 C +ATOM 7482 C LEU D 116 22.494 30.585 -2.152 1.00 27.48 C +ATOM 7483 O LEU D 116 21.546 31.098 -1.570 1.00 24.65 O +ATOM 7484 CB LEU D 116 21.618 28.264 -2.427 1.00 28.15 C +ATOM 7485 CG LEU D 116 21.334 27.016 -3.267 1.00 30.49 C +ATOM 7486 CD1 LEU D 116 20.642 25.974 -2.411 1.00 30.77 C +ATOM 7487 CD2 LEU D 116 20.452 27.382 -4.456 1.00 29.16 C +ATOM 7488 N ASN D 117 23.749 30.991 -1.969 1.00 27.29 N +ATOM 7489 CA ASN D 117 24.080 32.060 -1.020 1.00 31.33 C +ATOM 7490 C ASN D 117 23.685 31.649 0.406 1.00 29.16 C +ATOM 7491 O ASN D 117 23.242 32.481 1.194 1.00 31.59 O +ATOM 7492 CB ASN D 117 23.356 33.378 -1.389 1.00 32.94 C +ATOM 7493 CG ASN D 117 23.612 33.820 -2.839 1.00 37.70 C +ATOM 7494 OD1 ASN D 117 22.692 34.254 -3.539 1.00 38.90 O +ATOM 7495 ND2 ASN D 117 24.860 33.724 -3.283 1.00 37.44 N +ATOM 7496 N LEU D 118 23.850 30.369 0.739 1.00 29.76 N +ATOM 7497 CA LEU D 118 23.501 29.868 2.072 1.00 29.93 C +ATOM 7498 C LEU D 118 24.712 29.333 2.838 1.00 29.49 C +ATOM 7499 O LEU D 118 24.575 28.695 3.887 1.00 29.37 O +ATOM 7500 CB LEU D 118 22.427 28.775 1.959 1.00 30.78 C +ATOM 7501 CG LEU D 118 21.096 29.204 1.313 1.00 30.96 C +ATOM 7502 CD1 LEU D 118 20.117 28.039 1.315 1.00 31.87 C +ATOM 7503 CD2 LEU D 118 20.508 30.368 2.075 1.00 29.35 C +ATOM 7504 N THR D 119 25.898 29.596 2.301 1.00 28.67 N +ATOM 7505 CA THR D 119 27.148 29.167 2.912 1.00 28.31 C +ATOM 7506 C THR D 119 27.313 29.557 4.394 1.00 27.15 C +ATOM 7507 O THR D 119 27.948 28.833 5.159 1.00 24.41 O +ATOM 7508 CB THR D 119 28.336 29.726 2.114 1.00 30.88 C +ATOM 7509 OG1 THR D 119 28.211 29.325 0.742 1.00 35.50 O +ATOM 7510 CG2 THR D 119 29.653 29.204 2.668 1.00 31.37 C +ATOM 7511 N HIS D 120 26.749 30.691 4.802 1.00 25.22 N +ATOM 7512 CA HIS D 120 26.876 31.126 6.191 1.00 26.00 C +ATOM 7513 C HIS D 120 26.150 30.202 7.179 1.00 25.82 C +ATOM 7514 O HIS D 120 26.355 30.282 8.393 1.00 25.66 O +ATOM 7515 CB HIS D 120 26.364 32.562 6.357 1.00 23.74 C +ATOM 7516 CG HIS D 120 24.896 32.721 6.106 1.00 26.19 C +ATOM 7517 ND1 HIS D 120 24.352 32.751 4.839 1.00 29.05 N +ATOM 7518 CD2 HIS D 120 23.857 32.868 6.963 1.00 27.68 C +ATOM 7519 CE1 HIS D 120 23.042 32.914 4.925 1.00 26.56 C +ATOM 7520 NE2 HIS D 120 22.717 32.986 6.203 1.00 29.65 N +ATOM 7521 N LEU D 121 25.311 29.325 6.645 1.00 25.44 N +ATOM 7522 CA LEU D 121 24.541 28.379 7.445 1.00 27.13 C +ATOM 7523 C LEU D 121 25.239 27.023 7.573 1.00 26.95 C +ATOM 7524 O LEU D 121 24.737 26.132 8.267 1.00 30.09 O +ATOM 7525 CB LEU D 121 23.177 28.146 6.785 1.00 25.88 C +ATOM 7526 CG LEU D 121 21.900 28.962 7.046 1.00 30.51 C +ATOM 7527 CD1 LEU D 121 22.160 30.269 7.776 1.00 28.36 C +ATOM 7528 CD2 LEU D 121 21.223 29.189 5.709 1.00 26.46 C +ATOM 7529 N ALA D 122 26.387 26.869 6.918 1.00 24.38 N +ATOM 7530 CA ALA D 122 27.108 25.593 6.894 1.00 26.88 C +ATOM 7531 C ALA D 122 27.270 24.830 8.213 1.00 28.52 C +ATOM 7532 O ALA D 122 27.127 23.604 8.244 1.00 29.13 O +ATOM 7533 CB ALA D 122 28.481 25.780 6.231 1.00 25.32 C +ATOM 7534 N LYS D 123 27.566 25.537 9.297 1.00 30.00 N +ATOM 7535 CA LYS D 123 27.751 24.869 10.578 1.00 32.59 C +ATOM 7536 C LYS D 123 26.498 24.843 11.443 1.00 32.34 C +ATOM 7537 O LYS D 123 26.524 24.330 12.558 1.00 33.11 O +ATOM 7538 CB LYS D 123 28.910 25.520 11.347 1.00 34.79 C +ATOM 7539 CG LYS D 123 30.284 25.290 10.719 1.00 37.47 C +ATOM 7540 CD LYS D 123 30.664 23.820 10.770 1.00 43.83 C +ATOM 7541 CE LYS D 123 32.078 23.552 10.235 1.00 47.27 C +ATOM 7542 NZ LYS D 123 32.147 23.544 8.746 1.00 47.74 N +ATOM 7543 N ARG D 124 25.402 25.388 10.932 1.00 30.93 N +ATOM 7544 CA ARG D 124 24.150 25.401 11.686 1.00 31.04 C +ATOM 7545 C ARG D 124 23.477 24.032 11.728 1.00 31.14 C +ATOM 7546 O ARG D 124 23.669 23.190 10.842 1.00 28.61 O +ATOM 7547 CB ARG D 124 23.171 26.401 11.067 1.00 32.30 C +ATOM 7548 CG ARG D 124 23.574 27.848 11.247 1.00 38.33 C +ATOM 7549 CD ARG D 124 22.769 28.491 12.343 1.00 42.89 C +ATOM 7550 NE ARG D 124 21.938 29.553 11.783 1.00 51.59 N +ATOM 7551 CZ ARG D 124 20.619 29.632 11.913 1.00 51.21 C +ATOM 7552 NH1 ARG D 124 19.972 30.643 11.352 1.00 56.27 N +ATOM 7553 NH2 ARG D 124 19.948 28.713 12.600 1.00 50.06 N +ATOM 7554 N GLU D 125 22.689 23.809 12.771 1.00 31.13 N +ATOM 7555 CA GLU D 125 21.948 22.564 12.880 1.00 31.90 C +ATOM 7556 C GLU D 125 20.759 22.723 11.942 1.00 28.06 C +ATOM 7557 O GLU D 125 20.000 23.681 12.038 1.00 25.48 O +ATOM 7558 CB GLU D 125 21.470 22.329 14.320 1.00 34.23 C +ATOM 7559 CG GLU D 125 22.368 21.387 15.116 1.00 45.01 C +ATOM 7560 CD GLU D 125 22.171 21.508 16.625 1.00 49.09 C +ATOM 7561 OE1 GLU D 125 21.003 21.559 17.075 1.00 52.87 O +ATOM 7562 OE2 GLU D 125 23.186 21.541 17.356 1.00 48.89 O +ATOM 7563 N PHE D 126 20.625 21.780 11.025 1.00 25.70 N +ATOM 7564 CA PHE D 126 19.551 21.792 10.059 1.00 25.84 C +ATOM 7565 C PHE D 126 18.167 22.058 10.670 1.00 28.04 C +ATOM 7566 O PHE D 126 17.390 22.843 10.115 1.00 25.97 O +ATOM 7567 CB PHE D 126 19.544 20.465 9.319 1.00 23.27 C +ATOM 7568 CG PHE D 126 18.474 20.354 8.283 1.00 26.88 C +ATOM 7569 CD1 PHE D 126 18.656 20.904 7.012 1.00 21.91 C +ATOM 7570 CD2 PHE D 126 17.300 19.652 8.554 1.00 24.77 C +ATOM 7571 CE1 PHE D 126 17.695 20.746 6.022 1.00 23.83 C +ATOM 7572 CE2 PHE D 126 16.321 19.490 7.562 1.00 27.00 C +ATOM 7573 CZ PHE D 126 16.521 20.034 6.294 1.00 25.17 C +ATOM 7574 N THR D 127 17.853 21.419 11.798 1.00 28.64 N +ATOM 7575 CA THR D 127 16.542 21.617 12.424 1.00 33.88 C +ATOM 7576 C THR D 127 16.300 23.020 12.998 1.00 35.35 C +ATOM 7577 O THR D 127 15.166 23.374 13.310 1.00 37.28 O +ATOM 7578 CB THR D 127 16.254 20.556 13.541 1.00 34.76 C +ATOM 7579 OG1 THR D 127 17.361 20.478 14.447 1.00 38.33 O +ATOM 7580 CG2 THR D 127 16.025 19.190 12.923 1.00 33.46 C +ATOM 7581 N SER D 128 17.347 23.829 13.125 1.00 34.59 N +ATOM 7582 CA SER D 128 17.171 25.182 13.652 1.00 34.62 C +ATOM 7583 C SER D 128 16.820 26.169 12.536 1.00 35.06 C +ATOM 7584 O SER D 128 16.615 27.356 12.792 1.00 36.28 O +ATOM 7585 CB SER D 128 18.449 25.668 14.345 1.00 34.63 C +ATOM 7586 OG SER D 128 19.412 26.090 13.390 1.00 36.29 O +ATOM 7587 N LEU D 129 16.769 25.684 11.300 1.00 31.75 N +ATOM 7588 CA LEU D 129 16.451 26.540 10.160 1.00 31.04 C +ATOM 7589 C LEU D 129 14.945 26.656 9.921 1.00 30.03 C +ATOM 7590 O LEU D 129 14.162 25.848 10.399 1.00 28.29 O +ATOM 7591 CB LEU D 129 17.097 25.980 8.884 1.00 32.09 C +ATOM 7592 CG LEU D 129 18.545 26.294 8.479 1.00 36.11 C +ATOM 7593 CD1 LEU D 129 19.468 26.343 9.675 1.00 33.58 C +ATOM 7594 CD2 LEU D 129 19.002 25.238 7.478 1.00 35.39 C +ATOM 7595 N SER D 130 14.556 27.666 9.157 1.00 29.17 N +ATOM 7596 CA SER D 130 13.159 27.865 8.809 1.00 26.64 C +ATOM 7597 C SER D 130 12.832 26.803 7.758 1.00 27.39 C +ATOM 7598 O SER D 130 13.734 26.165 7.203 1.00 26.96 O +ATOM 7599 CB SER D 130 12.967 29.246 8.186 1.00 27.00 C +ATOM 7600 OG SER D 130 13.578 29.294 6.898 1.00 29.60 O +ATOM 7601 N GLY D 131 11.544 26.622 7.482 1.00 26.90 N +ATOM 7602 CA GLY D 131 11.124 25.658 6.482 1.00 25.28 C +ATOM 7603 C GLY D 131 11.702 25.996 5.114 1.00 25.32 C +ATOM 7604 O GLY D 131 12.077 25.096 4.360 1.00 24.94 O +ATOM 7605 N GLY D 132 11.785 27.292 4.806 1.00 24.23 N +ATOM 7606 CA GLY D 132 12.322 27.733 3.529 1.00 22.88 C +ATOM 7607 C GLY D 132 13.789 27.374 3.363 1.00 23.47 C +ATOM 7608 O GLY D 132 14.200 26.876 2.324 1.00 24.71 O +ATOM 7609 N GLN D 133 14.580 27.625 4.399 1.00 24.94 N +ATOM 7610 CA GLN D 133 16.001 27.315 4.365 1.00 25.50 C +ATOM 7611 C GLN D 133 16.228 25.813 4.278 1.00 26.07 C +ATOM 7612 O GLN D 133 17.107 25.356 3.536 1.00 25.16 O +ATOM 7613 CB GLN D 133 16.697 27.888 5.603 1.00 23.92 C +ATOM 7614 CG GLN D 133 16.660 29.417 5.665 1.00 24.32 C +ATOM 7615 CD GLN D 133 17.187 29.965 6.987 1.00 28.19 C +ATOM 7616 OE1 GLN D 133 16.829 29.478 8.067 1.00 27.46 O +ATOM 7617 NE2 GLN D 133 18.033 30.991 6.908 1.00 28.13 N +ATOM 7618 N ARG D 134 15.430 25.049 5.026 1.00 25.87 N +ATOM 7619 CA ARG D 134 15.554 23.601 5.019 1.00 27.27 C +ATOM 7620 C ARG D 134 15.289 23.052 3.620 1.00 27.48 C +ATOM 7621 O ARG D 134 16.013 22.176 3.145 1.00 28.97 O +ATOM 7622 CB ARG D 134 14.594 22.978 6.036 1.00 25.98 C +ATOM 7623 CG ARG D 134 15.030 23.225 7.468 1.00 30.96 C +ATOM 7624 CD ARG D 134 13.972 22.858 8.497 1.00 31.73 C +ATOM 7625 NE ARG D 134 13.844 21.418 8.670 1.00 42.45 N +ATOM 7626 CZ ARG D 134 13.340 20.842 9.761 1.00 45.96 C +ATOM 7627 NH1 ARG D 134 13.255 19.518 9.842 1.00 46.07 N +ATOM 7628 NH2 ARG D 134 12.932 21.593 10.779 1.00 45.53 N +ATOM 7629 N GLN D 135 14.259 23.574 2.959 1.00 25.02 N +ATOM 7630 CA GLN D 135 13.928 23.132 1.609 1.00 24.25 C +ATOM 7631 C GLN D 135 15.074 23.471 0.645 1.00 23.72 C +ATOM 7632 O GLN D 135 15.439 22.651 -0.195 1.00 23.65 O +ATOM 7633 CB GLN D 135 12.617 23.787 1.147 1.00 24.90 C +ATOM 7634 CG GLN D 135 12.193 23.468 -0.291 1.00 28.30 C +ATOM 7635 CD GLN D 135 12.187 21.980 -0.602 1.00 29.93 C +ATOM 7636 OE1 GLN D 135 11.744 21.157 0.199 1.00 33.66 O +ATOM 7637 NE2 GLN D 135 12.669 21.632 -1.777 1.00 29.19 N +ATOM 7638 N LEU D 136 15.636 24.675 0.773 1.00 22.77 N +ATOM 7639 CA LEU D 136 16.747 25.099 -0.079 1.00 23.44 C +ATOM 7640 C LEU D 136 17.984 24.221 0.165 1.00 22.60 C +ATOM 7641 O LEU D 136 18.694 23.857 -0.770 1.00 22.56 O +ATOM 7642 CB LEU D 136 17.089 26.577 0.179 1.00 22.35 C +ATOM 7643 CG LEU D 136 15.990 27.575 -0.222 1.00 24.18 C +ATOM 7644 CD1 LEU D 136 16.277 28.943 0.383 1.00 22.28 C +ATOM 7645 CD2 LEU D 136 15.894 27.663 -1.738 1.00 22.11 C +ATOM 7646 N ILE D 137 18.237 23.870 1.421 1.00 22.77 N +ATOM 7647 CA ILE D 137 19.378 23.023 1.725 1.00 21.58 C +ATOM 7648 C ILE D 137 19.198 21.640 1.088 1.00 21.95 C +ATOM 7649 O ILE D 137 20.170 21.048 0.616 1.00 21.65 O +ATOM 7650 CB ILE D 137 19.602 22.916 3.266 1.00 24.70 C +ATOM 7651 CG1 ILE D 137 20.092 24.281 3.803 1.00 21.28 C +ATOM 7652 CG2 ILE D 137 20.596 21.783 3.599 1.00 16.03 C +ATOM 7653 CD1 ILE D 137 21.366 24.782 3.151 0.00 22.62 C +ATOM 7654 N LEU D 138 17.964 21.137 1.034 1.00 20.80 N +ATOM 7655 CA LEU D 138 17.738 19.822 0.421 1.00 23.69 C +ATOM 7656 C LEU D 138 17.930 19.905 -1.097 1.00 22.69 C +ATOM 7657 O LEU D 138 18.267 18.913 -1.734 1.00 22.87 O +ATOM 7658 CB LEU D 138 16.340 19.266 0.768 1.00 22.41 C +ATOM 7659 CG LEU D 138 16.112 19.008 2.269 1.00 26.72 C +ATOM 7660 CD1 LEU D 138 14.717 18.434 2.513 1.00 23.46 C +ATOM 7661 CD2 LEU D 138 17.186 18.047 2.796 1.00 24.88 C +ATOM 7662 N ILE D 139 17.721 21.089 -1.674 1.00 22.62 N +ATOM 7663 CA ILE D 139 17.941 21.267 -3.105 1.00 21.91 C +ATOM 7664 C ILE D 139 19.465 21.286 -3.312 1.00 22.05 C +ATOM 7665 O ILE D 139 19.983 20.700 -4.263 1.00 22.11 O +ATOM 7666 CB ILE D 139 17.332 22.591 -3.630 1.00 22.92 C +ATOM 7667 CG1 ILE D 139 15.797 22.514 -3.611 1.00 24.47 C +ATOM 7668 CG2 ILE D 139 17.832 22.872 -5.047 1.00 21.06 C +ATOM 7669 CD1 ILE D 139 15.109 23.788 -4.061 0.00 23.99 C +ATOM 7670 N ALA D 140 20.176 21.953 -2.407 1.00 19.89 N +ATOM 7671 CA ALA D 140 21.633 22.021 -2.479 1.00 22.83 C +ATOM 7672 C ALA D 140 22.226 20.613 -2.416 1.00 22.85 C +ATOM 7673 O ALA D 140 23.212 20.325 -3.081 1.00 24.95 O +ATOM 7674 CB ALA D 140 22.188 22.876 -1.335 1.00 22.27 C +ATOM 7675 N ARG D 141 21.623 19.744 -1.612 1.00 22.52 N +ATOM 7676 CA ARG D 141 22.088 18.367 -1.498 1.00 23.36 C +ATOM 7677 C ARG D 141 21.980 17.677 -2.866 1.00 24.28 C +ATOM 7678 O ARG D 141 22.882 16.944 -3.258 1.00 23.05 O +ATOM 7679 CB ARG D 141 21.256 17.598 -0.460 1.00 22.22 C +ATOM 7680 CG ARG D 141 21.714 16.163 -0.263 1.00 25.24 C +ATOM 7681 CD ARG D 141 20.908 15.438 0.809 1.00 22.61 C +ATOM 7682 NE ARG D 141 19.520 15.243 0.409 1.00 24.41 N +ATOM 7683 CZ ARG D 141 18.592 14.676 1.172 1.00 24.18 C +ATOM 7684 NH1 ARG D 141 17.355 14.540 0.719 1.00 24.39 N +ATOM 7685 NH2 ARG D 141 18.898 14.253 2.389 1.00 25.97 N +ATOM 7686 N ALA D 142 20.871 17.894 -3.577 1.00 21.69 N +ATOM 7687 CA ALA D 142 20.705 17.305 -4.916 1.00 24.08 C +ATOM 7688 C ALA D 142 21.732 17.908 -5.870 1.00 23.45 C +ATOM 7689 O ALA D 142 22.297 17.211 -6.706 1.00 26.45 O +ATOM 7690 CB ALA D 142 19.289 17.563 -5.466 1.00 16.24 C +ATOM 7691 N ILE D 143 21.959 19.211 -5.749 1.00 25.14 N +ATOM 7692 CA ILE D 143 22.925 19.893 -6.601 1.00 26.20 C +ATOM 7693 C ILE D 143 24.342 19.348 -6.360 1.00 26.74 C +ATOM 7694 O ILE D 143 25.105 19.132 -7.302 1.00 25.69 O +ATOM 7695 CB ILE D 143 22.914 21.417 -6.347 1.00 26.64 C +ATOM 7696 CG1 ILE D 143 21.616 22.033 -6.890 1.00 28.44 C +ATOM 7697 CG2 ILE D 143 24.130 22.062 -6.993 1.00 28.48 C +ATOM 7698 CD1 ILE D 143 21.490 23.523 -6.642 0.00 27.81 C +ATOM 7699 N ALA D 144 24.690 19.121 -5.098 1.00 25.96 N +ATOM 7700 CA ALA D 144 26.014 18.605 -4.776 1.00 26.35 C +ATOM 7701 C ALA D 144 26.242 17.226 -5.396 1.00 27.41 C +ATOM 7702 O ALA D 144 27.388 16.820 -5.597 1.00 28.84 O +ATOM 7703 CB ALA D 144 26.205 18.548 -3.253 1.00 24.81 C +ATOM 7704 N SER D 145 25.164 16.504 -5.706 1.00 27.41 N +ATOM 7705 CA SER D 145 25.306 15.182 -6.315 1.00 30.49 C +ATOM 7706 C SER D 145 25.644 15.291 -7.806 1.00 31.59 C +ATOM 7707 O SER D 145 26.001 14.300 -8.442 1.00 32.83 O +ATOM 7708 CB SER D 145 24.028 14.364 -6.155 1.00 29.79 C +ATOM 7709 OG SER D 145 23.052 14.772 -7.095 1.00 32.38 O +ATOM 7710 N GLU D 146 25.510 16.495 -8.352 1.00 31.57 N +ATOM 7711 CA GLU D 146 25.815 16.771 -9.749 1.00 35.29 C +ATOM 7712 C GLU D 146 24.807 16.233 -10.759 1.00 36.40 C +ATOM 7713 O GLU D 146 25.154 15.992 -11.912 1.00 38.07 O +ATOM 7714 CB GLU D 146 27.220 16.256 -10.103 1.00 38.22 C +ATOM 7715 CG GLU D 146 28.359 17.004 -9.406 1.00 42.68 C +ATOM 7716 CD GLU D 146 29.728 16.369 -9.646 1.00 46.72 C +ATOM 7717 OE1 GLU D 146 30.730 16.875 -9.100 1.00 50.14 O +ATOM 7718 OE2 GLU D 146 29.812 15.361 -10.379 1.00 52.61 O +ATOM 7719 N CYS D 147 23.559 16.065 -10.340 1.00 36.36 N +ATOM 7720 CA CYS D 147 22.516 15.578 -11.239 1.00 36.72 C +ATOM 7721 C CYS D 147 22.167 16.664 -12.269 1.00 35.82 C +ATOM 7722 O CYS D 147 22.411 17.849 -12.038 1.00 35.31 O +ATOM 7723 CB CYS D 147 21.263 15.230 -10.440 1.00 37.89 C +ATOM 7724 SG CYS D 147 20.467 16.690 -9.707 1.00 42.60 S +ATOM 7725 N LYS D 148 21.595 16.257 -13.400 1.00 35.65 N +ATOM 7726 CA LYS D 148 21.204 17.201 -14.448 1.00 36.67 C +ATOM 7727 C LYS D 148 19.680 17.259 -14.540 1.00 35.12 C +ATOM 7728 O LYS D 148 19.109 18.199 -15.079 1.00 35.02 O +ATOM 7729 CB LYS D 148 21.790 16.774 -15.793 1.00 42.32 C +ATOM 7730 CG LYS D 148 23.274 17.049 -15.961 1.00 45.36 C +ATOM 7731 CD LYS D 148 23.530 18.502 -16.323 1.00 51.93 C +ATOM 7732 CE LYS D 148 24.948 18.689 -16.860 1.00 57.90 C +ATOM 7733 NZ LYS D 148 25.165 20.052 -17.442 1.00 60.75 N +ATOM 7734 N LEU D 149 19.035 16.225 -14.017 1.00 35.27 N +ATOM 7735 CA LEU D 149 17.580 16.138 -13.988 1.00 34.26 C +ATOM 7736 C LEU D 149 17.215 16.101 -12.509 1.00 33.55 C +ATOM 7737 O LEU D 149 17.554 15.142 -11.798 1.00 33.50 O +ATOM 7738 CB LEU D 149 17.099 14.861 -14.674 1.00 32.11 C +ATOM 7739 CG LEU D 149 15.652 14.438 -14.405 1.00 35.23 C +ATOM 7740 CD1 LEU D 149 14.687 15.453 -14.993 1.00 36.65 C +ATOM 7741 CD2 LEU D 149 15.403 13.066 -15.012 1.00 32.09 C +ATOM 7742 N ILE D 150 16.538 17.147 -12.043 1.00 30.37 N +ATOM 7743 CA ILE D 150 16.159 17.224 -10.638 1.00 28.52 C +ATOM 7744 C ILE D 150 14.646 17.053 -10.443 1.00 27.61 C +ATOM 7745 O ILE D 150 13.840 17.720 -11.094 1.00 28.97 O +ATOM 7746 CB ILE D 150 16.679 18.574 -10.014 1.00 26.88 C +ATOM 7747 CG1 ILE D 150 16.379 18.627 -8.507 1.00 28.24 C +ATOM 7748 CG2 ILE D 150 16.090 19.756 -10.751 1.00 23.32 C +ATOM 7749 CD1 ILE D 150 16.892 19.877 -7.820 0.00 27.69 C +ATOM 7750 N LEU D 151 14.276 16.118 -9.569 1.00 27.49 N +ATOM 7751 CA LEU D 151 12.876 15.831 -9.256 1.00 28.31 C +ATOM 7752 C LEU D 151 12.575 16.351 -7.855 1.00 27.70 C +ATOM 7753 O LEU D 151 13.264 16.000 -6.895 1.00 26.10 O +ATOM 7754 CB LEU D 151 12.608 14.322 -9.300 1.00 31.91 C +ATOM 7755 CG LEU D 151 12.371 13.635 -10.651 1.00 35.68 C +ATOM 7756 CD1 LEU D 151 13.326 14.165 -11.693 1.00 34.69 C +ATOM 7757 CD2 LEU D 151 12.532 12.124 -10.485 1.00 31.73 C +ATOM 7758 N LEU D 152 11.544 17.186 -7.748 1.00 27.35 N +ATOM 7759 CA LEU D 152 11.170 17.772 -6.469 1.00 26.38 C +ATOM 7760 C LEU D 152 9.727 17.473 -6.082 1.00 26.43 C +ATOM 7761 O LEU D 152 8.795 17.738 -6.847 1.00 28.92 O +ATOM 7762 CB LEU D 152 11.380 19.287 -6.498 1.00 22.48 C +ATOM 7763 CG LEU D 152 12.780 19.800 -6.852 1.00 23.37 C +ATOM 7764 CD1 LEU D 152 12.845 20.099 -8.347 1.00 19.30 C +ATOM 7765 CD2 LEU D 152 13.090 21.073 -6.039 1.00 19.16 C +ATOM 7766 N ASP D 153 9.563 16.925 -4.885 1.00 25.79 N +ATOM 7767 CA ASP D 153 8.254 16.579 -4.345 1.00 28.07 C +ATOM 7768 C ASP D 153 7.671 17.741 -3.527 1.00 28.72 C +ATOM 7769 O ASP D 153 8.172 18.041 -2.442 1.00 24.98 O +ATOM 7770 CB ASP D 153 8.394 15.360 -3.441 1.00 30.27 C +ATOM 7771 CG ASP D 153 7.085 14.963 -2.790 1.00 37.97 C +ATOM 7772 OD1 ASP D 153 7.133 14.466 -1.646 1.00 42.61 O +ATOM 7773 OD2 ASP D 153 6.013 15.132 -3.418 1.00 42.59 O +ATOM 7774 N GLU D 154 6.628 18.386 -4.053 1.00 27.89 N +ATOM 7775 CA GLU D 154 5.956 19.510 -3.377 1.00 29.17 C +ATOM 7776 C GLU D 154 6.939 20.486 -2.726 1.00 29.79 C +ATOM 7777 O GLU D 154 6.855 20.745 -1.526 1.00 30.85 O +ATOM 7778 CB GLU D 154 5.009 18.983 -2.300 1.00 27.91 C +ATOM 7779 CG GLU D 154 3.970 18.006 -2.807 1.00 34.07 C +ATOM 7780 CD GLU D 154 2.918 18.668 -3.683 1.00 40.96 C +ATOM 7781 OE1 GLU D 154 2.608 18.104 -4.754 1.00 45.95 O +ATOM 7782 OE2 GLU D 154 2.393 19.743 -3.303 1.00 40.78 O +ATOM 7783 N PRO D 155 7.865 21.058 -3.515 1.00 28.45 N +ATOM 7784 CA PRO D 155 8.858 21.998 -2.985 1.00 27.31 C +ATOM 7785 C PRO D 155 8.364 23.308 -2.370 1.00 28.77 C +ATOM 7786 O PRO D 155 9.081 23.929 -1.585 1.00 31.33 O +ATOM 7787 CB PRO D 155 9.784 22.231 -4.181 1.00 27.58 C +ATOM 7788 CG PRO D 155 8.855 22.055 -5.375 1.00 26.60 C +ATOM 7789 CD PRO D 155 8.054 20.841 -4.964 1.00 25.58 C +ATOM 7790 N THR D 156 7.152 23.731 -2.703 1.00 29.40 N +ATOM 7791 CA THR D 156 6.635 24.993 -2.172 1.00 27.72 C +ATOM 7792 C THR D 156 5.443 24.877 -1.221 1.00 28.01 C +ATOM 7793 O THR D 156 5.109 25.836 -0.527 1.00 29.50 O +ATOM 7794 CB THR D 156 6.181 25.922 -3.316 1.00 28.64 C +ATOM 7795 OG1 THR D 156 5.066 25.321 -3.988 1.00 23.75 O +ATOM 7796 CG2 THR D 156 7.312 26.154 -4.318 1.00 26.81 C +ATOM 7797 N SER D 157 4.814 23.712 -1.186 1.00 28.52 N +ATOM 7798 CA SER D 157 3.607 23.496 -0.383 1.00 33.34 C +ATOM 7799 C SER D 157 3.585 23.943 1.070 1.00 33.32 C +ATOM 7800 O SER D 157 2.618 24.571 1.504 1.00 35.24 O +ATOM 7801 CB SER D 157 3.188 22.023 -0.447 1.00 34.20 C +ATOM 7802 OG SER D 157 3.024 21.616 -1.795 1.00 41.06 O +ATOM 7803 N ALA D 158 4.636 23.637 1.819 1.00 30.13 N +ATOM 7804 CA ALA D 158 4.670 23.992 3.229 1.00 29.90 C +ATOM 7805 C ALA D 158 5.432 25.281 3.566 1.00 30.29 C +ATOM 7806 O ALA D 158 5.576 25.628 4.737 1.00 33.12 O +ATOM 7807 CB ALA D 158 5.251 22.821 4.019 1.00 26.28 C +ATOM 7808 N LEU D 159 5.905 25.997 2.554 1.00 29.01 N +ATOM 7809 CA LEU D 159 6.679 27.216 2.793 1.00 27.97 C +ATOM 7810 C LEU D 159 5.810 28.463 2.824 1.00 26.31 C +ATOM 7811 O LEU D 159 4.711 28.462 2.292 1.00 26.13 O +ATOM 7812 CB LEU D 159 7.743 27.393 1.695 1.00 25.03 C +ATOM 7813 CG LEU D 159 8.574 26.187 1.224 1.00 27.71 C +ATOM 7814 CD1 LEU D 159 9.692 26.682 0.289 1.00 24.18 C +ATOM 7815 CD2 LEU D 159 9.166 25.452 2.410 1.00 22.35 C +ATOM 7816 N ASP D 160 6.276 29.527 3.466 1.00 27.27 N +ATOM 7817 CA ASP D 160 5.482 30.740 3.411 1.00 30.88 C +ATOM 7818 C ASP D 160 5.744 31.319 2.020 1.00 29.62 C +ATOM 7819 O ASP D 160 6.714 30.940 1.355 1.00 28.24 O +ATOM 7820 CB ASP D 160 5.852 31.738 4.508 1.00 37.88 C +ATOM 7821 CG ASP D 160 7.305 32.050 4.547 1.00 43.78 C +ATOM 7822 OD1 ASP D 160 7.929 32.164 3.471 1.00 49.93 O +ATOM 7823 OD2 ASP D 160 7.821 32.195 5.673 1.00 50.36 O +ATOM 7824 N LEU D 161 4.864 32.209 1.576 1.00 29.21 N +ATOM 7825 CA LEU D 161 4.948 32.801 0.250 1.00 26.31 C +ATOM 7826 C LEU D 161 6.297 33.352 -0.189 1.00 26.69 C +ATOM 7827 O LEU D 161 6.738 33.084 -1.309 1.00 25.76 O +ATOM 7828 CB LEU D 161 3.875 33.879 0.098 1.00 28.96 C +ATOM 7829 CG LEU D 161 2.452 33.373 -0.150 1.00 31.93 C +ATOM 7830 CD1 LEU D 161 1.501 34.559 -0.268 1.00 34.38 C +ATOM 7831 CD2 LEU D 161 2.418 32.559 -1.437 1.00 35.91 C +ATOM 7832 N ALA D 162 6.956 34.116 0.672 1.00 24.22 N +ATOM 7833 CA ALA D 162 8.247 34.686 0.308 1.00 26.79 C +ATOM 7834 C ALA D 162 9.276 33.601 0.006 1.00 26.53 C +ATOM 7835 O ALA D 162 10.140 33.777 -0.855 1.00 25.16 O +ATOM 7836 CB ALA D 162 8.760 35.607 1.424 1.00 26.87 C +ATOM 7837 N ASN D 163 9.197 32.483 0.719 1.00 26.71 N +ATOM 7838 CA ASN D 163 10.145 31.401 0.480 1.00 27.18 C +ATOM 7839 C ASN D 163 9.737 30.612 -0.753 1.00 25.68 C +ATOM 7840 O ASN D 163 10.595 30.104 -1.475 1.00 23.95 O +ATOM 7841 CB ASN D 163 10.260 30.506 1.717 1.00 28.22 C +ATOM 7842 CG ASN D 163 11.137 31.135 2.793 1.00 31.49 C +ATOM 7843 OD1 ASN D 163 10.977 30.875 3.985 1.00 36.55 O +ATOM 7844 ND2 ASN D 163 12.076 31.963 2.367 1.00 27.55 N +ATOM 7845 N GLN D 164 8.431 30.524 -0.998 1.00 23.61 N +ATOM 7846 CA GLN D 164 7.932 29.839 -2.186 1.00 26.04 C +ATOM 7847 C GLN D 164 8.494 30.613 -3.387 1.00 25.24 C +ATOM 7848 O GLN D 164 8.975 30.031 -4.359 1.00 25.43 O +ATOM 7849 CB GLN D 164 6.398 29.856 -2.218 1.00 26.04 C +ATOM 7850 CG GLN D 164 5.723 28.874 -1.256 1.00 29.47 C +ATOM 7851 CD GLN D 164 4.203 29.002 -1.231 1.00 29.83 C +ATOM 7852 OE1 GLN D 164 3.564 29.077 -2.267 1.00 33.65 O +ATOM 7853 NE2 GLN D 164 3.626 29.021 -0.037 1.00 31.61 N +ATOM 7854 N ASP D 165 8.448 31.937 -3.292 1.00 26.01 N +ATOM 7855 CA ASP D 165 8.955 32.812 -4.341 1.00 25.64 C +ATOM 7856 C ASP D 165 10.437 32.504 -4.614 1.00 24.83 C +ATOM 7857 O ASP D 165 10.847 32.367 -5.766 1.00 23.57 O +ATOM 7858 CB ASP D 165 8.772 34.274 -3.912 1.00 24.38 C +ATOM 7859 CG ASP D 165 9.218 35.261 -4.972 1.00 28.47 C +ATOM 7860 OD1 ASP D 165 10.047 36.135 -4.634 1.00 28.85 O +ATOM 7861 OD2 ASP D 165 8.742 35.175 -6.130 1.00 24.51 O +ATOM 7862 N ILE D 166 11.232 32.375 -3.555 1.00 24.98 N +ATOM 7863 CA ILE D 166 12.660 32.080 -3.706 1.00 24.72 C +ATOM 7864 C ILE D 166 12.896 30.733 -4.400 1.00 23.14 C +ATOM 7865 O ILE D 166 13.792 30.603 -5.240 1.00 23.50 O +ATOM 7866 CB ILE D 166 13.383 32.104 -2.327 1.00 27.52 C +ATOM 7867 CG1 ILE D 166 13.450 33.554 -1.809 1.00 26.93 C +ATOM 7868 CG2 ILE D 166 14.808 31.506 -2.443 1.00 25.48 C +ATOM 7869 CD1 ILE D 166 14.097 33.693 -0.446 0.00 27.00 C +ATOM 7870 N VAL D 167 12.081 29.741 -4.063 1.00 23.41 N +ATOM 7871 CA VAL D 167 12.205 28.425 -4.664 1.00 23.77 C +ATOM 7872 C VAL D 167 11.852 28.466 -6.152 1.00 24.28 C +ATOM 7873 O VAL D 167 12.564 27.886 -6.977 1.00 23.80 O +ATOM 7874 CB VAL D 167 11.292 27.389 -3.937 1.00 25.72 C +ATOM 7875 CG1 VAL D 167 11.277 26.060 -4.708 1.00 22.62 C +ATOM 7876 CG2 VAL D 167 11.813 27.150 -2.524 1.00 24.70 C +ATOM 7877 N LEU D 168 10.762 29.156 -6.491 1.00 22.92 N +ATOM 7878 CA LEU D 168 10.331 29.267 -7.884 1.00 23.40 C +ATOM 7879 C LEU D 168 11.404 29.930 -8.746 1.00 23.99 C +ATOM 7880 O LEU D 168 11.721 29.446 -9.840 1.00 21.10 O +ATOM 7881 CB LEU D 168 9.006 30.048 -7.982 1.00 22.81 C +ATOM 7882 CG LEU D 168 7.761 29.385 -7.345 1.00 22.55 C +ATOM 7883 CD1 LEU D 168 6.566 30.326 -7.438 1.00 21.52 C +ATOM 7884 CD2 LEU D 168 7.443 28.064 -8.046 1.00 20.09 C +ATOM 7885 N SER D 169 11.973 31.025 -8.251 1.00 24.63 N +ATOM 7886 CA SER D 169 13.020 31.726 -8.991 1.00 28.78 C +ATOM 7887 C SER D 169 14.266 30.844 -9.142 1.00 30.28 C +ATOM 7888 O SER D 169 14.964 30.920 -10.150 1.00 31.40 O +ATOM 7889 CB SER D 169 13.393 33.038 -8.283 1.00 27.21 C +ATOM 7890 OG SER D 169 12.278 33.914 -8.226 1.00 28.27 O +ATOM 7891 N LEU D 170 14.534 30.004 -8.143 1.00 29.38 N +ATOM 7892 CA LEU D 170 15.697 29.124 -8.187 1.00 28.45 C +ATOM 7893 C LEU D 170 15.529 28.026 -9.234 1.00 27.83 C +ATOM 7894 O LEU D 170 16.453 27.736 -9.990 1.00 25.84 O +ATOM 7895 CB LEU D 170 15.943 28.491 -6.806 1.00 25.79 C +ATOM 7896 CG LEU D 170 16.984 27.365 -6.713 1.00 26.66 C +ATOM 7897 CD1 LEU D 170 18.361 27.869 -7.144 1.00 25.68 C +ATOM 7898 CD2 LEU D 170 17.042 26.841 -5.284 1.00 25.36 C +ATOM 7899 N LEU D 171 14.345 27.422 -9.278 1.00 27.86 N +ATOM 7900 CA LEU D 171 14.078 26.345 -10.225 1.00 29.19 C +ATOM 7901 C LEU D 171 14.217 26.813 -11.671 1.00 30.64 C +ATOM 7902 O LEU D 171 14.815 26.127 -12.503 1.00 29.39 O +ATOM 7903 CB LEU D 171 12.684 25.746 -9.979 1.00 25.27 C +ATOM 7904 CG LEU D 171 12.532 25.051 -8.620 1.00 25.13 C +ATOM 7905 CD1 LEU D 171 11.148 24.420 -8.488 1.00 20.85 C +ATOM 7906 CD2 LEU D 171 13.612 23.994 -8.477 1.00 20.85 C +ATOM 7907 N ILE D 172 13.678 27.989 -11.967 1.00 31.98 N +ATOM 7908 CA ILE D 172 13.769 28.516 -13.315 1.00 33.03 C +ATOM 7909 C ILE D 172 15.251 28.812 -13.616 1.00 34.19 C +ATOM 7910 O ILE D 172 15.729 28.582 -14.732 1.00 34.93 O +ATOM 7911 CB ILE D 172 12.862 29.778 -13.467 1.00 34.68 C +ATOM 7912 CG1 ILE D 172 12.201 29.781 -14.855 1.00 36.25 C +ATOM 7913 CG2 ILE D 172 13.665 31.037 -13.239 1.00 37.64 C +ATOM 7914 CD1 ILE D 172 11.248 30.938 -15.081 0.00 35.49 C +ATOM 7915 N ASP D 173 15.989 29.279 -12.613 1.00 33.08 N +ATOM 7916 CA ASP D 173 17.412 29.559 -12.799 1.00 34.39 C +ATOM 7917 C ASP D 173 18.214 28.277 -13.047 1.00 33.17 C +ATOM 7918 O ASP D 173 19.164 28.281 -13.820 1.00 31.59 O +ATOM 7919 CB ASP D 173 17.980 30.288 -11.582 1.00 37.67 C +ATOM 7920 CG ASP D 173 19.413 30.753 -11.793 1.00 47.01 C +ATOM 7921 OD1 ASP D 173 20.327 29.906 -11.789 1.00 49.70 O +ATOM 7922 OD2 ASP D 173 19.633 31.974 -11.971 1.00 53.37 O +ATOM 7923 N LEU D 174 17.837 27.183 -12.393 1.00 32.75 N +ATOM 7924 CA LEU D 174 18.545 25.916 -12.587 1.00 33.93 C +ATOM 7925 C LEU D 174 18.377 25.453 -14.035 1.00 33.47 C +ATOM 7926 O LEU D 174 19.329 24.985 -14.666 1.00 31.62 O +ATOM 7927 CB LEU D 174 18.007 24.831 -11.630 1.00 31.59 C +ATOM 7928 CG LEU D 174 18.300 24.995 -10.129 1.00 33.86 C +ATOM 7929 CD1 LEU D 174 17.670 23.858 -9.322 1.00 32.29 C +ATOM 7930 CD2 LEU D 174 19.813 25.017 -9.916 1.00 30.76 C +ATOM 7931 N ALA D 175 17.160 25.588 -14.552 1.00 33.15 N +ATOM 7932 CA ALA D 175 16.862 25.176 -15.917 1.00 36.84 C +ATOM 7933 C ALA D 175 17.441 26.130 -16.956 1.00 37.85 C +ATOM 7934 O ALA D 175 18.069 25.695 -17.911 1.00 39.68 O +ATOM 7935 CB ALA D 175 15.347 25.051 -16.114 1.00 33.02 C +ATOM 7936 N GLN D 176 17.247 27.427 -16.755 1.00 40.87 N +ATOM 7937 CA GLN D 176 17.721 28.426 -17.708 1.00 44.84 C +ATOM 7938 C GLN D 176 19.213 28.715 -17.766 1.00 45.79 C +ATOM 7939 O GLN D 176 19.707 29.123 -18.816 1.00 47.68 O +ATOM 7940 CB GLN D 176 16.953 29.745 -17.515 1.00 46.17 C +ATOM 7941 CG GLN D 176 15.482 29.627 -17.923 1.00 50.00 C +ATOM 7942 CD GLN D 176 14.717 30.946 -17.893 1.00 52.55 C +ATOM 7943 OE1 GLN D 176 13.558 31.008 -18.326 1.00 53.46 O +ATOM 7944 NE2 GLN D 176 15.350 32.003 -17.381 1.00 52.25 N +ATOM 7945 N SER D 177 19.946 28.510 -16.675 1.00 46.15 N +ATOM 7946 CA SER D 177 21.376 28.798 -16.720 1.00 46.20 C +ATOM 7947 C SER D 177 22.296 27.715 -16.181 1.00 46.40 C +ATOM 7948 O SER D 177 23.516 27.854 -16.246 1.00 47.02 O +ATOM 7949 CB SER D 177 21.678 30.117 -16.001 1.00 46.32 C +ATOM 7950 OG SER D 177 21.556 29.984 -14.600 1.00 49.06 O +ATOM 7951 N GLN D 178 21.733 26.634 -15.654 1.00 47.79 N +ATOM 7952 CA GLN D 178 22.573 25.564 -15.131 1.00 48.60 C +ATOM 7953 C GLN D 178 22.378 24.272 -15.914 1.00 48.87 C +ATOM 7954 O GLN D 178 22.827 23.204 -15.497 1.00 50.67 O +ATOM 7955 CB GLN D 178 22.290 25.347 -13.643 1.00 49.78 C +ATOM 7956 CG GLN D 178 22.476 26.609 -12.817 1.00 53.26 C +ATOM 7957 CD GLN D 178 23.901 27.150 -12.871 1.00 56.71 C +ATOM 7958 OE1 GLN D 178 24.119 28.362 -12.797 1.00 57.26 O +ATOM 7959 NE2 GLN D 178 24.877 26.251 -12.986 1.00 57.39 N +ATOM 7960 N ASN D 179 21.702 24.383 -17.052 1.00 49.48 N +ATOM 7961 CA ASN D 179 21.459 23.245 -17.932 1.00 50.80 C +ATOM 7962 C ASN D 179 20.770 22.059 -17.279 1.00 48.44 C +ATOM 7963 O ASN D 179 21.106 20.908 -17.560 1.00 49.92 O +ATOM 7964 CB ASN D 179 22.782 22.781 -18.549 1.00 55.61 C +ATOM 7965 CG ASN D 179 23.431 23.857 -19.393 1.00 60.39 C +ATOM 7966 OD1 ASN D 179 22.866 24.296 -20.400 1.00 63.58 O +ATOM 7967 ND2 ASN D 179 24.617 24.301 -18.981 1.00 61.03 N +ATOM 7968 N MET D 180 19.802 22.332 -16.415 1.00 44.55 N +ATOM 7969 CA MET D 180 19.091 21.254 -15.754 1.00 38.61 C +ATOM 7970 C MET D 180 17.670 21.113 -16.256 1.00 34.80 C +ATOM 7971 O MET D 180 17.105 22.036 -16.842 1.00 34.09 O +ATOM 7972 CB MET D 180 19.062 21.476 -14.242 1.00 40.42 C +ATOM 7973 CG MET D 180 20.352 21.120 -13.549 1.00 45.01 C +ATOM 7974 SD MET D 180 20.210 21.203 -11.766 1.00 46.90 S +ATOM 7975 CE MET D 180 21.254 22.537 -11.442 1.00 48.10 C +ATOM 7976 N THR D 181 17.109 19.934 -16.034 1.00 29.56 N +ATOM 7977 CA THR D 181 15.736 19.658 -16.402 1.00 29.56 C +ATOM 7978 C THR D 181 15.041 19.528 -15.051 1.00 28.62 C +ATOM 7979 O THR D 181 15.570 18.897 -14.131 1.00 29.82 O +ATOM 7980 CB THR D 181 15.635 18.363 -17.203 1.00 28.89 C +ATOM 7981 OG1 THR D 181 16.370 18.525 -18.423 1.00 31.26 O +ATOM 7982 CG2 THR D 181 14.175 18.030 -17.517 1.00 24.98 C +ATOM 7983 N VAL D 182 13.869 20.135 -14.928 1.00 28.18 N +ATOM 7984 CA VAL D 182 13.152 20.136 -13.662 1.00 27.98 C +ATOM 7985 C VAL D 182 11.775 19.518 -13.687 1.00 29.13 C +ATOM 7986 O VAL D 182 10.961 19.837 -14.551 1.00 32.05 O +ATOM 7987 CB VAL D 182 12.966 21.587 -13.136 1.00 27.41 C +ATOM 7988 CG1 VAL D 182 12.246 21.564 -11.792 1.00 25.17 C +ATOM 7989 CG2 VAL D 182 14.318 22.301 -13.027 1.00 25.52 C +ATOM 7990 N VAL D 183 11.520 18.629 -12.732 1.00 28.28 N +ATOM 7991 CA VAL D 183 10.199 18.040 -12.588 1.00 26.18 C +ATOM 7992 C VAL D 183 9.789 18.249 -11.133 1.00 26.09 C +ATOM 7993 O VAL D 183 10.519 17.860 -10.207 1.00 25.26 O +ATOM 7994 CB VAL D 183 10.162 16.537 -12.891 1.00 26.89 C +ATOM 7995 CG1 VAL D 183 8.712 16.055 -12.810 1.00 26.61 C +ATOM 7996 CG2 VAL D 183 10.740 16.250 -14.283 1.00 22.47 C +ATOM 7997 N PHE D 184 8.644 18.897 -10.926 1.00 25.33 N +ATOM 7998 CA PHE D 184 8.155 19.127 -9.569 1.00 25.81 C +ATOM 7999 C PHE D 184 6.642 18.950 -9.459 1.00 26.39 C +ATOM 8000 O PHE D 184 5.892 19.264 -10.393 1.00 24.51 O +ATOM 8001 CB PHE D 184 8.571 20.514 -9.061 1.00 24.87 C +ATOM 8002 CG PHE D 184 7.778 21.651 -9.637 1.00 28.23 C +ATOM 8003 CD1 PHE D 184 7.968 22.062 -10.954 1.00 26.88 C +ATOM 8004 CD2 PHE D 184 6.859 22.338 -8.845 1.00 29.77 C +ATOM 8005 CE1 PHE D 184 7.258 23.145 -11.477 1.00 33.99 C +ATOM 8006 CE2 PHE D 184 6.139 23.427 -9.356 1.00 33.84 C +ATOM 8007 CZ PHE D 184 6.337 23.834 -10.674 1.00 32.57 C +ATOM 8008 N THR D 185 6.201 18.407 -8.326 1.00 26.55 N +ATOM 8009 CA THR D 185 4.777 18.203 -8.096 1.00 25.30 C +ATOM 8010 C THR D 185 4.238 19.431 -7.364 1.00 27.97 C +ATOM 8011 O THR D 185 4.972 20.110 -6.631 1.00 26.57 O +ATOM 8012 CB THR D 185 4.502 16.920 -7.273 1.00 26.16 C +ATOM 8013 OG1 THR D 185 5.240 16.952 -6.047 1.00 26.79 O +ATOM 8014 CG2 THR D 185 4.904 15.688 -8.067 1.00 25.55 C +ATOM 8015 N THR D 186 2.959 19.723 -7.579 1.00 28.17 N +ATOM 8016 CA THR D 186 2.335 20.891 -6.980 1.00 27.82 C +ATOM 8017 C THR D 186 0.827 20.840 -7.130 1.00 28.89 C +ATOM 8018 O THR D 186 0.288 20.078 -7.940 1.00 28.95 O +ATOM 8019 CB THR D 186 2.830 22.175 -7.673 1.00 29.86 C +ATOM 8020 OG1 THR D 186 2.083 23.304 -7.206 1.00 33.43 O +ATOM 8021 CG2 THR D 186 2.664 22.061 -9.182 1.00 27.82 C +ATOM 8022 N HIS D 187 0.139 21.645 -6.337 1.00 27.18 N +ATOM 8023 CA HIS D 187 -1.306 21.711 -6.452 1.00 30.92 C +ATOM 8024 C HIS D 187 -1.674 23.167 -6.733 1.00 27.44 C +ATOM 8025 O HIS D 187 -2.838 23.534 -6.698 1.00 30.00 O +ATOM 8026 CB HIS D 187 -2.000 21.219 -5.165 1.00 31.87 C +ATOM 8027 CG HIS D 187 -1.646 22.004 -3.940 1.00 37.04 C +ATOM 8028 ND1 HIS D 187 -0.604 21.656 -3.106 1.00 39.27 N +ATOM 8029 CD2 HIS D 187 -2.176 23.140 -3.426 1.00 37.28 C +ATOM 8030 CE1 HIS D 187 -0.505 22.545 -2.134 1.00 39.10 C +ATOM 8031 NE2 HIS D 187 -1.448 23.455 -2.305 1.00 41.44 N +ATOM 8032 N GLN D 188 -0.675 23.989 -7.036 1.00 26.52 N +ATOM 8033 CA GLN D 188 -0.927 25.403 -7.274 1.00 27.26 C +ATOM 8034 C GLN D 188 -0.760 25.827 -8.734 1.00 27.66 C +ATOM 8035 O GLN D 188 0.350 26.084 -9.203 1.00 23.92 O +ATOM 8036 CB GLN D 188 -0.022 26.231 -6.356 1.00 30.10 C +ATOM 8037 CG GLN D 188 -0.073 25.755 -4.896 1.00 34.42 C +ATOM 8038 CD GLN D 188 0.845 26.539 -3.978 1.00 40.19 C +ATOM 8039 OE1 GLN D 188 1.756 25.976 -3.353 1.00 39.98 O +ATOM 8040 NE2 GLN D 188 0.614 27.850 -3.890 1.00 43.58 N +ATOM 8041 N PRO D 189 -1.884 25.920 -9.466 1.00 27.89 N +ATOM 8042 CA PRO D 189 -1.855 26.311 -10.879 1.00 27.89 C +ATOM 8043 C PRO D 189 -1.109 27.595 -11.198 1.00 28.01 C +ATOM 8044 O PRO D 189 -0.473 27.696 -12.248 1.00 28.48 O +ATOM 8045 CB PRO D 189 -3.341 26.375 -11.268 1.00 27.90 C +ATOM 8046 CG PRO D 189 -4.078 26.461 -9.947 1.00 30.97 C +ATOM 8047 CD PRO D 189 -3.257 25.602 -9.030 1.00 26.07 C +ATOM 8048 N ASN D 190 -1.170 28.574 -10.304 1.00 26.27 N +ATOM 8049 CA ASN D 190 -0.487 29.832 -10.568 1.00 26.83 C +ATOM 8050 C ASN D 190 1.039 29.690 -10.503 1.00 27.38 C +ATOM 8051 O ASN D 190 1.772 30.518 -11.048 1.00 25.03 O +ATOM 8052 CB ASN D 190 -0.986 30.919 -9.609 1.00 25.78 C +ATOM 8053 CG ASN D 190 -2.465 31.223 -9.806 1.00 29.29 C +ATOM 8054 OD1 ASN D 190 -2.950 31.297 -10.942 1.00 32.32 O +ATOM 8055 ND2 ASN D 190 -3.187 31.403 -8.709 1.00 27.61 N +ATOM 8056 N GLN D 191 1.512 28.642 -9.839 1.00 25.42 N +ATOM 8057 CA GLN D 191 2.946 28.407 -9.760 1.00 27.76 C +ATOM 8058 C GLN D 191 3.398 27.670 -11.014 1.00 28.16 C +ATOM 8059 O GLN D 191 4.569 27.721 -11.383 1.00 26.78 O +ATOM 8060 CB GLN D 191 3.300 27.614 -8.499 1.00 27.81 C +ATOM 8061 CG GLN D 191 3.317 28.497 -7.243 1.00 30.85 C +ATOM 8062 CD GLN D 191 3.589 27.720 -5.965 1.00 32.13 C +ATOM 8063 OE1 GLN D 191 4.241 26.679 -5.981 1.00 32.00 O +ATOM 8064 NE2 GLN D 191 3.107 28.243 -4.844 1.00 32.77 N +ATOM 8065 N VAL D 192 2.463 26.985 -11.670 1.00 28.44 N +ATOM 8066 CA VAL D 192 2.787 26.291 -12.904 1.00 29.80 C +ATOM 8067 C VAL D 192 2.905 27.383 -13.978 1.00 29.52 C +ATOM 8068 O VAL D 192 3.793 27.342 -14.824 1.00 29.86 O +ATOM 8069 CB VAL D 192 1.688 25.279 -13.292 1.00 31.56 C +ATOM 8070 CG1 VAL D 192 2.096 24.525 -14.558 1.00 31.01 C +ATOM 8071 CG2 VAL D 192 1.454 24.299 -12.142 1.00 27.75 C +ATOM 8072 N VAL D 193 2.014 28.368 -13.917 1.00 29.39 N +ATOM 8073 CA VAL D 193 2.033 29.492 -14.856 1.00 30.55 C +ATOM 8074 C VAL D 193 3.375 30.206 -14.748 1.00 30.27 C +ATOM 8075 O VAL D 193 4.005 30.546 -15.747 1.00 30.21 O +ATOM 8076 CB VAL D 193 0.939 30.556 -14.516 1.00 30.89 C +ATOM 8077 CG1 VAL D 193 1.183 31.840 -15.318 1.00 28.70 C +ATOM 8078 CG2 VAL D 193 -0.440 30.009 -14.810 1.00 31.37 C +ATOM 8079 N ALA D 194 3.799 30.426 -13.510 1.00 31.05 N +ATOM 8080 CA ALA D 194 5.037 31.137 -13.223 1.00 30.03 C +ATOM 8081 C ALA D 194 6.341 30.524 -13.748 1.00 30.23 C +ATOM 8082 O ALA D 194 7.205 31.253 -14.237 1.00 30.20 O +ATOM 8083 CB ALA D 194 5.146 31.363 -11.715 1.00 27.69 C +ATOM 8084 N ILE D 195 6.500 29.203 -13.669 1.00 29.34 N +ATOM 8085 CA ILE D 195 7.768 28.625 -14.104 1.00 29.32 C +ATOM 8086 C ILE D 195 7.788 27.398 -15.004 1.00 29.39 C +ATOM 8087 O ILE D 195 8.839 27.058 -15.528 1.00 28.96 O +ATOM 8088 CB ILE D 195 8.676 28.291 -12.878 1.00 28.53 C +ATOM 8089 CG1 ILE D 195 8.075 27.130 -12.076 1.00 29.67 C +ATOM 8090 CG2 ILE D 195 8.861 29.537 -11.993 1.00 24.65 C +ATOM 8091 CD1 ILE D 195 8.923 26.689 -10.903 0.00 29.20 C +ATOM 8092 N ALA D 196 6.658 26.730 -15.193 1.00 27.92 N +ATOM 8093 CA ALA D 196 6.660 25.521 -16.011 1.00 29.89 C +ATOM 8094 C ALA D 196 6.223 25.692 -17.474 1.00 31.02 C +ATOM 8095 O ALA D 196 5.120 26.171 -17.744 1.00 29.85 O +ATOM 8096 CB ALA D 196 5.796 24.448 -15.333 1.00 25.40 C +ATOM 8097 N ASN D 197 7.081 25.290 -18.413 1.00 29.98 N +ATOM 8098 CA ASN D 197 6.722 25.378 -19.830 1.00 31.00 C +ATOM 8099 C ASN D 197 5.907 24.144 -20.226 1.00 30.77 C +ATOM 8100 O ASN D 197 5.237 24.131 -21.256 1.00 32.00 O +ATOM 8101 CB ASN D 197 7.974 25.548 -20.724 1.00 32.07 C +ATOM 8102 CG ASN D 197 8.908 24.350 -20.690 1.00 34.12 C +ATOM 8103 OD1 ASN D 197 9.326 23.894 -19.626 1.00 34.36 O +ATOM 8104 ND2 ASN D 197 9.254 23.845 -21.867 1.00 36.60 N +ATOM 8105 N LYS D 198 5.941 23.111 -19.389 1.00 31.21 N +ATOM 8106 CA LYS D 198 5.156 21.903 -19.644 1.00 30.74 C +ATOM 8107 C LYS D 198 4.435 21.450 -18.380 1.00 31.57 C +ATOM 8108 O LYS D 198 4.950 21.594 -17.268 1.00 30.29 O +ATOM 8109 CB LYS D 198 6.047 20.781 -20.184 1.00 33.39 C +ATOM 8110 CG LYS D 198 6.434 21.008 -21.632 1.00 36.74 C +ATOM 8111 CD LYS D 198 7.359 19.953 -22.157 1.00 39.16 C +ATOM 8112 CE LYS D 198 7.730 20.249 -23.612 1.00 40.69 C +ATOM 8113 NZ LYS D 198 8.620 19.172 -24.148 1.00 45.71 N +ATOM 8114 N THR D 199 3.229 20.916 -18.539 1.00 32.19 N +ATOM 8115 CA THR D 199 2.484 20.473 -17.375 1.00 34.32 C +ATOM 8116 C THR D 199 1.736 19.178 -17.605 1.00 34.37 C +ATOM 8117 O THR D 199 1.289 18.880 -18.713 1.00 33.74 O +ATOM 8118 CB THR D 199 1.479 21.569 -16.864 1.00 35.19 C +ATOM 8119 OG1 THR D 199 0.141 21.214 -17.209 1.00 37.52 O +ATOM 8120 CG2 THR D 199 1.781 22.906 -17.474 1.00 33.58 C +ATOM 8121 N LEU D 200 1.620 18.408 -16.530 1.00 34.70 N +ATOM 8122 CA LEU D 200 0.930 17.134 -16.546 1.00 35.49 C +ATOM 8123 C LEU D 200 -0.146 17.230 -15.468 1.00 37.16 C +ATOM 8124 O LEU D 200 0.170 17.303 -14.284 1.00 37.40 O +ATOM 8125 CB LEU D 200 1.927 16.011 -16.233 1.00 35.96 C +ATOM 8126 CG LEU D 200 1.555 14.519 -16.216 1.00 39.37 C +ATOM 8127 CD1 LEU D 200 0.799 14.205 -14.963 1.00 42.11 C +ATOM 8128 CD2 LEU D 200 0.735 14.143 -17.449 1.00 40.75 C +ATOM 8129 N LEU D 201 -1.412 17.272 -15.887 1.00 37.92 N +ATOM 8130 CA LEU D 201 -2.536 17.345 -14.958 1.00 39.77 C +ATOM 8131 C LEU D 201 -2.901 15.925 -14.532 1.00 41.69 C +ATOM 8132 O LEU D 201 -3.301 15.105 -15.356 1.00 41.05 O +ATOM 8133 CB LEU D 201 -3.746 18.007 -15.625 1.00 37.18 C +ATOM 8134 CG LEU D 201 -3.613 19.441 -16.141 1.00 40.03 C +ATOM 8135 CD1 LEU D 201 -4.882 19.825 -16.900 1.00 37.27 C +ATOM 8136 CD2 LEU D 201 -3.369 20.396 -14.968 1.00 38.18 C +ATOM 8137 N LEU D 202 -2.757 15.634 -13.247 1.00 44.86 N +ATOM 8138 CA LEU D 202 -3.063 14.305 -12.740 1.00 50.63 C +ATOM 8139 C LEU D 202 -4.306 14.262 -11.877 1.00 54.29 C +ATOM 8140 O LEU D 202 -4.452 15.022 -10.920 1.00 55.36 O +ATOM 8141 CB LEU D 202 -1.890 13.742 -11.931 1.00 51.82 C +ATOM 8142 CG LEU D 202 -0.937 12.785 -12.638 1.00 54.13 C +ATOM 8143 CD1 LEU D 202 0.042 12.216 -11.627 1.00 54.97 C +ATOM 8144 CD2 LEU D 202 -1.731 11.656 -13.288 1.00 57.25 C +ATOM 8145 N ASN D 203 -5.195 13.349 -12.228 1.00 58.86 N +ATOM 8146 CA ASN D 203 -6.436 13.142 -11.507 1.00 63.77 C +ATOM 8147 C ASN D 203 -6.407 11.646 -11.237 1.00 65.60 C +ATOM 8148 O ASN D 203 -5.656 10.920 -11.885 1.00 65.53 O +ATOM 8149 CB ASN D 203 -7.622 13.480 -12.411 1.00 66.98 C +ATOM 8150 CG ASN D 203 -8.872 13.791 -11.634 1.00 68.76 C +ATOM 8151 OD1 ASN D 203 -9.142 13.175 -10.602 1.00 74.05 O +ATOM 8152 ND2 ASN D 203 -9.653 14.746 -12.128 1.00 68.19 N +ATOM 8153 N LYS D 204 -7.196 11.168 -10.286 1.00 68.90 N +ATOM 8154 CA LYS D 204 -7.198 9.734 -10.036 1.00 71.65 C +ATOM 8155 C LYS D 204 -8.025 9.088 -11.143 1.00 72.56 C +ATOM 8156 O LYS D 204 -8.123 7.867 -11.235 1.00 73.49 O +ATOM 8157 CB LYS D 204 -7.776 9.424 -8.651 1.00 72.10 C +ATOM 8158 CG LYS D 204 -9.119 10.068 -8.359 1.00 74.74 C +ATOM 8159 CD LYS D 204 -9.461 9.960 -6.877 1.00 76.20 C +ATOM 8160 CE LYS D 204 -8.423 10.685 -6.026 1.00 77.81 C +ATOM 8161 NZ LYS D 204 -8.732 10.647 -4.572 1.00 79.41 N +ATOM 8162 N GLN D 205 -8.595 9.933 -11.998 1.00 73.82 N +ATOM 8163 CA GLN D 205 -9.415 9.485 -13.118 1.00 75.24 C +ATOM 8164 C GLN D 205 -8.635 9.591 -14.429 1.00 74.49 C +ATOM 8165 O GLN D 205 -8.244 8.581 -15.023 1.00 75.43 O +ATOM 8166 CB GLN D 205 -10.680 10.343 -13.219 1.00 77.90 C +ATOM 8167 CG GLN D 205 -11.523 10.389 -11.952 1.00 81.56 C +ATOM 8168 CD GLN D 205 -12.498 11.559 -11.939 1.00 82.97 C +ATOM 8169 OE1 GLN D 205 -13.339 11.696 -12.830 1.00 84.20 O +ATOM 8170 NE2 GLN D 205 -12.383 12.411 -10.925 1.00 83.38 N +ATOM 8171 N ASN D 206 -8.409 10.825 -14.873 1.00 72.16 N +ATOM 8172 CA ASN D 206 -7.692 11.072 -16.118 1.00 69.23 C +ATOM 8173 C ASN D 206 -6.457 11.962 -15.961 1.00 65.88 C +ATOM 8174 O ASN D 206 -6.019 12.261 -14.849 1.00 64.63 O +ATOM 8175 CB ASN D 206 -8.644 11.687 -17.153 1.00 71.24 C +ATOM 8176 CG ASN D 206 -9.973 12.116 -16.546 1.00 73.67 C +ATOM 8177 OD1 ASN D 206 -10.014 12.906 -15.599 1.00 74.90 O +ATOM 8178 ND2 ASN D 206 -11.068 11.599 -17.095 1.00 73.68 N +ATOM 8179 N PHE D 207 -5.900 12.375 -17.093 1.00 61.99 N +ATOM 8180 CA PHE D 207 -4.722 13.224 -17.107 1.00 58.90 C +ATOM 8181 C PHE D 207 -4.570 13.886 -18.474 1.00 56.38 C +ATOM 8182 O PHE D 207 -5.254 13.527 -19.427 1.00 55.25 O +ATOM 8183 CB PHE D 207 -3.478 12.389 -16.795 1.00 59.01 C +ATOM 8184 CG PHE D 207 -3.178 11.350 -17.831 1.00 59.71 C +ATOM 8185 CD1 PHE D 207 -2.594 11.705 -19.043 1.00 59.76 C +ATOM 8186 CD2 PHE D 207 -3.514 10.018 -17.614 1.00 60.33 C +ATOM 8187 CE1 PHE D 207 -2.352 10.751 -20.026 1.00 59.53 C +ATOM 8188 CE2 PHE D 207 -3.275 9.054 -18.594 1.00 59.79 C +ATOM 8189 CZ PHE D 207 -2.694 9.424 -19.800 1.00 58.90 C +ATOM 8190 N LYS D 208 -3.673 14.861 -18.554 1.00 54.31 N +ATOM 8191 CA LYS D 208 -3.401 15.575 -19.795 1.00 53.01 C +ATOM 8192 C LYS D 208 -1.984 16.114 -19.726 1.00 49.59 C +ATOM 8193 O LYS D 208 -1.589 16.692 -18.716 1.00 46.46 O +ATOM 8194 CB LYS D 208 -4.360 16.757 -19.992 1.00 55.77 C +ATOM 8195 CG LYS D 208 -5.792 16.389 -20.295 1.00 60.72 C +ATOM 8196 CD LYS D 208 -6.612 17.638 -20.602 1.00 65.33 C +ATOM 8197 CE LYS D 208 -8.078 17.296 -20.850 1.00 68.00 C +ATOM 8198 NZ LYS D 208 -8.244 16.325 -21.972 1.00 69.65 N +ATOM 8199 N PHE D 209 -1.226 15.918 -20.801 1.00 46.79 N +ATOM 8200 CA PHE D 209 0.145 16.404 -20.872 1.00 44.86 C +ATOM 8201 C PHE D 209 0.266 17.380 -22.029 1.00 43.83 C +ATOM 8202 O PHE D 209 -0.465 17.279 -23.010 1.00 44.11 O +ATOM 8203 CB PHE D 209 1.127 15.253 -21.095 1.00 44.02 C +ATOM 8204 CG PHE D 209 2.536 15.711 -21.329 1.00 44.36 C +ATOM 8205 CD1 PHE D 209 3.301 16.218 -20.280 1.00 44.38 C +ATOM 8206 CD2 PHE D 209 3.082 15.692 -22.607 1.00 43.78 C +ATOM 8207 CE1 PHE D 209 4.585 16.703 -20.501 1.00 44.74 C +ATOM 8208 CE2 PHE D 209 4.365 16.174 -22.842 1.00 45.02 C +ATOM 8209 CZ PHE D 209 5.121 16.683 -21.786 1.00 44.98 C +ATOM 8210 N GLY D 210 1.177 18.336 -21.907 1.00 42.11 N +ATOM 8211 CA GLY D 210 1.365 19.287 -22.983 1.00 40.82 C +ATOM 8212 C GLY D 210 1.993 20.577 -22.522 1.00 40.43 C +ATOM 8213 O GLY D 210 2.373 20.709 -21.360 1.00 39.97 O +ATOM 8214 N GLU D 211 2.109 21.535 -23.433 1.00 39.14 N +ATOM 8215 CA GLU D 211 2.680 22.813 -23.073 1.00 42.31 C +ATOM 8216 C GLU D 211 1.684 23.540 -22.180 1.00 42.48 C +ATOM 8217 O GLU D 211 0.465 23.440 -22.366 1.00 40.98 O +ATOM 8218 CB GLU D 211 3.005 23.629 -24.324 1.00 45.41 C +ATOM 8219 CG GLU D 211 4.081 22.978 -25.188 1.00 53.26 C +ATOM 8220 CD GLU D 211 4.651 23.922 -26.227 1.00 58.74 C +ATOM 8221 OE1 GLU D 211 3.865 24.456 -27.040 1.00 60.66 O +ATOM 8222 OE2 GLU D 211 5.887 24.130 -26.230 1.00 60.82 O +ATOM 8223 N THR D 212 2.218 24.256 -21.198 1.00 42.22 N +ATOM 8224 CA THR D 212 1.407 24.989 -20.237 1.00 41.18 C +ATOM 8225 C THR D 212 0.420 25.956 -20.888 1.00 41.47 C +ATOM 8226 O THR D 212 -0.724 26.073 -20.445 1.00 42.00 O +ATOM 8227 CB THR D 212 2.319 25.739 -19.239 1.00 38.54 C +ATOM 8228 OG1 THR D 212 3.208 24.795 -18.629 1.00 35.98 O +ATOM 8229 CG2 THR D 212 1.501 26.419 -18.157 1.00 33.26 C +ATOM 8230 N ARG D 213 0.851 26.639 -21.940 1.00 43.19 N +ATOM 8231 CA ARG D 213 -0.027 27.575 -22.640 1.00 46.61 C +ATOM 8232 C ARG D 213 -1.283 26.892 -23.184 1.00 44.92 C +ATOM 8233 O ARG D 213 -2.326 27.521 -23.292 1.00 46.79 O +ATOM 8234 CB ARG D 213 0.719 28.244 -23.801 1.00 52.41 C +ATOM 8235 CG ARG D 213 1.743 29.286 -23.383 1.00 61.81 C +ATOM 8236 CD ARG D 213 1.070 30.554 -22.840 1.00 69.55 C +ATOM 8237 NE ARG D 213 0.296 31.264 -23.863 1.00 74.31 N +ATOM 8238 CZ ARG D 213 -0.387 32.387 -23.645 1.00 75.91 C +ATOM 8239 NH1 ARG D 213 -1.061 32.962 -24.638 1.00 75.59 N +ATOM 8240 NH2 ARG D 213 -0.399 32.937 -22.436 1.00 76.20 N +ATOM 8241 N ASN D 214 -1.186 25.609 -23.518 1.00 43.51 N +ATOM 8242 CA ASN D 214 -2.330 24.876 -24.068 1.00 44.77 C +ATOM 8243 C ASN D 214 -3.170 24.124 -23.040 1.00 45.67 C +ATOM 8244 O ASN D 214 -4.388 24.056 -23.165 1.00 48.48 O +ATOM 8245 CB ASN D 214 -1.858 23.857 -25.114 1.00 42.43 C +ATOM 8246 CG ASN D 214 -1.082 24.492 -26.248 1.00 45.80 C +ATOM 8247 OD1 ASN D 214 -0.196 23.860 -26.830 1.00 46.83 O +ATOM 8248 ND2 ASN D 214 -1.414 25.739 -26.581 1.00 42.60 N +ATOM 8249 N ILE D 215 -2.516 23.543 -22.040 1.00 44.76 N +ATOM 8250 CA ILE D 215 -3.203 22.762 -21.023 1.00 43.82 C +ATOM 8251 C ILE D 215 -3.849 23.523 -19.859 1.00 42.21 C +ATOM 8252 O ILE D 215 -4.906 23.117 -19.379 1.00 41.46 O +ATOM 8253 CB ILE D 215 -2.246 21.691 -20.443 1.00 46.33 C +ATOM 8254 CG1 ILE D 215 -1.951 20.642 -21.508 1.00 47.60 C +ATOM 8255 CG2 ILE D 215 -2.867 21.021 -19.221 1.00 50.26 C +ATOM 8256 CD1 ILE D 215 -1.342 19.406 -20.940 0.00 47.18 C +ATOM 8257 N LEU D 216 -3.224 24.606 -19.402 1.00 40.51 N +ATOM 8258 CA LEU D 216 -3.761 25.380 -18.280 1.00 39.11 C +ATOM 8259 C LEU D 216 -4.908 26.299 -18.657 1.00 39.34 C +ATOM 8260 O LEU D 216 -4.695 27.475 -18.956 1.00 40.27 O +ATOM 8261 CB LEU D 216 -2.674 26.230 -17.621 1.00 38.13 C +ATOM 8262 CG LEU D 216 -1.793 25.642 -16.523 1.00 38.07 C +ATOM 8263 CD1 LEU D 216 -1.155 26.796 -15.756 1.00 38.79 C +ATOM 8264 CD2 LEU D 216 -2.615 24.805 -15.574 1.00 36.15 C +ATOM 8265 N THR D 217 -6.125 25.766 -18.610 1.00 38.93 N +ATOM 8266 CA THR D 217 -7.317 26.527 -18.941 1.00 38.09 C +ATOM 8267 C THR D 217 -8.368 26.308 -17.862 1.00 39.70 C +ATOM 8268 O THR D 217 -8.315 25.317 -17.122 1.00 38.18 O +ATOM 8269 CB THR D 217 -7.918 26.064 -20.281 1.00 38.06 C +ATOM 8270 OG1 THR D 217 -8.398 24.718 -20.143 1.00 38.12 O +ATOM 8271 CG2 THR D 217 -6.867 26.119 -21.387 1.00 36.91 C +ATOM 8272 N SER D 218 -9.322 27.232 -17.787 1.00 40.21 N +ATOM 8273 CA SER D 218 -10.412 27.150 -16.821 1.00 42.36 C +ATOM 8274 C SER D 218 -11.140 25.830 -16.967 1.00 41.67 C +ATOM 8275 O SER D 218 -11.504 25.191 -15.975 1.00 42.12 O +ATOM 8276 CB SER D 218 -11.417 28.283 -17.045 1.00 43.99 C +ATOM 8277 OG SER D 218 -10.832 29.537 -16.776 1.00 49.44 O +ATOM 8278 N GLU D 219 -11.362 25.433 -18.214 1.00 41.37 N +ATOM 8279 CA GLU D 219 -12.062 24.191 -18.498 1.00 41.83 C +ATOM 8280 C GLU D 219 -11.323 22.994 -17.895 1.00 38.85 C +ATOM 8281 O GLU D 219 -11.901 22.229 -17.132 1.00 39.04 O +ATOM 8282 CB GLU D 219 -12.236 24.024 -20.020 1.00 45.59 C +ATOM 8283 CG GLU D 219 -12.968 22.746 -20.435 1.00 53.16 C +ATOM 8284 CD GLU D 219 -13.351 22.711 -21.921 1.00 60.33 C +ATOM 8285 OE1 GLU D 219 -13.817 21.644 -22.386 1.00 61.13 O +ATOM 8286 OE2 GLU D 219 -13.198 23.742 -22.622 1.00 62.33 O +ATOM 8287 N ASN D 220 -10.045 22.839 -18.227 1.00 37.55 N +ATOM 8288 CA ASN D 220 -9.257 21.723 -17.706 1.00 35.95 C +ATOM 8289 C ASN D 220 -9.109 21.743 -16.180 1.00 33.52 C +ATOM 8290 O ASN D 220 -9.211 20.705 -15.530 1.00 32.37 O +ATOM 8291 CB ASN D 220 -7.879 21.697 -18.378 1.00 37.37 C +ATOM 8292 CG ASN D 220 -7.934 21.173 -19.819 1.00 38.87 C +ATOM 8293 OD1 ASN D 220 -6.981 21.428 -20.592 1.00 36.59 O +ATOM 8294 ND2 ASN D 220 -8.924 20.498 -20.176 1.00 39.70 N +ATOM 8295 N LEU D 221 -8.898 22.920 -15.604 1.00 32.53 N +ATOM 8296 CA LEU D 221 -8.749 23.013 -14.153 1.00 31.33 C +ATOM 8297 C LEU D 221 -10.071 22.762 -13.442 1.00 30.86 C +ATOM 8298 O LEU D 221 -10.106 22.099 -12.403 1.00 29.54 O +ATOM 8299 CB LEU D 221 -8.173 24.373 -13.766 1.00 29.72 C +ATOM 8300 CG LEU D 221 -6.755 24.555 -14.321 1.00 30.94 C +ATOM 8301 CD1 LEU D 221 -6.153 25.870 -13.824 1.00 30.59 C +ATOM 8302 CD2 LEU D 221 -5.894 23.364 -13.888 1.00 29.79 C +ATOM 8303 N THR D 222 -11.159 23.284 -14.003 1.00 31.66 N +ATOM 8304 CA THR D 222 -12.483 23.070 -13.418 1.00 31.38 C +ATOM 8305 C THR D 222 -12.750 21.572 -13.394 1.00 32.95 C +ATOM 8306 O THR D 222 -13.241 21.035 -12.403 1.00 33.59 O +ATOM 8307 CB THR D 222 -13.601 23.736 -14.248 1.00 33.18 C +ATOM 8308 OG1 THR D 222 -13.480 25.159 -14.165 1.00 35.84 O +ATOM 8309 CG2 THR D 222 -14.979 23.312 -13.730 1.00 32.18 C +ATOM 8310 N ALA D 223 -12.419 20.904 -14.496 1.00 32.71 N +ATOM 8311 CA ALA D 223 -12.617 19.463 -14.603 1.00 35.07 C +ATOM 8312 C ALA D 223 -11.664 18.712 -13.672 1.00 35.09 C +ATOM 8313 O ALA D 223 -12.032 17.705 -13.077 1.00 38.44 O +ATOM 8314 CB ALA D 223 -12.398 19.010 -16.055 1.00 31.91 C +ATOM 8315 N LEU D 224 -10.436 19.204 -13.550 1.00 34.54 N +ATOM 8316 CA LEU D 224 -9.444 18.563 -12.692 1.00 35.50 C +ATOM 8317 C LEU D 224 -9.732 18.748 -11.199 1.00 35.72 C +ATOM 8318 O LEU D 224 -9.579 17.818 -10.416 1.00 34.56 O +ATOM 8319 CB LEU D 224 -8.040 19.106 -13.003 1.00 33.57 C +ATOM 8320 CG LEU D 224 -6.929 18.603 -12.065 1.00 36.78 C +ATOM 8321 CD1 LEU D 224 -6.713 17.104 -12.293 1.00 33.76 C +ATOM 8322 CD2 LEU D 224 -5.632 19.378 -12.305 1.00 29.62 C +ATOM 8323 N PHE D 225 -10.153 19.951 -10.814 1.00 36.70 N +ATOM 8324 CA PHE D 225 -10.428 20.261 -9.412 1.00 36.58 C +ATOM 8325 C PHE D 225 -11.861 20.006 -8.926 1.00 36.66 C +ATOM 8326 O PHE D 225 -12.116 20.003 -7.718 1.00 32.28 O +ATOM 8327 CB PHE D 225 -10.023 21.717 -9.126 1.00 36.96 C +ATOM 8328 CG PHE D 225 -8.529 21.949 -9.164 1.00 37.87 C +ATOM 8329 CD1 PHE D 225 -7.983 22.949 -9.955 1.00 38.13 C +ATOM 8330 CD2 PHE D 225 -7.671 21.157 -8.410 1.00 42.59 C +ATOM 8331 CE1 PHE D 225 -6.608 23.155 -9.999 1.00 40.54 C +ATOM 8332 CE2 PHE D 225 -6.284 21.356 -8.445 1.00 43.50 C +ATOM 8333 CZ PHE D 225 -5.754 22.354 -9.240 1.00 40.65 C +ATOM 8334 N HIS D 226 -12.788 19.783 -9.857 1.00 37.06 N +ATOM 8335 CA HIS D 226 -14.182 19.521 -9.500 1.00 40.13 C +ATOM 8336 C HIS D 226 -14.800 20.737 -8.823 1.00 39.78 C +ATOM 8337 O HIS D 226 -15.622 20.614 -7.923 1.00 41.88 O +ATOM 8338 CB HIS D 226 -14.269 18.320 -8.558 1.00 41.11 C +ATOM 8339 CG HIS D 226 -13.576 17.103 -9.076 1.00 45.61 C +ATOM 8340 ND1 HIS D 226 -13.887 16.531 -10.291 1.00 49.46 N +ATOM 8341 CD2 HIS D 226 -12.588 16.345 -8.544 1.00 47.34 C +ATOM 8342 CE1 HIS D 226 -13.122 15.471 -10.486 1.00 49.90 C +ATOM 8343 NE2 HIS D 226 -12.325 15.336 -9.440 1.00 50.65 N +ATOM 8344 N LEU D 227 -14.391 21.913 -9.268 1.00 39.21 N +ATOM 8345 CA LEU D 227 -14.878 23.162 -8.721 1.00 39.24 C +ATOM 8346 C LEU D 227 -14.593 24.178 -9.816 1.00 38.31 C +ATOM 8347 O LEU D 227 -13.544 24.121 -10.450 1.00 39.49 O +ATOM 8348 CB LEU D 227 -14.089 23.507 -7.449 1.00 42.32 C +ATOM 8349 CG LEU D 227 -14.414 24.800 -6.690 1.00 44.14 C +ATOM 8350 CD1 LEU D 227 -15.840 24.737 -6.159 1.00 43.77 C +ATOM 8351 CD2 LEU D 227 -13.434 24.989 -5.537 1.00 44.21 C +ATOM 8352 N PRO D 228 -15.523 25.107 -10.073 1.00 38.52 N +ATOM 8353 CA PRO D 228 -15.221 26.074 -11.130 1.00 37.57 C +ATOM 8354 C PRO D 228 -13.948 26.859 -10.846 1.00 37.71 C +ATOM 8355 O PRO D 228 -13.739 27.347 -9.739 1.00 39.34 O +ATOM 8356 CB PRO D 228 -16.479 26.952 -11.180 1.00 36.51 C +ATOM 8357 CG PRO D 228 -17.090 26.793 -9.817 1.00 38.87 C +ATOM 8358 CD PRO D 228 -16.873 25.326 -9.524 1.00 40.24 C +ATOM 8359 N MET D 229 -13.093 26.955 -11.858 1.00 39.16 N +ATOM 8360 CA MET D 229 -11.831 27.666 -11.758 1.00 39.06 C +ATOM 8361 C MET D 229 -11.851 28.868 -12.688 1.00 40.52 C +ATOM 8362 O MET D 229 -11.966 28.720 -13.902 1.00 44.52 O +ATOM 8363 CB MET D 229 -10.680 26.740 -12.141 1.00 37.11 C +ATOM 8364 CG MET D 229 -10.485 25.571 -11.187 1.00 40.67 C +ATOM 8365 SD MET D 229 -10.022 26.101 -9.515 1.00 40.59 S +ATOM 8366 CE MET D 229 -8.282 26.428 -9.737 1.00 36.83 C +ATOM 8367 N PHE D 230 -11.731 30.055 -12.110 1.00 39.17 N +ATOM 8368 CA PHE D 230 -11.752 31.292 -12.864 1.00 37.40 C +ATOM 8369 C PHE D 230 -10.367 31.663 -13.387 1.00 38.76 C +ATOM 8370 O PHE D 230 -9.383 31.647 -12.643 1.00 37.91 O +ATOM 8371 CB PHE D 230 -12.282 32.422 -11.973 1.00 37.06 C +ATOM 8372 CG PHE D 230 -12.526 33.717 -12.702 1.00 36.18 C +ATOM 8373 CD1 PHE D 230 -13.594 33.845 -13.585 1.00 35.72 C +ATOM 8374 CD2 PHE D 230 -11.701 34.814 -12.492 1.00 35.96 C +ATOM 8375 CE1 PHE D 230 -13.836 35.053 -14.244 1.00 36.53 C +ATOM 8376 CE2 PHE D 230 -11.933 36.028 -13.149 1.00 35.60 C +ATOM 8377 CZ PHE D 230 -13.002 36.146 -14.023 1.00 33.74 C +ATOM 8378 N GLU D 231 -10.305 32.005 -14.670 1.00 38.37 N +ATOM 8379 CA GLU D 231 -9.057 32.402 -15.308 1.00 40.86 C +ATOM 8380 C GLU D 231 -9.134 33.880 -15.641 1.00 41.74 C +ATOM 8381 O GLU D 231 -10.106 34.356 -16.223 1.00 41.72 O +ATOM 8382 CB GLU D 231 -8.809 31.590 -16.580 1.00 40.44 C +ATOM 8383 CG GLU D 231 -7.683 32.134 -17.453 1.00 44.52 C +ATOM 8384 CD GLU D 231 -7.258 31.160 -18.552 1.00 47.09 C +ATOM 8385 OE1 GLU D 231 -8.102 30.358 -19.019 1.00 49.30 O +ATOM 8386 OE2 GLU D 231 -6.078 31.208 -18.955 1.00 48.15 O +ATOM 8387 N GLN D 232 -8.093 34.606 -15.282 1.00 44.08 N +ATOM 8388 CA GLN D 232 -8.088 36.026 -15.516 1.00 48.33 C +ATOM 8389 C GLN D 232 -6.697 36.532 -15.829 1.00 50.57 C +ATOM 8390 O GLN D 232 -5.712 36.050 -15.275 1.00 51.16 O +ATOM 8391 CB GLN D 232 -8.640 36.716 -14.271 1.00 48.98 C +ATOM 8392 CG GLN D 232 -8.515 38.222 -14.233 1.00 52.23 C +ATOM 8393 CD GLN D 232 -9.145 38.797 -12.978 1.00 53.59 C +ATOM 8394 OE1 GLN D 232 -8.801 38.402 -11.864 1.00 55.77 O +ATOM 8395 NE2 GLN D 232 -10.076 39.724 -13.153 1.00 52.10 N +ATOM 8396 N GLN D 233 -6.619 37.499 -16.733 1.00 52.80 N +ATOM 8397 CA GLN D 233 -5.341 38.088 -17.084 1.00 56.64 C +ATOM 8398 C GLN D 233 -5.161 39.280 -16.161 1.00 59.17 C +ATOM 8399 O GLN D 233 -5.903 40.254 -16.241 1.00 60.63 O +ATOM 8400 CB GLN D 233 -5.334 38.528 -18.548 1.00 55.74 C +ATOM 8401 CG GLN D 233 -5.407 37.362 -19.515 1.00 57.31 C +ATOM 8402 CD GLN D 233 -4.165 36.489 -19.456 1.00 59.60 C +ATOM 8403 OE1 GLN D 233 -4.225 35.283 -19.703 1.00 59.97 O +ATOM 8404 NE2 GLN D 233 -3.027 37.100 -19.140 1.00 59.42 N +ATOM 8405 N ALA D 234 -4.192 39.178 -15.259 1.00 62.87 N +ATOM 8406 CA ALA D 234 -3.911 40.245 -14.313 1.00 65.91 C +ATOM 8407 C ALA D 234 -2.727 41.060 -14.809 1.00 68.57 C +ATOM 8408 O ALA D 234 -1.881 40.558 -15.553 1.00 67.06 O +ATOM 8409 CB ALA D 234 -3.606 39.656 -12.938 1.00 64.75 C +ATOM 8410 N GLN D 235 -2.679 42.321 -14.402 1.00 73.56 N +ATOM 8411 CA GLN D 235 -1.589 43.202 -14.791 1.00 78.37 C +ATOM 8412 C GLN D 235 -0.994 43.883 -13.566 1.00 80.52 C +ATOM 8413 O GLN D 235 -1.707 44.234 -12.624 1.00 81.61 O +ATOM 8414 CB GLN D 235 -2.078 44.262 -15.782 1.00 80.56 C +ATOM 8415 CG GLN D 235 -0.996 45.254 -16.197 1.00 83.98 C +ATOM 8416 CD GLN D 235 -1.454 46.209 -17.285 1.00 86.51 C +ATOM 8417 OE1 GLN D 235 -1.758 45.794 -18.406 1.00 87.26 O +ATOM 8418 NE2 GLN D 235 -1.504 47.498 -16.958 1.00 87.67 N +ATOM 8419 N TYR D 236 0.323 44.050 -13.581 1.00 83.02 N +ATOM 8420 CA TYR D 236 1.031 44.696 -12.489 1.00 85.03 C +ATOM 8421 C TYR D 236 2.057 45.645 -13.078 1.00 86.23 C +ATOM 8422 O TYR D 236 3.155 45.232 -13.453 1.00 86.84 O +ATOM 8423 CB TYR D 236 1.725 43.654 -11.605 1.00 85.95 C +ATOM 8424 CG TYR D 236 2.491 44.239 -10.434 1.00 86.91 C +ATOM 8425 CD1 TYR D 236 3.768 44.775 -10.604 1.00 86.39 C +ATOM 8426 CD2 TYR D 236 1.933 44.262 -9.153 1.00 87.31 C +ATOM 8427 CE1 TYR D 236 4.473 45.317 -9.528 1.00 87.38 C +ATOM 8428 CE2 TYR D 236 2.627 44.803 -8.070 1.00 87.55 C +ATOM 8429 CZ TYR D 236 3.897 45.329 -8.264 1.00 87.85 C +ATOM 8430 OH TYR D 236 4.590 45.863 -7.195 1.00 87.31 O +ATOM 8431 N LYS D 237 1.681 46.915 -13.173 1.00 87.45 N +ATOM 8432 CA LYS D 237 2.561 47.943 -13.709 1.00 88.02 C +ATOM 8433 C LYS D 237 3.262 47.482 -14.985 1.00 88.40 C +ATOM 8434 O LYS D 237 4.454 47.169 -14.967 1.00 88.79 O +ATOM 8435 CB LYS D 237 3.599 48.330 -12.651 1.00 88.54 C +ATOM 8436 CG LYS D 237 2.981 48.742 -11.322 1.00 88.78 C +ATOM 8437 CD LYS D 237 4.038 48.986 -10.260 1.00 89.04 C +ATOM 8438 CE LYS D 237 3.398 49.291 -8.917 1.00 89.42 C +ATOM 8439 NZ LYS D 237 4.417 49.487 -7.851 1.00 89.63 N +ATOM 8440 N GLU D 238 2.501 47.438 -16.078 1.00 88.13 N +ATOM 8441 CA GLU D 238 2.990 47.039 -17.398 1.00 88.21 C +ATOM 8442 C GLU D 238 3.226 45.537 -17.545 1.00 87.05 C +ATOM 8443 O GLU D 238 3.458 45.046 -18.651 1.00 87.73 O +ATOM 8444 CB GLU D 238 4.274 47.809 -17.750 1.00 90.14 C +ATOM 8445 CG GLU D 238 5.585 47.103 -17.400 1.00 92.18 C +ATOM 8446 CD GLU D 238 6.106 46.233 -18.528 1.00 93.06 C +ATOM 8447 OE1 GLU D 238 7.103 45.512 -18.306 1.00 93.82 O +ATOM 8448 OE2 GLU D 238 5.527 46.277 -19.636 1.00 93.09 O +ATOM 8449 N SER D 239 3.169 44.807 -16.437 1.00 84.78 N +ATOM 8450 CA SER D 239 3.370 43.362 -16.482 1.00 82.03 C +ATOM 8451 C SER D 239 2.026 42.637 -16.428 1.00 79.17 C +ATOM 8452 O SER D 239 1.222 42.869 -15.527 1.00 78.77 O +ATOM 8453 CB SER D 239 4.257 42.912 -15.318 1.00 82.49 C +ATOM 8454 OG SER D 239 5.560 43.459 -15.434 1.00 84.05 O +ATOM 8455 N PHE D 240 1.787 41.763 -17.401 1.00 75.27 N +ATOM 8456 CA PHE D 240 0.537 41.015 -17.468 1.00 71.72 C +ATOM 8457 C PHE D 240 0.780 39.508 -17.465 1.00 66.16 C +ATOM 8458 O PHE D 240 1.671 39.009 -18.152 1.00 65.54 O +ATOM 8459 CB PHE D 240 -0.259 41.430 -18.716 1.00 76.15 C +ATOM 8460 CG PHE D 240 0.503 41.288 -20.012 1.00 81.13 C +ATOM 8461 CD1 PHE D 240 1.736 41.917 -20.192 1.00 83.46 C +ATOM 8462 CD2 PHE D 240 -0.029 40.545 -21.067 1.00 83.84 C +ATOM 8463 CE1 PHE D 240 2.430 41.810 -21.404 1.00 84.83 C +ATOM 8464 CE2 PHE D 240 0.656 40.430 -22.287 1.00 85.16 C +ATOM 8465 CZ PHE D 240 1.886 41.064 -22.454 1.00 85.48 C +ATOM 8466 N PHE D 241 -0.026 38.788 -16.689 1.00 59.54 N +ATOM 8467 CA PHE D 241 0.113 37.341 -16.572 1.00 53.11 C +ATOM 8468 C PHE D 241 -1.214 36.672 -16.239 1.00 49.53 C +ATOM 8469 O PHE D 241 -2.089 37.285 -15.635 1.00 49.05 O +ATOM 8470 CB PHE D 241 1.136 37.025 -15.485 1.00 50.64 C +ATOM 8471 CG PHE D 241 0.811 37.636 -14.151 1.00 50.04 C +ATOM 8472 CD1 PHE D 241 0.025 36.949 -13.226 1.00 49.64 C +ATOM 8473 CD2 PHE D 241 1.295 38.898 -13.814 1.00 49.73 C +ATOM 8474 CE1 PHE D 241 -0.271 37.508 -11.980 1.00 47.25 C +ATOM 8475 CE2 PHE D 241 1.005 39.470 -12.573 1.00 50.15 C +ATOM 8476 CZ PHE D 241 0.219 38.770 -11.651 1.00 50.43 C +ATOM 8477 N THR D 242 -1.366 35.415 -16.638 1.00 46.11 N +ATOM 8478 CA THR D 242 -2.597 34.697 -16.355 1.00 45.62 C +ATOM 8479 C THR D 242 -2.630 34.214 -14.900 1.00 44.29 C +ATOM 8480 O THR D 242 -1.612 33.812 -14.329 1.00 42.05 O +ATOM 8481 CB THR D 242 -2.802 33.522 -17.339 1.00 45.25 C +ATOM 8482 OG1 THR D 242 -3.562 32.489 -16.706 1.00 49.35 O +ATOM 8483 CG2 THR D 242 -1.492 32.983 -17.806 1.00 49.82 C +ATOM 8484 N HIS D 243 -3.815 34.287 -14.303 1.00 40.84 N +ATOM 8485 CA HIS D 243 -4.009 33.914 -12.912 1.00 38.27 C +ATOM 8486 C HIS D 243 -5.319 33.164 -12.714 1.00 36.21 C +ATOM 8487 O HIS D 243 -6.348 33.546 -13.265 1.00 33.10 O +ATOM 8488 CB HIS D 243 -4.011 35.172 -12.051 1.00 39.41 C +ATOM 8489 CG HIS D 243 -4.194 34.902 -10.594 1.00 41.37 C +ATOM 8490 ND1 HIS D 243 -3.187 34.396 -9.801 1.00 43.79 N +ATOM 8491 CD2 HIS D 243 -5.272 35.049 -9.788 1.00 42.07 C +ATOM 8492 CE1 HIS D 243 -3.637 34.244 -8.568 1.00 43.24 C +ATOM 8493 NE2 HIS D 243 -4.899 34.633 -8.534 1.00 43.26 N +ATOM 8494 N PHE D 244 -5.274 32.098 -11.922 1.00 34.59 N +ATOM 8495 CA PHE D 244 -6.461 31.300 -11.659 1.00 32.74 C +ATOM 8496 C PHE D 244 -6.912 31.460 -10.225 1.00 33.26 C +ATOM 8497 O PHE D 244 -6.099 31.567 -9.311 1.00 32.63 O +ATOM 8498 CB PHE D 244 -6.202 29.815 -11.925 1.00 31.80 C +ATOM 8499 CG PHE D 244 -5.910 29.490 -13.366 1.00 34.72 C +ATOM 8500 CD1 PHE D 244 -4.602 29.528 -13.855 1.00 35.03 C +ATOM 8501 CD2 PHE D 244 -6.941 29.111 -14.232 1.00 34.01 C +ATOM 8502 CE1 PHE D 244 -4.319 29.183 -15.191 1.00 34.20 C +ATOM 8503 CE2 PHE D 244 -6.671 28.766 -15.566 1.00 34.94 C +ATOM 8504 CZ PHE D 244 -5.355 28.801 -16.044 1.00 33.83 C +ATOM 8505 N VAL D 245 -8.224 31.481 -10.033 1.00 33.57 N +ATOM 8506 CA VAL D 245 -8.784 31.603 -8.703 1.00 33.85 C +ATOM 8507 C VAL D 245 -9.933 30.610 -8.583 1.00 33.58 C +ATOM 8508 O VAL D 245 -10.810 30.550 -9.447 1.00 30.69 O +ATOM 8509 CB VAL D 245 -9.280 33.052 -8.429 1.00 34.83 C +ATOM 8510 CG1 VAL D 245 -10.144 33.529 -9.559 1.00 39.48 C +ATOM 8511 CG2 VAL D 245 -10.059 33.108 -7.118 1.00 34.46 C +ATOM 8512 N PRO D 246 -9.917 29.785 -7.526 1.00 32.92 N +ATOM 8513 CA PRO D 246 -10.989 28.808 -7.342 1.00 33.80 C +ATOM 8514 C PRO D 246 -12.252 29.532 -6.918 1.00 34.02 C +ATOM 8515 O PRO D 246 -12.230 30.318 -5.976 1.00 36.22 O +ATOM 8516 CB PRO D 246 -10.435 27.870 -6.266 1.00 33.61 C +ATOM 8517 CG PRO D 246 -9.515 28.734 -5.494 1.00 35.82 C +ATOM 8518 CD PRO D 246 -8.843 29.596 -6.537 1.00 33.55 C +ATOM 8519 N LEU D 247 -13.350 29.272 -7.618 1.00 33.39 N +ATOM 8520 CA LEU D 247 -14.609 29.936 -7.315 1.00 35.00 C +ATOM 8521 C LEU D 247 -15.476 29.273 -6.257 1.00 34.72 C +ATOM 8522 O LEU D 247 -16.394 28.530 -6.573 1.00 37.92 O +ATOM 8523 CB LEU D 247 -15.413 30.115 -8.604 1.00 35.47 C +ATOM 8524 CG LEU D 247 -15.368 31.500 -9.265 1.00 38.54 C +ATOM 8525 CD1 LEU D 247 -14.101 32.265 -8.882 1.00 38.14 C +ATOM 8526 CD2 LEU D 247 -15.472 31.320 -10.760 1.00 38.54 C +ATOM 8527 N TYR D 248 -15.187 29.545 -4.994 1.00 34.84 N +ATOM 8528 CA TYR D 248 -15.991 28.989 -3.919 1.00 33.62 C +ATOM 8529 C TYR D 248 -17.348 29.673 -3.970 1.00 33.90 C +ATOM 8530 O TYR D 248 -17.443 30.860 -4.284 1.00 34.17 O +ATOM 8531 CB TYR D 248 -15.371 29.282 -2.557 1.00 31.60 C +ATOM 8532 CG TYR D 248 -13.934 28.885 -2.425 1.00 32.70 C +ATOM 8533 CD1 TYR D 248 -12.942 29.850 -2.346 1.00 34.03 C +ATOM 8534 CD2 TYR D 248 -13.560 27.546 -2.368 1.00 30.80 C +ATOM 8535 CE1 TYR D 248 -11.615 29.500 -2.211 1.00 34.95 C +ATOM 8536 CE2 TYR D 248 -12.228 27.183 -2.235 1.00 32.69 C +ATOM 8537 CZ TYR D 248 -11.262 28.170 -2.156 1.00 34.16 C +ATOM 8538 OH TYR D 248 -9.935 27.845 -2.017 1.00 39.10 O +ATOM 8539 N LYS D 249 -18.394 28.930 -3.641 1.00 33.75 N +ATOM 8540 CA LYS D 249 -19.727 29.489 -3.637 1.00 36.21 C +ATOM 8541 C LYS D 249 -19.777 30.748 -2.770 1.00 37.03 C +ATOM 8542 O LYS D 249 -20.387 31.748 -3.160 1.00 36.65 O +ATOM 8543 CB LYS D 249 -20.719 28.451 -3.116 1.00 39.73 C +ATOM 8544 CG LYS D 249 -20.736 27.184 -3.949 1.00 44.68 C +ATOM 8545 CD LYS D 249 -21.815 26.218 -3.490 1.00 51.06 C +ATOM 8546 CE LYS D 249 -21.876 25.001 -4.408 1.00 52.31 C +ATOM 8547 NZ LYS D 249 -20.529 24.369 -4.532 1.00 54.43 N +ATOM 8548 N THR D 250 -19.129 30.697 -1.606 1.00 33.84 N +ATOM 8549 CA THR D 250 -19.110 31.826 -0.676 1.00 34.29 C +ATOM 8550 C THR D 250 -18.292 33.003 -1.175 1.00 37.05 C +ATOM 8551 O THR D 250 -18.432 34.117 -0.674 1.00 37.25 O +ATOM 8552 CB THR D 250 -18.540 31.423 0.713 1.00 35.80 C +ATOM 8553 OG1 THR D 250 -17.271 30.764 0.544 1.00 33.94 O +ATOM 8554 CG2 THR D 250 -19.516 30.513 1.451 1.00 29.77 C +ATOM 8555 N LEU D 251 -17.418 32.759 -2.145 1.00 40.24 N +ATOM 8556 CA LEU D 251 -16.600 33.835 -2.690 1.00 42.82 C +ATOM 8557 C LEU D 251 -17.497 34.675 -3.595 1.00 44.38 C +ATOM 8558 O LEU D 251 -17.336 35.889 -3.697 1.00 45.10 O +ATOM 8559 CB LEU D 251 -15.439 33.274 -3.509 1.00 42.83 C +ATOM 8560 CG LEU D 251 -14.065 33.937 -3.366 1.00 44.69 C +ATOM 8561 CD1 LEU D 251 -13.219 33.572 -4.584 1.00 42.15 C +ATOM 8562 CD2 LEU D 251 -14.200 35.440 -3.257 1.00 43.11 C +ATOM 8563 N LEU D 252 -18.444 34.013 -4.250 1.00 45.51 N +ATOM 8564 CA LEU D 252 -19.373 34.690 -5.143 1.00 48.06 C +ATOM 8565 C LEU D 252 -20.510 35.287 -4.330 1.00 50.50 C +ATOM 8566 O LEU D 252 -20.364 35.350 -3.091 0.00 50.33 O +ATOM 8567 CB LEU D 252 -19.927 33.705 -6.177 1.00 46.91 C +ATOM 8568 CG LEU D 252 -18.861 33.013 -7.034 1.00 47.34 C +ATOM 8569 CD1 LEU D 252 -19.518 32.057 -8.005 1.00 45.58 C +ATOM 8570 CD2 LEU D 252 -18.039 34.059 -7.779 1.00 47.92 C +TER 8571 LEU D 252 +HETATM 8572 O HOH A 338 19.551 -16.452 58.274 1.00 71.35 O +HETATM 8573 O HOH A 339 4.779 -15.972 12.301 1.00 57.80 O +HETATM 8574 O HOH A 340 -11.723 -11.785 14.136 1.00 64.36 O +HETATM 8575 O HOH A 341 -12.888 -5.204 15.106 1.00 63.41 O +HETATM 8576 O HOH A 342 1.982 -2.892 14.187 1.00 79.88 O +HETATM 8577 O HOH A 343 -16.447 -4.917 15.083 1.00 61.20 O +HETATM 8578 O HOH A 344 -18.197 -3.463 16.377 1.00 67.02 O +HETATM 8579 O HOH A 345 0.923 -3.946 16.469 1.00 62.26 O +HETATM 8580 O HOH A 346 -3.431 -20.756 18.611 1.00 75.54 O +HETATM 8581 O HOH A 347 -8.702 15.637 19.437 1.00 21.99 O +HETATM 8582 O HOH A 348 5.960 -22.949 20.450 1.00 71.70 O +HETATM 8583 O HOH A 349 -6.203 -17.844 21.585 1.00 52.55 O +HETATM 8584 O HOH A 350 -18.020 -16.383 21.007 1.00 74.58 O +HETATM 8585 O HOH A 351 -4.050 20.338 21.257 1.00 48.05 O +HETATM 8586 O HOH A 352 0.887 15.559 21.937 1.00 71.32 O +HETATM 8587 O HOH A 353 -9.960 -16.785 23.994 1.00 62.52 O +HETATM 8588 O HOH A 354 6.797 1.235 23.375 1.00 61.24 O +HETATM 8589 O HOH A 355 8.072 -3.508 25.257 1.00 69.78 O +HETATM 8590 O HOH A 356 4.842 12.545 24.920 1.00 60.76 O +HETATM 8591 O HOH A 357 2.181 13.476 25.582 1.00 53.14 O +HETATM 8592 O HOH A 358 -28.069 -13.647 27.016 1.00 66.81 O +HETATM 8593 O HOH A 359 -21.456 -1.771 28.424 1.00 63.80 O +HETATM 8594 O HOH A 360 10.713 1.610 27.640 1.00 63.57 O +HETATM 8595 O HOH A 361 -3.826 9.899 27.515 1.00 43.66 O +HETATM 8596 O HOH A 362 2.381 -7.977 28.920 1.00 51.30 O +HETATM 8597 O HOH A 363 -13.577 -32.855 28.606 1.00 67.24 O +HETATM 8598 O HOH A 364 -21.191 -4.602 30.048 1.00 75.04 O +HETATM 8599 O HOH A 365 -15.354 23.100 30.000 1.00 71.07 O +HETATM 8600 O HOH A 366 1.272 -8.898 31.009 1.00 43.05 O +HETATM 8601 O HOH A 367 10.184 -30.307 31.743 1.00 62.95 O +HETATM 8602 O HOH A 368 14.062 -0.422 32.383 1.00 71.94 O +HETATM 8603 O HOH A 369 -10.754 20.983 31.568 1.00 66.88 O +HETATM 8604 O HOH A 370 -14.317 -44.647 35.378 1.00 77.96 O +HETATM 8605 O HOH A 371 -11.766 -43.218 31.700 1.00 84.45 O +HETATM 8606 O HOH A 372 -17.808 -8.245 32.769 1.00 55.88 O +HETATM 8607 O HOH A 373 0.974 16.754 33.643 1.00 78.84 O +HETATM 8608 O HOH A 374 -5.324 18.094 32.719 1.00 55.97 O +HETATM 8609 O HOH A 375 7.177 -9.606 33.324 1.00 77.27 O +HETATM 8610 O HOH A 376 8.099 18.977 36.471 1.00 79.76 O +HETATM 8611 O HOH A 377 -18.376 -14.830 35.607 1.00 58.88 O +HETATM 8612 O HOH A 378 -14.773 -10.980 34.364 1.00 54.42 O +HETATM 8613 O HOH A 379 -19.880 -1.341 34.222 1.00 81.03 O +HETATM 8614 O HOH A 380 0.967 -21.634 37.397 1.00 47.85 O +HETATM 8615 O HOH A 381 -5.430 18.322 37.676 1.00 75.45 O +HETATM 8616 O HOH A 382 -16.363 -7.800 37.892 1.00 64.98 O +HETATM 8617 O HOH A 383 -2.995 -30.750 38.766 1.00 49.96 O +HETATM 8618 O HOH A 384 -14.846 -14.784 39.449 1.00 64.21 O +HETATM 8619 O HOH A 385 -4.956 -28.422 40.560 1.00 63.75 O +HETATM 8620 O HOH A 386 -17.502 4.482 41.113 1.00 63.59 O +HETATM 8621 O HOH A 387 -4.902 12.606 40.748 1.00 53.23 O +HETATM 8622 O HOH A 388 -4.815 -43.172 40.766 1.00 81.74 O +HETATM 8623 O HOH A 389 33.884 -14.101 41.701 1.00 57.05 O +HETATM 8624 O HOH A 390 -19.832 5.507 41.158 1.00 66.71 O +HETATM 8625 O HOH A 391 -5.820 10.102 41.646 1.00 75.40 O +HETATM 8626 O HOH A 392 -21.248 -46.144 35.565 1.00 78.04 O +HETATM 8627 O HOH A 393 -14.964 6.092 42.743 1.00 60.54 O +HETATM 8628 O HOH A 394 -1.938 -17.686 43.500 1.00 45.48 O +HETATM 8629 O HOH A 395 14.355 4.103 43.989 1.00 55.28 O +HETATM 8630 O HOH A 396 -14.133 -14.928 44.441 1.00 64.30 O +HETATM 8631 O HOH A 397 -16.773 -20.045 48.005 1.00 65.14 O +HETATM 8632 O HOH A 398 14.449 1.504 47.550 1.00 60.90 O +HETATM 8633 O HOH A 399 7.925 11.778 49.691 1.00 90.48 O +HETATM 8634 O HOH A 400 -8.607 -1.806 49.680 1.00 79.95 O +HETATM 8635 O HOH A 401 24.373 -3.227 50.817 1.00 71.91 O +HETATM 8636 O HOH A 402 -12.542 -20.095 53.281 1.00 65.62 O +HETATM 8637 O HOH A 403 -6.890 -21.710 51.752 1.00 62.58 O +HETATM 8638 O HOH A 404 -1.377 -19.202 52.142 1.00 61.89 O +HETATM 8639 O HOH A 405 21.192 -5.804 52.802 1.00 62.29 O +HETATM 8640 O HOH A 406 -10.542 -19.305 54.798 1.00 62.93 O +HETATM 8641 O HOH A 407 -9.806 -26.338 54.615 1.00 70.63 O +HETATM 8642 O HOH A 408 -18.883 -30.759 53.615 1.00 62.35 O +HETATM 8643 O HOH A 409 -7.398 -14.352 56.509 1.00 77.47 O +HETATM 8644 O HOH A 410 4.832 -6.973 58.028 1.00 80.49 O +HETATM 8645 O HOH A 411 -7.281 -17.207 59.509 1.00 68.30 O +HETATM 8646 O HOH A 412 20.700 -12.402 56.727 1.00 84.54 O +HETATM 8647 O HOH A 413 14.955 -7.610 58.713 1.00 68.50 O +HETATM 8648 O HOH A 414 5.716 -16.551 14.749 1.00 65.63 O +HETATM 8649 O HOH A 415 -6.301 -17.029 18.997 1.00 66.84 O +HETATM 8650 O HOH A 416 -1.207 -28.335 24.426 1.00 67.73 O +HETATM 8651 O HOH A 417 -28.506 -15.653 25.357 1.00 86.68 O +HETATM 8652 O HOH A 418 14.387 -3.230 33.209 1.00 57.39 O +HETATM 8653 O HOH A 419 -2.481 -42.212 39.795 1.00 73.95 O +HETATM 8654 O HOH A 420 -3.668 17.860 39.706 1.00 78.06 O +HETATM 8655 O HOH A 421 -20.981 -26.231 43.304 1.00 62.14 O +HETATM 8656 O HOH A 422 -18.097 -19.797 45.574 1.00 74.78 O +HETATM 8657 O HOH A 423 -10.377 2.224 50.107 1.00 64.55 O +HETATM 8658 O HOH A 424 15.703 -1.082 50.530 1.00 66.10 O +HETATM 8659 O HOH A 425 2.604 -9.361 59.501 1.00 58.87 O +HETATM 8660 O HOH A 426 10.709 -6.790 27.618 1.00 79.75 O +HETATM 8661 O HOH A 427 10.598 17.259 32.855 1.00 62.23 O +HETATM 8662 O HOH A 428 8.228 -12.952 33.829 1.00 75.13 O +HETATM 8663 O HOH A 429 -21.830 -34.753 38.531 1.00 62.44 O +HETATM 8664 O HOH A 430 -8.230 18.542 41.058 1.00 81.42 O +HETATM 8665 O HOH A 431 -12.252 -49.341 41.844 1.00 97.72 O +HETATM 8666 O HOH A 432 -0.233 -13.784 3.082 1.00 67.02 O +HETATM 8667 O HOH A 433 -9.662 -8.162 9.657 1.00 82.36 O +HETATM 8668 O HOH A 434 -11.182 -13.194 16.521 1.00 64.89 O +HETATM 8669 O HOH A 435 5.386 2.336 17.732 1.00 77.81 O +HETATM 8670 O HOH A 436 -6.896 18.689 20.042 1.00 39.41 O +HETATM 8671 O HOH A 437 1.805 17.076 31.173 1.00 79.18 O +HETATM 8672 O HOH A 438 9.318 -7.465 36.095 1.00 71.50 O +HETATM 8673 O HOH A 439 -2.689 -44.610 38.739 1.00 71.04 O +HETATM 8674 O HOH A 440 -9.397 -41.190 39.452 1.00 80.96 O +HETATM 8675 O HOH A 441 -23.740 -33.504 39.996 1.00 61.41 O +HETATM 8676 O HOH A 442 -19.210 -18.606 39.485 1.00 71.90 O +HETATM 8677 O HOH A 443 -2.972 -46.475 41.069 1.00 71.19 O +HETATM 8678 O HOH A 444 -22.985 -24.146 41.649 1.00 68.90 O +HETATM 8679 O HOH A 445 -8.584 -43.182 43.659 1.00 54.22 O +HETATM 8680 O HOH A 446 -22.715 -33.387 45.479 1.00 67.99 O +HETATM 8681 O HOH A 447 2.346 -16.292 45.443 1.00 66.87 O +HETATM 8682 O HOH A 448 -19.633 -9.771 45.669 1.00 66.59 O +HETATM 8683 O HOH A 449 22.315 0.108 46.677 1.00 62.13 O +HETATM 8684 O HOH A 450 -15.385 6.815 46.520 1.00 68.89 O +HETATM 8685 O HOH A 451 10.275 -22.415 48.702 1.00 75.91 O +HETATM 8686 O HOH A 452 8.270 -18.235 49.112 1.00 81.16 O +HETATM 8687 O HOH A 453 -17.295 -11.942 48.010 1.00 77.19 O +HETATM 8688 O HOH A 454 7.336 8.502 48.162 1.00 76.47 O +HETATM 8689 O HOH A 455 4.141 15.134 49.554 1.00 81.28 O +HETATM 8690 O HOH A 456 4.603 13.179 51.308 1.00 90.00 O +HETATM 8691 O HOH A 457 -16.026 -29.604 51.300 1.00 63.10 O +HETATM 8692 O HOH A 458 -8.936 -25.300 51.684 1.00 57.98 O +HETATM 8693 O HOH A 459 17.237 -2.511 52.894 1.00 70.43 O +HETATM 8694 O HOH A 460 -4.971 -10.281 54.176 1.00 78.48 O +HETATM 8695 O HOH A 461 14.926 -18.770 56.538 1.00 69.53 O +HETATM 8696 O HOH A 462 4.309 -9.088 61.523 1.00 71.02 O +HETATM 8697 O HOH A 463 -4.586 -19.792 15.151 1.00 83.73 O +HETATM 8698 O HOH A 464 2.606 17.015 16.788 1.00 70.88 O +HETATM 8699 O HOH A 465 -19.243 -4.047 19.350 1.00 70.63 O +HETATM 8700 O HOH A 466 -29.833 -18.010 24.438 1.00 78.44 O +HETATM 8701 O HOH A 467 5.899 -8.834 28.621 1.00 62.83 O +HETATM 8702 O HOH A 468 -5.876 19.426 28.215 1.00 51.47 O +HETATM 8703 O HOH A 469 5.842 18.277 30.559 1.00 63.03 O +HETATM 8704 O HOH A 470 10.191 -9.212 32.653 1.00 68.34 O +HETATM 8705 O HOH A 471 -21.146 -17.183 36.302 1.00 86.53 O +HETATM 8706 O HOH A 472 -19.388 -13.059 34.261 1.00 72.71 O +HETATM 8707 O HOH A 473 13.210 -12.276 36.139 1.00 77.62 O +HETATM 8708 O HOH A 474 -16.768 -19.404 37.235 1.00 69.24 O +HETATM 8709 O HOH A 475 13.654 -15.924 37.868 1.00 45.52 O +HETATM 8710 O HOH A 476 0.235 4.715 46.844 1.00 74.93 O +HETATM 8711 O HOH A 477 -23.054 -32.958 49.435 1.00 72.74 O +HETATM 8712 O HOH A 478 -2.080 9.066 49.119 1.00 86.95 O +HETATM 8713 O HOH A 479 -7.438 -11.225 53.420 1.00 68.27 O +HETATM 8714 O HOH C 254 -21.362 37.065 -18.538 1.00 69.03 O +HETATM 8715 O HOH C 255 5.135 37.613 -18.199 1.00 85.58 O +HETATM 8716 O HOH C 256 -18.356 44.622 -18.526 1.00 77.04 O +HETATM 8717 O HOH C 257 -17.970 35.311 -16.797 1.00 60.30 O +HETATM 8718 O HOH C 258 -14.627 34.469 -17.649 1.00 80.60 O +HETATM 8719 O HOH C 259 3.625 34.820 -17.082 1.00 62.34 O +HETATM 8720 O HOH C 260 -26.468 35.642 -14.942 1.00 66.12 O +HETATM 8721 O HOH C 261 -10.948 44.475 -13.053 1.00 87.17 O +HETATM 8722 O HOH C 262 -5.806 45.834 -10.739 1.00 74.44 O +HETATM 8723 O HOH C 263 -8.687 44.790 -10.080 1.00 44.14 O +HETATM 8724 O HOH C 264 15.950 36.471 -8.282 1.00 56.26 O +HETATM 8725 O HOH C 265 0.113 34.174 -7.920 1.00 29.52 O +HETATM 8726 O HOH C 266 -6.618 35.230 -6.188 1.00 27.36 O +HETATM 8727 O HOH C 267 -0.063 30.248 -5.833 1.00 38.52 O +HETATM 8728 O HOH C 268 -17.771 21.661 -3.394 1.00 38.63 O +HETATM 8729 O HOH C 269 -3.720 50.149 -3.184 1.00 70.65 O +HETATM 8730 O HOH C 270 -7.564 30.517 -2.177 1.00 31.61 O +HETATM 8731 O HOH C 271 -0.955 31.462 -3.017 1.00 55.56 O +HETATM 8732 O HOH C 272 -1.908 33.499 -1.515 1.00 38.40 O +HETATM 8733 O HOH C 273 0.942 47.478 -1.845 1.00 50.88 O +HETATM 8734 O HOH C 274 -6.106 32.935 -1.003 1.00 32.19 O +HETATM 8735 O HOH C 275 6.938 43.315 -1.325 1.00 51.13 O +HETATM 8736 O HOH C 276 -6.644 46.665 -1.084 1.00 37.63 O +HETATM 8737 O HOH C 277 -14.687 13.602 0.231 1.00 44.00 O +HETATM 8738 O HOH C 278 -19.359 15.419 -0.829 1.00 58.78 O +HETATM 8739 O HOH C 279 -17.922 28.096 -0.244 1.00 24.08 O +HETATM 8740 O HOH C 280 -3.527 48.730 0.047 1.00 48.60 O +HETATM 8741 O HOH C 281 -19.003 8.094 1.219 1.00 48.01 O +HETATM 8742 O HOH C 282 -10.098 16.269 0.906 1.00 26.56 O +HETATM 8743 O HOH C 283 -19.185 12.510 1.723 1.00 56.65 O +HETATM 8744 O HOH C 284 -16.623 15.652 1.691 1.00 60.27 O +HETATM 8745 O HOH C 285 -0.751 31.974 1.515 1.00 44.02 O +HETATM 8746 O HOH C 286 -2.056 24.039 2.639 1.00 57.62 O +HETATM 8747 O HOH C 287 3.078 47.144 2.599 1.00 34.71 O +HETATM 8748 O HOH C 288 6.080 34.927 3.295 1.00 32.03 O +HETATM 8749 O HOH C 289 10.041 41.658 3.245 1.00 78.15 O +HETATM 8750 O HOH C 290 2.669 51.241 3.211 1.00 64.27 O +HETATM 8751 O HOH C 291 -28.728 19.853 3.996 1.00 86.59 O +HETATM 8752 O HOH C 292 -18.725 39.138 -4.151 1.00 39.79 O +HETATM 8753 O HOH C 293 -27.448 23.375 5.393 1.00 55.01 O +HETATM 8754 O HOH C 294 -0.949 17.724 5.905 1.00 66.02 O +HETATM 8755 O HOH C 295 -2.056 21.516 6.133 1.00 53.69 O +HETATM 8756 O HOH C 296 -14.013 -0.559 -0.311 1.00 73.33 O +HETATM 8757 O HOH C 297 -28.693 20.927 6.575 1.00 66.08 O +HETATM 8758 O HOH C 298 -8.135 27.041 7.220 1.00 45.67 O +HETATM 8759 O HOH C 299 11.180 37.702 7.128 1.00 62.20 O +HETATM 8760 O HOH C 300 -5.619 48.471 8.083 1.00 35.20 O +HETATM 8761 O HOH C 301 -3.425 49.231 8.884 1.00 58.22 O +HETATM 8762 O HOH C 302 6.534 21.017 16.712 1.00 68.25 O +HETATM 8763 O HOH C 303 -22.101 39.678 9.153 1.00 45.64 O +HETATM 8764 O HOH C 304 -3.833 12.735 10.416 1.00 71.25 O +HETATM 8765 O HOH C 305 -20.720 36.901 10.010 1.00 56.00 O +HETATM 8766 O HOH C 306 -7.996 13.348 10.643 1.00 23.59 O +HETATM 8767 O HOH C 307 -11.950 47.997 11.526 1.00 30.50 O +HETATM 8768 O HOH C 308 -9.642 48.682 11.779 1.00 61.60 O +HETATM 8769 O HOH C 309 -2.340 8.974 11.914 1.00 75.21 O +HETATM 8770 O HOH C 310 -9.997 22.600 11.999 1.00 26.15 O +HETATM 8771 O HOH C 311 -32.189 14.310 12.961 1.00 72.26 O +HETATM 8772 O HOH C 312 -30.870 32.814 11.443 1.00 65.92 O +HETATM 8773 O HOH C 313 1.149 46.579 13.145 1.00 81.29 O +HETATM 8774 O HOH C 314 -6.897 8.152 13.699 1.00 46.90 O +HETATM 8775 O HOH C 315 -13.039 47.389 14.616 1.00 75.75 O +HETATM 8776 O HOH C 316 -19.844 44.965 -15.848 1.00 50.44 O +HETATM 8777 O HOH C 317 -9.830 46.872 15.868 1.00 76.94 O +HETATM 8778 O HOH C 318 -3.575 -0.855 16.801 1.00 67.78 O +HETATM 8779 O HOH C 319 -30.384 27.102 15.890 1.00 73.53 O +HETATM 8780 O HOH C 320 8.018 44.916 16.349 1.00 80.68 O +HETATM 8781 O HOH C 321 -8.014 -0.833 16.864 1.00 40.59 O +HETATM 8782 O HOH C 322 -15.687 0.765 16.863 1.00 57.94 O +HETATM 8783 O HOH C 323 0.728 10.367 15.917 1.00 71.44 O +HETATM 8784 O HOH C 324 -4.979 13.311 17.315 1.00 41.29 O +HETATM 8785 O HOH C 325 -13.778 18.623 17.253 1.00 30.81 O +HETATM 8786 O HOH C 326 -27.581 19.673 17.486 1.00 66.23 O +HETATM 8787 O HOH C 327 -2.531 24.239 16.566 1.00 62.47 O +HETATM 8788 O HOH C 328 -32.871 20.245 18.578 1.00 74.34 O +HETATM 8789 O HOH C 329 -26.903 38.038 17.890 1.00 54.39 O +HETATM 8790 O HOH C 330 4.658 28.977 23.524 1.00 66.88 O +HETATM 8791 O HOH C 331 4.041 47.245 19.149 1.00 77.20 O +HETATM 8792 O HOH C 332 -28.420 17.994 25.277 1.00 87.20 O +HETATM 8793 O HOH C 333 -23.980 3.717 25.999 1.00 46.52 O +HETATM 8794 O HOH C 334 -16.315 24.527 26.908 1.00 61.99 O +HETATM 8795 O HOH C 335 4.520 24.159 26.729 1.00 61.57 O +HETATM 8796 O HOH C 336 -22.517 28.973 28.394 1.00 77.78 O +HETATM 8797 O HOH C 337 -27.191 15.913 30.076 1.00 71.02 O +HETATM 8798 O HOH C 338 -22.739 20.985 30.885 1.00 73.17 O +HETATM 8799 O HOH C 339 -14.493 33.368 30.734 1.00 46.94 O +HETATM 8800 O HOH C 340 -25.023 10.389 31.826 1.00 56.69 O +HETATM 8801 O HOH C 341 -27.275 13.697 31.976 1.00 66.75 O +HETATM 8802 O HOH C 342 -7.762 34.805 31.039 1.00 60.94 O +HETATM 8803 O HOH C 343 -14.360 34.244 34.152 1.00 83.02 O +HETATM 8804 O HOH C 344 -20.364 10.376 37.990 1.00 53.54 O +HETATM 8805 O HOH C 345 -4.566 43.791 31.818 1.00 48.36 O +HETATM 8806 O HOH C 346 -15.429 37.783 -17.098 1.00 73.83 O +HETATM 8807 O HOH C 347 -2.103 51.663 -6.256 1.00 73.04 O +HETATM 8808 O HOH C 348 -4.429 34.475 -2.643 1.00 26.56 O +HETATM 8809 O HOH C 349 -20.106 24.745 -1.258 1.00 49.88 O +HETATM 8810 O HOH C 350 -1.940 51.809 -1.338 1.00 67.74 O +HETATM 8811 O HOH C 351 -19.728 5.053 -0.152 1.00 70.25 O +HETATM 8812 O HOH C 352 -5.676 17.776 -1.053 1.00 44.54 O +HETATM 8813 O HOH C 353 2.985 48.143 0.340 1.00 45.14 O +HETATM 8814 O HOH C 354 7.145 47.240 0.844 1.00 70.10 O +HETATM 8815 O HOH C 355 -8.471 12.308 1.394 1.00 44.61 O +HETATM 8816 O HOH C 356 6.390 51.067 2.685 1.00 71.52 O +HETATM 8817 O HOH C 357 -2.171 50.672 12.020 1.00 96.78 O +HETATM 8818 O HOH C 358 8.603 42.302 11.009 1.00 76.79 O +HETATM 8819 O HOH C 359 -12.458 51.468 15.881 1.00 83.23 O +HETATM 8820 O HOH C 360 -22.480 -0.948 17.619 1.00 63.66 O +HETATM 8821 O HOH C 361 -31.008 26.548 18.441 1.00 77.24 O +HETATM 8822 O HOH C 362 10.830 23.171 25.453 1.00 75.12 O +HETATM 8823 O HOH C 363 -23.912 15.881 32.931 1.00 77.54 O +HETATM 8824 O HOH C 364 -23.899 18.491 33.335 1.00 77.60 O +HETATM 8825 O HOH C 365 -13.154 31.748 35.772 1.00101.60 O +HETATM 8826 O HOH C 366 -23.323 17.694 36.205 1.00 95.92 O +HETATM 8827 O HOH C 367 -21.700 2.164 37.643 1.00 59.47 O +HETATM 8828 O HOH C 368 -14.866 13.631 39.339 1.00 61.53 O +HETATM 8829 O HOH C 369 -31.345 22.430 4.293 1.00 74.24 O +HETATM 8830 O HOH C 370 -7.112 11.800 6.394 1.00 68.36 O +HETATM 8831 O HOH C 371 -6.891 21.240 6.846 1.00 39.39 O +HETATM 8832 O HOH C 372 -23.480 34.800 -7.115 1.00 47.72 O +HETATM 8833 O HOH C 373 -30.356 32.576 8.238 1.00 66.33 O +HETATM 8834 O HOH C 374 -5.422 52.128 11.397 1.00 68.53 O +HETATM 8835 O HOH C 375 -34.152 10.808 11.596 1.00 62.04 O +HETATM 8836 O HOH C 376 -27.292 21.622 14.319 1.00 58.84 O +HETATM 8837 O HOH C 377 -4.929 21.370 15.658 1.00 47.95 O +HETATM 8838 O HOH C 378 -31.809 20.394 15.644 1.00100.97 O +HETATM 8839 O HOH C 379 -28.645 22.157 17.749 1.00 77.49 O +HETATM 8840 O HOH C 380 -5.182 47.110 19.476 1.00 69.47 O +HETATM 8841 O HOH C 381 -14.349 29.063 28.060 1.00 61.49 O +HETATM 8842 O HOH C 382 -20.124 29.862 29.551 1.00 69.25 O +HETATM 8843 O HOH C 383 13.228 46.530 -9.688 1.00 78.62 O +HETATM 8844 O HOH C 384 -21.054 9.543 0.057 1.00124.16 O +HETATM 8845 O HOH C 385 -27.622 13.670 -0.949 1.00 82.18 O +HETATM 8846 O HOH C 386 4.269 35.767 7.480 1.00 47.93 O +HETATM 8847 O HOH C 387 -31.698 23.431 10.683 1.00 65.00 O +HETATM 8848 O HOH C 388 2.659 21.358 17.026 1.00 71.71 O +HETATM 8849 O HOH C 389 -31.805 23.847 14.705 1.00 91.52 O +HETATM 8850 O HOH C 390 13.284 23.497 24.353 1.00 85.22 O +HETATM 8851 O HOH C 391 -35.158 16.403 25.343 1.00 72.99 O +HETATM 8852 O HOH C 392 -23.554 30.703 29.951 1.00 90.80 O +HETATM 8853 O HOH C 393 -25.242 13.396 33.615 1.00 78.60 O +HETATM 8854 O HOH C 394 -29.518 14.901 32.717 1.00 82.68 O +HETATM 8855 O HOH C 395 -25.906 15.999 35.382 1.00 81.24 O +HETATM 8856 O HOH C 396 2.367 33.332 27.520 1.00 36.76 O +HETATM 8857 O HOH C 397 -20.954 34.469 -19.029 1.00 70.41 O +HETATM 8858 O HOH C 398 0.021 52.404 -4.799 1.00 88.57 O +HETATM 8859 O HOH C 399 1.527 48.964 -4.235 1.00 55.80 O +HETATM 8860 O HOH C 400 -16.775 6.855 1.121 1.00 86.24 O +HETATM 8861 O HOH C 401 12.643 48.173 1.109 1.00 78.59 O +HETATM 8862 O HOH C 402 1.371 31.356 3.243 1.00 46.32 O +HETATM 8863 O HOH C 403 -16.106 40.437 -2.965 1.00 49.45 O +HETATM 8864 O HOH C 404 -21.026 17.530 4.129 1.00 55.27 O +HETATM 8865 O HOH C 405 -8.605 -1.394 7.080 1.00 78.89 O +HETATM 8866 O HOH C 406 5.487 47.165 7.173 1.00 62.49 O +HETATM 8867 O HOH C 407 -36.371 10.664 7.160 1.00 84.93 O +HETATM 8868 O HOH C 408 -6.112 55.117 -8.713 1.00 61.22 O +HETATM 8869 O HOH C 409 -21.954 -2.984 9.526 1.00 77.29 O +HETATM 8870 O HOH C 410 8.137 45.705 9.997 1.00 80.12 O +HETATM 8871 O HOH C 411 -30.032 21.474 13.226 1.00 71.58 O +HETATM 8872 O HOH C 412 -22.522 39.003 14.025 1.00 54.53 O +HETATM 8873 O HOH C 413 12.374 44.044 12.625 1.00 80.50 O +HETATM 8874 O HOH C 414 -17.242 0.037 14.692 1.00 55.16 O +HETATM 8875 O HOH C 415 -35.267 29.195 14.451 1.00 82.42 O +HETATM 8876 O HOH C 416 1.309 28.743 15.291 1.00 46.62 O +HETATM 8877 O HOH C 417 3.668 7.790 16.090 1.00 80.64 O +HETATM 8878 O HOH C 418 -32.967 24.801 12.528 1.00 84.33 O +HETATM 8879 O HOH C 419 -33.268 10.146 21.762 1.00 67.92 O +HETATM 8880 O HOH C 420 -29.981 16.259 28.726 1.00 85.38 O +HETATM 8881 O HOH C 421 4.126 31.041 38.008 1.00 61.78 O +HETATM 8882 O HOH C 422 -12.694 11.519 42.964 1.00 78.83 O +HETATM 8883 O HOH C 423 6.925 47.186 14.739 1.00 72.44 O +HETATM 8884 O HOH B 338 49.345 23.009 22.413 1.00 67.14 O +HETATM 8885 O HOH B 339 9.353 -2.345 -4.758 1.00 72.56 O +HETATM 8886 O HOH B 340 26.001 5.349 -3.302 1.00 42.05 O +HETATM 8887 O HOH B 341 18.644 -6.942 -1.377 1.00 55.88 O +HETATM 8888 O HOH B 342 10.706 11.305 0.538 1.00 51.60 O +HETATM 8889 O HOH B 343 22.501 -8.546 2.403 1.00 62.60 O +HETATM 8890 O HOH B 344 28.320 -4.253 1.570 1.00 53.34 O +HETATM 8891 O HOH B 345 16.096 -1.260 1.334 1.00 70.89 O +HETATM 8892 O HOH B 346 26.509 -7.279 2.600 1.00 78.11 O +HETATM 8893 O HOH B 347 27.102 -2.002 2.236 1.00 56.60 O +HETATM 8894 O HOH B 348 14.332 2.777 2.360 1.00 65.17 O +HETATM 8895 O HOH B 349 25.330 -8.759 4.832 1.00 60.88 O +HETATM 8896 O HOH B 350 12.312 3.995 5.223 1.00 77.28 O +HETATM 8897 O HOH B 351 3.294 -1.447 8.087 1.00 80.37 O +HETATM 8898 O HOH B 352 10.735 1.854 8.171 1.00 46.52 O +HETATM 8899 O HOH B 353 18.026 2.913 8.316 1.00 38.52 O +HETATM 8900 O HOH B 354 10.923 4.559 9.366 1.00 60.50 O +HETATM 8901 O HOH B 355 9.222 1.309 10.558 1.00 55.00 O +HETATM 8902 O HOH B 356 37.614 10.371 9.821 1.00 54.72 O +HETATM 8903 O HOH B 357 35.373 7.501 11.821 1.00 40.30 O +HETATM 8904 O HOH B 358 14.098 -21.067 17.507 1.00 76.07 O +HETATM 8905 O HOH B 359 33.113 -19.754 17.414 1.00 64.81 O +HETATM 8906 O HOH B 360 30.187 20.013 17.011 1.00 62.82 O +HETATM 8907 O HOH B 361 38.312 -15.172 18.337 1.00 61.94 O +HETATM 8908 O HOH B 362 44.745 -14.848 18.348 1.00 66.24 O +HETATM 8909 O HOH B 363 39.383 4.957 17.827 1.00 58.70 O +HETATM 8910 O HOH B 364 37.252 -21.604 19.730 1.00 70.01 O +HETATM 8911 O HOH B 365 13.228 10.341 17.685 1.00 72.60 O +HETATM 8912 O HOH B 366 20.233 12.596 19.431 1.00 48.01 O +HETATM 8913 O HOH B 367 35.246 -24.587 20.143 1.00 77.97 O +HETATM 8914 O HOH B 368 12.123 9.368 20.028 1.00 54.16 O +HETATM 8915 O HOH B 369 21.555 12.034 21.625 1.00 49.91 O +HETATM 8916 O HOH B 370 41.656 -21.476 21.343 1.00 72.78 O +HETATM 8917 O HOH B 371 17.722 13.499 20.430 1.00 84.84 O +HETATM 8918 O HOH B 372 39.459 2.226 22.544 1.00 47.67 O +HETATM 8919 O HOH B 373 21.013 8.653 23.367 1.00 51.51 O +HETATM 8920 O HOH B 374 30.322 21.088 22.971 1.00 60.34 O +HETATM 8921 O HOH B 375 44.084 3.319 21.482 1.00 71.94 O +HETATM 8922 O HOH B 376 43.386 23.902 24.438 1.00 75.26 O +HETATM 8923 O HOH B 377 49.979 -15.444 25.387 1.00 72.43 O +HETATM 8924 O HOH B 378 50.310 -11.301 26.980 1.00 63.94 O +HETATM 8925 O HOH B 379 15.787 -6.801 26.083 1.00 80.66 O +HETATM 8926 O HOH B 380 24.604 -1.817 26.870 1.00 27.07 O +HETATM 8927 O HOH B 381 14.858 0.468 26.371 1.00 70.21 O +HETATM 8928 O HOH B 382 38.410 -28.875 28.645 1.00 77.72 O +HETATM 8929 O HOH B 383 19.113 -9.723 28.390 1.00 77.35 O +HETATM 8930 O HOH B 384 17.736 -13.939 29.578 1.00 59.77 O +HETATM 8931 O HOH B 385 37.975 -24.915 29.733 1.00 75.50 O +HETATM 8932 O HOH B 386 32.375 -15.816 30.105 1.00 54.78 O +HETATM 8933 O HOH B 387 33.458 8.923 30.613 1.00 42.99 O +HETATM 8934 O HOH B 388 16.955 -14.313 34.108 1.00 74.72 O +HETATM 8935 O HOH B 389 17.464 -3.069 33.243 1.00 48.01 O +HETATM 8936 O HOH B 390 25.866 2.631 32.767 1.00 37.84 O +HETATM 8937 O HOH B 391 15.740 -30.956 38.978 1.00 71.18 O +HETATM 8938 O HOH B 392 30.430 -23.449 38.043 1.00 84.31 O +HETATM 8939 O HOH B 393 40.031 -9.648 38.201 1.00 67.76 O +HETATM 8940 O HOH B 394 17.161 9.818 39.646 1.00 59.59 O +HETATM 8941 O HOH B 395 17.854 -29.497 43.156 1.00 60.39 O +HETATM 8942 O HOH B 396 23.496 6.842 41.793 1.00 64.32 O +HETATM 8943 O HOH B 397 30.519 7.126 43.494 1.00 66.62 O +HETATM 8944 O HOH B 398 32.622 -5.109 43.893 1.00 58.34 O +HETATM 8945 O HOH B 399 26.468 3.135 43.597 1.00 64.92 O +HETATM 8946 O HOH B 400 39.149 5.591 44.122 1.00 65.96 O +HETATM 8947 O HOH B 401 45.893 -11.289 48.807 1.00 93.66 O +HETATM 8948 O HOH B 402 35.203 4.752 48.082 1.00 66.72 O +HETATM 8949 O HOH B 403 31.194 2.487 50.978 1.00 64.77 O +HETATM 8950 O HOH B 404 30.438 -5.398 0.471 1.00 71.84 O +HETATM 8951 O HOH B 405 29.181 -6.751 2.276 1.00 80.25 O +HETATM 8952 O HOH B 406 14.197 -2.993 2.729 1.00 76.00 O +HETATM 8953 O HOH B 407 10.753 11.940 3.206 1.00 42.85 O +HETATM 8954 O HOH B 408 14.431 4.770 4.084 1.00 52.58 O +HETATM 8955 O HOH B 409 20.987 -26.339 11.945 1.00 74.98 O +HETATM 8956 O HOH B 410 40.121 6.182 14.009 1.00 74.53 O +HETATM 8957 O HOH B 411 47.167 -15.383 16.726 1.00 68.85 O +HETATM 8958 O HOH B 412 40.060 0.002 16.120 1.00 48.38 O +HETATM 8959 O HOH B 413 37.751 -27.029 17.377 1.00 78.28 O +HETATM 8960 O HOH B 414 36.207 -15.596 16.836 1.00 66.01 O +HETATM 8961 O HOH B 415 14.369 -19.433 19.728 1.00 74.52 O +HETATM 8962 O HOH B 416 50.307 -15.764 17.766 1.00 72.43 O +HETATM 8963 O HOH B 417 40.417 -0.323 18.653 1.00 61.21 O +HETATM 8964 O HOH B 418 39.287 3.580 20.212 1.00 51.27 O +HETATM 8965 O HOH B 419 9.955 7.592 20.708 1.00 73.06 O +HETATM 8966 O HOH B 420 30.987 -27.247 22.146 1.00 71.31 O +HETATM 8967 O HOH B 421 17.061 18.490 21.445 1.00 70.25 O +HETATM 8968 O HOH B 422 12.309 -4.083 21.005 1.00 69.39 O +HETATM 8969 O HOH B 423 47.386 0.359 23.470 1.00 83.22 O +HETATM 8970 O HOH B 424 50.000 -14.454 27.754 1.00 59.11 O +HETATM 8971 O HOH B 425 16.358 -4.896 28.071 1.00 83.31 O +HETATM 8972 O HOH B 426 37.551 16.361 26.876 1.00 63.06 O +HETATM 8973 O HOH B 427 15.666 -8.957 29.176 1.00 91.56 O +HETATM 8974 O HOH B 428 18.767 -33.278 33.436 1.00 88.61 O +HETATM 8975 O HOH B 429 32.836 -14.384 32.154 1.00 53.71 O +HETATM 8976 O HOH B 430 28.953 13.186 32.692 1.00 59.52 O +HETATM 8977 O HOH B 431 28.406 -26.381 34.096 1.00 79.43 O +HETATM 8978 O HOH B 432 15.466 24.246 35.001 1.00 66.45 O +HETATM 8979 O HOH B 433 15.933 -32.846 36.039 1.00 90.75 O +HETATM 8980 O HOH B 434 11.982 -30.715 36.441 1.00 69.27 O +HETATM 8981 O HOH B 435 33.463 -24.639 37.480 1.00 72.55 O +HETATM 8982 O HOH B 436 20.934 6.151 43.057 1.00 72.97 O +HETATM 8983 O HOH B 437 30.955 -22.438 46.354 1.00 68.77 O +HETATM 8984 O HOH B 438 9.282 3.685 6.074 1.00 76.71 O +HETATM 8985 O HOH B 439 10.516 6.040 6.092 1.00 77.20 O +HETATM 8986 O HOH B 440 35.850 23.429 14.874 1.00 56.37 O +HETATM 8987 O HOH B 441 11.898 -19.840 15.699 1.00 68.13 O +HETATM 8988 O HOH B 442 39.546 25.089 18.043 1.00 86.01 O +HETATM 8989 O HOH B 443 50.295 -14.792 30.483 1.00 84.67 O +HETATM 8990 O HOH B 444 25.848 -7.110 27.278 1.00 42.99 O +HETATM 8991 O HOH B 445 51.532 -7.697 27.760 1.00 89.28 O +HETATM 8992 O HOH B 446 48.733 -2.076 28.424 1.00 81.65 O +HETATM 8993 O HOH B 447 30.828 14.141 28.409 1.00 62.23 O +HETATM 8994 O HOH B 448 43.901 -17.657 30.821 1.00 68.07 O +HETATM 8995 O HOH B 449 26.703 15.510 32.260 1.00 67.83 O +HETATM 8996 O HOH B 450 40.175 -13.757 40.510 1.00 64.68 O +HETATM 8997 O HOH B 451 31.277 -7.686 -0.975 1.00 81.37 O +HETATM 8998 O HOH B 452 18.277 -1.408 -0.650 1.00 57.24 O +HETATM 8999 O HOH B 453 46.982 -3.836 16.742 1.00 73.24 O +HETATM 9000 O HOH B 454 44.372 2.216 18.276 1.00 68.21 O +HETATM 9001 O HOH B 455 49.035 0.903 18.051 1.00 80.72 O +HETATM 9002 O HOH B 456 12.005 1.800 20.533 1.00 70.76 O +HETATM 9003 O HOH B 457 13.429 18.745 21.438 1.00 81.09 O +HETATM 9004 O HOH B 458 19.090 -12.565 31.857 1.00 64.90 O +HETATM 9005 O HOH B 459 31.285 -25.103 35.487 1.00 79.58 O +HETATM 9006 O HOH B 460 27.446 -34.504 37.027 1.00 79.98 O +HETATM 9007 O HOH B 461 34.940 -22.432 37.019 1.00 72.39 O +HETATM 9008 O HOH B 462 24.024 10.364 38.045 1.00 68.50 O +HETATM 9009 O HOH B 463 29.735 -18.394 40.321 1.00 75.49 O +HETATM 9010 O HOH B 464 32.857 9.199 42.766 1.00 86.90 O +HETATM 9011 O HOH B 465 21.065 9.117 43.419 1.00 75.58 O +HETATM 9012 O HOH B 466 44.830 9.116 42.689 1.00 66.80 O +HETATM 9013 O HOH B 467 24.215 8.356 44.039 1.00 74.04 O +HETATM 9014 O HOH B 468 42.041 4.215 48.727 1.00 82.65 O +HETATM 9015 O HOH B 469 42.395 8.747 47.954 1.00 69.19 O +HETATM 9016 O HOH B 470 37.889 8.210 53.162 1.00 75.62 O +HETATM 9017 O HOH B 471 29.561 -24.777 44.703 1.00 76.67 O +HETATM 9018 O HOH B 472 33.000 -24.318 47.815 1.00 71.81 O +HETATM 9019 O HOH B 473 10.668 -1.445 -2.745 1.00 84.29 O +HETATM 9020 O HOH B 474 18.760 -7.855 1.095 1.00 67.01 O +HETATM 9021 O HOH B 475 27.221 -10.195 1.257 1.00 80.80 O +HETATM 9022 O HOH B 476 32.478 -11.324 2.202 1.00 69.68 O +HETATM 9023 O HOH B 477 43.210 -3.189 11.330 1.00 61.53 O +HETATM 9024 O HOH B 478 20.065 -25.766 15.015 1.00 90.94 O +HETATM 9025 O HOH B 479 36.955 -14.146 12.660 1.00 72.12 O +HETATM 9026 O HOH B 480 24.374 -21.020 13.786 1.00 73.07 O +HETATM 9027 O HOH B 481 39.705 24.310 15.185 1.00 84.00 O +HETATM 9028 O HOH B 482 11.033 -21.948 14.410 1.00 76.30 O +HETATM 9029 O HOH B 483 22.278 -26.661 16.587 1.00 73.24 O +HETATM 9030 O HOH B 484 38.613 -24.343 15.714 1.00 86.89 O +HETATM 9031 O HOH B 485 21.818 -23.536 16.316 1.00 85.44 O +HETATM 9032 O HOH B 486 23.674 7.182 15.664 1.00 32.21 O +HETATM 9033 O HOH B 487 42.793 -23.481 20.097 1.00 75.14 O +HETATM 9034 O HOH B 488 44.771 0.061 21.296 1.00 88.45 O +HETATM 9035 O HOH B 489 42.593 -0.179 19.778 1.00 60.78 O +HETATM 9036 O HOH B 490 31.929 23.182 19.224 1.00 76.50 O +HETATM 9037 O HOH B 491 47.090 -0.340 19.456 1.00 81.70 O +HETATM 9038 O HOH B 492 47.253 -7.995 20.711 1.00 71.17 O +HETATM 9039 O HOH B 493 46.067 1.362 27.215 1.00 62.13 O +HETATM 9040 O HOH B 494 44.901 -23.946 25.297 1.00 80.41 O +HETATM 9041 O HOH B 495 28.702 24.849 25.535 1.00 74.63 O +HETATM 9042 O HOH B 496 41.525 -26.840 28.366 1.00 88.66 O +HETATM 9043 O HOH B 497 19.666 -1.763 28.706 1.00 57.30 O +HETATM 9044 O HOH B 498 18.299 -14.555 36.418 1.00 60.63 O +HETATM 9045 O HOH B 499 31.090 7.537 36.636 1.00 71.93 O +HETATM 9046 O HOH D 254 6.581 16.085 -27.660 1.00 68.98 O +HETATM 9047 O HOH D 255 8.940 20.557 -27.161 1.00 45.52 O +HETATM 9048 O HOH D 256 0.377 20.863 -26.139 1.00 35.99 O +HETATM 9049 O HOH D 257 5.279 13.789 -25.232 1.00 73.75 O +HETATM 9050 O HOH D 258 8.071 24.900 -24.396 1.00 46.52 O +HETATM 9051 O HOH D 259 -6.603 20.551 -23.707 1.00 53.17 O +HETATM 9052 O HOH D 260 17.641 22.175 -24.816 1.00 91.25 O +HETATM 9053 O HOH D 261 12.860 25.679 -22.821 1.00 71.39 O +HETATM 9054 O HOH D 262 -2.450 13.808 -22.733 1.00 45.52 O +HETATM 9055 O HOH D 263 4.063 26.434 -22.517 1.00 50.72 O +HETATM 9056 O HOH D 264 -2.732 34.406 -22.412 1.00 67.29 O +HETATM 9057 O HOH D 265 20.325 22.002 -24.454 1.00 59.90 O +HETATM 9058 O HOH D 266 11.776 27.384 -20.969 1.00 59.94 O +HETATM 9059 O HOH D 267 -8.668 18.004 -17.090 1.00 54.96 O +HETATM 9060 O HOH D 268 1.140 33.972 -18.458 1.00 47.66 O +HETATM 9061 O HOH D 269 -9.045 38.703 -18.285 1.00 49.50 O +HETATM 9062 O HOH D 270 7.349 34.732 -17.866 1.00 77.15 O +HETATM 9063 O HOH D 271 26.073 25.780 -17.187 1.00 70.07 O +HETATM 9064 O HOH D 272 -14.723 30.661 -16.169 1.00 71.66 O +HETATM 9065 O HOH D 273 5.484 33.011 -16.660 1.00 56.05 O +HETATM 9066 O HOH D 274 25.097 22.399 -13.477 1.00 69.94 O +HETATM 9067 O HOH D 275 18.431 35.280 -16.301 1.00 64.66 O +HETATM 9068 O HOH D 276 15.067 33.296 -11.720 1.00 34.41 O +HETATM 9069 O HOH D 277 24.449 24.901 -9.969 1.00 57.01 O +HETATM 9070 O HOH D 278 13.218 35.316 -10.701 1.00 49.89 O +HETATM 9071 O HOH D 279 27.755 20.763 -8.998 1.00 56.04 O +HETATM 9072 O HOH D 280 33.260 14.893 -8.547 1.00 40.58 O +HETATM 9073 O HOH D 281 19.421 30.997 -8.448 1.00 42.84 O +HETATM 9074 O HOH D 282 29.763 5.010 -7.687 1.00 59.83 O +HETATM 9075 O HOH D 283 44.267 14.547 -4.427 1.00 79.97 O +HETATM 9076 O HOH D 284 -2.218 14.117 -8.208 1.00 32.95 O +HETATM 9077 O HOH D 285 -5.391 28.847 -8.036 1.00 52.88 O +HETATM 9078 O HOH D 286 38.152 3.500 -7.379 1.00 78.39 O +HETATM 9079 O HOH D 287 -19.067 23.415 -6.917 1.00 67.48 O +HETATM 9080 O HOH D 288 20.605 31.270 -6.004 1.00 36.99 O +HETATM 9081 O HOH D 289 -5.903 32.453 -6.767 1.00 49.81 O +HETATM 9082 O HOH D 290 -1.291 32.239 -6.165 1.00 28.65 O +HETATM 9083 O HOH D 291 12.488 35.395 -5.913 1.00 34.63 O +HETATM 9084 O HOH D 292 -0.144 10.063 -5.253 1.00 51.34 O +HETATM 9085 O HOH D 293 38.042 12.632 -5.702 1.00 65.09 O +HETATM 9086 O HOH D 294 -11.415 19.228 -5.392 1.00 36.29 O +HETATM 9087 O HOH D 295 -22.348 30.632 -5.165 1.00 52.50 O +HETATM 9088 O HOH D 296 25.827 11.203 -4.999 1.00 49.59 O +HETATM 9089 O HOH D 297 1.826 22.999 -4.470 1.00 37.53 O +HETATM 9090 O HOH D 298 5.152 22.670 -4.745 1.00 38.47 O +HETATM 9091 O HOH D 299 7.534 12.126 -4.301 1.00 73.89 O +HETATM 9092 O HOH D 300 -5.674 21.367 -3.888 1.00 38.68 O +HETATM 9093 O HOH D 301 35.353 11.062 -3.065 1.00 30.35 O +HETATM 9094 O HOH D 302 10.785 19.216 -2.890 1.00 23.72 O +HETATM 9095 O HOH D 303 19.739 34.021 -3.030 1.00 53.04 O +HETATM 9096 O HOH D 304 13.454 37.253 -1.971 1.00 40.94 O +HETATM 9097 O HOH D 305 -0.435 44.238 -19.936 1.00 71.00 O +HETATM 9098 O HOH D 306 -1.697 3.682 -1.798 1.00 77.81 O +HETATM 9099 O HOH D 307 17.749 16.251 -1.603 1.00 22.19 O +HETATM 9100 O HOH D 308 7.582 -1.296 -0.673 1.00 88.26 O +HETATM 9101 O HOH D 309 20.369 36.007 -1.151 1.00 70.72 O +HETATM 9102 O HOH D 310 -4.154 9.051 -0.349 1.00 64.01 O +HETATM 9103 O HOH D 311 -1.863 10.438 0.085 1.00 78.93 O +HETATM 9104 O HOH D 312 41.137 14.687 0.540 1.00 45.94 O +HETATM 9105 O HOH D 313 17.756 32.590 0.151 1.00 36.24 O +HETATM 9106 O HOH D 314 17.180 34.796 -1.219 1.00 58.79 O +HETATM 9107 O HOH D 315 26.128 35.126 0.000 1.00 47.32 O +HETATM 9108 O HOH D 316 6.965 22.206 0.959 1.00 42.12 O +HETATM 9109 O HOH D 317 -0.337 24.418 0.438 1.00 57.91 O +HETATM 9110 O HOH D 318 39.046 0.595 1.925 1.00 61.80 O +HETATM 9111 O HOH D 319 15.963 12.296 2.733 1.00 17.15 O +HETATM 9112 O HOH D 320 9.388 21.882 2.188 1.00 33.85 O +HETATM 9113 O HOH D 321 16.356 32.157 2.300 1.00 51.06 O +HETATM 9114 O HOH D 322 20.303 33.446 0.956 1.00 55.19 O +HETATM 9115 O HOH D 323 39.902 2.296 4.217 1.00 70.41 O +HETATM 9116 O HOH D 324 9.038 14.172 2.626 1.00 39.38 O +HETATM 9117 O HOH D 325 13.064 12.705 3.730 1.00 31.82 O +HETATM 9118 O HOH D 326 39.331 16.277 3.767 1.00 47.33 O +HETATM 9119 O HOH D 327 12.376 20.776 3.830 1.00 28.89 O +HETATM 9120 O HOH D 328 18.398 32.427 4.335 1.00 41.37 O +HETATM 9121 O HOH D 329 34.392 -5.495 4.371 1.00 56.66 O +HETATM 9122 O HOH D 330 37.414 21.840 4.302 1.00 61.68 O +HETATM 9123 O HOH D 331 10.597 22.809 4.365 1.00 35.23 O +HETATM 9124 O HOH D 332 36.372 -3.614 5.099 1.00 66.52 O +HETATM 9125 O HOH D 333 36.629 13.096 5.491 1.00 35.55 O +HETATM 9126 O HOH D 334 9.076 28.993 5.294 1.00 13.62 O +HETATM 9127 O HOH D 335 8.499 35.472 5.192 1.00 57.62 O +HETATM 9128 O HOH D 336 13.572 12.203 6.555 1.00 37.08 O +HETATM 9129 O HOH D 337 12.803 19.437 6.323 1.00 18.72 O +HETATM 9130 O HOH D 338 38.088 19.197 5.852 1.00 69.02 O +HETATM 9131 O HOH D 339 36.213 21.209 6.314 1.00 61.33 O +HETATM 9132 O HOH D 340 13.698 31.898 5.926 1.00 41.52 O +HETATM 9133 O HOH D 341 27.493 13.847 5.753 1.00 38.27 O +HETATM 9134 O HOH D 342 28.969 28.574 -6.748 1.00 40.12 O +HETATM 9135 O HOH D 343 -5.802 -2.178 7.711 1.00 81.63 O +HETATM 9136 O HOH D 344 8.510 27.203 8.562 1.00 62.35 O +HETATM 9137 O HOH D 345 9.447 18.751 9.022 1.00 64.60 O +HETATM 9138 O HOH D 346 19.356 32.524 9.165 1.00 44.10 O +HETATM 9139 O HOH D 347 26.904 28.201 10.084 1.00 28.42 O +HETATM 9140 O HOH D 348 15.490 16.684 10.918 1.00 45.00 O +HETATM 9141 O HOH D 349 12.267 19.830 12.951 1.00 55.66 O +HETATM 9142 O HOH D 350 19.515 19.040 12.406 1.00 35.14 O +HETATM 9143 O HOH D 351 13.259 16.890 13.195 1.00 58.30 O +HETATM 9144 O HOH D 352 27.601 17.424 13.209 1.00 52.39 O +HETATM 9145 O HOH D 353 29.168 20.944 12.941 1.00 50.15 O +HETATM 9146 O HOH D 354 13.203 26.312 13.294 1.00 48.76 O +HETATM 9147 O HOH D 355 22.073 14.531 17.855 1.00 30.59 O +HETATM 9148 O HOH D 356 22.485 15.258 -19.935 1.00 59.56 O +HETATM 9149 O HOH D 357 -1.814 14.187 -26.384 1.00 70.70 O +HETATM 9150 O HOH D 358 -10.574 18.622 -24.974 1.00 80.31 O +HETATM 9151 O HOH D 359 -3.996 32.124 -22.721 1.00 77.57 O +HETATM 9152 O HOH D 360 5.682 48.008 -22.546 1.00 79.58 O +HETATM 9153 O HOH D 361 -4.820 12.605 -21.832 1.00 54.78 O +HETATM 9154 O HOH D 362 -11.420 27.532 -20.807 1.00 51.99 O +HETATM 9155 O HOH D 363 -9.976 33.708 -19.987 1.00 73.19 O +HETATM 9156 O HOH D 364 -11.559 31.307 -19.501 1.00 58.20 O +HETATM 9157 O HOH D 365 -2.806 -7.112 -18.646 1.00 75.47 O +HETATM 9158 O HOH D 366 8.143 -2.829 -15.920 1.00 72.04 O +HETATM 9159 O HOH D 367 -7.021 3.020 -16.070 1.00 71.85 O +HETATM 9160 O HOH D 368 -16.129 19.880 -15.560 1.00 60.63 O +HETATM 9161 O HOH D 369 -15.246 28.128 -14.990 1.00 59.40 O +HETATM 9162 O HOH D 370 20.510 3.903 -10.415 1.00 71.87 O +HETATM 9163 O HOH D 371 -11.560 7.415 -11.704 1.00 84.27 O +HETATM 9164 O HOH D 372 36.911 10.463 -10.871 1.00 83.30 O +HETATM 9165 O HOH D 373 35.767 8.778 -9.203 1.00 80.16 O +HETATM 9166 O HOH D 374 -2.562 5.445 -8.755 1.00 64.60 O +HETATM 9167 O HOH D 375 9.442 33.774 -8.237 1.00 23.03 O +HETATM 9168 O HOH D 376 10.709 48.259 -8.637 1.00 68.48 O +HETATM 9169 O HOH D 377 19.670 13.751 -5.095 1.00 43.54 O +HETATM 9170 O HOH D 378 -15.738 15.633 -6.398 1.00 69.45 O +HETATM 9171 O HOH D 379 -5.761 27.089 -6.210 1.00 54.15 O +HETATM 9172 O HOH D 380 9.581 42.710 -3.774 1.00 63.69 O +HETATM 9173 O HOH D 381 31.865 1.745 -3.697 1.00 58.64 O +HETATM 9174 O HOH D 382 -11.682 10.160 -1.586 1.00 63.51 O +HETATM 9175 O HOH D 383 35.187 1.022 -0.647 1.00 40.02 O +HETATM 9176 O HOH D 384 8.994 13.120 -0.614 1.00 46.41 O +HETATM 9177 O HOH D 385 37.883 2.473 -0.725 1.00 61.66 O +HETATM 9178 O HOH D 386 -4.259 5.156 -0.310 1.00 75.69 O +HETATM 9179 O HOH D 387 37.876 -1.741 3.995 1.00 65.51 O +HETATM 9180 O HOH D 388 17.026 35.186 1.591 1.00 73.64 O +HETATM 9181 O HOH D 389 42.356 14.679 -1.687 1.00 51.43 O +HETATM 9182 O HOH D 390 21.230 34.588 3.037 1.00 85.09 O +HETATM 9183 O HOH D 391 26.429 22.033 19.659 1.00 58.34 O +HETATM 9184 O HOH D 392 -5.355 25.199 -27.664 1.00 55.68 O +HETATM 9185 O HOH D 393 4.522 14.544 3.663 1.00 63.60 O +HETATM 9186 O HOH D 394 38.843 15.242 6.181 1.00 70.58 O +HETATM 9187 O HOH D 395 16.367 34.787 6.223 1.00 71.97 O +HETATM 9188 O HOH D 396 6.502 18.328 8.531 1.00 60.52 O +HETATM 9189 O HOH D 397 17.206 30.269 10.537 1.00 47.49 O +HETATM 9190 O HOH D 398 0.075 49.853 -20.203 1.00 72.97 O +HETATM 9191 O HOH D 399 15.327 -0.171 -9.959 1.00 71.33 O +HETATM 9192 O HOH D 400 17.799 5.798 -9.627 1.00 79.77 O +HETATM 9193 O HOH D 401 39.137 12.939 -11.169 1.00 76.27 O +HETATM 9194 O HOH D 402 -18.706 18.383 -11.042 1.00 86.62 O +HETATM 9195 O HOH D 403 7.316 44.655 -8.392 1.00 73.54 O +HETATM 9196 O HOH D 404 26.801 24.757 -8.010 1.00 62.41 O +HETATM 9197 O HOH D 405 34.179 6.742 -6.787 1.00 80.79 O +HETATM 9198 O HOH D 406 17.289 32.377 -7.912 1.00 33.52 O +HETATM 9199 O HOH D 407 -3.311 50.053 -8.930 1.00 74.19 O +HETATM 9200 O HOH D 408 45.889 16.910 8.408 1.00 77.75 O +HETATM 9201 O HOH D 409 -2.229 28.599 -7.486 1.00 29.47 O +HETATM 9202 O HOH D 410 7.176 48.021 -10.446 1.00111.81 O +HETATM 9203 O HOH D 411 -18.692 26.329 -6.428 1.00 56.20 O +HETATM 9204 O HOH D 412 -20.903 17.606 -5.622 1.00 89.64 O +HETATM 9205 O HOH D 413 15.993 32.026 -5.761 1.00 19.14 O +HETATM 9206 O HOH D 414 10.025 38.841 -5.246 1.00 42.90 O +HETATM 9207 O HOH D 415 -12.060 9.487 -5.153 1.00 86.41 O +HETATM 9208 O HOH D 416 -11.169 13.162 -4.925 1.00 82.28 O +HETATM 9209 O HOH D 417 0.782 4.444 -0.991 1.00 79.76 O +HETATM 9210 O HOH D 418 43.973 -0.344 -0.480 1.00 78.64 O +HETATM 9211 O HOH D 419 26.517 33.201 2.537 1.00 43.45 O +HETATM 9212 O HOH D 420 26.273 22.867 17.145 1.00 82.74 O +HETATM 9213 O HOH D 421 26.367 14.199 -19.254 1.00 54.91 O +HETATM 9214 O HOH D 422 1.959 14.474 -29.752 1.00 72.33 O +HETATM 9215 O HOH D 423 1.897 44.905 -27.573 1.00 65.35 O +HETATM 9216 O HOH D 424 -9.421 14.730 -25.905 1.00 71.79 O +HETATM 9217 O HOH D 425 -13.301 18.634 -23.608 1.00 67.11 O +HETATM 9218 O HOH D 426 9.615 50.787 -23.635 1.00 72.09 O +HETATM 9219 O HOH D 427 -8.777 37.875 -21.065 1.00 96.40 O +HETATM 9220 O HOH D 428 8.645 48.700 -22.153 1.00 75.05 O +HETATM 9221 O HOH D 429 4.454 28.740 -17.629 1.00 29.29 O +HETATM 9222 O HOH D 430 -3.974 -8.253 -20.894 1.00 87.09 O +HETATM 9223 O HOH D 431 -22.450 34.586 -2.248 1.00 69.16 O +HETATM 9224 O HOH D 432 -9.971 -3.525 -19.295 1.00 68.66 O +HETATM 9225 O HOH D 433 1.477 -10.775 -17.840 1.00 80.07 O +HETATM 9226 O HOH D 434 -0.934 -8.992 -18.420 1.00101.24 O +HETATM 9227 O HOH D 435 -3.507 -10.791 -16.076 1.00 79.16 O +HETATM 9228 O HOH D 436 -0.442 -7.143 -15.937 1.00 76.43 O +HETATM 9229 O HOH D 437 16.744 33.321 -14.098 1.00 59.07 O +HETATM 9230 O HOH D 438 37.027 14.034 -14.305 1.00 81.90 O +HETATM 9231 O HOH D 439 26.508 19.099 -12.689 1.00 73.04 O +HETATM 9232 O HOH D 440 -15.926 17.863 -11.973 1.00 75.42 O +HETATM 9233 O HOH D 441 -14.100 8.822 -7.020 1.00 62.48 O +HETATM 9234 O HOH D 442 -13.632 13.260 -5.713 1.00 92.01 O +HETATM 9235 O HOH D 443 15.959 34.543 -4.947 1.00 49.31 O +HETATM 9236 O HOH D 444 0.148 12.625 -3.673 1.00 60.73 O +HETATM 9237 O HOH D 445 -16.627 13.110 -3.722 1.00 80.26 O +HETATM 9238 O HOH D 446 9.790 40.199 -2.845 1.00 69.79 O +HETATM 9239 O HOH D 447 35.833 7.070 -2.641 1.00 41.53 O +HETATM 9240 O HOH D 448 40.132 15.710 -2.860 1.00 43.91 O +HETATM 9241 O HOH D 449 12.424 42.753 -3.447 1.00 71.42 O +HETATM 9242 O HOH D 450 11.036 36.197 -2.012 1.00 37.42 O +HETATM 9243 O HOH D 451 13.892 40.286 -2.423 1.00 79.82 O +HETATM 9244 O HOH D 452 -2.702 0.878 -1.924 1.00 83.17 O +HETATM 9245 O HOH D 453 41.189 0.542 0.444 1.00 82.44 O +HETATM 9246 O HOH D 454 -0.827 11.520 2.787 1.00 88.03 O +HETATM 9247 O HOH D 455 -5.433 -3.517 3.399 1.00 85.89 O +HETATM 9248 O HOH D 456 12.470 12.318 13.109 1.00 63.58 O +HETATM 9249 O HOH D 457 12.121 23.941 13.420 1.00 72.44 O +HETATM 9250 O HOH D 458 16.664 16.780 14.970 1.00 49.26 O +HETATM 9251 O HOH D 459 27.306 25.699 19.618 1.00 75.57 O +HETATM 9252 O HOH D 460 20.976 25.074 -23.835 1.00 71.36 O +HETATM 9253 O HOH D 461 30.679 13.476 -17.336 1.00 85.11 O +MASTER 615 0 0 51 22 0 0 6 9249 4 0 92 +END diff --git a/test/jalview/io/AnnotatedPDBFileInputTest.java b/test/jalview/io/AnnotatedPDBFileInputTest.java index c472576..3524a88 100644 --- a/test/jalview/io/AnnotatedPDBFileInputTest.java +++ b/test/jalview/io/AnnotatedPDBFileInputTest.java @@ -31,6 +31,7 @@ import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; +import jalview.structure.StructureImportSettings; import java.io.File; @@ -65,6 +66,7 @@ public class AnnotatedPDBFileInputTest al = af.getViewport().getAlignment(); pdbId = al.getSequenceAt(0).getDatasetSequence().getAllPDBEntries() .get(0).getId(); + StructureImportSettings.setCurrentDefaultFormat("PDB"); } @Test(groups = { "Functional" }) @@ -180,7 +182,7 @@ public class AnnotatedPDBFileInputTest /** * @throws java.lang.Exception */ - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { jalview.gui.Desktop.instance.closeAll_actionPerformed(null); diff --git a/test/jalview/io/FeaturesFileTest.java b/test/jalview/io/FeaturesFileTest.java index 385e049..2f5d0c5 100644 --- a/test/jalview/io/FeaturesFileTest.java +++ b/test/jalview/io/FeaturesFileTest.java @@ -26,14 +26,14 @@ import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; +import jalview.api.FeatureColourI; +import jalview.api.FeatureRenderer; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceDummy; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; -import jalview.schemes.AnnotationColourGradient; -import jalview.schemes.GraduatedColor; import java.awt.Color; import java.io.File; @@ -53,7 +53,7 @@ public class FeaturesFileTest File f = new File("examples/uniref50.fa"); AlignmentI al = readAlignmentFile(f); AlignFrame af = new AlignFrame(al, 500, 500); - Map colours = af.getFeatureRenderer() + Map colours = af.getFeatureRenderer() .getFeatureColours(); FeaturesFile featuresFile = new FeaturesFile( "examples/exampleFeatures.txt", FormatAdapter.FILE); @@ -67,61 +67,71 @@ public class FeaturesFileTest */ colours = af.getFeatureRenderer().getFeatureColours(); assertEquals("26 feature group colours not found", 26, colours.size()); - assertEquals(colours.get("Cath"), new Color(0x93b1d1)); - assertEquals(colours.get("ASX-MOTIF"), new Color(0x6addbb)); + assertEquals(colours.get("Cath").getColour(), new Color(0x93b1d1)); + assertEquals(colours.get("ASX-MOTIF").getColour(), new Color(0x6addbb)); /* * verify (some) features on sequences */ SequenceFeature[] sfs = al.getSequenceAt(0).getDatasetSequence() .getSequenceFeatures(); // FER_CAPAA - assertEquals(7, sfs.length); + assertEquals(8, sfs.length); SequenceFeature sf = sfs[0]; + assertEquals("Pfam family%LINK%", sf.description); + assertEquals(0, sf.begin); + assertEquals(0, sf.end); + assertEquals("uniprot", sf.featureGroup); + assertEquals("Pfam", sf.type); + assertEquals(1, sf.links.size()); + assertEquals("Pfam family|http://pfam.xfam.org/family/PF00111", + sf.links.get(0)); + + sf = sfs[1]; assertEquals("Iron-sulfur (2Fe-2S)", sf.description); assertEquals(39, sf.begin); assertEquals(39, sf.end); assertEquals("uniprot", sf.featureGroup); assertEquals("METAL", sf.type); - sf = sfs[1]; + sf = sfs[2]; assertEquals("Iron-sulfur (2Fe-2S)", sf.description); assertEquals(44, sf.begin); assertEquals(44, sf.end); assertEquals("uniprot", sf.featureGroup); assertEquals("METAL", sf.type); - sf = sfs[2]; + sf = sfs[3]; assertEquals("Iron-sulfur (2Fe-2S)", sf.description); assertEquals(47, sf.begin); assertEquals(47, sf.end); assertEquals("uniprot", sf.featureGroup); assertEquals("METAL", sf.type); - sf = sfs[3]; + sf = sfs[4]; assertEquals("Iron-sulfur (2Fe-2S)", sf.description); assertEquals(77, sf.begin); assertEquals(77, sf.end); assertEquals("uniprot", sf.featureGroup); assertEquals("METAL", sf.type); - sf = sfs[4]; + sf = sfs[5]; assertEquals("Fer2 Status: True Positive Pfam 8_8%LINK%", sf.description); - assertEquals("Pfam 8_8|http://pfam.sanger.ac.uk/family/PF00111", - sf.links.get(0).toString()); + assertEquals("Pfam 8_8|http://pfam.xfam.org/family/PF00111", + sf.links.get(0)); assertEquals(8, sf.begin); assertEquals(83, sf.end); assertEquals("uniprot", sf.featureGroup); assertEquals("Pfam", sf.type); - sf = sfs[5]; + sf = sfs[6]; assertEquals("Ferredoxin_fold Status: True Positive ", sf.description); assertEquals(3, sf.begin); assertEquals(93, sf.end); assertEquals("uniprot", sf.featureGroup); assertEquals("Cath", sf.type); - sf = sfs[6]; + sf = sfs[7]; assertEquals( "High confidence server. Only hits with scores over 0.8 are reported. PHOSPHORYLATION (T) 89_8%LINK%", sf.description); assertEquals( "PHOSPHORYLATION (T) 89_8|http://www.cbs.dtu.dk/cgi-bin/proview/webface-link?seqid=P83527&service=NetPhos-2.0", - sf.links.get(0).toString()); + sf.links.get(0)); assertEquals(89, sf.begin); assertEquals(89, sf.end); assertEquals("netphos", sf.featureGroup); @@ -140,7 +150,7 @@ public class FeaturesFileTest File f = new File("examples/uniref50.fa"); AlignmentI al = readAlignmentFile(f); AlignFrame af = new AlignFrame(al, 500, 500); - Map colours = af.getFeatureRenderer() + Map colours = af.getFeatureRenderer() .getFeatureColours(); // GFF2 uses space as name/value separator in column 9 String gffData = "METAL\tcc9900\n" + "GFF\n" @@ -154,7 +164,7 @@ public class FeaturesFileTest // verify colours read or synthesized colours = af.getFeatureRenderer().getFeatureColours(); assertEquals("1 feature group colours not found", 1, colours.size()); - assertEquals(colours.get("METAL"), new Color(0xcc9900)); + assertEquals(colours.get("METAL").getColour(), new Color(0xcc9900)); // verify feature on FER_CAPAA SequenceFeature[] sfs = al.getSequenceAt(0).getDatasetSequence() @@ -195,45 +205,6 @@ public class FeaturesFileTest } /** - * Test various ways of describing a feature colour scheme - * - * @throws Exception - */ - @Test(groups = { "Functional" }) - public void testParseGraduatedColourScheme() throws Exception - { - FeaturesFile ff = new FeaturesFile(); - - // colour by label: - GraduatedColor gc = ff.parseGraduatedColourScheme( - "BETA-TURN-IR\t9a6a94", "label"); - assertTrue(gc.isColourByLabel()); - assertEquals(Color.white, gc.getMinColor()); - assertEquals(Color.black, gc.getMaxColor()); - assertTrue(gc.isAutoScale()); - - // using colour name, rgb, etc: - String spec = "blue|255,0,255|absolute|20.0|95.0|below|66.0"; - gc = ff.parseGraduatedColourScheme("BETA-TURN-IR\t" + spec, spec); - assertFalse(gc.isColourByLabel()); - assertEquals(Color.blue, gc.getMinColor()); - assertEquals(new Color(255, 0, 255), gc.getMaxColor()); - assertFalse(gc.isAutoScale()); - assertFalse(gc.getTolow()); - assertEquals(20.0f, gc.getMin(), 0.001f); - assertEquals(95.0f, gc.getMax(), 0.001f); - assertEquals(AnnotationColourGradient.BELOW_THRESHOLD, - gc.getThreshType()); - assertEquals(66.0f, gc.getThresh(), 0.001f); - - // inverse gradient high to low: - spec = "blue|255,0,255|95.0|20.0|below|66.0"; - gc = ff.parseGraduatedColourScheme("BETA-TURN-IR\t" + spec, spec); - assertTrue(gc.isAutoScale()); - assertTrue(gc.getTolow()); - } - - /** * Test parsing a features file with GFF formatted content only * * @throws Exception @@ -244,7 +215,7 @@ public class FeaturesFileTest File f = new File("examples/uniref50.fa"); AlignmentI al = readAlignmentFile(f); AlignFrame af = new AlignFrame(al, 500, 500); - Map colours = af.getFeatureRenderer() + Map colours = af.getFeatureRenderer() .getFeatureColours(); // GFF3 uses '=' separator for name/value pairs in colum 9 String gffData = "##gff-version 3\n" @@ -296,7 +267,7 @@ public class FeaturesFileTest File f = new File("examples/uniref50.fa"); AlignmentI al = readAlignmentFile(f); AlignFrame af = new AlignFrame(al, 500, 500); - Map colours = af.getFeatureRenderer() + Map colours = af.getFeatureRenderer() .getFeatureColours(); /* @@ -412,4 +383,73 @@ public class FeaturesFileTest parseResult); checkDatasetfromSimpleGff3(dataset); } + + @Test(groups = { "Functional" }) + public void testPrintJalviewFormat() throws Exception + { + File f = new File("examples/uniref50.fa"); + AlignmentI al = readAlignmentFile(f); + AlignFrame af = new AlignFrame(al, 500, 500); + Map colours = af.getFeatureRenderer() + .getFeatureColours(); + String features = "METAL\tcc9900\n" + + "GAMMA-TURN\tred|0,255,255|20.0|95.0|below|66.0\n" + + "Pfam\tred\n" + + "STARTGROUP\tuniprot\n" + + "Iron\tFER_CAPAA\t-1\t39\t39\tMETAL\n" + + "Turn\tFER_CAPAA\t-1\t36\t38\tGAMMA-TURN\n" + + "Pfam domainPfam_3_4\tFER_CAPAA\t-1\t20\t20\tPfam\n" + + "ENDGROUP\tuniprot\n"; + FeaturesFile featuresFile = new FeaturesFile(features, + FormatAdapter.PASTE); + featuresFile.parse(al.getDataset(), colours, false); + + /* + * first with no features displayed + */ + FeatureRenderer fr = af.alignPanel.getFeatureRenderer(); + Map visible = fr + .getDisplayedFeatureCols(); + String exported = featuresFile.printJalviewFormat( + al.getSequencesArray(), visible); + String expected = "No Features Visible"; + assertEquals(expected, exported); + + /* + * set METAL (in uniprot group) and GAMMA-TURN visible, but not Pfam + */ + fr.setVisible("METAL"); + fr.setVisible("GAMMA-TURN"); + visible = fr.getDisplayedFeatureCols(); + exported = featuresFile.printJalviewFormat(al.getSequencesArray(), + visible); + expected = "METAL\tcc9900\n" + + "GAMMA-TURN\tff0000|00ffff|20.0|95.0|below|66.0\n" + + "\nSTARTGROUP\tuniprot\n" + + "Iron\tFER_CAPAA\t-1\t39\t39\tMETAL\t0.0\n" + + "Turn\tFER_CAPAA\t-1\t36\t38\tGAMMA-TURN\t0.0\n" + + "ENDGROUP\tuniprot\n"; + assertEquals(expected, exported); + + /* + * now set Pfam visible + */ + fr.setVisible("Pfam"); + visible = fr.getDisplayedFeatureCols(); + exported = featuresFile.printJalviewFormat(al.getSequencesArray(), + visible); + /* + * note the order of feature types is uncontrolled - derives from + * FeaturesDisplayed.featuresDisplayed which is a HashSet + */ + expected = "METAL\tcc9900\n" + + "Pfam\tff0000\n" + + "GAMMA-TURN\tff0000|00ffff|20.0|95.0|below|66.0\n" + + "\nSTARTGROUP\tuniprot\n" + + "Iron\tFER_CAPAA\t-1\t39\t39\tMETAL\t0.0\n" + + "Turn\tFER_CAPAA\t-1\t36\t38\tGAMMA-TURN\t0.0\n" + + "Pfam domainPfam_3_4\tFER_CAPAA\t-1\t20\t20\tPfam\t0.0\n" + + "ENDGROUP\tuniprot\n"; + assertEquals(expected, exported); + } } diff --git a/test/jalview/io/FileIOTester.java b/test/jalview/io/FileIOTester.java index cde1cbc..2eb3703 100644 --- a/test/jalview/io/FileIOTester.java +++ b/test/jalview/io/FileIOTester.java @@ -46,7 +46,7 @@ public class FileIOTester /** * @throws java.lang.Exception */ - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { } diff --git a/test/jalview/io/IdentifyFileTest.java b/test/jalview/io/IdentifyFileTest.java index b1efb7a..c00cf06 100644 --- a/test/jalview/io/IdentifyFileTest.java +++ b/test/jalview/io/IdentifyFileTest.java @@ -20,6 +20,7 @@ */ package jalview.io; +import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; @@ -41,24 +42,34 @@ public class IdentifyFileTest } /** - * Additional tests for (a) Jalview features file with no colour - * specifications (old style 'groups' file) and (b) Jalview features file with - * embedded GFF + * Additional tests for Jalview features file */ @Test(groups = "Functional") public void testIdentify_featureFile() { IdentifyFile ider = new IdentifyFile(); - // Jalview format with features only, no feature colours + /* + * Jalview format with features only, no feature colours + */ String data = "Iron-sulfur (2Fe-2S)\tFER_CAPAA\t-1\t39\t39\tMETAL\n" + "Iron-phosphorus (2Fe-P)\tID_NOT_SPECIFIED\t2\t86\t87\tMETALLIC\n"; - Assert.assertEquals(IdentifyFile.FeaturesFile, ider.identify(data, AppletFormatAdapter.PASTE)); + assertEquals(IdentifyFile.FeaturesFile, + ider.identify(data, AppletFormatAdapter.PASTE)); - // Jalview feature colour followed by GFF format feature data + /* + * Jalview feature colour followed by GFF format feature data + */ data = "METAL\tcc9900\n" + "GFF\n" + "FER_CAPAA\tuniprot\tMETAL\t44\t45\t4.0\t.\t.\n"; - Assert.assertEquals(IdentifyFile.FeaturesFile, + assertEquals(IdentifyFile.FeaturesFile, + ider.identify(data, AppletFormatAdapter.PASTE)); + + /* + * Feature with '<' in the name (JAL-2098) + */ + data = "kD < 3\tred\n" + "Low kD\tFER_CAPAA\t-1\t39\t39\tkD < 3\n"; + assertEquals(IdentifyFile.FeaturesFile, ider.identify(data, AppletFormatAdapter.PASTE)); } diff --git a/test/jalview/io/JSONFileTest.java b/test/jalview/io/JSONFileTest.java index d327134..93fb12b 100644 --- a/test/jalview/io/JSONFileTest.java +++ b/test/jalview/io/JSONFileTest.java @@ -262,7 +262,7 @@ public class JSONFileTest passedCount = 0; } - @AfterTest + @AfterTest(alwaysRun = true) public void tearDown() throws Exception { testJsonFile = null; diff --git a/test/jalview/io/Jalview2xmlTests.java b/test/jalview/io/Jalview2xmlTests.java index b58a8a6..38153df 100644 --- a/test/jalview/io/Jalview2xmlTests.java +++ b/test/jalview/io/Jalview2xmlTests.java @@ -20,13 +20,20 @@ */ package jalview.io; +import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertSame; import static org.testng.AssertJUnit.assertTrue; +import jalview.api.AlignViewportI; import jalview.api.AlignmentViewPanel; import jalview.api.ViewStyleI; import jalview.bin.Cache; import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.HiddenSequences; +import jalview.datamodel.SequenceCollectionI; import jalview.datamodel.SequenceGroup; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; @@ -34,8 +41,13 @@ import jalview.gui.Desktop; import jalview.gui.Jalview2XML; import jalview.schemes.AnnotationColourGradient; import jalview.schemes.ColourSchemeI; +import jalview.viewmodel.AlignmentViewport; import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.testng.Assert; import org.testng.AssertJUnit; @@ -43,6 +55,7 @@ import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +@Test(singleThreaded = true) public class Jalview2xmlTests { @@ -59,14 +72,13 @@ public class Jalview2xmlTests /** * @throws java.lang.Exception */ - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { jalview.gui.Desktop.instance.closeAll_actionPerformed(null); - } - public int countDsAnn(jalview.viewmodel.AlignmentViewport avp) + int countDsAnn(jalview.viewmodel.AlignmentViewport avp) { int numdsann = 0; for (SequenceI sq : avp.getAlignment().getDataset().getSequences()) @@ -358,7 +370,7 @@ public class Jalview2xmlTests * * @throws Exception */ - @Test(groups = { "Functional" }, enabled = false) + @Test(groups = { "Functional" }, enabled = true) public void testStoreAndRecoverExpandedviews() throws Exception { AlignFrame af = new jalview.io.FileLoader().LoadFileWaitTillLoaded( @@ -413,6 +425,85 @@ public class Jalview2xmlTests Desktop.getAlignmentPanels(af.getViewport().getSequenceSetId()).length); } + /** + * Test save and reload of a project with a different representative sequence + * in each view. + * + * @throws Exception + */ + @Test(groups = { "Functional" }) + public void testStoreAndRecoverReferenceSeqSettings() throws Exception + { + Desktop.instance.closeAll_actionPerformed(null); + AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( + "examples/exampleFile_2_7.jar", FormatAdapter.FILE); + assertTrue("Didn't read in the example file correctly.", af != null); + String afid = af.getViewport().getSequenceSetId(); + + // remember reference sequence for each panel + Map refseqs = new HashMap(); + + /* + * mark sequence 2, 3, 4.. in panels 1, 2, 3... + * as reference sequence for itself and the preceding sequence + */ + int n = 1; + for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) + { + AlignViewportI av = ap.getAlignViewport(); + AlignmentI alignment = ap.getAlignment(); + int repIndex = n % alignment.getHeight(); + SequenceI rep = alignment.getSequenceAt(repIndex); + refseqs.put(ap.getViewName(), rep); + + // code from mark/unmark sequence as reference in jalview.gui.PopupMenu + // todo refactor this to an alignment view controller + av.setDisplayReferenceSeq(true); + av.setColourByReferenceSeq(true); + av.getAlignment().setSeqrep(rep); + + n++; + } + File tfile = File.createTempFile("testStoreAndRecoverReferenceSeq", + ".jvp"); + try + { + new Jalview2XML(false).saveState(tfile); + } catch (Throwable e) + { + Assert.fail("Didn't save the expanded view state", e); + } + Desktop.instance.closeAll_actionPerformed(null); + if (Desktop.getAlignFrames() != null) + { + Assert.assertEquals(Desktop.getAlignFrames().length, 0); + } + + af = new FileLoader().LoadFileWaitTillLoaded( + tfile.getAbsolutePath(), FormatAdapter.FILE); + afid = af.getViewport().getSequenceSetId(); + + for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) + { + // check representative + AlignmentI alignment = ap.getAlignment(); + SequenceI rep = alignment.getSeqrep(); + Assert.assertNotNull(rep, + "Couldn't restore sequence representative from project"); + // can't use a strong equals here, because by definition, the sequence IDs + // will be different. + // could set vamsas session save/restore flag to preserve IDs across + // load/saves. + Assert.assertEquals(refseqs.get(ap.getViewName()).toString(), + rep.toString(), + "Representative wasn't the same when recovered."); + Assert.assertTrue(ap.getAlignViewport().isDisplayReferenceSeq(), + "Display reference sequence view setting not set."); + Assert.assertTrue(ap.getAlignViewport().isColourByReferenceSeq(), + "Colour By Reference Seq view setting not set."); + } + } + @Test(groups = { "Functional" }) public void testIsVersionStringLaterThan() { @@ -422,6 +513,7 @@ public class Jalview2xmlTests */ assertTrue(Jalview2XML.isVersionStringLaterThan(null, null)); assertTrue(Jalview2XML.isVersionStringLaterThan("2.8.3", null)); + assertTrue(Jalview2XML.isVersionStringLaterThan(null, "2.8.3")); assertTrue(Jalview2XML.isVersionStringLaterThan(null, "Development Build")); assertTrue(Jalview2XML.isVersionStringLaterThan(null, @@ -465,4 +557,126 @@ public class Jalview2xmlTests assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.3", "2.8.2b1")); assertFalse(Jalview2XML.isVersionStringLaterThan("2.8.0b2", "2.8.0b1")); } + + /** + * Test save and reload of a project with a different sequence group (and + * representative sequence) in each view. + * + * @throws Exception + */ + @Test(groups = { "Functional" }) + public void testStoreAndRecoverGroupRepSeqs() throws Exception + { + Desktop.instance.closeAll_actionPerformed(null); + AlignFrame af = new FileLoader().LoadFileWaitTillLoaded( + "examples/uniref50.fa", FormatAdapter.FILE); + assertTrue("Didn't read in the example file correctly.", af != null); + String afid = af.getViewport().getSequenceSetId(); + // make a second view of the alignment + af.newView_actionPerformed(null); + + /* + * remember representative and hidden sequences marked + * on each panel + */ + Map repSeqs = new HashMap(); + Map> hiddenSeqNames = new HashMap>(); + + /* + * mark sequence 2, 3, 4.. in panels 1, 2, 3... + * as reference sequence for itself and the preceding sequence + */ + int n = 1; + for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) + { + AlignViewportI av = ap.getAlignViewport(); + AlignmentI alignment = ap.getAlignment(); + int repIndex = n % alignment.getHeight(); + // ensure at least one preceding sequence i.e. index >= 1 + repIndex = Math.max(repIndex, 1); + SequenceI repSeq = alignment.getSequenceAt(repIndex); + repSeqs.put(ap.getViewName(), repSeq); + List hiddenNames = new ArrayList(); + hiddenSeqNames.put(ap.getViewName(), hiddenNames); + + /* + * have rep sequence represent itself and the one before it + * this hides the group (except for the rep seq) + */ + SequenceGroup sg = new SequenceGroup(); + sg.addSequence(repSeq, false); + SequenceI precedingSeq = alignment.getSequenceAt(repIndex - 1); + sg.addSequence(precedingSeq, false); + sg.setSeqrep(repSeq); + assertTrue(sg.getSequences().contains(repSeq)); + assertTrue(sg.getSequences().contains(precedingSeq)); + av.setSelectionGroup(sg); + assertSame(repSeq, sg.getSeqrep()); + + /* + * represent group with sequence adds to a map of hidden rep sequences + * (it does not create a group on the alignment) + */ + ((AlignmentViewport) av).hideSequences(repSeq, true); + assertSame(repSeq, sg.getSeqrep()); + assertTrue(sg.getSequences().contains(repSeq)); + assertTrue(sg.getSequences().contains(precedingSeq)); + assertTrue("alignment has groups", alignment.getGroups().isEmpty()); + Map hiddenRepSeqsMap = av.getHiddenRepSequences(); + assertNotNull(hiddenRepSeqsMap); + assertEquals(1, hiddenRepSeqsMap.size()); + assertSame(sg, hiddenRepSeqsMap.get(repSeq)); + assertTrue(alignment.getHiddenSequences().isHidden(precedingSeq)); + assertFalse(alignment.getHiddenSequences().isHidden(repSeq)); + hiddenNames.add(precedingSeq.getName()); + + n++; + } + File tfile = File + .createTempFile("testStoreAndRecoverGroupReps", + ".jvp"); + try + { + new Jalview2XML(false).saveState(tfile); + } catch (Throwable e) + { + Assert.fail("Didn't save the expanded view state", e); + } + Desktop.instance.closeAll_actionPerformed(null); + if (Desktop.getAlignFrames() != null) + { + Assert.assertEquals(Desktop.getAlignFrames().length, 0); + } + + af = new FileLoader().LoadFileWaitTillLoaded( + tfile.getAbsolutePath(), FormatAdapter.FILE); + afid = af.getViewport().getSequenceSetId(); + + for (AlignmentViewPanel ap : Desktop.getAlignmentPanels(afid)) + { + String viewName = ap.getViewName(); + AlignViewportI av = ap.getAlignViewport(); + AlignmentI alignment = ap.getAlignment(); + List groups = alignment.getGroups(); + assertNotNull(groups); + assertTrue("Alignment has groups", groups.isEmpty()); + Map hiddenRepSeqsMap = av + .getHiddenRepSequences(); + assertNotNull("No hidden represented sequences", hiddenRepSeqsMap); + assertEquals(1, hiddenRepSeqsMap.size()); + assertEquals(repSeqs.get(viewName).getDisplayId(true), + hiddenRepSeqsMap.keySet().iterator().next() + .getDisplayId(true)); + + /* + * verify hidden sequences in restored panel + */ + List hidden = hiddenSeqNames.get(ap.getViewName()); + HiddenSequences hs = alignment.getHiddenSequences(); + assertEquals( + "wrong number of restored hidden sequences in " + + ap.getViewName(), + hidden.size(), hs.getSize()); + } + } } diff --git a/test/jalview/io/JalviewExportPropertiesTests.java b/test/jalview/io/JalviewExportPropertiesTests.java index ab3d9df..164c259 100644 --- a/test/jalview/io/JalviewExportPropertiesTests.java +++ b/test/jalview/io/JalviewExportPropertiesTests.java @@ -52,7 +52,7 @@ public class JalviewExportPropertiesTests /** * @throws java.lang.Exception */ - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { jalview.gui.Desktop.instance.closeAll_actionPerformed(null); diff --git a/test/jalview/io/NewickFileTests.java b/test/jalview/io/NewickFileTests.java index d8e21c4..f89f58b 100644 --- a/test/jalview/io/NewickFileTests.java +++ b/test/jalview/io/NewickFileTests.java @@ -172,7 +172,7 @@ public class NewickFileTests /** * @throws java.lang.Exception */ - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { } diff --git a/test/jalview/io/RNAMLfileTest.java b/test/jalview/io/RNAMLfileTest.java index d41446b..c084792 100644 --- a/test/jalview/io/RNAMLfileTest.java +++ b/test/jalview/io/RNAMLfileTest.java @@ -34,7 +34,7 @@ public class RNAMLfileTest { } - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { } diff --git a/test/jalview/schemes/FeatureColourTest.java b/test/jalview/schemes/FeatureColourTest.java new file mode 100644 index 0000000..e13f542 --- /dev/null +++ b/test/jalview/schemes/FeatureColourTest.java @@ -0,0 +1,344 @@ +package jalview.schemes; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertTrue; +import static org.testng.AssertJUnit.fail; + +import jalview.datamodel.SequenceFeature; +import jalview.util.Format; + +import java.awt.Color; + +import org.testng.annotations.Test; + +public class FeatureColourTest +{ + @Test(groups = { "Functional" }) + public void testCopyConstructor() + { + /* + * plain colour + */ + FeatureColour fc = new FeatureColour(Color.RED); + FeatureColour fc1 = new FeatureColour(fc); + assertTrue(fc1.getColour().equals(Color.RED)); + assertFalse(fc1.isGraduatedColour()); + assertFalse(fc1.isColourByLabel()); + + /* + * min-max colour + */ + fc = new FeatureColour(Color.gray, Color.black, 10f, 20f); + fc.setAboveThreshold(true); + fc.setThreshold(12f); + fc1 = new FeatureColour(fc); + assertTrue(fc1.isGraduatedColour()); + assertFalse(fc1.isColourByLabel()); + assertTrue(fc1.isAboveThreshold()); + assertEquals(12f, fc1.getThreshold()); + assertEquals(Color.gray, fc1.getMinColour()); + assertEquals(Color.black, fc1.getMaxColour()); + assertEquals(10f, fc1.getMin()); + assertEquals(20f, fc1.getMax()); + + /* + * colour by label + */ + fc = new FeatureColour(); + fc.setColourByLabel(true); + fc1 = new FeatureColour(fc); + assertTrue(fc1.isColourByLabel()); + assertFalse(fc1.isGraduatedColour()); + } + + @Test(groups = { "Functional" }) + public void testIsColored_simpleColour() + { + FeatureColour fc = new FeatureColour(Color.RED); + assertTrue(fc.isColored(new SequenceFeature())); + } + + @Test(groups = { "Functional" }) + public void testIsColored_colourByLabel() + { + FeatureColour fc = new FeatureColour(); + fc.setColourByLabel(true); + assertTrue(fc.isColored(new SequenceFeature())); + } + + @Test(groups = { "Functional" }) + public void testIsColored_aboveThreshold() + { + // graduated colour range from score 20 to 100 + FeatureColour fc = new FeatureColour(Color.WHITE, Color.BLACK, 20f, + 100f); + + // score 0 is adjusted to bottom of range + SequenceFeature sf = new SequenceFeature("type", "desc", 0, 20, 0f, + null); + assertTrue(fc.isColored(sf)); + assertEquals(Color.WHITE, fc.getColor(sf)); + + // score 120 is adjusted to top of range + sf.setScore(120f); + assertEquals(Color.BLACK, fc.getColor(sf)); + + // value below threshold is still rendered + // setting threshold has no effect yet... + fc.setThreshold(60f); + sf.setScore(36f); + assertTrue(fc.isColored(sf)); + assertEquals(new Color(204, 204, 204), fc.getColor(sf)); + + // now apply threshold: + fc.setAboveThreshold(true); + assertFalse(fc.isColored(sf)); + // colour is still returned though ?!? + assertEquals(new Color(204, 204, 204), fc.getColor(sf)); + + sf.setScore(84); // above threshold now + assertTrue(fc.isColored(sf)); + assertEquals(new Color(51, 51, 51), fc.getColor(sf)); + } + + @Test(groups = { "Functional" }) + public void testGetColor_simpleColour() + { + FeatureColour fc = new FeatureColour(Color.RED); + assertEquals(Color.RED, fc.getColor(new SequenceFeature())); + } + + @Test(groups = { "Functional" }) + public void testGetColor_colourByLabel() + { + FeatureColour fc = new FeatureColour(); + fc.setColourByLabel(true); + SequenceFeature sf = new SequenceFeature("type", "desc", 0, 20, 1f, + null); + Color expected = UserColourScheme.createColourFromName("desc"); + assertEquals(expected, fc.getColor(sf)); + } + + @Test(groups = { "Functional" }) + public void testGetColor_Graduated() + { + // graduated colour from score 0 to 100, gray(128, 128, 128) to red(255, 0, 0) + FeatureColour fc = new FeatureColour(Color.GRAY, Color.RED, 0f, 100f); + // feature score is 75 which is 3/4 of the way from GRAY to RED + SequenceFeature sf = new SequenceFeature("type", "desc", 0, 20, 75f, + null); + // the colour gradient is computed in float values from 0-1 (where 1 == 255) + float red = 128 / 255f + 3 / 4f * (255 - 128) / 255f; + float green = 128 / 255f + 3 / 4f * (0 - 128) / 255f; + float blue = 128 / 255f + 3 / 4f * (0 - 128) / 255f; + Color expected = new Color(red, green, blue); + assertEquals(expected, fc.getColor(sf)); + } + + @Test(groups = { "Functional" }) + public void testGetColor_belowThreshold() + { + // gradient from [50, 150] from WHITE(255, 255, 255) to BLACK(0, 0, 0) + FeatureColour fc = new FeatureColour(Color.WHITE, Color.BLACK, 50f, + 150f); + SequenceFeature sf = new SequenceFeature("type", "desc", 0, 20, 70f, + null); + fc.setThreshold(100f); // ignore for now + assertTrue(fc.isColored(sf)); + assertEquals(new Color(204, 204, 204), fc.getColor(sf)); + + fc.setAboveThreshold(true); // feature lies below threshold + assertFalse(fc.isColored(sf)); + assertEquals(new Color(204, 204, 204), fc.getColor(sf)); + } + + /** + * Test output of feature colours to Jalview features file format + */ + @Test(groups = { "Functional" }) + public void testToJalviewFormat() + { + /* + * plain colour - to RGB hex code + */ + FeatureColour fc = new FeatureColour(Color.RED); + String redHex = Format.getHexString(Color.RED); + String hexColour = redHex; + assertEquals("domain\t" + hexColour, fc.toJalviewFormat("domain")); + + /* + * colour by label (no threshold) + */ + fc = new FeatureColour(); + fc.setColourByLabel(true); + assertEquals("domain\tlabel", fc.toJalviewFormat("domain")); + + /* + * colour by label (autoscaled) (an odd state you can reach by selecting + * 'above threshold', then deselecting 'threshold is min/max' then 'colour + * by label') + */ + fc.setAutoScaled(true); + assertEquals("domain\tlabel", fc.toJalviewFormat("domain")); + + /* + * colour by label (above threshold) (min/max values are output though not + * used by this scheme) + */ + fc.setAutoScaled(false); + fc.setThreshold(12.5f); + fc.setAboveThreshold(true); + assertEquals("domain\tlabel|||0.0|0.0|above|12.5", + fc.toJalviewFormat("domain")); + + /* + * colour by label (below threshold) + */ + fc.setBelowThreshold(true); + assertEquals("domain\tlabel|||0.0|0.0|below|12.5", + fc.toJalviewFormat("domain")); + + /* + * graduated colour, no threshold + */ + fc = new FeatureColour(Color.GREEN, Color.RED, 12f, 25f); + String greenHex = Format.getHexString(Color.GREEN); + String expected = String.format("domain\t%s|%s|abso|12.0|25.0|none", + greenHex, redHex); + assertEquals(expected, fc.toJalviewFormat("domain")); + + /* + * colour ranges over the actual score ranges (not min/max) + */ + fc.setAutoScaled(true); + expected = String.format("domain\t%s|%s|12.0|25.0|none", greenHex, + redHex); + assertEquals(expected, fc.toJalviewFormat("domain")); + + /* + * graduated colour below threshold + */ + fc.setThreshold(12.5f); + fc.setBelowThreshold(true); + expected = String.format("domain\t%s|%s|12.0|25.0|below|12.5", + greenHex, redHex); + assertEquals(expected, fc.toJalviewFormat("domain")); + + /* + * graduated colour above threshold + */ + fc.setThreshold(12.5f); + fc.setAboveThreshold(true); + fc.setAutoScaled(false); + expected = String.format("domain\t%s|%s|abso|12.0|25.0|above|12.5", + greenHex, redHex); + assertEquals(expected, fc.toJalviewFormat("domain")); + } + + /** + * Test parsing of feature colours from Jalview features file format + */ + @Test(groups = { "Functional" }) + public void testParseJalviewFeatureColour() + { + /* + * simple colour by name + */ + FeatureColour fc = FeatureColour.parseJalviewFeatureColour("red"); + assertTrue(fc.isSimpleColour()); + assertEquals(Color.RED, fc.getColour()); + + /* + * simple colour by hex code + */ + fc = FeatureColour.parseJalviewFeatureColour(Format + .getHexString(Color.RED)); + assertTrue(fc.isSimpleColour()); + assertEquals(Color.RED, fc.getColour()); + + /* + * simple colour by rgb triplet + */ + fc = FeatureColour.parseJalviewFeatureColour("255,0,0"); + assertTrue(fc.isSimpleColour()); + assertEquals(Color.RED, fc.getColour()); + + /* + * malformed colour + */ + try + { + fc = FeatureColour.parseJalviewFeatureColour("oops"); + fail("expected exception"); + } catch (IllegalArgumentException e) + { + assertEquals("Invalid colour descriptor: oops", e.getMessage()); + } + + /* + * colour by label (no threshold) + */ + fc = FeatureColour.parseJalviewFeatureColour("label"); + assertTrue(fc.isColourByLabel()); + assertFalse(fc.hasThreshold()); + + /* + * colour by label (with threshold) + */ + fc = FeatureColour + .parseJalviewFeatureColour("label|||0.0|0.0|above|12.0"); + assertTrue(fc.isColourByLabel()); + assertTrue(fc.isAboveThreshold()); + assertEquals(12.0f, fc.getThreshold()); + + /* + * graduated colour (by name) (no threshold) + */ + fc = FeatureColour.parseJalviewFeatureColour("red|green|10.0|20.0"); + assertTrue(fc.isGraduatedColour()); + assertFalse(fc.hasThreshold()); + assertEquals(Color.RED, fc.getMinColour()); + assertEquals(Color.GREEN, fc.getMaxColour()); + assertEquals(10f, fc.getMin()); + assertEquals(20f, fc.getMax()); + assertTrue(fc.isAutoScaled()); + + /* + * graduated colour (by hex code) (above threshold) + */ + String descriptor = String.format("%s|%s|10.0|20.0|above|15", + Format.getHexString(Color.RED), + Format.getHexString(Color.GREEN)); + fc = FeatureColour.parseJalviewFeatureColour(descriptor); + assertTrue(fc.isGraduatedColour()); + assertTrue(fc.hasThreshold()); + assertTrue(fc.isAboveThreshold()); + assertEquals(15f, fc.getThreshold()); + assertEquals(Color.RED, fc.getMinColour()); + assertEquals(Color.GREEN, fc.getMaxColour()); + assertEquals(10f, fc.getMin()); + assertEquals(20f, fc.getMax()); + assertTrue(fc.isAutoScaled()); + + /* + * graduated colour (by RGB triplet) (below threshold), absolute scale + */ + descriptor = String.format("255,0,0|0,255,0|abso|10.0|20.0|below|15"); + fc = FeatureColour.parseJalviewFeatureColour(descriptor); + assertTrue(fc.isGraduatedColour()); + assertFalse(fc.isAutoScaled()); + assertTrue(fc.hasThreshold()); + assertTrue(fc.isBelowThreshold()); + assertEquals(15f, fc.getThreshold()); + assertEquals(Color.RED, fc.getMinColour()); + assertEquals(Color.GREEN, fc.getMaxColour()); + assertEquals(10f, fc.getMin()); + assertEquals(20f, fc.getMax()); + + descriptor = String + .format("blue|255,0,255|absolute|20.0|95.0|below|66.0"); + fc = FeatureColour.parseJalviewFeatureColour(descriptor); + assertTrue(fc.isGraduatedColour()); + } +} diff --git a/test/jalview/schemes/UserColourSchemeTest.java b/test/jalview/schemes/UserColourSchemeTest.java new file mode 100644 index 0000000..e524cb4 --- /dev/null +++ b/test/jalview/schemes/UserColourSchemeTest.java @@ -0,0 +1,50 @@ +package jalview.schemes; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.assertSame; + +import java.awt.Color; + +import org.testng.annotations.Test; +public class UserColourSchemeTest +{ + + @Test(groups = "Functional") + public void testGetColourFromString() + { + /* + * by colour name - if known to AWT, and included in + * + * @see ColourSchemeProperty.getAWTColorFromName() + */ + assertSame(Color.RED, UserColourScheme.getColourFromString("red")); + assertSame(Color.RED, UserColourScheme.getColourFromString("Red")); + assertSame(Color.RED, UserColourScheme.getColourFromString(" RED ")); + + /* + * by RGB hex code + */ + String hexColour = Integer.toHexString(Color.RED.getRGB() & 0xffffff); + assertEquals(Color.RED, UserColourScheme.getColourFromString(hexColour)); + // 'hex' prefixes _not_ wanted here + assertNull(UserColourScheme.getColourFromString("0x" + hexColour)); + assertNull(UserColourScheme.getColourFromString("#" + hexColour)); + + /* + * by RGB triplet + */ + String rgb = String.format("%d,%d,%d", Color.red.getRed(), + Color.red.getGreen(), Color.red.getBlue()); + assertEquals(Color.RED, UserColourScheme.getColourFromString(rgb)); + + /* + * odds and ends + */ + assertNull(UserColourScheme.getColourFromString(null)); + assertNull(UserColourScheme.getColourFromString("rubbish")); + assertEquals(Color.WHITE, UserColourScheme.getColourFromString("-1")); + assertNull(UserColourScheme.getColourFromString(String + .valueOf(Integer.MAX_VALUE))); + } +} diff --git a/test/jalview/structure/Mapping.java b/test/jalview/structure/Mapping.java index 8674ed8..5ab43b5 100644 --- a/test/jalview/structure/Mapping.java +++ b/test/jalview/structure/Mapping.java @@ -250,7 +250,7 @@ public class Mapping @Test(groups = { "Functional" }) public void compareTransferredToRefPDBAnnot() throws Exception { - StructureViewSettings.setShowSeqFeatures(true); + StructureImportSettings.setShowSeqFeatures(true); AlignFrame ref = new FileLoader(false) .LoadFileWaitTillLoaded("test/jalview/ext/jmol/1QCF.pdb", jalview.io.FormatAdapter.FILE); diff --git a/test/jalview/structure/StructureSelectionManagerTest.java b/test/jalview/structure/StructureSelectionManagerTest.java index 999d158..2074fb4 100644 --- a/test/jalview/structure/StructureSelectionManagerTest.java +++ b/test/jalview/structure/StructureSelectionManagerTest.java @@ -29,6 +29,7 @@ import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; import jalview.io.FormatAdapter; import jalview.io.StructureFile; +import jalview.util.MapList; import java.util.ArrayList; import java.util.List; @@ -43,7 +44,7 @@ public class StructureSelectionManagerTest @BeforeMethod(alwaysRun = true) public void setUp() { - StructureViewSettings.setShowSeqFeatures(true); + StructureImportSettings.setShowSeqFeatures(true); ssm = new StructureSelectionManager(); } @@ -51,7 +52,11 @@ public class StructureSelectionManagerTest public void testRegisterMapping() { AlignedCodonFrame acf1 = new AlignedCodonFrame(); + acf1.addMap(new Sequence("s1", "ttt"), new Sequence("p1", "p"), + new MapList(new int[] { 1, 3 }, new int[] { 1, 1 }, 1, 1)); AlignedCodonFrame acf2 = new AlignedCodonFrame(); + acf2.addMap(new Sequence("s2", "ttt"), new Sequence("p2", "p"), + new MapList(new int[] { 1, 3 }, new int[] { 1, 1 }, 1, 1)); ssm.registerMapping(acf1); assertEquals(1, ssm.getSequenceMappings().size()); @@ -75,8 +80,14 @@ public class StructureSelectionManagerTest public void testRegisterMappings() { AlignedCodonFrame acf1 = new AlignedCodonFrame(); + acf1.addMap(new Sequence("s1", "ttt"), new Sequence("p1", "p"), + new MapList(new int[] { 1, 3 }, new int[] { 1, 1 }, 1, 1)); AlignedCodonFrame acf2 = new AlignedCodonFrame(); + acf2.addMap(new Sequence("s2", "ttt"), new Sequence("p2", "p"), + new MapList(new int[] { 1, 3 }, new int[] { 1, 1 }, 1, 1)); AlignedCodonFrame acf3 = new AlignedCodonFrame(); + acf3.addMap(new Sequence("s3", "ttt"), new Sequence("p3", "p"), + new MapList(new int[] { 1, 3 }, new int[] { 1, 1 }, 1, 1)); List set1 = new ArrayList(); set1.add(acf1); diff --git a/test/jalview/util/DBRefUtilsTest.java b/test/jalview/util/DBRefUtilsTest.java index c5e8ef5..96935ce 100644 --- a/test/jalview/util/DBRefUtilsTest.java +++ b/test/jalview/util/DBRefUtilsTest.java @@ -33,6 +33,8 @@ import jalview.datamodel.PDBEntry; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; +import java.util.List; + import org.testng.annotations.Test; public class DBRefUtilsTest @@ -191,12 +193,13 @@ public class DBRefUtilsTest ref5.setMap(new Mapping(new MapList(new int[] { 1, 1 }, new int[] { 1, 1 }, 1, 1))); - DBRefEntry[] matches = DBRefUtils.searchRefs(new DBRefEntry[] { ref1, + List matches = DBRefUtils.searchRefs(new DBRefEntry[] { + ref1, ref2, ref3, ref4, ref5 }, target); - assertEquals(3, matches.length); - assertSame(ref1, matches[0]); - assertSame(ref2, matches[1]); - assertSame(ref5, matches[2]); + assertEquals(3, matches.size()); + assertSame(ref1, matches.get(0)); + assertSame(ref2, matches.get(1)); + assertSame(ref5, matches.get(2)); } /** @@ -224,11 +227,12 @@ public class DBRefUtilsTest new int[] { 1, 1 }, 2, 2)); ref3.setMap(map3); - DBRefEntry[] matches = DBRefUtils.searchRefs(new DBRefEntry[] { ref1, + List matches = DBRefUtils.searchRefs(new DBRefEntry[] { + ref1, ref2, ref3 }, target); - assertEquals(2, matches.length); - assertSame(ref1, matches[0]); - assertSame(ref2, matches[1]); + assertEquals(2, matches.size()); + assertSame(ref1, matches.get(0)); + assertSame(ref2, matches.get(1)); } /** @@ -249,11 +253,42 @@ public class DBRefUtilsTest ref5.setMap(new Mapping(new MapList(new int[] { 1, 1 }, new int[] { 1, 1 }, 1, 1))); - DBRefEntry[] matches = DBRefUtils.searchRefs(new DBRefEntry[] { ref1, - ref2, ref3, ref4, ref5 }, "A1234"); - assertEquals(3, matches.length); - assertSame(ref1, matches[0]); - assertSame(ref2, matches[1]); - assertSame(ref5, matches[2]); + DBRefEntry[] dbrefs = new DBRefEntry[] { ref1, + ref2, ref3, ref4, ref5 }; + List matches = DBRefUtils.searchRefs(dbrefs, "A1234"); + assertEquals(3, matches.size()); + assertSame(ref1, matches.get(0)); + assertSame(ref2, matches.get(1)); + assertSame(ref5, matches.get(2)); + } + + /** + * Test the method that searches for matches references - case when we are + * matching a reference with null (any) accession id + */ + @Test(groups = { "Functional" }) + public void testSearchRefs_wildcardAccessionid() + { + DBRefEntry target = new DBRefEntry("EMBL", "2", null); + + DBRefEntry ref1 = new DBRefEntry("EMBL", "1", "A1234"); // matches + // constructor changes embl to EMBL + DBRefEntry ref2 = new DBRefEntry("embl", "1", "A1235"); // matches + // constructor does not upper-case accession id + DBRefEntry ref3 = new DBRefEntry("EMBL", "1", "A1236"); // matches + DBRefEntry ref4 = new DBRefEntry("EMBLCDS", "1", "A1234"); // no match + // ref5 matches although it has a mapping - ignored + DBRefEntry ref5 = new DBRefEntry("EMBL", "1", "A1237"); + ref5.setMap(new Mapping(new MapList(new int[] { 1, 1 }, new int[] { 1, + 1 }, 1, 1))); + + List matches = DBRefUtils.searchRefs(new DBRefEntry[] { + ref1, + ref2, ref3, ref4, ref5 }, target); + assertEquals(4, matches.size()); + assertSame(ref1, matches.get(0)); + assertSame(ref2, matches.get(1)); + assertSame(ref3, matches.get(2)); + assertSame(ref5, matches.get(3)); } } diff --git a/test/jalview/util/DnaUtilsTest.java b/test/jalview/util/DnaUtilsTest.java new file mode 100644 index 0000000..fbc95ad --- /dev/null +++ b/test/jalview/util/DnaUtilsTest.java @@ -0,0 +1,150 @@ +package jalview.util; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.fail; + +import java.text.ParseException; +import java.util.List; + +import org.testng.annotations.Test; + +public class DnaUtilsTest +{ + /** + * Tests for parsing an ENA/GenBank location specifier + * + * @throws ParseException + * + * @see http://www.insdc.org/files/feature_table.html#3.4 + */ + @Test(groups = { "Functional" }) + public void testParseLocation() throws ParseException + { + /* + * single locus + */ + List ranges = DnaUtils.parseLocation("467"); + assertEquals(1, ranges.size()); + assertEquals(467, ranges.get(0)[0]); + assertEquals(467, ranges.get(0)[1]); + + /* + * simple range + */ + ranges = DnaUtils.parseLocation("12..78"); + assertEquals(1, ranges.size()); + assertEquals(12, ranges.get(0)[0]); + assertEquals(78, ranges.get(0)[1]); + + /* + * join of simple ranges + */ + ranges = DnaUtils.parseLocation("join(12..78,134..202,322..345)"); + assertEquals(3, ranges.size()); + assertEquals(12, ranges.get(0)[0]); + assertEquals(78, ranges.get(0)[1]); + assertEquals(134, ranges.get(1)[0]); + assertEquals(202, ranges.get(1)[1]); + assertEquals(322, ranges.get(2)[0]); + assertEquals(345, ranges.get(2)[1]); + + /* + * complement of a simple range + */ + ranges = DnaUtils.parseLocation("complement(34..126)"); + assertEquals(1, ranges.size()); + assertEquals(126, ranges.get(0)[0]); + assertEquals(34, ranges.get(0)[1]); + + /* + * complement of a join + */ + ranges = DnaUtils + .parseLocation("complement(join(2691..4571,4918..5163))"); + assertEquals(2, ranges.size()); + assertEquals(5163, ranges.get(0)[0]); + assertEquals(4918, ranges.get(0)[1]); + assertEquals(4571, ranges.get(1)[0]); + assertEquals(2691, ranges.get(1)[1]); + + /* + * join of two complements + */ + ranges = DnaUtils + .parseLocation("join(complement(4918..5163),complement(2691..4571))"); + assertEquals(2, ranges.size()); + assertEquals(5163, ranges.get(0)[0]); + assertEquals(4918, ranges.get(0)[1]); + assertEquals(4571, ranges.get(1)[0]); + assertEquals(2691, ranges.get(1)[1]); + + /* + * join complement to non-complement + * @see http://www.ncbi.nlm.nih.gov/genbank/genomesubmit_annotation/ Transpliced Genes + */ + ranges = DnaUtils + .parseLocation("join(complement(36618..36700),86988..87064)"); + assertEquals(2, ranges.size()); + assertEquals(36700, ranges.get(0)[0]); + assertEquals(36618, ranges.get(0)[1]); + assertEquals(86988, ranges.get(1)[0]); + assertEquals(87064, ranges.get(1)[1]); + + /* + * valid things we don't yet handle + */ + checkForParseException("<34..126"); + checkForParseException("35..>126"); + checkForParseException("34.126"); + checkForParseException("34^126"); + checkForParseException("order(34..126,130..180)"); + + /* + * invalid things + */ + checkForParseException(""); + checkForParseException("JOIN(1..2)"); + checkForParseException("join(1..2"); + checkForParseException("join(1..2("); + checkForParseException("complement(1..2"); + checkForParseException("complement(1..2("); + try + { + assertNull(DnaUtils.parseLocation(null)); + fail("Expected exception"); + } catch (NullPointerException e) + { + // expected + } + + /* + * nested joins are not allowed; just as well since this fails to parse + * (splitting tokens by comma fragments the inner join expression) + */ + checkForParseException("join(1..2,join(4..5,10..12),18..22)"); + /* + * complement may not enclose multiple ranges + * parsing fails for the same reason + */ + checkForParseException("join(complement(36618..36700,4000..4200),86988..87064)"); + } + + /** + * Verifies that a ParseException is thrown when the given location is parsed + * + * @param location + */ + void checkForParseException(String location) + { + try + { + DnaUtils.parseLocation(location); + fail("Expected exception"); + } catch (ParseException e) + { + // expected; + } + } + +} diff --git a/test/jalview/util/MapListTest.java b/test/jalview/util/MapListTest.java index d4ed0ea..ba298c5 100644 --- a/test/jalview/util/MapListTest.java +++ b/test/jalview/util/MapListTest.java @@ -563,6 +563,21 @@ public class MapListTest s); } + /** + * Test that confirms adding a map twice does nothing + */ + @Test(groups = { "Functional" }) + public void testAddMapList_sameMap() + { + MapList ml = new MapList(new int[] { 11, 15, 20, 25, 35, 30 }, + new int[] { 72, 22 }, 1, 3); + String before = ml.toString(); + ml.addMapList(ml); + assertEquals(before, ml.toString()); + ml.addMapList(new MapList(ml)); + assertEquals(before, ml.toString()); + } + @Test(groups = { "Functional" }) public void testAddMapList_contiguous() { diff --git a/test/jalview/util/MappingUtilsTest.java b/test/jalview/util/MappingUtilsTest.java index 3c417c3..7e28579 100644 --- a/test/jalview/util/MappingUtilsTest.java +++ b/test/jalview/util/MappingUtilsTest.java @@ -703,6 +703,51 @@ public class MappingUtilsTest assertEquals(0, result.size()); } + /** + * just like the one above, but this time, we provide a set of sequences to + * subselect the mapping search + */ + @Test(groups = { "Functional" }) + public void testFindMappingsBetweenSequenceAndOthers() + { + SequenceI seq1 = new Sequence("Seq1", "ABC"); + SequenceI seq2 = new Sequence("Seq2", "ABC"); + SequenceI seq3 = new Sequence("Seq3", "ABC"); + SequenceI seq4 = new Sequence("Seq4", "ABC"); + seq1.createDatasetSequence(); + seq2.createDatasetSequence(); + seq3.createDatasetSequence(); + seq4.createDatasetSequence(); + + /* + * Create mappings from seq1 to seq2, seq2 to seq1, seq3 to seq1 + */ + AlignedCodonFrame acf1 = new AlignedCodonFrame(); + MapList map = new MapList(new int[] { 1, 3 }, new int[] { 1, 3 }, 1, 1); + acf1.addMap(seq1.getDatasetSequence(), seq2.getDatasetSequence(), map); + AlignedCodonFrame acf2 = new AlignedCodonFrame(); + acf2.addMap(seq2.getDatasetSequence(), seq1.getDatasetSequence(), map); + AlignedCodonFrame acf3 = new AlignedCodonFrame(); + acf3.addMap(seq3.getDatasetSequence(), seq1.getDatasetSequence(), map); + + List mappings = new ArrayList(); + mappings.add(acf1); + mappings.add(acf2); + mappings.add(acf3); + + /* + * Seq1 has three mappings + */ + List result = MappingUtils + .findMappingsForSequenceAndOthers(seq1, mappings, + new Alignment(new SequenceI[] { seq1, seq2 })); + assertTrue(result.contains(acf1)); + assertTrue(result.contains(acf2)); + assertFalse("Did not expect to find mapping acf3 - subselect failed", + result.contains(acf3)); + assertEquals(2, result.size()); + } + @Test(groups = { "Functional" }) public void testMapEditCommand() { diff --git a/test/jalview/util/StringUtilsTest.java b/test/jalview/util/StringUtilsTest.java index dc2555b..4dc44d4 100644 --- a/test/jalview/util/StringUtilsTest.java +++ b/test/jalview/util/StringUtilsTest.java @@ -165,4 +165,57 @@ public class StringUtilsTest assertEquals(0, StringUtils.parseInt(String.valueOf(Integer.MAX_VALUE) + "1")); } + + @Test(groups = { "Functional" }) + public void testCompareVersions() + { + assertEquals(0, StringUtils.compareVersions(null, null)); + assertEquals(0, StringUtils.compareVersions("2.8.3", null)); + + /* + * same version returns 0 + */ + assertEquals(0, StringUtils.compareVersions("2.8", "2.8")); + assertEquals(0, StringUtils.compareVersions("2.8.3", "2.8.3")); + assertEquals(0, StringUtils.compareVersions("2.8.3b1", "2.8.3b1", "b")); + assertEquals(0, StringUtils.compareVersions("2.8.3B1", "2.8.3b1", "b")); + assertEquals(0, StringUtils.compareVersions("2.8.3b1", "2.8.3B1", "b")); + + /* + * v1 < v2 returns -1 + */ + assertEquals(-1, StringUtils.compareVersions("2.8.3", "2.8.4")); + assertEquals(-1, StringUtils.compareVersions("2.8.3", "2.9")); + assertEquals(-1, StringUtils.compareVersions("2.8.3", "2.9.2")); + assertEquals(-1, StringUtils.compareVersions("2.8", "2.8.3")); + assertEquals(-1, StringUtils.compareVersions("2.8.3", "2.8.3b1", "b")); + assertEquals(-1, StringUtils.compareVersions("2.8.3b1", "2.8.3b2", "b")); + assertEquals(-1, StringUtils.compareVersions("2.8", "2.8.0", "b")); + assertEquals(-1, StringUtils.compareVersions("2", "12")); + assertEquals(-1, StringUtils.compareVersions("3.2.4", "3.12.11")); + + /* + * v1 > v2 returns +1 + */ + assertEquals(1, StringUtils.compareVersions("2.8.3", "2.8")); + assertEquals(1, StringUtils.compareVersions("2.8.0", "2.8")); + assertEquals(1, StringUtils.compareVersions("2.8.4", "2.8.3")); + assertEquals(1, StringUtils.compareVersions("2.8.3b1", "2.8.3", "b")); + assertEquals(1, StringUtils.compareVersions("2.8.3", "2.8.2b1", "b")); + assertEquals(1, StringUtils.compareVersions("2.8.0b2", "2.8.0b1", "b")); + assertEquals(1, StringUtils.compareVersions("12", "2")); + assertEquals(1, StringUtils.compareVersions("3.12.11", "3.2.4")); + } + + @Test(groups = { "Functional" }) + public void testToSentenceCase() + { + assertEquals("John", StringUtils.toSentenceCase("john")); + assertEquals("John", StringUtils.toSentenceCase("JOHN")); + assertEquals("John and james", + StringUtils.toSentenceCase("JOHN and JAMES")); + assertEquals("J", StringUtils.toSentenceCase("j")); + assertEquals("", StringUtils.toSentenceCase("")); + assertNull(StringUtils.toSentenceCase(null)); + } } diff --git a/test/jalview/ws/PDBSequenceFetcherTest.java b/test/jalview/ws/PDBSequenceFetcherTest.java index d020173..0c810a3 100644 --- a/test/jalview/ws/PDBSequenceFetcherTest.java +++ b/test/jalview/ws/PDBSequenceFetcherTest.java @@ -25,6 +25,7 @@ import static org.testng.AssertJUnit.assertTrue; import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; +import jalview.structure.StructureImportSettings; import jalview.ws.seqfetcher.DbSourceProxy; import java.util.List; @@ -60,6 +61,10 @@ public class PDBSequenceFetcherTest @Test(groups = { "Network" }, enabled = true) public void testRnaSeqRetrieve() throws Exception { + Cache.applicationProperties.setProperty("STRUCT_FROM_PDB", + Boolean.TRUE.toString()); + Cache.applicationProperties.setProperty("DEFAULT_STRUCTURE_FORMAT", + "PDB"); List sps = sf.getSourceProxy("PDB"); AlignmentI response = sps.get(0).getSequenceRecords("2GIS"); assertTrue(response != null); @@ -76,4 +81,42 @@ public class PDBSequenceFetcherTest } } + @Test(groups = { "Network" }, enabled = true) + public void testPdbSeqRetrieve() throws Exception + { + Cache.applicationProperties.setProperty("STRUCT_FROM_PDB", + Boolean.TRUE.toString()); + StructureImportSettings.setCurrentDefaultFormat("PDB"); + + testRetrieveProteinSeqFromPDB(); + } + + @Test(groups = { "Network" }, enabled = true) + public void testmmCifSeqRetrieve() throws Exception + { + Cache.applicationProperties.setProperty("STRUCT_FROM_PDB", + Boolean.TRUE.toString()); + StructureImportSettings.setCurrentDefaultFormat("mmCIF"); + testRetrieveProteinSeqFromPDB(); + } + + private void testRetrieveProteinSeqFromPDB() throws Exception + { + List sps = sf.getSourceProxy("PDB"); + AlignmentI response = sps.get(0).getSequenceRecords("1QIP"); + assertTrue(response != null); + assertTrue(response.getHeight() == 4); + for (SequenceI sq : response.getSequences()) + { + assertTrue("No annotation transfered to sequence.", + sq.getAnnotation().length > 0); + assertTrue("No PDBEntry on sequence.", + sq.getAllPDBEntries().size() > 0); + org.testng.Assert + .assertEquals(sq.getEnd() - sq.getStart() + 1, + sq.getLength(), + "Sequence start/end doesn't match number of residues in sequence"); + } + } + } diff --git a/test/jalview/ws/SequenceFetcherTest.java b/test/jalview/ws/SequenceFetcherTest.java index a54ce8b..94bf979 100644 --- a/test/jalview/ws/SequenceFetcherTest.java +++ b/test/jalview/ws/SequenceFetcherTest.java @@ -1,5 +1,6 @@ package jalview.ws; +import jalview.analysis.CrossRef; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefSource; @@ -24,8 +25,6 @@ public class SequenceFetcherTest // TODO: extracted from SequenceFetcher - convert to proper unit test with // assertions - AlignmentI ds = null; - Vector noProds = new Vector(); String usage = "SequenceFetcher.main [-nodas] [ []]\n" + "With no arguments, all DbSources will be queried with their test Accession number.\n" + "With one argument, the argument will be resolved to one or more db sources and each will be queried with their test accession only.\n" @@ -44,7 +43,7 @@ public class SequenceFetcherTest { List sps = new SequenceFetcher(withDas) .getSourceProxy(argv[0]); - + if (sps != null) { for (DbSourceProxy sp : sps) @@ -52,7 +51,8 @@ public class SequenceFetcherTest AlignmentI al = null; try { - al = sp.getSequenceRecords(argv.length > 1 ? argv[1] : sp + testRetrieval(argv[0], sp, + argv.length > 1 ? argv[1] : sp .getTestQuery()); } catch (Exception e) { @@ -61,16 +61,6 @@ public class SequenceFetcherTest + (argv.length > 1 ? argv[1] : sp.getTestQuery()) + " from " + argv[0] + "\nUsage: " + usage); } - SequenceI[] prod = al.getSequencesArray(); - if (al != null) - { - for (int p = 0; p < prod.length; p++) - { - System.out.println("Prod " + p + ": " - + prod[p].getDisplayId(true) + " : " - + prod[p].getDescription()); - } - } } return; } @@ -95,139 +85,135 @@ public class SequenceFetcherTest } for (DbSourceProxy sp : sfetcher.getSourceProxy(db)) { - System.out.println("Source: " + sp.getDbName() + " (" + db - + "): retrieving test:" + sp.getTestQuery()); - AlignmentI al = null; - try + testRetrieval(db, sp, sp.getTestQuery()); + } + } + + } + + private static void testRetrieval(String db, DbSourceProxy sp, + String testQuery) + { + AlignmentI ds = null; + Vector noProds = new Vector(); + System.out.println("Source: " + sp.getDbName() + " (" + db + + "): retrieving test:" + sp.getTestQuery()); + { + AlignmentI al = null; + try + { + al = sp.getSequenceRecords(testQuery); + if (al != null && al.getHeight() > 0) { - al = sp.getSequenceRecords(sp.getTestQuery()); - if (al != null && al.getHeight() > 0) + boolean dna = sp.isDnaCoding(); + al.setDataset(null); + AlignmentI alds = al.getDataset(); + // try and find products + CrossRef crossRef = new CrossRef(al.getSequencesArray(), alds); + List types = crossRef.findXrefSourcesForSequences(dna); + if (types != null) { - boolean dna = sp.isDnaCoding(); - // try and find products - String types[] = jalview.analysis.CrossRef - .findSequenceXrefTypes(dna, al.getSequencesArray()); - if (types != null) + System.out.println("Xref Types for: " + (dna ? "dna" : "prot")); + for (String source : types) { - System.out.println("Xref Types for: " - + (dna ? "dna" : "prot")); - for (int t = 0; t < types.length; t++) + System.out.println("Type: " + source); + SequenceI[] prod = crossRef.findXrefSequences(source, dna) + .getSequencesArray(); + System.out.println("Found " + + ((prod == null) ? "no" : "" + prod.length) + + " products"); + if (prod != null) { - System.out.println("Type: " + types[t]); - SequenceI[] prod = jalview.analysis.CrossRef - .findXrefSequences(al.getSequencesArray(), dna, - types[t], null) - .getSequencesArray(); - System.out.println("Found " - + ((prod == null) ? "no" : "" + prod.length) - + " products"); - if (prod != null) + for (int p = 0; p < prod.length; p++) { - for (int p = 0; p < prod.length; p++) - { - System.out.println("Prod " + p + ": " - + prod[p].getDisplayId(true)); - } + System.out.println("Prod " + p + ": " + + prod[p].getDisplayId(true)); } } } - else - { - noProds.addElement((dna ? new Object[] { al, al } - : new Object[] { al })); - } - - } - } catch (Exception ex) - { - System.out.println("ERROR:Failed to retrieve test query."); - ex.printStackTrace(System.out); - } - - if (al == null) - { - System.out.println("ERROR:No alignment retrieved."); - StringBuffer raw = sp.getRawRecords(); - if (raw != null) - { - System.out.println(raw.toString()); } else { - System.out.println("ERROR:No Raw results."); + noProds.addElement((dna ? new Object[] { al, al } + : new Object[] { al })); } + + } + } catch (Exception ex) + { + System.out.println("ERROR:Failed to retrieve test query."); + ex.printStackTrace(System.out); + } + + if (al == null) + { + System.out.println("ERROR:No alignment retrieved."); + StringBuffer raw = sp.getRawRecords(); + if (raw != null) + { + System.out.println(raw.toString()); } else { - System.out.println("Retrieved " + al.getHeight() + " sequences."); - for (int s = 0; s < al.getHeight(); s++) - { - SequenceI sq = al.getSequenceAt(s); - while (sq.getDatasetSequence() != null) - { - sq = sq.getDatasetSequence(); - - } - if (ds == null) - { - ds = new Alignment(new SequenceI[] { sq }); - - } - else - { - ds.addSequence(sq); - } - } + System.out.println("ERROR:No Raw results."); + } + } + else + { + System.out.println("Retrieved " + al.getHeight() + " sequences."); + if (ds == null) + { + ds = al.getDataset(); + } + else + { + ds.append(al.getDataset()); + al.setDataset(ds); } - System.out.flush(); - System.err.flush(); - } - if (noProds.size() > 0) + System.out.flush(); + System.err.flush(); + } + if (noProds.size() > 0) + { + Enumeration ts = noProds.elements(); + while (ts.hasMoreElements()) + { - Enumeration ts = noProds.elements(); - while (ts.hasMoreElements()) - + Object[] typeSq = ts.nextElement(); + boolean dna = (typeSq.length > 1); + AlignmentI al = (AlignmentI) typeSq[0]; + System.out.println("Trying getProducts for " + + al.getSequenceAt(0).getDisplayId(true)); + System.out.println("Search DS Xref for: " + (dna ? "dna" : "prot")); + // have a bash at finding the products amongst all the retrieved + // sequences. + SequenceI[] seqs = al.getSequencesArray(); + Alignment prodal = new CrossRef(seqs, ds).findXrefSequences(null, + dna); + System.out.println("Found " + + ((prodal == null) ? "no" : "" + prodal.getHeight()) + + " products"); + if (prodal != null) { - Object[] typeSq = ts.nextElement(); - boolean dna = (typeSq.length > 1); - AlignmentI al = (AlignmentI) typeSq[0]; - System.out.println("Trying getProducts for " - + al.getSequenceAt(0).getDisplayId(true)); - System.out.println("Search DS Xref for: " - + (dna ? "dna" : "prot")); - // have a bash at finding the products amongst all the retrieved - // sequences. - SequenceI[] seqs = al.getSequencesArray(); - Alignment prodal = jalview.analysis.CrossRef.findXrefSequences( - seqs, dna, null, ds); - System.out.println("Found " - + ((prodal == null) ? "no" : "" + prodal.getHeight()) - + " products"); - if (prodal != null) + SequenceI[] prod = prodal.getSequencesArray(); // note + // should + // test + // rather + // than + // throw + // away + // codon + // mapping + // (if + // present) + for (int p = 0; p < prod.length; p++) { - SequenceI[] prod = prodal.getSequencesArray(); // note - // should - // test - // rather - // than - // throw - // away - // codon - // mapping - // (if - // present) - for (int p = 0; p < prod.length; p++) - { - System.out.println("Prod " + p + ": " - + prod[p].getDisplayId(true)); - } + System.out.println("Prod " + p + ": " + + prod[p].getDisplayId(true)); } } - } - } } - } diff --git a/test/jalview/ws/ebi/EBIFetchClientTest.java b/test/jalview/ws/ebi/EBIFetchClientTest.java new file mode 100644 index 0000000..4eaa5b1 --- /dev/null +++ b/test/jalview/ws/ebi/EBIFetchClientTest.java @@ -0,0 +1,113 @@ +package jalview.ws.ebi; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertNull; + +import org.testng.annotations.Test; + +public class EBIFetchClientTest +{ + /** + * Test method that constructs URL to fetch from + */ + @Test(groups = "Functional") + public void testBuildUrl() + { + /* + * EMBL + */ + assertEquals("http://www.ebi.ac.uk/ena/data/view/x53838&display=xml", + EBIFetchClient.buildUrl("X53838", "EMBL", "display=xml")); + + /* + * EMBLCDS + */ + assertEquals("http://www.ebi.ac.uk/ena/data/view/caa37824&display=xml", + EBIFetchClient.buildUrl("CAA37824", "EMBL", "display=xml")); + + /* + * Uniprot + */ + assertEquals( + "http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/uniprot/p00340/uniprotxml", + EBIFetchClient.buildUrl("P00340", "UNIPROT", "uniprotxml")); + + /* + * PDB / pdb + */ + assertEquals("http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/pdb/3a6s/pdb", + EBIFetchClient.buildUrl("3A6S", "PDB", "pdb")); + + /* + * PDB / mmCIF + */ + assertEquals( + "http://www.ebi.ac.uk/Tools/dbfetch/dbfetch/pdb/3a6s/mmCIF", + EBIFetchClient.buildUrl("3A6S", "PDB", "mmCIF")); + } + + /** + * Test method that parses db:id;id;id + */ + @Test(groups = "Functional") + public void testParseIds() + { + /* + * pdb, two accessions + */ + StringBuilder queries = new StringBuilder(); + String db = EBIFetchClient.parseIds("pdb:3a6s;1A70", queries); + assertEquals("pdb", db); + assertEquals("3a6s,1A70", queries.toString()); + + /* + * pdb specified on second accession + */ + queries.setLength(0); + queries = new StringBuilder(); + db = EBIFetchClient.parseIds("3a6s;pdb:1A70", queries); + assertEquals("pdb", db); + assertEquals("3a6s,1A70", queries.toString()); + + /* + * uniprot, one accession + */ + queries.setLength(0); + db = EBIFetchClient.parseIds("uniprot:P00340", queries); + assertEquals("uniprot", db); + assertEquals("P00340", queries.toString()); + + /* + * uniprot, one accession, appending to existing queries + */ + queries.setLength(0); + queries.append("P30419"); + db = EBIFetchClient.parseIds("uniprot:P00340", queries); + assertEquals("uniprot", db); + assertEquals("P30419,P00340", queries.toString()); + + /* + * pdb and uniprot mixed - rejected + */ + queries.setLength(0); + db = EBIFetchClient.parseIds("pdb:3a6s;1a70;uniprot:P00340", queries); + assertNull(db); + assertEquals("3a6s,1a70", queries.toString()); + + /* + * pdb and PDB mixed - ok + */ + queries.setLength(0); + db = EBIFetchClient.parseIds("pdb:3a6s;pdb:1a70;PDB:1QIP", queries); + assertEquals("PDB", db); + assertEquals("3a6s,1a70,1QIP", queries.toString()); + + /* + * no database (improper format) + */ + queries.setLength(0); + db = EBIFetchClient.parseIds("P00340", queries); + assertNull(db); + assertEquals("P00340", queries.toString()); + } +} diff --git a/test/jalview/ws/gui/Jws2ParamView.java b/test/jalview/ws/gui/Jws2ParamView.java index 1cf1e5f..d672ab6 100644 --- a/test/jalview/ws/gui/Jws2ParamView.java +++ b/test/jalview/ws/gui/Jws2ParamView.java @@ -65,6 +65,7 @@ public class Jws2ParamView @BeforeClass(alwaysRun = true) public static void setUpBeforeClass() throws Exception { + Cache.loadProperties("test/jalview/io/testProps.jvprops"); Cache.initLogger(); disc = JalviewJabawsTestUtils.getJabawsDiscoverer(); } @@ -139,6 +140,7 @@ public class Jws2ParamView */ jf.addWindowListener(new WindowAdapter() { + @Override public void windowClosing(WindowEvent e) { thr.interrupt(); diff --git a/test/jalview/ws/jabaws/DisorderAnnotExportImport.java b/test/jalview/ws/jabaws/DisorderAnnotExportImport.java index 557ef7e..9f62481 100644 --- a/test/jalview/ws/jabaws/DisorderAnnotExportImport.java +++ b/test/jalview/ws/jabaws/DisorderAnnotExportImport.java @@ -23,6 +23,7 @@ package jalview.ws.jabaws; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; +import jalview.bin.Cache; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.io.AnnotationFile; @@ -56,8 +57,8 @@ public class DisorderAnnotExportImport @BeforeClass(inheritGroups = true) public static void setUpBeforeClass() throws Exception { - - jalview.bin.Cache.initLogger(); + Cache.loadProperties("test/jalview/io/testProps.jvprops"); + Cache.initLogger(); disc = JalviewJabawsTestUtils.getJabawsDiscoverer(); iupreds = new ArrayList(); for (Jws2Instance svc : disc.getServices()) diff --git a/test/jalview/ws/jabaws/JalviewJabawsTestUtils.java b/test/jalview/ws/jabaws/JalviewJabawsTestUtils.java index 46feebc..4414782 100644 --- a/test/jalview/ws/jabaws/JalviewJabawsTestUtils.java +++ b/test/jalview/ws/jabaws/JalviewJabawsTestUtils.java @@ -37,7 +37,7 @@ public class JalviewJabawsTestUtils { } - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { } @@ -60,6 +60,20 @@ public class JalviewJabawsTestUtils return getJabawsDiscoverer(true); } + /** + * Returns a service discoverer that queries localhost and compbio urls. + *

          + * If using this method, be sure to have read-only Jalview properties, to + * avoid writing the test urls to .jalview_properties. This can be done by + * either + *

            + *
          • running Jalview main with arguments -props propFileName
          • + *
          • calling Cache.loadProperties(filename)
          • + *
              + * + * @param localhost + * @return + */ public static Jws2Discoverer getJabawsDiscoverer(boolean localhost) { jalview.ws.jws2.Jws2Discoverer disc = jalview.ws.jws2.Jws2Discoverer diff --git a/test/jalview/ws/jabaws/JpredJabaStructExportImport.java b/test/jalview/ws/jabaws/JpredJabaStructExportImport.java index afb24c4..7f94b6b 100644 --- a/test/jalview/ws/jabaws/JpredJabaStructExportImport.java +++ b/test/jalview/ws/jabaws/JpredJabaStructExportImport.java @@ -23,6 +23,7 @@ package jalview.ws.jabaws; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; +import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.gui.Jalview2XML; import jalview.io.AnnotationFile; @@ -65,8 +66,8 @@ public class JpredJabaStructExportImport @BeforeClass(alwaysRun = true) public static void setUpBeforeClass() throws Exception { - - jalview.bin.Cache.initLogger(); + Cache.loadProperties("test/jalview/io/testProps.jvprops"); + Cache.initLogger(); disc = JalviewJabawsTestUtils.getJabawsDiscoverer(false); for (Jws2Instance svc : disc.getServices()) @@ -84,7 +85,7 @@ public class JpredJabaStructExportImport assertNotNull("Couldn't load test data ('" + testseqs + "')", af); } - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { if (af != null) diff --git a/test/jalview/ws/jabaws/RNAStructExportImport.java b/test/jalview/ws/jabaws/RNAStructExportImport.java index b57e5d0..dbe1258 100644 --- a/test/jalview/ws/jabaws/RNAStructExportImport.java +++ b/test/jalview/ws/jabaws/RNAStructExportImport.java @@ -23,6 +23,7 @@ package jalview.ws.jabaws; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; +import jalview.bin.Cache; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.gui.Jalview2XML; @@ -36,6 +37,7 @@ import jalview.ws.jws2.jabaws2.Jws2Instance; import jalview.ws.params.AutoCalcSetting; import java.awt.Component; +import java.io.File; import java.util.ArrayList; import java.util.List; @@ -51,6 +53,8 @@ import compbio.metadata.WrongParameterException; public class RNAStructExportImport { + private static final String JAR_FILE_NAME = "testRnalifold_param.jar"; + public static String testseqs = "examples/RF00031_folded.stk"; public static Jws2Discoverer disc; @@ -64,8 +68,8 @@ public class RNAStructExportImport @BeforeClass(alwaysRun = true) public static void setUpBeforeClass() throws Exception { - - jalview.bin.Cache.initLogger(); + Cache.loadProperties("test/jalview/io/testProps.jvprops"); + Cache.initLogger(); disc = JalviewJabawsTestUtils.getJabawsDiscoverer(false); for (Jws2Instance svc : disc.getServices()) @@ -108,13 +112,18 @@ public class RNAStructExportImport // public? } - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { if (af != null) { af.setVisible(false); af.dispose(); + File f = new File(JAR_FILE_NAME); + if (f.exists()) + { + f.delete(); + } } } @@ -267,10 +276,10 @@ public class RNAStructExportImport // write out parameters jalview.gui.AlignFrame nalf = null; assertTrue("Couldn't write out the Jar file", - new Jalview2XML(false).saveAlignment(af, - "testRnalifold_param.jar", "trial parameter writeout")); + new Jalview2XML(false).saveAlignment(af, JAR_FILE_NAME, + "trial parameter writeout")); assertTrue("Couldn't read back the Jar file", (nalf = new Jalview2XML( - false).loadJalviewAlign("testRnalifold_param.jar")) != null); + false).loadJalviewAlign(JAR_FILE_NAME)) != null); if (nalf != null) { AutoCalcSetting acs = af.getViewport().getCalcIdSettingsFor( diff --git a/test/jalview/ws/jws2/ParameterUtilsTest.java b/test/jalview/ws/jws2/ParameterUtilsTest.java index f96b115..1e02213 100644 --- a/test/jalview/ws/jws2/ParameterUtilsTest.java +++ b/test/jalview/ws/jws2/ParameterUtilsTest.java @@ -55,6 +55,7 @@ public class ParameterUtilsTest public static void setUpBeforeClass() throws Exception { serviceTests.add("AAConWS".toLowerCase()); + Cache.loadProperties("test/jalview/io/testProps.jvprops"); Cache.initLogger(); disc = JalviewJabawsTestUtils.getJabawsDiscoverer(); } diff --git a/test/jalview/ws/seqfetcher/DbRefFetcherTest.java b/test/jalview/ws/seqfetcher/DbRefFetcherTest.java index 63b1b9c..b3c7e10 100644 --- a/test/jalview/ws/seqfetcher/DbRefFetcherTest.java +++ b/test/jalview/ws/seqfetcher/DbRefFetcherTest.java @@ -62,7 +62,7 @@ public class DbRefFetcherTest /** * @throws java.lang.Exception */ - @AfterClass + @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { } @@ -178,8 +178,8 @@ public class DbRefFetcherTest .getMap().getMappedWidth(), 1); assertEquals("Expected local reference map to be 3 nucleotides", dr[0] .getMap().getWidth(), 3); - AlignmentI sprods = CrossRef.findXrefSequences( - alsq.getSequencesArray(), true, dr[0].getSource(), alsq); + AlignmentI sprods = new CrossRef(alsq.getSequencesArray(), alsq) + .findXrefSequences(dr[0].getSource(), true); assertNotNull( "Couldn't recover cross reference sequence from dataset. Was it ever added ?", sprods); diff --git a/test/jalview/ws/sifts/SiftsClientTest.java b/test/jalview/ws/sifts/SiftsClientTest.java index a1c2c9a..9141bad 100644 --- a/test/jalview/ws/sifts/SiftsClientTest.java +++ b/test/jalview/ws/sifts/SiftsClientTest.java @@ -20,13 +20,18 @@ */ package jalview.ws.sifts; +import jalview.api.DBRefEntryI; import jalview.datamodel.DBRefEntry; +import jalview.datamodel.DBRefSource; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; +import jalview.io.AppletFormatAdapter; +import jalview.structure.StructureMapping; +import jalview.xml.binding.sifts.Entry.Entity; -import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.PrintStream; +import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import org.testng.Assert; @@ -35,11 +40,11 @@ import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import MCview.Atom; import MCview.PDBfile; public class SiftsClientTest { - private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); public static final String DEFAULT_SIFTS_DOWNLOAD_DIR = System .getProperty("user.home") @@ -63,10 +68,103 @@ public class SiftsClientTest @BeforeTest(alwaysRun = true) public void populateExpectedMapping() throws SiftsException { - for (int x = 1; x <= 97; x++) - { - expectedMapping.put(50 + x, new int[] { x, u }); - } + expectedMapping.put(51, new int[] { 1, 2 }); + expectedMapping.put(52, new int[] { 2, 7 }); + expectedMapping.put(53, new int[] { 3, 12 }); + expectedMapping.put(54, new int[] { 4, 24 }); + expectedMapping.put(55, new int[] { 5, 33 }); + expectedMapping.put(56, new int[] { 6, 40 }); + expectedMapping.put(57, new int[] { 7, 47 }); + expectedMapping.put(58, new int[] { 8, 55 }); + expectedMapping.put(59, new int[] { 9, 62 }); + expectedMapping.put(60, new int[] { 10, 69 }); + expectedMapping.put(61, new int[] { 11, 76 }); + expectedMapping.put(62, new int[] { 12, 83 }); + expectedMapping.put(63, new int[] { 13, 87 }); + expectedMapping.put(64, new int[] { 14, 95 }); + expectedMapping.put(65, new int[] { 15, 102 }); + expectedMapping.put(66, new int[] { 16, 111 }); + expectedMapping.put(67, new int[] { 17, 122 }); + expectedMapping.put(68, new int[] { 18, 131 }); + expectedMapping.put(69, new int[] { 19, 137 }); + expectedMapping.put(70, new int[] { 20, 144 }); + expectedMapping.put(71, new int[] { 21, 152 }); + expectedMapping.put(72, new int[] { 22, 160 }); + expectedMapping.put(73, new int[] { 23, 167 }); + expectedMapping.put(74, new int[] { 24, 179 }); + expectedMapping.put(75, new int[] { 25, 187 }); + expectedMapping.put(76, new int[] { 26, 195 }); + expectedMapping.put(77, new int[] { 27, 203 }); + expectedMapping.put(78, new int[] { 28, 208 }); + expectedMapping.put(79, new int[] { 29, 213 }); + expectedMapping.put(80, new int[] { 30, 222 }); + expectedMapping.put(81, new int[] { 31, 231 }); + expectedMapping.put(82, new int[] { 32, 240 }); + expectedMapping.put(83, new int[] { 33, 244 }); + expectedMapping.put(84, new int[] { 34, 252 }); + expectedMapping.put(85, new int[] { 35, 260 }); + expectedMapping.put(86, new int[] { 36, 268 }); + expectedMapping.put(87, new int[] { 37, 275 }); + expectedMapping.put(88, new int[] { 38, 287 }); + expectedMapping.put(89, new int[] { 39, 293 }); + expectedMapping.put(90, new int[] { 40, 299 }); + expectedMapping.put(91, new int[] { 41, 310 }); + expectedMapping.put(92, new int[] { 42, 315 }); + expectedMapping.put(93, new int[] { 43, 319 }); + expectedMapping.put(94, new int[] { 44, 325 }); + expectedMapping.put(95, new int[] { 45, 331 }); + expectedMapping.put(96, new int[] { 46, 337 }); + expectedMapping.put(97, new int[] { 47, 343 }); + expectedMapping.put(98, new int[] { 48, 349 }); + expectedMapping.put(99, new int[] { 49, 354 }); + expectedMapping.put(100, new int[] { 50, 358 }); + expectedMapping.put(101, new int[] { 51, 367 }); + expectedMapping.put(102, new int[] { 52, 375 }); + expectedMapping.put(103, new int[] { 53, 384 }); + expectedMapping.put(104, new int[] { 54, 391 }); + expectedMapping.put(105, new int[] { 55, 395 }); + expectedMapping.put(106, new int[] { 56, 401 }); + expectedMapping.put(107, new int[] { 57, 409 }); + expectedMapping.put(108, new int[] { 58, 417 }); + expectedMapping.put(109, new int[] { 59, 426 }); + expectedMapping.put(110, new int[] { 60, 434 }); + expectedMapping.put(111, new int[] { 61, 442 }); + expectedMapping.put(112, new int[] { 62, 451 }); + expectedMapping.put(113, new int[] { 63, 457 }); + expectedMapping.put(114, new int[] { 64, 468 }); + expectedMapping.put(115, new int[] { 65, 476 }); + expectedMapping.put(116, new int[] { 66, 484 }); + expectedMapping.put(117, new int[] { 67, 492 }); + expectedMapping.put(118, new int[] { 68, 500 }); + expectedMapping.put(119, new int[] { 69, 509 }); + expectedMapping.put(120, new int[] { 70, 517 }); + expectedMapping.put(121, new int[] { 71, 525 }); + expectedMapping.put(122, new int[] { 72, 534 }); + expectedMapping.put(123, new int[] { 73, 538 }); + expectedMapping.put(124, new int[] { 74, 552 }); + expectedMapping.put(125, new int[] { 75, 559 }); + expectedMapping.put(126, new int[] { 76, 567 }); + expectedMapping.put(127, new int[] { 77, 574 }); + expectedMapping.put(128, new int[] { 78, 580 }); + expectedMapping.put(129, new int[] { 79, 585 }); + expectedMapping.put(130, new int[] { 80, 590 }); + expectedMapping.put(131, new int[] { 81, 602 }); + expectedMapping.put(132, new int[] { 82, 609 }); + expectedMapping.put(133, new int[] { 83, 616 }); + expectedMapping.put(134, new int[] { 84, 622 }); + expectedMapping.put(135, new int[] { 85, 630 }); + expectedMapping.put(136, new int[] { 86, 637 }); + expectedMapping.put(137, new int[] { 87, 644 }); + expectedMapping.put(138, new int[] { 88, 652 }); + expectedMapping.put(139, new int[] { 89, 661 }); + expectedMapping.put(140, new int[] { 90, 668 }); + expectedMapping.put(141, new int[] { 91, 678 }); + expectedMapping.put(142, new int[] { 92, 687 }); + expectedMapping.put(143, new int[] { 93, 696 }); + expectedMapping.put(144, new int[] { 94, 705 }); + expectedMapping.put(145, new int[] { 95, 714 }); + expectedMapping.put(146, new int[] { 96, 722 }); + expectedMapping.put(147, new int[] { 97, 729 }); } @BeforeTest(alwaysRun = true) @@ -74,14 +172,22 @@ public class SiftsClientTest { // SIFTs entries are updated weekly - so use saved SIFTs file to enforce // test reproducibility + new SiftsSettings(); SiftsSettings.setSiftDownloadDirectory(jalview.bin.Cache.getDefault( "sifts_download_dir", DEFAULT_SIFTS_DOWNLOAD_DIR)); - - File testSiftsFile = new File("test/jalview/io/" + testPDBId - + ".xml.gz"); - PDBfile pdbFile = new PDBfile(false, false, false); - pdbFile.setId(testPDBId); - siftsClient = new SiftsClient(pdbFile, testSiftsFile); + SiftsSettings.setMapWithSifts(true); + SiftsSettings.setCacheThresholdInDays("2"); + SiftsSettings.setFailSafePIDThreshold("70"); + PDBfile pdbFile; + try + { + pdbFile = new PDBfile(false, false, false, "test/jalview/io/" + + testPDBId + ".pdb", AppletFormatAdapter.FILE); + siftsClient = new SiftsClient(pdbFile); + } catch (Exception e) + { + e.printStackTrace(); + } } @AfterTest(alwaysRun = true) @@ -90,30 +196,23 @@ public class SiftsClientTest siftsClient = null; } - @BeforeTest(alwaysRun = true) - public void setUpStreams() - { - System.setOut(new PrintStream(outContent)); - } - - @AfterTest(alwaysRun = true) - public void cleanUpStreams() - { - System.setOut(null); - } - @Test(groups = { "Functional" }) public void getSIFTsFileTest() throws SiftsException { - Assert.assertTrue(SiftsClient.deleteSiftsFileByPDBId(testPDBId)); - SiftsClient.getSiftsFile(testPDBId); - Assert.assertFalse(outContent.toString().contains( - ">>> SIFTS File already downloaded for " + testPDBId)); - - // test for SIFTs file caching - SiftsClient.getSiftsFile(testPDBId); - Assert.assertTrue(outContent.toString().contains( - ">>> SIFTS File already downloaded for " + testPDBId)); + File siftsFile; + try + { + siftsFile = SiftsClient.downloadSiftsFile(testPDBId); + FileAssert.assertFile(siftsFile); + // test for SIFTs file caching + SiftsSettings.setCacheThresholdInDays("0"); + siftsFile = SiftsClient.getSiftsFile(testPDBId); + FileAssert.assertFile(siftsFile); + SiftsSettings.setCacheThresholdInDays("2"); + } catch (IOException e) + { + e.printStackTrace(); + } } @Test(groups = { "Functional" }) @@ -122,11 +221,19 @@ public class SiftsClientTest // Assert that file isn't yet downloaded - if already downloaded, assert it // is deleted Assert.assertTrue(SiftsClient.deleteSiftsFileByPDBId(testPDBId)); - File siftsFile = SiftsClient.downloadSiftsFile(testPDBId); - FileAssert.assertFile(siftsFile); - SiftsClient.downloadSiftsFile(testPDBId); + File siftsFile; + try + { + siftsFile = SiftsClient.downloadSiftsFile(testPDBId); + FileAssert.assertFile(siftsFile); + SiftsClient.downloadSiftsFile(testPDBId); + } catch (IOException e) + { + e.printStackTrace(); + } } + @Test(groups = { "Functional" }) public void getAllMappingAccessionTest() { @@ -154,9 +261,9 @@ public class SiftsClientTest HashMap actualMapping = siftsClient.getGreedyMapping( "A", testSeq, null); - Assert.assertEquals(actualMapping, expectedMapping); Assert.assertEquals(testSeq.getStart(), 1); Assert.assertEquals(testSeq.getEnd(), 147); + Assert.assertEquals(actualMapping, expectedMapping); } catch (Exception e) { e.printStackTrace(); @@ -167,8 +274,15 @@ public class SiftsClientTest @Test(groups = { "Functional" }) private void getAtomIndexTest() { - // siftsClient.getAtomIndex(1, null); - // Assert.assertTrue(true); + ArrayList atoms = new ArrayList(); + Atom atom = new Atom(u, u, u); + atom.resNumber = 43; + atom.atomIndex = 7; + atoms.add(atom); + int actualAtomIndex = siftsClient.getAtomIndex(1, atoms); + Assert.assertEquals(actualAtomIndex, -1); + actualAtomIndex = siftsClient.getAtomIndex(43, atoms); + Assert.assertEquals(actualAtomIndex, 7); } @Test( @@ -185,21 +299,182 @@ public class SiftsClientTest } - @Test(groups = { "Functional" }) - private void populateAtomPositionsTest() + @Test( + groups = { "Functional" }, + expectedExceptions = SiftsException.class) + private void populateAtomPositionsNullTest1() + throws IllegalArgumentException, SiftsException { + siftsClient.populateAtomPositions(null, null); + } + @Test( + groups = { "Functional" }, + expectedExceptions = SiftsException.class) + private void populateAtomPositionsNullTest2() + throws IllegalArgumentException, SiftsException + { + siftsClient.populateAtomPositions("A", null); } @Test(groups = { "Functional" }) public void getValidSourceDBRefTest() { + try + { + DBRefEntryI actualValidSrcDBRef = siftsClient + .getValidSourceDBRef(testSeq); + DBRefEntryI expectedDBRef = new DBRefEntry(); + expectedDBRef.setSource(DBRefSource.UNIPROT); + expectedDBRef.setAccessionId("P00221"); + expectedDBRef.setStartRes(1); + expectedDBRef.setEndRes(147); + expectedDBRef.setVersion(""); + Assert.assertEquals(actualValidSrcDBRef, expectedDBRef); + } catch (Exception e) + { + } + } + + @Test( + groups = { "Functional" }, + expectedExceptions = SiftsException.class) + public void getValidSourceDBRefExceptionTest() throws SiftsException + { + SequenceI invalidTestSeq = new Sequence("testSeq", "ABCDEFGH"); + try + { + siftsClient.getValidSourceDBRef(invalidTestSeq); + } catch (SiftsException e) + { + throw new SiftsException(e.getMessage()); + } + } + + @Test( + groups = { "Functional" }, + expectedExceptions = SiftsException.class) + public void getValidSourceDBRefExceptionXTest() throws SiftsException + { + SequenceI invalidTestSeq = new Sequence("testSeq", "ABCDEFGH"); + DBRefEntry invalidDBRef = new DBRefEntry(); + invalidDBRef.setAccessionId("BLAR"); + invalidTestSeq.addDBRef(invalidDBRef); + try + { + siftsClient.getValidSourceDBRef(invalidTestSeq); + } catch (SiftsException e) + { + throw new SiftsException(e.getMessage()); + } } @Test(groups = { "Functional" }) public void isValidDBRefEntryTest() { + DBRefEntryI validDBRef = new DBRefEntry(); + validDBRef.setSource(DBRefSource.UNIPROT); + validDBRef.setAccessionId("P00221"); + validDBRef.setStartRes(1); + validDBRef.setEndRes(147); + validDBRef.setVersion(""); + Assert.assertTrue(siftsClient.isValidDBRefEntry(validDBRef)); + } + + @Test(groups = { "Functional" }) + public void getSiftsStructureMappingTest() + { + try + { + Assert.assertTrue(SiftsSettings.isMapWithSifts()); + StructureMapping strucMapping = siftsClient.getSiftsStructureMapping( + testSeq, testPDBId, "A"); + String expectedMappingOutput = "\nSequence ⟷ Structure mapping details\n" + + "Method: SIFTS\n\n" + + "P00221 : 1 - 97 Maps to \n" + + "1A70|A : 51 - 147\n\n" + + "P00221 AAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLD\n" + + " |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n" + + "1A70|A AAYKVTLVTPTGNVEFQCPDDVYILDAAEEEGIDLPYSCRAGSCSSCAGKLKTGSLNQDDQSFLD\n\n" + + + "P00221 DDQIDEGWVLTCAAYPVSDVTIETHKEEELTA\n" + + " |||||||||||||||||||||||||| |||||\n" + + "1A70|A DDQIDEGWVLTCAAYPVSDVTIETHKKEELTA\n\n" + + + "Length of alignment = 97\n" + "Percentage ID = 98.97\n"; + + Assert.assertEquals(strucMapping.getMappingDetailsOutput(), + expectedMappingOutput); + Assert.assertEquals(strucMapping.getMapping(), expectedMapping); + } catch (SiftsException e) + { + e.printStackTrace(); + } + } + + @Test(groups = { "Functional" }) + public void getEntityCountTest() + { + int actualEntityCount = siftsClient.getEntityCount(); + System.out.println("actual entity count : " + actualEntityCount); + Assert.assertEquals(actualEntityCount, 1); + } + + @Test(groups = { "Functional" }) + public void getDbAccessionIdTest() + { + String actualDbAccId = siftsClient.getDbAccessionId(); + System.out.println("Actual Db Accession Id: " + actualDbAccId); + Assert.assertEquals(actualDbAccId, "1a70"); + } + + @Test(groups = { "Functional" }) + public void getDbCoordSysTest() + { + String actualDbCoordSys = siftsClient.getDbCoordSys(); + System.out.println("Actual DbCoordSys: " + actualDbCoordSys); + Assert.assertEquals(actualDbCoordSys, "PDBe"); + } + + @Test(groups = { "Functional" }) + public void getDbSourceTest() + { + String actualDbSource = siftsClient.getDbSource(); + System.out.println("Actual DbSource: " + actualDbSource); + Assert.assertEquals(actualDbSource, "PDBe"); + } + + @Test(groups = { "Functional" }) + public void getDbVersionTest() + { + String actualDbVersion = siftsClient.getDbVersion(); + System.out.println("Actual DbVersion: " + actualDbVersion); + Assert.assertEquals(actualDbVersion, "2.0"); + } + + @Test(groups = { "Functional" }) + public void getEntityByMostOptimalMatchedIdTest() + { + SiftsClient siftsClientX = null; + PDBfile pdbFile; + try + { + pdbFile = new PDBfile(false, false, false, "test/jalview/io/2nq2" + + ".pdb", AppletFormatAdapter.FILE); + siftsClientX = new SiftsClient(pdbFile); + } catch (Exception e) + { + e.printStackTrace(); + } + Entity entityA = siftsClientX.getEntityByMostOptimalMatchedId("A"); + Assert.assertEquals(entityA.getEntityId(), "A"); + Entity entityB = siftsClientX.getEntityByMostOptimalMatchedId("B"); + Assert.assertEquals(entityB.getEntityId(), "C"); + Entity entityC = siftsClientX.getEntityByMostOptimalMatchedId("C"); + Assert.assertEquals(entityC.getEntityId(), "B"); + Entity entityD = siftsClientX.getEntityByMostOptimalMatchedId("D"); + Assert.assertEquals(entityD.getEntityId(), "D"); } } diff --git a/utils/HelpLinksChecker.java b/utils/HelpLinksChecker.java new file mode 100644 index 0000000..1f666a4 --- /dev/null +++ b/utils/HelpLinksChecker.java @@ -0,0 +1,491 @@ + + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +/** + * A class to check help file cross-references, and external URLs if internet + * access is available + * + * @author gmcarstairs + * + */ +public class HelpLinksChecker +{ + private static final String HELP_HS = "help.hs"; + + private static final String HELP_TOC_XML = "helpTOC.xml"; + + private static final String HELP_JHM = "help.jhm"; + + private static boolean internetAvailable = true; + + private int targetCount = 0; + + private int mapCount = 0; + + private int internalHrefCount = 0; + + private int anchorRefCount = 0; + + private int externalHrefCount = 0; + + private int invalidMapUrlCount = 0; + + private int invalidTargetCount = 0; + + private int invalidImageCount = 0; + + private int invalidInternalHrefCount = 0; + + private int invalidExternalHrefCount = 0; + + /** + * The only parameter should be a path to the root of the help directory in + * the workspace + * + * @param args + * [0] path to the /html folder in the workspace + * @param args + * [1] (optional) -nointernet to suppress external link checking for + * a fast check of internal links only + * @throws IOException + */ + public static void main(String[] args) throws IOException + { + if (args.length == 0 || args.length > 2 + || (args.length == 2 && !args[1].equals("-nointernet"))) + { + System.out.println("Usage: [-nointernet]"); + return; + } + + if (args.length == 2) + { + internetAvailable = false; + } + + new HelpLinksChecker().checkLinks(args[0]); + } + + /** + * Checks help links and reports results + * + * @param helpDirectoryPath + * @throws IOException + */ + void checkLinks(String helpDirectoryPath) throws IOException + { + System.out.println("Checking help file links"); + File helpFolder = new File(helpDirectoryPath); + if (!helpFolder.exists()) + { + System.out.println("Can't find " + helpDirectoryPath); + return; + } + + internetAvailable &= connectToUrl("http://www.example.com"); + + Map tocTargets = checkHelpMappings(helpFolder); + + Map unusedTargets = new HashMap( + tocTargets); + + checkTableOfContents(helpFolder, tocTargets, unusedTargets); + + checkHelpSet(helpFolder, tocTargets, unusedTargets); + + checkHtmlFolder(new File(helpFolder, "html")); + + reportResults(unusedTargets); + } + + /** + * Checks all html files in the given directory or its sub-directories + * + * @param folder + * @throws IOException + */ + private void checkHtmlFolder(File folder) throws IOException + { + File[] files = folder.listFiles(); + for (File f : files) + { + if (f.isDirectory()) + { + checkHtmlFolder(f); + } + else + { + if (f.getAbsolutePath().endsWith(".html")) + { + checkHtmlFile(f, folder); + } + } + } + } + + /** + * Checks that any image attribute in help.hs is a valid target + * + * @param helpFolder + * @param tocTargets + * @param unusedTargets + * used targets are removed from here + */ + private void checkHelpSet(File helpFolder, + Map tocTargets, Map unusedTargets) + throws IOException + { + BufferedReader br = new BufferedReader(new FileReader(new File( + helpFolder, HELP_HS))); + String data = br.readLine(); + int lineNo = 0; + + while (data != null) + { + lineNo++; + String image = getAttribute(data, "image"); + if (image != null) + { + unusedTargets.remove(image); + if (!tocTargets.containsKey(image)) + { + System.out.println(String.format( + "Invalid image '%s' at line %d of %s", image, lineNo, + HELP_HS)); + invalidImageCount++; + } + } + data = br.readLine(); + } + br.close(); + } + + /** + * Print counts to sysout + * + * @param unusedTargets + */ + private void reportResults(Map unusedTargets) + { + System.out.println("\nResults:"); + System.out.println(targetCount + " distinct help targets"); + System.out.println(mapCount + " help mappings"); + System.out.println(invalidTargetCount + " invalid targets"); + System.out.println(unusedTargets.size() + " unused targets"); + for (String target : unusedTargets.keySet()) + { + System.out.println(String.format(" %s: %s", target, + unusedTargets.get(target))); + } + System.out.println(invalidMapUrlCount + " invalid map urls"); + System.out.println(invalidImageCount + " invalid image attributes"); + System.out.println(String.format( + "%d internal href links (%d with anchors - not checked)", + internalHrefCount, anchorRefCount)); + System.out.println(invalidInternalHrefCount + + " invalid internal href links"); + System.out.println(externalHrefCount + " external href links"); + if (internetAvailable) + { + System.out.println(invalidExternalHrefCount + + " invalid external href links"); + } + else + { + System.out + .println("External links not verified as internet not available"); + } + + } + + /** + * Reads the given html file and checks any href attibute values are either + *
                + *
              • a valid relative file path, or
              • + *
              • a valid absolute URL (if external link checking is enabled)
              • + *
              + * + * @param htmlFile + * @param htmlFolder + * the parent folder (for validation of relative paths) + */ + private void checkHtmlFile(File htmlFile, File htmlFolder) + throws IOException + { + BufferedReader br = new BufferedReader(new FileReader(htmlFile)); + String data = br.readLine(); + int lineNo = 0; + while (data != null) + { + lineNo++; + String href = getAttribute(data, "href"); + if (href != null) + { + String anchor = null; + int anchorPos = href.indexOf("#"); + if (anchorPos != -1) + { + anchor = href.substring(anchorPos + 1); + href = href.substring(0, anchorPos); + } + boolean badLink = false; + if (href.startsWith("http")) + { + externalHrefCount++; + if (internetAvailable) + { + if (!connectToUrl(href)) + { + badLink = true; + invalidExternalHrefCount++; + } + } + } + else + { + internalHrefCount++; + File hrefFile = href.equals("") ? htmlFile : new File(htmlFolder, + href); + if (!hrefFile.exists()) + { + badLink = true; + invalidInternalHrefCount++; + } + if (anchor != null) + { + anchorRefCount++; + if (!badLink) + { + if (!checkAnchorExists(hrefFile, anchor)) + { + System.out.println(String.format( + "Invalid anchor: %s at line %d of %s", anchor, + lineNo, getPath(htmlFile))); + } + } + } + } + if (badLink) + { + System.out.println(String.format( + "Invalid href %s at line %d of %s", href, lineNo, + getPath(htmlFile))); + } + } + data = br.readLine(); + } + br.close(); + } + + /** + * Reads the file and checks for the presence of the given html anchor + * + * @param hrefFile + * @param anchor + * @return true if anchor is found else false + */ + private boolean checkAnchorExists(File hrefFile, String anchor) + { + String nameAnchor = " + *
            • each target attribute is in tocTargets
            • + *
            • each url attribute is a valid relative file link
            • + *
            + * + * @param helpFolder + */ + private Map checkHelpMappings(File helpFolder) + throws IOException + { + Map targets = new HashMap(); + BufferedReader br = new BufferedReader(new FileReader(new File( + helpFolder, HELP_JHM))); + String data = br.readLine(); + int lineNo = 0; + while (data != null) + { + lineNo++; + + /* + * record target, check for duplicates + */ + String target = getAttribute(data, "target"); + if (target != null) + { + mapCount++; + if (targets.containsKey(target)) + { + System.out.println(String.format( + "Duplicate target mapping to %s at line %d of %s", + target, lineNo, HELP_JHM)); + } + else + { + targetCount++; + } + } + + /* + * validate url + */ + String url = getAttribute(data, "url"); + if (url != null) + { + targets.put(target, url); + int anchorPos = url.indexOf("#"); + if (anchorPos != -1) + { + url = url.substring(0, anchorPos); + } + if (!new File(helpFolder, url).exists()) + { + System.out.println(String.format( + "Invalid url path '%s' at line %d of %s", url, lineNo, + HELP_JHM)); + invalidMapUrlCount++; + } + } + data = br.readLine(); + } + br.close(); + return targets; + } + + /** + * Reads file helpTOC.xml and reports any invalid targets + * + * @param helpFolder + * @param tocTargets + * @param unusedTargets + * used targets are removed from this map + * + * @return + * @throws IOException + */ + private void checkTableOfContents(File helpFolder, + Map tocTargets, Map unusedTargets) + throws IOException + { + BufferedReader br = new BufferedReader(new FileReader(new File( + helpFolder, HELP_TOC_XML))); + String data = br.readLine(); + int lineNo = 0; + while (data != null) + { + lineNo++; + /* + * assuming no more than one "target" per line of file here + */ + String target = getAttribute(data, "target"); + if (target != null) + { + unusedTargets.remove(target); + if (!tocTargets.containsKey(target)) + { + System.out.println(String.format( + "Invalid target '%s' at line %d of %s", target, lineNo, + HELP_TOC_XML)); + invalidTargetCount++; + } + } + data = br.readLine(); + } + br.close(); + } + + /** + * Returns the value of an attribute if found in the data, else null + * + * @param data + * @param attName + * @return + */ + private static String getAttribute(String data, String attName) + { + /* + * make a partial attempt at ignoring within + * (doesn't work if multi-line) + */ + int commentStartPos = data.indexOf(""); + String value = null; + String match = attName + "=\""; + int attPos = data.indexOf(match); + if (attPos > 0 + && (commentStartPos == -1 || attPos < commentStartPos || attPos > commentEndPos)) + { + data = data.substring(attPos + match.length()); + value = data.substring(0, data.indexOf("\"")); + } + return value; + } +} diff --git a/utils/InstallAnywhere/Jalview.iap_xml b/utils/InstallAnywhere/Jalview.iap_xml index 83d1a98..fc799bb 100755 --- a/utils/InstallAnywhere/Jalview.iap_xml +++ b/utils/InstallAnywhere/Jalview.iap_xml @@ -2025,7 +2025,7 @@ and any path to a file to save to the file]]> - + false @@ -2043,7 +2043,7 @@ and any path to a file to save to the file]]> true - + 6149494 @@ -2891,6 +2891,58 @@ and any path to a file to save to the file]]>
        + + + + false + + + true + + + true + + + + + + + + + + + + false + + + + + + true + + + true + + + true + + + + + + 16046 + + + false + + + 0 + + + + + +
        @@ -7360,6 +7412,7 @@ and any path to a file to read from that file]]>
        + @@ -7948,6 +8001,7 @@ and any path to a file to read from that file]]> + diff --git a/utils/MessageBundleChecker.java b/utils/MessageBundleChecker.java new file mode 100644 index 0000000..7850eb5 --- /dev/null +++ b/utils/MessageBundleChecker.java @@ -0,0 +1,309 @@ +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashSet; +import java.util.Properties; +import java.util.TreeSet; + +/** + * This class scans Java source files for calls to MessageManager and reports + *
          + *
        • calls using keys not found in Messages.properties
        • + *
        • any unused keys in Messages.properties
        • + *
        + * It does not handle dynamically constructed keys, these are reported as + * possible errors for manual inspection.
        + * For comparing translated bundles with Messages.properties, see i18nAnt.xml + * + * @author gmcarstairs + * + */ +public class MessageBundleChecker +{ + /* + * number of text lines to read at a time in order to parse + * code that is split over several lines + */ + static int bufferSize = 3; + + static final String METHOD1 = "MessageManager.getString("; + + static final String METHOD2 = "MessageManager.getStringOrReturn("; + + static final String METHOD3 = "MessageManager.formatMessage("; + + static final String[] METHODS = { METHOD1, METHOD2, METHOD3 }; + + /* + * root of the Java source folders we want to scan + */ + String sourcePath; + + /* + * contents of Messages.properties + */ + private Properties messages; + + /* + * keys from Messages.properties + * we remove entries from here as they are found to be used + * any left over are unused entries + */ + private TreeSet messageKeys; + + private int javaCount; + + private HashSet invalidKeys; + + /** + * Runs the scan given the path to the root of Java source directories + * + * @param args + * [0] path to the source folder to scan + * @param args + * [1] (optional) read buffer size (default is 3); increasing this + * may detect more results but will give higher error counts due to + * double counting of the same code + * @throws IOException + */ + public static void main(String[] args) throws IOException + { + if (args.length != 1 && args.length != 2) + { + System.out.println("Usage: [readBufferSize]"); + return; + } + if (args.length == 2) + { + bufferSize = Integer.valueOf(args[1]); + } + new MessageBundleChecker().doMain(args[0]); + } + + /** + * Main method to perform the work + * + * @param srcPath + * @throws IOException + */ + private void doMain(String srcPath) throws IOException + { + System.out.println("Scanning " + srcPath + + " for calls to MessageManager"); + sourcePath = srcPath; + loadMessages(); + File dir = new File(srcPath); + if (!dir.exists()) + { + System.out.println(srcPath + " not found"); + return; + } + invalidKeys = new HashSet(); + if (dir.isDirectory()) + { + scanDirectory(dir); + } + else + { + scanFile(dir); + } + reportResults(); + } + + /** + * Prints out counts to sysout + */ + private void reportResults() + { + System.out.println("\nScanned " + javaCount + " source files"); + System.out.println("Message.properties has " + messages.size() + + " keys"); + System.out.println("Found " + invalidKeys.size() + + " possibly invalid parameter calls"); + + System.out.println(messageKeys.size() + + " keys not found, possibly unused"); + for (String key : messageKeys) + { + System.out.println(" " + key); + } + } + + /** + * Scan all files within a directory + * + * @param dir + * @throws IOException + */ + private void scanDirectory(File dir) throws IOException + { + File[] files = dir.listFiles(); + if (files != null) + { + for (File f : files) + { + if (f.isDirectory()) + { + scanDirectory(f); + } + else + { + scanFile(f); + } + } + } + } + + /** + * Scan a Java file + * + * @param f + */ + private void scanFile(File f) throws IOException + { + String path = f.getPath(); + if (!path.endsWith(".java")) + { + return; + } + javaCount++; + + String[] lines = new String[bufferSize]; + BufferedReader br = new BufferedReader(new FileReader(f)); + for (int i = 0; i < bufferSize; i++) + { + String readLine = br.readLine(); + lines[i] = stripCommentsAndTrim(readLine); + } + + int lineNo = 0; + + while (lines[bufferSize - 1] != null) + { + lineNo++; + inspectSourceLines(path, lineNo, lines); + + for (int i = 0; i < bufferSize - 1; i++) + { + lines[i] = lines[i + 1]; + } + lines[bufferSize - 1] = stripCommentsAndTrim(br.readLine()); + } + br.close(); + + } + + /* + * removes anything after (and including) '//' + */ + private String stripCommentsAndTrim(String line) + { + if (line != null) + { + int pos = line.indexOf("//"); + if (pos != -1) + { + line = line.substring(0, pos); + } + line = line.replace("\t", " ").trim(); + } + return line; + } + + /** + * Look for calls to MessageManager methods, possibly split over two or more + * lines + * + * @param path + * @param lineNo + * @param lines + */ + private void inspectSourceLines(String path, int lineNo, String[] lines) + { + String lineNos = String.format("%d-%d", lineNo, lineNo + lines.length + - 1); + String combined = combineLines(lines); + for (String method : METHODS) + { + int pos = combined.indexOf(method); + if (pos == -1) + { + continue; + } + String methodArgs = combined.substring(pos + method.length()); + if ("".equals(methodArgs)) + { + /* + * continues on next line - catch in the next read loop iteration + */ + continue; + } + if (!methodArgs.startsWith("\"")) + { + System.out.println(String.format( + "Possible dynamic key at %s line %s %s", + path.substring(sourcePath.length()), lineNos, combined)); + continue; + } + methodArgs = methodArgs.substring(1); + int quotePos = methodArgs.indexOf("\""); + if (quotePos == -1) + { + System.out.println(String.format("Trouble parsing %s line %s %s", + path.substring(sourcePath.length()), lineNos, combined)); + continue; + } + String messageKey = methodArgs.substring(0, quotePos); + if (!this.messages.containsKey(messageKey)) + { + System.out.println(String.format( + "Unmatched key '%s' at line %s of %s", messageKey, lineNos, + path.substring(sourcePath.length()))); + if (!invalidKeys.contains(messageKey)) + { + invalidKeys.add(messageKey); + } + } + messageKeys.remove(messageKey); + } + } + + private String combineLines(String[] lines) + { + String combined = ""; + if (lines != null) + { + for (String line : lines) + { + if (line != null) + { + combined += line; + } + } + } + return combined; + } + + /** + * Loads properties from Message.properties + * + * @throws IOException + */ + void loadMessages() throws IOException + { + messages = new Properties(); + FileReader reader = new FileReader(new File(sourcePath, + "../resources/lang/Messages.properties")); + messages.load(reader); + reader.close(); + + messageKeys = new TreeSet(); + for (Object key : messages.keySet()) + { + messageKeys.add((String) key); + } + + } + +}